From 5da470efe62c9a7ba11e97e0f7bf513f6fdd8980 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 6 Apr 2025 21:31:19 -0700 Subject: [PATCH 1/2] fix: make ".zenstack/models" reexport the entire original PrismaClient module fixes #2065 --- .../src/plugins/enhancer/enhance/index.ts | 15 +++++---- tests/regression/tests/issue-2065.test.ts | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 tests/regression/tests/issue-2065.test.ts diff --git a/packages/schema/src/plugins/enhancer/enhance/index.ts b/packages/schema/src/plugins/enhancer/enhance/index.ts index 8bc1c393d..eaaa198aa 100644 --- a/packages/schema/src/plugins/enhancer/enhance/index.ts +++ b/packages/schema/src/plugins/enhancer/enhance/index.ts @@ -110,22 +110,25 @@ export class EnhancerGenerator { const prismaImport = getPrismaClientImportSpec(this.outDir, this.options); let prismaTypesFixed = false; - let resultPrismaImport = prismaImport; + let resultPrismaTypeImport = prismaImport; if (this.needsLogicalClient) { prismaTypesFixed = true; - resultPrismaImport = `${LOGICAL_CLIENT_GENERATION_PATH}/index-fixed`; + resultPrismaTypeImport = `${LOGICAL_CLIENT_GENERATION_PATH}/index-fixed`; const result = await this.generateLogicalPrisma(); dmmf = result.dmmf; } // reexport PrismaClient types (original or fixed) - const prismaDts = this.project.createSourceFile( + const modelsDts = this.project.createSourceFile( path.join(this.outDir, 'models.d.ts'), - `export type * from '${resultPrismaImport}';`, + `export type * from '${resultPrismaTypeImport}';`, { overwrite: true } ); - await prismaDts.save(); + await modelsDts.save(); + + // reexport values from the original PrismaClient (enums, etc.) + fs.writeFileSync(path.join(this.outDir, 'models.js'), `module.exports = require('${prismaImport}');`); const authDecl = getAuthDecl(getDataModelAndTypeDefs(this.model)); const authTypes = authDecl ? generateAuthType(this.model, authDecl) : ''; @@ -151,7 +154,7 @@ ${ ${ prismaTypesFixed - ? this.createLogicalPrismaImports(prismaImport, resultPrismaImport, target) + ? this.createLogicalPrismaImports(prismaImport, resultPrismaTypeImport, target) : this.createSimplePrismaImports(prismaImport, target) } diff --git a/tests/regression/tests/issue-2065.test.ts b/tests/regression/tests/issue-2065.test.ts new file mode 100644 index 000000000..cf186b4fe --- /dev/null +++ b/tests/regression/tests/issue-2065.test.ts @@ -0,0 +1,31 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue [...]', () => { + it('regression', async () => { + const { zodSchemas } = await loadSchema( + ` + enum FooType { + Bar + Baz + } + + type Meta { + test String? + } + + model Foo { + id String @id @db.Uuid @default(uuid()) + type FooType + meta Meta @json + + @@validate(type == Bar, "FooType must be Bar") + } + `, + { + provider: 'postgresql', + pushDb: false, + } + ); + expect(zodSchemas.models.FooSchema).toBeTruthy(); + }); +}); From 4c69a7c38ede2e291be092db9cc9ae9ac3364c23 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 6 Apr 2025 21:39:43 -0700 Subject: [PATCH 2/2] update test --- tests/regression/tests/issue-foo.test.ts | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/regression/tests/issue-foo.test.ts diff --git a/tests/regression/tests/issue-foo.test.ts b/tests/regression/tests/issue-foo.test.ts new file mode 100644 index 000000000..19cf246ef --- /dev/null +++ b/tests/regression/tests/issue-foo.test.ts @@ -0,0 +1,36 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue [...]', () => { + it('regression', async () => { + const { zodSchemas } = await loadSchema( + ` + enum FooType { + Bar + Baz + } + type Meta { + test String? + } + model Foo { + id String @id @db.Uuid @default(uuid()) + type FooType + meta Meta @json + @@validate(type == Bar, "FooType must be Bar") + } + `, + { + provider: 'postgresql', + pushDb: false, + } + ); + expect( + zodSchemas.models.FooSchema.safeParse({ + id: '123e4567-e89b-12d3-a456-426614174000', + type: 'Bar', + meta: { test: 'test' }, + }) + ).toMatchObject({ + success: true, + }); + }); +});