diff --git a/package.json b/package.json index 4ccdc3c6..26be83f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-v3", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack", "packageManager": "pnpm@10.20.0", "scripts": { diff --git a/packages/auth-adapters/better-auth/package.json b/packages/auth-adapters/better-auth/package.json index 455426cf..dbad04eb 100644 --- a/packages/auth-adapters/better-auth/package.json +++ b/packages/auth-adapters/better-auth/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/better-auth", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack Better Auth Adapter. This adapter is modified from better-auth's Prisma adapter.", "type": "module", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 74c3d43f..96b529d5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack CLI", "description": "FullStack database toolkit with built-in access control and automatic API generation.", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "type": "module", "author": { "name": "ZenStack Team" @@ -32,8 +32,10 @@ "@zenstackhq/common-helpers": "workspace:*", "@zenstackhq/language": "workspace:*", "@zenstackhq/sdk": "workspace:*", + "prisma": "catalog:", "colors": "1.4.0", "commander": "^8.3.0", + "execa": "^9.6.0", "langium": "catalog:", "mixpanel": "^0.18.1", "ora": "^5.4.1", @@ -41,9 +43,6 @@ "semver": "^7.7.2", "ts-pattern": "catalog:" }, - "peerDependencies": { - "prisma": "catalog:" - }, "devDependencies": { "@types/better-sqlite3": "catalog:", "@types/semver": "^7.7.0", diff --git a/packages/cli/src/actions/action-utils.ts b/packages/cli/src/actions/action-utils.ts index a96bdb89..d3d0dacf 100644 --- a/packages/cli/src/actions/action-utils.ts +++ b/packages/cli/src/actions/action-utils.ts @@ -78,7 +78,11 @@ export async function generateTempPrismaSchema(zmodelPath: string, folder?: stri } export function getPkgJsonConfig(startPath: string) { - const result: { schema: string | undefined; output: string | undefined } = { schema: undefined, output: undefined }; + const result: { schema: string | undefined; output: string | undefined; seed: string | undefined } = { + schema: undefined, + output: undefined, + seed: undefined, + }; const pkgJsonFile = findUp(['package.json'], startPath, false); if (!pkgJsonFile) { @@ -93,8 +97,16 @@ export function getPkgJsonConfig(startPath: string) { } if (pkgJson.zenstack && typeof pkgJson.zenstack === 'object') { - result.schema = pkgJson.zenstack.schema && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema); - result.output = pkgJson.zenstack.output && path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output); + result.schema = + pkgJson.zenstack.schema && typeof pkgJson.zenstack.schema === 'string' + ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.schema) + : undefined; + result.output = + pkgJson.zenstack.output && typeof pkgJson.zenstack.output === 'string' + ? path.resolve(path.dirname(pkgJsonFile), pkgJson.zenstack.output) + : undefined; + result.seed = + typeof pkgJson.zenstack.seed === 'string' && pkgJson.zenstack.seed ? pkgJson.zenstack.seed : undefined; } return result; @@ -124,3 +136,11 @@ function findUp( } return findUp(names, up, multiple, result); } + +export async function requireDataSourceUrl(schemaFile: string) { + const zmodel = await loadSchemaDocument(schemaFile); + const dataSource = zmodel.declarations.find(isDataSource); + if (!dataSource?.fields.some((f) => f.name === 'url')) { + throw new CliError('The schema\'s "datasource" must have a "url" field to use this command.'); + } +} diff --git a/packages/cli/src/actions/db.ts b/packages/cli/src/actions/db.ts index bd3d45a8..3d010837 100644 --- a/packages/cli/src/actions/db.ts +++ b/packages/cli/src/actions/db.ts @@ -1,6 +1,6 @@ import fs from 'node:fs'; import { execPrisma } from '../utils/exec-utils'; -import { generateTempPrismaSchema, getSchemaFile, handleSubProcessError } from './action-utils'; +import { generateTempPrismaSchema, getSchemaFile, handleSubProcessError, requireDataSourceUrl } from './action-utils'; type Options = { schema?: string; @@ -20,8 +20,12 @@ export async function run(command: string, options: Options) { } async function runPush(options: Options) { - // generate a temp prisma schema file const schemaFile = getSchemaFile(options.schema); + + // validate datasource url exists + await requireDataSourceUrl(schemaFile); + + // generate a temp prisma schema file const prismaSchemaFile = await generateTempPrismaSchema(schemaFile); try { diff --git a/packages/cli/src/actions/index.ts b/packages/cli/src/actions/index.ts index f878bac0..88bce15c 100644 --- a/packages/cli/src/actions/index.ts +++ b/packages/cli/src/actions/index.ts @@ -5,5 +5,6 @@ import { run as generate } from './generate'; import { run as info } from './info'; import { run as init } from './init'; import { run as migrate } from './migrate'; +import { run as seed } from './seed'; -export { check, db, format, generate, info, init, migrate }; +export { check, db, format, generate, info, init, migrate, seed }; diff --git a/packages/cli/src/actions/migrate.ts b/packages/cli/src/actions/migrate.ts index d2f3595b..c0b5ffc4 100644 --- a/packages/cli/src/actions/migrate.ts +++ b/packages/cli/src/actions/migrate.ts @@ -2,11 +2,13 @@ import fs from 'node:fs'; import path from 'node:path'; import { CliError } from '../cli-error'; import { execPrisma } from '../utils/exec-utils'; -import { generateTempPrismaSchema, getSchemaFile } from './action-utils'; +import { generateTempPrismaSchema, getSchemaFile, requireDataSourceUrl } from './action-utils'; +import { run as runSeed } from './seed'; type CommonOptions = { schema?: string; migrations?: string; + skipSeed?: boolean; }; type DevOptions = CommonOptions & { @@ -32,6 +34,10 @@ type ResolveOptions = CommonOptions & { */ export async function run(command: string, options: CommonOptions) { const schemaFile = getSchemaFile(options.schema); + + // validate datasource url exists + await requireDataSourceUrl(schemaFile); + const prismaSchemaDir = options.migrations ? path.dirname(options.migrations) : undefined; const prismaSchemaFile = await generateTempPrismaSchema(schemaFile, prismaSchemaDir); @@ -70,6 +76,7 @@ function runDev(prismaSchemaFile: string, options: DevOptions) { 'migrate dev', ` --schema "${prismaSchemaFile}"`, ' --skip-generate', + ' --skip-seed', options.name ? ` --name "${options.name}"` : '', options.createOnly ? ' --create-only' : '', ].join(''); @@ -79,18 +86,23 @@ function runDev(prismaSchemaFile: string, options: DevOptions) { } } -function runReset(prismaSchemaFile: string, options: ResetOptions) { +async function runReset(prismaSchemaFile: string, options: ResetOptions) { try { const cmd = [ 'migrate reset', ` --schema "${prismaSchemaFile}"`, ' --skip-generate', + ' --skip-seed', options.force ? ' --force' : '', ].join(''); execPrisma(cmd); } catch (err) { handleSubProcessError(err); } + + if (!options.skipSeed) { + await runSeed({ noWarnings: true, printStatus: true }, []); + } } function runDeploy(prismaSchemaFile: string, _options: DeployOptions) { diff --git a/packages/cli/src/actions/seed.ts b/packages/cli/src/actions/seed.ts new file mode 100644 index 00000000..8661c433 --- /dev/null +++ b/packages/cli/src/actions/seed.ts @@ -0,0 +1,38 @@ +import colors from 'colors'; +import { execaCommand } from 'execa'; +import { CliError } from '../cli-error'; +import { getPkgJsonConfig } from './action-utils'; + +type Options = { + noWarnings?: boolean; + printStatus?: boolean; +}; + +/** + * CLI action for seeding the database. + */ +export async function run(options: Options, args: string[]) { + const pkgJsonConfig = getPkgJsonConfig(process.cwd()); + if (!pkgJsonConfig.seed) { + if (!options.noWarnings) { + console.warn(colors.yellow('No seed script defined in package.json. Skipping seeding.')); + } + return; + } + + const command = `${pkgJsonConfig.seed}${args.length > 0 ? ' ' + args.join(' ') : ''}`; + + if (options.printStatus) { + console.log(colors.gray(`Running seed script "${command}"...`)); + } + + try { + await execaCommand(command, { + stdout: 'inherit', + stderr: 'inherit', + }); + } catch (err) { + console.error(colors.red(err instanceof Error ? err.message : String(err))); + throw new CliError('Failed to seed the database. Please check the error message above for details.'); + } +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 89eb6fcd..b48fc321 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -34,6 +34,10 @@ const formatAction = async (options: Parameters[0]): Prom await telemetry.trackCommand('format', () => actions.format(options)); }; +const seedAction = async (options: Parameters[0], args: string[]): Promise => { + await telemetry.trackCommand('db seed', () => actions.seed(options, args)); +}; + function createProgram() { const program = new Command('zen') .alias('zenstack') @@ -87,8 +91,13 @@ function createProgram() { .addOption(schemaOption) .addOption(new Option('--force', 'skip the confirmation prompt')) .addOption(migrationsOption) + .addOption(new Option('--skip-seed', 'skip seeding the database after reset')) .addOption(noVersionCheckOption) .description('Reset your database and apply all migrations, all data will be lost') + .addHelpText( + 'after', + '\nIf there is a seed script defined in package.json, it will be run after the reset. Use --skip-seed to skip it.', + ) .action((options) => migrateAction('reset', options)); migrateCommand @@ -128,6 +137,26 @@ function createProgram() { .addOption(new Option('--force-reset', 'force a reset of the database before push')) .action((options) => dbAction('push', options)); + dbCommand + .command('seed') + .description('Seed the database') + .allowExcessArguments(true) + .addHelpText( + 'after', + ` +Seed script is configured under the "zenstack.seed" field in package.json. +E.g.: +{ + "zenstack": { + "seed": "ts-node ./zenstack/seed.ts" + } +} + +Arguments following -- are passed to the seed script. E.g.: "zen db seed -- --users 10"`, + ) + .addOption(noVersionCheckOption) + .action((options, command) => seedAction(options, command.args)); + program .command('info') .description('Get information of installed ZenStack packages') diff --git a/packages/cli/test/db.test.ts b/packages/cli/test/db.test.ts index 162d09d6..636dcff8 100644 --- a/packages/cli/test/db.test.ts +++ b/packages/cli/test/db.test.ts @@ -15,4 +15,47 @@ describe('CLI db commands test', () => { runCli('db push', workDir); expect(fs.existsSync(path.join(workDir, 'zenstack/dev.db'))).toBe(true); }); + + it('should seed the database with db seed with seed script', () => { + const workDir = createProject(model); + const pkgJson = JSON.parse(fs.readFileSync(path.join(workDir, 'package.json'), 'utf8')); + pkgJson.zenstack = { + seed: 'node seed.js', + }; + fs.writeFileSync(path.join(workDir, 'package.json'), JSON.stringify(pkgJson, null, 2)); + fs.writeFileSync( + path.join(workDir, 'seed.js'), + ` +import fs from 'node:fs'; +fs.writeFileSync('seed.txt', 'success'); + `, + ); + + runCli('db seed', workDir); + expect(fs.readFileSync(path.join(workDir, 'seed.txt'), 'utf8')).toBe('success'); + }); + + it('should seed the database after migrate reset', () => { + const workDir = createProject(model); + const pkgJson = JSON.parse(fs.readFileSync(path.join(workDir, 'package.json'), 'utf8')); + pkgJson.zenstack = { + seed: 'node seed.js', + }; + fs.writeFileSync(path.join(workDir, 'package.json'), JSON.stringify(pkgJson, null, 2)); + fs.writeFileSync( + path.join(workDir, 'seed.js'), + ` +import fs from 'node:fs'; +fs.writeFileSync('seed.txt', 'success'); + `, + ); + + runCli('migrate reset --force', workDir); + expect(fs.readFileSync(path.join(workDir, 'seed.txt'), 'utf8')).toBe('success'); + }); + + it('should skip seeding the database without seed script', () => { + const workDir = createProject(model); + runCli('db seed', workDir); + }); }); diff --git a/packages/clients/tanstack-query/package.json b/packages/clients/tanstack-query/package.json index ce745fcf..5a03f883 100644 --- a/packages/clients/tanstack-query/package.json +++ b/packages/clients/tanstack-query/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/tanstack-query", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "TanStack Query Client for consuming ZenStack v3's CRUD service", "main": "index.js", "type": "module", diff --git a/packages/common-helpers/package.json b/packages/common-helpers/package.json index 1d3261ef..71ce651d 100644 --- a/packages/common-helpers/package.json +++ b/packages/common-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/common-helpers", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack Common Helpers", "type": "module", "scripts": { diff --git a/packages/config/eslint-config/package.json b/packages/config/eslint-config/package.json index 79d3c626..8713714d 100644 --- a/packages/config/eslint-config/package.json +++ b/packages/config/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/eslint-config", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "type": "module", "private": true, "license": "MIT" diff --git a/packages/config/typescript-config/package.json b/packages/config/typescript-config/package.json index 3532e5c9..d005e4e7 100644 --- a/packages/config/typescript-config/package.json +++ b/packages/config/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/typescript-config", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "private": true, "license": "MIT" } diff --git a/packages/config/vitest-config/package.json b/packages/config/vitest-config/package.json index 70e98df2..f0fdece6 100644 --- a/packages/config/vitest-config/package.json +++ b/packages/config/vitest-config/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/vitest-config", "type": "module", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "private": true, "license": "MIT", "exports": { diff --git a/packages/create-zenstack/package.json b/packages/create-zenstack/package.json index c147237d..e68f0535 100644 --- a/packages/create-zenstack/package.json +++ b/packages/create-zenstack/package.json @@ -1,6 +1,6 @@ { "name": "create-zenstack", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "Create a new ZenStack project", "type": "module", "scripts": { diff --git a/packages/ide/vscode/package.json b/packages/ide/vscode/package.json index ad823edd..c6d12348 100644 --- a/packages/ide/vscode/package.json +++ b/packages/ide/vscode/package.json @@ -1,7 +1,7 @@ { "name": "zenstack-v3", "publisher": "zenstack", - "version": "3.0.12", + "version": "3.0.13", "displayName": "ZenStack V3 Language Tools", "description": "VSCode extension for ZenStack (v3) ZModel language", "private": true, diff --git a/packages/language/package.json b/packages/language/package.json index 78dd4b31..dd3b8e0e 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/language", "description": "ZenStack ZModel language specification", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "license": "MIT", "author": "ZenStack Team", "files": [ @@ -55,6 +55,7 @@ } }, "dependencies": { + "@zenstackhq/common-helpers": "workspace:*", "langium": "catalog:", "pluralize": "^8.0.0", "ts-pattern": "catalog:", @@ -63,7 +64,6 @@ "devDependencies": { "@types/pluralize": "^0.0.33", "@types/tmp": "catalog:", - "@zenstackhq/common-helpers": "workspace:*", "@zenstackhq/eslint-config": "workspace:*", "@zenstackhq/typescript-config": "workspace:*", "@zenstackhq/vitest-config": "workspace:*", diff --git a/packages/orm/package.json b/packages/orm/package.json index 69a860a8..6bb619c0 100644 --- a/packages/orm/package.json +++ b/packages/orm/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/orm", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack ORM", "type": "module", "scripts": { diff --git a/packages/orm/src/client/contract.ts b/packages/orm/src/client/contract.ts index 6db19953..4ef52dd5 100644 --- a/packages/orm/src/client/contract.ts +++ b/packages/orm/src/client/contract.ts @@ -1,5 +1,13 @@ import type Decimal from 'decimal.js'; -import { type GetModels, type IsDelegateModel, type ProcedureDef, type SchemaDef } from '../schema'; +import { + type FieldIsArray, + type GetModels, + type IsDelegateModel, + type ProcedureDef, + type RelationFields, + type RelationFieldType, + type SchemaDef, +} from '../schema'; import type { AnyKysely } from '../utils/kysely-utils'; import type { OrUndefinedIf, Simplify, UnwrapTuplePromises } from '../utils/type-utils'; import type { TRANSACTION_UNSUPPORTED_METHODS } from './constants'; @@ -12,6 +20,7 @@ import type { CreateArgs, CreateManyAndReturnArgs, CreateManyArgs, + DefaultModelResult, DeleteArgs, DeleteManyArgs, FindFirstArgs, @@ -810,11 +819,23 @@ export type ModelOperations> = Partial< + DefaultModelResult +> & { + [Key in RelationFields]?: FieldIsArray extends true + ? AuthModelType>[] + : AuthModelType>; +}; + export type AuthType = string extends GetModels ? Record : Schema['authType'] extends GetModels - ? Partial> + ? AuthModelType : never; //#endregion diff --git a/packages/orm/src/client/crud-types.ts b/packages/orm/src/client/crud-types.ts index 934c0139..6fe3f076 100644 --- a/packages/orm/src/client/crud-types.ts +++ b/packages/orm/src/client/crud-types.ts @@ -47,7 +47,7 @@ import type { ToKyselySchema } from './query-builder'; //#region Query results -type DefaultModelResult< +export type DefaultModelResult< Schema extends SchemaDef, Model extends GetModels, Omit = undefined, diff --git a/packages/orm/src/client/crud/validator/utils.ts b/packages/orm/src/client/crud/validator/utils.ts index 94f4baca..657ab804 100644 --- a/packages/orm/src/client/crud/validator/utils.ts +++ b/packages/orm/src/client/crud/validator/utils.ts @@ -125,19 +125,19 @@ export function addBigIntValidation(schema: z.ZodBigInt, attributes: AttributeAp if (val === undefined) { continue; } - const bigIntVal = BigInt(val); + match(attr.name) .with('@gt', () => { - result = result.gt(bigIntVal); + result = result.gt(BigInt(val)); }) .with('@gte', () => { - result = result.gte(bigIntVal); + result = result.gte(BigInt(val)); }) .with('@lt', () => { - result = result.lt(bigIntVal); + result = result.lt(BigInt(val)); }) .with('@lte', () => { - result = result.lte(bigIntVal); + result = result.lte(BigInt(val)); }); } return result; diff --git a/packages/plugins/policy/package.json b/packages/plugins/policy/package.json index 5ddf89da..52dc2270 100644 --- a/packages/plugins/policy/package.json +++ b/packages/plugins/policy/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/plugin-policy", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack Policy Plugin", "type": "module", "scripts": { diff --git a/packages/schema/package.json b/packages/schema/package.json index e94c946c..d1a86d25 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/schema", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack Runtime Schema", "type": "module", "scripts": { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 3fcce31d..8b77a248 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack SDK", "type": "module", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index eb38a7e8..d6ec7c9e 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack automatic CRUD API handlers and server adapters", "type": "module", "scripts": { diff --git a/packages/server/src/api/rest/index.ts b/packages/server/src/api/rest/index.ts index 536a45a5..ed270cb1 100644 --- a/packages/server/src/api/rest/index.ts +++ b/packages/server/src/api/rest/index.ts @@ -116,7 +116,7 @@ registerCustomSerializers(); /** * RESTful-style API request handler (compliant with JSON:API) */ -export class RestApiHandler implements ApiHandler { +export class RestApiHandler implements ApiHandler { // resource serializers private serializers = new Map(); diff --git a/packages/server/src/api/rpc/index.ts b/packages/server/src/api/rpc/index.ts index 586fea33..e4e6ea64 100644 --- a/packages/server/src/api/rpc/index.ts +++ b/packages/server/src/api/rpc/index.ts @@ -11,7 +11,7 @@ registerCustomSerializers(); /** * Options for {@link RPCApiHandler} */ -export type RPCApiHandlerOptions = { +export type RPCApiHandlerOptions = { /** * The schema */ @@ -26,7 +26,7 @@ export type RPCApiHandlerOptions = { /** * RPC style API request handler that mirrors the ZenStackClient API */ -export class RPCApiHandler implements ApiHandler { +export class RPCApiHandler implements ApiHandler { constructor(private readonly options: RPCApiHandlerOptions) {} get schema(): Schema { diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index 290081f5..0a689a34 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -64,7 +64,7 @@ export type Response = { /** * Framework-agnostic API handler. */ -export interface ApiHandler { +export interface ApiHandler { /** * The schema associated with this handler. */ diff --git a/packages/testtools/package.json b/packages/testtools/package.json index cf73d043..5e6f7269 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "ZenStack Test Tools", "type": "module", "scripts": { diff --git a/packages/zod/package.json b/packages/zod/package.json index 5bceb659..99539ed2 100644 --- a/packages/zod/package.json +++ b/packages/zod/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/zod", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "", "type": "module", "main": "index.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4eb5eaf2..f313b66c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,8 +46,8 @@ catalogs: specifier: ^8.13.1 version: 8.16.3 prisma: - specifier: ^6.10.0 - version: 6.14.0 + specifier: ^6.19.0 + version: 6.19.0 react: specifier: 19.2.0 version: 19.2.0 @@ -97,7 +97,7 @@ importers: version: 3.5.3 prisma: specifier: 'catalog:' - version: 6.14.0(magicast@0.3.5)(typescript@5.8.3) + version: 6.19.0(magicast@0.3.5)(typescript@5.8.3) tsup: specifier: ^8.5.0 version: 8.5.0(@swc/core@1.12.5)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) @@ -168,6 +168,9 @@ importers: commander: specifier: ^8.3.0 version: 8.3.0 + execa: + specifier: ^9.6.0 + version: 9.6.0 langium: specifier: 'catalog:' version: 3.5.0 @@ -182,7 +185,7 @@ importers: version: 1.3.0 prisma: specifier: 'catalog:' - version: 6.14.0(magicast@0.3.5)(typescript@5.8.3) + version: 6.19.0(magicast@0.3.5)(typescript@5.8.3) semver: specifier: ^7.7.2 version: 7.7.2 @@ -349,6 +352,9 @@ importers: packages/language: dependencies: + '@zenstackhq/common-helpers': + specifier: workspace:* + version: link:../common-helpers langium: specifier: 'catalog:' version: 3.5.0 @@ -368,9 +374,6 @@ importers: '@types/tmp': specifier: 'catalog:' version: 0.2.6 - '@zenstackhq/common-helpers': - specifier: workspace:* - version: link:../common-helpers '@zenstackhq/eslint-config': specifier: workspace:* version: link:../config/eslint-config @@ -660,7 +663,7 @@ importers: version: 8.16.3 prisma: specifier: 'catalog:' - version: 6.14.0(magicast@0.3.5)(typescript@5.8.3) + version: 6.19.0(magicast@0.3.5)(typescript@5.8.3) tmp: specifier: 'catalog:' version: 0.2.3 @@ -799,7 +802,7 @@ importers: version: link:../../packages/config/typescript-config prisma: specifier: 'catalog:' - version: 6.14.0(magicast@0.3.5)(typescript@5.8.3) + version: 6.19.0(magicast@0.3.5)(typescript@5.8.3) tests/e2e: dependencies: @@ -2256,23 +2259,23 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} - '@prisma/config@6.14.0': - resolution: {integrity: sha512-IwC7o5KNNGhmblLs23swnfBjADkacBb7wvyDXUWLwuvUQciKJZqyecU0jw0d7JRkswrj+XTL8fdr0y2/VerKQQ==} + '@prisma/config@6.19.0': + resolution: {integrity: sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==} - '@prisma/debug@6.14.0': - resolution: {integrity: sha512-j4Lf+y+5QIJgQD4sJWSbkOD7geKx9CakaLp/TyTy/UDu9Wo0awvWCBH/BAxTHUaCpIl9USA5VS/KJhDqKJSwug==} + '@prisma/debug@6.19.0': + resolution: {integrity: sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==} - '@prisma/engines-version@6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49': - resolution: {integrity: sha512-EgN9ODJpiX45yvwcngoStp3uQPJ3l+AEVoQ6dMMO2QvmwIlnxfApzKmJQExzdo7/hqQANrz5txHJdGYHzOnGHA==} + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': + resolution: {integrity: sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==} - '@prisma/engines@6.14.0': - resolution: {integrity: sha512-LhJjqsALFEcoAtF07nSaOkVguaxw/ZsgfROIYZ8bAZDobe7y8Wy+PkYQaPOK1iLSsFgV2MhCO/eNrI1gdSOj6w==} + '@prisma/engines@6.19.0': + resolution: {integrity: sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==} - '@prisma/fetch-engine@6.14.0': - resolution: {integrity: sha512-MPzYPOKMENYOaY3AcAbaKrfvXVlvTc6iHmTXsp9RiwCX+bPyfDMqMFVUSVXPYrXnrvEzhGHfyiFy0PRLHPysNg==} + '@prisma/fetch-engine@6.19.0': + resolution: {integrity: sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==} - '@prisma/get-platform@6.14.0': - resolution: {integrity: sha512-7VjuxKNwjnBhKfqPpMeWiHEa2sVjYzmHdl1slW6STuUCe9QnOY0OY1ljGSvz6wpG4U8DfbDqkG1yofd/1GINww==} + '@prisma/get-platform@6.19.0': + resolution: {integrity: sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==} '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} @@ -4148,8 +4151,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.16.12: - resolution: {integrity: sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==} + effect@3.18.4: + resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} electron-to-chromium@1.5.243: resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==} @@ -5662,11 +5665,6 @@ packages: '@types/node': optional: true - nypm@0.6.1: - resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - nypm@0.6.2: resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} @@ -5938,9 +5936,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.2.0: - resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} - pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} @@ -6208,8 +6203,8 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - prisma@6.14.0: - resolution: {integrity: sha512-QEuCwxu+Uq9BffFw7in8In+WfbSUN0ewnaSUKloLkbJd42w6EyFckux4M0f7VwwHlM3A8ssaz4OyniCXlsn0WA==} + prisma@6.19.0: + resolution: {integrity: sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -9119,35 +9114,35 @@ snapshots: '@poppinss/exception@1.2.2': {} - '@prisma/config@6.14.0(magicast@0.3.5)': + '@prisma/config@6.19.0(magicast@0.3.5)': dependencies: c12: 3.1.0(magicast@0.3.5) deepmerge-ts: 7.1.5 - effect: 3.16.12 + effect: 3.18.4 empathic: 2.0.0 transitivePeerDependencies: - magicast - '@prisma/debug@6.14.0': {} + '@prisma/debug@6.19.0': {} - '@prisma/engines-version@6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49': {} + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} - '@prisma/engines@6.14.0': + '@prisma/engines@6.19.0': dependencies: - '@prisma/debug': 6.14.0 - '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 - '@prisma/fetch-engine': 6.14.0 - '@prisma/get-platform': 6.14.0 + '@prisma/debug': 6.19.0 + '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/fetch-engine': 6.19.0 + '@prisma/get-platform': 6.19.0 - '@prisma/fetch-engine@6.14.0': + '@prisma/fetch-engine@6.19.0': dependencies: - '@prisma/debug': 6.14.0 - '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 - '@prisma/get-platform': 6.14.0 + '@prisma/debug': 6.19.0 + '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/get-platform': 6.19.0 - '@prisma/get-platform@6.14.0': + '@prisma/get-platform@6.19.0': dependencies: - '@prisma/debug': 6.14.0 + '@prisma/debug': 6.19.0 '@rolldown/pluginutils@1.0.0-beta.29': {} @@ -11040,7 +11035,7 @@ snapshots: ee-first@1.1.1: {} - effect@3.16.12: + effect@3.18.4: dependencies: '@standard-schema/spec': 1.0.0 fast-check: 3.23.2 @@ -11795,7 +11790,7 @@ snapshots: consola: 3.4.2 defu: 6.1.4 node-fetch-native: 1.6.7 - nypm: 0.6.1 + nypm: 0.6.2 pathe: 2.0.3 git-up@8.1.1: @@ -12969,14 +12964,6 @@ snapshots: - xml2js - yaml - nypm@0.6.1: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - pathe: 2.0.3 - pkg-types: 2.2.0 - tinyexec: 1.0.1 - nypm@0.6.2: dependencies: citty: 0.1.6 @@ -13313,12 +13300,6 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - pkg-types@2.2.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.7 - pathe: 2.0.3 - pkg-types@2.3.0: dependencies: confbox: 0.2.2 @@ -13559,10 +13540,10 @@ snapshots: dependencies: parse-ms: 4.0.0 - prisma@6.14.0(magicast@0.3.5)(typescript@5.8.3): + prisma@6.19.0(magicast@0.3.5)(typescript@5.8.3): dependencies: - '@prisma/config': 6.14.0(magicast@0.3.5) - '@prisma/engines': 6.14.0 + '@prisma/config': 6.19.0(magicast@0.3.5) + '@prisma/engines': 6.19.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 11104af6..045fb619 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: catalog: kysely: ~0.28.8 zod: ^4.0.0 - prisma: ^6.10.0 + prisma: ^6.19.0 langium: 3.5.0 langium-cli: 3.5.0 ts-pattern: ^5.7.1 diff --git a/samples/next.js/package.json b/samples/next.js/package.json index bd3c4049..515ccd8d 100644 --- a/samples/next.js/package.json +++ b/samples/next.js/package.json @@ -1,6 +1,6 @@ { "name": "next.js", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "private": true, "scripts": { "generate": "zen generate --lite", diff --git a/samples/orm/package.json b/samples/orm/package.json index b61e998e..c088f015 100644 --- a/samples/orm/package.json +++ b/samples/orm/package.json @@ -1,6 +1,6 @@ { "name": "sample-blog", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "description": "", "main": "index.js", "private": true, diff --git a/tests/e2e/package.json b/tests/e2e/package.json index 9dcabf63..5e864720 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -1,6 +1,6 @@ { "name": "e2e", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "private": true, "type": "module", "scripts": { diff --git a/tests/regression/package.json b/tests/regression/package.json index a1c2fe39..fd80a796 100644 --- a/tests/regression/package.json +++ b/tests/regression/package.json @@ -1,6 +1,6 @@ { "name": "regression", - "version": "3.0.0-beta.24", + "version": "3.0.0-beta.25", "private": true, "type": "module", "scripts": { diff --git a/tests/regression/test/issue-204/models.ts b/tests/regression/test/issue-204/models.ts index f7af584e..633c334b 100644 --- a/tests/regression/test/issue-204/models.ts +++ b/tests/regression/test/issue-204/models.ts @@ -9,5 +9,5 @@ import { schema as $schema, type SchemaType as $Schema } from "./schema"; import { type ModelResult as $ModelResult, type TypeDefResult as $TypeDefResult } from "@zenstackhq/orm"; export type Foo = $ModelResult<$Schema, "Foo">; export type Configuration = $TypeDefResult<$Schema, "Configuration">; -export const ShirtColor = $schema.enums.ShirtColor; +export const ShirtColor = $schema.enums.ShirtColor.values; export type ShirtColor = (typeof ShirtColor)[keyof typeof ShirtColor]; diff --git a/tests/regression/test/issue-204/schema.ts b/tests/regression/test/issue-204/schema.ts index b4ae296d..a2de389c 100644 --- a/tests/regression/test/issue-204/schema.ts +++ b/tests/regression/test/issue-204/schema.ts @@ -6,7 +6,7 @@ /* eslint-disable */ import { type SchemaDef } from "@zenstackhq/orm/schema"; -export const schema = { +const _schema = { provider: { type: "sqlite" }, @@ -47,13 +47,19 @@ export const schema = { }, enums: { ShirtColor: { - Black: "Black", - White: "White", - Red: "Red", - Green: "Green", - Blue: "Blue" + values: { + Black: "Black", + White: "White", + Red: "Red", + Green: "Green", + Blue: "Blue" + } } }, plugins: {} } as const satisfies SchemaDef; -export type SchemaType = typeof schema; +type Schema = typeof _schema & { + __brand?: "schema"; +}; +export const schema: Schema = _schema; +export type SchemaType = Schema; diff --git a/tests/regression/test/issue-422/input.ts b/tests/regression/test/issue-422/input.ts new file mode 100644 index 00000000..73b7ed9a --- /dev/null +++ b/tests/regression/test/issue-422/input.ts @@ -0,0 +1,70 @@ +////////////////////////////////////////////////////////////////////////////////////////////// +// DO NOT MODIFY THIS FILE // +// This file is automatically generated by ZenStack CLI and should not be manually updated. // +////////////////////////////////////////////////////////////////////////////////////////////// + +/* eslint-disable */ + +import { type SchemaType as $Schema } from "./schema"; +import type { FindManyArgs as $FindManyArgs, FindUniqueArgs as $FindUniqueArgs, FindFirstArgs as $FindFirstArgs, CreateArgs as $CreateArgs, CreateManyArgs as $CreateManyArgs, CreateManyAndReturnArgs as $CreateManyAndReturnArgs, UpdateArgs as $UpdateArgs, UpdateManyArgs as $UpdateManyArgs, UpdateManyAndReturnArgs as $UpdateManyAndReturnArgs, UpsertArgs as $UpsertArgs, DeleteArgs as $DeleteArgs, DeleteManyArgs as $DeleteManyArgs, CountArgs as $CountArgs, AggregateArgs as $AggregateArgs, GroupByArgs as $GroupByArgs, WhereInput as $WhereInput, SelectInput as $SelectInput, IncludeInput as $IncludeInput, OmitInput as $OmitInput } from "@zenstackhq/orm"; +import type { SimplifiedModelResult as $SimplifiedModelResult, SelectIncludeOmit as $SelectIncludeOmit } from "@zenstackhq/orm"; +export type SessionFindManyArgs = $FindManyArgs<$Schema, "Session">; +export type SessionFindUniqueArgs = $FindUniqueArgs<$Schema, "Session">; +export type SessionFindFirstArgs = $FindFirstArgs<$Schema, "Session">; +export type SessionCreateArgs = $CreateArgs<$Schema, "Session">; +export type SessionCreateManyArgs = $CreateManyArgs<$Schema, "Session">; +export type SessionCreateManyAndReturnArgs = $CreateManyAndReturnArgs<$Schema, "Session">; +export type SessionUpdateArgs = $UpdateArgs<$Schema, "Session">; +export type SessionUpdateManyArgs = $UpdateManyArgs<$Schema, "Session">; +export type SessionUpdateManyAndReturnArgs = $UpdateManyAndReturnArgs<$Schema, "Session">; +export type SessionUpsertArgs = $UpsertArgs<$Schema, "Session">; +export type SessionDeleteArgs = $DeleteArgs<$Schema, "Session">; +export type SessionDeleteManyArgs = $DeleteManyArgs<$Schema, "Session">; +export type SessionCountArgs = $CountArgs<$Schema, "Session">; +export type SessionAggregateArgs = $AggregateArgs<$Schema, "Session">; +export type SessionGroupByArgs = $GroupByArgs<$Schema, "Session">; +export type SessionWhereInput = $WhereInput<$Schema, "Session">; +export type SessionSelect = $SelectInput<$Schema, "Session">; +export type SessionInclude = $IncludeInput<$Schema, "Session">; +export type SessionOmit = $OmitInput<$Schema, "Session">; +export type SessionGetPayload> = $SimplifiedModelResult<$Schema, "Session", Args>; +export type UserFindManyArgs = $FindManyArgs<$Schema, "User">; +export type UserFindUniqueArgs = $FindUniqueArgs<$Schema, "User">; +export type UserFindFirstArgs = $FindFirstArgs<$Schema, "User">; +export type UserCreateArgs = $CreateArgs<$Schema, "User">; +export type UserCreateManyArgs = $CreateManyArgs<$Schema, "User">; +export type UserCreateManyAndReturnArgs = $CreateManyAndReturnArgs<$Schema, "User">; +export type UserUpdateArgs = $UpdateArgs<$Schema, "User">; +export type UserUpdateManyArgs = $UpdateManyArgs<$Schema, "User">; +export type UserUpdateManyAndReturnArgs = $UpdateManyAndReturnArgs<$Schema, "User">; +export type UserUpsertArgs = $UpsertArgs<$Schema, "User">; +export type UserDeleteArgs = $DeleteArgs<$Schema, "User">; +export type UserDeleteManyArgs = $DeleteManyArgs<$Schema, "User">; +export type UserCountArgs = $CountArgs<$Schema, "User">; +export type UserAggregateArgs = $AggregateArgs<$Schema, "User">; +export type UserGroupByArgs = $GroupByArgs<$Schema, "User">; +export type UserWhereInput = $WhereInput<$Schema, "User">; +export type UserSelect = $SelectInput<$Schema, "User">; +export type UserInclude = $IncludeInput<$Schema, "User">; +export type UserOmit = $OmitInput<$Schema, "User">; +export type UserGetPayload> = $SimplifiedModelResult<$Schema, "User", Args>; +export type ProfileFindManyArgs = $FindManyArgs<$Schema, "Profile">; +export type ProfileFindUniqueArgs = $FindUniqueArgs<$Schema, "Profile">; +export type ProfileFindFirstArgs = $FindFirstArgs<$Schema, "Profile">; +export type ProfileCreateArgs = $CreateArgs<$Schema, "Profile">; +export type ProfileCreateManyArgs = $CreateManyArgs<$Schema, "Profile">; +export type ProfileCreateManyAndReturnArgs = $CreateManyAndReturnArgs<$Schema, "Profile">; +export type ProfileUpdateArgs = $UpdateArgs<$Schema, "Profile">; +export type ProfileUpdateManyArgs = $UpdateManyArgs<$Schema, "Profile">; +export type ProfileUpdateManyAndReturnArgs = $UpdateManyAndReturnArgs<$Schema, "Profile">; +export type ProfileUpsertArgs = $UpsertArgs<$Schema, "Profile">; +export type ProfileDeleteArgs = $DeleteArgs<$Schema, "Profile">; +export type ProfileDeleteManyArgs = $DeleteManyArgs<$Schema, "Profile">; +export type ProfileCountArgs = $CountArgs<$Schema, "Profile">; +export type ProfileAggregateArgs = $AggregateArgs<$Schema, "Profile">; +export type ProfileGroupByArgs = $GroupByArgs<$Schema, "Profile">; +export type ProfileWhereInput = $WhereInput<$Schema, "Profile">; +export type ProfileSelect = $SelectInput<$Schema, "Profile">; +export type ProfileInclude = $IncludeInput<$Schema, "Profile">; +export type ProfileOmit = $OmitInput<$Schema, "Profile">; +export type ProfileGetPayload> = $SimplifiedModelResult<$Schema, "Profile", Args>; diff --git a/tests/regression/test/issue-422/models.ts b/tests/regression/test/issue-422/models.ts new file mode 100644 index 00000000..787d1c77 --- /dev/null +++ b/tests/regression/test/issue-422/models.ts @@ -0,0 +1,12 @@ +////////////////////////////////////////////////////////////////////////////////////////////// +// DO NOT MODIFY THIS FILE // +// This file is automatically generated by ZenStack CLI and should not be manually updated. // +////////////////////////////////////////////////////////////////////////////////////////////// + +/* eslint-disable */ + +import { type SchemaType as $Schema } from "./schema"; +import { type ModelResult as $ModelResult } from "@zenstackhq/orm"; +export type Session = $ModelResult<$Schema, "Session">; +export type User = $ModelResult<$Schema, "User">; +export type Profile = $ModelResult<$Schema, "Profile">; diff --git a/tests/regression/test/issue-422/regression.test.ts b/tests/regression/test/issue-422/regression.test.ts new file mode 100644 index 00000000..5d572391 --- /dev/null +++ b/tests/regression/test/issue-422/regression.test.ts @@ -0,0 +1,18 @@ +import { createTestClient } from '@zenstackhq/testtools'; +import { describe, it } from 'vitest'; +import { schema } from './schema'; + +describe('Issue 422 regression tests', () => { + it('should infer correct auth type', async () => { + const db = await createTestClient(schema); + + // all fields optional + db.$setAuth({ id: 'session1' }); + + // relations are allowed + db.$setAuth({ id: 'user1', user: { id: 'user1' } }); + + // nested relations are allowed + db.$setAuth({ id: 'user1', user: { id: 'user1', profile: { name: 'User1' } } }); + }); +}); diff --git a/tests/regression/test/issue-422/schema.ts b/tests/regression/test/issue-422/schema.ts new file mode 100644 index 00000000..587f70aa --- /dev/null +++ b/tests/regression/test/issue-422/schema.ts @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////////////////////////////// +// DO NOT MODIFY THIS FILE // +// This file is automatically generated by ZenStack CLI and should not be manually updated. // +////////////////////////////////////////////////////////////////////////////////////////////// + +/* eslint-disable */ + +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +const _schema = { + provider: { + type: "sqlite" + }, + models: { + Session: { + name: "Session", + fields: { + id: { + name: "id", + type: "String", + id: true, + attributes: [{ name: "@id" }] + }, + token: { + name: "token", + type: "String" + }, + userId: { + name: "userId", + type: "String", + foreignKeyFor: [ + "user" + ] + }, + user: { + name: "user", + type: "User", + attributes: [{ name: "@relation", args: [{ name: "fields", value: ExpressionUtils.array([ExpressionUtils.field("userId")]) }, { name: "references", value: ExpressionUtils.array([ExpressionUtils.field("id")]) }, { name: "onDelete", value: ExpressionUtils.literal("Cascade") }] }], + relation: { opposite: "sessions", fields: ["userId"], references: ["id"], onDelete: "Cascade" } + } + }, + attributes: [ + { name: "@@auth" } + ], + idFields: ["id"], + uniqueFields: { + id: { type: "String" } + } + }, + User: { + name: "User", + fields: { + id: { + name: "id", + type: "String", + id: true, + attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("uuid") }] }], + default: ExpressionUtils.call("uuid") + }, + sessions: { + name: "sessions", + type: "Session", + array: true, + relation: { opposite: "user" } + }, + profile: { + name: "profile", + type: "Profile", + optional: true, + relation: { opposite: "user" } + } + }, + idFields: ["id"], + uniqueFields: { + id: { type: "String" } + } + }, + Profile: { + name: "Profile", + fields: { + id: { + name: "id", + type: "String", + id: true, + attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("uuid") }] }], + default: ExpressionUtils.call("uuid") + }, + name: { + name: "name", + type: "String", + optional: true + }, + userId: { + name: "userId", + type: "String", + unique: true, + attributes: [{ name: "@unique" }], + foreignKeyFor: [ + "user" + ] + }, + user: { + name: "user", + type: "User", + attributes: [{ name: "@relation", args: [{ name: "fields", value: ExpressionUtils.array([ExpressionUtils.field("userId")]) }, { name: "references", value: ExpressionUtils.array([ExpressionUtils.field("id")]) }, { name: "onDelete", value: ExpressionUtils.literal("Cascade") }] }], + relation: { opposite: "profile", fields: ["userId"], references: ["id"], onDelete: "Cascade" } + } + }, + idFields: ["id"], + uniqueFields: { + id: { type: "String" }, + userId: { type: "String" } + } + } + }, + authType: "Session", + plugins: {} +} as const satisfies SchemaDef; +type Schema = typeof _schema & { + __brand?: "schema"; +}; +export const schema: Schema = _schema; +export type SchemaType = Schema; diff --git a/tests/regression/test/issue-422/schema.zmodel b/tests/regression/test/issue-422/schema.zmodel new file mode 100644 index 00000000..c37ed929 --- /dev/null +++ b/tests/regression/test/issue-422/schema.zmodel @@ -0,0 +1,25 @@ +datasource db { + provider = "sqlite" + url = "file:./dev.db" +} + +model Session { + id String @id + token String + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + @@auth +} + +model User { + id String @id @default(uuid()) + sessions Session[] + profile Profile? +} + +model Profile { + id String @id @default(uuid()) + name String? + userId String @unique + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} diff --git a/tests/regression/test/issue-423.test.ts b/tests/regression/test/issue-423.test.ts new file mode 100644 index 00000000..4b0ee49f --- /dev/null +++ b/tests/regression/test/issue-423.test.ts @@ -0,0 +1,16 @@ +import { createTestClient } from '@zenstackhq/testtools'; +import { describe, expect, it } from 'vitest'; + +describe('Regression for issue #423', () => { + it('verifies non-validation attributes for BigInt does not fail', async () => { + const db = await createTestClient( + ` +model SampleBigInt { + id BigInt @id @map("sample_id") + data String +}`, + ); + await expect(db.SampleBigInt.create({ data: { data: "create", id: BigInt(1) } })).resolves.toMatchObject({ id: BigInt(1), data: "create" }); + await expect(db.SampleBigInt.update({ data: { data: "update" }, where: { id: BigInt(1) } })).resolves.toMatchObject({ id: BigInt(1), data: "update" }); + }); +});