From df88a81c396538659ce54a78e3680442a22a40ea Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Thu, 30 Nov 2023 11:14:40 -0800 Subject: [PATCH] fix: client-extension test failures --- packages/schema/src/cli/actions/repl.ts | 1 + packages/testtools/src/schema.ts | 6 ++ pnpm-lock.yaml | 79 +++++++------------ tests/integration/package.json | 5 +- .../with-policy/client-extensions.test.ts | 69 ++++++++-------- 5 files changed, 71 insertions(+), 89 deletions(-) diff --git a/packages/schema/src/cli/actions/repl.ts b/packages/schema/src/cli/actions/repl.ts index 8c40089b0..6ca3c3503 100644 --- a/packages/schema/src/cli/actions/repl.ts +++ b/packages/schema/src/cli/actions/repl.ts @@ -171,6 +171,7 @@ export async function repl(projectPath: string, options: { prismaClient?: string prisma.$disconnect(); } prisma = new PrismaClient(debug ? { log: ['info'] } : undefined); + // https://github.com/prisma/prisma/issues/18292 prisma[Symbol.for('nodejs.util.inspect.custom')] = 'PrismaClient'; db = enhance(prisma, { user }, { logPrismaQuery: debug }); diff --git a/packages/testtools/src/schema.ts b/packages/testtools/src/schema.ts index cf5a6dcd7..f69a845cc 100644 --- a/packages/testtools/src/schema.ts +++ b/packages/testtools/src/schema.ts @@ -221,6 +221,10 @@ export async function loadSchema(schema: string, options?: SchemaLoadOptions) { const PrismaClient = require(path.join(projectRoot, 'node_modules/.prisma/client')).PrismaClient; let prisma = new PrismaClient({ log: ['info', 'warn', 'error'] }); + // https://github.com/prisma/prisma/issues/18292 + prisma[Symbol.for('nodejs.util.inspect.custom')] = 'PrismaClient'; + + const Prisma = require(path.join(projectRoot, 'node_modules/@prisma/client')).Prisma; if (opt.pulseApiKey) { const withPulse = require(path.join(projectRoot, 'node_modules/@prisma/extension-pulse/dist/cjs')).withPulse; @@ -244,6 +248,7 @@ export async function loadSchema(schema: string, options?: SchemaLoadOptions) { if (options?.getPrismaOnly) { return { prisma, + Prisma, projectDir: projectRoot, withPolicy: undefined as any, withOmit: undefined as any, @@ -277,6 +282,7 @@ export async function loadSchema(schema: string, options?: SchemaLoadOptions) { return { projectDir: projectRoot, prisma, + Prisma, withPolicy: (user?: AuthUser) => withPolicy( prisma, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cd9dc101..9e5e7779e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -962,15 +962,12 @@ importers: next: specifier: ^12.3.1 version: 12.3.1(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0) - prisma-client-test-internal: - specifier: npm:@prisma/client@^5.0.0 - version: /@prisma/client@5.6.0 tmp: specifier: ^0.2.1 version: 0.2.1 ts-jest: - specifier: ^29.0.1 - version: 29.0.1(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.6.2) + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.23.2)(jest@29.5.0)(typescript@4.6.2) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@18.0.0)(typescript@4.6.2) @@ -4081,19 +4078,6 @@ packages: prisma: 4.16.2 dev: true - /@prisma/client@5.6.0: - resolution: {integrity: sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee - dev: true - /@prisma/debug@4.16.2: resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} dependencies: @@ -4118,10 +4102,6 @@ packages: resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: true - /@prisma/engines-version@5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee: - resolution: {integrity: sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw==} - dev: true - /@prisma/engines@4.16.2: resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true @@ -5474,7 +5454,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.8.4) typescript: 4.8.4 transitivePeerDependencies: @@ -5495,7 +5475,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -5558,7 +5538,7 @@ packages: eslint: 8.27.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.27.0) - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -5578,7 +5558,7 @@ packages: eslint: 8.35.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.35.0) - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -10337,7 +10317,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.0.0)(typescript@4.8.4) + ts-node: 10.9.1(@types/node@18.0.0)(typescript@4.6.2) transitivePeerDependencies: - supports-color dev: true @@ -10377,7 +10357,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.0.0)(typescript@4.8.4) + ts-node: 10.9.1(@types/node@18.0.0)(typescript@4.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -14938,8 +14918,8 @@ packages: engines: {node: '>=10'} dev: false - /ts-jest@29.0.1(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.6.2): - resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} + /ts-jest@29.0.3(@babel/core@7.23.2)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4): + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -14961,7 +14941,7 @@ packages: dependencies: '@babel/core': 7.23.2 bs-logger: 0.2.6 - esbuild: 0.18.13 + esbuild: 0.15.12 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) jest-util: 29.5.0 @@ -14969,12 +14949,12 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 4.6.2 + typescript: 4.8.4 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.3(@babel/core@7.23.2)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4): - resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.4): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -14996,7 +14976,7 @@ packages: dependencies: '@babel/core': 7.23.2 bs-logger: 0.2.6 - esbuild: 0.15.12 + esbuild: 0.18.13 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) jest-util: 29.5.0 @@ -15004,11 +14984,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 4.8.4 + typescript: 4.9.4 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.4): + /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -15039,11 +15019,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 4.9.4 + typescript: 4.9.5 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.18.13)(jest@29.5.0)(typescript@4.9.5): + /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.19.4)(jest@29.7.0)(typescript@4.9.4): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -15066,20 +15046,20 @@ packages: dependencies: '@babel/core': 7.23.2 bs-logger: 0.2.6 - esbuild: 0.18.13 + esbuild: 0.19.4 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) + jest: 29.7.0(@types/node@18.0.0) jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.3 - typescript: 4.9.5 + typescript: 4.9.4 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.23.2)(esbuild@0.19.4)(jest@29.7.0)(typescript@4.9.4): - resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.5.0)(typescript@4.6.2): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -15088,7 +15068,7 @@ packages: babel-jest: ^29.0.0 esbuild: '*' jest: ^29.0.0 - typescript: '>=4.3' + typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': optional: true @@ -15101,15 +15081,14 @@ packages: dependencies: '@babel/core': 7.23.2 bs-logger: 0.2.6 - esbuild: 0.19.4 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.0.0) - jest-util: 29.5.0 + jest: 29.5.0(@types/node@18.0.0)(ts-node@10.9.1) + jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.3 - typescript: 4.9.4 + semver: 7.5.4 + typescript: 4.6.2 yargs-parser: 21.1.1 dev: true diff --git a/tests/integration/package.json b/tests/integration/package.json index d1841581e..170695194 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -29,12 +29,11 @@ "jest-fetch-mock": "^3.0.3", "next": "^12.3.1", "tmp": "^0.2.1", - "ts-jest": "^29.0.1", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "typescript": "^4.6.2", "uuid": "^9.0.0", - "zenstack": "workspace: *", - "prisma-client-test-internal": "npm:@prisma/client@^5.0.0" + "zenstack": "workspace: *" }, "dependencies": { "@types/node": "^18.0.0", diff --git a/tests/integration/tests/enhancements/with-policy/client-extensions.test.ts b/tests/integration/tests/enhancements/with-policy/client-extensions.test.ts index 88a31d64b..cadb42767 100644 --- a/tests/integration/tests/enhancements/with-policy/client-extensions.test.ts +++ b/tests/integration/tests/enhancements/with-policy/client-extensions.test.ts @@ -1,11 +1,8 @@ -import { Prisma } from 'prisma-client-test-internal'; import { enhance } from '@zenstackhq/runtime'; import { loadSchema } from '@zenstackhq/testtools'; import path from 'path'; -// failing on GitHub CI -// eslint-disable-next-line jest/no-disabled-tests -describe.skip('With Policy: client extensions', () => { +describe('With Policy: client extensions', () => { let origDir: string; beforeAll(async () => { @@ -17,7 +14,7 @@ describe.skip('With Policy: client extensions', () => { }); it('all model new method', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -32,16 +29,16 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { value: 1 } }); await prisma.model.create({ data: { value: 2 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-getAll', model: { $allModels: { - async getAll(this: T, args?: Prisma.Exact>) { + async getAll(this: T, args?: any) { const context = Prisma.getExtensionContext(this); const r = await (context as any).findMany(args); console.log('getAll result:', r); - return r as Prisma.Result; + return r; }, }, }, @@ -58,7 +55,7 @@ describe.skip('With Policy: client extensions', () => { }); it('one model new method', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -73,15 +70,15 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { value: 1 } }); await prisma.model.create({ data: { value: 2 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-getAll', model: { model: { - async getAll(this: T, args?: Prisma.Exact>) { + async getAll(this: T, args?: any) { const context = Prisma.getExtensionContext(this); const r = await (context as any).findMany(args); - return r as Prisma.Result; + return r; }, }, }, @@ -94,7 +91,7 @@ describe.skip('With Policy: client extensions', () => { }); it('add client method', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -107,8 +104,8 @@ describe.skip('With Policy: client extensions', () => { let logged = false; - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-log', client: { $log: (s: string) => { @@ -125,7 +122,7 @@ describe.skip('With Policy: client extensions', () => { }); it('query override one model', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -141,8 +138,8 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { x: 1, y: 200 } }); await prisma.model.create({ data: { x: 2, y: 300 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-queryOverride', query: { model: { @@ -162,7 +159,7 @@ describe.skip('With Policy: client extensions', () => { }); it('query override all models', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -178,8 +175,8 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { x: 1, y: 200 } }); await prisma.model.create({ data: { x: 2, y: 300 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-queryOverride', query: { $allModels: { @@ -200,7 +197,7 @@ describe.skip('With Policy: client extensions', () => { }); it('query override all operations', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -216,8 +213,8 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { x: 1, y: 200 } }); await prisma.model.create({ data: { x: 2, y: 300 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-queryOverride', query: { model: { @@ -238,7 +235,7 @@ describe.skip('With Policy: client extensions', () => { }); it('query override everything', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -254,8 +251,8 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { x: 1, y: 200 } }); await prisma.model.create({ data: { x: 2, y: 300 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-queryOverride', query: { async $allOperations({ operation, args, query }: any) { @@ -274,7 +271,7 @@ describe.skip('With Policy: client extensions', () => { }); it('result mutation', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -288,12 +285,12 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { value: 0 } }); await prisma.model.create({ data: { value: 1 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-resultMutation', query: { model: { - async findMany({ args, query }) { + async findMany({ args, query }: any) { const r: any = await query(args); for (let i = 0; i < r.length; i++) { r[i].value = r[i].value + 1; @@ -313,7 +310,7 @@ describe.skip('With Policy: client extensions', () => { }); it('result custom fields', async () => { - const { prisma } = await loadSchema( + const { prisma, Prisma } = await loadSchema( ` model Model { id String @id @default(uuid()) @@ -327,8 +324,8 @@ describe.skip('With Policy: client extensions', () => { await prisma.model.create({ data: { value: 0 } }); await prisma.model.create({ data: { value: 1 } }); - const ext = Prisma.defineExtension((prisma) => { - return prisma.$extends({ + const ext = Prisma.defineExtension((_prisma: any) => { + return _prisma.$extends({ name: 'prisma-extension-resultNewFields', result: { model: {