@zenstackhq/cli 3.3.2 → 3.4.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/actions/check.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/format.ts","../src/actions/generate.ts","../src/plugins/index.ts","../src/plugins/prisma.ts","../src/plugins/typescript.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/actions/seed.ts","../src/actions/proxy.ts","../src/utils/version-utils.ts","../src/telemetry.ts","../src/constants.ts","../src/utils/is-ci.ts","../src/utils/is-container.ts","../src/utils/is-docker.ts","../src/utils/is-wsl.ts","../src/utils/machine-id-utils.ts"],"sourcesContent":["import 'dotenv/config';\nimport { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, CommanderError, Option } from 'commander';\nimport * as actions from './actions';\nimport { CliError } from './cli-error';\nimport { telemetry } from './telemetry';\nimport { checkNewVersion, getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await telemetry.trackCommand('generate', () => actions.generate(options));\n};\n\nconst migrateAction = async (subCommand: string, options: any): Promise<void> => {\n await telemetry.trackCommand(`migrate ${subCommand}`, () => actions.migrate(subCommand, options));\n};\n\nconst dbAction = async (subCommand: string, options: any): Promise<void> => {\n await telemetry.trackCommand(`db ${subCommand}`, () => actions.db(subCommand, options));\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await telemetry.trackCommand('info', () => actions.info(projectPath));\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await telemetry.trackCommand('init', () => actions.init(projectPath));\n};\n\nconst checkAction = async (options: Parameters<typeof actions.check>[0]): Promise<void> => {\n await telemetry.trackCommand('check', () => actions.check(options));\n};\n\nconst formatAction = async (options: Parameters<typeof actions.format>[0]): Promise<void> => {\n await telemetry.trackCommand('format', () => actions.format(options));\n};\n\nconst seedAction = async (options: Parameters<typeof actions.seed>[0], args: string[]): Promise<void> => {\n await telemetry.trackCommand('db seed', () => actions.seed(options, args));\n};\n\nconst proxyAction = async (options: Parameters<typeof actions.proxy>[0]): Promise<void> => {\n await telemetry.trackCommand('proxy', () => actions.proxy(options));\n};\n\nfunction createProgram() {\n const program = new Command('zen')\n .alias('zenstack')\n .helpOption('-h, --help', 'Show this help message')\n .version(getVersion()!, '-v --version', 'Show CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is the modern data layer for TypeScript apps.\\n\\nDocumentation: https://zenstack.dev/docs`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"zenstack/schema.zmodel\" unless specified in package.json.`,\n );\n\n const noVersionCheckOption = new Option('--no-version-check', 'do not check for new version');\n\n program\n .command('generate')\n .description('Run code generation plugins')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .addOption(new Option('-o, --output <path>', 'default output directory for code generation'))\n .addOption(new Option('-w, --watch', 'enable watch mode').default(false))\n .addOption(new Option('--lite', 'also generate a lite version of schema without attributes').default(false))\n .addOption(new Option('--lite-only', 'only generate lite version of schema without attributes').default(false))\n .addOption(new Option('--silent', 'suppress all output except errors').default(false))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Run database schema migration related tasks.');\n const migrationsOption = new Option('--migrations <path>', 'path that contains the \"migrations\" directory');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\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 .addOption(new Option('--skip-seed', 'skip seeding the database after reset'))\n .addOption(noVersionCheckOption)\n .description('Reset your database and apply all migrations, all data will be lost')\n .addHelpText(\n 'after',\n '\\nIf there is a seed script defined in package.json, it will be run after the reset. Use --skip-seed to skip it.',\n )\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\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(noVersionCheckOption)\n .addOption(migrationsOption)\n .description('Check the status of your database migrations')\n .action((options) => migrateAction('status', options));\n\n migrateCommand\n .command('resolve')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .addOption(migrationsOption)\n .addOption(new Option('--applied <migration>', 'record a specific migration as applied'))\n .addOption(new Option('--rolled-back <migration>', 'record a specific migration as rolled back'))\n .description('Resolve issues with database migrations in deployment databases')\n .action((options) => migrateAction('resolve', 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(noVersionCheckOption)\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 dbCommand\n .command('seed')\n .description('Seed the database')\n .allowExcessArguments(true)\n .addHelpText(\n 'after',\n `\nSeed script is configured under the \"zenstack.seed\" field in package.json.\nE.g.:\n{\n \"zenstack\": {\n \"seed\": \"ts-node ./zenstack/seed.ts\"\n }\n}\n\nArguments following -- are passed to the seed script. E.g.: \"zen db seed -- --users 10\"`,\n )\n .addOption(noVersionCheckOption)\n .action((options, command) => seedAction(options, command.args));\n\n program\n .command('info')\n .description('Get information of installed ZenStack packages')\n .argument('[path]', 'project path', '.')\n .addOption(noVersionCheckOption)\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack')\n .argument('[path]', 'project path', '.')\n .addOption(noVersionCheckOption)\n .action(initAction);\n\n program\n .command('check')\n .description('Check a ZModel schema for syntax or semantic errors')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .action(checkAction);\n\n program\n .command('format')\n .description('Format a ZModel schema file')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .action(formatAction);\n\n program\n .command('proxy')\n .alias('studio')\n .description('Start the ZenStack proxy server')\n .addOption(schemaOption)\n .addOption(new Option('-p, --port <port>', 'port to run the proxy server on').default(2311))\n .addOption(new Option('-o, --output <path>', 'output directory for `zen generate` command'))\n .addOption(new Option('-d, --databaseUrl <url>', 'database connection URL'))\n .addOption(new Option('-l, --logLevel <level...>', 'Query log levels (e.g., query, error)'))\n .addOption(noVersionCheckOption)\n .action(proxyAction);\n\n program.addHelpCommand('help [command]', 'Display help for a command');\n\n program.hook('preAction', async (_thisCommand, actionCommand) => {\n if (actionCommand.getOptionValue('versionCheck') !== false) {\n await checkNewVersion();\n }\n });\n\n return program;\n}\n\nasync function main() {\n let exitCode = 0;\n\n const program = createProgram();\n program.exitOverride();\n\n try {\n await telemetry.trackCli(async () => {\n await program.parseAsync();\n });\n } catch (e) {\n if (e instanceof CommanderError) {\n // ignore\n exitCode = e.exitCode;\n } else if (e instanceof CliError) {\n // log\n console.error(colors.red(e.message));\n exitCode = 1;\n } else {\n console.error(colors.red(`Unhandled error: ${e}`));\n exitCode = 1;\n }\n }\n\n if (\n (program.args.includes('generate') && (program.args.includes('-w') || program.args.includes('--watch'))) ||\n ['proxy', 'studio'].some((cmd) => program.args.includes(cmd))\n ) {\n // A \"hack\" way to prevent the process from terminating because we don't want to stop it.\n return;\n }\n\n if (telemetry.isTracking) {\n // give telemetry a chance to send events before exit\n setTimeout(() => {\n process.exit(exitCode);\n }, 200);\n } else {\n process.exit(exitCode);\n }\n}\n\nmain();\n","import colors from 'colors';\nimport { getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n};\n\n/**\n * CLI action for checking a schema's validity.\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n try {\n await loadSchemaDocument(schemaFile);\n console.log(colors.green('✓ Schema validation completed successfully.'));\n } catch (error) {\n console.error(colors.red('✗ Schema validation failed.'));\n // Re-throw to maintain CLI exit code behavior\n throw error;\n }\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { isDataSource } from '@zenstackhq/language/ast';\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 if (fs.statSync(pkgJsonConfig.schema).isDirectory()) {\n const schemaPath = path.join(pkgJsonConfig.schema, 'schema.zmodel');\n if (!fs.existsSync(schemaPath)) {\n throw new CliError(`Schema file not found: ${schemaPath}`);\n }\n return schemaPath;\n } else {\n return pkgJsonConfig.schema;\n }\n }\n\n if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./schema.zmodel\" or \"./zenstack/schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(schemaFile: string) {\n const loadResult = await loadDocument(schemaFile);\n if (!loadResult.success) {\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Schema contains errors. See above for details.');\n }\n loadResult.warnings.forEach((warn) => {\n console.warn(colors.yellow(warn));\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 if (!model.declarations.some(isDataSource)) {\n throw new CliError('Schema must define a datasource');\n }\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; seed: string | undefined } = {\n schema: undefined,\n output: undefined,\n seed: undefined,\n };\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 =\n pkgJson.zenstack.schema && typeof pkgJson.zenstack.schema === 'string'\n ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema)\n : undefined;\n result.output =\n pkgJson.zenstack.output && typeof pkgJson.zenstack.output === 'string'\n ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output)\n : undefined;\n result.seed =\n typeof pkgJson.zenstack.seed === 'string' && pkgJson.zenstack.seed ? pkgJson.zenstack.seed : undefined;\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\nexport async function requireDataSourceUrl(schemaFile: string) {\n const zmodel = await loadSchemaDocument(schemaFile);\n const dataSource = zmodel.declarations.find(isDataSource);\n if (!dataSource?.fields.some((f) => f.name === 'url')) {\n throw new CliError('The schema\\'s \"datasource\" must have a \"url\" field to use this command.');\n }\n}\n\nexport function getOutputPath(options: { output?: string }, 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","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import fs from 'node:fs';\nimport { execPrisma } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, handleSubProcessError, requireDataSourceUrl } 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 const schemaFile = getSchemaFile(options.schema);\n\n // validate datasource url exists\n await requireDataSourceUrl(schemaFile);\n\n // generate a temp prisma schema file\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n '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 execPrisma(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';\nimport { fileURLToPath } from 'url';\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\n/**\n * Utility for running prisma commands\n */\nexport function execPrisma(args: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }) {\n let prismaPath: string | undefined;\n try {\n if (typeof import.meta.resolve === 'function') {\n // esm\n prismaPath = fileURLToPath(import.meta.resolve('prisma/build/index.js'));\n } else {\n // cjs\n prismaPath = require.resolve('prisma/build/index.js');\n }\n } catch {\n // ignore and fallback\n }\n\n const _options = {\n ...options,\n env: {\n ...options?.env,\n PRISMA_HIDE_UPDATE_MESSAGE: '1',\n },\n };\n\n if (!prismaPath) {\n // fallback to npx/bunx execute\n execPackage(`prisma ${args}`, _options);\n return;\n }\n\n execSync(`node \"${prismaPath}\" ${args}`, _options);\n}\n","import { formatDocument } from '@zenstackhq/language';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport { getSchemaFile } from './action-utils';\n\ntype Options = {\n schema?: string;\n};\n\n/**\n * CLI action for formatting a ZModel schema file.\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n let formattedContent: string;\n\n try {\n formattedContent = await formatDocument(fs.readFileSync(schemaFile, 'utf-8'));\n } catch (error) {\n console.error(colors.red('✗ Schema formatting failed.'));\n // Re-throw to maintain CLI exit code behavior\n throw error;\n }\n\n fs.writeFileSync(schemaFile, formattedContent, 'utf-8');\n console.log(colors.green('✓ Schema formatting completed successfully.'));\n}\n","import { invariant, singleDebounce } from '@zenstackhq/common-helpers';\nimport { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport { type AbstractDeclaration, isPlugin, LiteralExpr, Plugin, type Model } from '@zenstackhq/language/ast';\nimport { getLiteral, getLiteralArray } from '@zenstackhq/language/utils';\nimport { type CliPlugin } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport { createJiti } from 'jiti';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { watch } from 'chokidar';\nimport ora, { type Ora } from 'ora';\nimport { CliError } from '../cli-error';\nimport * as corePlugins from '../plugins';\nimport { getOutputPath, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent: boolean;\n watch: boolean;\n lite: boolean;\n liteOnly: boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const model = await pureGenerate(options, false);\n\n if (options.watch) {\n const logsEnabled = !options.silent;\n\n if (logsEnabled) {\n console.log(colors.green(`\\nEnabled watch mode!`));\n }\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions;\n\n // Get real models file path (cuz its merged into single document -> we need use cst nodes)\n const getRootModelWatchPaths = (model: Model) =>\n new Set<string>(\n (\n model.declarations.filter(\n (v) =>\n v.$cstNode?.parent?.element.$type === 'Model' &&\n !!v.$cstNode.parent.element.$document?.uri?.fsPath,\n ) as AbstractDeclaration[]\n ).map((v) => v.$cstNode!.parent!.element.$document!.uri!.fsPath),\n );\n\n const watchedPaths = getRootModelWatchPaths(model);\n\n if (logsEnabled) {\n const logPaths = [...watchedPaths].map((at) => `- ${at}`).join('\\n');\n console.log(`Watched file paths:\\n${logPaths}`);\n }\n\n const watcher = watch([...watchedPaths], {\n alwaysStat: false,\n ignoreInitial: true,\n ignorePermissionErrors: true,\n ignored: (at) => !schemaExtensions.some((ext) => at.endsWith(ext)),\n });\n\n // prevent save multiple files and run multiple times\n const reGenerateSchema = singleDebounce(\n async () => {\n if (logsEnabled) {\n console.log('Got changes, run generation!');\n }\n\n try {\n const newModel = await pureGenerate(options, true);\n const allModelsPaths = getRootModelWatchPaths(newModel);\n const newModelPaths = [...allModelsPaths].filter((at) => !watchedPaths.has(at));\n const removeModelPaths = [...watchedPaths].filter((at) => !allModelsPaths.has(at));\n\n if (newModelPaths.length) {\n if (logsEnabled) {\n const logPaths = newModelPaths.map((at) => `- ${at}`).join('\\n');\n console.log(`Added file(s) to watch:\\n${logPaths}`);\n }\n\n newModelPaths.forEach((at) => watchedPaths.add(at));\n watcher.add(newModelPaths);\n }\n\n if (removeModelPaths.length) {\n if (logsEnabled) {\n const logPaths = removeModelPaths.map((at) => `- ${at}`).join('\\n');\n console.log(`Removed file(s) from watch:\\n${logPaths}`);\n }\n\n removeModelPaths.forEach((at) => watchedPaths.delete(at));\n watcher.unwatch(removeModelPaths);\n }\n } catch (e) {\n console.error(e);\n }\n },\n 500,\n true,\n );\n\n watcher.on('unlink', (pathAt) => {\n if (logsEnabled) {\n console.log(`Removed file from watch: ${pathAt}`);\n }\n\n watchedPaths.delete(pathAt);\n watcher.unwatch(pathAt);\n\n reGenerateSchema();\n });\n\n watcher.on('change', () => {\n reGenerateSchema();\n });\n }\n}\n\nasync function pureGenerate(options: Options, fromWatch: boolean) {\n const start = Date.now();\n\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n await runPlugins(schemaFile, model, outputPath, options);\n\n if (!options.silent) {\n console.log(colors.green(`Generation completed successfully in ${Date.now() - start}ms.\\n`));\n\n if (!fromWatch) {\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/orm';\nimport { schema } from '${path.relative('.', outputPath)}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialect: { ... }\n});\n\\`\\`\\`\n\nCheck documentation: https://zenstack.dev/docs/`);\n }\n }\n\n return model;\n}\n\nasync function runPlugins(schemaFile: string, model: Model, outputPath: string, options: Options) {\n const plugins = model.declarations.filter(isPlugin);\n const processedPlugins: { cliPlugin: CliPlugin; pluginOptions: Record<string, unknown> }[] = [];\n\n for (const plugin of plugins) {\n const provider = getPluginProvider(plugin);\n\n let cliPlugin: CliPlugin | undefined;\n if (provider.startsWith('@core/')) {\n cliPlugin = (corePlugins as any)[provider.slice('@core/'.length)];\n if (!cliPlugin) {\n throw new CliError(`Unknown core plugin: ${provider}`);\n }\n } else {\n cliPlugin = await loadPluginModule(provider, path.dirname(schemaFile));\n }\n\n if (cliPlugin) {\n const pluginOptions = getPluginOptions(plugin);\n\n // merge CLI options\n if (provider === '@core/typescript') {\n if (pluginOptions['lite'] === undefined) {\n pluginOptions['lite'] = options.lite;\n }\n if (pluginOptions['liteOnly'] === undefined) {\n pluginOptions['liteOnly'] = options.liteOnly;\n }\n }\n\n processedPlugins.push({ cliPlugin, pluginOptions });\n }\n }\n\n const defaultPlugins = [\n {\n plugin: corePlugins['typescript'],\n options: { lite: options.lite, liteOnly: options.liteOnly },\n },\n ];\n defaultPlugins.forEach(({ plugin, options }) => {\n if (!processedPlugins.some((p) => p.cliPlugin === plugin)) {\n // default plugins are run before user plugins\n processedPlugins.unshift({ cliPlugin: plugin, pluginOptions: options });\n }\n });\n\n for (const { cliPlugin, pluginOptions } of processedPlugins) {\n invariant(\n typeof cliPlugin.generate === 'function',\n `Plugin ${cliPlugin.name} does not have a generate function`,\n );\n\n // run plugin generator\n let spinner: Ora | undefined;\n\n if (!options.silent) {\n spinner = ora(cliPlugin.statusText ?? `Running plugin ${cliPlugin.name}`).start();\n }\n try {\n await cliPlugin.generate({\n schemaFile,\n model,\n defaultOutputPath: outputPath,\n pluginOptions,\n });\n spinner?.succeed();\n } catch (err) {\n spinner?.fail();\n console.error(err);\n }\n }\n}\n\nfunction getPluginProvider(plugin: Plugin) {\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 return provider;\n}\n\nfunction getPluginOptions(plugin: Plugin): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of plugin.fields) {\n if (field.name === 'provider') {\n continue; // skip provider\n }\n const value = getLiteral(field.value) ?? getLiteralArray(field.value);\n if (value === undefined) {\n console.warn(`Plugin \"${plugin.name}\" option \"${field.name}\" has unsupported value, skipping`);\n continue;\n }\n result[field.name] = value;\n }\n return result;\n}\n\nasync function loadPluginModule(provider: string, basePath: string) {\n let moduleSpec = provider;\n if (moduleSpec.startsWith('.')) {\n // relative to schema's path\n moduleSpec = path.resolve(basePath, moduleSpec);\n }\n\n const importAsEsm = async (spec: string) => {\n try {\n const result = (await import(spec)).default as CliPlugin;\n return result;\n } catch (err) {\n throw new CliError(`Failed to load plugin module from ${spec}: ${(err as Error).message}`);\n }\n };\n\n const jiti = createJiti(pathToFileURL(basePath).toString());\n const importAsTs = async (spec: string) => {\n try {\n const result = (await jiti.import(spec, { default: true })) as CliPlugin;\n return result;\n } catch (err) {\n throw new CliError(`Failed to load plugin module from ${spec}: ${(err as Error).message}`);\n }\n };\n\n const esmSuffixes = ['.js', '.mjs'];\n const tsSuffixes = ['.ts', '.mts'];\n\n if (fs.existsSync(moduleSpec) && fs.statSync(moduleSpec).isFile()) {\n // try provider as ESM file\n if (esmSuffixes.some((suffix) => moduleSpec.endsWith(suffix))) {\n return await importAsEsm(pathToFileURL(moduleSpec).toString());\n }\n\n // try provider as TS file\n if (tsSuffixes.some((suffix) => moduleSpec.endsWith(suffix))) {\n return await importAsTs(moduleSpec);\n }\n }\n\n // try ESM index files in provider directory\n for (const suffix of esmSuffixes) {\n const indexPath = path.join(moduleSpec, `index${suffix}`);\n if (fs.existsSync(indexPath)) {\n return await importAsEsm(pathToFileURL(indexPath).toString());\n }\n }\n\n // try TS index files in provider directory\n for (const suffix of tsSuffixes) {\n const indexPath = path.join(moduleSpec, `index${suffix}`);\n if (fs.existsSync(indexPath)) {\n return await importAsTs(indexPath);\n }\n }\n\n // last resort, try to import as esm directly\n try {\n return (await import(moduleSpec)).default as CliPlugin;\n } catch {\n // plugin may not export a generator so we simply ignore the error here\n return undefined;\n }\n}\n","export { default as prisma } from './prisma';\nexport { default as typescript } from './typescript';\n","import { PrismaSchemaGenerator, type CliPlugin } from '@zenstackhq/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst plugin: CliPlugin = {\n name: 'Prisma Schema Generator',\n statusText: 'Generating Prisma schema',\n async generate({ model, defaultOutputPath, pluginOptions }) {\n let outFile = path.join(defaultOutputPath, 'schema.prisma');\n if (typeof pluginOptions['output'] === 'string') {\n outFile = path.resolve(defaultOutputPath, pluginOptions['output']);\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n }\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n fs.writeFileSync(outFile, prismaSchema);\n },\n};\n\nexport default plugin;\n","import type { CliPlugin } from '@zenstackhq/sdk';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst plugin: CliPlugin = {\n name: 'TypeScript Schema Generator',\n statusText: 'Generating TypeScript schema',\n async generate({ model, defaultOutputPath, pluginOptions }) {\n // output path\n let outDir = defaultOutputPath;\n if (typeof pluginOptions['output'] === 'string') {\n outDir = path.resolve(defaultOutputPath, pluginOptions['output']);\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n }\n\n // lite mode\n const lite = pluginOptions['lite'] === true;\n\n // liteOnly mode\n const liteOnly = pluginOptions['liteOnly'] === true;\n\n // add .js extension when importing\n const importWithFileExtension = pluginOptions['importWithFileExtension'];\n if (importWithFileExtension && typeof importWithFileExtension !== 'string') {\n throw new Error('The \"importWithFileExtension\" option must be a string if specified.');\n }\n\n await new TsSchemaGenerator().generate(model, {\n outDir,\n lite,\n liteOnly,\n importWithFileExtension: importWithFileExtension as string | undefined,\n });\n },\n};\n\nexport default plugin;\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 if (depPkgJson.private) {\n return undefined;\n }\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result.filter((p) => !!p);\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@latest', dev: true },\n { name: '@zenstackhq/orm@latest', 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, 'add', [\n pkg.name,\n ...(pkg.dev ? [pm.agent.startsWith('yarn') || pm.agent === 'bun' ? '--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], onDelete: Cascade)\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n const db = new ZenStackClient(schema, {\n dialect: new SqliteDialect({\n database: new SQLite('./zenstack/dev.db'),\n }),\n });\n const user = await db.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 { CliError } from '../cli-error';\nimport { execPrisma } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, requireDataSourceUrl } from './action-utils';\nimport { run as runSeed } from './seed';\n\ntype CommonOptions = {\n schema?: string;\n migrations?: string;\n skipSeed?: boolean;\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\ntype ResolveOptions = CommonOptions & {\n applied?: string;\n rolledBack?: string;\n};\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\n // validate datasource url exists\n await requireDataSourceUrl(schemaFile);\n\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 case 'resolve':\n await runResolve(prismaSchemaFile, options as ResolveOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nfunction runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n ' --skip-seed',\n options.name ? ` --name \"${options.name}\"` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = [\n 'migrate reset',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n ' --skip-seed',\n options.force ? ' --force' : '',\n ].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n\n if (!options.skipSeed) {\n await runSeed({ noWarnings: true, printStatus: true }, []);\n }\n}\n\nfunction runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n execPrisma(`migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction runResolve(prismaSchemaFile: string, options: ResolveOptions) {\n if (!options.applied && !options.rolledBack) {\n throw new CliError('Either --applied or --rolled-back option must be provided');\n }\n\n try {\n const cmd = [\n 'migrate resolve',\n ` --schema \"${prismaSchemaFile}\"`,\n options.applied ? ` --applied \"${options.applied}\"` : '',\n options.rolledBack ? ` --rolled-back \"${options.rolledBack}\"` : '',\n ].join('');\n execPrisma(cmd);\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 colors from 'colors';\nimport { execaCommand } from 'execa';\nimport { CliError } from '../cli-error';\nimport { getPkgJsonConfig } from './action-utils';\n\ntype Options = {\n noWarnings?: boolean;\n printStatus?: boolean;\n};\n\n/**\n * CLI action for seeding the database.\n */\nexport async function run(options: Options, args: string[]) {\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (!pkgJsonConfig.seed) {\n if (!options.noWarnings) {\n console.warn(colors.yellow('No seed script defined in package.json. Skipping seeding.'));\n }\n return;\n }\n\n const command = `${pkgJsonConfig.seed}${args.length > 0 ? ' ' + args.join(' ') : ''}`;\n\n if (options.printStatus) {\n console.log(colors.gray(`Running seed script \"${command}\"...`));\n }\n\n try {\n await execaCommand(command, {\n stdout: 'inherit',\n stderr: 'inherit',\n });\n } catch (err) {\n console.error(colors.red(err instanceof Error ? err.message : String(err)));\n throw new CliError('Failed to seed the database. Please check the error message above for details.');\n }\n}\n","import {\n ConfigExpr,\n InvocationExpr,\n isDataSource,\n isInvocationExpr,\n isLiteralExpr,\n LiteralExpr,\n} from '@zenstackhq/language/ast';\nimport { getStringLiteral } from '@zenstackhq/language/utils';\nimport { ZenStackClient, type ClientContract } from '@zenstackhq/orm';\nimport { MysqlDialect } from '@zenstackhq/orm/dialects/mysql';\nimport { PostgresDialect } from '@zenstackhq/orm/dialects/postgres';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport { RPCApiHandler } from '@zenstackhq/server/api';\nimport { ZenStackMiddleware } from '@zenstackhq/server/express';\nimport SQLite from 'better-sqlite3';\nimport colors from 'colors';\nimport cors from 'cors';\nimport express from 'express';\nimport { createJiti } from 'jiti';\nimport { createPool as createMysqlPool } from 'mysql2';\nimport path from 'node:path';\nimport { Pool as PgPool } from 'pg';\nimport { CliError } from '../cli-error';\nimport { getVersion } from '../utils/version-utils';\nimport { getOutputPath, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n output?: string;\n schema?: string;\n port?: number;\n logLevel?: string[];\n databaseUrl?: string;\n};\n\nexport async function run(options: Options) {\n const allowedLogLevels = ['error', 'query'] as const;\n const log = options.logLevel?.filter((level): level is (typeof allowedLogLevels)[number] =>\n allowedLogLevels.includes(level as any),\n );\n const schemaFile = getSchemaFile(options.schema);\n console.log(colors.gray(`Loading ZModel schema from: ${schemaFile}`));\n\n let outputPath = getOutputPath(options, schemaFile);\n\n // Ensure outputPath is absolute\n if (!path.isAbsolute(outputPath)) {\n outputPath = path.resolve(process.cwd(), outputPath);\n }\n\n const model = await loadSchemaDocument(schemaFile);\n\n const dataSource = model.declarations.find(isDataSource);\n\n let databaseUrl = options.databaseUrl;\n\n if (!databaseUrl) {\n const schemaUrl = dataSource?.fields.find((f) => f.name === 'url')?.value;\n if (!schemaUrl) {\n throw new CliError(\n `The schema's \"datasource\" does not have a \"url\" field, please provide it with -d option.`,\n );\n }\n databaseUrl = evaluateUrl(schemaUrl);\n }\n\n const provider = getStringLiteral(dataSource?.fields.find((f) => f.name === 'provider')?.value)!;\n\n const dialect = createDialect(provider, databaseUrl!, outputPath);\n\n const jiti = createJiti(import.meta.url);\n\n const schemaModule = (await jiti.import(path.join(outputPath, 'schema'))) as any;\n\n const db = new ZenStackClient(schemaModule.schema, {\n dialect: dialect,\n log: log && log.length > 0 ? log : undefined,\n });\n\n // check whether the database is reachable\n try {\n await db.$connect();\n } catch (err) {\n throw new CliError(`Failed to connect to the database: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n startServer(db, schemaModule.schema, options);\n}\n\nfunction evaluateUrl(schemaUrl: ConfigExpr) {\n if (isLiteralExpr(schemaUrl)) {\n // Handle string literal\n return getStringLiteral(schemaUrl);\n } else if (isInvocationExpr(schemaUrl)) {\n const envFunction = schemaUrl as InvocationExpr;\n const envName = getStringLiteral(envFunction.args[0]?.value as LiteralExpr)!;\n const envValue = process.env[envName];\n if (!envValue) {\n throw new CliError(`Environment variable ${envName} is not set`);\n }\n return envValue;\n } else {\n throw new CliError(`Unable to resolve the \"url\" field value.`);\n }\n}\n\nfunction redactDatabaseUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.password) {\n parsedUrl.password = '***';\n }\n if (parsedUrl.username) {\n parsedUrl.username = '***';\n }\n return parsedUrl.toString();\n } catch {\n // If URL parsing fails, return the original\n return url;\n }\n}\n\nfunction createDialect(provider: string, databaseUrl: string, outputPath: string) {\n switch (provider) {\n case 'sqlite': {\n let resolvedUrl = databaseUrl.trim();\n if (resolvedUrl.startsWith('file:')) {\n const filePath = resolvedUrl.substring('file:'.length);\n if (!path.isAbsolute(filePath)) {\n resolvedUrl = path.join(outputPath, filePath);\n }\n }\n console.log(colors.gray(`Connecting to SQLite database at: ${resolvedUrl}`));\n return new SqliteDialect({\n database: new SQLite(resolvedUrl),\n });\n }\n case 'postgresql':\n console.log(colors.gray(`Connecting to PostgreSQL database at: ${redactDatabaseUrl(databaseUrl)}`));\n return new PostgresDialect({\n pool: new PgPool({\n connectionString: databaseUrl,\n }),\n });\n\n case 'mysql':\n console.log(colors.gray(`Connecting to MySQL database at: ${redactDatabaseUrl(databaseUrl)}`));\n return new MysqlDialect({\n pool: createMysqlPool(databaseUrl),\n });\n\n default:\n throw new CliError(`Unsupported database provider: ${provider}`);\n }\n}\n\nfunction startServer(client: ClientContract<any, any>, schema: any, options: Options) {\n const app = express();\n app.use(cors());\n app.use(express.json({ limit: '5mb' }));\n app.use(express.urlencoded({ extended: true, limit: '5mb' }));\n\n app.use(\n '/api/model',\n ZenStackMiddleware({\n apiHandler: new RPCApiHandler({ schema }),\n getClient: () => client,\n }),\n );\n\n app.get('/api/schema', (_req, res: express.Response) => {\n res.json({ ...schema, zenstackVersion: getVersion() });\n });\n\n const server = app.listen(options.port, () => {\n console.log(`ZenStack proxy server is running on port: ${options.port}`);\n console.log(`You can visit ZenStack Studio at: ${colors.blue('https://studio.zenstack.dev')}`);\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n console.error(\n colors.red(`Port ${options.port} is already in use. Please choose a different port using -p option.`),\n );\n } else {\n throw new CliError(`Failed to start the server: ${err.message}`);\n }\n process.exit(1);\n });\n\n // Graceful shutdown\n process.on('SIGTERM', async () => {\n server.close(() => {\n console.log('\\nZenStack proxy server closed');\n });\n\n await client.$disconnect();\n process.exit(0);\n });\n\n process.on('SIGINT', async () => {\n server.close(() => {\n console.log('\\nZenStack proxy server closed');\n });\n await client.$disconnect();\n process.exit(0);\n });\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport semver from 'semver';\n\nconst CHECK_VERSION_TIMEOUT = 2000;\nconst VERSION_CHECK_TAG = 'next';\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\nexport async function checkNewVersion() {\n const currVersion = getVersion();\n let latestVersion: string;\n try {\n latestVersion = await getLatestVersion();\n } catch {\n // noop\n return;\n }\n\n if (latestVersion && currVersion && semver.gt(latestVersion, currVersion)) {\n console.log(`A newer version ${colors.cyan(latestVersion)} is available.`);\n }\n}\n\nexport async function getLatestVersion() {\n const fetchResult = await fetch(`https://registry.npmjs.org/@zenstackhq/cli/${VERSION_CHECK_TAG}`, {\n headers: { accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' },\n signal: AbortSignal.timeout(CHECK_VERSION_TIMEOUT),\n });\n\n if (fetchResult.ok) {\n const data: any = await fetchResult.json();\n const latestVersion = data?.version;\n if (typeof latestVersion === 'string' && semver.valid(latestVersion)) {\n return latestVersion;\n }\n }\n\n throw new Error('invalid npm registry response');\n}\n","import { init, type Mixpanel } from 'mixpanel';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport * as os from 'os';\nimport { TELEMETRY_TRACKING_TOKEN } from './constants';\nimport { isInCi } from './utils/is-ci';\nimport { isInContainer } from './utils/is-container';\nimport isDocker from './utils/is-docker';\nimport { isWsl } from './utils/is-wsl';\nimport { getMachineId } from './utils/machine-id-utils';\nimport { getVersion } from './utils/version-utils';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = getMachineId();\n private readonly sessionid = randomUUID();\n private readonly _os_type = os.type();\n private readonly _os_release = os.release();\n private readonly _os_arch = os.arch();\n private readonly _os_version = os.version();\n private readonly _os_platform = os.platform();\n private readonly version = getVersion();\n private readonly prismaVersion = this.getPrismaVersion();\n private readonly isDocker = isDocker();\n private readonly isWsl = isWsl();\n private readonly isContainer = isInContainer();\n private readonly isCi = isInCi;\n\n constructor() {\n if (process.env['DO_NOT_TRACK'] !== '1' && TELEMETRY_TRACKING_TOKEN) {\n this.mixpanel = init(TELEMETRY_TRACKING_TOKEN, {\n geolocate: true,\n });\n }\n }\n\n get isTracking() {\n return !!this.mixpanel;\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os_type,\n osType: this._os_type,\n osRelease: this._os_release,\n osPlatform: this._os_platform,\n osArch: this._os_arch,\n osVersion: this._os_version,\n nodeVersion: process.version,\n version: this.version,\n prismaVersion: this.prismaVersion,\n isDocker: this.isDocker,\n isWsl: this.isWsl,\n isContainer: this.isContainer,\n isCi: this.isCi,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n trackError(err: Error) {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n }\n\n async trackSpan<T>(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<T> | T,\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n return await action();\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n\n async trackCommand(command: string, action: () => Promise<void> | void) {\n await this.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', { command }, action);\n }\n\n async trackCli(action: () => Promise<void> | void) {\n await this.trackSpan('cli:start', 'cli:complete', 'cli:error', {}, action);\n }\n\n getPrismaVersion() {\n try {\n const packageJsonPath = import.meta.resolve('prisma/package.json');\n const packageJsonUrl = new URL(packageJsonPath);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonUrl, 'utf8'));\n return packageJson.version;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const telemetry = new Telemetry();\n","// replaced at build time\nexport const TELEMETRY_TRACKING_TOKEN = '<TELEMETRY_TRACKING_TOKEN>';\n\n// plugin-contributed model file name\nexport const PLUGIN_MODULE_NAME = 'plugin.zmodel';\n","import { env } from 'node:process';\nexport const isInCi =\n env['CI'] !== '0' &&\n env['CI'] !== 'false' &&\n ('CI' in env || 'CONTINUOUS_INTEGRATION' in env || Object.keys(env).some((key) => key.startsWith('CI_')));\n","import fs from 'node:fs';\nimport isDocker from './is-docker';\n\nlet cachedResult: boolean | undefined;\n\n// Podman detection\nconst hasContainerEnv = () => {\n try {\n fs.statSync('/run/.containerenv');\n return true;\n } catch {\n return false;\n }\n};\n\nexport function isInContainer() {\n // TODO: Use `??=` when targeting Node.js 16.\n if (cachedResult === undefined) {\n cachedResult = hasContainerEnv() || isDocker();\n }\n\n return cachedResult;\n}\n","// Copied over from https://github.com/sindresorhus/is-docker for CJS compatibility\n\nimport fs from 'node:fs';\n\nlet isDockerCached: boolean | undefined;\n\nfunction hasDockerEnv() {\n try {\n fs.statSync('/.dockerenv');\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasDockerCGroup() {\n try {\n return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n } catch {\n return false;\n }\n}\n\nexport default function isDocker() {\n // TODO: Use `??=` when targeting Node.js 16.\n if (isDockerCached === undefined) {\n isDockerCached = hasDockerEnv() || hasDockerCGroup();\n }\n\n return isDockerCached;\n}\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nexport const isWsl = () => {\n if (process.platform !== 'linux') {\n return false;\n }\n\n if (os.release().toLowerCase().includes('microsoft')) {\n return true;\n }\n\n try {\n return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft');\n } catch {\n return false;\n }\n};\n","// modified from https://github.com/automation-stack/node-machine-id\n\nimport { execSync } from 'child_process';\nimport { createHash, randomUUID } from 'node:crypto';\n\nconst { platform } = process;\nconst win32RegBinPath = {\n native: '%windir%\\\\System32',\n mixed: '%windir%\\\\sysnative\\\\cmd.exe /c %windir%\\\\System32',\n};\nconst guid = {\n darwin: 'ioreg -rd1 -c IOPlatformExpertDevice',\n win32:\n `${win32RegBinPath[isWindowsProcessMixedOrNativeArchitecture()]}\\\\REG.exe ` +\n 'QUERY HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography ' +\n '/v MachineGuid',\n linux: '( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname 2> /dev/null) | head -n 1 || :',\n freebsd: 'kenv -q smbios.system.uuid || sysctl -n kern.hostuuid',\n};\n\nfunction isWindowsProcessMixedOrNativeArchitecture() {\n // eslint-disable-next-line no-prototype-builtins\n if (process.arch === 'ia32' && process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')) {\n return 'mixed';\n }\n return 'native';\n}\n\nfunction hash(guid: string): string {\n return createHash('sha256').update(guid).digest('hex');\n}\n\nfunction expose(result: string): string | undefined {\n switch (platform) {\n case 'darwin':\n return result\n .split('IOPlatformUUID')[1]\n ?.split('\\n')[0]\n ?.replace(/=|\\s+|\"/gi, '')\n .toLowerCase();\n case 'win32':\n return result\n .toString()\n .split('REG_SZ')[1]\n ?.replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n case 'linux':\n return result\n .toString()\n .replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n case 'freebsd':\n return result\n .toString()\n .replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n default:\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n}\n\nexport function getMachineId() {\n if (!(platform in guid)) {\n return randomUUID();\n }\n try {\n const value = execSync(guid[platform as keyof typeof guid]);\n const id = expose(value.toString());\n if (!id) {\n return randomUUID();\n }\n return hash(id);\n } catch {\n return randomUUID();\n }\n}\n"],"mappings":"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","names":["import_language","import_colors","import_colors","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","statSync","isDirectory","schemaPath","path","join","loadSchemaDocument","schemaFile","loadResult","loadDocument","success","errors","forEach","err","console","error","colors","red","warnings","warn","yellow","model","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","folder","declarations","some","isDataSource","prismaSchema","PrismaSchemaGenerator","generate","dirname","prismaSchemaFile","resolve","writeFileSync","startPath","result","undefined","output","seed","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","names","multiple","name","target","find","push","up","length","requireDataSourceUrl","zmodel","dataSource","fields","f","getOutputPath","options","run","options","schemaFile","getSchemaFile","schema","loadSchemaDocument","console","log","colors","green","error","red","import_node_fs","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","execPrisma","args","prismaPath","resolve","fileURLToPath","require","_options","PRISMA_HIDE_UPDATE_MESSAGE","run","command","options","runPush","schemaFile","getSchemaFile","schema","requireDataSourceUrl","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPrisma","err","handleSubProcessError","fs","existsSync","unlinkSync","import_language","import_colors","import_node_fs","run","options","schemaFile","getSchemaFile","schema","formattedContent","formatDocument","fs","readFileSync","error","console","colors","red","writeFileSync","log","green","import_language","import_ast","import_colors","import_node_fs","import_node_path","import_sdk","import_node_fs","import_node_path","plugin","name","statusText","generate","model","defaultOutputPath","pluginOptions","outFile","path","join","resolve","fs","existsSync","dirname","mkdirSync","recursive","prismaSchema","PrismaSchemaGenerator","writeFileSync","import_sdk","import_node_fs","import_node_path","plugin","name","statusText","generate","model","defaultOutputPath","pluginOptions","outDir","path","resolve","fs","existsSync","mkdirSync","recursive","lite","liteOnly","importWithFileExtension","Error","TsSchemaGenerator","run","options","model","pureGenerate","watch","logsEnabled","silent","console","log","colors","green","schemaExtensions","ZModelLanguageMetaData","fileExtensions","getRootModelWatchPaths","Set","declarations","filter","v","$cstNode","parent","element","$type","$document","uri","fsPath","map","watchedPaths","logPaths","at","join","watcher","alwaysStat","ignoreInitial","ignorePermissionErrors","ignored","some","ext","endsWith","reGenerateSchema","singleDebounce","newModel","allModelsPaths","newModelPaths","has","removeModelPaths","length","forEach","add","delete","unwatch","e","error","on","pathAt","fromWatch","start","Date","now","schemaFile","getSchemaFile","schema","loadSchemaDocument","outputPath","getOutputPath","runPlugins","path","relative","plugins","isPlugin","processedPlugins","plugin","provider","getPluginProvider","cliPlugin","startsWith","corePlugins","slice","CliError","loadPluginModule","dirname","pluginOptions","getPluginOptions","undefined","lite","liteOnly","push","defaultPlugins","p","unshift","invariant","generate","name","spinner","ora","statusText","defaultOutputPath","succeed","err","fail","providerField","fields","find","f","value","result","field","getLiteral","getLiteralArray","warn","basePath","moduleSpec","resolve","importAsEsm","spec","default","message","jiti","createJiti","pathToFileURL","toString","importAsTs","import","esmSuffixes","tsSuffixes","fs","existsSync","statSync","isFile","suffix","indexPath","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","private","undefined","import_colors","import_node_fs","import_node_path","import_ora","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","startsWith","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","import_colors","run","options","args","pkgJsonConfig","getPkgJsonConfig","process","cwd","seed","noWarnings","console","warn","colors","yellow","command","length","join","printStatus","log","gray","execaCommand","stdout","stderr","err","error","red","Error","message","String","CliError","run","command","options","schemaFile","getSchemaFile","schema","requireDataSourceUrl","prismaSchemaDir","migrations","path","dirname","undefined","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","runResolve","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPrisma","err","handleSubProcessError","force","skipSeed","runSeed","noWarnings","printStatus","_options","applied","rolledBack","CliError","Error","status","process","exit","import_ast","import_utils","import_colors","import_express","import_jiti","import_node_path","import_colors","import_node_fs","import_node_path","import_node_url","import_meta","CHECK_VERSION_TIMEOUT","VERSION_CHECK_TAG","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","import_meta","url","JSON","parse","fs","readFileSync","join","version","undefined","checkNewVersion","currVersion","latestVersion","getLatestVersion","semver","gt","console","log","colors","cyan","fetchResult","fetch","headers","accept","signal","AbortSignal","timeout","ok","data","json","valid","Error","import_meta","run","options","allowedLogLevels","log","logLevel","filter","level","includes","schemaFile","getSchemaFile","schema","console","colors","gray","outputPath","getOutputPath","path","isAbsolute","resolve","process","cwd","model","loadSchemaDocument","dataSource","declarations","find","isDataSource","databaseUrl","schemaUrl","fields","f","name","value","CliError","evaluateUrl","provider","getStringLiteral","dialect","createDialect","jiti","createJiti","import_meta","url","schemaModule","import","join","db","ZenStackClient","length","undefined","$connect","err","Error","message","String","startServer","isLiteralExpr","isInvocationExpr","envFunction","envName","args","envValue","env","redactDatabaseUrl","parsedUrl","URL","password","username","toString","resolvedUrl","trim","startsWith","filePath","substring","SqliteDialect","database","SQLite","PostgresDialect","pool","PgPool","connectionString","MysqlDialect","createMysqlPool","client","app","express","use","cors","json","limit","urlencoded","extended","ZenStackMiddleware","apiHandler","RPCApiHandler","getClient","get","_req","res","zenstackVersion","getVersion","server","listen","port","blue","on","code","error","red","exit","close","$disconnect","import_node_crypto","import_node_fs","os","TELEMETRY_TRACKING_TOKEN","isInCi","env","Object","keys","some","key","startsWith","import_node_fs","import_node_fs","isDockerCached","hasDockerEnv","fs","statSync","hasDockerCGroup","readFileSync","includes","isDocker","undefined","cachedResult","hasContainerEnv","fs","statSync","isInContainer","undefined","isDocker","import_node_process","import_node_fs","isWsl","process","platform","os","release","toLowerCase","includes","fs","readFileSync","import_child_process","platform","process","win32RegBinPath","native","mixed","guid","darwin","win32","isWindowsProcessMixedOrNativeArchitecture","linux","freebsd","arch","env","hasOwnProperty","hash","createHash","update","digest","expose","result","split","replace","toLowerCase","toString","Error","getMachineId","randomUUID","value","execSync","id","import_meta","Telemetry","mixpanel","hostId","getMachineId","sessionid","randomUUID","_os_type","type","_os_release","release","_os_arch","arch","_os_version","version","_os_platform","platform","getVersion","prismaVersion","getPrismaVersion","isDocker","isWsl","isContainer","isInContainer","isCi","isInCi","process","env","TELEMETRY_TRACKING_TOKEN","init","geolocate","isTracking","track","event","properties","payload","distinct_id","session","time","Date","$os","osType","osRelease","osPlatform","osArch","osVersion","nodeVersion","trackError","err","message","stack","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","duration","trackCommand","command","trackCli","packageJsonPath","import_meta","resolve","packageJsonUrl","URL","packageJson","JSON","parse","fs","readFileSync","undefined","telemetry","generateAction","options","telemetry","trackCommand","generate","migrateAction","subCommand","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","checkAction","check","formatAction","format","seedAction","args","seed","proxyAction","proxy","createProgram","program","Command","alias","helpOption","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","noVersionCheckOption","command","addOption","default","action","migrateCommand","migrationsOption","addHelpText","dbCommand","allowExcessArguments","argument","addHelpCommand","hook","_thisCommand","actionCommand","getOptionValue","checkNewVersion","main","exitCode","exitOverride","trackCli","parseAsync","e","CommanderError","CliError","console","error","red","message","includes","some","cmd","isTracking","setTimeout","process","exit"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/actions/check.ts","../src/actions/action-utils.ts","../src/cli-error.ts","../src/actions/db.ts","../src/utils/exec-utils.ts","../src/actions/pull/index.ts","../src/actions/pull/utils.ts","../src/actions/pull/casing.ts","../src/actions/pull/provider/mysql.ts","../src/actions/pull/provider/postgresql.ts","../src/actions/pull/provider/sqlite.ts","../src/actions/pull/provider/index.ts","../src/actions/format.ts","../src/actions/generate.ts","../src/plugins/index.ts","../src/plugins/prisma.ts","../src/plugins/typescript.ts","../src/actions/info.ts","../src/actions/init.ts","../src/actions/templates.ts","../src/actions/migrate.ts","../src/actions/seed.ts","../src/actions/proxy.ts","../src/utils/version-utils.ts","../src/telemetry.ts","../src/constants.ts","../src/utils/is-ci.ts","../src/utils/is-container.ts","../src/utils/is-docker.ts","../src/utils/is-wsl.ts","../src/utils/machine-id-utils.ts"],"sourcesContent":["import 'dotenv/config';\nimport { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport colors from 'colors';\nimport { Command, CommanderError, Option } from 'commander';\nimport * as actions from './actions';\nimport { CliError } from './cli-error';\nimport { telemetry } from './telemetry';\nimport { checkNewVersion, getVersion } from './utils/version-utils';\n\nconst generateAction = async (options: Parameters<typeof actions.generate>[0]): Promise<void> => {\n await telemetry.trackCommand('generate', () => actions.generate(options));\n};\n\nconst migrateAction = async (subCommand: string, options: any): Promise<void> => {\n await telemetry.trackCommand(`migrate ${subCommand}`, () => actions.migrate(subCommand, options));\n};\n\nconst dbAction = async (subCommand: string, options: any): Promise<void> => {\n await telemetry.trackCommand(`db ${subCommand}`, () => actions.db(subCommand, options));\n};\n\nconst infoAction = async (projectPath: string): Promise<void> => {\n await telemetry.trackCommand('info', () => actions.info(projectPath));\n};\n\nconst initAction = async (projectPath: string): Promise<void> => {\n await telemetry.trackCommand('init', () => actions.init(projectPath));\n};\n\nconst checkAction = async (options: Parameters<typeof actions.check>[0]): Promise<void> => {\n await telemetry.trackCommand('check', () => actions.check(options));\n};\n\nconst formatAction = async (options: Parameters<typeof actions.format>[0]): Promise<void> => {\n await telemetry.trackCommand('format', () => actions.format(options));\n};\n\nconst seedAction = async (options: Parameters<typeof actions.seed>[0], args: string[]): Promise<void> => {\n await telemetry.trackCommand('db seed', () => actions.seed(options, args));\n};\n\nconst proxyAction = async (options: Parameters<typeof actions.proxy>[0]): Promise<void> => {\n await telemetry.trackCommand('proxy', () => actions.proxy(options));\n};\n\nfunction createProgram() {\n const program = new Command('zen')\n .alias('zenstack')\n .helpOption('-h, --help', 'Show this help message')\n .version(getVersion()!, '-v --version', 'Show CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ',\n )} ZenStack is the modern data layer for TypeScript apps.\\n\\nDocumentation: https://zenstack.dev/docs`,\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option(\n '--schema <file>',\n `schema file (with extension ${schemaExtensions}). Defaults to \"zenstack/schema.zmodel\" unless specified in package.json.`,\n );\n\n const noVersionCheckOption = new Option('--no-version-check', 'do not check for new version');\n\n program\n .command('generate')\n .description('Run code generation plugins')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .addOption(new Option('-o, --output <path>', 'default output directory for code generation'))\n .addOption(new Option('-w, --watch', 'enable watch mode').default(false))\n .addOption(new Option('--lite', 'also generate a lite version of schema without attributes').default(false))\n .addOption(new Option('--lite-only', 'only generate lite version of schema without attributes').default(false))\n .addOption(new Option('--silent', 'suppress all output except errors').default(false))\n .action(generateAction);\n\n const migrateCommand = program.command('migrate').description('Run database schema migration related tasks.');\n const migrationsOption = new Option('--migrations <path>', 'path that contains the \"migrations\" directory');\n\n migrateCommand\n .command('dev')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\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 .addOption(new Option('--skip-seed', 'skip seeding the database after reset'))\n .addOption(noVersionCheckOption)\n .description('Reset your database and apply all migrations, all data will be lost')\n .addHelpText(\n 'after',\n '\\nIf there is a seed script defined in package.json, it will be run after the reset. Use --skip-seed to skip it.',\n )\n .action((options) => migrateAction('reset', options));\n\n migrateCommand\n .command('deploy')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\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(noVersionCheckOption)\n .addOption(migrationsOption)\n .description('Check the status of your database migrations')\n .action((options) => migrateAction('status', options));\n\n migrateCommand\n .command('resolve')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .addOption(migrationsOption)\n .addOption(new Option('--applied <migration>', 'record a specific migration as applied'))\n .addOption(new Option('--rolled-back <migration>', 'record a specific migration as rolled back'))\n .description('Resolve issues with database migrations in deployment databases')\n .action((options) => migrateAction('resolve', 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(noVersionCheckOption)\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 dbCommand\n .command('pull')\n .description('Introspect your database.')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .addOption(\n new Option(\n '-o, --output <path>',\n 'set custom output path for the introspected schema. If a file path is provided, all schemas are merged into that single file. If a directory path is provided, files are written to the directory and imports are kept.',\n ),\n )\n .addOption(\n new Option('--model-casing <pascal|camel|snake|none>', 'set the casing of generated models').default(\n 'pascal',\n ),\n )\n .addOption(\n new Option('--field-casing <pascal|camel|snake|none>', 'set the casing of generated fields').default(\n 'camel',\n ),\n )\n .addOption(\n new Option('--always-map', 'always add @map and @@map attributes to models and fields').default(false),\n )\n .addOption(\n new Option('--quote <double|single>', 'set the quote style of generated schema files').default('single'),\n )\n .addOption(new Option('--indent <number>', 'set the indentation of the generated schema files').default(4).argParser(parseInt))\n .action((options) => dbAction('pull', options));\n\n dbCommand\n .command('seed')\n .description('Seed the database')\n .allowExcessArguments(true)\n .addHelpText(\n 'after',\n `\nSeed script is configured under the \"zenstack.seed\" field in package.json.\nE.g.:\n{\n \"zenstack\": {\n \"seed\": \"ts-node ./zenstack/seed.ts\"\n }\n}\n\nArguments following -- are passed to the seed script. E.g.: \"zen db seed -- --users 10\"`,\n )\n .addOption(noVersionCheckOption)\n .action((options, command) => seedAction(options, command.args));\n\n program\n .command('info')\n .description('Get information of installed ZenStack packages')\n .argument('[path]', 'project path', '.')\n .addOption(noVersionCheckOption)\n .action(infoAction);\n\n program\n .command('init')\n .description('Initialize an existing project for ZenStack')\n .argument('[path]', 'project path', '.')\n .addOption(noVersionCheckOption)\n .action(initAction);\n\n program\n .command('check')\n .description('Check a ZModel schema for syntax or semantic errors')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .action(checkAction);\n\n program\n .command('format')\n .description('Format a ZModel schema file')\n .addOption(schemaOption)\n .addOption(noVersionCheckOption)\n .action(formatAction);\n\n program\n .command('proxy')\n .alias('studio')\n .description('Start the ZenStack proxy server')\n .addOption(schemaOption)\n .addOption(new Option('-p, --port <port>', 'port to run the proxy server on').default(2311))\n .addOption(new Option('-o, --output <path>', 'output directory for `zen generate` command'))\n .addOption(new Option('-d, --databaseUrl <url>', 'database connection URL'))\n .addOption(new Option('-l, --logLevel <level...>', 'Query log levels (e.g., query, error)'))\n .addOption(noVersionCheckOption)\n .action(proxyAction);\n\n program.addHelpCommand('help [command]', 'Display help for a command');\n\n program.hook('preAction', async (_thisCommand, actionCommand) => {\n if (actionCommand.getOptionValue('versionCheck') !== false) {\n await checkNewVersion();\n }\n });\n\n return program;\n}\n\nasync function main() {\n let exitCode = 0;\n\n const program = createProgram();\n program.exitOverride();\n\n try {\n await telemetry.trackCli(async () => {\n await program.parseAsync();\n });\n } catch (e) {\n if (e instanceof CommanderError) {\n // ignore\n exitCode = e.exitCode;\n } else if (e instanceof CliError) {\n // log\n console.error(colors.red(e.message));\n exitCode = 1;\n } else {\n console.error(colors.red(`Unhandled error: ${e}`));\n exitCode = 1;\n }\n }\n\n if (\n (program.args.includes('generate') && (program.args.includes('-w') || program.args.includes('--watch'))) ||\n ['proxy', 'studio'].some((cmd) => program.args.includes(cmd))\n ) {\n // A \"hack\" way to prevent the process from terminating because we don't want to stop it.\n return;\n }\n\n if (telemetry.isTracking) {\n // give telemetry a chance to send events before exit\n setTimeout(() => {\n process.exit(exitCode);\n }, 200);\n } else {\n process.exit(exitCode);\n }\n}\n\nmain();\n","import colors from 'colors';\nimport { getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n};\n\n/**\n * CLI action for checking a schema's validity.\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n\n try {\n await loadSchemaDocument(schemaFile);\n console.log(colors.green('✓ Schema validation completed successfully.'));\n } catch (error) {\n console.error(colors.red('✗ Schema validation failed.'));\n // Re-throw to maintain CLI exit code behavior\n throw error;\n }\n}\n","import { type ZModelServices, loadDocument } from '@zenstackhq/language';\nimport { type Model, isDataSource } from '@zenstackhq/language/ast';\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 if (fs.statSync(pkgJsonConfig.schema).isDirectory()) {\n const schemaPath = path.join(pkgJsonConfig.schema, 'schema.zmodel');\n if (!fs.existsSync(schemaPath)) {\n throw new CliError(`Schema file not found: ${schemaPath}`);\n }\n return schemaPath;\n } else {\n return pkgJsonConfig.schema;\n }\n }\n\n if (fs.existsSync('./schema.zmodel')) {\n return './schema.zmodel';\n } else if (fs.existsSync('./zenstack/schema.zmodel')) {\n return './zenstack/schema.zmodel';\n } else {\n throw new CliError(\n 'Schema file not found in default locations (\"./schema.zmodel\" or \"./zenstack/schema.zmodel\").',\n );\n }\n}\n\nexport async function loadSchemaDocument(\n schemaFile: string,\n opts?: { mergeImports?: boolean; returnServices?: false },\n): Promise<Model>;\nexport async function loadSchemaDocument(\n schemaFile: string,\n opts: { returnServices: true; mergeImports?: boolean },\n): Promise<{ model: Model; services: ZModelServices }>;\nexport async function loadSchemaDocument(\n schemaFile: string,\n opts: { returnServices?: boolean; mergeImports?: boolean } = {},\n) {\n const returnServices = opts.returnServices ?? false;\n const mergeImports = opts.mergeImports ?? true;\n\n const loadResult = await loadDocument(schemaFile, [], mergeImports);\n if (!loadResult.success) {\n loadResult.errors.forEach((err) => {\n console.error(colors.red(err));\n });\n throw new CliError('Schema contains errors. See above for details.');\n }\n loadResult.warnings.forEach((warn) => {\n console.warn(colors.yellow(warn));\n });\n\n if (returnServices) return { model: loadResult.model, services: loadResult.services };\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 if (!model.declarations.some(isDataSource)) {\n throw new CliError('Schema must define a datasource');\n }\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; seed: string | undefined } = {\n schema: undefined,\n output: undefined,\n seed: undefined,\n };\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 =\n pkgJson.zenstack.schema && typeof pkgJson.zenstack.schema === 'string'\n ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema)\n : undefined;\n result.output =\n pkgJson.zenstack.output && typeof pkgJson.zenstack.output === 'string'\n ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output)\n : undefined;\n result.seed =\n typeof pkgJson.zenstack.seed === 'string' && pkgJson.zenstack.seed ? pkgJson.zenstack.seed : undefined;\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\nexport async function requireDataSourceUrl(schemaFile: string) {\n const zmodel = await loadSchemaDocument(schemaFile);\n const dataSource = zmodel.declarations.find(isDataSource);\n if (!dataSource?.fields.some((f) => f.name === 'url')) {\n throw new CliError('The schema\\'s \"datasource\" must have a \"url\" field to use this command.');\n }\n}\n\nexport function getOutputPath(options: { output?: string }, 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","/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n","import { formatDocument, ZModelCodeGenerator } from '@zenstackhq/language';\nimport { DataModel, Enum, type Model } from '@zenstackhq/language/ast';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport ora from 'ora';\nimport { execPrisma } from '../utils/exec-utils';\nimport {\n generateTempPrismaSchema,\n getSchemaFile,\n handleSubProcessError,\n loadSchemaDocument,\n requireDataSourceUrl,\n} from './action-utils';\nimport { syncEnums, syncRelation, syncTable, type Relation } from './pull';\nimport { providers as pullProviders } from './pull/provider';\nimport { getDatasource, getDbName, getRelationFieldsKey, getRelationFkName } from './pull/utils';\nimport type { DataSourceProviderType } from '@zenstackhq/schema';\nimport { CliError } from '../cli-error';\n\ntype PushOptions = {\n schema?: string;\n acceptDataLoss?: boolean;\n forceReset?: boolean;\n};\n\nexport type PullOptions = {\n schema?: string;\n output?: string;\n modelCasing: 'pascal' | 'camel' | 'snake' | 'none';\n fieldCasing: 'pascal' | 'camel' | 'snake' | 'none';\n alwaysMap: boolean;\n quote: 'single' | 'double';\n indent: number;\n};\n\n/**\n * CLI action for db related commands\n */\nexport async function run(command: string, options: any) {\n switch (command) {\n case 'push':\n await runPush(options);\n break;\n case 'pull':\n await runPull(options);\n break;\n }\n}\n\nasync function runPush(options: PushOptions) {\n const schemaFile = getSchemaFile(options.schema);\n\n // validate datasource url exists\n await requireDataSourceUrl(schemaFile);\n\n // generate a temp prisma schema file\n const prismaSchemaFile = await generateTempPrismaSchema(schemaFile);\n\n try {\n // run prisma db push\n const cmd = [\n '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 execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nasync function runPull(options: PullOptions) {\n const spinner = ora();\n try {\n const schemaFile = getSchemaFile(options.schema);\n\n // Determine early if `--out` is a single file output (combined schema) or a directory export.\n const outPath = options.output ? path.resolve(options.output) : undefined;\n const treatAsFile =\n !!outPath &&\n ((fs.existsSync(outPath) && fs.lstatSync(outPath).isFile()) || path.extname(outPath) !== '');\n\n const { model, services } = await loadSchemaDocument(schemaFile, {\n returnServices: true,\n mergeImports: treatAsFile,\n });\n\n const SUPPORTED_PROVIDERS = Object.keys(pullProviders) as DataSourceProviderType[];\n const datasource = getDatasource(model);\n\n if (!SUPPORTED_PROVIDERS.includes(datasource.provider)) {\n throw new CliError(`Unsupported datasource provider: ${datasource.provider}`);\n }\n\n const provider = pullProviders[datasource.provider];\n\n if (!provider) {\n throw new CliError(`No introspection provider found for: ${datasource.provider}`);\n }\n\n spinner.start('Introspecting database...');\n const { enums, tables } = await provider.introspect(datasource.url, { schemas: datasource.allSchemas, modelCasing: options.modelCasing });\n spinner.succeed('Database introspected');\n\n console.log(colors.blue('Syncing schema...'));\n\n const newModel: Model = {\n $type: 'Model',\n $container: undefined,\n $containerProperty: undefined,\n $containerIndex: undefined,\n declarations: [...model.declarations.filter((d) => ['DataSource'].includes(d.$type))],\n imports: model.imports,\n };\n\n syncEnums({\n dbEnums: enums,\n model: newModel,\n services,\n options,\n defaultSchema: datasource.defaultSchema,\n oldModel: model,\n provider,\n });\n\n const resolvedRelations: Relation[] = [];\n for (const table of tables) {\n const relations = syncTable({\n table,\n model: newModel,\n provider,\n services,\n options,\n defaultSchema: datasource.defaultSchema,\n oldModel: model,\n });\n resolvedRelations.push(...relations);\n }\n // sync relation fields\n for (const relation of resolvedRelations) {\n const similarRelations = resolvedRelations.filter((rr) => {\n return (\n rr !== relation &&\n ((rr.schema === relation.schema &&\n rr.table === relation.table &&\n rr.references.schema === relation.references.schema &&\n rr.references.table === relation.references.table) ||\n (rr.schema === relation.references.schema &&\n rr.columns[0] === relation.references.columns[0] &&\n rr.references.schema === relation.schema &&\n rr.references.table === relation.table))\n );\n }).length;\n const selfRelation =\n relation.references.schema === relation.schema && relation.references.table === relation.table;\n syncRelation({\n model: newModel,\n relation,\n services,\n options,\n selfRelation,\n similarRelations: similarRelations,\n });\n }\n\n console.log(colors.blue('Schema synced'));\n\n const baseDir = path.dirname(path.resolve(schemaFile));\n const baseDirUrlPath = new URL(`file://${baseDir}`).pathname;\n const docs = services.shared.workspace.LangiumDocuments.all\n .filter(({ uri }) => uri.path.toLowerCase().startsWith(baseDirUrlPath.toLowerCase()))\n .toArray();\n const docsSet = new Set(docs.map((d) => d.uri.toString()));\n\n console.log(colors.bold('\\nApplying changes to ZModel...'));\n\n const deletedModels: string[] = [];\n const deletedEnums: string[] = [];\n const addedModels: string[] = [];\n const addedEnums: string[] = [];\n // Hierarchical change tracking: model -> field changes -> attribute changes\n type ModelChanges = {\n addedFields: string[];\n deletedFields: string[];\n updatedFields: string[];\n addedAttributes: string[];\n deletedAttributes: string[];\n updatedAttributes: string[];\n };\n const modelChanges = new Map<string, ModelChanges>();\n\n const getModelChanges = (modelName: string): ModelChanges => {\n if (!modelChanges.has(modelName)) {\n modelChanges.set(modelName, {\n addedFields: [],\n deletedFields: [],\n updatedFields: [],\n addedAttributes: [],\n deletedAttributes: [],\n updatedAttributes: [],\n });\n }\n return modelChanges.get(modelName)!;\n };\n\n // Delete models\n services.shared.workspace.IndexManager.allElements('DataModel', docsSet)\n .filter(\n (declaration) =>\n !newModel.declarations.find((d) => getDbName(d) === getDbName(declaration.node as any)),\n )\n .forEach((decl) => {\n const model = decl.node!.$container as Model;\n const index = model.declarations.findIndex((d) => d === decl.node);\n model.declarations.splice(index, 1);\n deletedModels.push(colors.red(`- Model ${decl.name} deleted`));\n });\n\n // Delete Enums\n if (provider.isSupportedFeature('NativeEnum'))\n services.shared.workspace.IndexManager.allElements('Enum', docsSet)\n .filter(\n (declaration) =>\n !newModel.declarations.find((d) => getDbName(d) === getDbName(declaration.node as any)),\n )\n .forEach((decl) => {\n const model = decl.node!.$container as Model;\n const index = model.declarations.findIndex((d) => d === decl.node);\n model.declarations.splice(index, 1);\n deletedEnums.push(colors.red(`- Enum ${decl.name} deleted`));\n });\n // Add/update models and their fields\n newModel.declarations\n .filter((d) => [DataModel, Enum].includes(d.$type))\n .forEach((_declaration) => {\n const newDataModel = _declaration as DataModel | Enum;\n const declarations = services.shared.workspace.IndexManager.allElements(newDataModel.$type, docsSet).toArray();\n const originalDataModel = declarations.find((d) => getDbName(d.node as any) === getDbName(newDataModel))\n ?.node as DataModel | Enum | undefined;\n if (!originalDataModel) {\n\n if (newDataModel.$type === 'DataModel') {\n addedModels.push(colors.green(`+ Model ${newDataModel.name} added`));\n } else if (newDataModel.$type === 'Enum') {\n addedEnums.push(colors.green(`+ Enum ${newDataModel.name} added`));\n }\n\n model.declarations.push(newDataModel);\n (newDataModel as any).$container = model;\n newDataModel.fields.forEach((f) => {\n if (f.$type === 'DataField' && f.type.reference?.ref) {\n const ref = declarations.find(\n (d) => getDbName(d.node as any) === getDbName(f.type.reference!.ref as any),\n )?.node;\n if (ref && f.type.reference) {\n // Replace the entire reference object — Langium References\n // from parsed documents expose `ref` as a getter-only property.\n (f.type as any).reference = {\n ref,\n $refText: (ref as any).name ?? (f.type.reference as any).$refText,\n };\n }\n }\n });\n return;\n }\n\n newDataModel.fields.forEach((f) => {\n // Prioritized matching: exact db name > relation fields key > relation FK name > type reference\n let originalFields = originalDataModel.fields.filter((d) => getDbName(d) === getDbName(f));\n\n // If this is a back-reference relation field (has @relation but no `fields` arg), silently skip\n const isRelationField =\n f.$type === 'DataField' && !!(f as any).attributes?.some((a: any) => a?.decl?.ref?.name === '@relation');\n if (originalFields.length === 0 && isRelationField && !getRelationFieldsKey(f as any)) {\n return;\n }\n\n if (originalFields.length === 0) {\n // Try matching by relation fields key (the `fields` attribute in @relation)\n // This matches relation fields by their FK field references\n const newFieldsKey = getRelationFieldsKey(f as any);\n if (newFieldsKey) {\n originalFields = originalDataModel.fields.filter(\n (d) => getRelationFieldsKey(d as any) === newFieldsKey,\n );\n }\n }\n\n if (originalFields.length === 0) {\n // Try matching by relation FK name (the `map` attribute in @relation)\n originalFields = originalDataModel.fields.filter(\n (d) =>\n getRelationFkName(d as any) === getRelationFkName(f as any) &&\n !!getRelationFkName(d as any) &&\n !!getRelationFkName(f as any),\n );\n }\n\n if (originalFields.length === 0) {\n // Try matching by type reference\n // We need this because for relations that don't have @relation, we can only check if the original exists by the field type.\n // Yes, in this case it can potentially result in multiple original fields, but we only want to ensure that at least one relation exists.\n // In the future, we might implement some logic to detect how many of these types of relations we need and add/remove fields based on this.\n originalFields = originalDataModel.fields.filter(\n (d) =>\n f.$type === 'DataField' &&\n d.$type === 'DataField' &&\n f.type.reference?.ref &&\n d.type.reference?.ref &&\n getDbName(f.type.reference.ref) === getDbName(d.type.reference.ref),\n );\n }\n\n if (originalFields.length > 1) {\n // If this is a back-reference relation field (no `fields` attribute),\n // silently skip when there are multiple potential matches\n const isBackReferenceField = !getRelationFieldsKey(f as any);\n if (!isBackReferenceField) {\n console.warn(\n colors.yellow(\n `Found more original fields, need to tweak the search algorithm. ${originalDataModel.name}->[${originalFields.map((of) => of.name).join(', ')}](${f.name})`,\n ),\n );\n }\n return;\n }\n const originalField = originalFields.at(0);\n\n // Update existing field if type, optionality, or array flag changed\n if (originalField && f.$type === 'DataField' && originalField.$type === 'DataField') {\n const newType = f.type;\n const oldType = originalField.type;\n const fieldUpdates: string[] = [];\n\n // Check and update builtin type (e.g., String -> Int)\n // Skip if old type is an Enum reference and provider doesn't support native enums\n const isOldTypeEnumWithoutNativeSupport =\n oldType.reference?.ref?.$type === 'Enum' && !provider.isSupportedFeature('NativeEnum');\n if (newType.type && oldType.type !== newType.type && !isOldTypeEnumWithoutNativeSupport) {\n fieldUpdates.push(`type: ${oldType.type} -> ${newType.type}`);\n (oldType as any).type = newType.type;\n }\n\n // Check and update type reference (e.g., User -> Profile)\n if (newType.reference?.ref && oldType.reference?.ref) {\n const newRefName = getDbName(newType.reference.ref);\n const oldRefName = getDbName(oldType.reference.ref);\n if (newRefName !== oldRefName) {\n fieldUpdates.push(`reference: ${oldType.reference.$refText} -> ${newType.reference.$refText}`);\n // Replace the entire reference object — Langium References\n // from parsed documents expose `ref` as a getter-only property.\n (oldType as any).reference = {\n ref: newType.reference.ref,\n $refText: newType.reference.$refText,\n };\n }\n } else if (newType.reference?.ref && !oldType.reference) {\n // Changed from builtin to reference type\n fieldUpdates.push(`type: ${oldType.type} -> ${newType.reference.$refText}`);\n (oldType as any).reference = newType.reference;\n (oldType as any).type = undefined;\n } else if (!newType.reference && oldType.reference?.ref && newType.type) {\n // Changed from reference to builtin type\n // Skip if old type is an Enum and provider doesn't support native enums (e.g., SQLite stores enums as strings)\n const isEnumWithoutNativeSupport =\n oldType.reference.ref.$type === 'Enum' && !provider.isSupportedFeature('NativeEnum');\n if (!isEnumWithoutNativeSupport) {\n fieldUpdates.push(`type: ${oldType.reference.$refText} -> ${newType.type}`);\n (oldType as any).type = newType.type;\n (oldType as any).reference = undefined;\n }\n }\n\n // Check and update optionality (e.g., String -> String?)\n if (!!newType.optional !== !!oldType.optional) {\n fieldUpdates.push(`optional: ${!!oldType.optional} -> ${!!newType.optional}`);\n (oldType as any).optional = newType.optional;\n }\n\n // Check and update array flag (e.g., String -> String[])\n if (!!newType.array !== !!oldType.array) {\n fieldUpdates.push(`array: ${!!oldType.array} -> ${!!newType.array}`);\n (oldType as any).array = newType.array;\n }\n\n if (fieldUpdates.length > 0) {\n getModelChanges(originalDataModel.name).updatedFields.push(\n colors.yellow(`~ ${originalField.name} (${fieldUpdates.join(', ')})`),\n );\n }\n\n // Update @default attribute arguments if changed\n const newDefaultAttr = f.attributes.find((a) => a.decl.$refText === '@default');\n const oldDefaultAttr = originalField.attributes.find((a) => a.decl.$refText === '@default');\n if (newDefaultAttr && oldDefaultAttr) {\n // Compare attribute arguments by serializing them (avoid circular refs with $type fallback)\n const serializeArgs = (args: any[]) =>\n args.map((arg) => {\n if (arg.value?.$type === 'StringLiteral') return `\"${arg.value.value}\"`;\n if (arg.value?.$type === 'NumberLiteral') return String(arg.value.value);\n if (arg.value?.$type === 'BooleanLiteral') return String(arg.value.value);\n if (arg.value?.$type === 'InvocationExpr') return arg.value.function?.$refText ?? '';\n if (arg.value?.$type === 'ReferenceExpr') return arg.value.target?.$refText ?? '';\n if (arg.value?.$type === 'ArrayExpr') {\n return `[${(arg.value.items ?? []).map((item: any) => {\n if (item.$type === 'ReferenceExpr') return item.target?.$refText ?? '';\n return item.$type ?? 'unknown';\n }).join(',')}]`;\n }\n // Fallback: use $type to avoid circular reference issues\n return arg.value?.$type ?? 'unknown';\n }).join(',');\n\n const newArgsStr = serializeArgs(newDefaultAttr.args ?? []);\n const oldArgsStr = serializeArgs(oldDefaultAttr.args ?? []);\n\n if (newArgsStr !== oldArgsStr) {\n // Replace old @default arguments with new ones\n (oldDefaultAttr as any).args = newDefaultAttr.args.map((arg) => ({\n ...arg,\n $container: oldDefaultAttr,\n }));\n getModelChanges(originalDataModel.name).updatedAttributes.push(\n colors.yellow(`~ @default on ${originalDataModel.name}.${originalField.name}`),\n );\n }\n }\n }\n\n if (!originalField) {\n getModelChanges(originalDataModel.name).addedFields.push(colors.green(`+ ${f.name}`));\n (f as any).$container = originalDataModel;\n originalDataModel.fields.push(f as any);\n if (f.$type === 'DataField' && f.type.reference?.ref) {\n const ref = declarations.find(\n (d) => getDbName(d.node as any) === getDbName(f.type.reference!.ref as any),\n )?.node as DataModel | undefined;\n if (ref) {\n // Replace the entire reference object — Langium References\n // from parsed documents expose `ref` as a getter-only property.\n (f.type as any).reference = {\n ref,\n $refText: ref.name ?? (f.type.reference as any).$refText,\n };\n }\n }\n return;\n }\n // Track deleted attributes (in original but not in new)\n originalField.attributes\n .filter(\n (attr) =>\n !f.attributes.find((d) => d.decl.$refText === attr.decl.$refText) &&\n !['@map', '@@map', '@default', '@updatedAt'].includes(attr.decl.$refText),\n )\n .forEach((attr) => {\n const field = attr.$container;\n const index = field.attributes.findIndex((d) => d === attr);\n field.attributes.splice(index, 1);\n getModelChanges(originalDataModel.name).deletedAttributes.push(\n colors.yellow(`- ${attr.decl.$refText} from field: ${originalDataModel.name}.${field.name}`),\n );\n });\n\n // Track added attributes (in new but not in original)\n f.attributes\n .filter(\n (attr) =>\n !originalField.attributes.find((d) => d.decl.$refText === attr.decl.$refText) &&\n !['@map', '@@map', '@default', '@updatedAt'].includes(attr.decl.$refText),\n )\n .forEach((attr) => {\n // attach the new attribute to the original field\n const cloned = { ...attr, $container: originalField } as typeof attr;\n originalField.attributes.push(cloned);\n getModelChanges(originalDataModel.name).addedAttributes.push(\n colors.green(`+ ${attr.decl.$refText} to field: ${originalDataModel.name}.${f.name}`),\n );\n });\n });\n originalDataModel.fields\n .filter((f) => {\n // Prioritized matching: exact db name > relation fields key > relation FK name > type reference\n const matchByDbName = newDataModel.fields.find((d) => getDbName(d) === getDbName(f));\n if (matchByDbName) return false;\n\n // Try matching by relation fields key (the `fields` attribute in @relation)\n const originalFieldsKey = getRelationFieldsKey(f as any);\n if (originalFieldsKey) {\n const matchByFieldsKey = newDataModel.fields.find(\n (d) => getRelationFieldsKey(d as any) === originalFieldsKey,\n );\n if (matchByFieldsKey) return false;\n }\n\n const matchByFkName = newDataModel.fields.find(\n (d) =>\n getRelationFkName(d as any) === getRelationFkName(f as any) &&\n !!getRelationFkName(d as any) &&\n !!getRelationFkName(f as any),\n );\n if (matchByFkName) return false;\n\n const matchByTypeRef = newDataModel.fields.find(\n (d) =>\n f.$type === 'DataField' &&\n d.$type === 'DataField' &&\n f.type.reference?.ref &&\n d.type.reference?.ref &&\n getDbName(f.type.reference.ref) === getDbName(d.type.reference.ref),\n );\n return !matchByTypeRef;\n })\n .forEach((f) => {\n const _model = f.$container;\n const index = _model.fields.findIndex((d) => d === f);\n _model.fields.splice(index, 1);\n getModelChanges(_model.name).deletedFields.push(colors.red(`- ${f.name}`));\n });\n });\n\n if (deletedModels.length > 0) {\n console.log(colors.bold('\\nDeleted Models:'));\n deletedModels.forEach((msg) => {\n console.log(msg);\n });\n }\n\n if (deletedEnums.length > 0) {\n console.log(colors.bold('\\nDeleted Enums:'));\n deletedEnums.forEach((msg) => {\n console.log(msg);\n });\n }\n\n if (addedModels.length > 0) {\n console.log(colors.bold('\\nAdded Models:'));\n addedModels.forEach((msg) => {\n console.log(msg);\n });\n }\n\n if (addedEnums.length > 0) {\n console.log(colors.bold('\\nAdded Enums:'));\n addedEnums.forEach((msg) => {\n console.log(msg);\n });\n }\n\n // Print hierarchical model changes\n if (modelChanges.size > 0) {\n console.log(colors.bold('\\nModel Changes:'));\n modelChanges.forEach((changes, modelName) => {\n const hasChanges =\n changes.addedFields.length > 0 ||\n changes.deletedFields.length > 0 ||\n changes.updatedFields.length > 0 ||\n changes.addedAttributes.length > 0 ||\n changes.deletedAttributes.length > 0 ||\n changes.updatedAttributes.length > 0;\n\n if (hasChanges) {\n console.log(colors.cyan(` ${modelName}:`));\n\n if (changes.addedFields.length > 0) {\n console.log(colors.gray(' Added Fields:'));\n changes.addedFields.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n\n if (changes.deletedFields.length > 0) {\n console.log(colors.gray(' Deleted Fields:'));\n changes.deletedFields.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n\n if (changes.updatedFields.length > 0) {\n console.log(colors.gray(' Updated Fields:'));\n changes.updatedFields.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n\n if (changes.addedAttributes.length > 0) {\n console.log(colors.gray(' Added Attributes:'));\n changes.addedAttributes.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n\n if (changes.deletedAttributes.length > 0) {\n console.log(colors.gray(' Deleted Attributes:'));\n changes.deletedAttributes.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n\n if (changes.updatedAttributes.length > 0) {\n console.log(colors.gray(' Updated Attributes:'));\n changes.updatedAttributes.forEach((msg) => {\n console.log(` ${msg}`);\n });\n }\n }\n });\n }\n\n const generator = new ZModelCodeGenerator({\n quote: options.quote,\n indent: options.indent,\n });\n\n if (options.output) {\n if (treatAsFile) {\n const zmodelSchema = await formatDocument(generator.generate(newModel));\n console.log(colors.blue(`Writing to ${outPath}`));\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, zmodelSchema);\n } else {\n // Otherwise treat `--out` as a directory path. Create it if needed.\n fs.mkdirSync(outPath!, { recursive: true });\n\n // Preserve the directory structure relative to the schema file location (options.schema base).\n const baseDir = path.dirname(path.resolve(schemaFile));\n\n for (const {\n uri,\n parseResult: { value: documentModel },\n } of docs) {\n const zmodelSchema = await formatDocument(generator.generate(documentModel));\n\n // Map input file path -> output file path under `--out`\n const relPath = path.relative(baseDir, uri.fsPath);\n const targetFile = path.join(outPath!, relPath);\n\n fs.mkdirSync(path.dirname(targetFile), { recursive: true });\n console.log(colors.blue(`Writing to ${targetFile}`));\n fs.writeFileSync(targetFile, zmodelSchema);\n }\n }\n } else {\n for (const {\n uri,\n parseResult: { value: documentModel },\n } of docs) {\n const zmodelSchema = await formatDocument(generator.generate(documentModel));\n console.log(colors.blue(`Writing to ${path.relative(process.cwd(), uri.fsPath).replace(/\\\\/g, '/')}`));\n fs.writeFileSync(uri.fsPath, zmodelSchema);\n }\n }\n\n console.log(colors.green.bold('\\nPull completed successfully!'));\n } catch (error) {\n spinner.fail('Pull failed');\n console.error(error);\n throw error;\n }\n}\n","import { execSync as _exec, type ExecSyncOptions } from 'child_process';\nimport { fileURLToPath } from 'url';\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\n/**\n * Utility for running prisma commands\n */\nexport function execPrisma(args: string, options?: Omit<ExecSyncOptions, 'env'> & { env?: Record<string, string> }) {\n let prismaPath: string | undefined;\n try {\n if (typeof import.meta.resolve === 'function') {\n // esm\n prismaPath = fileURLToPath(import.meta.resolve('prisma/build/index.js'));\n } else {\n // cjs\n prismaPath = require.resolve('prisma/build/index.js');\n }\n } catch {\n // ignore and fallback\n }\n\n const _options = {\n ...options,\n env: {\n ...options?.env,\n PRISMA_HIDE_UPDATE_MESSAGE: '1',\n },\n };\n\n if (!prismaPath) {\n // fallback to npx/bunx execute\n execPackage(`prisma ${args}`, _options);\n return;\n }\n\n execSync(`node \"${prismaPath}\" ${args}`, _options);\n}\n","import type { ZModelServices } from '@zenstackhq/language';\nimport colors from 'colors';\nimport {\n isEnum,\n type DataField,\n type DataModel,\n type Enum,\n type Model,\n} from '@zenstackhq/language/ast';\nimport {\n DataFieldAttributeFactory,\n DataFieldFactory,\n DataModelFactory,\n EnumFactory,\n} from '@zenstackhq/language/factory';\nimport { AstUtils, type Reference, type AstNode, type CstNode } from 'langium';\nimport { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type { PullOptions } from '../db';\nimport type { Cascade, IntrospectedEnum, IntrospectedTable, IntrospectionProvider } from './provider';\nimport { getAttributeRef, getDbName, getEnumRef } from './utils';\nimport { resolveNameCasing } from './casing';\nimport { CliError } from '../../cli-error';\n\nexport function syncEnums({\n dbEnums,\n model,\n oldModel,\n provider,\n options,\n services,\n defaultSchema,\n}: {\n dbEnums: IntrospectedEnum[];\n model: Model;\n oldModel: Model;\n provider: IntrospectionProvider;\n services: ZModelServices;\n options: PullOptions;\n defaultSchema: string;\n}) {\n if (provider.isSupportedFeature('NativeEnum')) {\n for (const dbEnum of dbEnums) {\n const { modified, name } = resolveNameCasing(options.modelCasing, dbEnum.enum_type);\n if (modified) console.log(colors.gray(`Mapping enum ${dbEnum.enum_type} to ${name}`));\n const factory = new EnumFactory().setName(name);\n if (modified || options.alwaysMap)\n factory.addAttribute((builder) =>\n builder\n .setDecl(getAttributeRef('@@map', services))\n .addArg((argBuilder) => argBuilder.StringLiteral.setValue(dbEnum.enum_type)),\n );\n\n dbEnum.values.forEach((v) => {\n const { name, modified } = resolveNameCasing(options.fieldCasing, v);\n factory.addField((builder) => {\n builder.setName(name);\n if (modified || options.alwaysMap)\n builder.addAttribute((builder) =>\n builder\n .setDecl(getAttributeRef('@map', services))\n .addArg((argBuilder) => argBuilder.StringLiteral.setValue(v)),\n );\n\n return builder;\n });\n });\n\n if (dbEnum.schema_name && dbEnum.schema_name !== '' && dbEnum.schema_name !== defaultSchema) {\n factory.addAttribute((b) =>\n b\n .setDecl(getAttributeRef('@@schema', services))\n .addArg((a) => a.StringLiteral.setValue(dbEnum.schema_name)),\n );\n }\n\n model.declarations.push(factory.get({ $container: model }));\n }\n } else {\n // For providers that don't support native enums (e.g., SQLite), carry over\n // enum declarations from the existing schema as-is by deep-cloning the AST nodes.\n // A dummy buildReference is used since we don't need cross-reference resolution.\n const dummyBuildReference = (_node: AstNode, _property: string, _refNode: CstNode | undefined, refText: string): Reference<AstNode> =>\n ({ $refText: refText }) as Reference<AstNode>;\n\n oldModel.declarations\n .filter((d) => isEnum(d))\n .forEach((d) => {\n const copy = AstUtils.copyAstNode(d, dummyBuildReference);\n (copy as { $container: unknown }).$container = model;\n model.declarations.push(copy);\n });\n }\n}\n\nexport type Relation = {\n schema: string;\n table: string;\n columns: string[];\n type: 'one' | 'many';\n fk_name: string;\n foreign_key_on_update: Cascade;\n foreign_key_on_delete: Cascade;\n nullable: boolean;\n references: {\n schema: string | null;\n table: string | null;\n columns: (string | null)[];\n type: 'one' | 'many';\n };\n};\n\nexport function syncTable({\n model,\n provider,\n table,\n services,\n options,\n defaultSchema,\n}: {\n table: IntrospectedTable;\n model: Model;\n oldModel: Model;\n provider: IntrospectionProvider;\n services: ZModelServices;\n options: PullOptions;\n defaultSchema: string;\n}) {\n const idAttribute = getAttributeRef('@id', services);\n const modelIdAttribute = getAttributeRef('@@id', services);\n const uniqueAttribute = getAttributeRef('@unique', services);\n const modelUniqueAttribute = getAttributeRef('@@unique', services);\n const fieldMapAttribute = getAttributeRef('@map', services);\n const tableMapAttribute = getAttributeRef('@@map', services);\n const modelindexAttribute = getAttributeRef('@@index', services);\n\n const relations: Relation[] = [];\n const { name, modified } = resolveNameCasing(options.modelCasing, table.name);\n const multiPk = table.columns.filter((c) => c.pk).length > 1;\n\n const modelFactory = new DataModelFactory().setName(name).setIsView(table.type === 'view');\n modelFactory.setContainer(model);\n\n if (modified || options.alwaysMap) {\n modelFactory.addAttribute((builder) =>\n builder.setDecl(tableMapAttribute).addArg((argBuilder) => argBuilder.StringLiteral.setValue(table.name)),\n );\n }\n // Group FK columns by constraint name to handle composite foreign keys.\n // Each FK constraint (identified by fk_name) may span multiple columns.\n const fkGroups = new Map<string, typeof table.columns>();\n table.columns.forEach((column) => {\n if (column.foreign_key_table && column.foreign_key_name) {\n const group = fkGroups.get(column.foreign_key_name) ?? [];\n group.push(column);\n fkGroups.set(column.foreign_key_name, group);\n }\n });\n\n for (const [fkName, fkColumns] of fkGroups) {\n const firstCol = fkColumns[0]!;\n // For single-column FKs, check if the column is the table's single-column PK (one-to-one)\n const isSingleColumnPk = fkColumns.length === 1 && !multiPk && firstCol.pk;\n // A single-column FK with unique constraint means one-to-one on the opposite side\n const isUniqueRelation = (fkColumns.length === 1 && firstCol.unique) || isSingleColumnPk;\n relations.push({\n schema: table.schema,\n table: table.name,\n columns: fkColumns.map((c) => c.name),\n type: 'one',\n fk_name: fkName,\n foreign_key_on_delete: firstCol.foreign_key_on_delete,\n foreign_key_on_update: firstCol.foreign_key_on_update,\n nullable: firstCol.nullable,\n references: {\n schema: firstCol.foreign_key_schema,\n table: firstCol.foreign_key_table,\n columns: fkColumns.map((c) => c.foreign_key_column),\n type: isUniqueRelation ? 'one' : 'many',\n },\n });\n }\n\n table.columns.forEach((column) => {\n\n const { name, modified } = resolveNameCasing(options.fieldCasing, column.name);\n\n const builtinType = provider.getBuiltinType(column.datatype);\n\n modelFactory.addField((builder) => {\n builder.setName(name);\n builder.setType((typeBuilder) => {\n typeBuilder.setArray(builtinType.isArray);\n // Array fields cannot be optional (Prisma/ZenStack limitation)\n typeBuilder.setOptional(builtinType.isArray ? false : column.nullable);\n\n if (column.computed) {\n // Generated/computed columns (e.g., GENERATED ALWAYS AS ... STORED/VIRTUAL)\n // are read-only and must be rendered as Unsupported(\"full type definition\").\n // The datatype contains the full DDL type definition including the expression.\n typeBuilder.setUnsupported((unsupportedBuilder) =>\n unsupportedBuilder.setValue((lt) => lt.StringLiteral.setValue(column.datatype)),\n );\n } else if (column.datatype === 'enum') {\n const ref = model.declarations.find((d) => isEnum(d) && getDbName(d) === column.datatype_name) as\n | Enum\n | undefined;\n\n if (!ref) {\n throw new CliError(`Enum ${column.datatype_name} not found`);\n }\n typeBuilder.setReference(ref);\n } else {\n if (builtinType.type !== 'Unsupported') {\n typeBuilder.setType(builtinType.type);\n } else {\n typeBuilder.setUnsupported((unsupportedBuilder) =>\n unsupportedBuilder.setValue((lt) => lt.StringLiteral.setValue(column.datatype)),\n );\n }\n }\n\n return typeBuilder;\n });\n\n if (column.pk && !multiPk) {\n builder.addAttribute((b) => b.setDecl(idAttribute));\n }\n\n // Add field-type-based attributes (e.g., @updatedAt for DateTime fields, @db.* attributes)\n const fieldAttrs = provider.getFieldAttributes({\n fieldName: column.name,\n fieldType: builtinType.type,\n datatype: column.datatype,\n length: column.length,\n precision: column.precision,\n services,\n });\n fieldAttrs.forEach(builder.addAttribute.bind(builder));\n\n if (column.default && !column.computed) {\n const defaultExprBuilder = provider.getDefaultValue({\n fieldType: builtinType.type,\n datatype: column.datatype,\n datatype_name: column.datatype_name,\n defaultValue: column.default,\n services,\n enums: model.declarations.filter((d) => d.$type === 'Enum') as Enum[],\n });\n if (defaultExprBuilder) {\n const defaultAttr = new DataFieldAttributeFactory()\n .setDecl(getAttributeRef('@default', services))\n .addArg(defaultExprBuilder);\n builder.addAttribute(defaultAttr);\n }\n }\n\n if (column.unique && !column.pk) {\n builder.addAttribute((b) => {\n b.setDecl(uniqueAttribute);\n // Only add map if the unique constraint name differs from default patterns\n // Default patterns: TableName_columnName_key (Prisma) or just columnName (MySQL)\n const isDefaultName = !column.unique_name\n || column.unique_name === `${table.name}_${column.name}_key`\n || column.unique_name === column.name;\n if (!isDefaultName) {\n b.addArg((ab) => ab.StringLiteral.setValue(column.unique_name!), 'map');\n }\n\n return b;\n });\n }\n if (modified || options.alwaysMap) {\n builder.addAttribute((ab) =>\n ab.setDecl(fieldMapAttribute).addArg((ab) => ab.StringLiteral.setValue(column.name)),\n );\n }\n\n return builder;\n });\n });\n\n const pkColumns = table.columns.filter((c) => c.pk).map((c) => c.name);\n if (multiPk) {\n modelFactory.addAttribute((builder) =>\n builder.setDecl(modelIdAttribute).addArg((argBuilder) => {\n const arrayExpr = argBuilder.ArrayExpr;\n pkColumns.forEach((c) => {\n const ref = modelFactory.node.fields.find((f) => getDbName(f) === c);\n if (!ref) {\n throw new CliError(`Field ${c} not found`);\n }\n arrayExpr.addItem((itemBuilder) => itemBuilder.ReferenceExpr.setTarget(ref));\n });\n return arrayExpr;\n }),\n );\n }\n\n const hasUniqueConstraint =\n table.columns.some((c) => c.unique || c.pk) ||\n table.indexes.some((i) => i.unique);\n if (!hasUniqueConstraint) {\n modelFactory.addAttribute((a) => a.setDecl(getAttributeRef('@@ignore', services)));\n modelFactory.addComment(\n '/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Zenstack Client.',\n );\n }\n\n // Sort indexes: unique indexes first, then other indexes\n const sortedIndexes = table.indexes.reverse().sort((a, b) => {\n if (a.unique && !b.unique) return -1;\n if (!a.unique && b.unique) return 1;\n return 0;\n });\n\n sortedIndexes.forEach((index) => {\n if (index.predicate) {\n //These constraints are not supported by Zenstack, because Zenstack currently does not fully support check constraints. Read more: https://pris.ly/d/check-constraints\n console.warn(\n colors.yellow(\n `These constraints are not supported by Zenstack. Read more: https://pris.ly/d/check-constraints\\n- Model: \"${table.name}\", constraint: \"${index.name}\"`,\n ),\n );\n return;\n }\n if (index.columns.find((c) => c.expression)) {\n console.warn(\n colors.yellow(\n `These constraints are not supported by Zenstack. Read more: https://pris.ly/d/check-constraints\\n- Model: \"${table.name}\", constraint: \"${index.name}\"`,\n ),\n );\n return;\n }\n\n // Skip PRIMARY key index (handled via @id or @@id)\n if (index.primary) {\n return;\n }\n\n // Skip single-column indexes that are already handled by @id or @unique on the field\n if (index.columns.length === 1 && (index.columns.find((c) => pkColumns.includes(c.name)) || index.unique)) {\n return;\n }\n\n modelFactory.addAttribute((builder) =>\n {\n const attr = builder\n .setDecl(index.unique ? modelUniqueAttribute : modelindexAttribute)\n .addArg((argBuilder) => {\n const arrayExpr = argBuilder.ArrayExpr;\n index.columns.forEach((c) => {\n const ref = modelFactory.node.fields.find((f) => getDbName(f) === c.name);\n if (!ref) {\n throw new CliError(`Column ${c.name} not found in model ${table.name}`);\n }\n arrayExpr.addItem((itemBuilder) => {\n const refExpr = itemBuilder.ReferenceExpr.setTarget(ref);\n if (c.order && c.order !== 'ASC')\n refExpr.addArg((ab) => ab.StringLiteral.setValue('DESC'), 'sort');\n\n return refExpr;\n });\n });\n return arrayExpr;\n });\n\n const suffix = index.unique ? '_key' : '_idx';\n\n if(index.name !== `${table.name}_${index.columns.map(c => c.name).join('_')}${suffix}`){\n attr.addArg((argBuilder) => argBuilder.StringLiteral.setValue(index.name), 'map');\n }\n\n return attr\n }\n\n );\n });\n if (table.schema && table.schema !== '' && table.schema !== defaultSchema) {\n modelFactory.addAttribute((b) =>\n b.setDecl(getAttributeRef('@@schema', services)).addArg((a) => a.StringLiteral.setValue(table.schema)),\n );\n }\n\n model.declarations.push(modelFactory.node);\n return relations;\n}\n\nexport function syncRelation({\n model,\n relation,\n services,\n options,\n selfRelation,\n similarRelations,\n}: {\n model: Model;\n relation: Relation;\n services: ZModelServices;\n options: PullOptions;\n //self included\n similarRelations: number;\n selfRelation: boolean;\n}) {\n const idAttribute = getAttributeRef('@id', services);\n const uniqueAttribute = getAttributeRef('@unique', services);\n const relationAttribute = getAttributeRef('@relation', services);\n const fieldMapAttribute = getAttributeRef('@map', services);\n const tableMapAttribute = getAttributeRef('@@map', services);\n\n const includeRelationName = selfRelation || similarRelations > 0;\n\n if (!idAttribute || !uniqueAttribute || !relationAttribute || !fieldMapAttribute || !tableMapAttribute) {\n throw new CliError('Cannot find required attributes in the model.');\n }\n\n const sourceModel = model.declarations.find((d) => d.$type === 'DataModel' && getDbName(d) === relation.table) as\n | DataModel\n | undefined;\n if (!sourceModel) return;\n\n // Resolve all source and target fields for the relation (supports composite FKs)\n const sourceFields: { field: DataField; index: number }[] = [];\n for (const colName of relation.columns) {\n const idx = sourceModel.fields.findIndex((f) => getDbName(f) === colName);\n const field = sourceModel.fields[idx] as DataField | undefined;\n if (!field) return;\n sourceFields.push({ field, index: idx });\n }\n\n const targetModel = model.declarations.find(\n (d) => d.$type === 'DataModel' && getDbName(d) === relation.references.table,\n ) as DataModel | undefined;\n if (!targetModel) return;\n\n const targetFields: DataField[] = [];\n for (const colName of relation.references.columns) {\n const field = targetModel.fields.find((f) => getDbName(f) === colName);\n if (!field) return;\n targetFields.push(field);\n }\n\n // Use the first source field for naming heuristics\n const firstSourceField = sourceFields[0]!.field;\n const firstSourceFieldId = sourceFields[0]!.index;\n const firstColumn = relation.columns[0]!;\n\n const fieldPrefix = /[0-9]/g.test(sourceModel.name.charAt(0)) ? '_' : '';\n\n const relationName = `${relation.table}${similarRelations > 0 ? `_${firstColumn}` : ''}To${relation.references.table}`;\n\n // Derive a relation field name from the FK scalar field: if the field ends with \"Id\",\n // strip the suffix and use the remainder (e.g., \"authorId\" -> \"author\").\n const sourceNameFromReference = firstSourceField.name.toLowerCase().endsWith('id') ? `${resolveNameCasing(options.fieldCasing, firstSourceField.name.slice(0, -2)).name}${relation.type === 'many'? 's' : ''}` : undefined;\n\n // Check if the derived name would clash with an existing field\n const sourceFieldFromReference = sourceModel.fields.find((f) => f.name === sourceNameFromReference);\n\n // Determine the relation field name:\n // - For ambiguous relations (multiple FKs to the same table), include the source column for disambiguation.\n // - Otherwise, prefer the name derived from the FK field (if no clash), falling back to the target model name.\n let { name: sourceFieldName } = resolveNameCasing(\n options.fieldCasing,\n similarRelations > 0\n ? `${fieldPrefix}${lowerCaseFirst(sourceModel.name)}_${firstColumn}`\n : `${(!sourceFieldFromReference? sourceNameFromReference : undefined) || lowerCaseFirst(resolveNameCasing(options.fieldCasing, targetModel.name).name)}${relation.type === 'many'? 's' : ''}`,\n );\n\n if (sourceModel.fields.find((f) => f.name === sourceFieldName)) {\n sourceFieldName = `${sourceFieldName}To${lowerCaseFirst(targetModel.name)}_${relation.references.columns[0]}`;\n }\n\n const sourceFieldFactory = new DataFieldFactory()\n .setContainer(sourceModel)\n .setName(sourceFieldName)\n .setType((tb) =>\n tb\n .setOptional(relation.nullable)\n .setArray(relation.type === 'many')\n .setReference(targetModel),\n );\n sourceFieldFactory.addAttribute((ab) => {\n ab.setDecl(relationAttribute);\n if (includeRelationName) ab.addArg((ab) => ab.StringLiteral.setValue(relationName));\n\n // Build fields array (all source FK columns)\n ab.addArg((ab) => {\n const arrayExpr = ab.ArrayExpr;\n for (const { field } of sourceFields) {\n arrayExpr.addItem((aeb) => aeb.ReferenceExpr.setTarget(field));\n }\n return arrayExpr;\n }, 'fields');\n\n // Build references array (all target columns)\n ab.addArg((ab) => {\n const arrayExpr = ab.ArrayExpr;\n for (const field of targetFields) {\n arrayExpr.addItem((aeb) => aeb.ReferenceExpr.setTarget(field));\n }\n return arrayExpr;\n }, 'references');\n\n // Prisma defaults: onDelete is SetNull for optional, Restrict for mandatory\n const onDeleteDefault = relation.nullable ? 'SET NULL' : 'RESTRICT';\n if (relation.foreign_key_on_delete && relation.foreign_key_on_delete !== onDeleteDefault) {\n const enumRef = getEnumRef('ReferentialAction', services);\n if (!enumRef) throw new CliError('ReferentialAction enum not found');\n const enumFieldRef = enumRef.fields.find(\n (f) => f.name.toLowerCase() === relation.foreign_key_on_delete!.replace(/ /g, '').toLowerCase(),\n );\n if (!enumFieldRef) throw new CliError(`ReferentialAction ${relation.foreign_key_on_delete} not found`);\n ab.addArg((a) => a.ReferenceExpr.setTarget(enumFieldRef), 'onDelete');\n }\n\n // Prisma default: onUpdate is Cascade\n if (relation.foreign_key_on_update && relation.foreign_key_on_update !== 'CASCADE') {\n const enumRef = getEnumRef('ReferentialAction', services);\n if (!enumRef) throw new CliError('ReferentialAction enum not found');\n const enumFieldRef = enumRef.fields.find(\n (f) => f.name.toLowerCase() === relation.foreign_key_on_update!.replace(/ /g, '').toLowerCase(),\n );\n if (!enumFieldRef) throw new CliError(`ReferentialAction ${relation.foreign_key_on_update} not found`);\n ab.addArg((a) => a.ReferenceExpr.setTarget(enumFieldRef), 'onUpdate');\n }\n\n // Check if the FK constraint name differs from the default pattern\n const defaultFkName = `${relation.table}_${relation.columns.join('_')}_fkey`;\n if (relation.fk_name && relation.fk_name !== defaultFkName) ab.addArg((ab) => ab.StringLiteral.setValue(relation.fk_name), 'map');\n\n return ab;\n });\n\n sourceModel.fields.splice(firstSourceFieldId, 0, sourceFieldFactory.node); // Insert the relation field before the first FK scalar field\n\n const oppositeFieldPrefix = /[0-9]/g.test(targetModel.name.charAt(0)) ? '_' : '';\n const { name: oppositeFieldName } = resolveNameCasing(\n options.fieldCasing,\n similarRelations > 0\n ? `${oppositeFieldPrefix}${lowerCaseFirst(sourceModel.name)}_${firstColumn}`\n : `${lowerCaseFirst(resolveNameCasing(options.fieldCasing, sourceModel.name).name)}${relation.references.type === 'many'? 's' : ''}`,\n );\n\n const targetFieldFactory = new DataFieldFactory()\n .setContainer(targetModel)\n .setName(oppositeFieldName)\n .setType((tb) =>\n tb\n .setOptional(relation.references.type === 'one')\n .setArray(relation.references.type === 'many')\n .setReference(sourceModel),\n );\n if (includeRelationName)\n targetFieldFactory.addAttribute((ab) =>\n ab.setDecl(relationAttribute).addArg((ab) => ab.StringLiteral.setValue(relationName)),\n );\n\n targetModel.fields.push(targetFieldFactory.node);\n}\n","import type { ZModelServices } from '@zenstackhq/language';\nimport {\n type AbstractDeclaration,\n type DataField,\n type DataModel,\n type Enum,\n type EnumField,\n type Expression,\n type FunctionDecl,\n isInvocationExpr,\n type Attribute,\n type Model,\n type ReferenceExpr,\n type StringLiteral,\n} from '@zenstackhq/language/ast';\nimport type { AstFactory, ExpressionBuilder } from '@zenstackhq/language/factory';\nimport { getLiteralArray, getStringLiteral } from '@zenstackhq/language/utils';\nimport type { DataSourceProviderType } from '@zenstackhq/schema';\nimport type { Reference } from 'langium';\nimport { CliError } from '../../cli-error';\n\nexport function getAttribute(model: Model, attrName: string) {\n if (!model.$document) throw new CliError('Model is not associated with a document.');\n\n const references = model.$document.references as Reference<AbstractDeclaration>[];\n return references.find((a) => a.ref?.$type === 'Attribute' && a.ref?.name === attrName)?.ref as\n | Attribute\n | undefined;\n}\n\nexport function getDatasource(model: Model) {\n const datasource = model.declarations.find((d) => d.$type === 'DataSource');\n if (!datasource) {\n throw new CliError('No datasource declaration found in the schema.');\n }\n\n const urlField = datasource.fields.find((f) => f.name === 'url');\n\n if (!urlField) throw new CliError(`No url field found in the datasource declaration.`);\n\n let url = getStringLiteral(urlField.value);\n\n if (!url && isInvocationExpr(urlField.value)) {\n const envName = getStringLiteral(urlField.value.args[0]?.value);\n if (!envName) {\n throw new CliError('The url field must be a string literal or an env().');\n }\n if (!process.env[envName]) {\n throw new CliError(\n `Environment variable ${envName} is not set, please set it to the database connection string.`,\n );\n }\n url = process.env[envName];\n }\n\n if (!url) {\n throw new CliError('The url field must be a string literal or an env().');\n }\n\n if (url.startsWith('file:')) {\n url = new URL(url, `file:${model.$document!.uri.path}`).pathname;\n if (process.platform === 'win32' && url[0] === '/') url = url.slice(1);\n }\n\n const defaultSchemaField = datasource.fields.find((f) => f.name === 'defaultSchema');\n const defaultSchema = (defaultSchemaField && getStringLiteral(defaultSchemaField.value)) || 'public';\n\n const schemasField = datasource.fields.find((f) => f.name === 'schemas');\n const schemas =\n (schemasField &&\n getLiteralArray(schemasField.value)\n ?.filter((s) => s !== undefined)) as string[] ||\n [];\n\n const provider = getStringLiteral(\n datasource.fields.find((f) => f.name === 'provider')?.value,\n );\n if (!provider) {\n throw new CliError(`Datasource \"${datasource.name}\" is missing a \"provider\" field.`);\n }\n\n return {\n name: datasource.name,\n provider: provider as DataSourceProviderType,\n url,\n defaultSchema,\n schemas,\n allSchemas: [defaultSchema, ...schemas],\n };\n}\n\nexport function getDbName(decl: AbstractDeclaration | DataField | EnumField, includeSchema: boolean = false): string {\n if (!('attributes' in decl)) return decl.name;\n\n const schemaAttr = decl.attributes.find((a) => a.decl.ref?.name === '@@schema');\n let schema = 'public';\n if (schemaAttr) {\n const schemaAttrValue = schemaAttr.args[0]?.value;\n if (schemaAttrValue?.$type === 'StringLiteral') {\n schema = schemaAttrValue.value;\n }\n }\n\n const formatName = (name: string) => `${schema && includeSchema ? `${schema}.` : ''}${name}`;\n\n const nameAttr = decl.attributes.find((a) => a.decl.ref?.name === '@@map' || a.decl.ref?.name === '@map');\n if (!nameAttr) return formatName(decl.name);\n const attrValue = nameAttr.args[0]?.value;\n\n if (attrValue?.$type !== 'StringLiteral') return formatName(decl.name);\n\n return formatName(attrValue.value);\n}\n\nexport function getRelationFkName(decl: DataField): string | undefined {\n const relationAttr = decl?.attributes.find((a) => a.decl.ref?.name === '@relation');\n const schemaAttrValue = relationAttr?.args.find((a) => a.name === 'map')?.value as StringLiteral;\n return schemaAttrValue?.value;\n}\n\n/**\n * Gets the FK field names from the @relation attribute's `fields` argument.\n * Returns a sorted, comma-separated string of field names for comparison.\n * e.g., @relation(fields: [userId], references: [id]) -> \"userId\"\n * e.g., @relation(fields: [postId, tagId], references: [id, id]) -> \"postId,tagId\"\n */\nexport function getRelationFieldsKey(decl: DataField): string | undefined {\n const relationAttr = decl?.attributes.find((a) => a.decl.ref?.name === '@relation');\n if (!relationAttr) return undefined;\n\n const fieldsArg = relationAttr.args.find((a) => a.name === 'fields')?.value;\n if (!fieldsArg || fieldsArg.$type !== 'ArrayExpr') return undefined;\n\n const fieldNames = fieldsArg.items\n .filter((item): item is ReferenceExpr => item.$type === 'ReferenceExpr')\n .map((item) => item.target?.$refText || item.target?.ref?.name)\n .filter((name): name is string => !!name)\n .sort();\n\n return fieldNames.length > 0 ? fieldNames.join(',') : undefined;\n}\n\nexport function getDbSchemaName(decl: DataModel | Enum): string {\n const schemaAttr = decl.attributes.find((a) => a.decl.ref?.name === '@@schema');\n if (!schemaAttr) return 'public';\n const attrValue = schemaAttr.args[0]?.value;\n\n if (attrValue?.$type !== 'StringLiteral') return 'public';\n\n return attrValue.value;\n}\n\nexport function getDeclarationRef<T extends AbstractDeclaration>(\n type: T['$type'],\n name: string,\n services: ZModelServices,\n) {\n const node = services.shared.workspace.IndexManager.allElements(type).find(\n (m) => m.node && getDbName(m.node as T) === name,\n )?.node;\n if (!node) throw new CliError(`Declaration not found: ${name}`);\n return node as T;\n}\n\nexport function getEnumRef(name: string, services: ZModelServices) {\n return getDeclarationRef<Enum>('Enum', name, services);\n}\n\nexport function getModelRef(name: string, services: ZModelServices) {\n return getDeclarationRef<DataModel>('DataModel', name, services);\n}\n\nexport function getAttributeRef(name: string, services: ZModelServices) {\n return getDeclarationRef<Attribute>('Attribute', name, services);\n}\n\nexport function getFunctionRef(name: string, services: ZModelServices) {\n return getDeclarationRef<FunctionDecl>('FunctionDecl', name, services);\n}\n\n/**\n * Normalize a default value string for a Float field.\n * - Integer strings get `.0` appended\n * - Decimal strings are preserved as-is\n */\nexport function normalizeFloatDefault(val: string): (ab: ExpressionBuilder) => AstFactory<Expression> {\n if (/^-?\\d+$/.test(val)) {\n return (ab) => ab.NumberLiteral.setValue(val + '.0');\n }\n if (/^-?\\d+\\.\\d+$/.test(val)) {\n return (ab) => ab.NumberLiteral.setValue(val);\n }\n return (ab) => ab.NumberLiteral.setValue(val);\n}\n\n/**\n * Normalize a default value string for a Decimal field.\n * - Integer strings get `.00` appended\n * - Decimal strings are normalized to minimum 2 decimal places, stripping excess trailing zeros\n */\nexport function normalizeDecimalDefault(val: string): (ab: ExpressionBuilder) => AstFactory<Expression> {\n if (/^-?\\d+$/.test(val)) {\n return (ab) => ab.NumberLiteral.setValue(val + '.00');\n }\n if (/^-?\\d+\\.\\d+$/.test(val)) {\n const [integerPart, fractionalPart] = val.split('.');\n let normalized = fractionalPart!.replace(/0+$/, '');\n if (normalized.length < 2) {\n normalized = normalized.padEnd(2, '0');\n }\n return (ab) => ab.NumberLiteral.setValue(`${integerPart}.${normalized}`);\n }\n return (ab) => ab.NumberLiteral.setValue(val);\n}\n","export function resolveNameCasing(casing: 'pascal' | 'camel' | 'snake' | 'none', originalName: string) {\n let name = originalName;\n const fieldPrefix = /[0-9]/g.test(name.charAt(0)) ? '_' : '';\n\n switch (casing) {\n case 'pascal':\n name = toPascalCase(originalName);\n break;\n case 'camel':\n name = toCamelCase(originalName);\n break;\n case 'snake':\n name = toSnakeCase(originalName);\n break;\n }\n\n return {\n modified: name !== originalName || fieldPrefix !== '',\n name: `${fieldPrefix}${name}`,\n };\n}\n\nfunction isAllUpperCase(str: string): boolean {\n return str === str.toUpperCase();\n}\n\nexport function toPascalCase(str: string): string {\n if (isAllUpperCase(str)) return str;\n return str.replace(/[_\\- ]+(\\w)/g, (_, c) => c.toUpperCase()).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nexport function toCamelCase(str: string): string {\n if (isAllUpperCase(str)) return str;\n return str.replace(/[_\\- ]+(\\w)/g, (_, c) => c.toUpperCase()).replace(/^\\w/, (c) => c.toLowerCase());\n}\n\nexport function toSnakeCase(str: string): string {\n if (isAllUpperCase(str)) return str;\n return str\n .replace(/[- ]+/g, '_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n","import type { Attribute, BuiltinType } from '@zenstackhq/language/ast';\nimport { DataFieldAttributeFactory } from '@zenstackhq/language/factory';\nimport { getAttributeRef, getDbName, getFunctionRef, normalizeDecimalDefault, normalizeFloatDefault } from '../utils';\nimport type { IntrospectedEnum, IntrospectedSchema, IntrospectedTable, IntrospectionProvider } from './provider';\nimport { CliError } from '../../../cli-error';\nimport { resolveNameCasing } from '../casing';\n\n// Note: We dynamically import mysql2 inside the async function to avoid\n// requiring it at module load time for environments that don't use MySQL.\n\nfunction normalizeGenerationExpression(typeDef: string): string {\n // MySQL may include character set introducers in generation expressions, e.g. `_utf8mb4' '`.\n // Strip them to produce a stable, cleaner expression for `Unsupported(\"...\")`.\n // MySQL commonly returns generation expressions with SQL-style quote escaping (e.g. `\\\\'`),\n // which would become an invalid ZModel string after the code generator escapes quotes again.\n // Normalize it to raw quotes, letting the ZModel code generator re-escape appropriately.\n return (\n typeDef\n // Remove character set introducers, with or without escaped quotes.\n .replace(/_([0-9A-Za-z_]+)\\\\?'/g, \"'\")\n // Unescape SQL-style escaped single quotes in the expression.\n .replace(/\\\\'/g, \"'\")\n );\n}\n\nexport const mysql: IntrospectionProvider = {\n isSupportedFeature(feature) {\n switch (feature) {\n case 'NativeEnum':\n return true;\n case 'Schema':\n default:\n return false;\n }\n },\n getBuiltinType(type) {\n const t = (type || '').toLowerCase().trim();\n\n // MySQL doesn't have native array types\n const isArray = false;\n\n switch (t) {\n // integers\n case 'tinyint':\n case 'smallint':\n case 'mediumint':\n case 'int':\n case 'integer':\n return { type: 'Int', isArray };\n case 'bigint':\n return { type: 'BigInt', isArray };\n\n // decimals and floats\n case 'decimal':\n case 'numeric':\n return { type: 'Decimal', isArray };\n case 'float':\n case 'double':\n case 'real':\n return { type: 'Float', isArray };\n\n // boolean (MySQL uses TINYINT(1) for boolean)\n case 'boolean':\n case 'bool':\n return { type: 'Boolean', isArray };\n\n // strings\n case 'char':\n case 'varchar':\n case 'tinytext':\n case 'text':\n case 'mediumtext':\n case 'longtext':\n return { type: 'String', isArray };\n\n // dates/times\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n case 'year':\n return { type: 'DateTime', isArray };\n\n // binary\n case 'binary':\n case 'varbinary':\n case 'tinyblob':\n case 'blob':\n case 'mediumblob':\n case 'longblob':\n return { type: 'Bytes', isArray };\n\n // json\n case 'json':\n return { type: 'Json', isArray };\n\n default:\n // Handle ENUM type - MySQL returns enum values like \"enum('val1','val2')\"\n if (t.startsWith('enum(')) {\n return { type: 'String', isArray };\n }\n // Handle SET type\n if (t.startsWith('set(')) {\n return { type: 'String', isArray };\n }\n return { type: 'Unsupported' as const, isArray };\n }\n },\n getDefaultDatabaseType(type: BuiltinType) {\n switch (type) {\n case 'String':\n return { type: 'varchar', precision: 191 };\n case 'Boolean':\n // Boolean maps to 'boolean' (our synthetic type from tinyint(1))\n // No precision needed since we handle the mapping in the query\n return { type: 'boolean' };\n case 'Int':\n return { type: 'int' };\n case 'BigInt':\n return { type: 'bigint' };\n case 'Float':\n return { type: 'double' };\n case 'Decimal':\n return { type: 'decimal', precision: 65 };\n case 'DateTime':\n return { type: 'datetime', precision: 3 };\n case 'Json':\n return { type: 'json' };\n case 'Bytes':\n return { type: 'longblob' };\n }\n },\n async introspect(connectionString: string, options: { schemas: string[]; modelCasing: 'pascal' | 'camel' | 'snake' | 'none' }): Promise<IntrospectedSchema> {\n const mysql = await import('mysql2/promise');\n const connection = await mysql.createConnection(connectionString);\n\n try {\n // Extract database name from connection string\n const url = new URL(connectionString);\n const databaseName = url.pathname.replace('/', '');\n\n if (!databaseName) {\n throw new CliError('Database name not found in connection string');\n }\n\n // Introspect tables\n const [tableRows] = (await connection.execute(getTableIntrospectionQuery(), [databaseName])) as [\n IntrospectedTable[],\n unknown,\n ];\n const tables: IntrospectedTable[] = [];\n\n for (const row of tableRows) {\n const columns = typeof row.columns === 'string' ? JSON.parse(row.columns) : row.columns;\n const indexes = typeof row.indexes === 'string' ? JSON.parse(row.indexes) : row.indexes;\n\n // Sort columns by ordinal_position to preserve database column order\n const sortedColumns = (columns || [])\n .sort(\n (a: { ordinal_position?: number }, b: { ordinal_position?: number }) =>\n (a.ordinal_position ?? 0) - (b.ordinal_position ?? 0)\n )\n .map((col: any) => {\n // MySQL enum datatype_name is synthetic (TableName_ColumnName).\n // Apply model casing so it matches the cased enum_type.\n if (col.datatype === 'enum' && col.datatype_name) {\n return { ...col, datatype_name: resolveNameCasing(options.modelCasing, col.datatype_name).name };\n }\n // Normalize generated column expressions for stable output.\n if (col.computed && typeof col.datatype === 'string') {\n return { ...col, datatype: normalizeGenerationExpression(col.datatype) };\n }\n return col;\n });\n\n // Filter out auto-generated FK indexes (MySQL creates these automatically)\n // Pattern: {Table}_{column}_fkey for single-column FK indexes\n const filteredIndexes = (indexes || []).filter(\n (idx: { name: string; columns: { name: string }[] }) =>\n !(idx.columns.length === 1 && idx.name === `${row.name}_${idx.columns[0]?.name}_fkey`)\n );\n\n tables.push({\n schema: '', // MySQL doesn't support multi-schema\n name: row.name,\n type: row.type as 'table' | 'view',\n definition: row.definition,\n columns: sortedColumns,\n indexes: filteredIndexes,\n });\n }\n\n // Introspect enums (MySQL stores enum values in column definitions)\n const [enumRows] = (await connection.execute(getEnumIntrospectionQuery(), [databaseName])) as [\n { table_name: string; column_name: string; column_type: string }[],\n unknown,\n ];\n\n const enums: IntrospectedEnum[] = enumRows.map((row) => {\n // Parse enum values from column_type like \"enum('val1','val2','val3')\"\n const values = parseEnumValues(row.column_type);\n // MySQL doesn't have standalone enum types; the name is entirely\n // synthetic (TableName_ColumnName). Apply model casing here so it\n // arrives already cased — there is no raw DB name to @@map back to.\n const syntheticName = `${row.table_name}_${row.column_name}`;\n const { name } = resolveNameCasing(options.modelCasing, syntheticName);\n return {\n schema_name: '', // MySQL doesn't support multi-schema\n enum_type: name,\n values,\n };\n });\n\n return { tables, enums };\n } finally {\n await connection.end();\n }\n },\n getDefaultValue({ defaultValue, fieldType, datatype, datatype_name, services, enums }) {\n const val = defaultValue.trim();\n\n // Handle NULL early\n if (val.toUpperCase() === 'NULL') {\n return null;\n }\n\n // Handle enum defaults\n if (datatype === 'enum' && datatype_name) {\n const enumDef = enums.find((e) => getDbName(e) === datatype_name);\n if (enumDef) {\n // Strip quotes from the value (MySQL returns 'value')\n const enumValue = val.startsWith(\"'\") && val.endsWith(\"'\") ? val.slice(1, -1) : val;\n const enumField = enumDef.fields.find((f) => getDbName(f) === enumValue);\n if (enumField) {\n return (ab) => ab.ReferenceExpr.setTarget(enumField);\n }\n }\n }\n\n switch (fieldType) {\n case 'DateTime':\n if (/^CURRENT_TIMESTAMP(\\(\\d*\\))?$/i.test(val) || val.toLowerCase() === 'current_timestamp()' || val.toLowerCase() === 'now()') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('now', services));\n }\n // Fallback to string literal for other DateTime defaults\n return (ab) => ab.StringLiteral.setValue(val);\n\n case 'Int':\n case 'BigInt':\n if (val.toLowerCase() === 'auto_increment') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('autoincrement', services));\n }\n return (ab) => ab.NumberLiteral.setValue(val);\n\n case 'Float':\n return normalizeFloatDefault(val);\n\n case 'Decimal':\n return normalizeDecimalDefault(val);\n\n case 'Boolean':\n return (ab) => ab.BooleanLiteral.setValue(val.toLowerCase() === 'true' || val === '1' || val === \"b'1'\");\n\n case 'String':\n if (val.toLowerCase() === 'uuid()') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('uuid', services));\n }\n return (ab) => ab.StringLiteral.setValue(val);\n }\n\n // Handle function calls (e.g., uuid(), now())\n if (val.includes('(') && val.includes(')')) {\n return (ab) =>\n ab.InvocationExpr.setFunction(getFunctionRef('dbgenerated', services)).addArg((a) =>\n a.setValue((v) => v.StringLiteral.setValue(val)),\n );\n }\n\n console.warn(`Unsupported default value type: \"${defaultValue}\" for field type \"${fieldType}\". Skipping default value.`);\n return null;\n },\n\n getFieldAttributes({ fieldName, fieldType, datatype, length, precision, services }) {\n const factories: DataFieldAttributeFactory[] = [];\n\n // Add @updatedAt for DateTime fields named updatedAt or updated_at\n if (fieldType === 'DateTime' && (fieldName.toLowerCase() === 'updatedat' || fieldName.toLowerCase() === 'updated_at')) {\n factories.push(new DataFieldAttributeFactory().setDecl(getAttributeRef('@updatedAt', services)));\n }\n\n // Add @db.* attribute if the datatype differs from the default\n const dbAttr = services.shared.workspace.IndexManager.allElements('Attribute').find(\n (d) => d.name.toLowerCase() === `@db.${datatype.toLowerCase()}`,\n )?.node as Attribute | undefined;\n\n const defaultDatabaseType = this.getDefaultDatabaseType(fieldType as BuiltinType);\n\n if (\n dbAttr &&\n defaultDatabaseType &&\n (defaultDatabaseType.type !== datatype ||\n (defaultDatabaseType.precision &&\n defaultDatabaseType.precision !== (length ?? precision)))\n ) {\n const dbAttrFactory = new DataFieldAttributeFactory().setDecl(dbAttr);\n const sizeValue = length ?? precision;\n if (sizeValue !== undefined && sizeValue !== null) {\n dbAttrFactory.addArg((a) => a.NumberLiteral.setValue(sizeValue));\n }\n factories.push(dbAttrFactory);\n }\n\n return factories;\n },\n};\n\nfunction getTableIntrospectionQuery() {\n // Note: We use subqueries with ORDER BY before JSON_ARRAYAGG to ensure ordering\n // since MySQL < 8.0.21 doesn't support ORDER BY inside JSON_ARRAYAGG.\n // MySQL doesn't support multi-schema, so we don't include schema in the result.\n return `\n-- Main query: one row per table/view with columns and indexes as nested JSON arrays.\n-- Uses INFORMATION_SCHEMA which is MySQL's standard metadata catalog.\nSELECT\n t.TABLE_NAME AS \\`name\\`, -- table or view name\n CASE t.TABLE_TYPE -- map MySQL table type strings to our internal types\n WHEN 'BASE TABLE' THEN 'table'\n WHEN 'VIEW' THEN 'view'\n ELSE NULL\n END AS \\`type\\`,\n CASE -- for views, retrieve the SQL definition\n WHEN t.TABLE_TYPE = 'VIEW' THEN v.VIEW_DEFINITION\n ELSE NULL\n END AS \\`definition\\`,\n\n -- ===== COLUMNS subquery =====\n -- Wraps an ordered subquery in JSON_ARRAYAGG to produce a JSON array of column objects.\n (\n SELECT JSON_ARRAYAGG(col_json)\n FROM (\n SELECT JSON_OBJECT(\n 'ordinal_position', c.ORDINAL_POSITION, -- column position (used for sorting)\n 'name', c.COLUMN_NAME, -- column name\n\n -- datatype: for generated/computed columns, construct the full DDL-like type definition\n -- (e.g., \"int GENERATED ALWAYS AS (col1 + col2) STORED\") so it can be rendered as\n -- Unsupported(\"...\"); special-case tinyint(1) as 'boolean' (MySQL's boolean convention);\n -- otherwise use the DATA_TYPE (e.g., 'int', 'varchar', 'datetime').\n 'datatype', CASE\n WHEN c.GENERATION_EXPRESSION IS NOT NULL AND c.GENERATION_EXPRESSION != '' THEN\n CONCAT(\n c.COLUMN_TYPE,\n ' GENERATED ALWAYS AS (',\n c.GENERATION_EXPRESSION,\n ') ',\n CASE\n WHEN c.EXTRA LIKE '%STORED GENERATED%' THEN 'STORED'\n ELSE 'VIRTUAL'\n END\n )\n WHEN c.DATA_TYPE = 'tinyint' AND c.COLUMN_TYPE = 'tinyint(1)' THEN 'boolean'\n ELSE c.DATA_TYPE\n END,\n\n -- datatype_name: for enum columns, generate a synthetic name \"TableName_ColumnName\"\n -- (MySQL doesn't have named enum types like PostgreSQL)\n 'datatype_name', CASE\n WHEN c.DATA_TYPE = 'enum' THEN CONCAT(t.TABLE_NAME, '_', c.COLUMN_NAME)\n ELSE NULL\n END,\n\n 'datatype_schema', '', -- MySQL doesn't support multi-schema\n 'length', c.CHARACTER_MAXIMUM_LENGTH, -- max length for string types (e.g., VARCHAR(255) -> 255)\n 'precision', COALESCE(c.NUMERIC_PRECISION, c.DATETIME_PRECISION), -- numeric or datetime precision\n\n 'nullable', c.IS_NULLABLE = 'YES', -- true if column allows NULL\n\n -- default: for auto_increment columns, report 'auto_increment' instead of NULL;\n -- otherwise use the COLUMN_DEFAULT value\n 'default', CASE\n WHEN c.EXTRA LIKE '%auto_increment%' THEN 'auto_increment'\n ELSE c.COLUMN_DEFAULT\n END,\n\n 'pk', c.COLUMN_KEY = 'PRI', -- true if column is part of the primary key\n\n -- unique: true if the column has a single-column unique index.\n -- COLUMN_KEY = 'UNI' covers most cases, but may not be set when the column\n -- also participates in other indexes (showing 'MUL' instead on some MySQL versions).\n -- Also check INFORMATION_SCHEMA.STATISTICS for single-column unique indexes\n -- (NON_UNIQUE = 0) to match the PostgreSQL introspection behavior.\n 'unique', (\n c.COLUMN_KEY = 'UNI'\n OR EXISTS (\n SELECT 1\n FROM INFORMATION_SCHEMA.STATISTICS s_uni\n WHERE s_uni.TABLE_SCHEMA = c.TABLE_SCHEMA\n AND s_uni.TABLE_NAME = c.TABLE_NAME\n AND s_uni.COLUMN_NAME = c.COLUMN_NAME\n AND s_uni.NON_UNIQUE = 0\n AND s_uni.INDEX_NAME != 'PRIMARY'\n AND (\n SELECT COUNT(*)\n FROM INFORMATION_SCHEMA.STATISTICS s_cnt\n WHERE s_cnt.TABLE_SCHEMA = s_uni.TABLE_SCHEMA\n AND s_cnt.TABLE_NAME = s_uni.TABLE_NAME\n AND s_cnt.INDEX_NAME = s_uni.INDEX_NAME\n ) = 1\n )\n ),\n 'unique_name', (\n SELECT COALESCE(\n CASE WHEN c.COLUMN_KEY = 'UNI' THEN c.COLUMN_NAME ELSE NULL END,\n (\n SELECT s_uni.INDEX_NAME\n FROM INFORMATION_SCHEMA.STATISTICS s_uni\n WHERE s_uni.TABLE_SCHEMA = c.TABLE_SCHEMA\n AND s_uni.TABLE_NAME = c.TABLE_NAME\n AND s_uni.COLUMN_NAME = c.COLUMN_NAME\n AND s_uni.NON_UNIQUE = 0\n AND s_uni.INDEX_NAME != 'PRIMARY'\n AND (\n SELECT COUNT(*)\n FROM INFORMATION_SCHEMA.STATISTICS s_cnt\n WHERE s_cnt.TABLE_SCHEMA = s_uni.TABLE_SCHEMA\n AND s_cnt.TABLE_NAME = s_uni.TABLE_NAME\n AND s_cnt.INDEX_NAME = s_uni.INDEX_NAME\n ) = 1\n LIMIT 1\n )\n )\n ),\n\n -- computed: true if column has a generation expression (virtual or stored)\n 'computed', c.GENERATION_EXPRESSION IS NOT NULL AND c.GENERATION_EXPRESSION != '',\n\n -- options: for enum columns, the full COLUMN_TYPE string (e.g., \"enum('a','b','c')\")\n -- which gets parsed into individual values later\n 'options', CASE\n WHEN c.DATA_TYPE = 'enum' THEN c.COLUMN_TYPE\n ELSE NULL\n END,\n\n -- Foreign key info (NULL if column is not part of a FK)\n 'foreign_key_schema', NULL, -- MySQL doesn't support cross-schema FKs here\n 'foreign_key_table', kcu_fk.REFERENCED_TABLE_NAME, -- referenced table\n 'foreign_key_column', kcu_fk.REFERENCED_COLUMN_NAME, -- referenced column\n 'foreign_key_name', kcu_fk.CONSTRAINT_NAME, -- FK constraint name\n 'foreign_key_on_update', rc.UPDATE_RULE, -- referential action on update (CASCADE, SET NULL, etc.)\n 'foreign_key_on_delete', rc.DELETE_RULE -- referential action on delete\n ) AS col_json\n\n FROM INFORMATION_SCHEMA.COLUMNS c -- one row per column in the database\n\n -- Join KEY_COLUMN_USAGE to find foreign key references for this column.\n -- Filter to only FK entries (REFERENCED_TABLE_NAME IS NOT NULL).\n LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu_fk\n ON c.TABLE_SCHEMA = kcu_fk.TABLE_SCHEMA\n AND c.TABLE_NAME = kcu_fk.TABLE_NAME\n AND c.COLUMN_NAME = kcu_fk.COLUMN_NAME\n AND kcu_fk.REFERENCED_TABLE_NAME IS NOT NULL\n\n -- Join REFERENTIAL_CONSTRAINTS to get ON UPDATE / ON DELETE rules for the FK.\n LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc\n ON kcu_fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA\n AND kcu_fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME\n\n WHERE c.TABLE_SCHEMA = t.TABLE_SCHEMA\n AND c.TABLE_NAME = t.TABLE_NAME\n ORDER BY c.ORDINAL_POSITION -- preserve original column order\n ) AS cols_ordered\n ) AS \\`columns\\`,\n\n -- ===== INDEXES subquery =====\n -- Aggregates all indexes for this table into a JSON array.\n (\n SELECT JSON_ARRAYAGG(idx_json)\n FROM (\n SELECT JSON_OBJECT(\n 'name', s.INDEX_NAME, -- index name (e.g., 'PRIMARY', 'idx_email')\n 'method', s.INDEX_TYPE, -- index type (e.g., 'BTREE', 'HASH', 'FULLTEXT')\n 'unique', s.NON_UNIQUE = 0, -- NON_UNIQUE=0 means it IS unique\n 'primary', s.INDEX_NAME = 'PRIMARY', -- MySQL names the PK index 'PRIMARY'\n 'valid', TRUE, -- MySQL doesn't expose index validity status\n 'ready', TRUE, -- MySQL doesn't expose index readiness status\n 'partial', FALSE, -- MySQL doesn't support partial indexes\n 'predicate', NULL, -- no WHERE clause on indexes in MySQL\n\n -- Index columns: nested subquery for columns in this index\n 'columns', (\n SELECT JSON_ARRAYAGG(idx_col_json)\n FROM (\n SELECT JSON_OBJECT(\n 'name', s2.COLUMN_NAME, -- column name in the index\n 'expression', NULL, -- MySQL doesn't expose expression indexes via STATISTICS\n -- COLLATION: 'A' = ascending, 'D' = descending, NULL = not sorted\n 'order', CASE s2.COLLATION WHEN 'A' THEN 'ASC' WHEN 'D' THEN 'DESC' ELSE NULL END,\n 'nulls', NULL -- MySQL doesn't expose NULLS FIRST/LAST\n ) AS idx_col_json\n FROM INFORMATION_SCHEMA.STATISTICS s2 -- one row per column per index\n WHERE s2.TABLE_SCHEMA = s.TABLE_SCHEMA\n AND s2.TABLE_NAME = s.TABLE_NAME\n AND s2.INDEX_NAME = s.INDEX_NAME\n ORDER BY s2.SEQ_IN_INDEX -- preserve column order within the index\n ) AS idx_cols_ordered\n )\n ) AS idx_json\n FROM (\n -- Deduplicate: STATISTICS has one row per (index, column), but we need one row per index.\n -- DISTINCT on INDEX_NAME gives us one entry per index with its metadata.\n SELECT DISTINCT INDEX_NAME, INDEX_TYPE, NON_UNIQUE, TABLE_SCHEMA, TABLE_NAME\n FROM INFORMATION_SCHEMA.STATISTICS\n WHERE TABLE_SCHEMA = t.TABLE_SCHEMA AND TABLE_NAME = t.TABLE_NAME\n ) s\n ) AS idxs_ordered\n ) AS \\`indexes\\`\n\n-- === Main FROM: INFORMATION_SCHEMA.TABLES lists all tables and views ===\nFROM INFORMATION_SCHEMA.TABLES t\n-- Join VIEWS to get VIEW_DEFINITION for view tables\nLEFT JOIN INFORMATION_SCHEMA.VIEWS v\n ON t.TABLE_SCHEMA = v.TABLE_SCHEMA AND t.TABLE_NAME = v.TABLE_NAME\nWHERE t.TABLE_SCHEMA = ? -- only the target database\n AND t.TABLE_TYPE IN ('BASE TABLE', 'VIEW') -- exclude system tables like SYSTEM VIEW\n AND t.TABLE_NAME <> '_prisma_migrations' -- exclude Prisma migration tracking table\nORDER BY t.TABLE_NAME;\n`;\n}\n\nfunction getEnumIntrospectionQuery() {\n // MySQL doesn't have standalone enum types like PostgreSQL's CREATE TYPE.\n // Instead, enum values are embedded in column definitions (e.g., COLUMN_TYPE = \"enum('a','b','c')\").\n // This query finds all enum columns so we can extract their allowed values.\n return `\nSELECT\n c.TABLE_NAME AS table_name, -- table containing the enum column\n c.COLUMN_NAME AS column_name, -- column name\n c.COLUMN_TYPE AS column_type -- full type string including values (e.g., \"enum('val1','val2')\")\nFROM INFORMATION_SCHEMA.COLUMNS c\nWHERE c.TABLE_SCHEMA = ? -- only the target database\n AND c.DATA_TYPE = 'enum' -- only enum columns\nORDER BY c.TABLE_NAME, c.COLUMN_NAME;\n`;\n}\n\n/**\n * Parse enum values from MySQL COLUMN_TYPE string like \"enum('val1','val2','val3')\"\n */\nfunction parseEnumValues(columnType: string): string[] {\n // Match the content inside enum(...)\n const match = columnType.match(/^enum\\((.+)\\)$/i);\n if (!match || !match[1]) return [];\n\n const valuesString = match[1];\n const values: string[] = [];\n\n // Parse quoted values, handling escaped quotes\n let current = '';\n let inQuote = false;\n let i = 0;\n\n while (i < valuesString.length) {\n const char = valuesString[i];\n\n if (char === \"'\" && !inQuote) {\n inQuote = true;\n i++;\n continue;\n }\n\n if (char === \"'\" && inQuote) {\n // Check for escaped quote ('')\n if (valuesString[i + 1] === \"'\") {\n current += \"'\";\n i += 2;\n continue;\n }\n // End of value\n values.push(current);\n current = '';\n inQuote = false;\n i++;\n // Skip comma and any whitespace\n while (i < valuesString.length && (valuesString[i] === ',' || valuesString[i] === ' ')) {\n i++;\n }\n continue;\n }\n\n if (inQuote) {\n current += char;\n }\n i++;\n }\n\n return values;\n}\n","import type { Attribute, BuiltinType, Enum, Expression } from '@zenstackhq/language/ast';\nimport { AstFactory, DataFieldAttributeFactory, ExpressionBuilder } from '@zenstackhq/language/factory';\nimport { Client } from 'pg';\nimport { getAttributeRef, getDbName, getFunctionRef, normalizeDecimalDefault, normalizeFloatDefault } from '../utils';\nimport type { IntrospectedEnum, IntrospectedSchema, IntrospectedTable, IntrospectionProvider } from './provider';\nimport type { ZModelServices } from '@zenstackhq/language';\nimport { CliError } from '../../../cli-error';\n\n/**\n * Maps PostgreSQL internal type names to their standard SQL names for comparison.\n * This is used to normalize type names when checking against default database types.\n */\nconst pgTypnameToStandard: Record<string, string> = {\n int2: 'smallint',\n int4: 'integer',\n int8: 'bigint',\n float4: 'real',\n float8: 'double precision',\n bool: 'boolean',\n bpchar: 'character',\n numeric: 'decimal',\n};\n\n/**\n * Standard bit widths for integer/float types that shouldn't be added as precision arguments.\n * PostgreSQL returns these as precision values, but they're implicit for the type.\n */\nconst standardTypePrecisions: Record<string, number> = {\n int2: 16,\n smallint: 16,\n int4: 32,\n integer: 32,\n int8: 64,\n bigint: 64,\n float4: 24,\n real: 24,\n float8: 53,\n 'double precision': 53,\n};\n\n/**\n * Maps PostgreSQL typnames (from pg_type.typname) to ZenStack native type attribute names.\n * PostgreSQL introspection returns internal type names like 'int2', 'int4', 'float8', 'bpchar',\n * but ZenStack attributes are named @db.SmallInt, @db.Integer, @db.DoublePrecision, @db.Char, etc.\n */\nconst pgTypnameToZenStackNativeType: Record<string, string> = {\n // integers\n int2: 'SmallInt',\n smallint: 'SmallInt',\n int4: 'Integer',\n integer: 'Integer',\n int8: 'BigInt',\n bigint: 'BigInt',\n\n // decimals and floats\n numeric: 'Decimal',\n decimal: 'Decimal',\n float4: 'Real',\n real: 'Real',\n float8: 'DoublePrecision',\n 'double precision': 'DoublePrecision',\n\n // boolean\n bool: 'Boolean',\n boolean: 'Boolean',\n\n // strings\n text: 'Text',\n varchar: 'VarChar',\n 'character varying': 'VarChar',\n bpchar: 'Char',\n character: 'Char',\n\n // uuid\n uuid: 'Uuid',\n\n // dates/times\n date: 'Date',\n time: 'Time',\n timetz: 'Timetz',\n timestamp: 'Timestamp',\n timestamptz: 'Timestamptz',\n\n // binary\n bytea: 'ByteA',\n\n // json\n json: 'Json',\n jsonb: 'JsonB',\n\n // xml\n xml: 'Xml',\n\n // network types\n inet: 'Inet',\n\n // bit strings\n bit: 'Bit',\n varbit: 'VarBit',\n\n // oid\n oid: 'Oid',\n\n // money\n money: 'Money',\n\n // citext extension\n citext: 'Citext',\n};\n\nexport const postgresql: IntrospectionProvider = {\n isSupportedFeature(feature) {\n const supportedFeatures = ['Schema', 'NativeEnum'];\n return supportedFeatures.includes(feature);\n },\n getBuiltinType(type) {\n const t = (type || '').toLowerCase();\n\n const isArray = t.startsWith('_');\n\n switch (t.replace(/^_/, '')) {\n // integers\n case 'int2':\n case 'smallint':\n case 'int4':\n case 'integer':\n return { type: 'Int', isArray };\n case 'int8':\n case 'bigint':\n return { type: 'BigInt', isArray };\n\n // decimals and floats\n case 'numeric':\n case 'decimal':\n return { type: 'Decimal', isArray };\n case 'float4':\n case 'real':\n case 'float8':\n case 'double precision':\n return { type: 'Float', isArray };\n\n // boolean\n case 'bool':\n case 'boolean':\n return { type: 'Boolean', isArray };\n\n // strings\n case 'text':\n case 'varchar':\n case 'bpchar':\n case 'character varying':\n case 'character':\n return { type: 'String', isArray };\n\n // uuid\n case 'uuid':\n return { type: 'String', isArray };\n\n // dates/times\n case 'date':\n case 'time':\n case 'timetz':\n case 'timestamp':\n case 'timestamptz':\n return { type: 'DateTime', isArray };\n\n // binary\n case 'bytea':\n return { type: 'Bytes', isArray };\n\n // json\n case 'json':\n case 'jsonb':\n return { type: 'Json', isArray };\n default:\n return { type: 'Unsupported' as const, isArray };\n }\n },\n async introspect(connectionString: string, options: { schemas: string[]; modelCasing: 'pascal' | 'camel' | 'snake' | 'none' }): Promise<IntrospectedSchema> {\n const client = new Client({ connectionString });\n await client.connect();\n\n try {\n const { rows: tables } = await client.query<IntrospectedTable>(tableIntrospectionQuery);\n const { rows: enums } = await client.query<IntrospectedEnum>(enumIntrospectionQuery);\n\n // Filter tables and enums to only include those from the selected schemas\n const filteredTables = tables.filter((t) => options.schemas.includes(t.schema));\n const filteredEnums = enums.filter((e) => options.schemas.includes(e.schema_name));\n\n return {\n enums: filteredEnums,\n tables: filteredTables,\n };\n } finally {\n await client.end();\n }\n },\n getDefaultDatabaseType(type: BuiltinType) {\n switch (type) {\n case 'String':\n return { type: 'text' };\n case 'Boolean':\n return { type: 'boolean' };\n case 'Int':\n return { type: 'integer' };\n case 'BigInt':\n return { type: 'bigint' };\n case 'Float':\n return { type: 'double precision' };\n case 'Decimal':\n return { type: 'decimal' };\n case 'DateTime':\n return { type: 'timestamp', precision: 3 };\n case 'Json':\n return { type: 'jsonb' };\n case 'Bytes':\n return { type: 'bytea' };\n }\n },\n getDefaultValue({ defaultValue, fieldType, datatype, datatype_name, services, enums }) {\n const val = defaultValue.trim();\n\n // Handle enum defaults (PostgreSQL returns 'value'::enum_type)\n if (datatype === 'enum' && datatype_name) {\n const enumDef = enums.find((e) => getDbName(e) === datatype_name);\n if (enumDef) {\n // Extract the enum value from the default (format: 'VALUE'::\"enum_type\")\n const enumValue = val.replace(/'/g, '').split('::')[0]?.trim();\n const enumField = enumDef.fields.find((f) => getDbName(f) === enumValue);\n if (enumField) {\n return (ab) => ab.ReferenceExpr.setTarget(enumField);\n }\n }\n // Fall through to typeCastingConvert if datatype_name lookup fails\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n\n switch (fieldType) {\n case 'DateTime':\n if (val === 'CURRENT_TIMESTAMP' || val === 'now()') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('now', services));\n }\n\n if (val.includes('::')) {\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n\n // Fallback to string literal for other DateTime defaults\n return (ab) => ab.StringLiteral.setValue(val);\n\n case 'Int':\n case 'BigInt':\n if (val.startsWith('nextval(')) {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('autoincrement', services));\n }\n\n if (val.includes('::')) {\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n return (ab) => ab.NumberLiteral.setValue(val);\n\n case 'Float':\n if (val.includes('::')) {\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n return normalizeFloatDefault(val);\n\n case 'Decimal':\n if (val.includes('::')) {\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n return normalizeDecimalDefault(val);\n\n case 'Boolean':\n return (ab) => ab.BooleanLiteral.setValue(val === 'true');\n\n case 'String':\n if (val.includes('::')) {\n return typeCastingConvert({defaultValue,enums,val,services});\n }\n\n if (val.startsWith(\"'\") && val.endsWith(\"'\")) {\n return (ab) => ab.StringLiteral.setValue(val.slice(1, -1).replace(/''/g, \"'\"));\n }\n return (ab) => ab.StringLiteral.setValue(val);\n }\n\n if (val.includes('(') && val.includes(')')) {\n return (ab) =>\n ab.InvocationExpr.setFunction(getFunctionRef('dbgenerated', services)).addArg((a) =>\n a.setValue((v) => v.StringLiteral.setValue(val)),\n );\n }\n\n console.warn(`Unsupported default value type: \"${defaultValue}\" for field type \"${fieldType}\". Skipping default value.`);\n return null;\n },\n\n getFieldAttributes({ fieldName, fieldType, datatype, length, precision, services }) {\n const factories: DataFieldAttributeFactory[] = [];\n\n // Add @updatedAt for DateTime fields named updatedAt or updated_at\n if (fieldType === 'DateTime' && (fieldName.toLowerCase() === 'updatedat' || fieldName.toLowerCase() === 'updated_at')) {\n factories.push(new DataFieldAttributeFactory().setDecl(getAttributeRef('@updatedAt', services)));\n }\n\n // Map PostgreSQL typname to ZenStack native type attribute name\n // PostgreSQL returns typnames like 'int2', 'float8', 'bpchar', but ZenStack attributes\n // are named @db.SmallInt, @db.DoublePrecision, @db.Char, etc.\n const nativeTypeName = pgTypnameToZenStackNativeType[datatype.toLowerCase()] ?? datatype;\n\n // Add @db.* attribute if the datatype differs from the default\n const dbAttr = services.shared.workspace.IndexManager.allElements('Attribute').find(\n (d) => d.name.toLowerCase() === `@db.${nativeTypeName.toLowerCase()}`,\n )?.node as Attribute | undefined;\n\n const defaultDatabaseType = this.getDefaultDatabaseType(fieldType as BuiltinType);\n\n // Normalize datatype for comparison (e.g., 'int4' -> 'integer')\n const normalizedDatatype = pgTypnameToStandard[datatype.toLowerCase()] ?? datatype.toLowerCase();\n\n // Check if the precision is the standard bit width for this type (shouldn't be added)\n const standardPrecision = standardTypePrecisions[datatype.toLowerCase()];\n const isStandardPrecision = standardPrecision !== undefined && precision === standardPrecision;\n\n if (\n dbAttr &&\n defaultDatabaseType &&\n (defaultDatabaseType.type !== normalizedDatatype ||\n (defaultDatabaseType.precision &&\n defaultDatabaseType.precision !== (length ?? precision)))\n ) {\n const dbAttrFactory = new DataFieldAttributeFactory().setDecl(dbAttr);\n // Only add length/precision if it's meaningful (not the standard bit width for the type)\n if ((length || precision) && !isStandardPrecision) {\n dbAttrFactory.addArg((a) => a.NumberLiteral.setValue(length! || precision!));\n }\n factories.push(dbAttrFactory);\n }\n\n return factories;\n },\n};\n\nconst enumIntrospectionQuery = `\nSELECT\n n.nspname AS schema_name, -- schema the enum belongs to (e.g., 'public')\n t.typname AS enum_type, -- enum type name as defined in CREATE TYPE\n coalesce(json_agg(e.enumlabel ORDER BY e.enumsortorder), '[]') AS values -- ordered list of enum labels as JSON array\nFROM pg_type t -- pg_type: catalog of all data types\nJOIN pg_enum e ON t.oid = e.enumtypid -- pg_enum: one row per enum label; join to get labels for this enum type\nJOIN pg_namespace n ON n.oid = t.typnamespace -- pg_namespace: schema info; join to get the schema name\nGROUP BY schema_name, enum_type -- one row per enum type, with all labels aggregated\nORDER BY schema_name, enum_type;`;\n\nconst tableIntrospectionQuery = `\n-- Main query: one row per table/view with columns and indexes as nested JSON arrays.\n-- Joins pg_class (tables/views) with pg_namespace (schemas).\nSELECT\n \"ns\".\"nspname\" AS \"schema\", -- schema name (e.g., 'public')\n \"cls\".\"relname\" AS \"name\", -- table or view name\n CASE \"cls\".\"relkind\" -- relkind: 'r' = ordinary table, 'v' = view\n WHEN 'r' THEN 'table'\n WHEN 'v' THEN 'view'\n ELSE NULL\n END AS \"type\",\n CASE -- for views, retrieve the SQL definition\n WHEN \"cls\".\"relkind\" = 'v' THEN pg_get_viewdef(\"cls\".\"oid\", true)\n ELSE NULL\n END AS \"definition\",\n\n -- ===== COLUMNS subquery =====\n -- Aggregates all columns for this table into a JSON array.\n (\n SELECT coalesce(json_agg(agg), '[]')\n FROM (\n SELECT\n \"att\".\"attname\" AS \"name\", -- column name\n\n -- datatype: if the type is an enum, report 'enum';\n -- if the column is generated/computed, construct the full DDL-like type definition\n -- (e.g., \"text GENERATED ALWAYS AS (expr) STORED\") so it can be rendered as Unsupported(\"...\");\n -- otherwise use the pg_type name.\n CASE\n WHEN EXISTS (\n SELECT 1 FROM \"pg_catalog\".\"pg_enum\" AS \"e\"\n WHERE \"e\".\"enumtypid\" = \"typ\".\"oid\"\n ) THEN 'enum'\n WHEN \"att\".\"attgenerated\" != '' THEN\n format_type(\"att\".\"atttypid\", \"att\".\"atttypmod\")\n || ' GENERATED ALWAYS AS ('\n || pg_get_expr(\"def\".\"adbin\", \"def\".\"adrelid\")\n || ') '\n || CASE \"att\".\"attgenerated\"\n WHEN 's' THEN 'STORED'\n WHEN 'v' THEN 'VIRTUAL'\n ELSE 'STORED'\n END\n ELSE \"typ\".\"typname\"::text -- internal type name (e.g., 'int4', 'varchar', 'text'); cast to text to prevent CASE from coercing result to name type (max 63 chars)\n END AS \"datatype\",\n\n -- datatype_name: for enums only, the actual enum type name (used to look up the enum definition)\n CASE\n WHEN EXISTS (\n SELECT 1 FROM \"pg_catalog\".\"pg_enum\" AS \"e\"\n WHERE \"e\".\"enumtypid\" = \"typ\".\"oid\"\n ) THEN \"typ\".\"typname\"\n ELSE NULL\n END AS \"datatype_name\",\n\n \"tns\".\"nspname\" AS \"datatype_schema\", -- schema where the data type is defined\n \"c\".\"character_maximum_length\" AS \"length\", -- max length for char/varchar types (from information_schema)\n COALESCE(\"c\".\"numeric_precision\", \"c\".\"datetime_precision\") AS \"precision\", -- numeric or datetime precision\n\n -- Foreign key info (NULL if column is not part of a FK constraint)\n \"fk_ns\".\"nspname\" AS \"foreign_key_schema\", -- schema of the referenced table\n \"fk_cls\".\"relname\" AS \"foreign_key_table\", -- referenced table name\n \"fk_att\".\"attname\" AS \"foreign_key_column\", -- referenced column name\n \"fk_con\".\"conname\" AS \"foreign_key_name\", -- FK constraint name\n\n -- FK referential actions: decode single-char codes to human-readable strings\n CASE \"fk_con\".\"confupdtype\"\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'd' THEN 'SET DEFAULT'\n ELSE NULL\n END AS \"foreign_key_on_update\",\n CASE \"fk_con\".\"confdeltype\"\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'd' THEN 'SET DEFAULT'\n ELSE NULL\n END AS \"foreign_key_on_delete\",\n\n -- pk: true if this column is part of the table's primary key constraint\n \"pk_con\".\"conkey\" IS NOT NULL AS \"pk\",\n\n -- unique: true if the column has a single-column UNIQUE constraint OR a single-column unique index\n (\n -- Check for a single-column UNIQUE constraint (contype = 'u')\n EXISTS (\n SELECT 1\n FROM \"pg_catalog\".\"pg_constraint\" AS \"u_con\"\n WHERE \"u_con\".\"contype\" = 'u' -- 'u' = unique constraint\n AND \"u_con\".\"conrelid\" = \"cls\".\"oid\" -- on this table\n AND array_length(\"u_con\".\"conkey\", 1) = 1 -- single-column only\n AND \"att\".\"attnum\" = ANY (\"u_con\".\"conkey\") -- this column is in the constraint\n )\n OR\n -- Check for a single-column unique index (may exist without an explicit constraint)\n EXISTS (\n SELECT 1\n FROM \"pg_catalog\".\"pg_index\" AS \"u_idx\"\n WHERE \"u_idx\".\"indrelid\" = \"cls\".\"oid\" -- on this table\n AND \"u_idx\".\"indisunique\" = TRUE -- it's a unique index\n AND \"u_idx\".\"indnkeyatts\" = 1 -- single key column\n AND \"att\".\"attnum\" = ANY (\"u_idx\".\"indkey\"::int2[]) -- this column is the key\n )\n ) AS \"unique\",\n\n -- unique_name: the name of the unique constraint or index (whichever exists first)\n (\n SELECT COALESCE(\n -- Try constraint name first\n (\n SELECT \"u_con\".\"conname\"\n FROM \"pg_catalog\".\"pg_constraint\" AS \"u_con\"\n WHERE \"u_con\".\"contype\" = 'u'\n AND \"u_con\".\"conrelid\" = \"cls\".\"oid\"\n AND array_length(\"u_con\".\"conkey\", 1) = 1\n AND \"att\".\"attnum\" = ANY (\"u_con\".\"conkey\")\n LIMIT 1\n ),\n -- Fall back to unique index name\n (\n SELECT \"u_idx_cls\".\"relname\"\n FROM \"pg_catalog\".\"pg_index\" AS \"u_idx\"\n JOIN \"pg_catalog\".\"pg_class\" AS \"u_idx_cls\" ON \"u_idx\".\"indexrelid\" = \"u_idx_cls\".\"oid\"\n WHERE \"u_idx\".\"indrelid\" = \"cls\".\"oid\"\n AND \"u_idx\".\"indisunique\" = TRUE\n AND \"u_idx\".\"indnkeyatts\" = 1\n AND \"att\".\"attnum\" = ANY (\"u_idx\".\"indkey\"::int2[])\n LIMIT 1\n )\n )\n ) AS \"unique_name\",\n\n \"att\".\"attgenerated\" != '' AS \"computed\", -- true if column is a generated/computed column\n -- For generated columns, pg_attrdef stores the generation expression (not a default),\n -- so we must null it out to avoid emitting a spurious @default(dbgenerated(...)) attribute.\n CASE\n WHEN \"att\".\"attgenerated\" != '' THEN NULL\n ELSE pg_get_expr(\"def\".\"adbin\", \"def\".\"adrelid\")\n END AS \"default\", -- column default expression as text (e.g., 'nextval(...)', '0', 'now()')\n \"att\".\"attnotnull\" != TRUE AS \"nullable\", -- true if column allows NULL values\n\n -- options: for enum columns, aggregates all allowed enum labels into a JSON array\n coalesce(\n (\n SELECT json_agg(\"enm\".\"enumlabel\") AS \"o\"\n FROM \"pg_catalog\".\"pg_enum\" AS \"enm\"\n WHERE \"enm\".\"enumtypid\" = \"typ\".\"oid\"\n ),\n '[]'\n ) AS \"options\"\n\n -- === FROM / JOINs for the columns subquery ===\n\n -- pg_attribute: one row per table column (attnum >= 0 excludes system columns)\n FROM \"pg_catalog\".\"pg_attribute\" AS \"att\"\n\n -- pg_type: data type of the column (e.g., int4, text, custom_enum)\n INNER JOIN \"pg_catalog\".\"pg_type\" AS \"typ\" ON \"typ\".\"oid\" = \"att\".\"atttypid\"\n\n -- pg_namespace for the type: needed to determine which schema the type lives in\n INNER JOIN \"pg_catalog\".\"pg_namespace\" AS \"tns\" ON \"tns\".\"oid\" = \"typ\".\"typnamespace\"\n\n -- information_schema.columns: provides length/precision info not easily available from pg_catalog\n LEFT JOIN \"information_schema\".\"columns\" AS \"c\" ON \"c\".\"table_schema\" = \"ns\".\"nspname\"\n AND \"c\".\"table_name\" = \"cls\".\"relname\"\n AND \"c\".\"column_name\" = \"att\".\"attname\"\n\n -- pg_constraint (primary key): join on contype='p' to detect if column is part of PK\n LEFT JOIN \"pg_catalog\".\"pg_constraint\" AS \"pk_con\" ON \"pk_con\".\"contype\" = 'p'\n AND \"pk_con\".\"conrelid\" = \"cls\".\"oid\"\n AND \"att\".\"attnum\" = ANY (\"pk_con\".\"conkey\")\n\n -- pg_constraint (foreign key): join on contype='f' to get FK details for this column\n LEFT JOIN \"pg_catalog\".\"pg_constraint\" AS \"fk_con\" ON \"fk_con\".\"contype\" = 'f'\n AND \"fk_con\".\"conrelid\" = \"cls\".\"oid\"\n AND \"att\".\"attnum\" = ANY (\"fk_con\".\"conkey\")\n\n -- pg_class for FK target table: resolve the referenced table's OID to its name\n LEFT JOIN \"pg_catalog\".\"pg_class\" AS \"fk_cls\" ON \"fk_cls\".\"oid\" = \"fk_con\".\"confrelid\"\n\n -- pg_namespace for FK target: get the schema of the referenced table\n LEFT JOIN \"pg_catalog\".\"pg_namespace\" AS \"fk_ns\" ON \"fk_ns\".\"oid\" = \"fk_cls\".\"relnamespace\"\n\n -- pg_attribute for FK target column: resolve the referenced column number to its name.\n -- Use array_position to correlate by position: find this source column's index in conkey,\n -- then pick the referenced attnum at that same index from confkey.\n -- This ensures composite FKs correctly map each source column to its corresponding target column.\n LEFT JOIN \"pg_catalog\".\"pg_attribute\" AS \"fk_att\" ON \"fk_att\".\"attrelid\" = \"fk_cls\".\"oid\"\n AND \"fk_att\".\"attnum\" = \"fk_con\".\"confkey\"[array_position(\"fk_con\".\"conkey\", \"att\".\"attnum\")]\n\n -- pg_attrdef: column defaults; adbin contains the internal expression, decoded via pg_get_expr()\n LEFT JOIN \"pg_catalog\".\"pg_attrdef\" AS \"def\" ON \"def\".\"adrelid\" = \"cls\".\"oid\" AND \"def\".\"adnum\" = \"att\".\"attnum\"\n\n WHERE\n \"att\".\"attrelid\" = \"cls\".\"oid\" -- only columns belonging to this table\n AND \"att\".\"attnum\" >= 0 -- exclude system columns (ctid, xmin, etc. have attnum < 0)\n AND \"att\".\"attisdropped\" != TRUE -- exclude dropped (deleted) columns\n ORDER BY \"att\".\"attnum\" -- preserve original column order\n ) AS agg\n ) AS \"columns\",\n\n -- ===== INDEXES subquery =====\n -- Aggregates all indexes for this table into a JSON array.\n (\n SELECT coalesce(json_agg(agg), '[]')\n FROM (\n SELECT\n \"idx_cls\".\"relname\" AS \"name\", -- index name\n \"am\".\"amname\" AS \"method\", -- access method (e.g., 'btree', 'hash', 'gin', 'gist')\n \"idx\".\"indisunique\" AS \"unique\", -- true if unique index\n \"idx\".\"indisprimary\" AS \"primary\", -- true if this is the PK index\n \"idx\".\"indisvalid\" AS \"valid\", -- false during concurrent index builds\n \"idx\".\"indisready\" AS \"ready\", -- true when index is ready for inserts\n (\"idx\".\"indpred\" IS NOT NULL) AS \"partial\", -- true if index has a WHERE clause (partial index)\n pg_get_expr(\"idx\".\"indpred\", \"idx\".\"indrelid\") AS \"predicate\", -- the WHERE clause expression for partial indexes\n\n -- Index columns: iterate over each position in the index key array\n (\n SELECT json_agg(\n json_build_object(\n -- 'name': column name, or for expression indexes the expression text\n 'name', COALESCE(\"att\".\"attname\", pg_get_indexdef(\"idx\".\"indexrelid\", \"s\".\"i\", true)),\n -- 'expression': non-null only for expression-based index columns (e.g., lower(name))\n 'expression', CASE WHEN \"att\".\"attname\" IS NULL THEN pg_get_indexdef(\"idx\".\"indexrelid\", \"s\".\"i\", true) ELSE NULL END,\n -- 'order': sort direction; bit 0 of indoption = 1 means DESC\n 'order', CASE ((( \"idx\".\"indoption\"::int2[] )[\"s\".\"i\"] & 1)) WHEN 1 THEN 'DESC' ELSE 'ASC' END,\n -- 'nulls': null ordering; bit 1 of indoption = 1 means NULLS FIRST\n 'nulls', CASE (((( \"idx\".\"indoption\"::int2[] )[\"s\".\"i\"] >> 1) & 1)) WHEN 1 THEN 'NULLS FIRST' ELSE 'NULLS LAST' END\n )\n ORDER BY \"s\".\"i\" -- preserve column order within the index\n )\n -- generate_subscripts creates one row per index key position (1-based)\n FROM generate_subscripts(\"idx\".\"indkey\"::int2[], 1) AS \"s\"(\"i\")\n -- Join to pg_attribute to resolve column numbers to names\n -- NULL attname means it's an expression index column\n LEFT JOIN \"pg_catalog\".\"pg_attribute\" AS \"att\"\n ON \"att\".\"attrelid\" = \"cls\".\"oid\"\n AND \"att\".\"attnum\" = (\"idx\".\"indkey\"::int2[])[\"s\".\"i\"]\n ) AS \"columns\"\n\n FROM \"pg_catalog\".\"pg_index\" AS \"idx\" -- pg_index: one row per index\n JOIN \"pg_catalog\".\"pg_class\" AS \"idx_cls\" ON \"idx\".\"indexrelid\" = \"idx_cls\".\"oid\" -- index's own pg_class entry (for the name)\n JOIN \"pg_catalog\".\"pg_am\" AS \"am\" ON \"idx_cls\".\"relam\" = \"am\".\"oid\" -- access method catalog\n WHERE \"idx\".\"indrelid\" = \"cls\".\"oid\" -- only indexes on this table\n ORDER BY \"idx_cls\".\"relname\"\n ) AS agg\n ) AS \"indexes\"\n\n-- === Main FROM: pg_class (tables and views) joined with pg_namespace (schemas) ===\nFROM \"pg_catalog\".\"pg_class\" AS \"cls\"\nINNER JOIN \"pg_catalog\".\"pg_namespace\" AS \"ns\" ON \"cls\".\"relnamespace\" = \"ns\".\"oid\"\nWHERE\n \"ns\".\"nspname\" !~ '^pg_' -- exclude PostgreSQL internal schemas (pg_catalog, pg_toast, etc.)\n AND \"ns\".\"nspname\" != 'information_schema' -- exclude the information_schema\n AND \"cls\".\"relkind\" IN ('r', 'v') -- only tables ('r') and views ('v')\n AND \"cls\".\"relname\" !~ '^pg_' -- exclude system tables starting with pg_\n AND \"cls\".\"relname\" !~ '_prisma_migrations' -- exclude Prisma migration tracking table\n ORDER BY \"ns\".\"nspname\", \"cls\".\"relname\" ASC;\n`;\n\nfunction typeCastingConvert({defaultValue, enums, val, services}:{val: string, enums: Enum[], defaultValue:string, services:ZModelServices}): ((builder: ExpressionBuilder) => AstFactory<Expression>) | null {\n const [value, type] = val\n .replace(/'/g, '')\n .split('::')\n .map((s) => s.trim()) as [string, string];\n switch (type) {\n case 'character varying':\n case 'uuid':\n case 'json':\n case 'jsonb':\n case 'text':\n if (value === 'NULL') return null;\n return (ab) => ab.StringLiteral.setValue(value);\n case 'real':\n return (ab) => ab.NumberLiteral.setValue(value);\n default: {\n const enumDef = enums.find((e) => getDbName(e, true) === type);\n if (!enumDef) {\n return (ab) =>\n ab.InvocationExpr.setFunction(getFunctionRef('dbgenerated', services)).addArg((a) =>\n a.setValue((v) => v.StringLiteral.setValue(val)),\n );\n }\n const enumField = enumDef.fields.find((v) => getDbName(v) === value);\n if (!enumField) {\n throw new CliError(\n `Enum value ${value} not found in enum ${type} for default value ${defaultValue}`,\n );\n }\n return (ab) => ab.ReferenceExpr.setTarget(enumField);\n }\n }\n}\n","import { DataFieldAttributeFactory } from '@zenstackhq/language/factory';\nimport { getAttributeRef, getDbName, getFunctionRef, normalizeDecimalDefault, normalizeFloatDefault } from '../utils';\nimport type { IntrospectedEnum, IntrospectedSchema, IntrospectedTable, IntrospectionProvider } from './provider';\n\n// Note: We dynamically import better-sqlite3 inside the async function to avoid\n// requiring it at module load time for environments that don't use SQLite.\n\nexport const sqlite: IntrospectionProvider = {\n isSupportedFeature(feature) {\n switch (feature) {\n case 'Schema':\n // Multi-schema feature is not available for SQLite because it doesn't have\n // the same concept of schemas as namespaces (unlike PostgreSQL, CockroachDB, SQL Server).\n return false;\n case 'NativeEnum':\n // SQLite doesn't support native enum types\n return false;\n default:\n return false;\n }\n },\n getBuiltinType(type) {\n // Strip parenthesized constraints (e.g., VARCHAR(255) → varchar, DECIMAL(10,2) → decimal)\n const t = (type || '').toLowerCase().trim().replace(/\\(.*\\)$/, '').trim();\n // SQLite has no array types\n const isArray = false;\n\n // SQLite type affinity rules (https://www.sqlite.org/datatype3.html):\n // 1. If type contains \"INT\" → INTEGER affinity\n // 2. If type contains \"CHAR\", \"CLOB\", or \"TEXT\" → TEXT affinity\n // 3. If type contains \"BLOB\" or no type → BLOB affinity\n // 4. If type contains \"REAL\", \"FLOA\", or \"DOUB\" → REAL affinity\n // 5. Otherwise → NUMERIC affinity\n\n // Handle specific known types first for better mapping\n switch (t) {\n // INTEGER types (SQLite: INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, INT2, INT8)\n case 'integer':\n case 'int':\n case 'tinyint':\n case 'smallint':\n case 'mediumint':\n case 'int2':\n case 'int8':\n return { type: 'Int', isArray };\n\n // BIGINT - map to BigInt for large integers\n case 'bigint':\n case 'unsigned big int':\n return { type: 'BigInt', isArray };\n\n // TEXT types (SQLite: CHARACTER, VARCHAR, VARYING CHARACTER, NCHAR, NATIVE CHARACTER, NVARCHAR, TEXT, CLOB)\n case 'text':\n case 'varchar':\n case 'char':\n case 'character':\n case 'varying character':\n case 'nchar':\n case 'native character':\n case 'nvarchar':\n case 'clob':\n return { type: 'String', isArray };\n\n // BLOB type\n case 'blob':\n return { type: 'Bytes', isArray };\n\n // REAL types (SQLite: REAL, DOUBLE, DOUBLE PRECISION, FLOAT)\n case 'real':\n case 'float':\n case 'double':\n case 'double precision':\n return { type: 'Float', isArray };\n\n // NUMERIC types (SQLite: NUMERIC, DECIMAL)\n case 'numeric':\n case 'decimal':\n return { type: 'Decimal', isArray };\n\n // DateTime types\n case 'datetime':\n case 'date':\n case 'time':\n case 'timestamp':\n return { type: 'DateTime', isArray };\n\n // JSON types\n case 'json':\n case 'jsonb':\n return { type: 'Json', isArray };\n\n // Boolean types\n case 'boolean':\n case 'bool':\n return { type: 'Boolean', isArray };\n\n default: {\n // SQLite affinity rule #3: columns with no declared type have BLOB affinity\n if (!t) {\n return { type: 'Bytes', isArray };\n }\n // Fallback: Use SQLite affinity rules for unknown types\n if (t.includes('int')) {\n return { type: 'Int', isArray };\n }\n if (t.includes('char') || t.includes('clob') || t.includes('text')) {\n return { type: 'String', isArray };\n }\n if (t.includes('blob')) {\n return { type: 'Bytes', isArray };\n }\n if (t.includes('real') || t.includes('floa') || t.includes('doub')) {\n return { type: 'Float', isArray };\n }\n // Default to Unsupported for truly unknown types\n return { type: 'Unsupported' as const, isArray };\n }\n }\n },\n\n getDefaultDatabaseType() {\n return undefined;\n },\n\n async introspect(connectionString: string, _options: { schemas: string[]; modelCasing: 'pascal' | 'camel' | 'snake' | 'none' }): Promise<IntrospectedSchema> {\n const SQLite = (await import('better-sqlite3')).default;\n const db = new SQLite(connectionString, { readonly: true });\n\n try {\n const all = <T>(sql: string): T[] => {\n const stmt: any = db.prepare(sql);\n return stmt.all() as T[];\n };\n\n // List user tables and views from sqlite_schema (the master catalog).\n // sqlite_schema contains one row per table, view, index, and trigger.\n // We filter to only tables/views and exclude internal sqlite_* objects.\n // The 'sql' column contains the original CREATE TABLE/VIEW statement.\n const tablesRaw = all<{ name: string; type: 'table' | 'view'; definition: string | null }>(\n \"SELECT name, type, sql AS definition FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n );\n\n // Detect AUTOINCREMENT by parsing the CREATE TABLE statement\n // The sqlite_sequence table only has entries after rows are inserted,\n // so we need to check the actual table definition instead\n const autoIncrementTables = new Set<string>();\n for (const t of tablesRaw) {\n if (t.type === 'table' && t.definition) {\n // AUTOINCREMENT keyword appears in PRIMARY KEY definition\n // e.g., PRIMARY KEY(\"id\" AUTOINCREMENT) or PRIMARY KEY(id AUTOINCREMENT)\n if (/\\bAUTOINCREMENT\\b/i.test(t.definition)) {\n autoIncrementTables.add(t.name);\n }\n }\n }\n\n const tables: IntrospectedTable[] = [];\n\n for (const t of tablesRaw) {\n const tableName = t.name;\n const schema = '';\n\n // Check if this table has autoincrement (detected by parsing the CREATE TABLE DDL)\n const hasAutoIncrement = autoIncrementTables.has(tableName);\n\n // PRAGMA table_xinfo: extended version of table_info that also includes hidden/generated columns.\n // Returns one row per column with: cid (column index), name, type, notnull, dflt_value, pk.\n // hidden: 0 = normal, 1 = hidden (virtual table), 2 = generated VIRTUAL, 3 = generated STORED.\n const columnsInfo = all<{\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n hidden?: number;\n }>(`PRAGMA table_xinfo('${tableName.replace(/'/g, \"''\")}')`);\n\n // PRAGMA index_list: returns all indexes on a table.\n // Each row has: seq (index sequence), name, unique (1 if unique), origin ('c'=CREATE INDEX,\n // 'u'=UNIQUE constraint, 'pk'=PRIMARY KEY), partial (1 if partial index).\n // We exclude sqlite_autoindex_* entries which are auto-generated for UNIQUE constraints.\n const tableNameEsc = tableName.replace(/'/g, \"''\");\n const idxList = all<{\n seq: number;\n name: string;\n unique: number;\n origin: string;\n partial: number;\n }>(`PRAGMA index_list('${tableNameEsc}')`).filter((r) => !r.name.startsWith('sqlite_autoindex_'));\n\n // Detect single-column unique constraints by inspecting each unique index.\n // PRAGMA index_info: returns the columns that make up an index.\n // If a unique (non-partial) index has exactly one column, that column is \"unique\".\n const uniqueSingleColumn = new Set<string>();\n const uniqueIndexRows = idxList.filter((r) => r.unique === 1 && r.partial !== 1);\n for (const idx of uniqueIndexRows) {\n const idxCols = all<{ name: string }>(`PRAGMA index_info('${idx.name.replace(/'/g, \"''\")}')`);\n if (idxCols.length === 1 && idxCols[0]?.name) {\n uniqueSingleColumn.add(idxCols[0].name);\n }\n }\n\n // Build detailed index info for each index.\n // PRAGMA index_info returns one row per column in the index.\n // SQLite doesn't expose access method, predicate, or sort order through PRAGMAs.\n const indexes: IntrospectedTable['indexes'] = idxList.map((idx) => {\n const idxCols = all<{ name: string }>(`PRAGMA index_info('${idx.name.replace(/'/g, \"''\")}')`);\n return {\n name: idx.name,\n method: null, // SQLite does not expose index method\n unique: idx.unique === 1,\n primary: false, // SQLite does not expose this directly; handled via pk in columns\n valid: true, // SQLite does not expose index validity\n ready: true, // SQLite does not expose index readiness\n partial: idx.partial === 1,\n predicate: idx.partial === 1 ? '[partial]' : null, // SQLite does not expose index predicate\n columns: idxCols.map((col) => ({\n name: col.name,\n expression: null,\n order: null,\n nulls: null,\n })),\n };\n });\n\n // PRAGMA foreign_key_list: returns all foreign key constraints on a table.\n // Each row represents one column in a FK constraint with: id (FK id, shared by multi-column FKs),\n // seq (column index within the FK), table (referenced table), from (local column),\n // to (referenced column), on_update, on_delete (referential actions).\n const fkRows = all<{\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string | null;\n on_update: any;\n on_delete: any;\n }>(`PRAGMA foreign_key_list('${tableName.replace(/'/g, \"''\")}')`);\n\n // Extract FK constraint names from CREATE TABLE statement.\n // Captures the constraint name and the full parenthesized column list from\n // FOREIGN KEY(...), then splits and parses individual column names so that\n // composite FKs (e.g., FOREIGN KEY(\"col1\", \"col2\")) are handled correctly.\n const fkConstraintNames = new Map<string, string>();\n if (t.definition) {\n // Match: CONSTRAINT \"name\" FOREIGN KEY(<column list>)\n // Group 1/2: quoted/unquoted constraint name\n // Group 3: the full content inside FOREIGN KEY(...)\n const fkRegex = /CONSTRAINT\\s+(?:[\"'`]([^\"'`]+)[\"'`]|(\\w+))\\s+FOREIGN\\s+KEY\\s*\\(([^)]+)\\)/gi;\n let match;\n while ((match = fkRegex.exec(t.definition)) !== null) {\n const constraintName = match[1] || match[2];\n const columnList = match[3];\n if (constraintName && columnList) {\n // Split the column list on commas and strip quotes/whitespace\n // to extract each individual column name.\n const columns = columnList.split(',').map((col) => col.trim().replace(/^[\"'`]|[\"'`]$/g, ''));\n for (const col of columns) {\n if (col) {\n fkConstraintNames.set(col, constraintName);\n }\n }\n }\n }\n }\n\n const fkByColumn = new Map<\n string,\n {\n foreign_key_schema: string | null;\n foreign_key_table: string | null;\n foreign_key_column: string | null;\n foreign_key_name: string | null;\n foreign_key_on_update: IntrospectedTable['columns'][number]['foreign_key_on_update'];\n foreign_key_on_delete: IntrospectedTable['columns'][number]['foreign_key_on_delete'];\n }\n >();\n\n for (const fk of fkRows) {\n fkByColumn.set(fk.from, {\n foreign_key_schema: '',\n foreign_key_table: fk.table || null,\n foreign_key_column: fk.to || null,\n foreign_key_name: fkConstraintNames.get(fk.from) ?? null,\n foreign_key_on_update: (fk.on_update as any) ?? null,\n foreign_key_on_delete: (fk.on_delete as any) ?? null,\n });\n }\n\n // Pre-extract full column type definitions from DDL for generated columns.\n // PRAGMA table_xinfo only returns the base type (e.g., \"TEXT\"), but for\n // generated columns we need the full definition including the expression\n // (e.g., \"TEXT GENERATED ALWAYS AS (...) STORED\") so they are pulled as\n // Unsupported(\"...\") — matching Prisma's introspection behavior.\n const generatedColDefs = t.definition ? extractColumnTypeDefs(t.definition) : new Map<string, string>();\n\n const columns: IntrospectedTable['columns'] = [];\n for (const c of columnsInfo) {\n // hidden: 0 = normal, 1 = hidden (virtual table) → skip,\n // 2 = generated VIRTUAL, 3 = generated STORED → mark computed\n const hidden = c.hidden ?? 0;\n if (hidden === 1) continue;\n\n const isGenerated = hidden === 2 || hidden === 3;\n\n const fk = fkByColumn.get(c.name);\n\n // Determine default value - check for autoincrement\n // AUTOINCREMENT in SQLite can only be on INTEGER PRIMARY KEY column\n let defaultValue = c.dflt_value;\n if (hasAutoIncrement && c.pk) {\n defaultValue = 'autoincrement';\n }\n\n // For generated columns, use the full DDL type definition so that\n // getBuiltinType returns Unsupported and the column is rendered as\n // Unsupported(\"TYPE GENERATED ALWAYS AS (...) STORED/VIRTUAL\").\n let datatype = c.type || '';\n if (isGenerated) {\n const fullDef = generatedColDefs.get(c.name);\n if (fullDef) {\n datatype = fullDef;\n }\n }\n\n columns.push({\n name: c.name,\n datatype,\n datatype_name: null, // SQLite doesn't support native enums\n length: null,\n precision: null,\n datatype_schema: schema,\n foreign_key_schema: fk?.foreign_key_schema ?? null,\n foreign_key_table: fk?.foreign_key_table ?? null,\n foreign_key_column: fk?.foreign_key_column ?? null,\n foreign_key_name: fk?.foreign_key_name ?? null,\n foreign_key_on_update: fk?.foreign_key_on_update ?? null,\n foreign_key_on_delete: fk?.foreign_key_on_delete ?? null,\n pk: !!c.pk,\n computed: isGenerated,\n nullable: c.notnull !== 1,\n default: defaultValue,\n unique: uniqueSingleColumn.has(c.name),\n unique_name: null,\n });\n }\n\n tables.push({ schema, name: tableName, columns, type: t.type, definition: t.definition, indexes });\n }\n\n const enums: IntrospectedEnum[] = []; // SQLite doesn't support enums\n\n return { tables, enums };\n } finally {\n db.close();\n }\n },\n\n getDefaultValue({ defaultValue, fieldType, services, enums }) { // datatype and datatype_name not used for SQLite\n const val = defaultValue.trim();\n\n switch (fieldType) {\n case 'DateTime':\n if (val === 'CURRENT_TIMESTAMP' || val === 'now()') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('now', services));\n }\n // Fallback to string literal for other DateTime defaults\n return (ab) => ab.StringLiteral.setValue(val);\n\n case 'Int':\n case 'BigInt':\n if (val === 'autoincrement') {\n return (ab) => ab.InvocationExpr.setFunction(getFunctionRef('autoincrement', services));\n }\n return (ab) => ab.NumberLiteral.setValue(val);\n\n case 'Float':\n return normalizeFloatDefault(val);\n\n case 'Decimal':\n return normalizeDecimalDefault(val);\n\n case 'Boolean':\n return (ab) => ab.BooleanLiteral.setValue(val === 'true' || val === '1');\n case 'String':\n if (val.startsWith(\"'\") && val.endsWith(\"'\")) {\n const strippedName = val.slice(1, -1);\n const enumDef = enums.find((e) => e.fields.find((v) => getDbName(v) === strippedName));\n if (enumDef) {\n const enumField = enumDef.fields.find((v) => getDbName(v) === strippedName);\n if (enumField) return (ab) => ab.ReferenceExpr.setTarget(enumField);\n }\n return (ab) => ab.StringLiteral.setValue(strippedName);\n }\n return (ab) => ab.StringLiteral.setValue(val);\n }\n\n console.warn(`Unsupported default value type: \"${defaultValue}\" for field type \"${fieldType}\". Skipping default value.`);\n return null;\n },\n\n getFieldAttributes({ fieldName, fieldType, services }) {\n const factories: DataFieldAttributeFactory[] = [];\n\n // Add @updatedAt for DateTime fields named updatedAt or updated_at\n if (fieldType === 'DateTime' && (fieldName.toLowerCase() === 'updatedat' || fieldName.toLowerCase() === 'updated_at')) {\n factories.push(new DataFieldAttributeFactory().setDecl(getAttributeRef('@updatedAt', services)));\n }\n\n return factories;\n },\n};\n\n/**\n * Extract column type definitions from a CREATE TABLE DDL statement.\n * Returns a map of column name → full type definition string (everything after the column name).\n * Used to get the complete type including GENERATED ALWAYS AS (...) STORED/VIRTUAL for generated columns.\n */\nfunction extractColumnTypeDefs(ddl: string): Map<string, string> {\n // Find the content inside CREATE TABLE \"name\" ( ... )\n // Use a paren-depth approach to find the matching closing paren.\n const openIdx = ddl.indexOf('(');\n if (openIdx === -1) return new Map();\n\n let depth = 1;\n let closeIdx = -1;\n for (let i = openIdx + 1; i < ddl.length; i++) {\n if (ddl[i] === '(') depth++;\n else if (ddl[i] === ')') {\n depth--;\n if (depth === 0) {\n closeIdx = i;\n break;\n }\n }\n }\n if (closeIdx === -1) return new Map();\n\n const content = ddl.substring(openIdx + 1, closeIdx);\n\n // Split column definitions on commas, respecting nested parentheses.\n const defs: string[] = [];\n let current = '';\n depth = 0;\n for (const char of content) {\n if (char === '(') depth++;\n else if (char === ')') depth--;\n else if (char === ',' && depth === 0) {\n defs.push(current.trim());\n current = '';\n continue;\n }\n current += char;\n }\n if (current.trim()) defs.push(current.trim());\n\n // Map column name → type definition (everything after the column name).\n // Table constraints (CONSTRAINT, PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK)\n // are skipped since they don't define columns.\n const result = new Map<string, string>();\n for (const def of defs) {\n // Match: optional quote + column name + optional quote + whitespace + type definition\n const nameMatch = def.match(/^(?:[\"'`]([^\"'`]+)[\"'`]|(\\w+))\\s+(.+)/s);\n if (nameMatch) {\n const name = nameMatch[1] || nameMatch[2];\n const typeDef = nameMatch[3];\n // Skip table-level constraints (they start with keywords, not column names,\n // but could still match the regex — the map lookup by actual column name\n // ensures they never interfere).\n if (name && typeDef) {\n result.set(name, typeDef.trim());\n }\n }\n }\n return result;\n}\n","import type { DataSourceProviderType } from '@zenstackhq/schema';\nexport * from './provider';\n\nimport { mysql } from './mysql';\nimport { postgresql } from './postgresql';\nimport type { IntrospectionProvider } from './provider';\nimport { sqlite } from './sqlite';\n\nexport const providers: Record<DataSourceProviderType, IntrospectionProvider> = {\n mysql,\n postgresql,\n sqlite,\n};\n","import { formatDocument } from '@zenstackhq/language';\nimport colors from 'colors';\nimport fs from 'node:fs';\nimport { getSchemaFile } from './action-utils';\n\ntype Options = {\n schema?: string;\n};\n\n/**\n * CLI action for formatting a ZModel schema file.\n */\nexport async function run(options: Options) {\n const schemaFile = getSchemaFile(options.schema);\n let formattedContent: string;\n\n try {\n formattedContent = await formatDocument(fs.readFileSync(schemaFile, 'utf-8'));\n } catch (error) {\n console.error(colors.red('✗ Schema formatting failed.'));\n // Re-throw to maintain CLI exit code behavior\n throw error;\n }\n\n fs.writeFileSync(schemaFile, formattedContent, 'utf-8');\n console.log(colors.green('✓ Schema formatting completed successfully.'));\n}\n","import { invariant, singleDebounce } from '@zenstackhq/common-helpers';\nimport { ZModelLanguageMetaData } from '@zenstackhq/language';\nimport { type AbstractDeclaration, isPlugin, LiteralExpr, Plugin, type Model } from '@zenstackhq/language/ast';\nimport { getLiteral, getLiteralArray } from '@zenstackhq/language/utils';\nimport { type CliPlugin } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport { createJiti } from 'jiti';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { watch } from 'chokidar';\nimport ora, { type Ora } from 'ora';\nimport { CliError } from '../cli-error';\nimport * as corePlugins from '../plugins';\nimport { getOutputPath, getSchemaFile, loadSchemaDocument } from './action-utils';\n\ntype Options = {\n schema?: string;\n output?: string;\n silent: boolean;\n watch: boolean;\n lite: boolean;\n liteOnly: boolean;\n};\n\n/**\n * CLI action for generating code from schema\n */\nexport async function run(options: Options) {\n const model = await pureGenerate(options, false);\n\n if (options.watch) {\n const logsEnabled = !options.silent;\n\n if (logsEnabled) {\n console.log(colors.green(`\\nEnabled watch mode!`));\n }\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions;\n\n // Get real models file path (cuz its merged into single document -> we need use cst nodes)\n const getRootModelWatchPaths = (model: Model) =>\n new Set<string>(\n (\n model.declarations.filter(\n (v) =>\n v.$cstNode?.parent?.element.$type === 'Model' &&\n !!v.$cstNode.parent.element.$document?.uri?.fsPath,\n ) as AbstractDeclaration[]\n ).map((v) => v.$cstNode!.parent!.element.$document!.uri!.fsPath),\n );\n\n const watchedPaths = getRootModelWatchPaths(model);\n\n if (logsEnabled) {\n const logPaths = [...watchedPaths].map((at) => `- ${at}`).join('\\n');\n console.log(`Watched file paths:\\n${logPaths}`);\n }\n\n const watcher = watch([...watchedPaths], {\n alwaysStat: false,\n ignoreInitial: true,\n ignorePermissionErrors: true,\n ignored: (at) => !schemaExtensions.some((ext) => at.endsWith(ext)),\n });\n\n // prevent save multiple files and run multiple times\n const reGenerateSchema = singleDebounce(\n async () => {\n if (logsEnabled) {\n console.log('Got changes, run generation!');\n }\n\n try {\n const newModel = await pureGenerate(options, true);\n const allModelsPaths = getRootModelWatchPaths(newModel);\n const newModelPaths = [...allModelsPaths].filter((at) => !watchedPaths.has(at));\n const removeModelPaths = [...watchedPaths].filter((at) => !allModelsPaths.has(at));\n\n if (newModelPaths.length) {\n if (logsEnabled) {\n const logPaths = newModelPaths.map((at) => `- ${at}`).join('\\n');\n console.log(`Added file(s) to watch:\\n${logPaths}`);\n }\n\n newModelPaths.forEach((at) => watchedPaths.add(at));\n watcher.add(newModelPaths);\n }\n\n if (removeModelPaths.length) {\n if (logsEnabled) {\n const logPaths = removeModelPaths.map((at) => `- ${at}`).join('\\n');\n console.log(`Removed file(s) from watch:\\n${logPaths}`);\n }\n\n removeModelPaths.forEach((at) => watchedPaths.delete(at));\n watcher.unwatch(removeModelPaths);\n }\n } catch (e) {\n console.error(e);\n }\n },\n 500,\n true,\n );\n\n watcher.on('unlink', (pathAt) => {\n if (logsEnabled) {\n console.log(`Removed file from watch: ${pathAt}`);\n }\n\n watchedPaths.delete(pathAt);\n watcher.unwatch(pathAt);\n\n reGenerateSchema();\n });\n\n watcher.on('change', () => {\n reGenerateSchema();\n });\n }\n}\n\nasync function pureGenerate(options: Options, fromWatch: boolean) {\n const start = Date.now();\n\n const schemaFile = getSchemaFile(options.schema);\n\n const model = await loadSchemaDocument(schemaFile);\n const outputPath = getOutputPath(options, schemaFile);\n\n await runPlugins(schemaFile, model, outputPath, options);\n\n if (!options.silent) {\n console.log(colors.green(`Generation completed successfully in ${Date.now() - start}ms.\\n`));\n\n if (!fromWatch) {\n console.log(`You can now create a ZenStack client with it.\n\n\\`\\`\\`ts\nimport { ZenStackClient } from '@zenstackhq/orm';\nimport { schema } from '${path.relative('.', outputPath)}/schema';\n\nconst client = new ZenStackClient(schema, {\n dialect: { ... }\n});\n\\`\\`\\`\n\nCheck documentation: https://zenstack.dev/docs/`);\n }\n }\n\n return model;\n}\n\nasync function runPlugins(schemaFile: string, model: Model, outputPath: string, options: Options) {\n const plugins = model.declarations.filter(isPlugin);\n const processedPlugins: { cliPlugin: CliPlugin; pluginOptions: Record<string, unknown> }[] = [];\n\n for (const plugin of plugins) {\n const provider = getPluginProvider(plugin);\n\n let cliPlugin: CliPlugin | undefined;\n if (provider.startsWith('@core/')) {\n cliPlugin = (corePlugins as any)[provider.slice('@core/'.length)];\n if (!cliPlugin) {\n throw new CliError(`Unknown core plugin: ${provider}`);\n }\n } else {\n cliPlugin = await loadPluginModule(provider, path.dirname(schemaFile));\n }\n\n if (cliPlugin) {\n const pluginOptions = getPluginOptions(plugin);\n\n // merge CLI options\n if (provider === '@core/typescript') {\n if (pluginOptions['lite'] === undefined) {\n pluginOptions['lite'] = options.lite;\n }\n if (pluginOptions['liteOnly'] === undefined) {\n pluginOptions['liteOnly'] = options.liteOnly;\n }\n }\n\n processedPlugins.push({ cliPlugin, pluginOptions });\n }\n }\n\n const defaultPlugins = [\n {\n plugin: corePlugins['typescript'],\n options: { lite: options.lite, liteOnly: options.liteOnly },\n },\n ];\n defaultPlugins.forEach(({ plugin, options }) => {\n if (!processedPlugins.some((p) => p.cliPlugin === plugin)) {\n // default plugins are run before user plugins\n processedPlugins.unshift({ cliPlugin: plugin, pluginOptions: options });\n }\n });\n\n for (const { cliPlugin, pluginOptions } of processedPlugins) {\n invariant(\n typeof cliPlugin.generate === 'function',\n `Plugin ${cliPlugin.name} does not have a generate function`,\n );\n\n // run plugin generator\n let spinner: Ora | undefined;\n\n if (!options.silent) {\n spinner = ora(cliPlugin.statusText ?? `Running plugin ${cliPlugin.name}`).start();\n }\n try {\n await cliPlugin.generate({\n schemaFile,\n model,\n defaultOutputPath: outputPath,\n pluginOptions,\n });\n spinner?.succeed();\n } catch (err) {\n spinner?.fail();\n console.error(err);\n }\n }\n}\n\nfunction getPluginProvider(plugin: Plugin) {\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 return provider;\n}\n\nfunction getPluginOptions(plugin: Plugin): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of plugin.fields) {\n if (field.name === 'provider') {\n continue; // skip provider\n }\n const value = getLiteral(field.value) ?? getLiteralArray(field.value);\n if (value === undefined) {\n console.warn(`Plugin \"${plugin.name}\" option \"${field.name}\" has unsupported value, skipping`);\n continue;\n }\n result[field.name] = value;\n }\n return result;\n}\n\nasync function loadPluginModule(provider: string, basePath: string) {\n let moduleSpec = provider;\n if (moduleSpec.startsWith('.')) {\n // relative to schema's path\n moduleSpec = path.resolve(basePath, moduleSpec);\n }\n\n const importAsEsm = async (spec: string) => {\n try {\n const result = (await import(spec)).default as CliPlugin;\n return result;\n } catch (err) {\n throw new CliError(`Failed to load plugin module from ${spec}: ${(err as Error).message}`);\n }\n };\n\n const jiti = createJiti(pathToFileURL(basePath).toString());\n const importAsTs = async (spec: string) => {\n try {\n const result = (await jiti.import(spec, { default: true })) as CliPlugin;\n return result;\n } catch (err) {\n throw new CliError(`Failed to load plugin module from ${spec}: ${(err as Error).message}`);\n }\n };\n\n const esmSuffixes = ['.js', '.mjs'];\n const tsSuffixes = ['.ts', '.mts'];\n\n if (fs.existsSync(moduleSpec) && fs.statSync(moduleSpec).isFile()) {\n // try provider as ESM file\n if (esmSuffixes.some((suffix) => moduleSpec.endsWith(suffix))) {\n return await importAsEsm(pathToFileURL(moduleSpec).toString());\n }\n\n // try provider as TS file\n if (tsSuffixes.some((suffix) => moduleSpec.endsWith(suffix))) {\n return await importAsTs(moduleSpec);\n }\n }\n\n // try ESM index files in provider directory\n for (const suffix of esmSuffixes) {\n const indexPath = path.join(moduleSpec, `index${suffix}`);\n if (fs.existsSync(indexPath)) {\n return await importAsEsm(pathToFileURL(indexPath).toString());\n }\n }\n\n // try TS index files in provider directory\n for (const suffix of tsSuffixes) {\n const indexPath = path.join(moduleSpec, `index${suffix}`);\n if (fs.existsSync(indexPath)) {\n return await importAsTs(indexPath);\n }\n }\n\n // last resort, try to import as esm directly\n try {\n return (await import(moduleSpec)).default as CliPlugin;\n } catch {\n // plugin may not export a generator so we simply ignore the error here\n return undefined;\n }\n}\n","export { default as prisma } from './prisma';\nexport { default as typescript } from './typescript';\n","import { PrismaSchemaGenerator, type CliPlugin } from '@zenstackhq/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst plugin: CliPlugin = {\n name: 'Prisma Schema Generator',\n statusText: 'Generating Prisma schema',\n async generate({ model, defaultOutputPath, pluginOptions }) {\n let outFile = path.join(defaultOutputPath, 'schema.prisma');\n if (typeof pluginOptions['output'] === 'string') {\n outFile = path.resolve(defaultOutputPath, pluginOptions['output']);\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n }\n const prismaSchema = await new PrismaSchemaGenerator(model).generate();\n fs.writeFileSync(outFile, prismaSchema);\n },\n};\n\nexport default plugin;\n","import type { CliPlugin } from '@zenstackhq/sdk';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst plugin: CliPlugin = {\n name: 'TypeScript Schema Generator',\n statusText: 'Generating TypeScript schema',\n async generate({ model, defaultOutputPath, pluginOptions }) {\n // output path\n let outDir = defaultOutputPath;\n if (typeof pluginOptions['output'] === 'string') {\n outDir = path.resolve(defaultOutputPath, pluginOptions['output']);\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n }\n\n // lite mode\n const lite = pluginOptions['lite'] === true;\n\n // liteOnly mode\n const liteOnly = pluginOptions['liteOnly'] === true;\n\n // add .js extension when importing\n const importWithFileExtension = pluginOptions['importWithFileExtension'];\n if (importWithFileExtension && typeof importWithFileExtension !== 'string') {\n throw new Error('The \"importWithFileExtension\" option must be a string if specified.');\n }\n\n await new TsSchemaGenerator().generate(model, {\n outDir,\n lite,\n liteOnly,\n importWithFileExtension: importWithFileExtension as string | undefined,\n });\n },\n};\n\nexport default plugin;\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 if (depPkgJson.private) {\n return undefined;\n }\n return { pkg, version: depPkgJson.version as string };\n } catch {\n return { pkg, version: undefined };\n }\n }),\n );\n\n return result.filter((p) => !!p);\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@latest', dev: true },\n { name: '@zenstackhq/orm@latest', 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, 'add', [\n pkg.name,\n ...(pkg.dev ? [pm.agent.startsWith('yarn') || pm.agent === 'bun' ? '--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], onDelete: Cascade)\n authorId String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n const db = new ZenStackClient(schema, {\n dialect: new SqliteDialect({\n database: new SQLite('./zenstack/dev.db'),\n }),\n });\n const user = await db.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 { CliError } from '../cli-error';\nimport { execPrisma } from '../utils/exec-utils';\nimport { generateTempPrismaSchema, getSchemaFile, requireDataSourceUrl } from './action-utils';\nimport { run as runSeed } from './seed';\n\ntype CommonOptions = {\n schema?: string;\n migrations?: string;\n skipSeed?: boolean;\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\ntype ResolveOptions = CommonOptions & {\n applied?: string;\n rolledBack?: string;\n};\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\n // validate datasource url exists\n await requireDataSourceUrl(schemaFile);\n\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 case 'resolve':\n await runResolve(prismaSchemaFile, options as ResolveOptions);\n break;\n }\n } finally {\n if (fs.existsSync(prismaSchemaFile)) {\n fs.unlinkSync(prismaSchemaFile);\n }\n }\n}\n\nfunction runDev(prismaSchemaFile: string, options: DevOptions) {\n try {\n const cmd = [\n 'migrate dev',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n ' --skip-seed',\n options.name ? ` --name \"${options.name}\"` : '',\n options.createOnly ? ' --create-only' : '',\n ].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nasync function runReset(prismaSchemaFile: string, options: ResetOptions) {\n try {\n const cmd = [\n 'migrate reset',\n ` --schema \"${prismaSchemaFile}\"`,\n ' --skip-generate',\n ' --skip-seed',\n options.force ? ' --force' : '',\n ].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n\n if (!options.skipSeed) {\n await runSeed({ noWarnings: true, printStatus: true }, []);\n }\n}\n\nfunction runDeploy(prismaSchemaFile: string, _options: DeployOptions) {\n try {\n const cmd = ['migrate deploy', ` --schema \"${prismaSchemaFile}\"`].join('');\n execPrisma(cmd);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction runStatus(prismaSchemaFile: string, _options: StatusOptions) {\n try {\n execPrisma(`migrate status --schema \"${prismaSchemaFile}\"`);\n } catch (err) {\n handleSubProcessError(err);\n }\n}\n\nfunction runResolve(prismaSchemaFile: string, options: ResolveOptions) {\n if (!options.applied && !options.rolledBack) {\n throw new CliError('Either --applied or --rolled-back option must be provided');\n }\n\n try {\n const cmd = [\n 'migrate resolve',\n ` --schema \"${prismaSchemaFile}\"`,\n options.applied ? ` --applied \"${options.applied}\"` : '',\n options.rolledBack ? ` --rolled-back \"${options.rolledBack}\"` : '',\n ].join('');\n execPrisma(cmd);\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 colors from 'colors';\nimport { execaCommand } from 'execa';\nimport { CliError } from '../cli-error';\nimport { getPkgJsonConfig } from './action-utils';\n\ntype Options = {\n noWarnings?: boolean;\n printStatus?: boolean;\n};\n\n/**\n * CLI action for seeding the database.\n */\nexport async function run(options: Options, args: string[]) {\n const pkgJsonConfig = getPkgJsonConfig(process.cwd());\n if (!pkgJsonConfig.seed) {\n if (!options.noWarnings) {\n console.warn(colors.yellow('No seed script defined in package.json. Skipping seeding.'));\n }\n return;\n }\n\n const command = `${pkgJsonConfig.seed}${args.length > 0 ? ' ' + args.join(' ') : ''}`;\n\n if (options.printStatus) {\n console.log(colors.gray(`Running seed script \"${command}\"...`));\n }\n\n try {\n await execaCommand(command, {\n stdout: 'inherit',\n stderr: 'inherit',\n });\n } catch (err) {\n console.error(colors.red(err instanceof Error ? err.message : String(err)));\n throw new CliError('Failed to seed the database. Please check the error message above for details.');\n }\n}\n","import {\n ConfigExpr,\n InvocationExpr,\n isDataSource,\n isInvocationExpr,\n isLiteralExpr,\n LiteralExpr,\n} from '@zenstackhq/language/ast';\nimport { getStringLiteral } from '@zenstackhq/language/utils';\nimport { ZenStackClient, type ClientContract } from '@zenstackhq/orm';\nimport { MysqlDialect } from '@zenstackhq/orm/dialects/mysql';\nimport { PostgresDialect } from '@zenstackhq/orm/dialects/postgres';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport { RPCApiHandler } from '@zenstackhq/server/api';\nimport { ZenStackMiddleware } from '@zenstackhq/server/express';\nimport SQLite from 'better-sqlite3';\nimport colors from 'colors';\nimport cors from 'cors';\nimport express from 'express';\nimport { createJiti } from 'jiti';\nimport { createPool as createMysqlPool } from 'mysql2';\nimport path from 'node:path';\nimport { Pool as PgPool } from 'pg';\nimport { CliError } from '../cli-error';\nimport { getVersion } from '../utils/version-utils';\nimport { getOutputPath, getSchemaFile, loadSchemaDocument } from './action-utils';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\n\ntype Options = {\n output?: string;\n schema?: string;\n port?: number;\n logLevel?: string[];\n databaseUrl?: string;\n};\n\nexport async function run(options: Options) {\n const allowedLogLevels = ['error', 'query'] as const;\n const log = options.logLevel?.filter((level): level is (typeof allowedLogLevels)[number] =>\n allowedLogLevels.includes(level as any),\n );\n const schemaFile = getSchemaFile(options.schema);\n console.log(colors.gray(`Loading ZModel schema from: ${schemaFile}`));\n\n let outputPath = getOutputPath(options, schemaFile);\n\n // Ensure outputPath is absolute\n if (!path.isAbsolute(outputPath)) {\n outputPath = path.resolve(process.cwd(), outputPath);\n }\n\n const model = await loadSchemaDocument(schemaFile);\n\n const dataSource = model.declarations.find(isDataSource);\n\n let databaseUrl = options.databaseUrl;\n\n if (!databaseUrl) {\n const schemaUrl = dataSource?.fields.find((f) => f.name === 'url')?.value;\n if (!schemaUrl) {\n throw new CliError(\n `The schema's \"datasource\" does not have a \"url\" field, please provide it with -d option.`,\n );\n }\n databaseUrl = evaluateUrl(schemaUrl);\n }\n\n const provider = getStringLiteral(dataSource?.fields.find((f) => f.name === 'provider')?.value)!;\n\n const dialect = createDialect(provider, databaseUrl!, outputPath);\n\n const jiti = createJiti(import.meta.url);\n\n const schemaModule = (await jiti.import(path.join(outputPath, 'schema'))) as any;\n\n // Build omit configuration for computed fields\n const schema = schemaModule.schema as SchemaDef;\n const omit: Record<string, Record<string, boolean>> = {};\n for (const [modelName, modelDef] of Object.entries(schema.models)) {\n const computedFields: Record<string, boolean> = {};\n for (const [fieldName, fieldDef] of Object.entries(modelDef.fields)) {\n if (fieldDef.computed === true) {\n computedFields[fieldName] = true;\n }\n }\n if (Object.keys(computedFields).length > 0) {\n omit[modelName] = computedFields;\n }\n }\n\n const db = new ZenStackClient(schema, {\n dialect: dialect,\n log: log && log.length > 0 ? log : undefined,\n omit: Object.keys(omit).length > 0 ? omit : undefined,\n });\n\n // check whether the database is reachable\n try {\n await db.$connect();\n } catch (err) {\n throw new CliError(`Failed to connect to the database: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n startServer(db, schemaModule.schema, options);\n}\n\nfunction evaluateUrl(schemaUrl: ConfigExpr) {\n if (isLiteralExpr(schemaUrl)) {\n // Handle string literal\n return getStringLiteral(schemaUrl);\n } else if (isInvocationExpr(schemaUrl)) {\n const envFunction = schemaUrl as InvocationExpr;\n const envName = getStringLiteral(envFunction.args[0]?.value as LiteralExpr)!;\n const envValue = process.env[envName];\n if (!envValue) {\n throw new CliError(`Environment variable ${envName} is not set`);\n }\n return envValue;\n } else {\n throw new CliError(`Unable to resolve the \"url\" field value.`);\n }\n}\n\nfunction redactDatabaseUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.password) {\n parsedUrl.password = '***';\n }\n if (parsedUrl.username) {\n parsedUrl.username = '***';\n }\n return parsedUrl.toString();\n } catch {\n // If URL parsing fails, return the original\n return url;\n }\n}\n\nfunction createDialect(provider: string, databaseUrl: string, outputPath: string) {\n switch (provider) {\n case 'sqlite': {\n let resolvedUrl = databaseUrl.trim();\n if (resolvedUrl.startsWith('file:')) {\n const filePath = resolvedUrl.substring('file:'.length);\n if (!path.isAbsolute(filePath)) {\n resolvedUrl = path.join(outputPath, filePath);\n }\n }\n console.log(colors.gray(`Connecting to SQLite database at: ${resolvedUrl}`));\n return new SqliteDialect({\n database: new SQLite(resolvedUrl),\n });\n }\n case 'postgresql':\n console.log(colors.gray(`Connecting to PostgreSQL database at: ${redactDatabaseUrl(databaseUrl)}`));\n return new PostgresDialect({\n pool: new PgPool({\n connectionString: databaseUrl,\n }),\n });\n\n case 'mysql':\n console.log(colors.gray(`Connecting to MySQL database at: ${redactDatabaseUrl(databaseUrl)}`));\n return new MysqlDialect({\n pool: createMysqlPool(databaseUrl),\n });\n\n default:\n throw new CliError(`Unsupported database provider: ${provider}`);\n }\n}\n\nfunction startServer(client: ClientContract<any, any>, schema: any, options: Options) {\n const app = express();\n app.use(cors());\n app.use(express.json({ limit: '5mb' }));\n app.use(express.urlencoded({ extended: true, limit: '5mb' }));\n\n app.use(\n '/api/model',\n ZenStackMiddleware({\n apiHandler: new RPCApiHandler({ schema }),\n getClient: () => client,\n }),\n );\n\n app.get('/api/schema', (_req, res: express.Response) => {\n res.json({ ...schema, zenstackVersion: getVersion() });\n });\n\n const server = app.listen(options.port, () => {\n console.log(`ZenStack proxy server is running on port: ${options.port}`);\n console.log(`You can visit ZenStack Studio at: ${colors.blue('https://studio.zenstack.dev')}`);\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n console.error(\n colors.red(`Port ${options.port} is already in use. Please choose a different port using -p option.`),\n );\n } else {\n throw new CliError(`Failed to start the server: ${err.message}`);\n }\n process.exit(1);\n });\n\n // Graceful shutdown\n process.on('SIGTERM', async () => {\n server.close(() => {\n console.log('\\nZenStack proxy server closed');\n });\n\n await client.$disconnect();\n process.exit(0);\n });\n\n process.on('SIGINT', async () => {\n server.close(() => {\n console.log('\\nZenStack proxy server closed');\n });\n await client.$disconnect();\n process.exit(0);\n });\n}\n","import colors from 'colors';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport semver from 'semver';\n\nconst CHECK_VERSION_TIMEOUT = 2000;\nconst VERSION_CHECK_TAG = 'next';\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\nexport async function checkNewVersion() {\n const currVersion = getVersion();\n let latestVersion: string;\n try {\n latestVersion = await getLatestVersion();\n } catch {\n // noop\n return;\n }\n\n if (latestVersion && currVersion && semver.gt(latestVersion, currVersion)) {\n console.log(`A newer version ${colors.cyan(latestVersion)} is available.`);\n }\n}\n\nexport async function getLatestVersion() {\n const fetchResult = await fetch(`https://registry.npmjs.org/@zenstackhq/cli/${VERSION_CHECK_TAG}`, {\n headers: { accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' },\n signal: AbortSignal.timeout(CHECK_VERSION_TIMEOUT),\n });\n\n if (fetchResult.ok) {\n const data: any = await fetchResult.json();\n const latestVersion = data?.version;\n if (typeof latestVersion === 'string' && semver.valid(latestVersion)) {\n return latestVersion;\n }\n }\n\n throw new Error('invalid npm registry response');\n}\n","import { init, type Mixpanel } from 'mixpanel';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport * as os from 'os';\nimport { TELEMETRY_TRACKING_TOKEN } from './constants';\nimport { isInCi } from './utils/is-ci';\nimport { isInContainer } from './utils/is-container';\nimport isDocker from './utils/is-docker';\nimport { isWsl } from './utils/is-wsl';\nimport { getMachineId } from './utils/machine-id-utils';\nimport { getVersion } from './utils/version-utils';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = getMachineId();\n private readonly sessionid = randomUUID();\n private readonly _os_type = os.type();\n private readonly _os_release = os.release();\n private readonly _os_arch = os.arch();\n private readonly _os_version = os.version();\n private readonly _os_platform = os.platform();\n private readonly version = getVersion();\n private readonly prismaVersion = this.getPrismaVersion();\n private readonly isDocker = isDocker();\n private readonly isWsl = isWsl();\n private readonly isContainer = isInContainer();\n private readonly isCi = isInCi;\n\n constructor() {\n if (process.env['DO_NOT_TRACK'] !== '1' && TELEMETRY_TRACKING_TOKEN) {\n this.mixpanel = init(TELEMETRY_TRACKING_TOKEN, {\n geolocate: true,\n });\n }\n }\n\n get isTracking() {\n return !!this.mixpanel;\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os_type,\n osType: this._os_type,\n osRelease: this._os_release,\n osPlatform: this._os_platform,\n osArch: this._os_arch,\n osVersion: this._os_version,\n nodeVersion: process.version,\n version: this.version,\n prismaVersion: this.prismaVersion,\n isDocker: this.isDocker,\n isWsl: this.isWsl,\n isContainer: this.isContainer,\n isCi: this.isCi,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n trackError(err: Error) {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n }\n\n async trackSpan<T>(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<T> | T,\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n return await action();\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n\n async trackCommand(command: string, action: () => Promise<void> | void) {\n await this.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', { command }, action);\n }\n\n async trackCli(action: () => Promise<void> | void) {\n await this.trackSpan('cli:start', 'cli:complete', 'cli:error', {}, action);\n }\n\n getPrismaVersion() {\n try {\n const packageJsonPath = import.meta.resolve('prisma/package.json');\n const packageJsonUrl = new URL(packageJsonPath);\n const packageJson = JSON.parse(fs.readFileSync(packageJsonUrl, 'utf8'));\n return packageJson.version;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const telemetry = new Telemetry();\n","// replaced at build time\nexport const TELEMETRY_TRACKING_TOKEN = '<TELEMETRY_TRACKING_TOKEN>';\n\n// plugin-contributed model file name\nexport const PLUGIN_MODULE_NAME = 'plugin.zmodel';\n","import { env } from 'node:process';\nexport const isInCi =\n env['CI'] !== '0' &&\n env['CI'] !== 'false' &&\n ('CI' in env || 'CONTINUOUS_INTEGRATION' in env || Object.keys(env).some((key) => key.startsWith('CI_')));\n","import fs from 'node:fs';\nimport isDocker from './is-docker';\n\nlet cachedResult: boolean | undefined;\n\n// Podman detection\nconst hasContainerEnv = () => {\n try {\n fs.statSync('/run/.containerenv');\n return true;\n } catch {\n return false;\n }\n};\n\nexport function isInContainer() {\n // TODO: Use `??=` when targeting Node.js 16.\n if (cachedResult === undefined) {\n cachedResult = hasContainerEnv() || isDocker();\n }\n\n return cachedResult;\n}\n","// Copied over from https://github.com/sindresorhus/is-docker for CJS compatibility\n\nimport fs from 'node:fs';\n\nlet isDockerCached: boolean | undefined;\n\nfunction hasDockerEnv() {\n try {\n fs.statSync('/.dockerenv');\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasDockerCGroup() {\n try {\n return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n } catch {\n return false;\n }\n}\n\nexport default function isDocker() {\n // TODO: Use `??=` when targeting Node.js 16.\n if (isDockerCached === undefined) {\n isDockerCached = hasDockerEnv() || hasDockerCGroup();\n }\n\n return isDockerCached;\n}\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nexport const isWsl = () => {\n if (process.platform !== 'linux') {\n return false;\n }\n\n if (os.release().toLowerCase().includes('microsoft')) {\n return true;\n }\n\n try {\n return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft');\n } catch {\n return false;\n }\n};\n","// modified from https://github.com/automation-stack/node-machine-id\n\nimport { execSync } from 'child_process';\nimport { createHash, randomUUID } from 'node:crypto';\n\nconst { platform } = process;\nconst win32RegBinPath = {\n native: '%windir%\\\\System32',\n mixed: '%windir%\\\\sysnative\\\\cmd.exe /c %windir%\\\\System32',\n};\nconst guid = {\n darwin: 'ioreg -rd1 -c IOPlatformExpertDevice',\n win32:\n `${win32RegBinPath[isWindowsProcessMixedOrNativeArchitecture()]}\\\\REG.exe ` +\n 'QUERY HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography ' +\n '/v MachineGuid',\n linux: '( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname 2> /dev/null) | head -n 1 || :',\n freebsd: 'kenv -q smbios.system.uuid || sysctl -n kern.hostuuid',\n};\n\nfunction isWindowsProcessMixedOrNativeArchitecture() {\n // eslint-disable-next-line no-prototype-builtins\n if (process.arch === 'ia32' && process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')) {\n return 'mixed';\n }\n return 'native';\n}\n\nfunction hash(guid: string): string {\n return createHash('sha256').update(guid).digest('hex');\n}\n\nfunction expose(result: string): string | undefined {\n switch (platform) {\n case 'darwin':\n return result\n .split('IOPlatformUUID')[1]\n ?.split('\\n')[0]\n ?.replace(/=|\\s+|\"/gi, '')\n .toLowerCase();\n case 'win32':\n return result\n .toString()\n .split('REG_SZ')[1]\n ?.replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n case 'linux':\n return result\n .toString()\n .replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n case 'freebsd':\n return result\n .toString()\n .replace(/\\r+|\\n+|\\s+/gi, '')\n .toLowerCase();\n default:\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n}\n\nexport function getMachineId() {\n if (!(platform in guid)) {\n return randomUUID();\n }\n try {\n const value = execSync(guid[platform as keyof typeof guid]);\n const id = expose(value.toString());\n if (!id) {\n return randomUUID();\n }\n return hash(id);\n } catch {\n return randomUUID();\n }\n}\n"],"mappings":"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","names":["import_language","import_colors","import_colors","CliError","Error","getSchemaFile","file","fs","existsSync","CliError","pkgJsonConfig","getPkgJsonConfig","process","cwd","schema","statSync","isDirectory","schemaPath","path","join","loadSchemaDocument","schemaFile","opts","returnServices","mergeImports","loadResult","loadDocument","success","errors","forEach","err","console","error","colors","red","warnings","warn","yellow","model","services","handleSubProcessError","Error","status","exit","generateTempPrismaSchema","zmodelPath","folder","declarations","some","isDataSource","prismaSchema","PrismaSchemaGenerator","generate","dirname","prismaSchemaFile","resolve","writeFileSync","startPath","result","undefined","output","seed","pkgJsonFile","findUp","pkgJson","JSON","parse","readFileSync","zenstack","names","multiple","name","target","find","push","up","length","requireDataSourceUrl","zmodel","dataSource","fields","f","getOutputPath","options","run","options","schemaFile","getSchemaFile","schema","loadSchemaDocument","console","log","colors","green","error","red","import_language","import_ast","import_colors","import_node_fs","import_node_path","execSync","cmd","options","env","restOptions","mergedEnv","process","undefined","_exec","encoding","stdio","execPackage","packageManager","versions","execPrisma","args","prismaPath","resolve","fileURLToPath","require","_options","PRISMA_HIDE_UPDATE_MESSAGE","import_colors","import_ast","import_ast","getDatasource","model","datasource","declarations","find","d","$type","CliError","urlField","fields","f","name","url","getStringLiteral","value","isInvocationExpr","envName","args","process","env","startsWith","URL","$document","uri","path","pathname","platform","slice","defaultSchemaField","defaultSchema","schemasField","schemas","getLiteralArray","filter","s","undefined","provider","allSchemas","getDbName","decl","includeSchema","schemaAttr","attributes","a","ref","schema","schemaAttrValue","formatName","nameAttr","attrValue","getRelationFkName","relationAttr","getRelationFieldsKey","fieldsArg","fieldNames","items","item","map","target","$refText","sort","length","join","getDeclarationRef","type","name","services","node","shared","workspace","IndexManager","allElements","find","m","getDbName","CliError","getEnumRef","getAttributeRef","name","services","getDeclarationRef","getFunctionRef","normalizeFloatDefault","val","test","ab","NumberLiteral","setValue","normalizeDecimalDefault","integerPart","fractionalPart","split","normalized","replace","length","padEnd","resolveNameCasing","casing","originalName","name","fieldPrefix","test","charAt","toPascalCase","toCamelCase","toSnakeCase","modified","isAllUpperCase","str","toUpperCase","replace","_","c","toLowerCase","syncEnums","dbEnums","model","oldModel","provider","options","services","defaultSchema","isSupportedFeature","dbEnum","modified","name","resolveNameCasing","modelCasing","enum_type","console","log","colors","gray","factory","EnumFactory","setName","alwaysMap","addAttribute","builder","setDecl","getAttributeRef","addArg","argBuilder","StringLiteral","setValue","values","forEach","v","fieldCasing","addField","schema_name","b","a","declarations","push","get","$container","dummyBuildReference","_node","_property","_refNode","refText","$refText","filter","d","isEnum","copy","AstUtils","copyAstNode","syncTable","table","idAttribute","modelIdAttribute","uniqueAttribute","modelUniqueAttribute","fieldMapAttribute","tableMapAttribute","modelindexAttribute","relations","multiPk","columns","c","pk","length","modelFactory","DataModelFactory","setIsView","type","setContainer","fkGroups","Map","column","foreign_key_table","foreign_key_name","group","set","fkName","fkColumns","firstCol","isSingleColumnPk","isUniqueRelation","unique","schema","map","fk_name","foreign_key_on_delete","foreign_key_on_update","nullable","references","foreign_key_schema","foreign_key_column","builtinType","getBuiltinType","datatype","setType","typeBuilder","setArray","isArray","setOptional","computed","setUnsupported","unsupportedBuilder","lt","ref","find","getDbName","datatype_name","CliError","setReference","fieldAttrs","getFieldAttributes","fieldName","fieldType","precision","bind","default","defaultExprBuilder","getDefaultValue","defaultValue","enums","$type","defaultAttr","DataFieldAttributeFactory","isDefaultName","unique_name","ab","pkColumns","arrayExpr","ArrayExpr","node","fields","f","addItem","itemBuilder","ReferenceExpr","setTarget","hasUniqueConstraint","some","indexes","i","addComment","sortedIndexes","reverse","sort","index","predicate","warn","yellow","expression","primary","includes","attr","refExpr","order","suffix","join","syncRelation","relation","selfRelation","similarRelations","relationAttribute","includeRelationName","sourceModel","sourceFields","colName","idx","findIndex","field","targetModel","targetFields","firstSourceField","firstSourceFieldId","firstColumn","fieldPrefix","test","charAt","relationName","sourceNameFromReference","toLowerCase","endsWith","slice","undefined","sourceFieldFromReference","sourceFieldName","lowerCaseFirst","sourceFieldFactory","DataFieldFactory","tb","aeb","onDeleteDefault","enumRef","getEnumRef","enumFieldRef","replace","defaultFkName","splice","oppositeFieldPrefix","oppositeFieldName","targetFieldFactory","import_factory","normalizeGenerationExpression","typeDef","replace","mysql","isSupportedFeature","feature","getBuiltinType","type","t","toLowerCase","trim","isArray","startsWith","getDefaultDatabaseType","precision","introspect","connectionString","options","connection","createConnection","url","URL","databaseName","pathname","CliError","tableRows","execute","getTableIntrospectionQuery","tables","row","columns","JSON","parse","indexes","sortedColumns","sort","a","b","ordinal_position","map","col","datatype","datatype_name","resolveNameCasing","modelCasing","name","computed","filteredIndexes","filter","idx","length","push","schema","definition","enumRows","getEnumIntrospectionQuery","enums","values","parseEnumValues","column_type","syntheticName","table_name","column_name","schema_name","enum_type","end","getDefaultValue","defaultValue","fieldType","services","val","toUpperCase","enumDef","find","e","getDbName","enumValue","endsWith","slice","enumField","fields","f","ab","ReferenceExpr","setTarget","test","InvocationExpr","setFunction","getFunctionRef","StringLiteral","setValue","NumberLiteral","normalizeFloatDefault","normalizeDecimalDefault","BooleanLiteral","includes","addArg","v","console","warn","getFieldAttributes","fieldName","factories","DataFieldAttributeFactory","setDecl","getAttributeRef","dbAttr","shared","workspace","IndexManager","allElements","d","node","defaultDatabaseType","dbAttrFactory","sizeValue","undefined","columnType","match","valuesString","current","inQuote","i","char","import_factory","pgTypnameToStandard","int2","int4","int8","float4","float8","bool","bpchar","numeric","standardTypePrecisions","smallint","integer","bigint","real","pgTypnameToZenStackNativeType","decimal","boolean","text","varchar","character","uuid","date","time","timetz","timestamp","timestamptz","bytea","json","jsonb","xml","inet","bit","varbit","oid","money","citext","postgresql","isSupportedFeature","feature","supportedFeatures","includes","getBuiltinType","type","t","toLowerCase","isArray","startsWith","replace","introspect","connectionString","options","client","Client","connect","rows","tables","query","tableIntrospectionQuery","enums","enumIntrospectionQuery","filteredTables","filter","schemas","schema","filteredEnums","e","schema_name","end","getDefaultDatabaseType","precision","getDefaultValue","defaultValue","fieldType","datatype","datatype_name","services","val","trim","enumDef","find","getDbName","enumValue","split","enumField","fields","f","ab","ReferenceExpr","setTarget","typeCastingConvert","InvocationExpr","setFunction","getFunctionRef","StringLiteral","setValue","NumberLiteral","normalizeFloatDefault","normalizeDecimalDefault","BooleanLiteral","endsWith","slice","addArg","a","v","console","warn","getFieldAttributes","fieldName","length","factories","push","DataFieldAttributeFactory","setDecl","getAttributeRef","nativeTypeName","dbAttr","shared","workspace","IndexManager","allElements","d","name","node","defaultDatabaseType","normalizedDatatype","standardPrecision","isStandardPrecision","undefined","dbAttrFactory","value","map","s","CliError","import_factory","sqlite","isSupportedFeature","feature","getBuiltinType","type","t","toLowerCase","trim","replace","isArray","includes","getDefaultDatabaseType","undefined","introspect","connectionString","_options","SQLite","default","db","readonly","all","sql","stmt","prepare","tablesRaw","autoIncrementTables","Set","definition","test","add","name","tables","tableName","schema","hasAutoIncrement","has","columnsInfo","tableNameEsc","idxList","filter","r","startsWith","uniqueSingleColumn","uniqueIndexRows","unique","partial","idx","idxCols","length","indexes","map","method","primary","valid","ready","predicate","columns","col","expression","order","nulls","fkRows","fkConstraintNames","Map","fkRegex","match","exec","constraintName","columnList","split","set","fkByColumn","fk","from","foreign_key_schema","foreign_key_table","table","foreign_key_column","to","foreign_key_name","get","foreign_key_on_update","on_update","foreign_key_on_delete","on_delete","generatedColDefs","extractColumnTypeDefs","c","hidden","isGenerated","defaultValue","dflt_value","pk","datatype","fullDef","push","datatype_name","precision","datatype_schema","computed","nullable","notnull","unique_name","enums","close","getDefaultValue","fieldType","services","val","ab","InvocationExpr","setFunction","getFunctionRef","StringLiteral","setValue","NumberLiteral","normalizeFloatDefault","normalizeDecimalDefault","BooleanLiteral","endsWith","strippedName","slice","enumDef","find","e","fields","v","getDbName","enumField","ReferenceExpr","setTarget","console","warn","getFieldAttributes","fieldName","factories","DataFieldAttributeFactory","setDecl","getAttributeRef","ddl","openIdx","indexOf","depth","closeIdx","i","content","substring","defs","current","char","result","def","nameMatch","typeDef","providers","mysql","postgresql","sqlite","run","command","options","runPush","runPull","schemaFile","getSchemaFile","schema","requireDataSourceUrl","prismaSchemaFile","generateTempPrismaSchema","cmd","acceptDataLoss","forceReset","join","execPrisma","err","handleSubProcessError","fs","existsSync","unlinkSync","spinner","ora","outPath","output","path","resolve","undefined","treatAsFile","lstatSync","isFile","extname","model","services","loadSchemaDocument","returnServices","mergeImports","SUPPORTED_PROVIDERS","Object","keys","pullProviders","datasource","getDatasource","includes","provider","CliError","start","enums","tables","introspect","url","schemas","allSchemas","modelCasing","succeed","console","log","colors","blue","newModel","$type","$container","$containerProperty","$containerIndex","declarations","filter","d","imports","syncEnums","dbEnums","defaultSchema","oldModel","resolvedRelations","table","relations","syncTable","push","relation","similarRelations","rr","references","columns","length","selfRelation","syncRelation","baseDir","dirname","baseDirUrlPath","URL","pathname","docs","shared","workspace","LangiumDocuments","all","uri","toLowerCase","startsWith","toArray","docsSet","Set","map","toString","bold","deletedModels","deletedEnums","addedModels","addedEnums","modelChanges","Map","getModelChanges","modelName","has","set","addedFields","deletedFields","updatedFields","addedAttributes","deletedAttributes","updatedAttributes","get","IndexManager","allElements","declaration","find","getDbName","node","forEach","decl","index","findIndex","splice","red","name","isSupportedFeature","DataModel","Enum","_declaration","newDataModel","originalDataModel","green","fields","f","type","reference","ref","$refText","originalFields","isRelationField","attributes","some","a","getRelationFieldsKey","newFieldsKey","getRelationFkName","isBackReferenceField","warn","yellow","of","originalField","at","newType","oldType","fieldUpdates","isOldTypeEnumWithoutNativeSupport","newRefName","oldRefName","isEnumWithoutNativeSupport","optional","array","newDefaultAttr","oldDefaultAttr","serializeArgs","args","arg","value","String","function","target","items","item","newArgsStr","oldArgsStr","attr","field","cloned","matchByDbName","originalFieldsKey","matchByFieldsKey","matchByFkName","matchByTypeRef","_model","msg","size","changes","hasChanges","cyan","gray","generator","ZModelCodeGenerator","quote","indent","zmodelSchema","formatDocument","generate","mkdirSync","recursive","writeFileSync","parseResult","documentModel","relPath","relative","fsPath","targetFile","process","cwd","replace","error","fail","import_language","import_colors","import_node_fs","run","options","schemaFile","getSchemaFile","schema","formattedContent","formatDocument","fs","readFileSync","error","console","colors","red","writeFileSync","log","green","import_common_helpers","import_language","import_ast","import_utils","import_colors","import_node_fs","import_node_path","import_ora","import_sdk","import_node_fs","import_node_path","plugin","name","statusText","generate","model","defaultOutputPath","pluginOptions","outFile","path","join","resolve","fs","existsSync","dirname","mkdirSync","recursive","prismaSchema","PrismaSchemaGenerator","writeFileSync","import_sdk","import_node_fs","import_node_path","plugin","name","statusText","generate","model","defaultOutputPath","pluginOptions","outDir","path","resolve","fs","existsSync","mkdirSync","recursive","lite","liteOnly","importWithFileExtension","Error","TsSchemaGenerator","run","options","model","pureGenerate","watch","logsEnabled","silent","console","log","colors","green","schemaExtensions","ZModelLanguageMetaData","fileExtensions","getRootModelWatchPaths","Set","declarations","filter","v","$cstNode","parent","element","$type","$document","uri","fsPath","map","watchedPaths","logPaths","at","join","watcher","alwaysStat","ignoreInitial","ignorePermissionErrors","ignored","some","ext","endsWith","reGenerateSchema","singleDebounce","newModel","allModelsPaths","newModelPaths","has","removeModelPaths","length","forEach","add","delete","unwatch","e","error","on","pathAt","fromWatch","start","Date","now","schemaFile","getSchemaFile","schema","loadSchemaDocument","outputPath","getOutputPath","runPlugins","path","relative","plugins","isPlugin","processedPlugins","plugin","provider","getPluginProvider","cliPlugin","startsWith","corePlugins","slice","CliError","loadPluginModule","dirname","pluginOptions","getPluginOptions","undefined","lite","liteOnly","push","defaultPlugins","p","unshift","invariant","generate","name","spinner","ora","statusText","defaultOutputPath","succeed","err","fail","providerField","fields","find","f","value","result","field","getLiteral","getLiteralArray","warn","basePath","moduleSpec","resolve","importAsEsm","spec","default","message","jiti","createJiti","pathToFileURL","toString","importAsTs","import","esmSuffixes","tsSuffixes","fs","existsSync","statSync","isFile","suffix","indexPath","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","private","undefined","import_colors","import_node_fs","import_node_path","import_ora","STARTER_ZMODEL","run","projectPath","packages","name","dev","pm","detect","agent","console","log","colors","gray","pkg","resolved","resolveCommand","startsWith","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","import_colors","run","options","args","pkgJsonConfig","getPkgJsonConfig","process","cwd","seed","noWarnings","console","warn","colors","yellow","command","length","join","printStatus","log","gray","execaCommand","stdout","stderr","err","error","red","Error","message","String","CliError","run","command","options","schemaFile","getSchemaFile","schema","requireDataSourceUrl","prismaSchemaDir","migrations","path","dirname","undefined","prismaSchemaFile","generateTempPrismaSchema","runDev","runReset","runDeploy","runStatus","runResolve","fs","existsSync","unlinkSync","cmd","name","createOnly","join","execPrisma","err","handleSubProcessError","force","skipSeed","runSeed","noWarnings","printStatus","_options","applied","rolledBack","CliError","Error","status","process","exit","import_ast","import_utils","import_mysql","import_sqlite","import_colors","import_express","import_jiti","import_mysql2","import_node_path","import_pg","import_colors","import_node_fs","import_node_path","import_node_url","import_meta","CHECK_VERSION_TIMEOUT","VERSION_CHECK_TAG","getVersion","_dirname","__dirname","path","dirname","fileURLToPath","import_meta","url","JSON","parse","fs","readFileSync","join","version","undefined","checkNewVersion","currVersion","latestVersion","getLatestVersion","semver","gt","console","log","colors","cyan","fetchResult","fetch","headers","accept","signal","AbortSignal","timeout","ok","data","json","valid","Error","import_meta","run","options","allowedLogLevels","log","logLevel","filter","level","includes","schemaFile","getSchemaFile","schema","console","colors","gray","outputPath","getOutputPath","path","isAbsolute","resolve","process","cwd","model","loadSchemaDocument","dataSource","declarations","find","isDataSource","databaseUrl","schemaUrl","fields","f","name","value","CliError","evaluateUrl","provider","getStringLiteral","dialect","createDialect","jiti","createJiti","import_meta","url","schemaModule","import","join","omit","modelName","modelDef","Object","entries","models","computedFields","fieldName","fieldDef","computed","keys","length","db","ZenStackClient","undefined","$connect","err","Error","message","String","startServer","isLiteralExpr","isInvocationExpr","envFunction","envName","args","envValue","env","redactDatabaseUrl","parsedUrl","URL","password","username","toString","resolvedUrl","trim","startsWith","filePath","substring","SqliteDialect","database","SQLite","PostgresDialect","pool","PgPool","connectionString","MysqlDialect","createMysqlPool","client","app","express","use","cors","json","limit","urlencoded","extended","ZenStackMiddleware","apiHandler","RPCApiHandler","getClient","get","_req","res","zenstackVersion","getVersion","server","listen","port","blue","on","code","error","red","exit","close","$disconnect","import_node_crypto","import_node_fs","os","TELEMETRY_TRACKING_TOKEN","isInCi","env","Object","keys","some","key","startsWith","import_node_fs","import_node_fs","isDockerCached","hasDockerEnv","fs","statSync","hasDockerCGroup","readFileSync","includes","isDocker","undefined","cachedResult","hasContainerEnv","fs","statSync","isInContainer","undefined","isDocker","import_node_process","import_node_fs","isWsl","process","platform","os","release","toLowerCase","includes","fs","readFileSync","import_child_process","platform","process","win32RegBinPath","native","mixed","guid","darwin","win32","isWindowsProcessMixedOrNativeArchitecture","linux","freebsd","arch","env","hasOwnProperty","hash","createHash","update","digest","expose","result","split","replace","toLowerCase","toString","Error","getMachineId","randomUUID","value","execSync","id","import_meta","Telemetry","mixpanel","hostId","getMachineId","sessionid","randomUUID","_os_type","type","_os_release","release","_os_arch","arch","_os_version","version","_os_platform","platform","getVersion","prismaVersion","getPrismaVersion","isDocker","isWsl","isContainer","isInContainer","isCi","isInCi","process","env","TELEMETRY_TRACKING_TOKEN","init","geolocate","isTracking","track","event","properties","payload","distinct_id","session","time","Date","$os","osType","osRelease","osPlatform","osArch","osVersion","nodeVersion","trackError","err","message","stack","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","duration","trackCommand","command","trackCli","packageJsonPath","import_meta","resolve","packageJsonUrl","URL","packageJson","JSON","parse","fs","readFileSync","undefined","telemetry","generateAction","options","telemetry","trackCommand","generate","migrateAction","subCommand","migrate","dbAction","db","infoAction","projectPath","info","initAction","init","checkAction","check","formatAction","format","seedAction","args","seed","proxyAction","proxy","createProgram","program","Command","alias","helpOption","version","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","noVersionCheckOption","command","addOption","default","action","migrateCommand","migrationsOption","addHelpText","dbCommand","argParser","parseInt","allowExcessArguments","argument","addHelpCommand","hook","_thisCommand","actionCommand","getOptionValue","checkNewVersion","main","exitCode","exitOverride","trackCli","parseAsync","e","CommanderError","CliError","console","error","red","message","includes","some","cmd","isTracking","setTimeout","process","exit"]}