@zenstackhq/cli 3.0.0-beta.23 → 3.0.0-beta.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -28,41 +28,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  ));
29
29
 
30
30
  // src/index.ts
31
- var import_language2 = require("@zenstackhq/language");
32
- var import_colors7 = __toESM(require("colors"), 1);
31
+ var import_language3 = require("@zenstackhq/language");
32
+ var import_colors9 = __toESM(require("colors"), 1);
33
33
  var import_commander = require("commander");
34
34
 
35
- // src/actions/db.ts
36
- var import_node_fs2 = __toESM(require("fs"), 1);
37
-
38
- // src/utils/exec-utils.ts
39
- var import_child_process = require("child_process");
40
- var import_url = require("url");
41
- var import_meta = {};
42
- function execSync(cmd, options) {
43
- const { env: env2, ...restOptions } = options ?? {};
44
- const mergedEnv = env2 ? {
45
- ...process.env,
46
- ...env2
47
- } : void 0;
48
- (0, import_child_process.execSync)(cmd, {
49
- encoding: "utf-8",
50
- stdio: options?.stdio ?? "inherit",
51
- env: mergedEnv,
52
- ...restOptions
53
- });
54
- }
55
- __name(execSync, "execSync");
56
- function execPrisma(args, options) {
57
- let prismaPath;
58
- if (typeof import_meta.resolve === "function") {
59
- prismaPath = (0, import_url.fileURLToPath)(import_meta.resolve("prisma/build/index.js"));
60
- } else {
61
- prismaPath = require.resolve("prisma/build/index.js");
62
- }
63
- execSync(`node ${prismaPath} ${args}`, options);
64
- }
65
- __name(execPrisma, "execPrisma");
35
+ // src/actions/check.ts
36
+ var import_colors2 = __toESM(require("colors"), 1);
66
37
 
67
38
  // src/actions/action-utils.ts
68
39
  var import_language = require("@zenstackhq/language");
@@ -102,12 +73,12 @@ function getSchemaFile(file) {
102
73
  return pkgJsonConfig.schema;
103
74
  }
104
75
  }
105
- if (import_node_fs.default.existsSync("./zenstack/schema.zmodel")) {
106
- return "./zenstack/schema.zmodel";
107
- } else if (import_node_fs.default.existsSync("./schema.zmodel")) {
76
+ if (import_node_fs.default.existsSync("./schema.zmodel")) {
108
77
  return "./schema.zmodel";
78
+ } else if (import_node_fs.default.existsSync("./zenstack/schema.zmodel")) {
79
+ return "./zenstack/schema.zmodel";
109
80
  } else {
110
- throw new CliError('Schema file not found in default locations ("./zenstack/schema.zmodel" or "./schema.zmodel").');
81
+ throw new CliError('Schema file not found in default locations ("./schema.zmodel" or "./zenstack/schema.zmodel").');
111
82
  }
112
83
  }
113
84
  __name(getSchemaFile, "getSchemaFile");
@@ -150,7 +121,8 @@ __name(generateTempPrismaSchema, "generateTempPrismaSchema");
150
121
  function getPkgJsonConfig(startPath) {
151
122
  const result = {
152
123
  schema: void 0,
153
- output: void 0
124
+ output: void 0,
125
+ seed: void 0
154
126
  };
155
127
  const pkgJsonFile = findUp([
156
128
  "package.json"
@@ -165,8 +137,9 @@ function getPkgJsonConfig(startPath) {
165
137
  return result;
166
138
  }
167
139
  if (pkgJson.zenstack && typeof pkgJson.zenstack === "object") {
168
- result.schema = pkgJson.zenstack.schema && import_node_path.default.resolve(import_node_path.default.dirname(pkgJsonFile), pkgJson.zenstack.schema);
169
- result.output = pkgJson.zenstack.output && import_node_path.default.resolve(import_node_path.default.dirname(pkgJsonFile), pkgJson.zenstack.output);
140
+ result.schema = pkgJson.zenstack.schema && typeof pkgJson.zenstack.schema === "string" ? import_node_path.default.resolve(import_node_path.default.dirname(pkgJsonFile), pkgJson.zenstack.schema) : void 0;
141
+ result.output = pkgJson.zenstack.output && typeof pkgJson.zenstack.output === "string" ? import_node_path.default.resolve(import_node_path.default.dirname(pkgJsonFile), pkgJson.zenstack.output) : void 0;
142
+ result.seed = typeof pkgJson.zenstack.seed === "string" && pkgJson.zenstack.seed ? pkgJson.zenstack.seed : void 0;
170
143
  }
171
144
  return result;
172
145
  }
@@ -189,18 +162,84 @@ function findUp(names, cwd = process.cwd(), multiple = false, result = []) {
189
162
  return findUp(names, up, multiple, result);
190
163
  }
191
164
  __name(findUp, "findUp");
165
+ async function requireDataSourceUrl(schemaFile) {
166
+ const zmodel = await loadSchemaDocument(schemaFile);
167
+ const dataSource = zmodel.declarations.find(import_ast.isDataSource);
168
+ if (!dataSource?.fields.some((f) => f.name === "url")) {
169
+ throw new CliError(`The schema's "datasource" must have a "url" field to use this command.`);
170
+ }
171
+ }
172
+ __name(requireDataSourceUrl, "requireDataSourceUrl");
173
+
174
+ // src/actions/check.ts
175
+ async function run(options) {
176
+ const schemaFile = getSchemaFile(options.schema);
177
+ try {
178
+ await loadSchemaDocument(schemaFile);
179
+ console.log(import_colors2.default.green("\u2713 Schema validation completed successfully."));
180
+ } catch (error) {
181
+ console.error(import_colors2.default.red("\u2717 Schema validation failed."));
182
+ throw error;
183
+ }
184
+ }
185
+ __name(run, "run");
192
186
 
193
187
  // src/actions/db.ts
194
- async function run(command, options) {
188
+ var import_node_fs2 = __toESM(require("fs"), 1);
189
+
190
+ // src/utils/exec-utils.ts
191
+ var import_child_process = require("child_process");
192
+ var import_url = require("url");
193
+ var import_meta = {};
194
+ function execSync(cmd, options) {
195
+ const { env: env2, ...restOptions } = options ?? {};
196
+ const mergedEnv = env2 ? {
197
+ ...process.env,
198
+ ...env2
199
+ } : void 0;
200
+ (0, import_child_process.execSync)(cmd, {
201
+ encoding: "utf-8",
202
+ stdio: options?.stdio ?? "inherit",
203
+ env: mergedEnv,
204
+ ...restOptions
205
+ });
206
+ }
207
+ __name(execSync, "execSync");
208
+ function execPackage(cmd, options) {
209
+ const packageManager = process?.versions?.["bun"] ? "bunx" : "npx";
210
+ execSync(`${packageManager} ${cmd}`, options);
211
+ }
212
+ __name(execPackage, "execPackage");
213
+ function execPrisma(args, options) {
214
+ let prismaPath;
215
+ try {
216
+ if (typeof import_meta.resolve === "function") {
217
+ prismaPath = (0, import_url.fileURLToPath)(import_meta.resolve("prisma/build/index.js"));
218
+ } else {
219
+ prismaPath = require.resolve("prisma/build/index.js");
220
+ }
221
+ } catch {
222
+ }
223
+ if (!prismaPath) {
224
+ execPackage(`prisma ${args}`, options);
225
+ return;
226
+ }
227
+ execSync(`node ${prismaPath} ${args}`, options);
228
+ }
229
+ __name(execPrisma, "execPrisma");
230
+
231
+ // src/actions/db.ts
232
+ async function run2(command, options) {
195
233
  switch (command) {
196
234
  case "push":
197
235
  await runPush(options);
198
236
  break;
199
237
  }
200
238
  }
201
- __name(run, "run");
239
+ __name(run2, "run");
202
240
  async function runPush(options) {
203
241
  const schemaFile = getSchemaFile(options.schema);
242
+ await requireDataSourceUrl(schemaFile);
204
243
  const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);
205
244
  try {
206
245
  const cmd = [
@@ -223,11 +262,29 @@ async function runPush(options) {
223
262
  }
224
263
  __name(runPush, "runPush");
225
264
 
265
+ // src/actions/format.ts
266
+ var import_language2 = require("@zenstackhq/language");
267
+ var import_colors3 = __toESM(require("colors"), 1);
268
+ var import_node_fs3 = __toESM(require("fs"), 1);
269
+ async function run3(options) {
270
+ const schemaFile = getSchemaFile(options.schema);
271
+ let formattedContent;
272
+ try {
273
+ formattedContent = await (0, import_language2.formatDocument)(import_node_fs3.default.readFileSync(schemaFile, "utf-8"));
274
+ } catch (error) {
275
+ console.error(import_colors3.default.red("\u2717 Schema formatting failed."));
276
+ throw error;
277
+ }
278
+ import_node_fs3.default.writeFileSync(schemaFile, formattedContent, "utf-8");
279
+ console.log(import_colors3.default.green("\u2713 Schema formatting completed successfully."));
280
+ }
281
+ __name(run3, "run");
282
+
226
283
  // src/actions/generate.ts
227
284
  var import_common_helpers = require("@zenstackhq/common-helpers");
228
285
  var import_ast2 = require("@zenstackhq/language/ast");
229
286
  var import_utils = require("@zenstackhq/language/utils");
230
- var import_colors2 = __toESM(require("colors"), 1);
287
+ var import_colors4 = __toESM(require("colors"), 1);
231
288
  var import_node_path4 = __toESM(require("path"), 1);
232
289
  var import_ora = __toESM(require("ora"), 1);
233
290
 
@@ -240,7 +297,7 @@ __export(plugins_exports, {
240
297
 
241
298
  // src/plugins/prisma.ts
242
299
  var import_sdk2 = require("@zenstackhq/sdk");
243
- var import_node_fs3 = __toESM(require("fs"), 1);
300
+ var import_node_fs4 = __toESM(require("fs"), 1);
244
301
  var import_node_path2 = __toESM(require("path"), 1);
245
302
  var plugin = {
246
303
  name: "Prisma Schema Generator",
@@ -249,21 +306,21 @@ var plugin = {
249
306
  let outFile = import_node_path2.default.join(defaultOutputPath, "schema.prisma");
250
307
  if (typeof pluginOptions["output"] === "string") {
251
308
  outFile = import_node_path2.default.resolve(defaultOutputPath, pluginOptions["output"]);
252
- if (!import_node_fs3.default.existsSync(import_node_path2.default.dirname(outFile))) {
253
- import_node_fs3.default.mkdirSync(import_node_path2.default.dirname(outFile), {
309
+ if (!import_node_fs4.default.existsSync(import_node_path2.default.dirname(outFile))) {
310
+ import_node_fs4.default.mkdirSync(import_node_path2.default.dirname(outFile), {
254
311
  recursive: true
255
312
  });
256
313
  }
257
314
  }
258
315
  const prismaSchema = await new import_sdk2.PrismaSchemaGenerator(model).generate();
259
- import_node_fs3.default.writeFileSync(outFile, prismaSchema);
316
+ import_node_fs4.default.writeFileSync(outFile, prismaSchema);
260
317
  }
261
318
  };
262
319
  var prisma_default = plugin;
263
320
 
264
321
  // src/plugins/typescript.ts
265
322
  var import_sdk3 = require("@zenstackhq/sdk");
266
- var import_node_fs4 = __toESM(require("fs"), 1);
323
+ var import_node_fs5 = __toESM(require("fs"), 1);
267
324
  var import_node_path3 = __toESM(require("path"), 1);
268
325
  var plugin2 = {
269
326
  name: "TypeScript Schema Generator",
@@ -272,32 +329,37 @@ var plugin2 = {
272
329
  let outDir = defaultOutputPath;
273
330
  if (typeof pluginOptions["output"] === "string") {
274
331
  outDir = import_node_path3.default.resolve(defaultOutputPath, pluginOptions["output"]);
275
- if (!import_node_fs4.default.existsSync(outDir)) {
276
- import_node_fs4.default.mkdirSync(outDir, {
332
+ if (!import_node_fs5.default.existsSync(outDir)) {
333
+ import_node_fs5.default.mkdirSync(outDir, {
277
334
  recursive: true
278
335
  });
279
336
  }
280
337
  }
281
338
  const lite = pluginOptions["lite"] === true;
282
339
  const liteOnly = pluginOptions["liteOnly"] === true;
340
+ const importWithFileExtension = pluginOptions["importWithFileExtension"];
341
+ if (importWithFileExtension && typeof importWithFileExtension !== "string") {
342
+ throw new Error('The "importWithFileExtension" option must be a string if specified.');
343
+ }
283
344
  await new import_sdk3.TsSchemaGenerator().generate(model, {
284
345
  outDir,
285
346
  lite,
286
- liteOnly
347
+ liteOnly,
348
+ importWithFileExtension
287
349
  });
288
350
  }
289
351
  };
290
352
  var typescript_default = plugin2;
291
353
 
292
354
  // src/actions/generate.ts
293
- async function run2(options) {
355
+ async function run4(options) {
294
356
  const start = Date.now();
295
357
  const schemaFile = getSchemaFile(options.schema);
296
358
  const model = await loadSchemaDocument(schemaFile);
297
359
  const outputPath = getOutputPath(options, schemaFile);
298
360
  await runPlugins(schemaFile, model, outputPath, options);
299
361
  if (!options.silent) {
300
- console.log(import_colors2.default.green(`Generation completed successfully in ${Date.now() - start}ms.
362
+ console.log(import_colors4.default.green(`Generation completed successfully in ${Date.now() - start}ms.
301
363
  `));
302
364
  console.log(`You can now create a ZenStack client with it.
303
365
 
@@ -313,7 +375,7 @@ const client = new ZenStackClient(schema, {
313
375
  Check documentation: https://zenstack.dev/docs/3.x`);
314
376
  }
315
377
  }
316
- __name(run2, "run");
378
+ __name(run4, "run");
317
379
  function getOutputPath(options, schemaFile) {
318
380
  if (options.output) {
319
381
  return options.output;
@@ -348,9 +410,18 @@ async function runPlugins(schemaFile, model, outputPath, options) {
348
410
  }
349
411
  }
350
412
  if (cliPlugin) {
413
+ const pluginOptions = getPluginOptions(plugin3);
414
+ if (provider === "@core/typescript") {
415
+ if (pluginOptions["lite"] === void 0) {
416
+ pluginOptions["lite"] = options.lite;
417
+ }
418
+ if (pluginOptions["liteOnly"] === void 0) {
419
+ pluginOptions["liteOnly"] = options.liteOnly;
420
+ }
421
+ }
351
422
  processedPlugins.push({
352
423
  cliPlugin,
353
- pluginOptions: getPluginOptions(plugin3)
424
+ pluginOptions
354
425
  });
355
426
  }
356
427
  }
@@ -417,9 +488,9 @@ function getPluginOptions(plugin3) {
417
488
  __name(getPluginOptions, "getPluginOptions");
418
489
 
419
490
  // src/actions/info.ts
420
- var import_colors3 = __toESM(require("colors"), 1);
491
+ var import_colors5 = __toESM(require("colors"), 1);
421
492
  var import_node_path5 = __toESM(require("path"), 1);
422
- async function run3(projectPath) {
493
+ async function run5(projectPath) {
423
494
  const packages = await getZenStackPackages(projectPath);
424
495
  if (!packages) {
425
496
  console.error("Unable to locate package.json. Are you in a valid project directory?");
@@ -431,13 +502,13 @@ async function run3(projectPath) {
431
502
  if (version2) {
432
503
  versions.add(version2);
433
504
  }
434
- console.log(` ${import_colors3.default.green(pkg.padEnd(20))} ${version2}`);
505
+ console.log(` ${import_colors5.default.green(pkg.padEnd(20))} ${version2}`);
435
506
  }
436
507
  if (versions.size > 1) {
437
- console.warn(import_colors3.default.yellow("WARNING: Multiple versions of Zenstack packages detected. This may cause issues."));
508
+ console.warn(import_colors5.default.yellow("WARNING: Multiple versions of Zenstack packages detected. This may cause issues."));
438
509
  }
439
510
  }
440
- __name(run3, "run");
511
+ __name(run5, "run");
441
512
  async function getZenStackPackages(projectPath) {
442
513
  let pkgJson;
443
514
  const resolvedPath = import_node_path5.default.resolve(projectPath);
@@ -480,8 +551,8 @@ async function getZenStackPackages(projectPath) {
480
551
  __name(getZenStackPackages, "getZenStackPackages");
481
552
 
482
553
  // src/actions/init.ts
483
- var import_colors4 = __toESM(require("colors"), 1);
484
- var import_node_fs5 = __toESM(require("fs"), 1);
554
+ var import_colors6 = __toESM(require("colors"), 1);
555
+ var import_node_fs6 = __toESM(require("fs"), 1);
485
556
  var import_node_path6 = __toESM(require("path"), 1);
486
557
  var import_ora2 = __toESM(require("ora"), 1);
487
558
  var import_package_manager_detector = require("package-manager-detector");
@@ -516,7 +587,7 @@ model Post {
516
587
  `;
517
588
 
518
589
  // src/actions/init.ts
519
- async function run4(projectPath) {
590
+ async function run6(projectPath) {
520
591
  const packages = [
521
592
  {
522
593
  name: "@zenstackhq/cli@next",
@@ -534,7 +605,7 @@ async function run4(projectPath) {
534
605
  name: "npm"
535
606
  };
536
607
  }
537
- console.log(import_colors4.default.gray(`Using package manager: ${pm.agent}`));
608
+ console.log(import_colors6.default.gray(`Using package manager: ${pm.agent}`));
538
609
  for (const pkg of packages) {
539
610
  const resolved = (0, import_package_manager_detector.resolveCommand)(pm.agent, "install", [
540
611
  pkg.name,
@@ -557,25 +628,55 @@ async function run4(projectPath) {
557
628
  }
558
629
  }
559
630
  const generationFolder = "zenstack";
560
- if (!import_node_fs5.default.existsSync(import_node_path6.default.join(projectPath, generationFolder))) {
561
- import_node_fs5.default.mkdirSync(import_node_path6.default.join(projectPath, generationFolder));
631
+ if (!import_node_fs6.default.existsSync(import_node_path6.default.join(projectPath, generationFolder))) {
632
+ import_node_fs6.default.mkdirSync(import_node_path6.default.join(projectPath, generationFolder));
562
633
  }
563
- if (!import_node_fs5.default.existsSync(import_node_path6.default.join(projectPath, generationFolder, "schema.zmodel"))) {
564
- import_node_fs5.default.writeFileSync(import_node_path6.default.join(projectPath, generationFolder, "schema.zmodel"), STARTER_ZMODEL);
634
+ if (!import_node_fs6.default.existsSync(import_node_path6.default.join(projectPath, generationFolder, "schema.zmodel"))) {
635
+ import_node_fs6.default.writeFileSync(import_node_path6.default.join(projectPath, generationFolder, "schema.zmodel"), STARTER_ZMODEL);
565
636
  } else {
566
- console.log(import_colors4.default.yellow("Schema file already exists. Skipping generation of sample."));
637
+ console.log(import_colors6.default.yellow("Schema file already exists. Skipping generation of sample."));
567
638
  }
568
- console.log(import_colors4.default.green("ZenStack project initialized successfully!"));
569
- console.log(import_colors4.default.gray(`See "${generationFolder}/schema.zmodel" for your database schema.`));
570
- console.log(import_colors4.default.gray("Run `zenstack generate` to compile the the schema into a TypeScript file."));
639
+ console.log(import_colors6.default.green("ZenStack project initialized successfully!"));
640
+ console.log(import_colors6.default.gray(`See "${generationFolder}/schema.zmodel" for your database schema.`));
641
+ console.log(import_colors6.default.gray("Run `zenstack generate` to compile the the schema into a TypeScript file."));
571
642
  }
572
- __name(run4, "run");
643
+ __name(run6, "run");
573
644
 
574
645
  // src/actions/migrate.ts
575
- var import_node_fs6 = __toESM(require("fs"), 1);
646
+ var import_node_fs7 = __toESM(require("fs"), 1);
576
647
  var import_node_path7 = __toESM(require("path"), 1);
577
- async function run5(command, options) {
648
+
649
+ // src/actions/seed.ts
650
+ var import_colors7 = __toESM(require("colors"), 1);
651
+ var import_execa = require("execa");
652
+ async function run7(options, args) {
653
+ const pkgJsonConfig = getPkgJsonConfig(process.cwd());
654
+ if (!pkgJsonConfig.seed) {
655
+ if (!options.noWarnings) {
656
+ console.warn(import_colors7.default.yellow("No seed script defined in package.json. Skipping seeding."));
657
+ }
658
+ return;
659
+ }
660
+ const command = `${pkgJsonConfig.seed}${args.length > 0 ? " " + args.join(" ") : ""}`;
661
+ if (options.printStatus) {
662
+ console.log(import_colors7.default.gray(`Running seed script "${command}"...`));
663
+ }
664
+ try {
665
+ await (0, import_execa.execaCommand)(command, {
666
+ stdout: "inherit",
667
+ stderr: "inherit"
668
+ });
669
+ } catch (err) {
670
+ console.error(import_colors7.default.red(err instanceof Error ? err.message : String(err)));
671
+ throw new CliError("Failed to seed the database. Please check the error message above for details.");
672
+ }
673
+ }
674
+ __name(run7, "run");
675
+
676
+ // src/actions/migrate.ts
677
+ async function run8(command, options) {
578
678
  const schemaFile = getSchemaFile(options.schema);
679
+ await requireDataSourceUrl(schemaFile);
579
680
  const prismaSchemaDir = options.migrations ? import_node_path7.default.dirname(options.migrations) : void 0;
580
681
  const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);
581
682
  try {
@@ -597,18 +698,19 @@ async function run5(command, options) {
597
698
  break;
598
699
  }
599
700
  } finally {
600
- if (import_node_fs6.default.existsSync(prismaSchemaFile)) {
601
- import_node_fs6.default.unlinkSync(prismaSchemaFile);
701
+ if (import_node_fs7.default.existsSync(prismaSchemaFile)) {
702
+ import_node_fs7.default.unlinkSync(prismaSchemaFile);
602
703
  }
603
704
  }
604
705
  }
605
- __name(run5, "run");
706
+ __name(run8, "run");
606
707
  function runDev(prismaSchemaFile, options) {
607
708
  try {
608
709
  const cmd = [
609
710
  "migrate dev",
610
711
  ` --schema "${prismaSchemaFile}"`,
611
712
  " --skip-generate",
713
+ " --skip-seed",
612
714
  options.name ? ` --name "${options.name}"` : "",
613
715
  options.createOnly ? " --create-only" : ""
614
716
  ].join("");
@@ -618,18 +720,25 @@ function runDev(prismaSchemaFile, options) {
618
720
  }
619
721
  }
620
722
  __name(runDev, "runDev");
621
- function runReset(prismaSchemaFile, options) {
723
+ async function runReset(prismaSchemaFile, options) {
622
724
  try {
623
725
  const cmd = [
624
726
  "migrate reset",
625
727
  ` --schema "${prismaSchemaFile}"`,
626
728
  " --skip-generate",
729
+ " --skip-seed",
627
730
  options.force ? " --force" : ""
628
731
  ].join("");
629
732
  execPrisma(cmd);
630
733
  } catch (err) {
631
734
  handleSubProcessError2(err);
632
735
  }
736
+ if (!options.skipSeed) {
737
+ await run7({
738
+ noWarnings: true,
739
+ printStatus: true
740
+ }, []);
741
+ }
633
742
  }
634
743
  __name(runReset, "runReset");
635
744
  function runDeploy(prismaSchemaFile, _options) {
@@ -678,24 +787,10 @@ function handleSubProcessError2(err) {
678
787
  }
679
788
  __name(handleSubProcessError2, "handleSubProcessError");
680
789
 
681
- // src/actions/check.ts
682
- var import_colors5 = __toESM(require("colors"), 1);
683
- async function run6(options) {
684
- const schemaFile = getSchemaFile(options.schema);
685
- try {
686
- await loadSchemaDocument(schemaFile);
687
- console.log(import_colors5.default.green("\u2713 Schema validation completed successfully."));
688
- } catch (error) {
689
- console.error(import_colors5.default.red("\u2717 Schema validation failed."));
690
- throw error;
691
- }
692
- }
693
- __name(run6, "run");
694
-
695
790
  // src/telemetry.ts
696
791
  var import_mixpanel = require("mixpanel");
697
792
  var import_node_crypto2 = require("crypto");
698
- var import_node_fs11 = __toESM(require("fs"), 1);
793
+ var import_node_fs12 = __toESM(require("fs"), 1);
699
794
  var os2 = __toESM(require("os"), 1);
700
795
 
701
796
  // src/constants.ts
@@ -706,14 +801,14 @@ var import_node_process = require("process");
706
801
  var isInCi = import_node_process.env["CI"] !== "0" && import_node_process.env["CI"] !== "false" && ("CI" in import_node_process.env || "CONTINUOUS_INTEGRATION" in import_node_process.env || Object.keys(import_node_process.env).some((key) => key.startsWith("CI_")));
707
802
 
708
803
  // src/utils/is-container.ts
709
- var import_node_fs8 = __toESM(require("fs"), 1);
804
+ var import_node_fs9 = __toESM(require("fs"), 1);
710
805
 
711
806
  // src/utils/is-docker.ts
712
- var import_node_fs7 = __toESM(require("fs"), 1);
807
+ var import_node_fs8 = __toESM(require("fs"), 1);
713
808
  var isDockerCached;
714
809
  function hasDockerEnv() {
715
810
  try {
716
- import_node_fs7.default.statSync("/.dockerenv");
811
+ import_node_fs8.default.statSync("/.dockerenv");
717
812
  return true;
718
813
  } catch {
719
814
  return false;
@@ -722,7 +817,7 @@ function hasDockerEnv() {
722
817
  __name(hasDockerEnv, "hasDockerEnv");
723
818
  function hasDockerCGroup() {
724
819
  try {
725
- return import_node_fs7.default.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
820
+ return import_node_fs8.default.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
726
821
  } catch {
727
822
  return false;
728
823
  }
@@ -740,7 +835,7 @@ __name(isDocker, "isDocker");
740
835
  var cachedResult;
741
836
  var hasContainerEnv = /* @__PURE__ */ __name(() => {
742
837
  try {
743
- import_node_fs8.default.statSync("/run/.containerenv");
838
+ import_node_fs9.default.statSync("/run/.containerenv");
744
839
  return true;
745
840
  } catch {
746
841
  return false;
@@ -757,7 +852,7 @@ __name(isInContainer, "isInContainer");
757
852
  // src/utils/is-wsl.ts
758
853
  var import_node_process2 = __toESM(require("process"), 1);
759
854
  var import_node_os = __toESM(require("os"), 1);
760
- var import_node_fs9 = __toESM(require("fs"), 1);
855
+ var import_node_fs10 = __toESM(require("fs"), 1);
761
856
  var isWsl = /* @__PURE__ */ __name(() => {
762
857
  if (import_node_process2.default.platform !== "linux") {
763
858
  return false;
@@ -766,7 +861,7 @@ var isWsl = /* @__PURE__ */ __name(() => {
766
861
  return true;
767
862
  }
768
863
  try {
769
- return import_node_fs9.default.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft");
864
+ return import_node_fs10.default.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft");
770
865
  } catch {
771
866
  return false;
772
867
  }
@@ -830,8 +925,8 @@ function getMachineId() {
830
925
  __name(getMachineId, "getMachineId");
831
926
 
832
927
  // src/utils/version-utils.ts
833
- var import_colors6 = __toESM(require("colors"), 1);
834
- var import_node_fs10 = __toESM(require("fs"), 1);
928
+ var import_colors8 = __toESM(require("colors"), 1);
929
+ var import_node_fs11 = __toESM(require("fs"), 1);
835
930
  var import_node_path8 = __toESM(require("path"), 1);
836
931
  var import_node_url = require("url");
837
932
  var import_semver = __toESM(require("semver"), 1);
@@ -841,7 +936,7 @@ var VERSION_CHECK_TAG = "next";
841
936
  function getVersion() {
842
937
  try {
843
938
  const _dirname = typeof __dirname !== "undefined" ? __dirname : import_node_path8.default.dirname((0, import_node_url.fileURLToPath)(import_meta2.url));
844
- return JSON.parse(import_node_fs10.default.readFileSync(import_node_path8.default.join(_dirname, "../package.json"), "utf8")).version;
939
+ return JSON.parse(import_node_fs11.default.readFileSync(import_node_path8.default.join(_dirname, "../package.json"), "utf8")).version;
845
940
  } catch {
846
941
  return void 0;
847
942
  }
@@ -856,7 +951,7 @@ async function checkNewVersion() {
856
951
  return;
857
952
  }
858
953
  if (latestVersion && currVersion && import_semver.default.gt(latestVersion, currVersion)) {
859
- console.log(`A newer version ${import_colors6.default.cyan(latestVersion)} is available.`);
954
+ console.log(`A newer version ${import_colors8.default.cyan(latestVersion)} is available.`);
860
955
  }
861
956
  }
862
957
  __name(checkNewVersion, "checkNewVersion");
@@ -972,7 +1067,7 @@ var Telemetry = class {
972
1067
  try {
973
1068
  const packageJsonPath = import_meta3.resolve("prisma/package.json");
974
1069
  const packageJsonUrl = new URL(packageJsonPath);
975
- const packageJson = JSON.parse(import_node_fs11.default.readFileSync(packageJsonUrl, "utf8"));
1070
+ const packageJson = JSON.parse(import_node_fs12.default.readFileSync(packageJsonUrl, "utf8"));
976
1071
  return packageJson.version;
977
1072
  } catch {
978
1073
  return void 0;
@@ -983,45 +1078,62 @@ var telemetry = new Telemetry();
983
1078
 
984
1079
  // src/index.ts
985
1080
  var generateAction = /* @__PURE__ */ __name(async (options) => {
986
- await telemetry.trackCommand("generate", () => run2(options));
1081
+ await telemetry.trackCommand("generate", () => run4(options));
987
1082
  }, "generateAction");
988
1083
  var migrateAction = /* @__PURE__ */ __name(async (subCommand, options) => {
989
- await telemetry.trackCommand(`migrate ${subCommand}`, () => run5(subCommand, options));
1084
+ await telemetry.trackCommand(`migrate ${subCommand}`, () => run8(subCommand, options));
990
1085
  }, "migrateAction");
991
1086
  var dbAction = /* @__PURE__ */ __name(async (subCommand, options) => {
992
- await telemetry.trackCommand(`db ${subCommand}`, () => run(subCommand, options));
1087
+ await telemetry.trackCommand(`db ${subCommand}`, () => run2(subCommand, options));
993
1088
  }, "dbAction");
994
1089
  var infoAction = /* @__PURE__ */ __name(async (projectPath) => {
995
- await telemetry.trackCommand("info", () => run3(projectPath));
1090
+ await telemetry.trackCommand("info", () => run5(projectPath));
996
1091
  }, "infoAction");
997
1092
  var initAction = /* @__PURE__ */ __name(async (projectPath) => {
998
- await telemetry.trackCommand("init", () => run4(projectPath));
1093
+ await telemetry.trackCommand("init", () => run6(projectPath));
999
1094
  }, "initAction");
1000
1095
  var checkAction = /* @__PURE__ */ __name(async (options) => {
1001
- await telemetry.trackCommand("check", () => run6(options));
1096
+ await telemetry.trackCommand("check", () => run(options));
1002
1097
  }, "checkAction");
1098
+ var formatAction = /* @__PURE__ */ __name(async (options) => {
1099
+ await telemetry.trackCommand("format", () => run3(options));
1100
+ }, "formatAction");
1101
+ var seedAction = /* @__PURE__ */ __name(async (options, args) => {
1102
+ await telemetry.trackCommand("db seed", () => run7(options, args));
1103
+ }, "seedAction");
1003
1104
  function createProgram() {
1004
- const program = new import_commander.Command("zen");
1005
- program.version(getVersion(), "-v --version", "display CLI version");
1006
- const schemaExtensions = import_language2.ZModelLanguageMetaData.fileExtensions.join(", ");
1007
- program.description(`${import_colors7.default.bold.blue("\u03B6")} ZenStack is the data layer for modern TypeScript apps.
1105
+ const program = new import_commander.Command("zen").alias("zenstack").helpOption("-h, --help", "Show this help message").version(getVersion(), "-v --version", "Show CLI version");
1106
+ const schemaExtensions = import_language3.ZModelLanguageMetaData.fileExtensions.join(", ");
1107
+ program.description(`${import_colors9.default.bold.blue("\u03B6")} ZenStack is the data layer for modern TypeScript apps.
1008
1108
 
1009
1109
  Documentation: https://zenstack.dev/docs/3.x`).showHelpAfterError().showSuggestionAfterError();
1010
1110
  const schemaOption = new import_commander.Option("--schema <file>", `schema file (with extension ${schemaExtensions}). Defaults to "zenstack/schema.zmodel" unless specified in package.json.`);
1011
1111
  const noVersionCheckOption = new import_commander.Option("--no-version-check", "do not check for new version");
1012
- program.command("generate").description("Run code generation plugins.").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("-o, --output <path>", "default output directory for code generation")).addOption(new import_commander.Option("--lite", "also generate a lite version of schema without attributes").default(false)).addOption(new import_commander.Option("--lite-only", "only generate lite version of schema without attributes").default(false)).addOption(new import_commander.Option("--silent", "suppress all output except errors").default(false)).action(generateAction);
1112
+ program.command("generate").description("Run code generation plugins").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("-o, --output <path>", "default output directory for code generation")).addOption(new import_commander.Option("--lite", "also generate a lite version of schema without attributes").default(false)).addOption(new import_commander.Option("--lite-only", "only generate lite version of schema without attributes").default(false)).addOption(new import_commander.Option("--silent", "suppress all output except errors").default(false)).action(generateAction);
1013
1113
  const migrateCommand = program.command("migrate").description("Run database schema migration related tasks.");
1014
1114
  const migrationsOption = new import_commander.Option("--migrations <path>", 'path that contains the "migrations" directory');
1015
- migrateCommand.command("dev").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("-n, --name <name>", "migration name")).addOption(new import_commander.Option("--create-only", "only create migration, do not apply")).addOption(migrationsOption).description("Create a migration from changes in schema and apply it to the database.").action((options) => migrateAction("dev", options));
1016
- migrateCommand.command("reset").addOption(schemaOption).addOption(new import_commander.Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).addOption(noVersionCheckOption).description("Reset your database and apply all migrations, all data will be lost.").action((options) => migrateAction("reset", options));
1017
- migrateCommand.command("deploy").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Deploy your pending migrations to your production/staging database.").action((options) => migrateAction("deploy", options));
1018
- migrateCommand.command("status").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Check the status of your database migrations.").action((options) => migrateAction("status", options));
1019
- migrateCommand.command("resolve").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(new import_commander.Option("--applied <migration>", "record a specific migration as applied")).addOption(new import_commander.Option("--rolled-back <migration>", "record a specific migration as rolled back")).description("Resolve issues with database migrations in deployment databases.").action((options) => migrateAction("resolve", options));
1020
- const dbCommand = program.command("db").description("Manage your database schema during development.");
1021
- dbCommand.command("push").description("Push the state from your schema to your database.").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("--accept-data-loss", "ignore data loss warnings")).addOption(new import_commander.Option("--force-reset", "force a reset of the database before push")).action((options) => dbAction("push", options));
1022
- program.command("info").description("Get information of installed ZenStack packages.").argument("[path]", "project path", ".").addOption(noVersionCheckOption).action(infoAction);
1023
- program.command("init").description("Initialize an existing project for ZenStack.").argument("[path]", "project path", ".").addOption(noVersionCheckOption).action(initAction);
1024
- program.command("check").description("Check a ZModel schema for syntax or semantic errors.").addOption(schemaOption).addOption(noVersionCheckOption).action(checkAction);
1115
+ migrateCommand.command("dev").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("-n, --name <name>", "migration name")).addOption(new import_commander.Option("--create-only", "only create migration, do not apply")).addOption(migrationsOption).description("Create a migration from changes in schema and apply it to the database").action((options) => migrateAction("dev", options));
1116
+ migrateCommand.command("reset").addOption(schemaOption).addOption(new import_commander.Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).addOption(new import_commander.Option("--skip-seed", "skip seeding the database after reset")).addOption(noVersionCheckOption).description("Reset your database and apply all migrations, all data will be lost").addHelpText("after", "\nIf there is a seed script defined in package.json, it will be run after the reset. Use --skip-seed to skip it.").action((options) => migrateAction("reset", options));
1117
+ migrateCommand.command("deploy").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Deploy your pending migrations to your production/staging database").action((options) => migrateAction("deploy", options));
1118
+ migrateCommand.command("status").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Check the status of your database migrations").action((options) => migrateAction("status", options));
1119
+ migrateCommand.command("resolve").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(new import_commander.Option("--applied <migration>", "record a specific migration as applied")).addOption(new import_commander.Option("--rolled-back <migration>", "record a specific migration as rolled back")).description("Resolve issues with database migrations in deployment databases").action((options) => migrateAction("resolve", options));
1120
+ const dbCommand = program.command("db").description("Manage your database schema during development");
1121
+ dbCommand.command("push").description("Push the state from your schema to your database").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new import_commander.Option("--accept-data-loss", "ignore data loss warnings")).addOption(new import_commander.Option("--force-reset", "force a reset of the database before push")).action((options) => dbAction("push", options));
1122
+ dbCommand.command("seed").description("Seed the database").allowExcessArguments(true).addHelpText("after", `
1123
+ Seed script is configured under the "zenstack.seed" field in package.json.
1124
+ E.g.:
1125
+ {
1126
+ "zenstack": {
1127
+ "seed": "ts-node ./zenstack/seed.ts"
1128
+ }
1129
+ }
1130
+
1131
+ Arguments following -- are passed to the seed script. E.g.: "zen db seed -- --users 10"`).addOption(noVersionCheckOption).action((options, command) => seedAction(options, command.args));
1132
+ program.command("info").description("Get information of installed ZenStack packages").argument("[path]", "project path", ".").addOption(noVersionCheckOption).action(infoAction);
1133
+ program.command("init").description("Initialize an existing project for ZenStack").argument("[path]", "project path", ".").addOption(noVersionCheckOption).action(initAction);
1134
+ program.command("check").description("Check a ZModel schema for syntax or semantic errors").addOption(schemaOption).addOption(noVersionCheckOption).action(checkAction);
1135
+ program.command("format").description("Format a ZModel schema file").addOption(schemaOption).addOption(noVersionCheckOption).action(formatAction);
1136
+ program.addHelpCommand("help [command]", "Display help for a command");
1025
1137
  program.hook("preAction", async (_thisCommand, actionCommand) => {
1026
1138
  if (actionCommand.getOptionValue("versionCheck") !== false) {
1027
1139
  await checkNewVersion();
@@ -1042,10 +1154,10 @@ async function main() {
1042
1154
  if (e instanceof import_commander.CommanderError) {
1043
1155
  exitCode = e.exitCode;
1044
1156
  } else if (e instanceof CliError) {
1045
- console.error(import_colors7.default.red(e.message));
1157
+ console.error(import_colors9.default.red(e.message));
1046
1158
  exitCode = 1;
1047
1159
  } else {
1048
- console.error(import_colors7.default.red(`Unhandled error: ${e}`));
1160
+ console.error(import_colors9.default.red(`Unhandled error: ${e}`));
1049
1161
  exitCode = 1;
1050
1162
  }
1051
1163
  }