@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/.turbo/turbo-build.log +8 -26
- package/dist/index.cjs +241 -129
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +238 -126
- package/dist/index.js.map +1 -1
- package/package.json +11 -12
- package/src/actions/action-utils.ts +27 -7
- package/src/actions/db.ts +6 -2
- package/src/actions/format.ts +27 -0
- package/src/actions/generate.ts +13 -1
- package/src/actions/index.ts +4 -2
- package/src/actions/migrate.ts +14 -2
- package/src/actions/seed.ts +38 -0
- package/src/index.ts +57 -14
- package/src/plugins/typescript.ts +12 -1
- package/src/utils/exec-utils.ts +18 -7
- package/test/db.test.ts +43 -0
- package/test/format.test.ts +33 -0
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
|
|
32
|
-
var
|
|
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/
|
|
36
|
-
var
|
|
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("./
|
|
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 ("./
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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 (!
|
|
253
|
-
|
|
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
|
-
|
|
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
|
|
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 (!
|
|
276
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
491
|
+
var import_colors5 = __toESM(require("colors"), 1);
|
|
421
492
|
var import_node_path5 = __toESM(require("path"), 1);
|
|
422
|
-
async function
|
|
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(` ${
|
|
505
|
+
console.log(` ${import_colors5.default.green(pkg.padEnd(20))} ${version2}`);
|
|
435
506
|
}
|
|
436
507
|
if (versions.size > 1) {
|
|
437
|
-
console.warn(
|
|
508
|
+
console.warn(import_colors5.default.yellow("WARNING: Multiple versions of Zenstack packages detected. This may cause issues."));
|
|
438
509
|
}
|
|
439
510
|
}
|
|
440
|
-
__name(
|
|
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
|
|
484
|
-
var
|
|
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
|
|
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(
|
|
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 (!
|
|
561
|
-
|
|
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 (!
|
|
564
|
-
|
|
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(
|
|
637
|
+
console.log(import_colors6.default.yellow("Schema file already exists. Skipping generation of sample."));
|
|
567
638
|
}
|
|
568
|
-
console.log(
|
|
569
|
-
console.log(
|
|
570
|
-
console.log(
|
|
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(
|
|
643
|
+
__name(run6, "run");
|
|
573
644
|
|
|
574
645
|
// src/actions/migrate.ts
|
|
575
|
-
var
|
|
646
|
+
var import_node_fs7 = __toESM(require("fs"), 1);
|
|
576
647
|
var import_node_path7 = __toESM(require("path"), 1);
|
|
577
|
-
|
|
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 (
|
|
601
|
-
|
|
701
|
+
if (import_node_fs7.default.existsSync(prismaSchemaFile)) {
|
|
702
|
+
import_node_fs7.default.unlinkSync(prismaSchemaFile);
|
|
602
703
|
}
|
|
603
704
|
}
|
|
604
705
|
}
|
|
605
|
-
__name(
|
|
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
|
|
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
|
|
804
|
+
var import_node_fs9 = __toESM(require("fs"), 1);
|
|
710
805
|
|
|
711
806
|
// src/utils/is-docker.ts
|
|
712
|
-
var
|
|
807
|
+
var import_node_fs8 = __toESM(require("fs"), 1);
|
|
713
808
|
var isDockerCached;
|
|
714
809
|
function hasDockerEnv() {
|
|
715
810
|
try {
|
|
716
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
834
|
-
var
|
|
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(
|
|
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 ${
|
|
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(
|
|
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", () =>
|
|
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}`, () =>
|
|
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}`, () =>
|
|
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", () =>
|
|
1090
|
+
await telemetry.trackCommand("info", () => run5(projectPath));
|
|
996
1091
|
}, "infoAction");
|
|
997
1092
|
var initAction = /* @__PURE__ */ __name(async (projectPath) => {
|
|
998
|
-
await telemetry.trackCommand("init", () =>
|
|
1093
|
+
await telemetry.trackCommand("init", () => run6(projectPath));
|
|
999
1094
|
}, "initAction");
|
|
1000
1095
|
var checkAction = /* @__PURE__ */ __name(async (options) => {
|
|
1001
|
-
await telemetry.trackCommand("check", () =>
|
|
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
|
-
|
|
1006
|
-
|
|
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
|
|
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
|
|
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
|
|
1018
|
-
migrateCommand.command("status").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Check the status of your database migrations
|
|
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
|
|
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
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
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(
|
|
1157
|
+
console.error(import_colors9.default.red(e.message));
|
|
1046
1158
|
exitCode = 1;
|
|
1047
1159
|
} else {
|
|
1048
|
-
console.error(
|
|
1160
|
+
console.error(import_colors9.default.red(`Unhandled error: ${e}`));
|
|
1049
1161
|
exitCode = 1;
|
|
1050
1162
|
}
|
|
1051
1163
|
}
|