Skip to content

Commit 21404d0

Browse files
authored
chore: misc CLI improvements (#218)
* chore: misc CLI improvements * update
1 parent 0337147 commit 21404d0

File tree

3 files changed

+49
-16
lines changed

3 files changed

+49
-16
lines changed

packages/cli/src/actions/generate.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import { getLiteral, getLiteralArray } from '@zenstackhq/language/utils';
44
import { type CliPlugin } from '@zenstackhq/sdk';
55
import colors from 'colors';
66
import path from 'node:path';
7-
import ora from 'ora';
7+
import ora, { type Ora } from 'ora';
88
import { CliError } from '../cli-error';
99
import * as corePlugins from '../plugins';
1010
import { getPkgJsonConfig, getSchemaFile, loadSchemaDocument } from './action-utils';
1111

1212
type Options = {
1313
schema?: string;
1414
output?: string;
15+
silent: boolean;
1516
};
1617

1718
/**
@@ -25,10 +26,11 @@ export async function run(options: Options) {
2526
const model = await loadSchemaDocument(schemaFile);
2627
const outputPath = getOutputPath(options, schemaFile);
2728

28-
await runPlugins(schemaFile, model, outputPath);
29+
await runPlugins(schemaFile, model, outputPath, options);
2930

30-
console.log(colors.green(`Generation completed successfully in ${Date.now() - start}ms.\n`));
31-
console.log(`You can now create a ZenStack client with it.
31+
if (!options.silent) {
32+
console.log(colors.green(`Generation completed successfully in ${Date.now() - start}ms.\n`));
33+
console.log(`You can now create a ZenStack client with it.
3234
3335
\`\`\`ts
3436
import { ZenStackClient } from '@zenstackhq/runtime';
@@ -38,6 +40,7 @@ const client = new ZenStackClient(schema, {
3840
dialect: { ... }
3941
});
4042
\`\`\``);
43+
}
4144
}
4245

4346
function getOutputPath(options: Options, schemaFile: string) {
@@ -52,7 +55,7 @@ function getOutputPath(options: Options, schemaFile: string) {
5255
}
5356
}
5457

55-
async function runPlugins(schemaFile: string, model: Model, outputPath: string) {
58+
async function runPlugins(schemaFile: string, model: Model, outputPath: string, options: Options) {
5659
const plugins = model.declarations.filter(isPlugin);
5760
const processedPlugins: { cliPlugin: CliPlugin; pluginOptions: Record<string, unknown> }[] = [];
5861

@@ -95,17 +98,21 @@ async function runPlugins(schemaFile: string, model: Model, outputPath: string)
9598
);
9699

97100
// run plugin generator
98-
const spinner = ora(cliPlugin.statusText ?? `Running plugin ${cliPlugin.name}`).start();
101+
let spinner: Ora | undefined;
102+
103+
if (!options.silent) {
104+
spinner = ora(cliPlugin.statusText ?? `Running plugin ${cliPlugin.name}`).start();
105+
}
99106
try {
100107
await cliPlugin.generate({
101108
schemaFile,
102109
model,
103110
defaultOutputPath: outputPath,
104111
pluginOptions,
105112
});
106-
spinner.succeed();
113+
spinner?.succeed();
107114
} catch (err) {
108-
spinner.fail();
115+
spinner?.fail();
109116
console.error(err);
110117
}
111118
}

packages/cli/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const checkAction = async (options: Parameters<typeof actions.check>[0]): Promis
3030
};
3131

3232
export function createProgram() {
33-
const program = new Command('zenstack');
33+
const program = new Command('zen');
3434

3535
program.version(getVersion()!, '-v --version', 'display CLI version');
3636

@@ -55,6 +55,7 @@ export function createProgram() {
5555
.description('Run code generation plugins.')
5656
.addOption(schemaOption)
5757
.addOption(new Option('-o, --output <path>', 'default output directory for code generation'))
58+
.addOption(new Option('--silent', 'suppress all output except errors').default(false))
5859
.action(generateAction);
5960

6061
const migrateCommand = program.command('migrate').description('Run database schema migration related tasks.');

packages/create-zenstack/src/index.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import colors from 'colors';
22
import { Command } from 'commander';
3-
import { execSync } from 'node:child_process';
3+
import { execSync, type StdioOptions } from 'node:child_process';
44
import fs from 'node:fs';
55
import ora from 'ora';
66
import { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';
@@ -61,6 +61,9 @@ function initProject(name: string) {
6161
),
6262
);
6363

64+
// create VSCode config files
65+
createVsCodeConfig();
66+
6467
// install packages
6568
const packages = [
6669
{ name: '@zenstackhq/cli@next', dev: true },
@@ -103,24 +106,46 @@ function initProject(name: string) {
103106
// create main.ts
104107
fs.writeFileSync('main.ts', STARTER_MAIN_TS);
105108

106-
// run `zenstack generate`
107-
runCommand(`${agentExec} zenstack generate`, 'Running `zenstack generate`');
109+
// run `zen generate`
110+
runCommand(`${agentExec} zen generate`, 'Running `zen generate`');
111+
112+
// run `zen db push`
113+
runCommand(`${agentExec} zen db push`, 'Running `zen db push`');
108114

109-
// run `zenstack db push`
110-
runCommand(`${agentExec} zenstack db push`, 'Running `zenstack db push`');
115+
// run `$agent run dev`
116+
console.log(`Running \`${agent} run dev\``);
117+
execSync(`${agent} run dev`, { stdio: 'inherit' });
118+
console.log(colors.green('Project setup completed!'));
111119
}
112120

113121
function installPackage(pkg: { name: string; dev: boolean }) {
114122
runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ''}`, `Installing "${pkg.name}"`);
115123
}
116124

117-
function runCommand(cmd: string, status: string) {
125+
function runCommand(cmd: string, status: string, stdio: StdioOptions = 'ignore') {
118126
const spinner = ora(status).start();
119127
try {
120-
execSync(cmd);
128+
execSync(cmd, { stdio });
121129
spinner.succeed();
122130
} catch (e) {
123131
spinner.fail();
124132
throw e;
125133
}
126134
}
135+
136+
function createVsCodeConfig() {
137+
fs.mkdirSync('.vscode', { recursive: true });
138+
fs.writeFileSync(
139+
'.vscode/settings.json',
140+
JSON.stringify(
141+
{
142+
'files.associations': {
143+
'*.zmodel': 'zmodel-v3',
144+
},
145+
},
146+
null,
147+
4,
148+
),
149+
);
150+
fs.writeFileSync('.vscode/extensions.json', JSON.stringify({ recommendations: ['zenstack.zenstack-v3'] }, null, 4));
151+
}

0 commit comments

Comments
 (0)