Skip to content

Commit 273f527

Browse files
committed
chore(cli): show notifications for generate command
1 parent c7c3d86 commit 273f527

5 files changed

Lines changed: 101 additions & 7 deletions

File tree

packages/cli/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
},
3838
"dependencies": {
3939
"@zenstackhq/common-helpers": "workspace:*",
40-
"@zenstackhq/schema": "workspace:*",
4140
"@zenstackhq/language": "workspace:*",
4241
"@zenstackhq/orm": "workspace:*",
42+
"@zenstackhq/schema": "workspace:*",
4343
"@zenstackhq/sdk": "workspace:*",
4444
"@zenstackhq/server": "workspace:*",
4545
"chokidar": "^5.0.0",
@@ -56,6 +56,7 @@
5656
"package-manager-detector": "^1.3.0",
5757
"prisma": "catalog:",
5858
"semver": "^7.7.2",
59+
"terminal-link": "^5.0.0",
5960
"ts-pattern": "catalog:"
6061
},
6162
"devDependencies": {
@@ -72,9 +73,10 @@
7273
"tmp": "catalog:"
7374
},
7475
"peerDependencies": {
75-
"pg": "catalog:",
7676
"better-sqlite3": "catalog:",
77-
"mysql2": "catalog:"
77+
"mysql2": "catalog:",
78+
"pg": "catalog:",
79+
"zod": "catalog:"
7880
},
7981
"peerDependenciesMeta": {
8082
"pg": {

packages/cli/src/actions/action-utils.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import fs from 'node:fs';
66
import { createRequire } from 'node:module';
77
import path from 'node:path';
88
import { CliError } from '../cli-error';
9+
import terminalLink from 'terminal-link';
10+
import { z } from 'zod';
911

1012
export function getSchemaFile(file?: string) {
1113
if (file) {
@@ -216,3 +218,40 @@ export async function getZenStackPackages(
216218

217219
return result.filter((p) => !!p);
218220
}
221+
222+
const FETCH_CLI_CONFIG_TIMEOUT = 500;
223+
const CLI_CONFIG_ENDPOINT = 'https://zenstack.dev/config/cli.json';
224+
225+
export async function showNotification() {
226+
try {
227+
const fetchResult = await fetch(CLI_CONFIG_ENDPOINT, {
228+
headers: { accept: 'application/json' },
229+
signal: AbortSignal.timeout(FETCH_CLI_CONFIG_TIMEOUT),
230+
});
231+
232+
if (!fetchResult.ok) {
233+
return;
234+
}
235+
236+
const data = await fetchResult.json();
237+
const schema = z.object({
238+
notifications: z.array(z.object({ title: z.string(), url: z.url().optional(), active: z.boolean() })),
239+
});
240+
const parseResult = schema.safeParse(data);
241+
242+
if (parseResult.success) {
243+
const activeItems = parseResult.data.notifications.filter((item) => item.active);
244+
// return a random active item
245+
if (activeItems.length > 0) {
246+
const item = activeItems[Math.floor(Math.random() * activeItems.length)]!;
247+
if (item.url) {
248+
console.log(terminalLink(item.title, item.url));
249+
} else {
250+
console.log(item.title);
251+
}
252+
}
253+
}
254+
} catch {
255+
// noop
256+
}
257+
}

packages/cli/src/actions/generate.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { CliError } from '../cli-error';
1414
import * as corePlugins from '../plugins';
1515
import { getOutputPath, getSchemaFile, getZenStackPackages, loadSchemaDocument } from './action-utils';
1616
import semver from 'semver';
17+
import { showNotification } from './action-utils';
1718

1819
type Options = {
1920
schema?: string;
@@ -24,6 +25,7 @@ type Options = {
2425
liteOnly?: boolean;
2526
generateModels?: boolean;
2627
generateInput?: boolean;
28+
offline?: boolean;
2729
};
2830

2931
/**
@@ -37,6 +39,10 @@ export async function run(options: Options) {
3739
}
3840
const model = await pureGenerate(options, false);
3941

42+
if (!options.offline) {
43+
await showNotification();
44+
}
45+
4046
if (options.watch) {
4147
const logsEnabled = !options.silent;
4248

packages/cli/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@ function createProgram() {
7474
);
7575

7676
const noVersionCheckOption = new Option('--no-version-check', 'do not check for new version');
77+
const offlineOption = new Option('--offline', 'run in offline mode');
7778

7879
program
7980
.command('generate')
8081
.description('Run code generation plugins')
8182
.addOption(schemaOption)
8283
.addOption(noVersionCheckOption)
84+
.addOption(offlineOption)
8385
.addOption(new Option('-o, --output <path>', 'default output directory for code generation'))
8486
.addOption(new Option('-w, --watch', 'enable watch mode').default(false))
8587
.addOption(

pnpm-lock.yaml

Lines changed: 49 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)