From 7b81985d599be3b92cca86be53936870169aa60c Mon Sep 17 00:00:00 2001
From: ymc9 <104139426+ymc9@users.noreply.github.com>
Date: Wed, 13 Nov 2024 17:32:25 -0800
Subject: [PATCH] feat(hooks): add "portable" generation mode
---
packages/plugins/swr/src/generator.ts | 3 +-
.../plugins/tanstack-query/src/generator.ts | 36 ++++-
.../tanstack-query/tests/portable.test.ts | 153 ++++++++++++++++++
.../plugins/trpc/src/client-helper/index.ts | 2 -
packages/plugins/trpc/src/generator.ts | 5 -
packages/schema/src/cli/plugin-runner.ts | 7 +-
.../src/plugins/enhancer/enhance/index.ts | 9 +-
packages/schema/src/plugins/enhancer/index.ts | 4 +-
.../enhancer/policy/policy-guard-generator.ts | 1 -
packages/schema/src/plugins/prisma/index.ts | 27 +++-
packages/schema/src/plugins/zod/generator.ts | 10 +-
.../schema/src/plugins/zod/transformer.ts | 8 +-
packages/sdk/package.json | 3 +-
packages/sdk/src/code-gen.ts | 21 ++-
packages/sdk/src/model-meta-generator.ts | 1 -
packages/sdk/src/package.json | 1 +
packages/sdk/src/types.ts | 12 ++
17 files changed, 266 insertions(+), 37 deletions(-)
create mode 100644 packages/plugins/tanstack-query/tests/portable.test.ts
create mode 120000 packages/sdk/src/package.json
diff --git a/packages/plugins/swr/src/generator.ts b/packages/plugins/swr/src/generator.ts
index 967be9727..5ecfe4d84 100644
--- a/packages/plugins/swr/src/generator.ts
+++ b/packages/plugins/swr/src/generator.ts
@@ -60,8 +60,6 @@ function generateModelHooks(
const fileName = paramCase(model.name);
const sf = project.createSourceFile(path.join(outDir, `${fileName}.ts`), undefined, { overwrite: true });
- sf.addStatements('/* eslint-disable */');
-
const prismaImport = getPrismaClientImportSpec(outDir, options);
sf.addImportDeclaration({
namedImports: ['Prisma'],
@@ -261,6 +259,7 @@ function generateIndex(project: Project, outDir: string, models: DataModel[]) {
const sf = project.createSourceFile(path.join(outDir, 'index.ts'), undefined, { overwrite: true });
sf.addStatements(models.map((d) => `export * from './${paramCase(d.name)}';`));
sf.addStatements(`export { Provider } from '@zenstackhq/swr/runtime';`);
+ sf.addStatements(`export { default as metadata } from './__model_meta';`);
}
function generateQueryHook(
diff --git a/packages/plugins/tanstack-query/src/generator.ts b/packages/plugins/tanstack-query/src/generator.ts
index 8833f77f9..c45a32517 100644
--- a/packages/plugins/tanstack-query/src/generator.ts
+++ b/packages/plugins/tanstack-query/src/generator.ts
@@ -14,6 +14,7 @@ import {
import { DataModel, DataModelFieldType, Model, isEnum, isTypeDef } from '@zenstackhq/sdk/ast';
import { getPrismaClientImportSpec, supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma';
import { paramCase } from 'change-case';
+import fs from 'fs';
import { lowerCaseFirst } from 'lower-case-first';
import path from 'path';
import { Project, SourceFile, VariableDeclarationKind } from 'ts-morph';
@@ -45,6 +46,14 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.
outDir = resolvePath(outDir, options);
ensureEmptyDir(outDir);
+ if (options.portable && typeof options.portable !== 'boolean') {
+ throw new PluginError(
+ name,
+ `Invalid value for "portable" option: ${options.portable}, a boolean value is expected`
+ );
+ }
+ const portable = options.portable ?? false;
+
await generateModelMeta(project, models, typeDefs, {
output: path.join(outDir, '__model_meta.ts'),
generateAttributes: false,
@@ -61,6 +70,10 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.
generateModelHooks(target, version, project, outDir, dataModel, mapping, options);
});
+ if (portable) {
+ generateBundledTypes(project, outDir, options);
+ }
+
await saveProject(project);
return { warnings };
}
@@ -333,9 +346,7 @@ function generateModelHooks(
const fileName = paramCase(model.name);
const sf = project.createSourceFile(path.join(outDir, `${fileName}.ts`), undefined, { overwrite: true });
- sf.addStatements('/* eslint-disable */');
-
- const prismaImport = getPrismaClientImportSpec(outDir, options);
+ const prismaImport = options.portable ? './__types' : getPrismaClientImportSpec(outDir, options);
sf.addImportDeclaration({
namedImports: ['Prisma', model.name],
isTypeOnly: true,
@@ -584,6 +595,7 @@ function generateIndex(
sf.addStatements(`export { SvelteQueryContextKey, setHooksContext } from '${runtimeImportBase}/svelte';`);
break;
}
+ sf.addStatements(`export { default as metadata } from './__model_meta';`);
}
function makeGetContext(target: TargetFramework) {
@@ -724,3 +736,21 @@ function makeMutationOptions(target: string, returnType: string, argsType: strin
function makeRuntimeImportBase(version: TanStackVersion) {
return `@zenstackhq/tanstack-query/runtime${version === 'v5' ? '-v5' : ''}`;
}
+
+function generateBundledTypes(project: Project, outDir: string, options: PluginOptions) {
+ if (!options.prismaClientDtsPath) {
+ throw new PluginError(name, `Unable to determine the location of PrismaClient types`);
+ }
+
+ // copy PrismaClient index.d.ts
+ const content = fs.readFileSync(options.prismaClientDtsPath, 'utf-8');
+ project.createSourceFile(path.join(outDir, '__types.d.ts'), content, { overwrite: true });
+
+ // "runtime/library.d.ts" is referenced by Prisma's DTS, and it's generated into Prisma's output
+ // folder if a custom output is specified; if not, it's referenced from '@prisma/client'
+ const libraryDts = path.join(path.dirname(options.prismaClientDtsPath), 'runtime', 'library.d.ts');
+ if (fs.existsSync(libraryDts)) {
+ const content = fs.readFileSync(libraryDts, 'utf-8');
+ project.createSourceFile(path.join(outDir, 'runtime', 'library.d.ts'), content, { overwrite: true });
+ }
+}
diff --git a/packages/plugins/tanstack-query/tests/portable.test.ts b/packages/plugins/tanstack-query/tests/portable.test.ts
new file mode 100644
index 000000000..6ddbb1cc3
--- /dev/null
+++ b/packages/plugins/tanstack-query/tests/portable.test.ts
@@ -0,0 +1,153 @@
+///
+
+import { loadSchema, normalizePath } from '@zenstackhq/testtools';
+import path from 'path';
+import tmp from 'tmp';
+
+describe('Tanstack Query Plugin Portable Tests', () => {
+ it('supports portable for standard prisma client', async () => {
+ await loadSchema(
+ `
+ plugin tanstack {
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
+ output = '$projectRoot/hooks'
+ target = 'react'
+ portable = true
+ }
+
+ model User {
+ id Int @id @default(autoincrement())
+ email String
+ posts Post[]
+ }
+
+ model Post {
+ id Int @id @default(autoincrement())
+ title String
+ author User @relation(fields: [authorId], references: [id])
+ authorId Int
+ }
+ `,
+ {
+ provider: 'postgresql',
+ pushDb: false,
+ extraDependencies: ['react@18.2.0', '@types/react@18.2.0', '@tanstack/react-query@5.56.x'],
+ copyDependencies: [path.resolve(__dirname, '../dist')],
+ compile: true,
+ extraSourceFiles: [
+ {
+ name: 'main.ts',
+ content: `
+import { useFindUniqueUser } from './hooks';
+const { data } = useFindUniqueUser({ where: { id: 1 }, include: { posts: true } });
+console.log(data?.email);
+console.log(data?.posts[0].title);
+`,
+ },
+ ],
+ }
+ );
+ });
+
+ it('supports portable for custom prisma client output', async () => {
+ const t = tmp.dirSync({ unsafeCleanup: true });
+ const projectDir = t.name;
+
+ await loadSchema(
+ `
+ datasource db {
+ provider = 'postgresql'
+ url = env('DATABASE_URL')
+ }
+
+ generator client {
+ provider = 'prisma-client-js'
+ output = '$projectRoot/myprisma'
+ }
+
+ plugin tanstack {
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
+ output = '$projectRoot/hooks'
+ target = 'react'
+ portable = true
+ }
+
+ model User {
+ id Int @id @default(autoincrement())
+ email String
+ posts Post[]
+ }
+
+ model Post {
+ id Int @id @default(autoincrement())
+ title String
+ author User @relation(fields: [authorId], references: [id])
+ authorId Int
+ }
+ `,
+ {
+ provider: 'postgresql',
+ pushDb: false,
+ extraDependencies: ['react@18.2.0', '@types/react@18.2.0', '@tanstack/react-query@5.56.x'],
+ copyDependencies: [path.resolve(__dirname, '../dist')],
+ compile: true,
+ addPrelude: false,
+ projectDir,
+ prismaLoadPath: `${projectDir}/myprisma`,
+ extraSourceFiles: [
+ {
+ name: 'main.ts',
+ content: `
+import { useFindUniqueUser } from './hooks';
+const { data } = useFindUniqueUser({ where: { id: 1 }, include: { posts: true } });
+console.log(data?.email);
+console.log(data?.posts[0].title);
+`,
+ },
+ ],
+ }
+ );
+ });
+
+ it('supports portable for logical client', async () => {
+ await loadSchema(
+ `
+ plugin tanstack {
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
+ output = '$projectRoot/hooks'
+ target = 'react'
+ portable = true
+ }
+
+ model Base {
+ id Int @id @default(autoincrement())
+ createdAt DateTime @default(now())
+ type String
+ @@delegate(type)
+ }
+
+ model User extends Base {
+ email String
+ }
+ `,
+ {
+ provider: 'postgresql',
+ pushDb: false,
+ extraDependencies: ['react@18.2.0', '@types/react@18.2.0', '@tanstack/react-query@5.56.x'],
+ copyDependencies: [path.resolve(__dirname, '../dist')],
+ compile: true,
+ extraSourceFiles: [
+ {
+ name: 'main.ts',
+ content: `
+import { useFindUniqueUser } from './hooks';
+const { data } = useFindUniqueUser({ where: { id: 1 } });
+console.log(data?.email);
+console.log(data?.createdAt);
+`,
+ },
+ ],
+ }
+ );
+ });
+});
diff --git a/packages/plugins/trpc/src/client-helper/index.ts b/packages/plugins/trpc/src/client-helper/index.ts
index f296ca1ab..99679c716 100644
--- a/packages/plugins/trpc/src/client-helper/index.ts
+++ b/packages/plugins/trpc/src/client-helper/index.ts
@@ -41,8 +41,6 @@ export function generateClientTypingForModel(
}
);
- sf.addStatements([`/* eslint-disable */`]);
-
generateImports(clientType, sf, options, version);
// generate a `ClientType` interface that contains typing for query/mutation operations
diff --git a/packages/plugins/trpc/src/generator.ts b/packages/plugins/trpc/src/generator.ts
index 6574069f8..5f7d8601b 100644
--- a/packages/plugins/trpc/src/generator.ts
+++ b/packages/plugins/trpc/src/generator.ts
@@ -122,8 +122,6 @@ function createAppRouter(
overwrite: true,
});
- appRouter.addStatements('/* eslint-disable */');
-
const prismaImport = getPrismaClientImportSpec(path.dirname(indexFile), options);
if (version === 'v10') {
@@ -274,8 +272,6 @@ function generateModelCreateRouter(
overwrite: true,
});
- modelRouter.addStatements('/* eslint-disable */');
-
if (version === 'v10') {
modelRouter.addImportDeclarations([
{
@@ -386,7 +382,6 @@ function createHelper(outDir: string) {
overwrite: true,
});
- sf.addStatements('/* eslint-disable */');
sf.addStatements(`import { TRPCError } from '@trpc/server';`);
sf.addStatements(`import { isPrismaClientKnownRequestError } from '${RUNTIME_PACKAGE}';`);
diff --git a/packages/schema/src/cli/plugin-runner.ts b/packages/schema/src/cli/plugin-runner.ts
index 4158bd256..a13ca2afc 100644
--- a/packages/schema/src/cli/plugin-runner.ts
+++ b/packages/schema/src/cli/plugin-runner.ts
@@ -136,6 +136,8 @@ export class PluginRunner {
let dmmf: DMMF.Document | undefined = undefined;
let shortNameMap: Map | undefined;
let prismaClientPath = '@prisma/client';
+ let prismaClientDtsPath: string | undefined = undefined;
+
const project = createProject();
for (const { name, description, run, options: pluginOptions } of corePlugins) {
const options = { ...pluginOptions, prismaClientPath };
@@ -165,6 +167,7 @@ export class PluginRunner {
if (r.prismaClientPath) {
// use the prisma client path returned by the plugin
prismaClientPath = r.prismaClientPath;
+ prismaClientDtsPath = r.prismaClientDtsPath;
}
}
@@ -173,13 +176,13 @@ export class PluginRunner {
// run user plugins
for (const { name, description, run, options: pluginOptions } of userPlugins) {
- const options = { ...pluginOptions, prismaClientPath };
+ const options = { ...pluginOptions, prismaClientPath, prismaClientDtsPath };
const r = await this.runPlugin(
name,
description,
run,
runnerOptions,
- options,
+ options as PluginOptions,
dmmf,
shortNameMap,
project,
diff --git a/packages/schema/src/plugins/enhancer/enhance/index.ts b/packages/schema/src/plugins/enhancer/enhance/index.ts
index 3f9d371a2..7236cac85 100644
--- a/packages/schema/src/plugins/enhancer/enhance/index.ts
+++ b/packages/schema/src/plugins/enhancer/enhance/index.ts
@@ -62,7 +62,7 @@ export class EnhancerGenerator {
private readonly outDir: string
) {}
- async generate(): Promise<{ dmmf: DMMF.Document | undefined }> {
+ async generate(): Promise<{ dmmf: DMMF.Document | undefined; newPrismaClientDtsPath: string | undefined }> {
let dmmf: DMMF.Document | undefined;
const prismaImport = getPrismaClientImportSpec(this.outDir, this.options);
@@ -128,7 +128,12 @@ ${
await this.saveSourceFile(enhanceTs);
}
- return { dmmf };
+ return {
+ dmmf,
+ newPrismaClientDtsPath: prismaTypesFixed
+ ? path.resolve(this.outDir, LOGICAL_CLIENT_GENERATION_PATH, 'index-fixed.d.ts')
+ : undefined,
+ };
}
private getZodImport() {
diff --git a/packages/schema/src/plugins/enhancer/index.ts b/packages/schema/src/plugins/enhancer/index.ts
index c0cd7e13d..c0bd93564 100644
--- a/packages/schema/src/plugins/enhancer/index.ts
+++ b/packages/schema/src/plugins/enhancer/index.ts
@@ -26,7 +26,7 @@ const run: PluginFunction = async (model, options, _dmmf, globalOptions) => {
await generateModelMeta(model, options, project, outDir);
await generatePolicy(model, options, project, outDir);
- const { dmmf } = await new EnhancerGenerator(model, options, project, outDir).generate();
+ const { dmmf, newPrismaClientDtsPath } = await new EnhancerGenerator(model, options, project, outDir).generate();
let prismaClientPath: string | undefined;
if (dmmf) {
@@ -44,7 +44,7 @@ const run: PluginFunction = async (model, options, _dmmf, globalOptions) => {
}
}
- return { dmmf, warnings: [], prismaClientPath };
+ return { dmmf, warnings: [], prismaClientPath, prismaClientDtsPath: newPrismaClientDtsPath };
};
export default run;
diff --git a/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts b/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts
index 62469f744..8622d13d4 100644
--- a/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts
+++ b/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts
@@ -59,7 +59,6 @@ export class PolicyGenerator {
async generate(project: Project, model: Model, output: string) {
const sf = project.createSourceFile(path.join(output, 'policy.ts'), undefined, { overwrite: true });
- sf.addStatements('/* eslint-disable */');
this.writeImports(model, output, sf);
diff --git a/packages/schema/src/plugins/prisma/index.ts b/packages/schema/src/plugins/prisma/index.ts
index 7fa94cd92..9849cc938 100644
--- a/packages/schema/src/plugins/prisma/index.ts
+++ b/packages/schema/src/plugins/prisma/index.ts
@@ -28,8 +28,16 @@ const run: PluginFunction = async (model, options, _dmmf, _globalOptions) => {
const mergedOptions = { ...options, output } as unknown as PluginOptions;
const { warnings, shortNameMap } = await new PrismaSchemaGenerator(model).generate(mergedOptions);
+
+ // the path to import the prisma client from
let prismaClientPath = '@prisma/client';
+ // the real path where the prisma client was generated
+ let clientOutputDir = '.prisma/client';
+
+ // the path to the prisma client dts file
+ let prismaClientDtsPath: string | undefined = undefined;
+
if (options.generateClient !== false) {
let generateCmd = `prisma generate --schema "${output}"`;
if (typeof options.generateArgs === 'string') {
@@ -68,6 +76,23 @@ const run: PluginFunction = async (model, options, _dmmf, _globalOptions) => {
// then make it relative to the zmodel schema location
prismaClientPath = normalizedRelative(path.dirname(options.schemaPath), absPath);
}
+
+ // record custom location where the prisma client was generated
+ clientOutputDir = prismaClientPath;
+ }
+
+ // get PrismaClient dts path
+ try {
+ const prismaClientResolvedPath = require.resolve(clientOutputDir, {
+ paths: [path.dirname(options.schemaPath)],
+ });
+ prismaClientDtsPath = path.join(path.dirname(prismaClientResolvedPath), 'index.d.ts');
+ } catch (err) {
+ console.warn(
+ colors.yellow(
+ `Could not resolve PrismaClient type declaration path. This may break plugins that depend on it.`
+ )
+ );
}
} else {
console.warn(
@@ -82,7 +107,7 @@ const run: PluginFunction = async (model, options, _dmmf, _globalOptions) => {
datamodel: fs.readFileSync(output, 'utf-8'),
});
- return { warnings, dmmf, prismaClientPath, shortNameMap };
+ return { warnings, dmmf, prismaClientPath, prismaClientDtsPath, shortNameMap };
};
function getDefaultPrismaOutputFile(schemaPath: string) {
diff --git a/packages/schema/src/plugins/zod/generator.ts b/packages/schema/src/plugins/zod/generator.ts
index 969cef3c7..0cdc8d44a 100644
--- a/packages/schema/src/plugins/zod/generator.ts
+++ b/packages/schema/src/plugins/zod/generator.ts
@@ -13,6 +13,7 @@ import {
isIdField,
parseOptionAsStrings,
resolvePath,
+ saveSourceFile,
} from '@zenstackhq/sdk';
import { DataModel, EnumField, Model, TypeDef, isDataModel, isEnum, isTypeDef } from '@zenstackhq/sdk/ast';
import { addMissingInputObjectTypes, resolveAggregateOperationSupport } from '@zenstackhq/sdk/dmmf-helpers';
@@ -143,12 +144,7 @@ export class ZodSchemaGenerator {
if (this.options.preserveTsFiles === true || this.options.output) {
// if preserveTsFiles is true or the user provided a custom output directory,
// save the generated files
- await Promise.all(
- this.sourceFiles.map(async (sf) => {
- await sf.formatText();
- await sf.save();
- })
- );
+ this.sourceFiles.forEach(saveSourceFile);
}
}
@@ -325,8 +321,6 @@ export class ZodSchemaGenerator {
}
private addPreludeAndImports(decl: DataModel | TypeDef, writer: CodeBlockWriter, output: string) {
- writer.writeLine('/* eslint-disable */');
- writer.writeLine('// @ts-nocheck');
writer.writeLine(`import { z } from 'zod';`);
// import user-defined enums from Prisma as they might be referenced in the expressions
diff --git a/packages/schema/src/plugins/zod/transformer.ts b/packages/schema/src/plugins/zod/transformer.ts
index 081dcaf4a..a61eec3a2 100644
--- a/packages/schema/src/plugins/zod/transformer.ts
+++ b/packages/schema/src/plugins/zod/transformer.ts
@@ -59,7 +59,7 @@ export default class Transformer {
for (const enumType of this.enumTypes) {
const name = upperCaseFirst(enumType.name);
const filePath = path.join(Transformer.outputPath, `enums/${name}.schema.ts`);
- const content = `/* eslint-disable */\n${this.generateImportZodStatement()}\n${this.generateExportSchemaStatement(
+ const content = `${this.generateImportZodStatement()}\n${this.generateExportSchemaStatement(
`${name}`,
`z.enum(${JSON.stringify(enumType.values)})`
)}`;
@@ -72,7 +72,7 @@ export default class Transformer {
for (const enumDecl of extraEnums) {
const name = upperCaseFirst(enumDecl.name);
const filePath = path.join(Transformer.outputPath, `enums/${name}.schema.ts`);
- const content = `/* eslint-disable */\n${this.generateImportZodStatement()}\n${this.generateExportSchemaStatement(
+ const content = `${this.generateImportZodStatement()}\n${this.generateExportSchemaStatement(
`${name}`,
`z.enum(${JSON.stringify(enumDecl.fields.map((f) => f.name))})`
)}`;
@@ -107,7 +107,7 @@ export default class Transformer {
const objectSchema = this.prepareObjectSchema(schemaFields, options);
const filePath = path.join(Transformer.outputPath, `objects/${this.name}.schema.ts`);
- const content = '/* eslint-disable */\n' + extraImports.join('\n\n') + objectSchema;
+ const content = extraImports.join('\n\n') + objectSchema;
this.sourceFiles.push(this.project.createSourceFile(filePath, content, { overwrite: true }));
return `${this.name}.schema`;
}
@@ -773,7 +773,6 @@ export const ${this.name}ObjectSchema: SchemaType = ${schema} as SchemaType;`;
const filePath = path.join(Transformer.outputPath, `input/${modelName}Input.schema.ts`);
const content = `
- /* eslint-disable */
${imports.join(';\n')}
type ${modelName}InputSchemaType = {
@@ -794,7 +793,6 @@ ${operations
const indexFilePath = path.join(Transformer.outputPath, 'input/index.ts');
const indexContent = `
-/* eslint-disable */
${globalExports.join(';\n')}
`;
this.sourceFiles.push(this.project.createSourceFile(indexFilePath, indexContent, { overwrite: true }));
diff --git a/packages/sdk/package.json b/packages/sdk/package.json
index b2be27d13..a66a32eaf 100644
--- a/packages/sdk/package.json
+++ b/packages/sdk/package.json
@@ -48,6 +48,7 @@
"./dmmf-helpers": {
"types": "./dmmf-helpers/index.d.ts",
"default": "./dmmf-helpers/index.js"
- }
+ },
+ "./package.json": "./package.json"
}
}
diff --git a/packages/sdk/src/code-gen.ts b/packages/sdk/src/code-gen.ts
index 3f80e7e4d..7ed528aa7 100644
--- a/packages/sdk/src/code-gen.ts
+++ b/packages/sdk/src/code-gen.ts
@@ -1,4 +1,5 @@
-import { CompilerOptions, DiagnosticCategory, ModuleKind, Project, ScriptTarget } from 'ts-morph';
+import { CompilerOptions, DiagnosticCategory, ModuleKind, Project, ScriptTarget, SourceFile } from 'ts-morph';
+import pkgJson from './package.json';
import { PluginError } from './types';
/**
@@ -19,11 +20,27 @@ export function createProject(options?: CompilerOptions) {
});
}
+export function saveSourceFile(sourceFile: SourceFile) {
+ sourceFile.replaceWithText(
+ `/******************************************************************************
+* This file was generated by ZenStack CLI ${pkgJson.version}.
+******************************************************************************/
+
+/* eslint-disable */
+// @ts-nocheck
+
+ ${sourceFile.getText()}
+ `
+ );
+ sourceFile.formatText();
+ sourceFile.saveSync();
+}
+
/**
* Persists a TS project to disk.
*/
export async function saveProject(project: Project) {
- project.getSourceFiles().forEach((sf) => sf.formatText());
+ project.getSourceFiles().forEach(saveSourceFile);
await project.save();
}
diff --git a/packages/sdk/src/model-meta-generator.ts b/packages/sdk/src/model-meta-generator.ts
index ae76f2fe5..4140786cb 100644
--- a/packages/sdk/src/model-meta-generator.ts
+++ b/packages/sdk/src/model-meta-generator.ts
@@ -73,7 +73,6 @@ export async function generate(
options: ModelMetaGeneratorOptions
) {
const sf = project.createSourceFile(options.output, undefined, { overwrite: true });
- sf.addStatements('/* eslint-disable */');
sf.addVariableStatement({
declarationKind: VariableDeclarationKind.Const,
declarations: [
diff --git a/packages/sdk/src/package.json b/packages/sdk/src/package.json
new file mode 120000
index 000000000..4e26811d4
--- /dev/null
+++ b/packages/sdk/src/package.json
@@ -0,0 +1 @@
+../package.json
\ No newline at end of file
diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts
index 92c099717..29160c283 100644
--- a/packages/sdk/src/types.ts
+++ b/packages/sdk/src/types.ts
@@ -31,6 +31,12 @@ export type PluginOptions = {
*/
prismaClientPath?: string;
+ /**
+ * PrismaClient's TypeScript declaration file's path
+ * @private
+ */
+ prismaClientDtsPath?: string;
+
/**
* An optional map of full names to shortened names
* @private
@@ -74,6 +80,12 @@ export type PluginResult = {
*/
prismaClientPath?: string;
+ /**
+ * PrismaClient's TypeScript declaration file's path
+ * @private
+ */
+ prismaClientDtsPath?: string;
+
/**
* An optional Prisma DMMF document that a plugin can generate
* @private