@zenstackhq/cli 3.6.0 → 3.6.1
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 +19 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +18 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -12
package/dist/index.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import path from "node:path";
|
|
|
8
8
|
import { invariant, lowerCaseFirst, singleDebounce } from "@zenstackhq/common-helpers";
|
|
9
9
|
import { PrismaSchemaGenerator, TsSchemaGenerator } from "@zenstackhq/sdk";
|
|
10
10
|
import { createJiti } from "jiti";
|
|
11
|
+
import crypto, { createHash, randomUUID } from "node:crypto";
|
|
11
12
|
import fs from "node:fs";
|
|
12
13
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
13
14
|
import terminalLink from "terminal-link";
|
|
@@ -31,7 +32,6 @@ import { ZenStackMiddleware } from "@zenstackhq/server/express";
|
|
|
31
32
|
import cors from "cors";
|
|
32
33
|
import express from "express";
|
|
33
34
|
import { init } from "mixpanel";
|
|
34
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
35
35
|
import * as os$1 from "os";
|
|
36
36
|
import process$1, { env } from "node:process";
|
|
37
37
|
import os from "node:os";
|
|
@@ -95,12 +95,14 @@ function handleSubProcessError$1(err) {
|
|
|
95
95
|
if (err instanceof Error && "status" in err && typeof err.status === "number") process.exit(err.status);
|
|
96
96
|
else process.exit(1);
|
|
97
97
|
}
|
|
98
|
-
async function generateTempPrismaSchema(zmodelPath,
|
|
98
|
+
async function generateTempPrismaSchema(zmodelPath, opts = {}) {
|
|
99
|
+
const { folder: folderOpt, randomName = false } = opts;
|
|
99
100
|
const model = await loadSchemaDocument(zmodelPath);
|
|
100
101
|
if (!model.declarations.some(isDataSource)) throw new CliError("Schema must define a datasource");
|
|
101
102
|
const prismaSchema = await new PrismaSchemaGenerator(model).generate();
|
|
102
|
-
|
|
103
|
-
const
|
|
103
|
+
const folder = folderOpt ?? path.dirname(zmodelPath);
|
|
104
|
+
const fileName = randomName ? `~schema.${crypto.randomUUID()}.prisma` : "~schema.prisma";
|
|
105
|
+
const prismaSchemaFile = path.resolve(folder, fileName);
|
|
104
106
|
fs.writeFileSync(prismaSchemaFile, prismaSchema);
|
|
105
107
|
return prismaSchemaFile;
|
|
106
108
|
}
|
|
@@ -2160,7 +2162,7 @@ async function run$7(command, options) {
|
|
|
2160
2162
|
async function runPush(options) {
|
|
2161
2163
|
const schemaFile = getSchemaFile(options.schema);
|
|
2162
2164
|
await requireDataSourceUrl(schemaFile);
|
|
2163
|
-
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);
|
|
2165
|
+
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, { randomName: options.randomPrismaSchemaName });
|
|
2164
2166
|
try {
|
|
2165
2167
|
const cmd = [
|
|
2166
2168
|
"db push",
|
|
@@ -2893,7 +2895,10 @@ async function run$2(options, args) {
|
|
|
2893
2895
|
async function run$1(command, options) {
|
|
2894
2896
|
const schemaFile = getSchemaFile(options.schema);
|
|
2895
2897
|
await requireDataSourceUrl(schemaFile);
|
|
2896
|
-
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile,
|
|
2898
|
+
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, {
|
|
2899
|
+
folder: options.migrations ? path.dirname(options.migrations) : void 0,
|
|
2900
|
+
randomName: options.randomPrismaSchemaName
|
|
2901
|
+
});
|
|
2897
2902
|
try {
|
|
2898
2903
|
switch (command) {
|
|
2899
2904
|
case "dev":
|
|
@@ -3383,16 +3388,17 @@ function createProgram() {
|
|
|
3383
3388
|
const schemaOption = new Option("--schema <file>", `schema file (with extension ${schemaExtensions}). Defaults to "zenstack/schema.zmodel" unless specified in package.json.`);
|
|
3384
3389
|
const noVersionCheckOption = new Option("--no-version-check", "do not check for new version");
|
|
3385
3390
|
const noTipsOption = new Option("--no-tips", "do not show usage tips");
|
|
3391
|
+
const randomPrismaSchemaNameOption = new Option("--random-prisma-schema-name", "append a random UUID to the temporary Prisma schema filename (e.g., ~schema.<uuid>.prisma) to avoid collisions between concurrent runs sharing a working directory").default(false);
|
|
3386
3392
|
program.command("generate").description("Run code generation plugins").addOption(schemaOption).addOption(noVersionCheckOption).addOption(noTipsOption).addOption(new Option("-o, --output <path>", "default output directory for code generation")).addOption(new Option("-w, --watch", "enable watch mode").default(false)).addOption(triStateBooleanOption("--lite [boolean]", "also generate a lite version of schema without attributes, defaults to false")).addOption(triStateBooleanOption("--lite-only [boolean]", "only generate lite version of schema without attributes, defaults to false")).addOption(triStateBooleanOption("--generate-models [boolean]", "generate models.ts file, defaults to true")).addOption(triStateBooleanOption("--generate-input [boolean]", "generate input.ts file, defaults to true")).addOption(new Option("--silent", "suppress all output except errors").default(false)).action(generateAction);
|
|
3387
3393
|
const migrateCommand = program.command("migrate").description("Run database schema migration related tasks.");
|
|
3388
3394
|
const migrationsOption = new Option("--migrations <path>", "path that contains the \"migrations\" directory");
|
|
3389
|
-
migrateCommand.command("dev").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new Option("-n, --name <name>", "migration name")).addOption(new 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));
|
|
3390
|
-
migrateCommand.command("reset").addOption(schemaOption).addOption(new Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).addOption(new 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));
|
|
3391
|
-
migrateCommand.command("deploy").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Deploy your pending migrations to your production/staging database").action((options) => migrateAction("deploy", options));
|
|
3392
|
-
migrateCommand.command("status").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).description("Check the status of your database migrations").action((options) => migrateAction("status", options));
|
|
3393
|
-
migrateCommand.command("resolve").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(new Option("--applied <migration>", "record a specific migration as applied")).addOption(new 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));
|
|
3395
|
+
migrateCommand.command("dev").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new Option("-n, --name <name>", "migration name")).addOption(new Option("--create-only", "only create migration, do not apply")).addOption(migrationsOption).addOption(randomPrismaSchemaNameOption).description("Create a migration from changes in schema and apply it to the database").action((options) => migrateAction("dev", options));
|
|
3396
|
+
migrateCommand.command("reset").addOption(schemaOption).addOption(new Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).addOption(new Option("--skip-seed", "skip seeding the database after reset")).addOption(noVersionCheckOption).addOption(randomPrismaSchemaNameOption).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));
|
|
3397
|
+
migrateCommand.command("deploy").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(randomPrismaSchemaNameOption).description("Deploy your pending migrations to your production/staging database").action((options) => migrateAction("deploy", options));
|
|
3398
|
+
migrateCommand.command("status").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(randomPrismaSchemaNameOption).description("Check the status of your database migrations").action((options) => migrateAction("status", options));
|
|
3399
|
+
migrateCommand.command("resolve").addOption(schemaOption).addOption(noVersionCheckOption).addOption(migrationsOption).addOption(randomPrismaSchemaNameOption).addOption(new Option("--applied <migration>", "record a specific migration as applied")).addOption(new 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));
|
|
3394
3400
|
const dbCommand = program.command("db").description("Manage your database schema during development");
|
|
3395
|
-
dbCommand.command("push").description("Push the state from your schema to your database").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new Option("--accept-data-loss", "ignore data loss warnings")).addOption(new Option("--force-reset", "force a reset of the database before push")).action((options) => dbAction("push", options));
|
|
3401
|
+
dbCommand.command("push").description("Push the state from your schema to your database").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new Option("--accept-data-loss", "ignore data loss warnings")).addOption(new Option("--force-reset", "force a reset of the database before push")).addOption(randomPrismaSchemaNameOption).action((options) => dbAction("push", options));
|
|
3396
3402
|
dbCommand.command("pull").description("Introspect your database.").addOption(schemaOption).addOption(noVersionCheckOption).addOption(new Option("-o, --output <path>", "set custom output path for the introspected schema. If a file path is provided, all schemas are merged into that single file. If a directory path is provided, files are written to the directory and imports are kept.")).addOption(new Option("--model-casing <pascal|camel|snake|none>", "set the casing of generated models").default("pascal")).addOption(new Option("--field-casing <pascal|camel|snake|none>", "set the casing of generated fields").default("camel")).addOption(new Option("--always-map", "always add @map and @@map attributes to models and fields").default(false)).addOption(new Option("--quote <double|single>", "set the quote style of generated schema files").default("single")).addOption(new Option("--indent <number>", "set the indentation of the generated schema files").default(4)).action((options) => dbAction("pull", options));
|
|
3397
3403
|
dbCommand.command("seed").description("Seed the database").allowExcessArguments(true).addHelpText("after", `
|
|
3398
3404
|
Seed script is configured under the "zenstack.seed" field in package.json.
|