@zenstackhq/cli 3.0.0-alpha.10 → 3.0.0-alpha.12
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 -8
- package/dist/index.cjs +38 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +35 -12
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/src/actions/action-utils.ts +30 -3
- package/src/actions/generate.ts +1 -1
- package/src/actions/migrate.ts +4 -1
- package/src/index.ts +5 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @zenstackhq/cli@3.0.0-alpha.
|
|
2
|
+
> @zenstackhq/cli@3.0.0-alpha.12 build /home/runner/work/zenstack-v3/zenstack-v3/packages/cli
|
|
3
3
|
> tsup-node
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: {"index":"src/index.ts"}
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
13
|
+
[32mCJS[39m [1mdist/index.cjs [22m[32m21.61 KB[39m
|
|
14
|
+
[32mCJS[39m [1mdist/index.cjs.map [22m[32m38.40 KB[39m
|
|
15
|
+
[32mCJS[39m ⚡️ Build success in 90ms
|
|
16
|
+
[32mESM[39m [1mdist/index.js [22m[32m18.25 KB[39m
|
|
17
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m38.16 KB[39m
|
|
18
|
+
[32mESM[39m ⚡️ Build success in 90ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 3482ms
|
|
21
21
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m108.00 B[39m
|
|
22
22
|
[32mDTS[39m [1mdist/index.d.cts [22m[32m108.00 B[39m
|
package/dist/index.cjs
CHANGED
|
@@ -64,7 +64,6 @@ function execPackage(cmd, options) {
|
|
|
64
64
|
__name(execPackage, "execPackage");
|
|
65
65
|
|
|
66
66
|
// src/actions/action-utils.ts
|
|
67
|
-
var import_common_helpers = require("@zenstackhq/common-helpers");
|
|
68
67
|
var import_language = require("@zenstackhq/language");
|
|
69
68
|
var import_sdk = require("@zenstackhq/sdk");
|
|
70
69
|
var import_colors = __toESM(require("colors"), 1);
|
|
@@ -122,10 +121,13 @@ function handleSubProcessError(err) {
|
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
123
|
__name(handleSubProcessError, "handleSubProcessError");
|
|
125
|
-
async function generateTempPrismaSchema(zmodelPath) {
|
|
124
|
+
async function generateTempPrismaSchema(zmodelPath, folder) {
|
|
126
125
|
const model = await loadSchemaDocument(zmodelPath);
|
|
127
126
|
const prismaSchema = await new import_sdk.PrismaSchemaGenerator(model).generate();
|
|
128
|
-
|
|
127
|
+
if (!folder) {
|
|
128
|
+
folder = import_node_path.default.dirname(zmodelPath);
|
|
129
|
+
}
|
|
130
|
+
const prismaSchemaFile = import_node_path.default.resolve(folder, "~schema.prisma");
|
|
129
131
|
import_node_fs.default.writeFileSync(prismaSchemaFile, prismaSchema);
|
|
130
132
|
return prismaSchemaFile;
|
|
131
133
|
}
|
|
@@ -135,7 +137,7 @@ function getPkgJsonConfig(startPath) {
|
|
|
135
137
|
schema: void 0,
|
|
136
138
|
output: void 0
|
|
137
139
|
};
|
|
138
|
-
const pkgJsonFile =
|
|
140
|
+
const pkgJsonFile = findUp([
|
|
139
141
|
"package.json"
|
|
140
142
|
], startPath, false);
|
|
141
143
|
if (!pkgJsonFile) {
|
|
@@ -154,6 +156,24 @@ function getPkgJsonConfig(startPath) {
|
|
|
154
156
|
return result;
|
|
155
157
|
}
|
|
156
158
|
__name(getPkgJsonConfig, "getPkgJsonConfig");
|
|
159
|
+
function findUp(names, cwd = process.cwd(), multiple = false, result = []) {
|
|
160
|
+
if (!names.some((name) => !!name)) {
|
|
161
|
+
return void 0;
|
|
162
|
+
}
|
|
163
|
+
const target = names.find((name) => import_node_fs.default.existsSync(import_node_path.default.join(cwd, name)));
|
|
164
|
+
if (multiple === false && target) {
|
|
165
|
+
return import_node_path.default.join(cwd, target);
|
|
166
|
+
}
|
|
167
|
+
if (target) {
|
|
168
|
+
result.push(import_node_path.default.join(cwd, target));
|
|
169
|
+
}
|
|
170
|
+
const up = import_node_path.default.resolve(cwd, "..");
|
|
171
|
+
if (up === cwd) {
|
|
172
|
+
return multiple && result.length > 0 ? result : void 0;
|
|
173
|
+
}
|
|
174
|
+
return findUp(names, up, multiple, result);
|
|
175
|
+
}
|
|
176
|
+
__name(findUp, "findUp");
|
|
157
177
|
|
|
158
178
|
// src/actions/db.ts
|
|
159
179
|
async function run(command, options) {
|
|
@@ -189,7 +209,7 @@ async function runPush(options) {
|
|
|
189
209
|
__name(runPush, "runPush");
|
|
190
210
|
|
|
191
211
|
// src/actions/generate.ts
|
|
192
|
-
var
|
|
212
|
+
var import_common_helpers = require("@zenstackhq/common-helpers");
|
|
193
213
|
var import_ast = require("@zenstackhq/language/ast");
|
|
194
214
|
var import_sdk2 = require("@zenstackhq/sdk");
|
|
195
215
|
var import_colors2 = __toESM(require("colors"), 1);
|
|
@@ -200,7 +220,7 @@ async function run2(options) {
|
|
|
200
220
|
const model = await loadSchemaDocument(schemaFile);
|
|
201
221
|
const outputPath = getOutputPath(options, schemaFile);
|
|
202
222
|
const tsSchemaFile = import_node_path2.default.join(outputPath, "schema.ts");
|
|
203
|
-
await new import_sdk2.TsSchemaGenerator().generate(schemaFile, [],
|
|
223
|
+
await new import_sdk2.TsSchemaGenerator().generate(schemaFile, [], outputPath);
|
|
204
224
|
await runPlugins(model, outputPath, tsSchemaFile);
|
|
205
225
|
if (options.savePrismaSchema) {
|
|
206
226
|
const prismaSchema = await new import_sdk2.PrismaSchemaGenerator(model).generate();
|
|
@@ -245,7 +265,7 @@ async function runPlugins(model, outputPath, tsSchemaFile) {
|
|
|
245
265
|
const plugins = model.declarations.filter(import_ast.isPlugin);
|
|
246
266
|
for (const plugin of plugins) {
|
|
247
267
|
const providerField = plugin.fields.find((f) => f.name === "provider");
|
|
248
|
-
(0,
|
|
268
|
+
(0, import_common_helpers.invariant)(providerField, `Plugin ${plugin.name} does not have a provider field`);
|
|
249
269
|
const provider = providerField.value.value;
|
|
250
270
|
let useProvider = provider;
|
|
251
271
|
if (useProvider.startsWith("@core/")) {
|
|
@@ -416,9 +436,11 @@ __name(run4, "run");
|
|
|
416
436
|
|
|
417
437
|
// src/actions/migrate.ts
|
|
418
438
|
var import_node_fs5 = __toESM(require("fs"), 1);
|
|
439
|
+
var import_node_path5 = __toESM(require("path"), 1);
|
|
419
440
|
async function run5(command, options) {
|
|
420
441
|
const schemaFile = getSchemaFile(options.schema);
|
|
421
|
-
const
|
|
442
|
+
const prismaSchemaDir = options.migrations ? import_node_path5.default.dirname(options.migrations) : void 0;
|
|
443
|
+
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);
|
|
422
444
|
try {
|
|
423
445
|
switch (command) {
|
|
424
446
|
case "dev":
|
|
@@ -500,13 +522,13 @@ __name(handleSubProcessError2, "handleSubProcessError");
|
|
|
500
522
|
|
|
501
523
|
// src/utils/version-utils.ts
|
|
502
524
|
var import_node_fs6 = __toESM(require("fs"), 1);
|
|
503
|
-
var
|
|
525
|
+
var import_node_path6 = __toESM(require("path"), 1);
|
|
504
526
|
var import_node_url = require("url");
|
|
505
527
|
var import_meta = {};
|
|
506
528
|
function getVersion() {
|
|
507
529
|
try {
|
|
508
|
-
const _dirname = typeof __dirname !== "undefined" ? __dirname :
|
|
509
|
-
return JSON.parse(import_node_fs6.default.readFileSync(
|
|
530
|
+
const _dirname = typeof __dirname !== "undefined" ? __dirname : import_node_path6.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
531
|
+
return JSON.parse(import_node_fs6.default.readFileSync(import_node_path6.default.join(_dirname, "../package.json"), "utf8")).version;
|
|
510
532
|
} catch {
|
|
511
533
|
return void 0;
|
|
512
534
|
}
|
|
@@ -539,10 +561,11 @@ Documentation: https://zenstack.dev.`).showHelpAfterError().showSuggestionAfterE
|
|
|
539
561
|
const schemaOption = new import_commander.Option("--schema <file>", `schema file (with extension ${schemaExtensions}). Defaults to "schema.zmodel" unless specified in package.json.`);
|
|
540
562
|
program2.command("generate").description("Run code generation.").addOption(schemaOption).addOption(new import_commander.Option("--silent", "do not print any output")).addOption(new import_commander.Option("--save-prisma-schema [path]", "save a Prisma schema file, by default into the output directory")).addOption(new import_commander.Option("-o, --output <path>", "default output directory for core plugins")).action(generateAction);
|
|
541
563
|
const migrateCommand = program2.command("migrate").description("Update the database schema with migrations.");
|
|
542
|
-
|
|
543
|
-
migrateCommand.command("
|
|
544
|
-
migrateCommand.command("
|
|
545
|
-
migrateCommand.command("
|
|
564
|
+
const migrationsOption = new import_commander.Option("--migrations <path>", "path for migrations");
|
|
565
|
+
migrateCommand.command("dev").addOption(schemaOption).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));
|
|
566
|
+
migrateCommand.command("reset").addOption(schemaOption).addOption(new import_commander.Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).description("Reset your database and apply all migrations, all data will be lost.").action((options) => migrateAction("reset", options));
|
|
567
|
+
migrateCommand.command("deploy").addOption(schemaOption).addOption(migrationsOption).description("Deploy your pending migrations to your production/staging database.").action((options) => migrateAction("deploy", options));
|
|
568
|
+
migrateCommand.command("status").addOption(schemaOption).addOption(migrationsOption).description("check the status of your database migrations.").action((options) => migrateAction("status", options));
|
|
546
569
|
const dbCommand = program2.command("db").description("Manage your database schema during development.");
|
|
547
570
|
dbCommand.command("push").description("Push the state from your schema to your database").addOption(schemaOption).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));
|
|
548
571
|
program2.command("info").description("Get information of installed ZenStack and related packages.").argument("[path]", "project path", ".").action(infoAction);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/generate.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/utils/version-utils.ts"],"sourcesContent":["import { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport * as actions from './actions';\nimport { getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await actions.generate(options);\n};\n\nconst migrateAction = async (command: string, options: any): Promise<void> => {\n await actions.migrate(command, options);\n};\n\nconst dbAction = async (command: string, options: any): Promise<void> => {\n await actions.db(command, options);\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await actions.info(projectPath);\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await actions.init(projectPath);\n};\n\nexport function createProgram() {\n const program = new Command('zenstack');\n\n program.version(getVersion()!, '-v --version', 'display CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is a Prisma power pack for building full-stack apps.\\n\\nDocumentation: https://zenstack.dev.`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"schema.zmodel\" unless specified in package.json.`,\n );\n\n program\n .command('generate')\n .description('Run code generation.')\n .addOption(schemaOption)\n .addOption(new Option('--silent', 'do not print any output'))\n .addOption(\n new Option(\n '--save-prisma-schema [path]',\n 'save a Prisma schema file, by default into the output directory',\n ),\n )\n .addOption(new Option('-o, --output <path>', 'default output directory for core plugins'))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Update the database schema with migrations.');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(new Option('-n, --name <name>', 'migration name'))\n .addOption(new Option('--create-only', 'only create migration, do not apply'))\n .description('Create a migration from changes in schema and apply it to the database.')\n .action((options) => migrateAction('dev', options));\n\n migrateCommand\n .command('reset')\n .addOption(schemaOption)\n .addOption(new Option('--force', 'skip the confirmation prompt'))\n .description('Reset your database and apply all migrations, all data will be lost.')\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .description('Deploy your pending migrations to your production/staging database.')\n .action((options) => migrateAction('deploy', options));\n\n migrateCommand\n .command('status')\n .addOption(schemaOption)\n .description('check the status of your database migrations.')\n .action((options) => migrateAction('status', options));\n\n const dbCommand = program.command('db').description('Manage your database schema during development.');\n\n dbCommand\n .command('push')\n .description('Push the state from your schema to your database')\n .addOption(schemaOption)\n .addOption(new Option('--accept-data-loss', 'ignore data loss warnings'))\n .addOption(new Option('--force-reset', 'force a reset of the database before push'))\n .action((options) => dbAction('push', options));\n\n program\n .command('info')\n .description('Get information of installed ZenStack and related packages.')\n .argument('[path]', 'project path', '.')\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack.')\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n return program;\n}\n\nconst program = createProgram();\nprogram.parse(process.argv);\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, handleSubProcessError } from './action-utils';\n\ntype Options = {\n schema?: string;\n acceptDataLoss?: boolean;\n forceReset?: boolean;\n};\n\n/**\n * CLI action for db related commands\n */\nexport async function run(command: string, options: Options) {\n switch (command) {\n case 'push':\n await runPush(options);\n break;\n }\n}\n\nasync function runPush(options: Options) {\n // generate a temp prisma schema file\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n 'prisma db push',\n ` --schema \"${prismaSchemaFile}\"`,\n options.acceptDataLoss ? ' --accept-data-loss' : '',\n options.forceReset ? ' --force-reset' : '',\n ' --skip-generate',\n ].join('');\n\n try {\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n","import { execSync as _exec, type ExecSyncOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }): void {\n const { env, ...restOptions } = options ?? {};\n const mergedEnv = env ? { ...process.env, ...env } : undefined;\n _exec(cmd, {\n encoding: 'utf-8',\n stdio: options?.stdio ?? 'inherit',\n env: mergedEnv,\n ...restOptions,\n });\n}\n\n/**\n * Utility for running package commands through npx/bunx\n */\nexport function execPackage(\n cmd: string,\n options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> },\n): void {\n const packageManager = process?.versions?.['bun'] ? 'bunx' : 'npx';\n execSync(`${packageManager} ${cmd}`, options);\n}\n","import { findUp } from '@zenstackhq/common-helpers';\nimport { loadDocument } from '@zenstackhq/language';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from '../cli-error';\n\nexport function getSchemaFile(file?: string) {\n if (file) {\n if (!fs.existsSync(file)) {\n throw new CliError(`Schema file not found: ${file}`);\n }\n return file;\n }\n\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.schema) {\n if (!fs.existsSync(pkgJsonConfig.schema)) {\n throw new CliError(`Schema file not found: ${pkgJsonConfig.schema}`);\n }\n return pkgJsonConfig.schema;\n }\n\n if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./zenstack/schema.zmodel\" or \"./schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(schemaFile: string) {\n const loadResult = await loadDocument(schemaFile);\n if (!loadResult.success) {\n console.error(colors.red('Error loading schema:'));\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Failed to load schema');\n }\n return loadResult.model;\n}\n\nexport function handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n\nexport async function generateTempPrismaSchema(zmodelPath: string) {\n const model = await loadSchemaDocument(zmodelPath);\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n const prismaSchemaFile = path.resolve(path.dirname(zmodelPath), '~schema.prisma');\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n return prismaSchemaFile;\n}\n\nexport function getPkgJsonConfig(startPath: string) {\n const result: { schema: string | undefined; output: string | undefined } = { schema: undefined, output: undefined };\n const pkgJsonFile = findUp(['package.json'], startPath, false);\n\n if (!pkgJsonFile) {\n return result;\n }\n\n let pkgJson: any = undefined;\n try {\n pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile, 'utf8'));\n } catch {\n return result;\n }\n\n if (pkgJson.zenstack && typeof pkgJson.zenstack === 'object') {\n result.schema = pkgJson.zenstack.schema && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema);\n result.output = pkgJson.zenstack.output && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output);\n }\n\n return result;\n}\n","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { isPlugin, LiteralExpr, type Model } from '@zenstackhq/language/ast';\nimport { PrismaSchemaGenerator, TsSchemaGenerator, type CliGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { getPkgJsonConfig, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent?: boolean;\n savePrismaSchema?: string | boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n // generate TS schema\n const tsSchemaFile = path.join(outputPath, 'schema.ts');\n await new TsSchemaGenerator().generate(schemaFile, [], tsSchemaFile);\n\n await runPlugins(model, outputPath, tsSchemaFile);\n\n // generate Prisma schema\n if (options.savePrismaSchema) {\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n let prismaSchemaFile = path.join(outputPath, 'schema.prisma');\n if (typeof options.savePrismaSchema === 'string') {\n prismaSchemaFile = path.resolve(outputPath, options.savePrismaSchema);\n fs.mkdirSync(path.dirname(prismaSchemaFile), { recursive: true });\n }\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n }\n\n if (!options.silent) {\n console.log(colors.green('Generation completed successfully.'));\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from '${outputPath}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialectConfig: { ... }\n});\n\\`\\`\\`\n`);\n }\n}\n\nfunction getOutputPath(options: Options, schemaFile: string) {\n if (options.output) {\n return options.output;\n }\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.output) {\n return pkgJsonConfig.output;\n } else {\n return path.dirname(schemaFile);\n }\n}\n\nasync function runPlugins(model: Model, outputPath: string, tsSchemaFile: string) {\n const plugins = model.declarations.filter(isPlugin);\n for (const plugin of plugins) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n invariant(providerField, `Plugin ${plugin.name} does not have a provider field`);\n const provider = (providerField.value as LiteralExpr).value as string;\n let useProvider = provider;\n if (useProvider.startsWith('@core/')) {\n useProvider = `@zenstackhq/runtime/plugins/${useProvider.slice(6)}`;\n }\n const generator = (await import(useProvider)).default as CliGenerator;\n console.log('Running generator:', provider);\n await generator({ model, outputPath, tsSchemaFile });\n }\n}\n","import colors from 'colors';\nimport path from 'node:path';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = await getZenStackPackages(projectPath);\n if (!packages) {\n console.error('Unable to locate package.json. Are you in a valid project directory?');\n return;\n }\n\n console.log('Installed ZenStack Packages:');\n const versions = new Set<string>();\n for (const { pkg, version } of packages) {\n if (version) {\n versions.add(version);\n }\n console.log(` ${colors.green(pkg.padEnd(20))}\\t${version}`);\n }\n\n if (versions.size > 1) {\n console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.'));\n }\n}\n\nasync function getZenStackPackages(projectPath: string): Promise<Array<{ pkg: string; version: string | undefined }>> {\n let pkgJson: {\n dependencies: Record<string, unknown>;\n devDependencies: Record<string, unknown>;\n };\n const resolvedPath = path.resolve(projectPath);\n try {\n pkgJson = (\n await import(path.join(resolvedPath, 'package.json'), {\n with: { type: 'json' },\n })\n ).default;\n } catch {\n return [];\n }\n\n const packages = Array.from(\n new Set(\n [...Object.keys(pkgJson.dependencies ?? {}), ...Object.keys(pkgJson.devDependencies ?? {})].filter(\n (p) => p.startsWith('@zenstackhq/') || p === 'zenstack',\n ),\n ),\n ).sort();\n\n const result = await Promise.all(\n packages.map(async (pkg) => {\n try {\n const depPkgJson = (\n await import(`${pkg}/package.json`, {\n with: { type: 'json' },\n })\n ).default;\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result;\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport ora from 'ora';\nimport { detect, resolveCommand } from 'package-manager-detector';\nimport { CliError } from '../cli-error';\nimport { execSync } from '../utils/exec-utils';\nimport { STARTER_ZMODEL } from './templates';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = [\n { name: '@zenstackhq/cli@next', dev: true },\n { name: '@zenstackhq/runtime@next', dev: false },\n ];\n let pm = await detect();\n if (!pm) {\n pm = { agent: 'npm', name: 'npm' };\n }\n\n console.log(colors.gray(`Using package manager: ${pm.agent}`));\n\n for (const pkg of packages) {\n const resolved = resolveCommand(pm.agent, 'install', [\n pkg.name,\n ...(pkg.dev ? [pm.agent === 'yarn' ? '--dev' : '--save-dev'] : []),\n ]);\n if (!resolved) {\n throw new CliError(`Unable to determine how to install package \"${pkg.name}\". Please install it manually.`);\n }\n\n const spinner = ora(`Installing \"${pkg.name}\"`).start();\n try {\n execSync(`${resolved.command} ${resolved.args.join(' ')}`, {\n cwd: projectPath,\n });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n }\n\n const generationFolder = 'zenstack';\n\n if (!fs.existsSync(path.join(projectPath, generationFolder))) {\n fs.mkdirSync(path.join(projectPath, generationFolder));\n }\n\n if (!fs.existsSync(path.join(projectPath, generationFolder, 'schema.zmodel'))) {\n fs.writeFileSync(path.join(projectPath, generationFolder, 'schema.zmodel'), STARTER_ZMODEL);\n } else {\n console.log(colors.yellow('Schema file already exists. Skipping generation of sample.'));\n }\n\n console.log(colors.green('ZenStack project initialized successfully!'));\n console.log(colors.gray(`See \"${generationFolder}/schema.zmodel\" for your database schema.`));\n console.log(colors.gray('Run `zenstack generate` to compile the the schema into a TypeScript file.'));\n}\n","export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from './zenstack/schema';\nimport SQLite from 'better-sqlite3';\n\nasync function main() {\n const client = new ZenStackClient(schema, {\n dialectConfig: {\n database: new SQLite('./zenstack/dev.db'),\n },\n });\n const user = await client.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile } from './action-utils';\n\ntype CommonOptions = {\n schema?: string;\n};\n\ntype DevOptions = CommonOptions & {\n name?: string;\n createOnly?: boolean;\n};\n\ntype ResetOptions = CommonOptions & {\n force?: boolean;\n};\n\ntype DeployOptions = CommonOptions;\n\ntype StatusOptions = CommonOptions;\n\n/**\n * CLI action for migration-related commands\n */\nexport async function run(command: string, options: CommonOptions) {\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n switch (command) {\n case 'dev':\n await runDev(prismaSchemaFile, options as DevOptions);\n break;\n\n case 'reset':\n await runReset(prismaSchemaFile, options as ResetOptions);\n break;\n\n case 'deploy':\n await runDeploy(prismaSchemaFile, options as DeployOptions);\n break;\n\n case 'status':\n await runStatus(prismaSchemaFile, options as StatusOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nasync function runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'prisma migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n options.name ? ` --name ${options.name}` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = ['prisma migrate reset', ` --schema \"${prismaSchemaFile}\"`, options.force ? ' --force' : ''].join(\n '',\n );\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['prisma migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n await execPackage(`prisma migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getVersion() {\n try {\n // isomorphic __dirname\n const _dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n return JSON.parse(fs.readFileSync(path.join(_dirname, '../package.json'), 'utf8')).version;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;IAAAA,mBAAuC;AACvC,IAAAC,iBAAmB;AACnB,uBAAgC;;;ACFhC,IAAAC,kBAAe;;;ACAf,2BAAwD;AAKjD,SAASC,SAASC,KAAaC,SAAyE;AAC3G,QAAM,EAAEC,KAAK,GAAGC,YAAAA,IAAgBF,WAAW,CAAC;AAC5C,QAAMG,YAAYF,MAAM;IAAE,GAAGG,QAAQH;IAAK,GAAGA;EAAI,IAAII;AACrDC,2BAAAA,UAAMP,KAAK;IACPQ,UAAU;IACVC,OAAOR,SAASQ,SAAS;IACzBP,KAAKE;IACL,GAAGD;EACP,CAAA;AACJ;AATgBJ;AAcT,SAASW,YACZV,KACAC,SAAyE;AAEzE,QAAMU,iBAAiBN,SAASO,WAAW,KAAA,IAAS,SAAS;AAC7Db,WAAS,GAAGY,cAAAA,IAAkBX,GAAAA,IAAOC,OAAAA;AACzC;AANgBS;;;ACnBhB,4BAAuB;AACvB,sBAA6B;AAC7B,iBAAsC;AACtC,oBAAmB;AACnB,qBAAe;AACf,uBAAiB;;;ACFV,IAAMG,WAAN,cAAuBC,MAAAA;EAH9B,OAG8BA;;;AAAO;;;ADK9B,SAASC,cAAcC,MAAa;AACvC,MAAIA,MAAM;AACN,QAAI,CAACC,eAAAA,QAAGC,WAAWF,IAAAA,GAAO;AACtB,YAAM,IAAIG,SAAS,0BAA0BH,IAAAA,EAAM;IACvD;AACA,WAAOA;EACX;AAEA,QAAMI,gBAAgBC,iBAAiBC,QAAQC,IAAG,CAAA;AAClD,MAAIH,cAAcI,QAAQ;AACtB,QAAI,CAACP,eAAAA,QAAGC,WAAWE,cAAcI,MAAM,GAAG;AACtC,YAAM,IAAIL,SAAS,0BAA0BC,cAAcI,MAAM,EAAE;IACvE;AACA,WAAOJ,cAAcI;EACzB;AAEA,MAAIP,eAAAA,QAAGC,WAAW,0BAAA,GAA6B;AAC3C,WAAO;EACX,WAAWD,eAAAA,QAAGC,WAAW,iBAAA,GAAoB;AACzC,WAAO;EACX,OAAO;AACH,UAAM,IAAIC,SACN,+FAAA;EAER;AACJ;AAzBgBJ;AA2BhB,eAAsBU,mBAAmBC,YAAkB;AACvD,QAAMC,aAAa,UAAMC,8BAAaF,UAAAA;AACtC,MAAI,CAACC,WAAWE,SAAS;AACrBC,YAAQC,MAAMC,cAAAA,QAAOC,IAAI,uBAAA,CAAA;AACzBN,eAAWO,OAAOC,QAAQ,CAACC,QAAAA;AACvBN,cAAQC,MAAMC,cAAAA,QAAOC,IAAIG,GAAAA,CAAAA;IAC7B,CAAA;AACA,UAAM,IAAIjB,SAAS,uBAAA;EACvB;AACA,SAAOQ,WAAWU;AACtB;AAVsBZ;AAYf,SAASa,sBAAsBF,KAAY;AAC9C,MAAIA,eAAeG,SAAS,YAAYH,OAAO,OAAOA,IAAII,WAAW,UAAU;AAC3ElB,YAAQmB,KAAKL,IAAII,MAAM;EAC3B,OAAO;AACHlB,YAAQmB,KAAK,CAAA;EACjB;AACJ;AANgBH;AAQhB,eAAsBI,yBAAyBC,YAAkB;AAC7D,QAAMN,QAAQ,MAAMZ,mBAAmBkB,UAAAA;AACvC,QAAMC,eAAe,MAAM,IAAIC,iCAAsBR,KAAAA,EAAOS,SAAQ;AACpE,QAAMC,mBAAmBC,iBAAAA,QAAKC,QAAQD,iBAAAA,QAAKE,QAAQP,UAAAA,GAAa,gBAAA;AAChE1B,iBAAAA,QAAGkC,cAAcJ,kBAAkBH,YAAAA;AACnC,SAAOG;AACX;AANsBL;AAQf,SAASrB,iBAAiB+B,WAAiB;AAC9C,QAAMC,SAAqE;IAAE7B,QAAQ8B;IAAWC,QAAQD;EAAU;AAClH,QAAME,kBAAcC,8BAAO;IAAC;KAAiBL,WAAW,KAAA;AAExD,MAAI,CAACI,aAAa;AACd,WAAOH;EACX;AAEA,MAAIK,UAAeJ;AACnB,MAAI;AACAI,cAAUC,KAAKC,MAAM3C,eAAAA,QAAG4C,aAAaL,aAAa,MAAA,CAAA;EACtD,QAAQ;AACJ,WAAOH;EACX;AAEA,MAAIK,QAAQI,YAAY,OAAOJ,QAAQI,aAAa,UAAU;AAC1DT,WAAO7B,SAASkC,QAAQI,SAAStC,UAAUwB,iBAAAA,QAAKC,QAAQD,iBAAAA,QAAKE,QAAQM,WAAAA,GAAcE,QAAQI,SAAStC,MAAM;AAC1G6B,WAAOE,SAASG,QAAQI,SAASP,UAAUP,iBAAAA,QAAKC,QAAQD,iBAAAA,QAAKE,QAAQM,WAAAA,GAAcE,QAAQI,SAASP,MAAM;EAC9G;AAEA,SAAOF;AACX;AArBgBhC;;;AFlDhB,eAAsB0C,IAAIC,SAAiBC,SAAgB;AACvD,UAAQD,SAAAA;IACJ,KAAK;AACD,YAAME,QAAQD,OAAAA;AACd;EACR;AACJ;AANsBF;AAQtB,eAAeG,QAAQD,SAAgB;AAEnC,QAAME,aAAaC,cAAcH,QAAQI,MAAM;AAC/C,QAAMC,mBAAmB,MAAMC,yBAAyBJ,UAAAA;AAExD,MAAI;AAEA,UAAMK,MAAM;MACR;MACA,cAAcF,gBAAAA;MACdL,QAAQQ,iBAAiB,wBAAwB;MACjDR,QAAQS,aAAa,mBAAmB;MACxC;MACFC,KAAK,EAAA;AAEP,QAAI;AACA,YAAMC,YAAYJ,GAAAA;IACtB,SAASK,KAAK;AACVC,4BAAsBD,GAAAA;IAC1B;EACJ,UAAA;AACI,QAAIE,gBAAAA,QAAGC,WAAWV,gBAAAA,GAAmB;AACjCS,sBAAAA,QAAGE,WAAWX,gBAAAA;IAClB;EACJ;AACJ;AAzBeJ;;;AIrBf,IAAAgB,yBAA0B;AAC1B,iBAAkD;AAClD,IAAAC,cAA4E;AAC5E,IAAAC,iBAAmB;AACnB,IAAAC,kBAAe;AACf,IAAAC,oBAAiB;AAajB,eAAsBC,KAAIC,SAAgB;AACtC,QAAMC,aAAaC,cAAcF,QAAQG,MAAM;AAE/C,QAAMC,QAAQ,MAAMC,mBAAmBJ,UAAAA;AACvC,QAAMK,aAAaC,cAAcP,SAASC,UAAAA;AAG1C,QAAMO,eAAeC,kBAAAA,QAAKC,KAAKJ,YAAY,WAAA;AAC3C,QAAM,IAAIK,8BAAAA,EAAoBC,SAASX,YAAY,CAAA,GAAIO,YAAAA;AAEvD,QAAMK,WAAWT,OAAOE,YAAYE,YAAAA;AAGpC,MAAIR,QAAQc,kBAAkB;AAC1B,UAAMC,eAAe,MAAM,IAAIC,kCAAsBZ,KAAAA,EAAOQ,SAAQ;AACpE,QAAIK,mBAAmBR,kBAAAA,QAAKC,KAAKJ,YAAY,eAAA;AAC7C,QAAI,OAAON,QAAQc,qBAAqB,UAAU;AAC9CG,yBAAmBR,kBAAAA,QAAKS,QAAQZ,YAAYN,QAAQc,gBAAgB;AACpEK,sBAAAA,QAAGC,UAAUX,kBAAAA,QAAKY,QAAQJ,gBAAAA,GAAmB;QAAEK,WAAW;MAAK,CAAA;IACnE;AACAH,oBAAAA,QAAGI,cAAcN,kBAAkBF,YAAAA;EACvC;AAEA,MAAI,CAACf,QAAQwB,QAAQ;AACjBC,YAAQC,IAAIC,eAAAA,QAAOC,MAAM,oCAAA,CAAA;AACzBH,YAAQC,IAAI;;;;0BAIMpB,UAAAA;;;;;;CAMzB;EACG;AACJ;AArCsBP,OAAAA,MAAAA;AAuCtB,SAASQ,cAAcP,SAAkBC,YAAkB;AACvD,MAAID,QAAQ6B,QAAQ;AAChB,WAAO7B,QAAQ6B;EACnB;AACA,QAAMC,gBAAgBC,iBAAiBC,QAAQC,IAAG,CAAA;AAClD,MAAIH,cAAcD,QAAQ;AACtB,WAAOC,cAAcD;EACzB,OAAO;AACH,WAAOpB,kBAAAA,QAAKY,QAAQpB,UAAAA;EACxB;AACJ;AAVSM;AAYT,eAAeM,WAAWT,OAAcE,YAAoBE,cAAoB;AAC5E,QAAM0B,UAAU9B,MAAM+B,aAAaC,OAAOC,mBAAAA;AAC1C,aAAWC,UAAUJ,SAAS;AAC1B,UAAMK,gBAAgBD,OAAOE,OAAOC,KAAK,CAACC,MAAMA,EAAEC,SAAS,UAAA;AAC3DC,0CAAUL,eAAe,UAAUD,OAAOK,IAAI,iCAAiC;AAC/E,UAAME,WAAYN,cAAcO,MAAsBA;AACtD,QAAIC,cAAcF;AAClB,QAAIE,YAAYC,WAAW,QAAA,GAAW;AAClCD,oBAAc,+BAA+BA,YAAYE,MAAM,CAAA,CAAA;IACnE;AACA,UAAMC,aAAa,MAAM,OAAOH,cAAcI;AAC9C1B,YAAQC,IAAI,sBAAsBmB,QAAAA;AAClC,UAAMK,UAAU;MAAE9C;MAAOE;MAAYE;IAAa,CAAA;EACtD;AACJ;AAdeK;;;ACrEf,IAAAuC,iBAAmB;AACnB,IAAAC,oBAAiB;AAKjB,eAAsBC,KAAIC,aAAmB;AACzC,QAAMC,WAAW,MAAMC,oBAAoBF,WAAAA;AAC3C,MAAI,CAACC,UAAU;AACXE,YAAQC,MAAM,sEAAA;AACd;EACJ;AAEAD,UAAQE,IAAI,8BAAA;AACZ,QAAMC,WAAW,oBAAIC,IAAAA;AACrB,aAAW,EAAEC,KAAKC,QAAO,KAAMR,UAAU;AACrC,QAAIQ,SAAS;AACTH,eAASI,IAAID,OAAAA;IACjB;AACAN,YAAQE,IAAI,OAAOM,eAAAA,QAAOC,MAAMJ,IAAIK,OAAO,EAAA,CAAA,CAAA,IAASJ,OAAAA,EAAS;EACjE;AAEA,MAAIH,SAASQ,OAAO,GAAG;AACnBX,YAAQY,KAAKJ,eAAAA,QAAOK,OAAO,kFAAA,CAAA;EAC/B;AACJ;AAnBsBjB,OAAAA,MAAAA;AAqBtB,eAAeG,oBAAoBF,aAAmB;AAClD,MAAIiB;AAIJ,QAAMC,eAAeC,kBAAAA,QAAKC,QAAQpB,WAAAA;AAClC,MAAI;AACAiB,eACI,MAAM,OAAOE,kBAAAA,QAAKE,KAAKH,cAAc,cAAA,GAAiB;MAClDI,MAAM;QAAEC,MAAM;MAAO;IACzB,IACFC;EACN,QAAQ;AACJ,WAAO,CAAA;EACX;AAEA,QAAMvB,WAAWwB,MAAMC,KACnB,IAAInB,IACA;OAAIoB,OAAOC,KAAKX,QAAQY,gBAAgB,CAAC,CAAA;OAAOF,OAAOC,KAAKX,QAAQa,mBAAmB,CAAC,CAAA;IAAIC,OACxF,CAACC,MAAMA,EAAEC,WAAW,cAAA,KAAmBD,MAAM,UAAA,CAAA,CAAA,EAGvDE,KAAI;AAEN,QAAMC,SAAS,MAAMC,QAAQC,IACzBpC,SAASqC,IAAI,OAAO9B,QAAAA;AAChB,QAAI;AACA,YAAM+B,cACF,MAAM,OAAO,GAAG/B,GAAAA,iBAAoB;QAChCc,MAAM;UAAEC,MAAM;QAAO;MACzB,IACFC;AACF,aAAO;QAAEhB;QAAKC,SAAS8B,WAAW9B;MAAkB;IACxD,QAAQ;AACJ,aAAO;QAAED;QAAKC,SAAS+B;MAAU;IACrC;EACJ,CAAA,CAAA;AAGJ,SAAOL;AACX;AAxCejC;;;AC3Bf,IAAAuC,iBAAmB;AACnB,IAAAC,kBAAe;AACf,IAAAC,oBAAiB;AACjB,iBAAgB;AAChB,sCAAuC;;;ACJhC,IAAMC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADY9B,eAAsBC,KAAIC,aAAmB;AACzC,QAAMC,WAAW;IACb;MAAEC,MAAM;MAAwBC,KAAK;IAAK;IAC1C;MAAED,MAAM;MAA4BC,KAAK;IAAM;;AAEnD,MAAIC,KAAK,UAAMC,wCAAAA;AACf,MAAI,CAACD,IAAI;AACLA,SAAK;MAAEE,OAAO;MAAOJ,MAAM;IAAM;EACrC;AAEAK,UAAQC,IAAIC,eAAAA,QAAOC,KAAK,0BAA0BN,GAAGE,KAAK,EAAE,CAAA;AAE5D,aAAWK,OAAOV,UAAU;AACxB,UAAMW,eAAWC,gDAAeT,GAAGE,OAAO,WAAW;MACjDK,IAAIT;SACAS,IAAIR,MAAM;QAACC,GAAGE,UAAU,SAAS,UAAU;UAAgB,CAAA;KAClE;AACD,QAAI,CAACM,UAAU;AACX,YAAM,IAAIE,SAAS,+CAA+CH,IAAIT,IAAI,gCAAgC;IAC9G;AAEA,UAAMa,cAAUC,WAAAA,SAAI,eAAeL,IAAIT,IAAI,GAAG,EAAEe,MAAK;AACrD,QAAI;AACAC,eAAS,GAAGN,SAASO,OAAO,IAAIP,SAASQ,KAAKC,KAAK,GAAA,CAAA,IAAQ;QACvDC,KAAKtB;MACT,CAAA;AACAe,cAAQQ,QAAO;IACnB,SAASC,GAAG;AACRT,cAAQU,KAAI;AACZ,YAAMD;IACV;EACJ;AAEA,QAAME,mBAAmB;AAEzB,MAAI,CAACC,gBAAAA,QAAGC,WAAWC,kBAAAA,QAAKR,KAAKrB,aAAa0B,gBAAAA,CAAAA,GAAoB;AAC1DC,oBAAAA,QAAGG,UAAUD,kBAAAA,QAAKR,KAAKrB,aAAa0B,gBAAAA,CAAAA;EACxC;AAEA,MAAI,CAACC,gBAAAA,QAAGC,WAAWC,kBAAAA,QAAKR,KAAKrB,aAAa0B,kBAAkB,eAAA,CAAA,GAAmB;AAC3EC,oBAAAA,QAAGI,cAAcF,kBAAAA,QAAKR,KAAKrB,aAAa0B,kBAAkB,eAAA,GAAkBM,cAAAA;EAChF,OAAO;AACHzB,YAAQC,IAAIC,eAAAA,QAAOwB,OAAO,4DAAA,CAAA;EAC9B;AAEA1B,UAAQC,IAAIC,eAAAA,QAAOyB,MAAM,4CAAA,CAAA;AACzB3B,UAAQC,IAAIC,eAAAA,QAAOC,KAAK,QAAQgB,gBAAAA,2CAA2D,CAAA;AAC3FnB,UAAQC,IAAIC,eAAAA,QAAOC,KAAK,2EAAA,CAAA;AAC5B;AAhDsBX,OAAAA,MAAAA;;;AEZtB,IAAAoC,kBAAe;AAwBf,eAAsBC,KAAIC,SAAiBC,SAAsB;AAC7D,QAAMC,aAAaC,cAAcF,QAAQG,MAAM;AAC/C,QAAMC,mBAAmB,MAAMC,yBAAyBJ,UAAAA;AAExD,MAAI;AACA,YAAQF,SAAAA;MACJ,KAAK;AACD,cAAMO,OAAOF,kBAAkBJ,OAAAA;AAC/B;MAEJ,KAAK;AACD,cAAMO,SAASH,kBAAkBJ,OAAAA;AACjC;MAEJ,KAAK;AACD,cAAMQ,UAAUJ,kBAAkBJ,OAAAA;AAClC;MAEJ,KAAK;AACD,cAAMS,UAAUL,kBAAkBJ,OAAAA;AAClC;IACR;EACJ,UAAA;AACI,QAAIU,gBAAAA,QAAGC,WAAWP,gBAAAA,GAAmB;AACjCM,sBAAAA,QAAGE,WAAWR,gBAAAA;IAClB;EACJ;AACJ;AA3BsBN,OAAAA,MAAAA;AA6BtB,eAAeQ,OAAOF,kBAA0BJ,SAAmB;AAC/D,MAAI;AACA,UAAMa,MAAM;MACR;MACA,cAAcT,gBAAAA;MACd;MACAJ,QAAQc,OAAO,WAAWd,QAAQc,IAAI,KAAK;MAC3Cd,QAAQe,aAAa,mBAAmB;MAC1CC,KAAK,EAAA;AAEP,UAAMC,YAAYJ,GAAAA;EACtB,SAASK,KAAK;AACVC,IAAAA,uBAAsBD,GAAAA;EAC1B;AACJ;AAdeZ;AAgBf,eAAeC,SAASH,kBAA0BJ,SAAqB;AACnE,MAAI;AACA,UAAMa,MAAM;MAAC;MAAwB,cAAcT,gBAAAA;MAAqBJ,QAAQoB,QAAQ,aAAa;MAAIJ,KACrG,EAAA;AAGJ,UAAMC,YAAYJ,GAAAA;EACtB,SAASK,KAAK;AACVC,IAAAA,uBAAsBD,GAAAA;EAC1B;AACJ;AAVeX;AAYf,eAAeC,UAAUJ,kBAA0BiB,UAAuB;AACtE,MAAI;AACA,UAAMR,MAAM;MAAC;MAAyB,cAAcT,gBAAAA;MAAqBY,KAAK,EAAA;AAE9E,UAAMC,YAAYJ,GAAAA;EACtB,SAASK,KAAK;AACVC,IAAAA,uBAAsBD,GAAAA;EAC1B;AACJ;AAReV;AAUf,eAAeC,UAAUL,kBAA0BiB,UAAuB;AACtE,MAAI;AACA,UAAMJ,YAAY,mCAAmCb,gBAAAA,GAAmB;EAC5E,SAASc,KAAK;AACVC,IAAAA,uBAAsBD,GAAAA;EAC1B;AACJ;AANeT;AAQf,SAASU,uBAAsBD,KAAY;AACvC,MAAIA,eAAeI,SAAS,YAAYJ,OAAO,OAAOA,IAAIK,WAAW,UAAU;AAC3EC,YAAQC,KAAKP,IAAIK,MAAM;EAC3B,OAAO;AACHC,YAAQC,KAAK,CAAA;EACjB;AACJ;AANSN,OAAAA,wBAAAA;;;ACnGT,IAAAO,kBAAe;AACf,IAAAC,oBAAiB;AACjB,sBAA8B;AAF9B;AAIO,SAASC,aAAAA;AACZ,MAAI;AAEA,UAAMC,WAAW,OAAOC,cAAc,cAAcA,YAAYC,kBAAAA,QAAKC,YAAQC,+BAAc,YAAYC,GAAG,CAAA;AAC1G,WAAOC,KAAKC,MAAMC,gBAAAA,QAAGC,aAAaP,kBAAAA,QAAKQ,KAAKV,UAAU,iBAAA,GAAoB,MAAA,CAAA,EAASW;EACvF,QAAQ;AACJ,WAAOC;EACX;AACJ;AARgBb;;;AVEhB,IAAMc,iBAAiB,8BAAOC,YAAAA;AAC1B,QAAcC,KAASD,OAAAA;AAC3B,GAFuB;AAIvB,IAAME,gBAAgB,8BAAOC,SAAiBH,YAAAA;AAC1C,QAAcI,KAAQD,SAASH,OAAAA;AACnC,GAFsB;AAItB,IAAMK,WAAW,8BAAOF,SAAiBH,YAAAA;AACrC,QAAcM,IAAGH,SAASH,OAAAA;AAC9B,GAFiB;AAIjB,IAAMO,aAAa,8BAAOC,gBAAAA;AACtB,QAAcC,KAAKD,WAAAA;AACvB,GAFmB;AAInB,IAAME,aAAa,8BAAOF,gBAAAA;AACtB,QAAcG,KAAKH,WAAAA;AACvB,GAFmB;AAIZ,SAASI,gBAAAA;AACZ,QAAMC,WAAU,IAAIC,yBAAQ,UAAA;AAE5BD,EAAAA,SAAQE,QAAQC,WAAAA,GAAe,gBAAgB,qBAAA;AAE/C,QAAMC,mBAAmBC,wCAAuBC,eAAeC,KAAK,IAAA;AAEpEP,EAAAA,SACKQ,YACG,GAAGC,eAAAA,QAAOC,KAAKC,KACX,QAAA,CAAA;;qCACqG,EAE5GC,mBAAkB,EAClBC,yBAAwB;AAE7B,QAAMC,eAAe,IAAIC,wBACrB,mBACA,+BAA+BX,gBAAAA,kEAAkF;AAGrHJ,EAAAA,SACKV,QAAQ,UAAA,EACRkB,YAAY,sBAAA,EACZQ,UAAUF,YAAAA,EACVE,UAAU,IAAID,wBAAO,YAAY,yBAAA,CAAA,EACjCC,UACG,IAAID,wBACA,+BACA,iEAAA,CAAA,EAGPC,UAAU,IAAID,wBAAO,uBAAuB,2CAAA,CAAA,EAC5CE,OAAO/B,cAAAA;AAEZ,QAAMgC,iBAAiBlB,SAAQV,QAAQ,SAAA,EAAWkB,YAAY,6CAAA;AAE9DU,iBACK5B,QAAQ,KAAA,EACR0B,UAAUF,YAAAA,EACVE,UAAU,IAAID,wBAAO,qBAAqB,gBAAA,CAAA,EAC1CC,UAAU,IAAID,wBAAO,iBAAiB,qCAAA,CAAA,EACtCP,YAAY,yEAAA,EACZS,OAAO,CAAC9B,YAAYE,cAAc,OAAOF,OAAAA,CAAAA;AAE9C+B,iBACK5B,QAAQ,OAAA,EACR0B,UAAUF,YAAAA,EACVE,UAAU,IAAID,wBAAO,WAAW,8BAAA,CAAA,EAChCP,YAAY,sEAAA,EACZS,OAAO,CAAC9B,YAAYE,cAAc,SAASF,OAAAA,CAAAA;AAEhD+B,iBACK5B,QAAQ,QAAA,EACR0B,UAAUF,YAAAA,EACVN,YAAY,qEAAA,EACZS,OAAO,CAAC9B,YAAYE,cAAc,UAAUF,OAAAA,CAAAA;AAEjD+B,iBACK5B,QAAQ,QAAA,EACR0B,UAAUF,YAAAA,EACVN,YAAY,+CAAA,EACZS,OAAO,CAAC9B,YAAYE,cAAc,UAAUF,OAAAA,CAAAA;AAEjD,QAAMgC,YAAYnB,SAAQV,QAAQ,IAAA,EAAMkB,YAAY,iDAAA;AAEpDW,YACK7B,QAAQ,MAAA,EACRkB,YAAY,kDAAA,EACZQ,UAAUF,YAAAA,EACVE,UAAU,IAAID,wBAAO,sBAAsB,2BAAA,CAAA,EAC3CC,UAAU,IAAID,wBAAO,iBAAiB,2CAAA,CAAA,EACtCE,OAAO,CAAC9B,YAAYK,SAAS,QAAQL,OAAAA,CAAAA;AAE1Ca,EAAAA,SACKV,QAAQ,MAAA,EACRkB,YAAY,6DAAA,EACZY,SAAS,UAAU,gBAAgB,GAAA,EACnCH,OAAOvB,UAAAA;AAEZM,EAAAA,SACKV,QAAQ,MAAA,EACRkB,YAAY,8CAAA,EACZY,SAAS,UAAU,gBAAgB,GAAA,EACnCH,OAAOpB,UAAAA;AAEZ,SAAOG;AACX;AAvFgBD;AAyFhB,IAAMC,UAAUD,cAAAA;AAChBC,QAAQqB,MAAMC,QAAQC,IAAI;","names":["import_language","import_colors","import_node_fs","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","loadSchemaDocument","schemaFile","loadResult","loadDocument","success","console","error","colors","red","errors","forEach","err","model","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","prismaSchema","PrismaSchemaGenerator","generate","prismaSchemaFile","path","resolve","dirname","writeFileSync","startPath","result","undefined","output","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","run","command","options","runPush","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPackage","err","handleSubProcessError","fs","existsSync","unlinkSync","import_common_helpers","import_sdk","import_colors","import_node_fs","import_node_path","run","options","schemaFile","getSchemaFile","schema","model","loadSchemaDocument","outputPath","getOutputPath","tsSchemaFile","path","join","TsSchemaGenerator","generate","runPlugins","savePrismaSchema","prismaSchema","PrismaSchemaGenerator","prismaSchemaFile","resolve","fs","mkdirSync","dirname","recursive","writeFileSync","silent","console","log","colors","green","output","pkgJsonConfig","getPkgJsonConfig","process","cwd","plugins","declarations","filter","isPlugin","plugin","providerField","fields","find","f","name","invariant","provider","value","useProvider","startsWith","slice","generator","default","import_colors","import_node_path","run","projectPath","packages","getZenStackPackages","console","error","log","versions","Set","pkg","version","add","colors","green","padEnd","size","warn","yellow","pkgJson","resolvedPath","path","resolve","join","with","type","default","Array","from","Object","keys","dependencies","devDependencies","filter","p","startsWith","sort","result","Promise","all","map","depPkgJson","undefined","import_colors","import_node_fs","import_node_path","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","CliError","spinner","ora","start","execSync","command","args","join","cwd","succeed","e","fail","generationFolder","fs","existsSync","path","mkdirSync","writeFileSync","STARTER_ZMODEL","yellow","green","import_node_fs","run","command","options","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPackage","err","handleSubProcessError","force","_options","Error","status","process","exit","import_node_fs","import_node_path","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","url","JSON","parse","fs","readFileSync","join","version","undefined","generateAction","options","generate","migrateAction","command","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","createProgram","program","Command","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","addOption","action","migrateCommand","dbCommand","argument","parse","process","argv"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/generate.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/utils/version-utils.ts"],"sourcesContent":["import { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport * as actions from './actions';\nimport { getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await actions.generate(options);\n};\n\nconst migrateAction = async (command: string, options: any): Promise<void> => {\n await actions.migrate(command, options);\n};\n\nconst dbAction = async (command: string, options: any): Promise<void> => {\n await actions.db(command, options);\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await actions.info(projectPath);\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await actions.init(projectPath);\n};\n\nexport function createProgram() {\n const program = new Command('zenstack');\n\n program.version(getVersion()!, '-v --version', 'display CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is a Prisma power pack for building full-stack apps.\\n\\nDocumentation: https://zenstack.dev.`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"schema.zmodel\" unless specified in package.json.`,\n );\n\n program\n .command('generate')\n .description('Run code generation.')\n .addOption(schemaOption)\n .addOption(new Option('--silent', 'do not print any output'))\n .addOption(\n new Option(\n '--save-prisma-schema [path]',\n 'save a Prisma schema file, by default into the output directory',\n ),\n )\n .addOption(new Option('-o, --output <path>', 'default output directory for core plugins'))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Update the database schema with migrations.');\n const migrationsOption = new Option('--migrations <path>', 'path for migrations');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(new Option('-n, --name <name>', 'migration name'))\n .addOption(new Option('--create-only', 'only create migration, do not apply'))\n .addOption(migrationsOption)\n .description('Create a migration from changes in schema and apply it to the database.')\n .action((options) => migrateAction('dev', options));\n\n migrateCommand\n .command('reset')\n .addOption(schemaOption)\n .addOption(new Option('--force', 'skip the confirmation prompt'))\n .addOption(migrationsOption)\n .description('Reset your database and apply all migrations, all data will be lost.')\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .addOption(migrationsOption)\n .description('Deploy your pending migrations to your production/staging database.')\n .action((options) => migrateAction('deploy', options));\n\n migrateCommand\n .command('status')\n .addOption(schemaOption)\n .addOption(migrationsOption)\n .description('check the status of your database migrations.')\n .action((options) => migrateAction('status', options));\n\n const dbCommand = program.command('db').description('Manage your database schema during development.');\n\n dbCommand\n .command('push')\n .description('Push the state from your schema to your database')\n .addOption(schemaOption)\n .addOption(new Option('--accept-data-loss', 'ignore data loss warnings'))\n .addOption(new Option('--force-reset', 'force a reset of the database before push'))\n .action((options) => dbAction('push', options));\n\n program\n .command('info')\n .description('Get information of installed ZenStack and related packages.')\n .argument('[path]', 'project path', '.')\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack.')\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n return program;\n}\n\nconst program = createProgram();\nprogram.parse(process.argv);\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, handleSubProcessError } from './action-utils';\n\ntype Options = {\n schema?: string;\n acceptDataLoss?: boolean;\n forceReset?: boolean;\n};\n\n/**\n * CLI action for db related commands\n */\nexport async function run(command: string, options: Options) {\n switch (command) {\n case 'push':\n await runPush(options);\n break;\n }\n}\n\nasync function runPush(options: Options) {\n // generate a temp prisma schema file\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n 'prisma db push',\n ` --schema \"${prismaSchemaFile}\"`,\n options.acceptDataLoss ? ' --accept-data-loss' : '',\n options.forceReset ? ' --force-reset' : '',\n ' --skip-generate',\n ].join('');\n\n try {\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n","import { execSync as _exec, type ExecSyncOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }): void {\n const { env, ...restOptions } = options ?? {};\n const mergedEnv = env ? { ...process.env, ...env } : undefined;\n _exec(cmd, {\n encoding: 'utf-8',\n stdio: options?.stdio ?? 'inherit',\n env: mergedEnv,\n ...restOptions,\n });\n}\n\n/**\n * Utility for running package commands through npx/bunx\n */\nexport function execPackage(\n cmd: string,\n options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> },\n): void {\n const packageManager = process?.versions?.['bun'] ? 'bunx' : 'npx';\n execSync(`${packageManager} ${cmd}`, options);\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from '../cli-error';\n\nexport function getSchemaFile(file?: string) {\n if (file) {\n if (!fs.existsSync(file)) {\n throw new CliError(`Schema file not found: ${file}`);\n }\n return file;\n }\n\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.schema) {\n if (!fs.existsSync(pkgJsonConfig.schema)) {\n throw new CliError(`Schema file not found: ${pkgJsonConfig.schema}`);\n }\n return pkgJsonConfig.schema;\n }\n\n if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./zenstack/schema.zmodel\" or \"./schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(schemaFile: string) {\n const loadResult = await loadDocument(schemaFile);\n if (!loadResult.success) {\n console.error(colors.red('Error loading schema:'));\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Failed to load schema');\n }\n return loadResult.model;\n}\n\nexport function handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n\nexport async function generateTempPrismaSchema(zmodelPath: string, folder?: string) {\n const model = await loadSchemaDocument(zmodelPath);\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n if (!folder) {\n folder = path.dirname(zmodelPath);\n }\n const prismaSchemaFile = path.resolve(folder, '~schema.prisma');\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n return prismaSchemaFile;\n}\n\nexport function getPkgJsonConfig(startPath: string) {\n const result: { schema: string | undefined; output: string | undefined } = { schema: undefined, output: undefined };\n const pkgJsonFile = findUp(['package.json'], startPath, false);\n\n if (!pkgJsonFile) {\n return result;\n }\n\n let pkgJson: any = undefined;\n try {\n pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile, 'utf8'));\n } catch {\n return result;\n }\n\n if (pkgJson.zenstack && typeof pkgJson.zenstack === 'object') {\n result.schema = pkgJson.zenstack.schema && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema);\n result.output = pkgJson.zenstack.output && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output);\n }\n\n return result;\n}\n\ntype FindUpResult<Multiple extends boolean> = Multiple extends true ? string[] | undefined : string | undefined;\n\nfunction findUp<Multiple extends boolean = false>(\n names: string[],\n cwd: string = process.cwd(),\n multiple: Multiple = false as Multiple,\n result: string[] = [],\n): FindUpResult<Multiple> {\n if (!names.some((name) => !!name)) {\n return undefined;\n }\n const target = names.find((name) => fs.existsSync(path.join(cwd, name)));\n if (multiple === false && target) {\n return path.join(cwd, target) as FindUpResult<Multiple>;\n }\n if (target) {\n result.push(path.join(cwd, target));\n }\n const up = path.resolve(cwd, '..');\n if (up === cwd) {\n return (multiple && result.length > 0 ? result : undefined) as FindUpResult<Multiple>;\n }\n return findUp(names, up, multiple, result);\n}\n","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { isPlugin, LiteralExpr, type Model } from '@zenstackhq/language/ast';\nimport { PrismaSchemaGenerator, TsSchemaGenerator, type CliGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { getPkgJsonConfig, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent?: boolean;\n savePrismaSchema?: string | boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n // generate TS schema\n const tsSchemaFile = path.join(outputPath, 'schema.ts');\n await new TsSchemaGenerator().generate(schemaFile, [], outputPath);\n\n await runPlugins(model, outputPath, tsSchemaFile);\n\n // generate Prisma schema\n if (options.savePrismaSchema) {\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n let prismaSchemaFile = path.join(outputPath, 'schema.prisma');\n if (typeof options.savePrismaSchema === 'string') {\n prismaSchemaFile = path.resolve(outputPath, options.savePrismaSchema);\n fs.mkdirSync(path.dirname(prismaSchemaFile), { recursive: true });\n }\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n }\n\n if (!options.silent) {\n console.log(colors.green('Generation completed successfully.'));\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from '${outputPath}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialectConfig: { ... }\n});\n\\`\\`\\`\n`);\n }\n}\n\nfunction getOutputPath(options: Options, schemaFile: string) {\n if (options.output) {\n return options.output;\n }\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.output) {\n return pkgJsonConfig.output;\n } else {\n return path.dirname(schemaFile);\n }\n}\n\nasync function runPlugins(model: Model, outputPath: string, tsSchemaFile: string) {\n const plugins = model.declarations.filter(isPlugin);\n for (const plugin of plugins) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n invariant(providerField, `Plugin ${plugin.name} does not have a provider field`);\n const provider = (providerField.value as LiteralExpr).value as string;\n let useProvider = provider;\n if (useProvider.startsWith('@core/')) {\n useProvider = `@zenstackhq/runtime/plugins/${useProvider.slice(6)}`;\n }\n const generator = (await import(useProvider)).default as CliGenerator;\n console.log('Running generator:', provider);\n await generator({ model, outputPath, tsSchemaFile });\n }\n}\n","import colors from 'colors';\nimport path from 'node:path';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = await getZenStackPackages(projectPath);\n if (!packages) {\n console.error('Unable to locate package.json. Are you in a valid project directory?');\n return;\n }\n\n console.log('Installed ZenStack Packages:');\n const versions = new Set<string>();\n for (const { pkg, version } of packages) {\n if (version) {\n versions.add(version);\n }\n console.log(` ${colors.green(pkg.padEnd(20))}\\t${version}`);\n }\n\n if (versions.size > 1) {\n console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.'));\n }\n}\n\nasync function getZenStackPackages(projectPath: string): Promise<Array<{ pkg: string; version: string | undefined }>> {\n let pkgJson: {\n dependencies: Record<string, unknown>;\n devDependencies: Record<string, unknown>;\n };\n const resolvedPath = path.resolve(projectPath);\n try {\n pkgJson = (\n await import(path.join(resolvedPath, 'package.json'), {\n with: { type: 'json' },\n })\n ).default;\n } catch {\n return [];\n }\n\n const packages = Array.from(\n new Set(\n [...Object.keys(pkgJson.dependencies ?? {}), ...Object.keys(pkgJson.devDependencies ?? {})].filter(\n (p) => p.startsWith('@zenstackhq/') || p === 'zenstack',\n ),\n ),\n ).sort();\n\n const result = await Promise.all(\n packages.map(async (pkg) => {\n try {\n const depPkgJson = (\n await import(`${pkg}/package.json`, {\n with: { type: 'json' },\n })\n ).default;\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result;\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport ora from 'ora';\nimport { detect, resolveCommand } from 'package-manager-detector';\nimport { CliError } from '../cli-error';\nimport { execSync } from '../utils/exec-utils';\nimport { STARTER_ZMODEL } from './templates';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = [\n { name: '@zenstackhq/cli@next', dev: true },\n { name: '@zenstackhq/runtime@next', dev: false },\n ];\n let pm = await detect();\n if (!pm) {\n pm = { agent: 'npm', name: 'npm' };\n }\n\n console.log(colors.gray(`Using package manager: ${pm.agent}`));\n\n for (const pkg of packages) {\n const resolved = resolveCommand(pm.agent, 'install', [\n pkg.name,\n ...(pkg.dev ? [pm.agent === 'yarn' ? '--dev' : '--save-dev'] : []),\n ]);\n if (!resolved) {\n throw new CliError(`Unable to determine how to install package \"${pkg.name}\". Please install it manually.`);\n }\n\n const spinner = ora(`Installing \"${pkg.name}\"`).start();\n try {\n execSync(`${resolved.command} ${resolved.args.join(' ')}`, {\n cwd: projectPath,\n });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n }\n\n const generationFolder = 'zenstack';\n\n if (!fs.existsSync(path.join(projectPath, generationFolder))) {\n fs.mkdirSync(path.join(projectPath, generationFolder));\n }\n\n if (!fs.existsSync(path.join(projectPath, generationFolder, 'schema.zmodel'))) {\n fs.writeFileSync(path.join(projectPath, generationFolder, 'schema.zmodel'), STARTER_ZMODEL);\n } else {\n console.log(colors.yellow('Schema file already exists. Skipping generation of sample.'));\n }\n\n console.log(colors.green('ZenStack project initialized successfully!'));\n console.log(colors.gray(`See \"${generationFolder}/schema.zmodel\" for your database schema.`));\n console.log(colors.gray('Run `zenstack generate` to compile the the schema into a TypeScript file.'));\n}\n","export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from './zenstack/schema';\nimport SQLite from 'better-sqlite3';\n\nasync function main() {\n const client = new ZenStackClient(schema, {\n dialectConfig: {\n database: new SQLite('./zenstack/dev.db'),\n },\n });\n const user = await client.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile } from './action-utils';\n\ntype CommonOptions = {\n schema?: string;\n migrations?: string;\n};\n\ntype DevOptions = CommonOptions & {\n name?: string;\n createOnly?: boolean;\n};\n\ntype ResetOptions = CommonOptions & {\n force?: boolean;\n};\n\ntype DeployOptions = CommonOptions;\n\ntype StatusOptions = CommonOptions;\n\n/**\n * CLI action for migration-related commands\n */\nexport async function run(command: string, options: CommonOptions) {\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaDir = options.migrations ? path.dirname(options.migrations) : undefined;\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);\n\n try {\n switch (command) {\n case 'dev':\n await runDev(prismaSchemaFile, options as DevOptions);\n break;\n\n case 'reset':\n await runReset(prismaSchemaFile, options as ResetOptions);\n break;\n\n case 'deploy':\n await runDeploy(prismaSchemaFile, options as DeployOptions);\n break;\n\n case 'status':\n await runStatus(prismaSchemaFile, options as StatusOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nasync function runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'prisma migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n options.name ? ` --name ${options.name}` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = ['prisma migrate reset', ` --schema \"${prismaSchemaFile}\"`, options.force ? ' --force' : ''].join(\n '',\n );\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['prisma migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n await execPackage(`prisma migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getVersion() {\n try {\n // isomorphic __dirname\n const _dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n return JSON.parse(fs.readFileSync(path.join(_dirname, '../package.json'), 'utf8')).version;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["import_language","import_colors","import_node_fs","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","loadSchemaDocument","schemaFile","loadResult","loadDocument","success","console","error","colors","red","errors","forEach","err","model","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","folder","prismaSchema","PrismaSchemaGenerator","generate","path","dirname","prismaSchemaFile","resolve","writeFileSync","startPath","result","undefined","output","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","names","multiple","some","name","target","find","join","push","up","length","run","command","options","runPush","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPackage","err","handleSubProcessError","fs","existsSync","unlinkSync","import_sdk","import_colors","import_node_fs","import_node_path","run","options","schemaFile","getSchemaFile","schema","model","loadSchemaDocument","outputPath","getOutputPath","tsSchemaFile","path","join","TsSchemaGenerator","generate","runPlugins","savePrismaSchema","prismaSchema","PrismaSchemaGenerator","prismaSchemaFile","resolve","fs","mkdirSync","dirname","recursive","writeFileSync","silent","console","log","colors","green","output","pkgJsonConfig","getPkgJsonConfig","process","cwd","plugins","declarations","filter","isPlugin","plugin","providerField","fields","find","f","name","invariant","provider","value","useProvider","startsWith","slice","generator","default","import_colors","import_node_path","run","projectPath","packages","getZenStackPackages","console","error","log","versions","Set","pkg","version","add","colors","green","padEnd","size","warn","yellow","pkgJson","resolvedPath","path","resolve","join","with","type","default","Array","from","Object","keys","dependencies","devDependencies","filter","p","startsWith","sort","result","Promise","all","map","depPkgJson","undefined","import_colors","import_node_fs","import_node_path","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","CliError","spinner","ora","start","execSync","command","args","join","cwd","succeed","e","fail","generationFolder","fs","existsSync","path","mkdirSync","writeFileSync","STARTER_ZMODEL","yellow","green","import_node_fs","import_node_path","run","command","options","schemaFile","getSchemaFile","schema","prismaSchemaDir","migrations","path","dirname","undefined","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPackage","err","handleSubProcessError","force","_options","Error","status","process","exit","import_node_fs","import_node_path","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","url","JSON","parse","fs","readFileSync","join","version","undefined","generateAction","options","generate","migrateAction","command","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","createProgram","program","Command","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","addOption","action","migrateCommand","migrationsOption","dbCommand","argument","parse","process","argv"]}
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,6 @@ function execPackage(cmd, options) {
|
|
|
32
32
|
__name(execPackage, "execPackage");
|
|
33
33
|
|
|
34
34
|
// src/actions/action-utils.ts
|
|
35
|
-
import { findUp } from "@zenstackhq/common-helpers";
|
|
36
35
|
import { loadDocument } from "@zenstackhq/language";
|
|
37
36
|
import { PrismaSchemaGenerator } from "@zenstackhq/sdk";
|
|
38
37
|
import colors from "colors";
|
|
@@ -90,10 +89,13 @@ function handleSubProcessError(err) {
|
|
|
90
89
|
}
|
|
91
90
|
}
|
|
92
91
|
__name(handleSubProcessError, "handleSubProcessError");
|
|
93
|
-
async function generateTempPrismaSchema(zmodelPath) {
|
|
92
|
+
async function generateTempPrismaSchema(zmodelPath, folder) {
|
|
94
93
|
const model = await loadSchemaDocument(zmodelPath);
|
|
95
94
|
const prismaSchema = await new PrismaSchemaGenerator(model).generate();
|
|
96
|
-
|
|
95
|
+
if (!folder) {
|
|
96
|
+
folder = path.dirname(zmodelPath);
|
|
97
|
+
}
|
|
98
|
+
const prismaSchemaFile = path.resolve(folder, "~schema.prisma");
|
|
97
99
|
fs.writeFileSync(prismaSchemaFile, prismaSchema);
|
|
98
100
|
return prismaSchemaFile;
|
|
99
101
|
}
|
|
@@ -122,6 +124,24 @@ function getPkgJsonConfig(startPath) {
|
|
|
122
124
|
return result;
|
|
123
125
|
}
|
|
124
126
|
__name(getPkgJsonConfig, "getPkgJsonConfig");
|
|
127
|
+
function findUp(names, cwd = process.cwd(), multiple = false, result = []) {
|
|
128
|
+
if (!names.some((name) => !!name)) {
|
|
129
|
+
return void 0;
|
|
130
|
+
}
|
|
131
|
+
const target = names.find((name) => fs.existsSync(path.join(cwd, name)));
|
|
132
|
+
if (multiple === false && target) {
|
|
133
|
+
return path.join(cwd, target);
|
|
134
|
+
}
|
|
135
|
+
if (target) {
|
|
136
|
+
result.push(path.join(cwd, target));
|
|
137
|
+
}
|
|
138
|
+
const up = path.resolve(cwd, "..");
|
|
139
|
+
if (up === cwd) {
|
|
140
|
+
return multiple && result.length > 0 ? result : void 0;
|
|
141
|
+
}
|
|
142
|
+
return findUp(names, up, multiple, result);
|
|
143
|
+
}
|
|
144
|
+
__name(findUp, "findUp");
|
|
125
145
|
|
|
126
146
|
// src/actions/db.ts
|
|
127
147
|
async function run(command, options) {
|
|
@@ -168,7 +188,7 @@ async function run2(options) {
|
|
|
168
188
|
const model = await loadSchemaDocument(schemaFile);
|
|
169
189
|
const outputPath = getOutputPath(options, schemaFile);
|
|
170
190
|
const tsSchemaFile = path2.join(outputPath, "schema.ts");
|
|
171
|
-
await new TsSchemaGenerator().generate(schemaFile, [],
|
|
191
|
+
await new TsSchemaGenerator().generate(schemaFile, [], outputPath);
|
|
172
192
|
await runPlugins(model, outputPath, tsSchemaFile);
|
|
173
193
|
if (options.savePrismaSchema) {
|
|
174
194
|
const prismaSchema = await new PrismaSchemaGenerator2(model).generate();
|
|
@@ -384,9 +404,11 @@ __name(run4, "run");
|
|
|
384
404
|
|
|
385
405
|
// src/actions/migrate.ts
|
|
386
406
|
import fs5 from "fs";
|
|
407
|
+
import path5 from "path";
|
|
387
408
|
async function run5(command, options) {
|
|
388
409
|
const schemaFile = getSchemaFile(options.schema);
|
|
389
|
-
const
|
|
410
|
+
const prismaSchemaDir = options.migrations ? path5.dirname(options.migrations) : void 0;
|
|
411
|
+
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);
|
|
390
412
|
try {
|
|
391
413
|
switch (command) {
|
|
392
414
|
case "dev":
|
|
@@ -468,12 +490,12 @@ __name(handleSubProcessError2, "handleSubProcessError");
|
|
|
468
490
|
|
|
469
491
|
// src/utils/version-utils.ts
|
|
470
492
|
import fs6 from "fs";
|
|
471
|
-
import
|
|
493
|
+
import path6 from "path";
|
|
472
494
|
import { fileURLToPath } from "url";
|
|
473
495
|
function getVersion() {
|
|
474
496
|
try {
|
|
475
|
-
const _dirname = typeof __dirname !== "undefined" ? __dirname :
|
|
476
|
-
return JSON.parse(fs6.readFileSync(
|
|
497
|
+
const _dirname = typeof __dirname !== "undefined" ? __dirname : path6.dirname(fileURLToPath(import.meta.url));
|
|
498
|
+
return JSON.parse(fs6.readFileSync(path6.join(_dirname, "../package.json"), "utf8")).version;
|
|
477
499
|
} catch {
|
|
478
500
|
return void 0;
|
|
479
501
|
}
|
|
@@ -506,10 +528,11 @@ Documentation: https://zenstack.dev.`).showHelpAfterError().showSuggestionAfterE
|
|
|
506
528
|
const schemaOption = new Option("--schema <file>", `schema file (with extension ${schemaExtensions}). Defaults to "schema.zmodel" unless specified in package.json.`);
|
|
507
529
|
program2.command("generate").description("Run code generation.").addOption(schemaOption).addOption(new Option("--silent", "do not print any output")).addOption(new Option("--save-prisma-schema [path]", "save a Prisma schema file, by default into the output directory")).addOption(new Option("-o, --output <path>", "default output directory for core plugins")).action(generateAction);
|
|
508
530
|
const migrateCommand = program2.command("migrate").description("Update the database schema with migrations.");
|
|
509
|
-
|
|
510
|
-
migrateCommand.command("
|
|
511
|
-
migrateCommand.command("
|
|
512
|
-
migrateCommand.command("
|
|
531
|
+
const migrationsOption = new Option("--migrations <path>", "path for migrations");
|
|
532
|
+
migrateCommand.command("dev").addOption(schemaOption).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));
|
|
533
|
+
migrateCommand.command("reset").addOption(schemaOption).addOption(new Option("--force", "skip the confirmation prompt")).addOption(migrationsOption).description("Reset your database and apply all migrations, all data will be lost.").action((options) => migrateAction("reset", options));
|
|
534
|
+
migrateCommand.command("deploy").addOption(schemaOption).addOption(migrationsOption).description("Deploy your pending migrations to your production/staging database.").action((options) => migrateAction("deploy", options));
|
|
535
|
+
migrateCommand.command("status").addOption(schemaOption).addOption(migrationsOption).description("check the status of your database migrations.").action((options) => migrateAction("status", options));
|
|
513
536
|
const dbCommand = program2.command("db").description("Manage your database schema during development.");
|
|
514
537
|
dbCommand.command("push").description("Push the state from your schema to your database").addOption(schemaOption).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));
|
|
515
538
|
program2.command("info").description("Get information of installed ZenStack and related packages.").argument("[path]", "project path", ".").action(infoAction);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/generate.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/utils/version-utils.ts"],"sourcesContent":["import { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport * as actions from './actions';\nimport { getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await actions.generate(options);\n};\n\nconst migrateAction = async (command: string, options: any): Promise<void> => {\n await actions.migrate(command, options);\n};\n\nconst dbAction = async (command: string, options: any): Promise<void> => {\n await actions.db(command, options);\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await actions.info(projectPath);\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await actions.init(projectPath);\n};\n\nexport function createProgram() {\n const program = new Command('zenstack');\n\n program.version(getVersion()!, '-v --version', 'display CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is a Prisma power pack for building full-stack apps.\\n\\nDocumentation: https://zenstack.dev.`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"schema.zmodel\" unless specified in package.json.`,\n );\n\n program\n .command('generate')\n .description('Run code generation.')\n .addOption(schemaOption)\n .addOption(new Option('--silent', 'do not print any output'))\n .addOption(\n new Option(\n '--save-prisma-schema [path]',\n 'save a Prisma schema file, by default into the output directory',\n ),\n )\n .addOption(new Option('-o, --output <path>', 'default output directory for core plugins'))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Update the database schema with migrations.');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(new Option('-n, --name <name>', 'migration name'))\n .addOption(new Option('--create-only', 'only create migration, do not apply'))\n .description('Create a migration from changes in schema and apply it to the database.')\n .action((options) => migrateAction('dev', options));\n\n migrateCommand\n .command('reset')\n .addOption(schemaOption)\n .addOption(new Option('--force', 'skip the confirmation prompt'))\n .description('Reset your database and apply all migrations, all data will be lost.')\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .description('Deploy your pending migrations to your production/staging database.')\n .action((options) => migrateAction('deploy', options));\n\n migrateCommand\n .command('status')\n .addOption(schemaOption)\n .description('check the status of your database migrations.')\n .action((options) => migrateAction('status', options));\n\n const dbCommand = program.command('db').description('Manage your database schema during development.');\n\n dbCommand\n .command('push')\n .description('Push the state from your schema to your database')\n .addOption(schemaOption)\n .addOption(new Option('--accept-data-loss', 'ignore data loss warnings'))\n .addOption(new Option('--force-reset', 'force a reset of the database before push'))\n .action((options) => dbAction('push', options));\n\n program\n .command('info')\n .description('Get information of installed ZenStack and related packages.')\n .argument('[path]', 'project path', '.')\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack.')\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n return program;\n}\n\nconst program = createProgram();\nprogram.parse(process.argv);\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, handleSubProcessError } from './action-utils';\n\ntype Options = {\n schema?: string;\n acceptDataLoss?: boolean;\n forceReset?: boolean;\n};\n\n/**\n * CLI action for db related commands\n */\nexport async function run(command: string, options: Options) {\n switch (command) {\n case 'push':\n await runPush(options);\n break;\n }\n}\n\nasync function runPush(options: Options) {\n // generate a temp prisma schema file\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n 'prisma db push',\n ` --schema \"${prismaSchemaFile}\"`,\n options.acceptDataLoss ? ' --accept-data-loss' : '',\n options.forceReset ? ' --force-reset' : '',\n ' --skip-generate',\n ].join('');\n\n try {\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n","import { execSync as _exec, type ExecSyncOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }): void {\n const { env, ...restOptions } = options ?? {};\n const mergedEnv = env ? { ...process.env, ...env } : undefined;\n _exec(cmd, {\n encoding: 'utf-8',\n stdio: options?.stdio ?? 'inherit',\n env: mergedEnv,\n ...restOptions,\n });\n}\n\n/**\n * Utility for running package commands through npx/bunx\n */\nexport function execPackage(\n cmd: string,\n options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> },\n): void {\n const packageManager = process?.versions?.['bun'] ? 'bunx' : 'npx';\n execSync(`${packageManager} ${cmd}`, options);\n}\n","import { findUp } from '@zenstackhq/common-helpers';\nimport { loadDocument } from '@zenstackhq/language';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from '../cli-error';\n\nexport function getSchemaFile(file?: string) {\n if (file) {\n if (!fs.existsSync(file)) {\n throw new CliError(`Schema file not found: ${file}`);\n }\n return file;\n }\n\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.schema) {\n if (!fs.existsSync(pkgJsonConfig.schema)) {\n throw new CliError(`Schema file not found: ${pkgJsonConfig.schema}`);\n }\n return pkgJsonConfig.schema;\n }\n\n if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./zenstack/schema.zmodel\" or \"./schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(schemaFile: string) {\n const loadResult = await loadDocument(schemaFile);\n if (!loadResult.success) {\n console.error(colors.red('Error loading schema:'));\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Failed to load schema');\n }\n return loadResult.model;\n}\n\nexport function handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n\nexport async function generateTempPrismaSchema(zmodelPath: string) {\n const model = await loadSchemaDocument(zmodelPath);\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n const prismaSchemaFile = path.resolve(path.dirname(zmodelPath), '~schema.prisma');\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n return prismaSchemaFile;\n}\n\nexport function getPkgJsonConfig(startPath: string) {\n const result: { schema: string | undefined; output: string | undefined } = { schema: undefined, output: undefined };\n const pkgJsonFile = findUp(['package.json'], startPath, false);\n\n if (!pkgJsonFile) {\n return result;\n }\n\n let pkgJson: any = undefined;\n try {\n pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile, 'utf8'));\n } catch {\n return result;\n }\n\n if (pkgJson.zenstack && typeof pkgJson.zenstack === 'object') {\n result.schema = pkgJson.zenstack.schema && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema);\n result.output = pkgJson.zenstack.output && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output);\n }\n\n return result;\n}\n","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { isPlugin, LiteralExpr, type Model } from '@zenstackhq/language/ast';\nimport { PrismaSchemaGenerator, TsSchemaGenerator, type CliGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { getPkgJsonConfig, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent?: boolean;\n savePrismaSchema?: string | boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n // generate TS schema\n const tsSchemaFile = path.join(outputPath, 'schema.ts');\n await new TsSchemaGenerator().generate(schemaFile, [], tsSchemaFile);\n\n await runPlugins(model, outputPath, tsSchemaFile);\n\n // generate Prisma schema\n if (options.savePrismaSchema) {\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n let prismaSchemaFile = path.join(outputPath, 'schema.prisma');\n if (typeof options.savePrismaSchema === 'string') {\n prismaSchemaFile = path.resolve(outputPath, options.savePrismaSchema);\n fs.mkdirSync(path.dirname(prismaSchemaFile), { recursive: true });\n }\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n }\n\n if (!options.silent) {\n console.log(colors.green('Generation completed successfully.'));\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from '${outputPath}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialectConfig: { ... }\n});\n\\`\\`\\`\n`);\n }\n}\n\nfunction getOutputPath(options: Options, schemaFile: string) {\n if (options.output) {\n return options.output;\n }\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.output) {\n return pkgJsonConfig.output;\n } else {\n return path.dirname(schemaFile);\n }\n}\n\nasync function runPlugins(model: Model, outputPath: string, tsSchemaFile: string) {\n const plugins = model.declarations.filter(isPlugin);\n for (const plugin of plugins) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n invariant(providerField, `Plugin ${plugin.name} does not have a provider field`);\n const provider = (providerField.value as LiteralExpr).value as string;\n let useProvider = provider;\n if (useProvider.startsWith('@core/')) {\n useProvider = `@zenstackhq/runtime/plugins/${useProvider.slice(6)}`;\n }\n const generator = (await import(useProvider)).default as CliGenerator;\n console.log('Running generator:', provider);\n await generator({ model, outputPath, tsSchemaFile });\n }\n}\n","import colors from 'colors';\nimport path from 'node:path';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = await getZenStackPackages(projectPath);\n if (!packages) {\n console.error('Unable to locate package.json. Are you in a valid project directory?');\n return;\n }\n\n console.log('Installed ZenStack Packages:');\n const versions = new Set<string>();\n for (const { pkg, version } of packages) {\n if (version) {\n versions.add(version);\n }\n console.log(` ${colors.green(pkg.padEnd(20))}\\t${version}`);\n }\n\n if (versions.size > 1) {\n console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.'));\n }\n}\n\nasync function getZenStackPackages(projectPath: string): Promise<Array<{ pkg: string; version: string | undefined }>> {\n let pkgJson: {\n dependencies: Record<string, unknown>;\n devDependencies: Record<string, unknown>;\n };\n const resolvedPath = path.resolve(projectPath);\n try {\n pkgJson = (\n await import(path.join(resolvedPath, 'package.json'), {\n with: { type: 'json' },\n })\n ).default;\n } catch {\n return [];\n }\n\n const packages = Array.from(\n new Set(\n [...Object.keys(pkgJson.dependencies ?? {}), ...Object.keys(pkgJson.devDependencies ?? {})].filter(\n (p) => p.startsWith('@zenstackhq/') || p === 'zenstack',\n ),\n ),\n ).sort();\n\n const result = await Promise.all(\n packages.map(async (pkg) => {\n try {\n const depPkgJson = (\n await import(`${pkg}/package.json`, {\n with: { type: 'json' },\n })\n ).default;\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result;\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport ora from 'ora';\nimport { detect, resolveCommand } from 'package-manager-detector';\nimport { CliError } from '../cli-error';\nimport { execSync } from '../utils/exec-utils';\nimport { STARTER_ZMODEL } from './templates';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = [\n { name: '@zenstackhq/cli@next', dev: true },\n { name: '@zenstackhq/runtime@next', dev: false },\n ];\n let pm = await detect();\n if (!pm) {\n pm = { agent: 'npm', name: 'npm' };\n }\n\n console.log(colors.gray(`Using package manager: ${pm.agent}`));\n\n for (const pkg of packages) {\n const resolved = resolveCommand(pm.agent, 'install', [\n pkg.name,\n ...(pkg.dev ? [pm.agent === 'yarn' ? '--dev' : '--save-dev'] : []),\n ]);\n if (!resolved) {\n throw new CliError(`Unable to determine how to install package \"${pkg.name}\". Please install it manually.`);\n }\n\n const spinner = ora(`Installing \"${pkg.name}\"`).start();\n try {\n execSync(`${resolved.command} ${resolved.args.join(' ')}`, {\n cwd: projectPath,\n });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n }\n\n const generationFolder = 'zenstack';\n\n if (!fs.existsSync(path.join(projectPath, generationFolder))) {\n fs.mkdirSync(path.join(projectPath, generationFolder));\n }\n\n if (!fs.existsSync(path.join(projectPath, generationFolder, 'schema.zmodel'))) {\n fs.writeFileSync(path.join(projectPath, generationFolder, 'schema.zmodel'), STARTER_ZMODEL);\n } else {\n console.log(colors.yellow('Schema file already exists. Skipping generation of sample.'));\n }\n\n console.log(colors.green('ZenStack project initialized successfully!'));\n console.log(colors.gray(`See \"${generationFolder}/schema.zmodel\" for your database schema.`));\n console.log(colors.gray('Run `zenstack generate` to compile the the schema into a TypeScript file.'));\n}\n","export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from './zenstack/schema';\nimport SQLite from 'better-sqlite3';\n\nasync function main() {\n const client = new ZenStackClient(schema, {\n dialectConfig: {\n database: new SQLite('./zenstack/dev.db'),\n },\n });\n const user = await client.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile } from './action-utils';\n\ntype CommonOptions = {\n schema?: string;\n};\n\ntype DevOptions = CommonOptions & {\n name?: string;\n createOnly?: boolean;\n};\n\ntype ResetOptions = CommonOptions & {\n force?: boolean;\n};\n\ntype DeployOptions = CommonOptions;\n\ntype StatusOptions = CommonOptions;\n\n/**\n * CLI action for migration-related commands\n */\nexport async function run(command: string, options: CommonOptions) {\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n switch (command) {\n case 'dev':\n await runDev(prismaSchemaFile, options as DevOptions);\n break;\n\n case 'reset':\n await runReset(prismaSchemaFile, options as ResetOptions);\n break;\n\n case 'deploy':\n await runDeploy(prismaSchemaFile, options as DeployOptions);\n break;\n\n case 'status':\n await runStatus(prismaSchemaFile, options as StatusOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nasync function runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'prisma migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n options.name ? ` --name ${options.name}` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = ['prisma migrate reset', ` --schema \"${prismaSchemaFile}\"`, options.force ? ' --force' : ''].join(\n '',\n );\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['prisma migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n await execPackage(`prisma migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getVersion() {\n try {\n // isomorphic __dirname\n const _dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n return JSON.parse(fs.readFileSync(path.join(_dirname, '../package.json'), 'utf8')).version;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["ZModelLanguageMetaData","colors","Command","Option","fs","execSync","_exec","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","findUp","loadDocument","PrismaSchemaGenerator","colors","fs","path","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","loadSchemaDocument","schemaFile","loadResult","loadDocument","success","console","error","colors","red","errors","forEach","err","model","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","prismaSchema","PrismaSchemaGenerator","generate","prismaSchemaFile","path","resolve","dirname","writeFileSync","startPath","result","undefined","output","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","run","command","options","runPush","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPackage","err","handleSubProcessError","fs","existsSync","unlinkSync","invariant","isPlugin","PrismaSchemaGenerator","TsSchemaGenerator","colors","fs","path","run","options","schemaFile","getSchemaFile","schema","model","loadSchemaDocument","outputPath","getOutputPath","tsSchemaFile","path","join","TsSchemaGenerator","generate","runPlugins","savePrismaSchema","prismaSchema","PrismaSchemaGenerator","prismaSchemaFile","resolve","fs","mkdirSync","dirname","recursive","writeFileSync","silent","console","log","colors","green","output","pkgJsonConfig","getPkgJsonConfig","process","cwd","plugins","declarations","filter","isPlugin","plugin","providerField","fields","find","f","name","invariant","provider","value","useProvider","startsWith","slice","generator","default","colors","path","run","projectPath","packages","getZenStackPackages","console","error","log","versions","Set","pkg","version","add","colors","green","padEnd","size","warn","yellow","pkgJson","resolvedPath","path","resolve","join","with","type","default","Array","from","Object","keys","dependencies","devDependencies","filter","p","startsWith","sort","result","Promise","all","map","depPkgJson","undefined","colors","fs","path","ora","detect","resolveCommand","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","CliError","spinner","ora","start","execSync","command","args","join","cwd","succeed","e","fail","generationFolder","fs","existsSync","path","mkdirSync","writeFileSync","STARTER_ZMODEL","yellow","green","fs","run","command","options","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPackage","err","handleSubProcessError","force","_options","Error","status","process","exit","fs","path","fileURLToPath","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","url","JSON","parse","fs","readFileSync","join","version","undefined","generateAction","options","generate","migrateAction","command","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","createProgram","program","Command","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","addOption","action","migrateCommand","dbCommand","argument","parse","process","argv"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/generate.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/utils/version-utils.ts"],"sourcesContent":["import { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport * as actions from './actions';\nimport { getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await actions.generate(options);\n};\n\nconst migrateAction = async (command: string, options: any): Promise<void> => {\n await actions.migrate(command, options);\n};\n\nconst dbAction = async (command: string, options: any): Promise<void> => {\n await actions.db(command, options);\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await actions.info(projectPath);\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await actions.init(projectPath);\n};\n\nexport function createProgram() {\n const program = new Command('zenstack');\n\n program.version(getVersion()!, '-v --version', 'display CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is a Prisma power pack for building full-stack apps.\\n\\nDocumentation: https://zenstack.dev.`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"schema.zmodel\" unless specified in package.json.`,\n );\n\n program\n .command('generate')\n .description('Run code generation.')\n .addOption(schemaOption)\n .addOption(new Option('--silent', 'do not print any output'))\n .addOption(\n new Option(\n '--save-prisma-schema [path]',\n 'save a Prisma schema file, by default into the output directory',\n ),\n )\n .addOption(new Option('-o, --output <path>', 'default output directory for core plugins'))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Update the database schema with migrations.');\n const migrationsOption = new Option('--migrations <path>', 'path for migrations');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(new Option('-n, --name <name>', 'migration name'))\n .addOption(new Option('--create-only', 'only create migration, do not apply'))\n .addOption(migrationsOption)\n .description('Create a migration from changes in schema and apply it to the database.')\n .action((options) => migrateAction('dev', options));\n\n migrateCommand\n .command('reset')\n .addOption(schemaOption)\n .addOption(new Option('--force', 'skip the confirmation prompt'))\n .addOption(migrationsOption)\n .description('Reset your database and apply all migrations, all data will be lost.')\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .addOption(migrationsOption)\n .description('Deploy your pending migrations to your production/staging database.')\n .action((options) => migrateAction('deploy', options));\n\n migrateCommand\n .command('status')\n .addOption(schemaOption)\n .addOption(migrationsOption)\n .description('check the status of your database migrations.')\n .action((options) => migrateAction('status', options));\n\n const dbCommand = program.command('db').description('Manage your database schema during development.');\n\n dbCommand\n .command('push')\n .description('Push the state from your schema to your database')\n .addOption(schemaOption)\n .addOption(new Option('--accept-data-loss', 'ignore data loss warnings'))\n .addOption(new Option('--force-reset', 'force a reset of the database before push'))\n .action((options) => dbAction('push', options));\n\n program\n .command('info')\n .description('Get information of installed ZenStack and related packages.')\n .argument('[path]', 'project path', '.')\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack.')\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n return program;\n}\n\nconst program = createProgram();\nprogram.parse(process.argv);\n","import fs from 'node:fs';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, handleSubProcessError } from './action-utils';\n\ntype Options = {\n schema?: string;\n acceptDataLoss?: boolean;\n forceReset?: boolean;\n};\n\n/**\n * CLI action for db related commands\n */\nexport async function run(command: string, options: Options) {\n switch (command) {\n case 'push':\n await runPush(options);\n break;\n }\n}\n\nasync function runPush(options: Options) {\n // generate a temp prisma schema file\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n 'prisma db push',\n ` --schema \"${prismaSchemaFile}\"`,\n options.acceptDataLoss ? ' --accept-data-loss' : '',\n options.forceReset ? ' --force-reset' : '',\n ' --skip-generate',\n ].join('');\n\n try {\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n","import { execSync as _exec, type ExecSyncOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }): void {\n const { env, ...restOptions } = options ?? {};\n const mergedEnv = env ? { ...process.env, ...env } : undefined;\n _exec(cmd, {\n encoding: 'utf-8',\n stdio: options?.stdio ?? 'inherit',\n env: mergedEnv,\n ...restOptions,\n });\n}\n\n/**\n * Utility for running package commands through npx/bunx\n */\nexport function execPackage(\n cmd: string,\n options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> },\n): void {\n const packageManager = process?.versions?.['bun'] ? 'bunx' : 'npx';\n execSync(`${packageManager} ${cmd}`, options);\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from '../cli-error';\n\nexport function getSchemaFile(file?: string) {\n if (file) {\n if (!fs.existsSync(file)) {\n throw new CliError(`Schema file not found: ${file}`);\n }\n return file;\n }\n\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.schema) {\n if (!fs.existsSync(pkgJsonConfig.schema)) {\n throw new CliError(`Schema file not found: ${pkgJsonConfig.schema}`);\n }\n return pkgJsonConfig.schema;\n }\n\n if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./zenstack/schema.zmodel\" or \"./schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(schemaFile: string) {\n const loadResult = await loadDocument(schemaFile);\n if (!loadResult.success) {\n console.error(colors.red('Error loading schema:'));\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Failed to load schema');\n }\n return loadResult.model;\n}\n\nexport function handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n\nexport async function generateTempPrismaSchema(zmodelPath: string, folder?: string) {\n const model = await loadSchemaDocument(zmodelPath);\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n if (!folder) {\n folder = path.dirname(zmodelPath);\n }\n const prismaSchemaFile = path.resolve(folder, '~schema.prisma');\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n return prismaSchemaFile;\n}\n\nexport function getPkgJsonConfig(startPath: string) {\n const result: { schema: string | undefined; output: string | undefined } = { schema: undefined, output: undefined };\n const pkgJsonFile = findUp(['package.json'], startPath, false);\n\n if (!pkgJsonFile) {\n return result;\n }\n\n let pkgJson: any = undefined;\n try {\n pkgJson = JSON.parse(fs.readFileSync(pkgJsonFile, 'utf8'));\n } catch {\n return result;\n }\n\n if (pkgJson.zenstack && typeof pkgJson.zenstack === 'object') {\n result.schema = pkgJson.zenstack.schema && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema);\n result.output = pkgJson.zenstack.output && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output);\n }\n\n return result;\n}\n\ntype FindUpResult<Multiple extends boolean> = Multiple extends true ? string[] | undefined : string | undefined;\n\nfunction findUp<Multiple extends boolean = false>(\n names: string[],\n cwd: string = process.cwd(),\n multiple: Multiple = false as Multiple,\n result: string[] = [],\n): FindUpResult<Multiple> {\n if (!names.some((name) => !!name)) {\n return undefined;\n }\n const target = names.find((name) => fs.existsSync(path.join(cwd, name)));\n if (multiple === false && target) {\n return path.join(cwd, target) as FindUpResult<Multiple>;\n }\n if (target) {\n result.push(path.join(cwd, target));\n }\n const up = path.resolve(cwd, '..');\n if (up === cwd) {\n return (multiple && result.length > 0 ? result : undefined) as FindUpResult<Multiple>;\n }\n return findUp(names, up, multiple, result);\n}\n","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { isPlugin, LiteralExpr, type Model } from '@zenstackhq/language/ast';\nimport { PrismaSchemaGenerator, TsSchemaGenerator, type CliGenerator } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { getPkgJsonConfig, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent?: boolean;\n savePrismaSchema?: string | boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n // generate TS schema\n const tsSchemaFile = path.join(outputPath, 'schema.ts');\n await new TsSchemaGenerator().generate(schemaFile, [], outputPath);\n\n await runPlugins(model, outputPath, tsSchemaFile);\n\n // generate Prisma schema\n if (options.savePrismaSchema) {\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n let prismaSchemaFile = path.join(outputPath, 'schema.prisma');\n if (typeof options.savePrismaSchema === 'string') {\n prismaSchemaFile = path.resolve(outputPath, options.savePrismaSchema);\n fs.mkdirSync(path.dirname(prismaSchemaFile), { recursive: true });\n }\n fs.writeFileSync(prismaSchemaFile, prismaSchema);\n }\n\n if (!options.silent) {\n console.log(colors.green('Generation completed successfully.'));\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from '${outputPath}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialectConfig: { ... }\n});\n\\`\\`\\`\n`);\n }\n}\n\nfunction getOutputPath(options: Options, schemaFile: string) {\n if (options.output) {\n return options.output;\n }\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (pkgJsonConfig.output) {\n return pkgJsonConfig.output;\n } else {\n return path.dirname(schemaFile);\n }\n}\n\nasync function runPlugins(model: Model, outputPath: string, tsSchemaFile: string) {\n const plugins = model.declarations.filter(isPlugin);\n for (const plugin of plugins) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n invariant(providerField, `Plugin ${plugin.name} does not have a provider field`);\n const provider = (providerField.value as LiteralExpr).value as string;\n let useProvider = provider;\n if (useProvider.startsWith('@core/')) {\n useProvider = `@zenstackhq/runtime/plugins/${useProvider.slice(6)}`;\n }\n const generator = (await import(useProvider)).default as CliGenerator;\n console.log('Running generator:', provider);\n await generator({ model, outputPath, tsSchemaFile });\n }\n}\n","import colors from 'colors';\nimport path from 'node:path';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = await getZenStackPackages(projectPath);\n if (!packages) {\n console.error('Unable to locate package.json. Are you in a valid project directory?');\n return;\n }\n\n console.log('Installed ZenStack Packages:');\n const versions = new Set<string>();\n for (const { pkg, version } of packages) {\n if (version) {\n versions.add(version);\n }\n console.log(` ${colors.green(pkg.padEnd(20))}\\t${version}`);\n }\n\n if (versions.size > 1) {\n console.warn(colors.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.'));\n }\n}\n\nasync function getZenStackPackages(projectPath: string): Promise<Array<{ pkg: string; version: string | undefined }>> {\n let pkgJson: {\n dependencies: Record<string, unknown>;\n devDependencies: Record<string, unknown>;\n };\n const resolvedPath = path.resolve(projectPath);\n try {\n pkgJson = (\n await import(path.join(resolvedPath, 'package.json'), {\n with: { type: 'json' },\n })\n ).default;\n } catch {\n return [];\n }\n\n const packages = Array.from(\n new Set(\n [...Object.keys(pkgJson.dependencies ?? {}), ...Object.keys(pkgJson.devDependencies ?? {})].filter(\n (p) => p.startsWith('@zenstackhq/') || p === 'zenstack',\n ),\n ),\n ).sort();\n\n const result = await Promise.all(\n packages.map(async (pkg) => {\n try {\n const depPkgJson = (\n await import(`${pkg}/package.json`, {\n with: { type: 'json' },\n })\n ).default;\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result;\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport ora from 'ora';\nimport { detect, resolveCommand } from 'package-manager-detector';\nimport { CliError } from '../cli-error';\nimport { execSync } from '../utils/exec-utils';\nimport { STARTER_ZMODEL } from './templates';\n\n/**\n * CLI action for getting information about installed ZenStack packages\n */\nexport async function run(projectPath: string) {\n const packages = [\n { name: '@zenstackhq/cli@next', dev: true },\n { name: '@zenstackhq/runtime@next', dev: false },\n ];\n let pm = await detect();\n if (!pm) {\n pm = { agent: 'npm', name: 'npm' };\n }\n\n console.log(colors.gray(`Using package manager: ${pm.agent}`));\n\n for (const pkg of packages) {\n const resolved = resolveCommand(pm.agent, 'install', [\n pkg.name,\n ...(pkg.dev ? [pm.agent === 'yarn' ? '--dev' : '--save-dev'] : []),\n ]);\n if (!resolved) {\n throw new CliError(`Unable to determine how to install package \"${pkg.name}\". Please install it manually.`);\n }\n\n const spinner = ora(`Installing \"${pkg.name}\"`).start();\n try {\n execSync(`${resolved.command} ${resolved.args.join(' ')}`, {\n cwd: projectPath,\n });\n spinner.succeed();\n } catch (e) {\n spinner.fail();\n throw e;\n }\n }\n\n const generationFolder = 'zenstack';\n\n if (!fs.existsSync(path.join(projectPath, generationFolder))) {\n fs.mkdirSync(path.join(projectPath, generationFolder));\n }\n\n if (!fs.existsSync(path.join(projectPath, generationFolder, 'schema.zmodel'))) {\n fs.writeFileSync(path.join(projectPath, generationFolder, 'schema.zmodel'), STARTER_ZMODEL);\n } else {\n console.log(colors.yellow('Schema file already exists. Skipping generation of sample.'));\n }\n\n console.log(colors.green('ZenStack project initialized successfully!'));\n console.log(colors.gray(`See \"${generationFolder}/schema.zmodel\" for your database schema.`));\n console.log(colors.gray('Run `zenstack generate` to compile the the schema into a TypeScript file.'));\n}\n","export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n provider = 'sqlite'\n url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n id String @id @default(cuid())\n email String @unique @email @length(6, 32)\n posts Post[]\n}\n\n/// Post model\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/runtime';\nimport { schema } from './zenstack/schema';\nimport SQLite from 'better-sqlite3';\n\nasync function main() {\n const client = new ZenStackClient(schema, {\n dialectConfig: {\n database: new SQLite('./zenstack/dev.db'),\n },\n });\n const user = await client.user.create({\n data: {\n email: 'test@zenstack.dev',\n posts: {\n create: [\n {\n title: 'Hello World',\n content: 'This is a test post',\n },\n ],\n },\n },\n include: { posts: true }\n });\n console.log('User created:', user);\n}\n\nmain();\n`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execPackage } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile } from './action-utils';\n\ntype CommonOptions = {\n schema?: string;\n migrations?: string;\n};\n\ntype DevOptions = CommonOptions & {\n name?: string;\n createOnly?: boolean;\n};\n\ntype ResetOptions = CommonOptions & {\n force?: boolean;\n};\n\ntype DeployOptions = CommonOptions;\n\ntype StatusOptions = CommonOptions;\n\n/**\n * CLI action for migration-related commands\n */\nexport async function run(command: string, options: CommonOptions) {\n const schemaFile = getSchemaFile(options.schema);\n const prismaSchemaDir = options.migrations ? path.dirname(options.migrations) : undefined;\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);\n\n try {\n switch (command) {\n case 'dev':\n await runDev(prismaSchemaFile, options as DevOptions);\n break;\n\n case 'reset':\n await runReset(prismaSchemaFile, options as ResetOptions);\n break;\n\n case 'deploy':\n await runDeploy(prismaSchemaFile, options as DeployOptions);\n break;\n\n case 'status':\n await runStatus(prismaSchemaFile, options as StatusOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nasync function runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'prisma migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n options.name ? ` --name ${options.name}` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = ['prisma migrate reset', ` --schema \"${prismaSchemaFile}\"`, options.force ? ' --force' : ''].join(\n '',\n );\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['prisma migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n\n await execPackage(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n await execPackage(`prisma migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction handleSubProcessError(err: unknown) {\n if (err instanceof Error && 'status' in err && typeof err.status === 'number') {\n process.exit(err.status);\n } else {\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getVersion() {\n try {\n // isomorphic __dirname\n const _dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n return JSON.parse(fs.readFileSync(path.join(_dirname, '../package.json'), 'utf8')).version;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["ZModelLanguageMetaData","colors","Command","Option","fs","execSync","_exec","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","loadDocument","PrismaSchemaGenerator","colors","fs","path","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","loadSchemaDocument","schemaFile","loadResult","loadDocument","success","console","error","colors","red","errors","forEach","err","model","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","folder","prismaSchema","PrismaSchemaGenerator","generate","path","dirname","prismaSchemaFile","resolve","writeFileSync","startPath","result","undefined","output","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","names","multiple","some","name","target","find","join","push","up","length","run","command","options","runPush","schemaFile","getSchemaFile","schema","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPackage","err","handleSubProcessError","fs","existsSync","unlinkSync","invariant","isPlugin","PrismaSchemaGenerator","TsSchemaGenerator","colors","fs","path","run","options","schemaFile","getSchemaFile","schema","model","loadSchemaDocument","outputPath","getOutputPath","tsSchemaFile","path","join","TsSchemaGenerator","generate","runPlugins","savePrismaSchema","prismaSchema","PrismaSchemaGenerator","prismaSchemaFile","resolve","fs","mkdirSync","dirname","recursive","writeFileSync","silent","console","log","colors","green","output","pkgJsonConfig","getPkgJsonConfig","process","cwd","plugins","declarations","filter","isPlugin","plugin","providerField","fields","find","f","name","invariant","provider","value","useProvider","startsWith","slice","generator","default","colors","path","run","projectPath","packages","getZenStackPackages","console","error","log","versions","Set","pkg","version","add","colors","green","padEnd","size","warn","yellow","pkgJson","resolvedPath","path","resolve","join","with","type","default","Array","from","Object","keys","dependencies","devDependencies","filter","p","startsWith","sort","result","Promise","all","map","depPkgJson","undefined","colors","fs","path","ora","detect","resolveCommand","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","CliError","spinner","ora","start","execSync","command","args","join","cwd","succeed","e","fail","generationFolder","fs","existsSync","path","mkdirSync","writeFileSync","STARTER_ZMODEL","yellow","green","fs","path","run","command","options","schemaFile","getSchemaFile","schema","prismaSchemaDir","migrations","path","dirname","undefined","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPackage","err","handleSubProcessError","force","_options","Error","status","process","exit","fs","path","fileURLToPath","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","url","JSON","parse","fs","readFileSync","join","version","undefined","generateAction","options","generate","migrateAction","command","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","createProgram","program","Command","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","addOption","action","migrateCommand","migrationsOption","dbCommand","argument","parse","process","argv"]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publisher": "zenstack",
|
|
4
4
|
"displayName": "ZenStack CLI",
|
|
5
5
|
"description": "FullStack database toolkit with built-in access control and automatic API generation.",
|
|
6
|
-
"version": "3.0.0-alpha.
|
|
6
|
+
"version": "3.0.0-alpha.12",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "ZenStack Team"
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"ora": "^5.4.1",
|
|
29
29
|
"package-manager-detector": "^1.3.0",
|
|
30
30
|
"ts-pattern": "^5.7.1",
|
|
31
|
-
"@zenstackhq/common-helpers": "3.0.0-alpha.
|
|
32
|
-
"@zenstackhq/
|
|
33
|
-
"@zenstackhq/
|
|
31
|
+
"@zenstackhq/common-helpers": "3.0.0-alpha.12",
|
|
32
|
+
"@zenstackhq/language": "3.0.0-alpha.12",
|
|
33
|
+
"@zenstackhq/sdk": "3.0.0-alpha.12"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"prisma": "^6.0.0"
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"@types/tmp": "^0.2.6",
|
|
41
41
|
"better-sqlite3": "^11.8.1",
|
|
42
42
|
"tmp": "^0.2.3",
|
|
43
|
-
"@zenstackhq/eslint-config": "3.0.0-alpha.
|
|
44
|
-
"@zenstackhq/runtime": "3.0.0-alpha.
|
|
45
|
-
"@zenstackhq/testtools": "3.0.0-alpha.
|
|
46
|
-
"@zenstackhq/typescript-config": "3.0.0-alpha.
|
|
43
|
+
"@zenstackhq/eslint-config": "3.0.0-alpha.12",
|
|
44
|
+
"@zenstackhq/runtime": "3.0.0-alpha.12",
|
|
45
|
+
"@zenstackhq/testtools": "3.0.0-alpha.12",
|
|
46
|
+
"@zenstackhq/typescript-config": "3.0.0-alpha.12"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "tsup-node",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { findUp } from '@zenstackhq/common-helpers';
|
|
2
1
|
import { loadDocument } from '@zenstackhq/language';
|
|
3
2
|
import { PrismaSchemaGenerator } from '@zenstackhq/sdk';
|
|
4
3
|
import colors from 'colors';
|
|
@@ -53,10 +52,13 @@ export function handleSubProcessError(err: unknown) {
|
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
export async function generateTempPrismaSchema(zmodelPath: string) {
|
|
55
|
+
export async function generateTempPrismaSchema(zmodelPath: string, folder?: string) {
|
|
57
56
|
const model = await loadSchemaDocument(zmodelPath);
|
|
58
57
|
const prismaSchema = await new PrismaSchemaGenerator(model).generate();
|
|
59
|
-
|
|
58
|
+
if (!folder) {
|
|
59
|
+
folder = path.dirname(zmodelPath);
|
|
60
|
+
}
|
|
61
|
+
const prismaSchemaFile = path.resolve(folder, '~schema.prisma');
|
|
60
62
|
fs.writeFileSync(prismaSchemaFile, prismaSchema);
|
|
61
63
|
return prismaSchemaFile;
|
|
62
64
|
}
|
|
@@ -83,3 +85,28 @@ export function getPkgJsonConfig(startPath: string) {
|
|
|
83
85
|
|
|
84
86
|
return result;
|
|
85
87
|
}
|
|
88
|
+
|
|
89
|
+
type FindUpResult<Multiple extends boolean> = Multiple extends true ? string[] | undefined : string | undefined;
|
|
90
|
+
|
|
91
|
+
function findUp<Multiple extends boolean = false>(
|
|
92
|
+
names: string[],
|
|
93
|
+
cwd: string = process.cwd(),
|
|
94
|
+
multiple: Multiple = false as Multiple,
|
|
95
|
+
result: string[] = [],
|
|
96
|
+
): FindUpResult<Multiple> {
|
|
97
|
+
if (!names.some((name) => !!name)) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const target = names.find((name) => fs.existsSync(path.join(cwd, name)));
|
|
101
|
+
if (multiple === false && target) {
|
|
102
|
+
return path.join(cwd, target) as FindUpResult<Multiple>;
|
|
103
|
+
}
|
|
104
|
+
if (target) {
|
|
105
|
+
result.push(path.join(cwd, target));
|
|
106
|
+
}
|
|
107
|
+
const up = path.resolve(cwd, '..');
|
|
108
|
+
if (up === cwd) {
|
|
109
|
+
return (multiple && result.length > 0 ? result : undefined) as FindUpResult<Multiple>;
|
|
110
|
+
}
|
|
111
|
+
return findUp(names, up, multiple, result);
|
|
112
|
+
}
|
package/src/actions/generate.ts
CHANGED
|
@@ -24,7 +24,7 @@ export async function run(options: Options) {
|
|
|
24
24
|
|
|
25
25
|
// generate TS schema
|
|
26
26
|
const tsSchemaFile = path.join(outputPath, 'schema.ts');
|
|
27
|
-
await new TsSchemaGenerator().generate(schemaFile, [],
|
|
27
|
+
await new TsSchemaGenerator().generate(schemaFile, [], outputPath);
|
|
28
28
|
|
|
29
29
|
await runPlugins(model, outputPath, tsSchemaFile);
|
|
30
30
|
|
package/src/actions/migrate.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import { execPackage } from '../utils/exec-utils';
|
|
3
4
|
import { generateTempPrismaSchema, getSchemaFile } from './action-utils';
|
|
4
5
|
|
|
5
6
|
type CommonOptions = {
|
|
6
7
|
schema?: string;
|
|
8
|
+
migrations?: string;
|
|
7
9
|
};
|
|
8
10
|
|
|
9
11
|
type DevOptions = CommonOptions & {
|
|
@@ -24,7 +26,8 @@ type StatusOptions = CommonOptions;
|
|
|
24
26
|
*/
|
|
25
27
|
export async function run(command: string, options: CommonOptions) {
|
|
26
28
|
const schemaFile = getSchemaFile(options.schema);
|
|
27
|
-
const
|
|
29
|
+
const prismaSchemaDir = options.migrations ? path.dirname(options.migrations) : undefined;
|
|
30
|
+
const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir);
|
|
28
31
|
|
|
29
32
|
try {
|
|
30
33
|
switch (command) {
|
package/src/index.ts
CHANGED
|
@@ -60,12 +60,14 @@ export function createProgram() {
|
|
|
60
60
|
.action(generateAction);
|
|
61
61
|
|
|
62
62
|
const migrateCommand = program.command('migrate').description('Update the database schema with migrations.');
|
|
63
|
+
const migrationsOption = new Option('--migrations <path>', 'path for migrations');
|
|
63
64
|
|
|
64
65
|
migrateCommand
|
|
65
66
|
.command('dev')
|
|
66
67
|
.addOption(schemaOption)
|
|
67
68
|
.addOption(new Option('-n, --name <name>', 'migration name'))
|
|
68
69
|
.addOption(new Option('--create-only', 'only create migration, do not apply'))
|
|
70
|
+
.addOption(migrationsOption)
|
|
69
71
|
.description('Create a migration from changes in schema and apply it to the database.')
|
|
70
72
|
.action((options) => migrateAction('dev', options));
|
|
71
73
|
|
|
@@ -73,18 +75,21 @@ export function createProgram() {
|
|
|
73
75
|
.command('reset')
|
|
74
76
|
.addOption(schemaOption)
|
|
75
77
|
.addOption(new Option('--force', 'skip the confirmation prompt'))
|
|
78
|
+
.addOption(migrationsOption)
|
|
76
79
|
.description('Reset your database and apply all migrations, all data will be lost.')
|
|
77
80
|
.action((options) => migrateAction('reset', options));
|
|
78
81
|
|
|
79
82
|
migrateCommand
|
|
80
83
|
.command('deploy')
|
|
81
84
|
.addOption(schemaOption)
|
|
85
|
+
.addOption(migrationsOption)
|
|
82
86
|
.description('Deploy your pending migrations to your production/staging database.')
|
|
83
87
|
.action((options) => migrateAction('deploy', options));
|
|
84
88
|
|
|
85
89
|
migrateCommand
|
|
86
90
|
.command('status')
|
|
87
91
|
.addOption(schemaOption)
|
|
92
|
+
.addOption(migrationsOption)
|
|
88
93
|
.description('check the status of your database migrations.')
|
|
89
94
|
.action((options) => migrateAction('status', options));
|
|
90
95
|
|