@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.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, folder) {
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
- if (!folder) folder = path.dirname(zmodelPath);
103
- const prismaSchemaFile = path.resolve(folder, "~schema.prisma");
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, options.migrations ? path.dirname(options.migrations) : void 0);
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.