diff --git a/packages/cli/src/actions/action-utils.ts b/packages/cli/src/actions/action-utils.ts index 2712e9cf..6bc0f46e 100644 --- a/packages/cli/src/actions/action-utils.ts +++ b/packages/cli/src/actions/action-utils.ts @@ -53,10 +53,13 @@ export function handleSubProcessError(err: unknown) { } } -export async function generateTempPrismaSchema(zmodelPath: string) { +export async function generateTempPrismaSchema(zmodelPath: string, folder?: string) { const model = await loadSchemaDocument(zmodelPath); const prismaSchema = await new PrismaSchemaGenerator(model).generate(); - const prismaSchemaFile = path.resolve(path.dirname(zmodelPath), '~schema.prisma'); + if (!folder) { + folder = path.dirname(zmodelPath); + } + const prismaSchemaFile = path.resolve(folder, '~schema.prisma'); fs.writeFileSync(prismaSchemaFile, prismaSchema); return prismaSchemaFile; } diff --git a/packages/cli/src/actions/migrate.ts b/packages/cli/src/actions/migrate.ts index bb13956d..6a667a16 100644 --- a/packages/cli/src/actions/migrate.ts +++ b/packages/cli/src/actions/migrate.ts @@ -1,9 +1,11 @@ import fs from 'node:fs'; +import path from 'node:path'; import { execPackage } from '../utils/exec-utils'; import { generateTempPrismaSchema, getSchemaFile } from './action-utils'; type CommonOptions = { schema?: string; + migrations?: string; }; type DevOptions = CommonOptions & { @@ -24,7 +26,8 @@ type StatusOptions = CommonOptions; */ export async function run(command: string, options: CommonOptions) { const schemaFile = getSchemaFile(options.schema); - const prismaSchemaFile = await generateTempPrismaSchema(schemaFile); + const prismaSchemaDir = options.migrations ? path.dirname(options.migrations) : undefined; + const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir); try { switch (command) { diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 61013bfe..d75cff32 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -60,12 +60,14 @@ export function createProgram() { .action(generateAction); const migrateCommand = program.command('migrate').description('Update the database schema with migrations.'); + const migrationsOption = new Option('--migrations ', 'path for migrations'); migrateCommand .command('dev') .addOption(schemaOption) .addOption(new Option('-n, --name ', 'migration name')) .addOption(new Option('--create-only', 'only create migration, do not apply')) + .addOption(migrationsOption) .description('Create a migration from changes in schema and apply it to the database.') .action((options) => migrateAction('dev', options)); @@ -73,18 +75,21 @@ export function createProgram() { .command('reset') .addOption(schemaOption) .addOption(new Option('--force', 'skip the confirmation prompt')) + .addOption(migrationsOption) .description('Reset your database and apply all migrations, all data will be lost.') .action((options) => migrateAction('reset', options)); migrateCommand .command('deploy') .addOption(schemaOption) + .addOption(migrationsOption) .description('Deploy your pending migrations to your production/staging database.') .action((options) => migrateAction('deploy', options)); migrateCommand .command('status') .addOption(schemaOption) + .addOption(migrationsOption) .description('check the status of your database migrations.') .action((options) => migrateAction('status', options));