From cb9c867b22fe715b5642311bfd070546c133ac7b Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 9 Jul 2023 11:20:19 +0800 Subject: [PATCH 1/2] fix: add "interactiveTransactions" preview features for lower version of Prisma --- .../src/plugins/prisma/schema-generator.ts | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/schema/src/plugins/prisma/schema-generator.ts b/packages/schema/src/plugins/prisma/schema-generator.ts index 7130b0a7b..af0b49f0b 100644 --- a/packages/schema/src/plugins/prisma/schema-generator.ts +++ b/packages/schema/src/plugins/prisma/schema-generator.ts @@ -36,6 +36,7 @@ import { import fs from 'fs'; import { writeFile } from 'fs/promises'; import path from 'path'; +import semver from 'semver'; import stripColor from 'strip-color'; import { name } from '.'; import { getStringLiteral } from '../../language-server/validator/utils'; @@ -236,14 +237,41 @@ export default class PrismaSchemaGenerator { } } + private getPrismaVersion() { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + return require('@prisma/client/package.json').version; + } catch { + return undefined; + } + } + private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) { - prisma.addGenerator( + const generator = prisma.addGenerator( decl.name, decl.fields.map((f) => { const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value); return { name: f.name, value }; }) ); + + // deal with configuring PrismaClient preview features + const provider = generator.fields.find((f) => f.name === 'provider'); + if (provider?.value === 'prisma-client-js') { + const prismaVersion = this.getPrismaVersion(); + if (prismaVersion && semver.lt(prismaVersion, '4.7.0')) { + // insert interactiveTransactions preview feature + let previewFeatures = generator.fields.find((f) => f.name === 'previewFeatures'); + if (!previewFeatures) { + previewFeatures = { name: 'previewFeatures', value: [] }; + generator.fields.push(previewFeatures); + } + if (!Array.isArray(previewFeatures.value)) { + throw new PluginError(name, 'option "previewFeatures" must be an array'); + } + previewFeatures.value.push('interactiveTransactions'); + } + } } private generateModel(prisma: PrismaModel, decl: DataModel, config?: Record) { From 98b4c5976b3daf80702f816c908190a558b0e9e9 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 9 Jul 2023 11:22:12 +0800 Subject: [PATCH 2/2] update --- packages/schema/src/plugins/prisma/schema-generator.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/schema/src/plugins/prisma/schema-generator.ts b/packages/schema/src/plugins/prisma/schema-generator.ts index af0b49f0b..81c01f874 100644 --- a/packages/schema/src/plugins/prisma/schema-generator.ts +++ b/packages/schema/src/plugins/prisma/schema-generator.ts @@ -269,7 +269,9 @@ export default class PrismaSchemaGenerator { if (!Array.isArray(previewFeatures.value)) { throw new PluginError(name, 'option "previewFeatures" must be an array'); } - previewFeatures.value.push('interactiveTransactions'); + if (!previewFeatures.value.includes('interactiveTransactions')) { + previewFeatures.value.push('interactiveTransactions'); + } } } }