diff --git a/package.json b/package.json index ad709074e..dc8d0fb28 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "zenstack-monorepo", - "version": "2.21.1", + "version": "2.22.0", "description": "", "scripts": { "build": "pnpm -r --filter=\"!./packages/ide/*\" build", "build-ci": "pnpm -r build", "lint": "pnpm -r lint", "test": "pnpm -r --parallel run test --silent --forceExit", - "test-ci": "pnpm -r --parallel run --filter=\"./packages/**\" test --silent --forceExit", + "test-ci": "pnpm -r run --filter=\"./packages/**\" test --silent --forceExit", "test-integration": "pnpm run --filter=integration test --silent --forceExit", "test-regression": "pnpm run --filter=regression test --silent --forceExit", "test-scaffold": "tsx script/test-scaffold.ts", diff --git a/packages/ide/jetbrains/build.gradle.kts b/packages/ide/jetbrains/build.gradle.kts index 3c7017171..e1b85627c 100644 --- a/packages/ide/jetbrains/build.gradle.kts +++ b/packages/ide/jetbrains/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "dev.zenstack" -version = "2.21.1" +version = "2.22.0" repositories { mavenCentral() diff --git a/packages/ide/jetbrains/package.json b/packages/ide/jetbrains/package.json index c7dd5e69c..24d148a8d 100644 --- a/packages/ide/jetbrains/package.json +++ b/packages/ide/jetbrains/package.json @@ -1,6 +1,6 @@ { "name": "jetbrains", - "version": "2.21.1", + "version": "2.22.0", "displayName": "ZenStack JetBrains IDE Plugin", "description": "ZenStack JetBrains IDE plugin", "homepage": "https://zenstack.dev", diff --git a/packages/language/package.json b/packages/language/package.json index 314fd0b58..9b71c40cd 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "2.21.1", + "version": "2.22.0", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/misc/redwood/package.json b/packages/misc/redwood/package.json index 8a31cc04b..8e7d14db0 100644 --- a/packages/misc/redwood/package.json +++ b/packages/misc/redwood/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/redwood", "displayName": "ZenStack RedwoodJS Integration", - "version": "2.21.1", + "version": "2.22.0", "description": "CLI and runtime for integrating ZenStack with RedwoodJS projects.", "repository": { "type": "git", diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index 6143f543b..802543d43 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/openapi", "displayName": "ZenStack Plugin and Runtime for OpenAPI", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack plugin and runtime supporting OpenAPI", "main": "index.js", "repository": { diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json index 77606ac3a..96b078871 100644 --- a/packages/plugins/swr/package.json +++ b/packages/plugins/swr/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/swr", "displayName": "ZenStack plugin for generating SWR hooks", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack plugin for generating SWR hooks", "main": "index.js", "repository": { diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json index beb3a39f0..0701ad334 100644 --- a/packages/plugins/tanstack-query/package.json +++ b/packages/plugins/tanstack-query/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/tanstack-query", "displayName": "ZenStack plugin for generating tanstack-query hooks", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack plugin for generating tanstack-query hooks", "main": "index.js", "exports": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 0450c709a..863de7cf3 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/trpc", "displayName": "ZenStack plugin for tRPC", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json index 975e6443f..40ebf8802 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json @@ -10,7 +10,7 @@ "postinstall": "nuxt prepare" }, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", "nuxt": "^3.14.1592", @@ -21,7 +21,7 @@ }, "devDependencies": { "esbuild": "^0.24.0", - "prisma": "6.17.x", + "prisma": "6.19.x", "typescript": "^5.6.2", "vue-tsc": "^2.1.10" } diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json index 3d00b5c8c..9a14e9c21 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json @@ -10,7 +10,7 @@ "postinstall": "nuxt prepare" }, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@trpc/client": "^11.0.0-rc.563", "@trpc/server": "^11.0.0-rc.563", "nuxt": "^3.14.1592", @@ -21,7 +21,7 @@ }, "devDependencies": { "esbuild": "^0.24.0", - "prisma": "6.17.x", + "prisma": "6.19.x", "typescript": "^5.6.2", "vue-tsc": "^2.1.10" } diff --git a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package-lock.json b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package-lock.json index 509bb0bf1..b134e32b9 100644 --- a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package-lock.json +++ b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "hasInstallScript": true, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@t3-oss/env-nextjs": "^0.13.0", "@tanstack/react-query": "^5.50.0", "@trpc/client": "^11.0.0-rc.446", @@ -33,7 +33,7 @@ "@typescript-eslint/parser": "^8.1.0", "eslint": "^8.57.0", "eslint-config-next": "^14.2.4", - "prisma": "6.17.x", + "prisma": "6.19.x", "typescript": "^5.5.3" } }, diff --git a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json index 440bebe23..12a77902d 100644 --- a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json +++ b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json @@ -15,7 +15,7 @@ "start": "next start" }, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@t3-oss/env-nextjs": "^0.13.0", "@tanstack/react-query": "^5.50.0", "@trpc/client": "^11.0.0-rc.446", @@ -39,7 +39,7 @@ "@typescript-eslint/parser": "^8.1.0", "eslint": "^8.57.0", "eslint-config-next": "^14.2.4", - "prisma": "6.17.x", + "prisma": "6.19.x", "typescript": "^5.5.3" }, "ct3aMetadata": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index b1ca3213c..db2c233bb 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "2.21.1", + "version": "2.22.0", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", @@ -122,10 +122,10 @@ "superjson": "^1.13.0", "uuid": "^9.0.0", "zod": "^3.25.0", - "@prisma/client": "6.17.x" + "@prisma/client": "6.19.x" }, "peerDependencies": { - "@prisma/client": "5.0.0 - 6.18.x", + "@prisma/client": "5.0.0 - 7.x", "zod": "catalog:" }, "author": { diff --git a/packages/schema/package.json b/packages/schema/package.json index 414c5668c..c4d8d4374 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "FullStack enhancement for Prisma ORM: seamless integration from database to UI", - "version": "2.21.1", + "version": "2.22.0", "author": { "name": "ZenStack Team" }, @@ -187,13 +187,13 @@ "zod-validation-error": "catalog:" }, "peerDependencies": { - "prisma": "5.0.0 - 6.18.x", + "prisma": "5.0.0 - 7.x", "zod": "catalog:", "@types/node": ">=18.0.0" }, "devDependencies": { - "prisma": "6.17.x", - "@prisma/client": "6.17.x", + "prisma": "6.19.x", + "@prisma/client": "6.19.x", "@types/async-exit-hook": "^2.0.0", "@types/pluralize": "^0.0.29", "@types/semver": "^7.3.13", diff --git a/packages/schema/src/cli/actions/generate.ts b/packages/schema/src/cli/actions/generate.ts index 2f5099312..022c43e12 100644 --- a/packages/schema/src/cli/actions/generate.ts +++ b/packages/schema/src/cli/actions/generate.ts @@ -1,7 +1,9 @@ import { getPrismaClientGenerator, PluginError } from '@zenstackhq/sdk'; import { isPlugin } from '@zenstackhq/sdk/ast'; +import { getPrismaVersion } from '@zenstackhq/sdk/prisma'; import colors from 'colors'; import path from 'path'; +import semver from 'semver'; import { CliError } from '../cli-error'; import { checkNewVersion, @@ -48,6 +50,11 @@ export async function generate(projectPath: string, options: Options) { } } + const prismaVersion = getPrismaVersion(); + if (prismaVersion && semver.gte(prismaVersion, '7.0.0')) { + console.warn(colors.yellow('Prisma 7 support is untested and not planned. Use with caution.')); + } + await runPlugins(options); // note that we can't run online jobs concurrently with plugins because diff --git a/packages/schema/src/language-server/validator/datasource-validator.ts b/packages/schema/src/language-server/validator/datasource-validator.ts index d102e409f..bf934a085 100644 --- a/packages/schema/src/language-server/validator/datasource-validator.ts +++ b/packages/schema/src/language-server/validator/datasource-validator.ts @@ -43,9 +43,8 @@ export default class DataSourceValidator implements AstValidator { private validateUrl(ds: DataSource, accept: ValidationAcceptor) { const url = ds.fields.find((f) => f.name === 'url'); if (!url) { - accept('error', 'datasource must include a "url" field', { - node: ds, - }); + // url field is optional for new versions of Prisma + return; } for (const fieldName of ['url', 'shadowDatabaseUrl']) { diff --git a/packages/schema/src/plugins/enhancer/enhance/auth-type-generator.ts b/packages/schema/src/plugins/enhancer/enhance/auth-type-generator.ts index 3736682ed..94e73c1ba 100644 --- a/packages/schema/src/plugins/enhancer/enhance/auth-type-generator.ts +++ b/packages/schema/src/plugins/enhancer/enhance/auth-type-generator.ts @@ -1,10 +1,11 @@ -import { getIdFields, isAuthInvocation, isDataModelFieldReference } from '@zenstackhq/sdk'; +import { getIdFields, getPrismaClientGenerator, isAuthInvocation, isDataModelFieldReference } from '@zenstackhq/sdk'; import { DataModel, DataModelField, Expression, isDataModel, isMemberAccessExpr, + isTypeDef, TypeDef, type Model, } from '@zenstackhq/sdk/ast'; @@ -19,27 +20,39 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) { const types = new Map< string, { + isTypeDef: boolean; // relation fields to require requiredRelations: { name: string; type: string }[]; } >(); - types.set(authDecl.name, { requiredRelations: [] }); + types.set(authDecl.name, { isTypeDef: isTypeDef(authDecl), requiredRelations: [] }); - const ensureType = (model: string) => { - if (!types.has(model)) { - types.set(model, { requiredRelations: [] }); + const findType = (name: string) => + model.declarations.find((d) => (isDataModel(d) || isTypeDef(d)) && d.name === name); + + const ensureType = (name: string) => { + if (!types.has(name)) { + const decl = findType(name); + if (!decl) { + return; + } + types.set(name, { isTypeDef: isTypeDef(decl), requiredRelations: [] }); } }; - const addAddField = (model: string, name: string, type: string, array: boolean) => { - let fields = types.get(model); - if (!fields) { - fields = { requiredRelations: [] }; - types.set(model, fields); + const addTypeField = (typeName: string, fieldName: string, fieldType: string, array: boolean) => { + let typeInfo = types.get(typeName); + if (!typeInfo) { + const decl = findType(typeName); + if (!decl) { + return; + } + typeInfo = { isTypeDef: isTypeDef(decl), requiredRelations: [] }; + types.set(typeName, typeInfo); } - if (!fields.requiredRelations.find((f) => f.name === name)) { - fields.requiredRelations.push({ name, type: array ? `${type}[]` : type }); + if (!typeInfo.requiredRelations.find((f) => f.name === fieldName)) { + typeInfo.requiredRelations.push({ name: fieldName, type: array ? `${fieldType}[]` : fieldType }); } }; @@ -57,7 +70,7 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) { // member is a relation const fieldType = memberDecl.type.reference.ref.name; ensureType(fieldType); - addAddField(exprType.name, memberDecl.name, fieldType, memberDecl.type.array); + addTypeField(exprType.name, memberDecl.name, fieldType, memberDecl.type.array); } } } @@ -69,12 +82,15 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) { if (isDataModel(fieldType)) { // field is a relation ensureType(fieldType.name); - addAddField(fieldDecl.$container.name, node.target.$refText, fieldType.name, fieldDecl.type.array); + addTypeField(fieldDecl.$container.name, node.target.$refText, fieldType.name, fieldDecl.type.array); } } }); }); + const prismaGenerator = getPrismaClientGenerator(model); + const isNewGenerator = !!prismaGenerator?.isNewGenerator; + // generate: // ` // namespace auth { @@ -86,10 +102,12 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) { return `export namespace auth { type WithRequired = T & { [P in K]-?: T[P] }; ${Array.from(types.entries()) - .map(([model, fields]) => { - let result = `Partial<_P.${model}>`; + .map(([type, typeInfo]) => { + // TypeDef types are generated in "json-types.ts" for the new "prisma-client" generator + const typeRef = isNewGenerator && typeInfo.isTypeDef ? `$TypeDefs.${type}` : `_P.${type}`; + let result = `Partial<${typeRef}>`; - if (model === authDecl.name) { + if (type === authDecl.name) { // auth model's id fields are always required const idFields = getIdFields(authDecl).map((f) => f.name); if (idFields.length > 0) { @@ -97,14 +115,14 @@ ${Array.from(types.entries()) } } - if (fields.requiredRelations.length > 0) { + if (typeInfo.requiredRelations.length > 0) { // merge required relation fields - result = `${result} & { ${fields.requiredRelations.map((f) => `${f.name}: ${f.type}`).join('; ')} }`; + result = `${result} & { ${typeInfo.requiredRelations.map((f) => `${f.name}: ${f.type}`).join('; ')} }`; } result = `${result} & Record`; - return ` export type ${model} = ${result};`; + return ` export type ${type} = ${result};`; }) .join('\n')} }`; diff --git a/packages/schema/src/plugins/enhancer/enhance/index.ts b/packages/schema/src/plugins/enhancer/enhance/index.ts index 5aad2a9fb..0f556efbf 100644 --- a/packages/schema/src/plugins/enhancer/enhance/index.ts +++ b/packages/schema/src/plugins/enhancer/enhance/index.ts @@ -315,16 +315,23 @@ export function enhance(prisma: DbClient, context?: Enh } private createLogicalPrismaImports(prismaImport: string, prismaClientImport: string, target: string | undefined) { + const prismaVersion = getPrismaVersion(); + const runtimeLibraryImportSubPath = prismaVersion && semver.gte(prismaVersion, '7.0.0') ? '/runtime/client' : '/runtime/library'; + const prismaTargetImport = target === 'edge' ? `${prismaImport}/edge` : prismaImport; const runtimeLibraryImport = this.isNewPrismaClientGenerator ? // new generator has these types only in "@prisma/client" - '@prisma/client/runtime/library' + `@prisma/client${runtimeLibraryImportSubPath}` : // old generator has these types generated with the client `${prismaImport}/runtime/library`; + const hasTypeDef = this.model.declarations.some(isTypeDef); + return `import { Prisma as _Prisma, PrismaClient as _PrismaClient } from '${prismaTargetImport}'; import type { InternalArgs, DynamicClientExtensionThis } from '${runtimeLibraryImport}'; -import type * as _P from '${prismaClientImport}'; +import type * as _P from '${prismaClientImport}';${ + hasTypeDef && this.isNewPrismaClientGenerator ? `\nimport type * as $TypeDefs from './json-types';` : '' + } import type { Prisma, PrismaClient } from '${prismaClientImport}'; export type { PrismaClient }; `; @@ -432,8 +439,9 @@ export type Enhanced = let generateCmd = `prisma generate --schema "${logicalPrismaFile}" --generator=${prismaClientGeneratorName}`; const prismaVersion = getPrismaVersion(); - if (!prismaVersion || semver.gte(prismaVersion, '5.2.0')) { + if (!prismaVersion || (semver.gte(prismaVersion, '5.2.0') && semver.lt(prismaVersion, '7.0.0'))) { // add --no-engine to reduce generation size if the prisma version supports + // v7 has removed this option completely, because it no longer generates an engine generateCmd += ' --no-engine'; } diff --git a/packages/schema/src/plugins/zod/generator.ts b/packages/schema/src/plugins/zod/generator.ts index a068f7c76..398ee3995 100644 --- a/packages/schema/src/plugins/zod/generator.ts +++ b/packages/schema/src/plugins/zod/generator.ts @@ -340,7 +340,7 @@ export class ZodSchemaGenerator { }); this.sourceFiles.push(sf); sf.replaceWithText((writer) => { - this.addPreludeAndImports(typeDef, writer, output); + this.addPreludeAndImports(typeDef, writer); writer.write(`const baseSchema = z.object(`); writer.inlineBlock(() => { @@ -383,7 +383,7 @@ export const ${typeDef.name}Schema = ${refineFuncName}(${noRefineSchema}); return schemaName; } - private addPreludeAndImports(decl: DataModel | TypeDef, writer: CodeBlockWriter, output: string) { + private addPreludeAndImports(decl: DataModel | TypeDef, writer: CodeBlockWriter) { writer.writeLine(`import { z } from 'zod/${this.zodVersion}';`); // import user-defined enums from Prisma as they might be referenced in the expressions @@ -396,10 +396,6 @@ export const ${typeDef.name}Schema = ${refineFuncName}(${noRefineSchema}); } } } - if (importEnums.size > 0) { - const prismaImport = computePrismaClientImport(path.join(output, 'models'), this.options); - writer.writeLine(`import { ${[...importEnums].join(', ')} } from '${prismaImport}';`); - } // import enum schemas const importedEnumSchemas = new Set(); @@ -448,7 +444,7 @@ export const ${typeDef.name}Schema = ${refineFuncName}(${noRefineSchema}); const relations = model.fields.filter((field) => isDataModel(field.type.reference?.ref)); const fkFields = model.fields.filter((field) => isForeignKeyField(field)); - this.addPreludeAndImports(model, writer, output); + this.addPreludeAndImports(model, writer); // base schema - including all scalar fields, with optionality following the schema this.createModelBaseSchema('baseSchema', writer, scalarFields, true); @@ -730,9 +726,7 @@ export const ${upperCaseFirst(model.name)}UpdateSchema = ${updateSchema}; /** * Schema refinement function for applying \`@@validate\` rules. */ - export function ${refineFuncName}(schema: z.ZodType) { return schema${refinements.join( - '\n' - )}; + export function ${refineFuncName}(schema: z.ZodType) { return schema${refinements.join('\n')}; } ` ); @@ -766,6 +760,7 @@ export const ${upperCaseFirst(model.name)}UpdateSchema = ${updateSchema}; let expr = new TypeScriptExpressionTransformer({ context: ExpressionContext.ValidationRule, fieldReferenceContext: 'value', + useLiteralEnum: true, }).transform(valueArg); if (isDataModelFieldReference(valueArg)) { diff --git a/packages/schema/src/plugins/zod/utils/schema-gen.ts b/packages/schema/src/plugins/zod/utils/schema-gen.ts index de92dfb4e..e0e0baf58 100644 --- a/packages/schema/src/plugins/zod/utils/schema-gen.ts +++ b/packages/schema/src/plugins/zod/utils/schema-gen.ts @@ -1,5 +1,5 @@ import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; -import { getLiteral, hasAttribute, isFromStdlib } from '@zenstackhq/sdk'; +import { getLiteral, hasAttribute, isEnumFieldReference, isFromStdlib } from '@zenstackhq/sdk'; import { DataModelField, DataModelFieldAttribute, @@ -246,6 +246,8 @@ export function getFieldSchemaDefault(field: DataModelField | TypeDefField) { return arg.value.value; } else if (isBooleanLiteral(arg.value)) { return arg.value.value; + } else if (isEnumFieldReference(arg.value) && arg.value.target.ref) { + return JSON.stringify(arg.value.target.ref.name); } else if ( isInvocationExpr(arg.value) && isFromStdlib(arg.value.function.ref!) && diff --git a/packages/schema/tests/generator/prisma-generator.test.ts b/packages/schema/tests/generator/prisma-generator.test.ts index fc71b26bb..be643351f 100644 --- a/packages/schema/tests/generator/prisma-generator.test.ts +++ b/packages/schema/tests/generator/prisma-generator.test.ts @@ -21,7 +21,7 @@ describe('Prisma generator test', () => { process.chdir(r.name); execSync('npm init -y', { stdio: 'ignore' }); - execSync('npm install prisma'); + execSync('npm install prisma@6.19.x'); }); afterEach(() => { diff --git a/packages/schema/tests/schema/validation/datasource-validation.test.ts b/packages/schema/tests/schema/validation/datasource-validation.test.ts index 0c90da4db..f73e5a661 100644 --- a/packages/schema/tests/schema/validation/datasource-validation.test.ts +++ b/packages/schema/tests/schema/validation/datasource-validation.test.ts @@ -10,10 +10,7 @@ describe('Datasource Validation Tests', () => { expect(result).toMatchObject({ status: 'rejected', reason: { - cause: [ - { message: 'datasource must include a "provider" field' }, - { message: 'datasource must include a "url" field' }, - ], + cause: [{ message: 'datasource must include a "provider" field' }], }, }); }); diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 0dcba4da5..a2595207b 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { @@ -18,8 +18,8 @@ "author": "", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "6.17.x", - "@prisma/internals": "6.17.x", + "@prisma/generator-helper": "6.19.x", + "@prisma/internals": "6.19.x", "@zenstackhq/language": "workspace:*", "@zenstackhq/runtime": "workspace:*", "langium": "1.3.1", diff --git a/packages/sdk/src/typescript-expression-transformer.ts b/packages/sdk/src/typescript-expression-transformer.ts index d4fb87e30..c653c52fa 100644 --- a/packages/sdk/src/typescript-expression-transformer.ts +++ b/packages/sdk/src/typescript-expression-transformer.ts @@ -40,6 +40,7 @@ type Options = { futureRefContext?: string; context: ExpressionContext; operationContext?: 'read' | 'create' | 'update' | 'postUpdate' | 'delete'; + useLiteralEnum?: boolean; }; type Casing = 'original' | 'upper' | 'lower' | 'capitalize' | 'uncapitalize'; @@ -392,7 +393,9 @@ export class TypeScriptExpressionTransformer { } if (isEnumField(expr.target.ref)) { - return `${expr.target.ref.$container.name}.${expr.target.ref.name}`; + return this.options.useLiteralEnum + ? JSON.stringify(expr.target.ref.name) + : `${expr.target.ref.$container.name}.${expr.target.ref.name}`; } else { if (this.options?.isPostGuard) { // if we're processing post-update, any direct field access should be diff --git a/packages/server/package.json b/packages/server/package.json index bb9930c5b..307c69e09 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "2.21.1", + "version": "2.22.0", "displayName": "ZenStack Server-side Adapters", "description": "ZenStack server-side adapters", "homepage": "https://zenstack.dev", diff --git a/packages/testtools/package.json b/packages/testtools/package.json index 6a1842e46..370e5ca50 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "2.21.1", + "version": "2.22.0", "description": "ZenStack Test Tools", "main": "index.js", "private": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ba4b0fa4..818166125 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: devDependencies: '@redwoodjs/graphql-server': specifier: ^7.7.3 - version: 7.7.3(@escape.tech/graphql-armor-types@0.5.0)(prisma@6.17.1(typescript@5.9.2)) + version: 7.7.3(@escape.tech/graphql-armor-types@0.5.0)(prisma@6.19.0(typescript@5.9.2)) '@types/yargs': specifier: ^17.0.32 version: 17.0.32 @@ -423,8 +423,8 @@ importers: version: 4.0.1(zod@3.25.76) devDependencies: '@prisma/client': - specifier: 6.17.x - version: 6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2) + specifier: 6.19.x + version: 6.19.0(prisma@6.19.0(typescript@5.9.2))(typescript@5.9.2) '@types/bcryptjs': specifier: ^2.4.2 version: 2.4.6 @@ -527,8 +527,8 @@ importers: version: 4.0.1(zod@4.1.5) devDependencies: '@prisma/client': - specifier: 6.17.x - version: 6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2) + specifier: 6.19.x + version: 6.19.0(prisma@6.19.0(typescript@5.9.2))(typescript@5.9.2) '@types/async-exit-hook': specifier: ^2.0.0 version: 2.0.2 @@ -563,8 +563,8 @@ importers: specifier: ^0.24.0 version: 0.24.0 prisma: - specifier: 6.17.x - version: 6.17.1(typescript@5.9.2) + specifier: 6.19.x + version: 6.19.0(typescript@5.9.2) renamer: specifier: ^4.0.0 version: 4.0.0 @@ -582,11 +582,11 @@ importers: packages/sdk: dependencies: '@prisma/generator-helper': - specifier: 6.17.x - version: 6.17.1 + specifier: 6.19.x + version: 6.19.0 '@prisma/internals': - specifier: 6.17.x - version: 6.17.1(typescript@5.9.2) + specifier: 6.19.x + version: 6.19.0(typescript@5.9.2) '@zenstackhq/language': specifier: workspace:* version: link:../language/dist @@ -2486,8 +2486,8 @@ packages: prisma: optional: true - '@prisma/client@6.17.1': - resolution: {integrity: sha512-zL58jbLzYamjnNnmNA51IOZdbk5ci03KviXCuB0Tydc9btH2kDWsi1pQm2VecviRTM7jGia0OPPkgpGnT3nKvw==} + '@prisma/client@6.19.0': + resolution: {integrity: sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -2498,59 +2498,59 @@ packages: typescript: optional: true - '@prisma/config@6.17.1': - resolution: {integrity: sha512-fs8wY6DsvOCzuiyWVckrVs1LOcbY4LZNz8ki4uUIQ28jCCzojTGqdLhN2Jl5lDnC1yI8/gNIKpsWDM8pLhOdwA==} + '@prisma/config@6.19.0': + resolution: {integrity: sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==} '@prisma/debug@5.14.0': resolution: {integrity: sha512-iq56qBZuFfX3fCxoxT8gBX33lQzomBU0qIUaEj1RebsKVz1ob/BVH1XSBwwwvRVtZEV1b7Fxx2eVu34Ge/mg3w==} - '@prisma/debug@6.17.1': - resolution: {integrity: sha512-Vf7Tt5Wh9XcndpbmeotuqOMLWPTjEKCsgojxXP2oxE1/xYe7PtnP76hsouG9vis6fctX+TxgmwxTuYi/+xc7dQ==} + '@prisma/debug@6.19.0': + resolution: {integrity: sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==} - '@prisma/dmmf@6.17.1': - resolution: {integrity: sha512-ILf+sYTvoZRJIn1KjW8ZBn9N3fK+4ZxreJT0EXuLxbZWbXuz7Eums0/PEscS8+fzktg1zbxZvjHVFMppqfFz3g==} + '@prisma/dmmf@6.19.0': + resolution: {integrity: sha512-hmMbAxnA+JAe9mGtfgO5BPumFIXsxHsp9o/9fV70TzBGAcTw+yARsHs1QnOkx1ZIIRDJ/iJ+WHhAvwCQBnNXmw==} - '@prisma/driver-adapter-utils@6.17.1': - resolution: {integrity: sha512-GT4QbVUyJa5sXj5vjrBPnZ68v1P/FoKBCSIkrFrCPrOi6OSzk+567XDZyBtWIECKxruuMTa7fU4wwNmtMQylrg==} + '@prisma/driver-adapter-utils@6.19.0': + resolution: {integrity: sha512-VAC/wFebV569Jk7iEqzLxekM2A5toKYAr6cPM2KWVHiRHgyjsh/IHf++Xo67q8uor/JxY8mwOuyQyuxkstSf5w==} '@prisma/engines-version@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': resolution: {integrity: sha512-ip6pNkRo1UxWv+6toxNcYvItNYaqQjXdFNGJ+Nuk2eYtRoEdoF13wxo7/jsClJFFenMPVNVqXQDV0oveXnR1cA==} - '@prisma/engines-version@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': - resolution: {integrity: sha512-17140E3huOuD9lMdJ9+SF/juOf3WR3sTJMVyyenzqUPbuH+89nPhSWcrY+Mf7tmSs6HvaO+7S+HkELinn6bhdg==} + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': + resolution: {integrity: sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==} '@prisma/engines@5.14.0': resolution: {integrity: sha512-lgxkKZ6IEygVcw6IZZUlPIfLQ9hjSYAtHjZ5r64sCLDgVzsPFCi2XBBJgzPMkOQ5RHzUD4E/dVdpn9+ez8tk1A==} - '@prisma/engines@6.17.1': - resolution: {integrity: sha512-D95Ik3GYZkqZ8lSR4EyFOJ/tR33FcYRP8kK61o+WMsyD10UfJwd7+YielflHfKwiGodcqKqoraWw8ElAgMDbPw==} + '@prisma/engines@6.19.0': + resolution: {integrity: sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==} '@prisma/fetch-engine@5.14.0': resolution: {integrity: sha512-VrheA9y9DMURK5vu8OJoOgQpxOhas3qF0IBHJ8G/0X44k82kc8E0w98HCn2nhnbOOMwbWsJWXfLC2/F8n5u0gQ==} - '@prisma/fetch-engine@6.17.1': - resolution: {integrity: sha512-AYZiHOs184qkDMiTeshyJCtyL4yERkjfTkJiSJdYuSfc24m94lTNL5+GFinZ6vVz+ktX4NJzHKn1zIFzGTWrWg==} + '@prisma/fetch-engine@6.19.0': + resolution: {integrity: sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==} '@prisma/generator-helper@5.14.0': resolution: {integrity: sha512-xVc71cmTnPZ0lnSs4FAY6Ta72vFJ3webrQwKMQ2ujr6hDG1VPIEf820T1TOS3ZZQd/OKigNKXnq3co8biz9/qw==} - '@prisma/generator-helper@6.17.1': - resolution: {integrity: sha512-ONuUTGXCTUK9K//ronFg4xOEARv+tZKOo5uVSJg6tj2y90gpXQunPYyvR17gEoAQrZT17kC0ie60ecv8nulWyQ==} + '@prisma/generator-helper@6.19.0': + resolution: {integrity: sha512-RwRzgm5O+xfCXkRltdHC7XSDhXNkS2dnJ9SNAL52Ke4r28Gb6lelR/eUGcY8w8BaX/jEu6vZgcyFRdqZB6B1gg==} - '@prisma/generator@6.17.1': - resolution: {integrity: sha512-R4SIlAtMHlxwXYYHiyWtN+MLRGFF3Jy+LvqcfInbCiaZkoqyhU5kj8/aOu2OV2ydNkkN+Q8ft9Tnv5a/b4pqPg==} + '@prisma/generator@6.19.0': + resolution: {integrity: sha512-yRfG3ZjkzzizEibA5HqwP64GS1+qit2YujV8pUBFHzDzi0mcxwBxpH2mcKjULXZvg1Nfvfnwwd8PpCEG7LuJfA==} '@prisma/get-platform@5.14.0': resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==} - '@prisma/get-platform@6.17.1': - resolution: {integrity: sha512-AKEn6fsfz0r482S5KRDFlIGEaq9wLNcgalD1adL+fPcFFblIKs1sD81kY/utrHdqKuVC6E1XSRpegDK3ZLL4Qg==} + '@prisma/get-platform@6.19.0': + resolution: {integrity: sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==} '@prisma/internals@5.14.0': resolution: {integrity: sha512-s0JRNDmR2bvcyy0toz89jy7SbbjANAs4e9KCReNvSm5czctIaZzDf68tcOXdtH0G7m9mKhVhNPdS9lMky0DhWA==} - '@prisma/internals@6.17.1': - resolution: {integrity: sha512-UTHiHl5Bm/tMdCbooP/x4jJe5HOV2a2gWolTmdqTlCRRxPZqPA6an4M1/Kn8mJXjJTL6b70Dc8b+aY14O3Fmkw==} + '@prisma/internals@6.19.0': + resolution: {integrity: sha512-icODdXwCYu6k91YMU+vWCzomaF+U/bPa9diAeKdOuCe+MaLF7JDrpZMcwu9xofLg4U+cpvnIr0UrDBGjbzKYgQ==} peerDependencies: typescript: '>=5.1.0' peerDependenciesMeta: @@ -2563,17 +2563,17 @@ packages: '@prisma/prisma-schema-wasm@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': resolution: {integrity: sha512-WeTmJ0mK8ALoKJUQFO+465k9lm1JWS4ODUg7akJq1wjgyDU1RTAzDFli8ESmNJlMVgJgoAd6jXmzcnoA0HT9Lg==} - '@prisma/prisma-schema-wasm@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': - resolution: {integrity: sha512-lSeL/eOjCt7SauvAhvlzbYL6fbkBBC07tdghT7dwhRHEorfYh2TTVQQwN29BJgNFufYEyFLYMIoYRHSw4InphQ==} + '@prisma/prisma-schema-wasm@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': + resolution: {integrity: sha512-5au1UH9+jky4TtIdgxDUA9Mk+40R2hDwZnhjjzR1io7WFtIKP6e5DI7yQ5QVysY8Ves8KWDsvwzDOn6gYNY4iA==} - '@prisma/schema-engine-wasm@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': - resolution: {integrity: sha512-Xod6kiWzK60WPFgky/DsPEO+6131RxVfFQiq6Hu0pzCThm1cOsEYpfykchZre6FN5uoruqiJRorDFMVpqtPwtw==} + '@prisma/schema-engine-wasm@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': + resolution: {integrity: sha512-tNOXcsEScWwjJJeEteqH5/5c+LkaB83By8qqK/VANf5yq4fG5ATe82gzDpjEiNbN+JzLjJYX/olU5TemN9nUYA==} '@prisma/schema-files-loader@5.14.0': resolution: {integrity: sha512-n1QHR2C63dARKPZe0WPn7biybcBHzXe+BEmiHC5Drq9KPWnpmQtIfGpqm1ZKdvCZfcA5FF3wgpSMPK4LnB0obQ==} - '@prisma/schema-files-loader@6.17.1': - resolution: {integrity: sha512-rRYUP664wFbdvqSbqKdNijb2LHP6A3yEauPy4V7WJDR9ySQJ8adV0nP0cBcUAzHAsBW1JVMwqF+OKIrcwVG3qg==} + '@prisma/schema-files-loader@6.19.0': + resolution: {integrity: sha512-5+TWqBFfEXwdinmNIjiZu5XyH5NlLWbZWmUaytSX3t7krHJStgl/F6T+rGzewMlXq0ievDoOoGgF7BQhUJh++Q==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -4599,8 +4599,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.4.814: resolution: {integrity: sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==} @@ -7073,8 +7073,8 @@ packages: engines: {node: '>=0.8'} hasBin: true - prisma@6.17.1: - resolution: {integrity: sha512-ac6h0sM1Tg3zu8NInY+qhP/S9KhENVaw9n1BrGKQVFu05JT5yT5Qqqmb8tMRIE3ZXvVj4xcRA5yfrsy4X7Yy5g==} + prisma@6.19.0: + resolution: {integrity: sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -10584,37 +10584,37 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@prisma/client@5.14.0(prisma@6.17.1(typescript@5.9.2))': + '@prisma/client@5.14.0(prisma@6.19.0(typescript@5.9.2))': optionalDependencies: - prisma: 6.17.1(typescript@5.9.2) + prisma: 6.19.0(typescript@5.9.2) - '@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.2))(typescript@5.9.2)': + '@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.2))(typescript@5.9.2)': optionalDependencies: - prisma: 6.17.1(typescript@5.9.2) + prisma: 6.19.0(typescript@5.9.2) typescript: 5.9.2 - '@prisma/config@6.17.1': + '@prisma/config@6.19.0': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 - effect: 3.16.12 + effect: 3.18.4 empathic: 2.0.0 transitivePeerDependencies: - magicast '@prisma/debug@5.14.0': {} - '@prisma/debug@6.17.1': {} + '@prisma/debug@6.19.0': {} - '@prisma/dmmf@6.17.1': {} + '@prisma/dmmf@6.19.0': {} - '@prisma/driver-adapter-utils@6.17.1': + '@prisma/driver-adapter-utils@6.19.0': dependencies: - '@prisma/debug': 6.17.1 + '@prisma/debug': 6.19.0 '@prisma/engines-version@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': {} - '@prisma/engines-version@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': {} + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} '@prisma/engines@5.14.0': dependencies: @@ -10623,12 +10623,12 @@ snapshots: '@prisma/fetch-engine': 5.14.0 '@prisma/get-platform': 5.14.0 - '@prisma/engines@6.17.1': + '@prisma/engines@6.19.0': dependencies: - '@prisma/debug': 6.17.1 - '@prisma/engines-version': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac - '@prisma/fetch-engine': 6.17.1 - '@prisma/get-platform': 6.17.1 + '@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@5.14.0': dependencies: @@ -10636,31 +10636,31 @@ snapshots: '@prisma/engines-version': 5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48 '@prisma/get-platform': 5.14.0 - '@prisma/fetch-engine@6.17.1': + '@prisma/fetch-engine@6.19.0': dependencies: - '@prisma/debug': 6.17.1 - '@prisma/engines-version': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac - '@prisma/get-platform': 6.17.1 + '@prisma/debug': 6.19.0 + '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/get-platform': 6.19.0 '@prisma/generator-helper@5.14.0': dependencies: '@prisma/debug': 5.14.0 - '@prisma/generator-helper@6.17.1': + '@prisma/generator-helper@6.19.0': dependencies: - '@prisma/debug': 6.17.1 - '@prisma/dmmf': 6.17.1 - '@prisma/generator': 6.17.1 + '@prisma/debug': 6.19.0 + '@prisma/dmmf': 6.19.0 + '@prisma/generator': 6.19.0 - '@prisma/generator@6.17.1': {} + '@prisma/generator@6.19.0': {} '@prisma/get-platform@5.14.0': dependencies: '@prisma/debug': 5.14.0 - '@prisma/get-platform@6.17.1': + '@prisma/get-platform@6.19.0': dependencies: - '@prisma/debug': 6.17.1 + '@prisma/debug': 6.19.0 '@prisma/internals@5.14.0': dependencies: @@ -10674,20 +10674,20 @@ snapshots: arg: 5.0.2 prompts: 2.4.2 - '@prisma/internals@6.17.1(typescript@5.9.2)': - dependencies: - '@prisma/config': 6.17.1 - '@prisma/debug': 6.17.1 - '@prisma/dmmf': 6.17.1 - '@prisma/driver-adapter-utils': 6.17.1 - '@prisma/engines': 6.17.1 - '@prisma/fetch-engine': 6.17.1 - '@prisma/generator': 6.17.1 - '@prisma/generator-helper': 6.17.1 - '@prisma/get-platform': 6.17.1 - '@prisma/prisma-schema-wasm': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac - '@prisma/schema-engine-wasm': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac - '@prisma/schema-files-loader': 6.17.1 + '@prisma/internals@6.19.0(typescript@5.9.2)': + dependencies: + '@prisma/config': 6.19.0 + '@prisma/debug': 6.19.0 + '@prisma/dmmf': 6.19.0 + '@prisma/driver-adapter-utils': 6.19.0 + '@prisma/engines': 6.19.0 + '@prisma/fetch-engine': 6.19.0 + '@prisma/generator': 6.19.0 + '@prisma/generator-helper': 6.19.0 + '@prisma/get-platform': 6.19.0 + '@prisma/prisma-schema-wasm': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/schema-engine-wasm': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/schema-files-loader': 6.19.0 arg: 5.0.2 prompts: 2.4.2 optionalDependencies: @@ -10699,18 +10699,18 @@ snapshots: '@prisma/prisma-schema-wasm@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': {} - '@prisma/prisma-schema-wasm@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': {} + '@prisma/prisma-schema-wasm@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} - '@prisma/schema-engine-wasm@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': {} + '@prisma/schema-engine-wasm@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} '@prisma/schema-files-loader@5.14.0': dependencies: '@prisma/prisma-schema-wasm': 5.14.0-17.56ca112d5a19c9925b53af75c3c6b7ada97f9f85 fs-extra: 11.1.1 - '@prisma/schema-files-loader@6.17.1': + '@prisma/schema-files-loader@6.19.0': dependencies: - '@prisma/prisma-schema-wasm': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac + '@prisma/prisma-schema-wasm': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 fs-extra: 11.3.0 '@protobufjs/aspromise@1.1.2': {} @@ -10768,10 +10768,10 @@ snapshots: '@readme/openapi-schemas@3.1.0': {} - '@redwoodjs/api@7.7.3(prisma@6.17.1(typescript@5.9.2))': + '@redwoodjs/api@7.7.3(prisma@6.19.0(typescript@5.9.2))': dependencies: '@babel/runtime-corejs3': 7.24.5 - '@prisma/client': 5.14.0(prisma@6.17.1(typescript@5.9.2)) + '@prisma/client': 5.14.0(prisma@6.19.0(typescript@5.9.2)) '@whatwg-node/fetch': 0.9.17 core-js: 3.37.1 humanize-string: 2.1.0 @@ -10804,7 +10804,7 @@ snapshots: '@redwoodjs/context@7.7.3': {} - '@redwoodjs/graphql-server@7.7.3(@escape.tech/graphql-armor-types@0.5.0)(prisma@6.17.1(typescript@5.9.2))': + '@redwoodjs/graphql-server@7.7.3(@escape.tech/graphql-armor-types@0.5.0)(prisma@6.19.0(typescript@5.9.2))': dependencies: '@babel/runtime-corejs3': 7.24.5 '@envelop/core': 5.0.1 @@ -10818,7 +10818,7 @@ snapshots: '@graphql-tools/utils': 10.2.0(graphql@16.8.1) '@graphql-yoga/plugin-persisted-operations': 3.3.1(@graphql-tools/utils@10.2.0(graphql@16.8.1))(graphql-yoga@5.3.1(graphql@16.8.1))(graphql@16.8.1) '@opentelemetry/api': 1.8.0 - '@redwoodjs/api': 7.7.3(prisma@6.17.1(typescript@5.9.2)) + '@redwoodjs/api': 7.7.3(prisma@6.19.0(typescript@5.9.2)) '@redwoodjs/context': 7.7.3 core-js: 3.37.1 graphql: 16.8.1 @@ -13030,7 +13030,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 @@ -16154,10 +16154,10 @@ snapshots: printj@1.3.1: {} - prisma@6.17.1(typescript@5.9.2): + prisma@6.19.0(typescript@5.9.2): dependencies: - '@prisma/config': 6.17.1 - '@prisma/engines': 6.17.1 + '@prisma/config': 6.19.0 + '@prisma/engines': 6.19.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -17534,7 +17534,7 @@ snapshots: chokidar: 3.6.0 commander: 8.3.0 fast-glob: 3.3.3 - fs-extra: 11.2.0 + fs-extra: 11.3.0 npm-run-path: 4.0.1 semver: 7.6.2 strip-ansi: 6.0.1 @@ -17555,7 +17555,7 @@ snapshots: '@rollup/pluginutils': 5.1.0(rollup@4.18.0) debug: 4.3.5 error-stack-parser-es: 0.1.4 - fs-extra: 11.2.0 + fs-extra: 11.3.0 open: 10.1.0 perfect-debounce: 1.0.0 picocolors: 1.0.1 diff --git a/tests/integration/test-run/package.json b/tests/integration/test-run/package.json index 8709125a4..8cfe59b2f 100644 --- a/tests/integration/test-run/package.json +++ b/tests/integration/test-run/package.json @@ -10,9 +10,9 @@ "author": "", "license": "ISC", "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@zenstackhq/runtime": "file:../../../packages/runtime/dist", - "prisma": "6.17.x", + "prisma": "6.19.x", "react": "^18.2.0", "swr": "^1.3.0", "zenstack": "file:../../../packages/schema/dist", diff --git a/tests/integration/tests/cli/generate.test.ts b/tests/integration/tests/cli/generate.test.ts index f066c8cfb..a420b30e8 100644 --- a/tests/integration/tests/cli/generate.test.ts +++ b/tests/integration/tests/cli/generate.test.ts @@ -45,7 +45,7 @@ model Post { // set up project fs.writeFileSync('package.json', JSON.stringify({ name: 'my app', version: '1.0.0' })); createNpmrc(); - installPackage('prisma @prisma/client zod@^3.25.0 @types/node@20'); + installPackage('prisma@6.19.x @prisma/client@6.19.x zod@^3.25.0 @types/node@20'); installPackage(path.join(__dirname, '../../../../packages/runtime/dist')); // set up schema diff --git a/tests/integration/tests/cli/plugins.test.ts b/tests/integration/tests/cli/plugins.test.ts index bf26c4318..cf37f3d32 100644 --- a/tests/integration/tests/cli/plugins.test.ts +++ b/tests/integration/tests/cli/plugins.test.ts @@ -75,7 +75,7 @@ describe('CLI Plugins Tests', () => { 'swr', '@tanstack/react-query@5.56.x', '@trpc/server@10', - '@prisma/client@6.17.x', + '@prisma/client@6.19.x', `${path.join(__dirname, '../../../../.build/zenstackhq-language-' + ver + '.tgz')}`, `${path.join(__dirname, '../../../../.build/zenstackhq-sdk-' + ver + '.tgz')}`, `${path.join(__dirname, '../../../../.build/zenstackhq-runtime-' + ver + '.tgz')}`, @@ -85,7 +85,7 @@ describe('CLI Plugins Tests', () => { const devDepPkgs = [ 'typescript', '@types/react', - 'prisma@6.17.x', + 'prisma@6.19.x', '@types/node@20', `${path.join(__dirname, '../../../../.build/zenstack-' + ver + '.tgz')}`, `${path.join(__dirname, '../../../../.build/zenstackhq-tanstack-query-' + ver + '.tgz')}`, diff --git a/tests/integration/tests/enhancements/with-policy/auth.test.ts b/tests/integration/tests/enhancements/with-policy/auth.test.ts index 296eefee7..081c14238 100644 --- a/tests/integration/tests/enhancements/with-policy/auth.test.ts +++ b/tests/integration/tests/enhancements/with-policy/auth.test.ts @@ -865,7 +865,7 @@ describe('auth() compile-time test', () => { ); }); - it('"User" type as auth', async () => { + it('"User" type as auth legacy generator', async () => { const { enhance } = await loadSchema( ` type Profile { @@ -920,4 +920,75 @@ describe('auth() compile-time test', () => { }) ).toResolveTruthy(); }); + + it('"User" type as auth new generator', async () => { + const { enhance } = await loadSchema( + ` + datasource db { + provider = "sqlite" + url = "file:./dev.db" + } + + generator js { + provider = "prisma-client" + output = "./generated/client" + moduleFormat = "cjs" + } + + type Profile { + age Int + } + + type Role { + name String + permissions String[] + } + + type User { + myId Int @id + banned Boolean + profile Profile + roles Role[] + } + + model Foo { + id Int @id @default(autoincrement()) + @@allow('read', true) + @@allow('create', auth().myId == 1 && !auth().banned) + @@allow('delete', auth().roles?['DELETE' in permissions]) + @@deny('all', auth().profile.age < 18) + } + `, + { + addPrelude: false, + output: './zenstack', + preserveTsFiles: true, + prismaLoadPath: './prisma/generated/client/client', + compile: true, + extraSourceFiles: [ + { + name: 'main.ts', + content: ` + import { enhance } from "./zenstack/enhance"; + import { PrismaClient } from '@prisma/client'; + enhance(new PrismaClient(), { user: { myId: 1, profile: { age: 20 } } }); + `, + }, + ], + } + ); + + await expect(enhance().foo.create({ data: {} })).toBeRejectedByPolicy(); + await expect(enhance({ myId: 1, banned: true }).foo.create({ data: {} })).toBeRejectedByPolicy(); + await expect(enhance({ myId: 1, profile: { age: 16 } }).foo.create({ data: {} })).toBeRejectedByPolicy(); + const r = await enhance({ myId: 1, profile: { age: 20 } }).foo.create({ data: {} }); + await expect( + enhance({ myId: 1, profile: { age: 20 } }).foo.delete({ where: { id: r.id } }) + ).toBeRejectedByPolicy(); + await expect( + enhance({ myId: 1, profile: { age: 20 }, roles: [{ name: 'ADMIN', permissions: ['DELETE'] }] }).foo.delete({ + where: { id: r.id }, + }) + ).toResolveTruthy(); + }); }); diff --git a/tests/integration/tests/frameworks/nextjs/test-project/package.json b/tests/integration/tests/frameworks/nextjs/test-project/package.json index 7453ccae7..fbc7372ea 100644 --- a/tests/integration/tests/frameworks/nextjs/test-project/package.json +++ b/tests/integration/tests/frameworks/nextjs/test-project/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@types/node": "18.11.18", "@types/react": "18.0.27", "@types/react-dom": "18.0.10", @@ -26,6 +26,6 @@ "@zenstackhq/swr": "../../../../../../../packages/plugins/swr/dist" }, "devDependencies": { - "prisma": "6.17.x" + "prisma": "6.19.x" } } diff --git a/tests/integration/tests/frameworks/trpc/test-project/package.json b/tests/integration/tests/frameworks/trpc/test-project/package.json index d20affaa7..b39b03b87 100644 --- a/tests/integration/tests/frameworks/trpc/test-project/package.json +++ b/tests/integration/tests/frameworks/trpc/test-project/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@prisma/client": "6.17.x", + "@prisma/client": "6.19.x", "@tanstack/react-query": "^4.22.4", "@trpc/client": "^10.34.0", "@trpc/next": "^10.34.0", @@ -31,6 +31,6 @@ "@zenstackhq/trpc": "../../../../../../../packages/plugins/trpc/dist" }, "devDependencies": { - "prisma": "6.17.x" + "prisma": "6.19.x" } } diff --git a/tests/regression/tests/issue-2291.test.ts b/tests/regression/tests/issue-2291.test.ts new file mode 100644 index 000000000..58b73ea5d --- /dev/null +++ b/tests/regression/tests/issue-2291.test.ts @@ -0,0 +1,23 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('Issue 2291', () => { + it('should work', async () => { + const { zodSchemas } = await loadSchema( + ` +enum SomeEnum { + Ex1 + Ex2 +} + +/// Post model +model Post { + id String @id @default(cuid()) + e SomeEnum @default(Ex1) +} +`, + { fullZod: true } + ); + + expect(zodSchemas.models.PostSchema.parse({ id: '1' })).toEqual({ id: '1', e: 'Ex1' }); + }); +}); diff --git a/tests/regression/tests/issue-2294.test.ts b/tests/regression/tests/issue-2294.test.ts new file mode 100644 index 000000000..8e16db7f3 --- /dev/null +++ b/tests/regression/tests/issue-2294.test.ts @@ -0,0 +1,48 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('Issue 2294', () => { + it('should work', async () => { + await loadSchema( + ` +datasource db { + provider = "sqlite" + url = "file:./dev.db" +} + +generator js { + provider = "prisma-client" + output = "./generated/client" + moduleFormat = "cjs" +} + +type AuthUser { + id Int @id + name String? + + @@auth +} + +model Foo { + id Int @id + @@allow('all', auth().name == 'admin') +} +`, + { + addPrelude: false, + output: './zenstack', + prismaLoadPath: './prisma/generated/client/client', + compile: true, + extraSourceFiles: [ + { + name: 'main.ts', + content: ` +import { enhance } from "./zenstack/enhance"; +import { PrismaClient } from './prisma/generated/client/client'; +enhance(new PrismaClient(), { user: { id: 1, name: 'admin' } }); + `, + }, + ], + } + ); + }); +});