@zenstackhq/trpc 1.0.0-alpha.99 → 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/generator.d.ts +1 -1
- package/generator.js +136 -38
- package/generator.js.map +1 -1
- package/helpers.d.ts +9 -3
- package/helpers.js +213 -22
- package/helpers.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/package.json +13 -7
- package/res/client/next.ts +17 -0
- package/res/client/react.ts +17 -0
- package/res/client/utils.ts +32 -0
- package/config.d.ts +0 -9
- package/config.js +0 -8
- package/config.js.map +0 -1
- package/types.d.ts +0 -0
- package/types.js +0 -2
- package/types.js.map +0 -1
- package/utils/uncapitalizeFirstLetter.d.ts +0 -1
- package/utils/uncapitalizeFirstLetter.js +0 -8
- package/utils/uncapitalizeFirstLetter.js.map +0 -1
- package/zod/generator.d.ts +0 -4
- package/zod/generator.js +0 -85
- package/zod/generator.js.map +0 -1
- package/zod/index.d.ts +0 -5
- package/zod/index.js +0 -21
- package/zod/index.js.map +0 -1
- package/zod/transformer.d.ts +0 -65
- package/zod/transformer.js +0 -440
- package/zod/transformer.js.map +0 -1
- package/zod/types.d.ts +0 -20
- package/zod/types.js +0 -3
- package/zod/types.js.map +0 -1
- package/zod/utils/formatFile.d.ts +0 -1
- package/zod/utils/formatFile.js +0 -32
- package/zod/utils/formatFile.js.map +0 -1
- package/zod/utils/removeDir.d.ts +0 -1
- package/zod/utils/removeDir.js +0 -30
- package/zod/utils/removeDir.js.map +0 -1
- package/zod/utils/writeFileSafely.d.ts +0 -1
- package/zod/utils/writeFileSafely.js +0 -26
- package/zod/utils/writeFileSafely.js.map +0 -1
package/generator.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DMMF } from '@prisma/generator-helper';
|
|
1
|
+
import type { DMMF } from '@prisma/generator-helper';
|
|
2
2
|
import { PluginOptions } from '@zenstackhq/sdk';
|
|
3
3
|
import { Model } from '@zenstackhq/sdk/ast';
|
|
4
4
|
export declare function generate(model: Model, options: PluginOptions, dmmf: DMMF.Document): Promise<void>;
|
package/generator.js
CHANGED
|
@@ -25,42 +25,51 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.generate = void 0;
|
|
27
27
|
const sdk_1 = require("@zenstackhq/sdk");
|
|
28
|
-
const
|
|
29
|
-
const
|
|
28
|
+
const fs_1 = __importDefault(require("fs"));
|
|
29
|
+
const lower_case_first_1 = require("lower-case-first");
|
|
30
30
|
const path_1 = __importDefault(require("path"));
|
|
31
|
+
const ts_morph_1 = require("ts-morph");
|
|
32
|
+
const upper_case_first_1 = require("upper-case-first");
|
|
33
|
+
const _1 = require(".");
|
|
31
34
|
const helpers_1 = require("./helpers");
|
|
32
35
|
const project_1 = require("./project");
|
|
33
36
|
const removeDir_1 = __importDefault(require("./utils/removeDir"));
|
|
34
|
-
const generator_1 = require("./zod/generator");
|
|
35
37
|
function generate(model, options, dmmf) {
|
|
38
|
+
var _a;
|
|
36
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
let outDir = options
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
let outDir = (0, sdk_1.requireOption)(options, 'output');
|
|
41
|
+
outDir = (0, sdk_1.resolvePath)(outDir, options);
|
|
42
|
+
// resolve "generateModelActions" option
|
|
43
|
+
const generateModelActions = parseOptionAsStrings(options, 'generateModelActions');
|
|
44
|
+
// resolve "generateClientHelpers" option
|
|
45
|
+
const generateClientHelpers = parseOptionAsStrings(options, 'generateClientHelpers');
|
|
46
|
+
if (generateClientHelpers && !generateClientHelpers.every((v) => ['react', 'next'].includes(v))) {
|
|
47
|
+
throw new sdk_1.PluginError(_1.name, `Option "generateClientHelpers" only support values "react" and "next"`);
|
|
40
48
|
}
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
outDir = path_1.default.join(path_1.default.dirname(options.schemaPath), outDir);
|
|
49
|
+
if (options.zodSchemasImport && typeof options.zodSchemasImport !== 'string') {
|
|
50
|
+
throw new sdk_1.PluginError(_1.name, `Option "zodSchemasImport" must be a string`);
|
|
44
51
|
}
|
|
45
|
-
yield fs_1.promises.mkdir(outDir, { recursive: true });
|
|
52
|
+
yield fs_1.default.promises.mkdir(outDir, { recursive: true });
|
|
46
53
|
yield (0, removeDir_1.default)(outDir, true);
|
|
47
|
-
yield (0, generator_1.generate)(model, options, dmmf);
|
|
48
54
|
const prismaClientDmmf = dmmf;
|
|
49
55
|
const modelOperations = prismaClientDmmf.mappings.modelOperations;
|
|
50
56
|
const models = prismaClientDmmf.datamodel.models;
|
|
51
57
|
const hiddenModels = [];
|
|
52
58
|
(0, helpers_1.resolveModelsComments)(models, hiddenModels);
|
|
53
|
-
|
|
59
|
+
const zodSchemasImport = (_a = options.zodSchemasImport) !== null && _a !== void 0 ? _a : '@zenstackhq/runtime/zod';
|
|
60
|
+
createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions, generateClientHelpers, model, zodSchemasImport);
|
|
54
61
|
createHelper(outDir);
|
|
55
|
-
yield project_1.project
|
|
62
|
+
yield (0, sdk_1.saveProject)(project_1.project);
|
|
56
63
|
});
|
|
57
64
|
}
|
|
58
65
|
exports.generate = generate;
|
|
59
|
-
function createAppRouter(outDir, modelOperations, hiddenModels) {
|
|
60
|
-
const
|
|
66
|
+
function createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions, generateClientHelpers, zmodel, zodSchemasImport) {
|
|
67
|
+
const indexFile = path_1.default.resolve(outDir, 'routers', `index.ts`);
|
|
68
|
+
const appRouter = project_1.project.createSourceFile(indexFile, undefined, {
|
|
61
69
|
overwrite: true,
|
|
62
70
|
});
|
|
63
71
|
appRouter.addStatements('/* eslint-disable */');
|
|
72
|
+
const prismaImport = (0, sdk_1.getPrismaClientImportSpec)(zmodel, path_1.default.dirname(indexFile));
|
|
64
73
|
appRouter.addImportDeclarations([
|
|
65
74
|
{
|
|
66
75
|
namedImports: ['AnyRootConfig'],
|
|
@@ -68,10 +77,10 @@ function createAppRouter(outDir, modelOperations, hiddenModels) {
|
|
|
68
77
|
},
|
|
69
78
|
{
|
|
70
79
|
namedImports: ['PrismaClient'],
|
|
71
|
-
moduleSpecifier:
|
|
80
|
+
moduleSpecifier: prismaImport,
|
|
72
81
|
},
|
|
73
82
|
{
|
|
74
|
-
namedImports: ['createRouterFactory'],
|
|
83
|
+
namedImports: ['createRouterFactory', 'AnyRouter'],
|
|
75
84
|
moduleSpecifier: '@trpc/server/dist/core/router',
|
|
76
85
|
},
|
|
77
86
|
{
|
|
@@ -98,35 +107,74 @@ function createAppRouter(outDir, modelOperations, hiddenModels) {
|
|
|
98
107
|
}
|
|
99
108
|
|
|
100
109
|
`);
|
|
101
|
-
const
|
|
110
|
+
const filteredModelOperations = modelOperations.filter((mo) => !hiddenModels.includes(mo.model));
|
|
111
|
+
appRouter
|
|
112
|
+
.addFunction({
|
|
102
113
|
name: 'createRouter<Config extends BaseConfig>',
|
|
103
114
|
parameters: [
|
|
104
115
|
{ name: 'router', type: 'RouterFactory<Config>' },
|
|
105
116
|
{ name: 'procedure', type: 'ProcBuilder<Config>' },
|
|
106
117
|
],
|
|
107
118
|
isExported: true,
|
|
108
|
-
})
|
|
109
|
-
|
|
119
|
+
})
|
|
120
|
+
.setBodyText((writer) => {
|
|
110
121
|
writer.write('return router(');
|
|
111
122
|
writer.block(() => {
|
|
112
|
-
for (const modelOperation of
|
|
123
|
+
for (const modelOperation of filteredModelOperations) {
|
|
113
124
|
const { model } = modelOperation, operations = __rest(modelOperation, ["model"]);
|
|
114
|
-
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
generateModelCreateRouter(project_1.project, model, operations, outDir);
|
|
125
|
+
generateModelCreateRouter(project_1.project, model, operations, outDir, generateModelActions, generateClientHelpers, zmodel, zodSchemasImport);
|
|
118
126
|
appRouter.addImportDeclaration({
|
|
119
127
|
defaultImport: `create${model}Router`,
|
|
120
128
|
moduleSpecifier: `./${model}.router`,
|
|
121
129
|
});
|
|
122
|
-
writer.writeLine(`${(0,
|
|
130
|
+
writer.writeLine(`${(0, lower_case_first_1.lowerCaseFirst)(model)}: create${model}Router<Config>(router, procedure),`);
|
|
123
131
|
}
|
|
124
132
|
});
|
|
125
133
|
writer.write(');');
|
|
126
134
|
});
|
|
135
|
+
if (generateClientHelpers) {
|
|
136
|
+
appRouter.addInterface({
|
|
137
|
+
name: 'ClientType',
|
|
138
|
+
typeParameters: ['AppRouter extends AnyRouter'],
|
|
139
|
+
isExported: true,
|
|
140
|
+
properties: filteredModelOperations.map(({ model }) => {
|
|
141
|
+
appRouter.addImportDeclaration({
|
|
142
|
+
namedImports: [{ name: 'ClientType', alias: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType` }],
|
|
143
|
+
moduleSpecifier: `./${model}.router`,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
name: (0, lower_case_first_1.lowerCaseFirst)(model),
|
|
147
|
+
type: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType<AppRouter>`,
|
|
148
|
+
};
|
|
149
|
+
}),
|
|
150
|
+
});
|
|
151
|
+
createClientHelpers(outDir, generateClientHelpers);
|
|
152
|
+
}
|
|
127
153
|
appRouter.formatText();
|
|
128
154
|
}
|
|
129
|
-
function
|
|
155
|
+
function createClientHelpers(outputDir, generateClientHelpers) {
|
|
156
|
+
const utils = project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', `utils.ts`), undefined, {
|
|
157
|
+
overwrite: true,
|
|
158
|
+
});
|
|
159
|
+
utils.replaceWithText(fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/utils.ts'), 'utf-8'));
|
|
160
|
+
for (const client of generateClientHelpers) {
|
|
161
|
+
switch (client) {
|
|
162
|
+
case 'react': {
|
|
163
|
+
const content = fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/react.ts'), 'utf-8');
|
|
164
|
+
project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'react.ts'), content, {
|
|
165
|
+
overwrite: true,
|
|
166
|
+
});
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case 'next': {
|
|
170
|
+
const content = fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/next.ts'), 'utf-8');
|
|
171
|
+
project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'next.ts'), content, { overwrite: true });
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function generateModelCreateRouter(project, model, operations, outputDir, generateModelActions, generateClientHelpers, zmodel, zodSchemasImport) {
|
|
130
178
|
const modelRouter = project.createSourceFile(path_1.default.resolve(outputDir, 'routers', `${model}.router.ts`), undefined, {
|
|
131
179
|
overwrite: true,
|
|
132
180
|
});
|
|
@@ -137,10 +185,12 @@ function generateModelCreateRouter(project, model, operations, outputDir) {
|
|
|
137
185
|
moduleSpecifier: '.',
|
|
138
186
|
},
|
|
139
187
|
]);
|
|
140
|
-
(0, helpers_1.generateRouterSchemaImports)(modelRouter, model);
|
|
188
|
+
(0, helpers_1.generateRouterSchemaImports)(modelRouter, model, zodSchemasImport);
|
|
141
189
|
(0, helpers_1.generateHelperImport)(modelRouter);
|
|
142
|
-
|
|
143
|
-
.
|
|
190
|
+
if (generateClientHelpers) {
|
|
191
|
+
(0, helpers_1.generateRouterTypingImports)(modelRouter, zmodel);
|
|
192
|
+
}
|
|
193
|
+
const createRouterFunc = modelRouter.addFunction({
|
|
144
194
|
name: 'createRouter<Config extends BaseConfig>',
|
|
145
195
|
parameters: [
|
|
146
196
|
{ name: 'router', type: 'RouterFactory<Config>' },
|
|
@@ -148,20 +198,48 @@ function generateModelCreateRouter(project, model, operations, outputDir) {
|
|
|
148
198
|
],
|
|
149
199
|
isExported: true,
|
|
150
200
|
isDefaultExport: true,
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
201
|
+
});
|
|
202
|
+
let routerTypingStructure = undefined;
|
|
203
|
+
if (generateClientHelpers) {
|
|
204
|
+
// generate an interface for precise Prisma-like typing for the router procedures
|
|
205
|
+
// which will be used to correct tRPC's typing on the client side
|
|
206
|
+
routerTypingStructure = {
|
|
207
|
+
kind: ts_morph_1.StructureKind.Interface,
|
|
208
|
+
name: 'ClientType',
|
|
209
|
+
isExported: true,
|
|
210
|
+
typeParameters: ['AppRouter extends AnyRouter', `Context = AppRouter['_def']['_config']['$types']['ctx']`],
|
|
211
|
+
properties: [],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
createRouterFunc.setBodyText((funcWriter) => {
|
|
215
|
+
funcWriter.write('return router(');
|
|
216
|
+
funcWriter.block(() => {
|
|
217
|
+
var _a;
|
|
155
218
|
for (const [opType, opNameWithModel] of Object.entries(operations)) {
|
|
156
219
|
const baseOpType = opType.replace('OrThrow', '');
|
|
157
|
-
const inputType = (0, helpers_1.
|
|
158
|
-
|
|
159
|
-
|
|
220
|
+
const inputType = (0, helpers_1.getInputSchemaByOpName)(baseOpType, model);
|
|
221
|
+
const generateOpName = opType.replace(/One$/, '');
|
|
222
|
+
if (opNameWithModel &&
|
|
223
|
+
inputType &&
|
|
224
|
+
(!generateModelActions || generateModelActions.includes(generateOpName))) {
|
|
225
|
+
(0, helpers_1.generateProcedure)(funcWriter, generateOpName, inputType, model, baseOpType);
|
|
226
|
+
if (routerTypingStructure) {
|
|
227
|
+
(_a = routerTypingStructure.properties) === null || _a === void 0 ? void 0 : _a.push({
|
|
228
|
+
kind: ts_morph_1.StructureKind.PropertySignature,
|
|
229
|
+
name: generateOpName,
|
|
230
|
+
type: (writer) => {
|
|
231
|
+
(0, helpers_1.generateRouterTyping)(writer, generateOpName, model, baseOpType);
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
}
|
|
160
235
|
}
|
|
161
236
|
}
|
|
162
237
|
});
|
|
163
|
-
|
|
238
|
+
funcWriter.write(');');
|
|
164
239
|
});
|
|
240
|
+
if (routerTypingStructure) {
|
|
241
|
+
modelRouter.addInterface(routerTypingStructure);
|
|
242
|
+
}
|
|
165
243
|
modelRouter.formatText();
|
|
166
244
|
}
|
|
167
245
|
function createHelper(outDir) {
|
|
@@ -259,4 +337,24 @@ function createHelper(outDir) {
|
|
|
259
337
|
`);
|
|
260
338
|
checkRead.formatText();
|
|
261
339
|
}
|
|
340
|
+
function parseOptionAsStrings(options, optionaName) {
|
|
341
|
+
const value = options[optionaName];
|
|
342
|
+
if (value === undefined) {
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
345
|
+
else if (typeof value === 'string') {
|
|
346
|
+
// comma separated string
|
|
347
|
+
return value
|
|
348
|
+
.split(',')
|
|
349
|
+
.filter((i) => !!i)
|
|
350
|
+
.map((i) => i.trim());
|
|
351
|
+
}
|
|
352
|
+
else if (Array.isArray(value) && value.every((i) => typeof i === 'string')) {
|
|
353
|
+
// string array
|
|
354
|
+
return value;
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
throw new sdk_1.PluginError(_1.name, `Invalid "${optionaName}" option: must be a comma-separated string or an array of strings`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
262
360
|
//# sourceMappingURL=generator.js.map
|
package/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/helpers.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { DMMF } from '@prisma/generator-helper';
|
|
1
|
+
import type { DMMF } from '@prisma/generator-helper';
|
|
2
|
+
import { Model } from '@zenstackhq/sdk/ast';
|
|
2
3
|
import { CodeBlockWriter, SourceFile } from 'ts-morph';
|
|
3
4
|
export declare function generateProcedure(writer: CodeBlockWriter, opType: string, typeName: string, modelName: string, baseOpType: string): void;
|
|
4
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Generate precise Prisma-like typing for router procedures.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateRouterTyping(writer: CodeBlockWriter, opType: string, modelName: string, baseOpType: string): void;
|
|
9
|
+
export declare function generateRouterTypingImports(sourceFile: SourceFile, model: Model): void;
|
|
10
|
+
export declare function generateRouterSchemaImports(sourceFile: SourceFile, name: string, zodSchemasImport: string): void;
|
|
5
11
|
export declare function generateHelperImport(sourceFile: SourceFile): void;
|
|
6
|
-
export declare const
|
|
12
|
+
export declare const getInputSchemaByOpName: (opName: string, modelName: string) => string | undefined;
|
|
7
13
|
export declare const getProcedureTypeByOpName: (opName: string) => string | undefined;
|
|
8
14
|
export declare function resolveModelsComments(models: DMMF.Model[], hiddenModels: string[]): void;
|
package/helpers.js
CHANGED
|
@@ -1,81 +1,272 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveModelsComments = exports.getProcedureTypeByOpName = exports.
|
|
4
|
-
const
|
|
3
|
+
exports.resolveModelsComments = exports.getProcedureTypeByOpName = exports.getInputSchemaByOpName = exports.generateHelperImport = exports.generateRouterSchemaImports = exports.generateRouterTypingImports = exports.generateRouterTyping = exports.generateProcedure = void 0;
|
|
4
|
+
const sdk_1 = require("@zenstackhq/sdk");
|
|
5
|
+
const lower_case_first_1 = require("lower-case-first");
|
|
6
|
+
const upper_case_first_1 = require("upper-case-first");
|
|
7
|
+
const _1 = require(".");
|
|
5
8
|
function generateProcedure(writer, opType, typeName, modelName, baseOpType) {
|
|
6
9
|
const procType = (0, exports.getProcedureTypeByOpName)(baseOpType);
|
|
7
10
|
const prismaMethod = opType.replace('One', '');
|
|
8
11
|
if (procType === 'query') {
|
|
12
|
+
// the cast "as any" is to circumvent a TS compiler misfired error in certain cases
|
|
9
13
|
writer.write(`
|
|
10
|
-
${opType}: procedure.input(${typeName}).query(({ctx, input}) => checkRead(db(ctx).${(0,
|
|
14
|
+
${opType}: procedure.input(${typeName}).query(({ctx, input}) => checkRead(db(ctx).${(0, lower_case_first_1.lowerCaseFirst)(modelName)}.${prismaMethod}(input as any))),
|
|
11
15
|
`);
|
|
12
16
|
}
|
|
13
17
|
else if (procType === 'mutation') {
|
|
18
|
+
// the cast "as any" is to circumvent a TS compiler misfired error in certain cases
|
|
14
19
|
writer.write(`
|
|
15
|
-
${opType}: procedure.input(${typeName}).mutation(async ({ctx, input}) => checkMutate(db(ctx).${(0,
|
|
20
|
+
${opType}: procedure.input(${typeName}).mutation(async ({ctx, input}) => checkMutate(db(ctx).${(0, lower_case_first_1.lowerCaseFirst)(modelName)}.${prismaMethod}(input as any))),
|
|
16
21
|
`);
|
|
17
22
|
}
|
|
18
23
|
}
|
|
19
24
|
exports.generateProcedure = generateProcedure;
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Given a model and Prisma operation, returns related TS types.
|
|
27
|
+
*/
|
|
28
|
+
function getPrismaOperationTypes(model, operation) {
|
|
29
|
+
// TODO: find a way to derive from Prisma Client API's generic types
|
|
30
|
+
// instead of duplicating them
|
|
31
|
+
const capModel = (0, upper_case_first_1.upperCaseFirst)(model);
|
|
32
|
+
const capOperation = (0, upper_case_first_1.upperCaseFirst)(operation);
|
|
33
|
+
let genericBase = `Prisma.${capModel}${capOperation}Args`;
|
|
34
|
+
const getPayload = `Prisma.${capModel}GetPayload<T>`;
|
|
35
|
+
const selectSubset = `Prisma.SelectSubset<T, ${genericBase}>`;
|
|
36
|
+
let argsType;
|
|
37
|
+
let resultType;
|
|
38
|
+
switch (operation) {
|
|
39
|
+
case 'findUnique':
|
|
40
|
+
case 'findUniqueOrThrow':
|
|
41
|
+
case 'findFirst':
|
|
42
|
+
case 'findFirstOrThrow':
|
|
43
|
+
argsType = selectSubset;
|
|
44
|
+
resultType = getPayload;
|
|
45
|
+
break;
|
|
46
|
+
case 'findMany':
|
|
47
|
+
argsType = selectSubset;
|
|
48
|
+
resultType = `Array<${getPayload}>`;
|
|
49
|
+
break;
|
|
50
|
+
case 'create':
|
|
51
|
+
argsType = selectSubset;
|
|
52
|
+
resultType = getPayload;
|
|
53
|
+
break;
|
|
54
|
+
case 'createMany':
|
|
55
|
+
argsType = selectSubset;
|
|
56
|
+
resultType = `Prisma.BatchPayload`;
|
|
57
|
+
break;
|
|
58
|
+
case 'update':
|
|
59
|
+
argsType = selectSubset;
|
|
60
|
+
resultType = getPayload;
|
|
61
|
+
break;
|
|
62
|
+
case 'updateMany':
|
|
63
|
+
argsType = selectSubset;
|
|
64
|
+
resultType = `Prisma.BatchPayload`;
|
|
65
|
+
break;
|
|
66
|
+
case 'upsert':
|
|
67
|
+
argsType = selectSubset;
|
|
68
|
+
resultType = getPayload;
|
|
69
|
+
break;
|
|
70
|
+
case 'delete':
|
|
71
|
+
argsType = selectSubset;
|
|
72
|
+
resultType = getPayload;
|
|
73
|
+
break;
|
|
74
|
+
case 'deleteMany':
|
|
75
|
+
argsType = selectSubset;
|
|
76
|
+
resultType = `Prisma.BatchPayload`;
|
|
77
|
+
break;
|
|
78
|
+
case 'count':
|
|
79
|
+
argsType = `Prisma.Subset<T, ${genericBase}>`;
|
|
80
|
+
resultType = `'select' extends keyof T'
|
|
81
|
+
? T['select'] extends true
|
|
82
|
+
? number
|
|
83
|
+
: GetScalarType<T['select'], ${capModel}CountAggregateOutputType>
|
|
84
|
+
: number`;
|
|
85
|
+
break;
|
|
86
|
+
case 'aggregate':
|
|
87
|
+
argsType = `Prisma.Subset<T, ${genericBase}>`;
|
|
88
|
+
resultType = `Prisma.Get${capModel}AggregateType<T>`;
|
|
89
|
+
break;
|
|
90
|
+
case 'groupBy':
|
|
91
|
+
genericBase = `Prisma.${capModel}GroupByArgs,
|
|
92
|
+
HasSelectOrTake extends Prisma.Or<
|
|
93
|
+
Prisma.Extends<'skip', Prisma.Keys<T>>,
|
|
94
|
+
Prisma.Extends<'take', Prisma.Keys<T>>
|
|
95
|
+
>,
|
|
96
|
+
OrderByArg extends Prisma.True extends HasSelectOrTake
|
|
97
|
+
? { orderBy: Prisma.${capModel}GroupByArgs['orderBy'] }
|
|
98
|
+
: { orderBy?: Prisma.${capModel}GroupByArgs['orderBy'] },
|
|
99
|
+
OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>,
|
|
100
|
+
ByFields extends Prisma.MaybeTupleToUnion<T['by']>,
|
|
101
|
+
ByValid extends Prisma.Has<ByFields, OrderFields>,
|
|
102
|
+
HavingFields extends Prisma.GetHavingFields<T['having']>,
|
|
103
|
+
HavingValid extends Prisma.Has<ByFields, HavingFields>,
|
|
104
|
+
ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False,
|
|
105
|
+
InputErrors extends ByEmpty extends Prisma.True
|
|
106
|
+
? \`Error: "by" must not be empty.\`
|
|
107
|
+
: HavingValid extends Prisma.False
|
|
108
|
+
? {
|
|
109
|
+
[P in HavingFields]: P extends ByFields
|
|
110
|
+
? never
|
|
111
|
+
: P extends string
|
|
112
|
+
? \`Error: Field "\${P}" used in "having" needs to be provided in "by".\`
|
|
113
|
+
: [
|
|
114
|
+
Error,
|
|
115
|
+
'Field ',
|
|
116
|
+
P,
|
|
117
|
+
\` in "having" needs to be provided in "by"\`,
|
|
118
|
+
]
|
|
119
|
+
}[HavingFields]
|
|
120
|
+
: 'take' extends Prisma.Keys<T>
|
|
121
|
+
? 'orderBy' extends Prisma.Keys<T>
|
|
122
|
+
? ByValid extends Prisma.True
|
|
123
|
+
? {}
|
|
124
|
+
: {
|
|
125
|
+
[P in OrderFields]: P extends ByFields
|
|
126
|
+
? never
|
|
127
|
+
: \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
|
|
128
|
+
}[OrderFields]
|
|
129
|
+
: 'Error: If you provide "take", you also need to provide "orderBy"'
|
|
130
|
+
: 'skip' extends Prisma.Keys<T>
|
|
131
|
+
? 'orderBy' extends Prisma.Keys<T>
|
|
132
|
+
? ByValid extends Prisma.True
|
|
133
|
+
? {}
|
|
134
|
+
: {
|
|
135
|
+
[P in OrderFields]: P extends ByFields
|
|
136
|
+
? never
|
|
137
|
+
: \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
|
|
138
|
+
}[OrderFields]
|
|
139
|
+
: 'Error: If you provide "skip", you also need to provide "orderBy"'
|
|
140
|
+
: ByValid extends Prisma.True
|
|
141
|
+
? {}
|
|
142
|
+
: {
|
|
143
|
+
[P in OrderFields]: P extends ByFields
|
|
144
|
+
? never
|
|
145
|
+
: \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
|
|
146
|
+
}[OrderFields]
|
|
147
|
+
`;
|
|
148
|
+
argsType = `Prisma.SubsetIntersection<T, Prisma.${capModel}GroupByArgs, OrderByArg> & InputErrors`;
|
|
149
|
+
resultType = `{} extends InputErrors ? Prisma.Get${capModel}GroupByPayload<T> : InputErrors`;
|
|
150
|
+
break;
|
|
151
|
+
default:
|
|
152
|
+
throw new sdk_1.PluginError(_1.name, `Unsupported operation: "${operation}"`);
|
|
153
|
+
}
|
|
154
|
+
return { genericBase, argsType, resultType };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Generate precise Prisma-like typing for router procedures.
|
|
158
|
+
*/
|
|
159
|
+
function generateRouterTyping(writer, opType, modelName, baseOpType) {
|
|
160
|
+
const procType = (0, exports.getProcedureTypeByOpName)(baseOpType);
|
|
161
|
+
const { genericBase, argsType, resultType } = getPrismaOperationTypes(modelName, opType);
|
|
162
|
+
const errorType = `TRPCClientErrorLike<AppRouter>`;
|
|
163
|
+
writer.block(() => {
|
|
164
|
+
if (procType === 'query') {
|
|
165
|
+
writer.writeLine(`
|
|
166
|
+
useQuery: <T extends ${genericBase}>(
|
|
167
|
+
input: ${argsType},
|
|
168
|
+
opts?: UseTRPCQueryOptions<string, T, ${resultType}, ${resultType}, Error>
|
|
169
|
+
) => UseTRPCQueryResult<
|
|
170
|
+
${resultType},
|
|
171
|
+
${errorType}
|
|
172
|
+
>;
|
|
173
|
+
useInfiniteQuery: <T extends ${genericBase}>(
|
|
174
|
+
input: Omit<${argsType}, 'cursor'>,
|
|
175
|
+
opts?: UseTRPCInfiniteQueryOptions<string, T, ${resultType}, Error>
|
|
176
|
+
) => UseTRPCInfiniteQueryResult<
|
|
177
|
+
${resultType},
|
|
178
|
+
${errorType}
|
|
179
|
+
>;
|
|
180
|
+
`);
|
|
181
|
+
}
|
|
182
|
+
else if (procType === 'mutation') {
|
|
183
|
+
writer.writeLine(`
|
|
184
|
+
useMutation: <T extends ${genericBase}>(opts?: UseTRPCMutationOptions<
|
|
185
|
+
${genericBase},
|
|
186
|
+
${errorType},
|
|
187
|
+
Prisma.${(0, upper_case_first_1.upperCaseFirst)(modelName)}GetPayload<null>,
|
|
188
|
+
Context
|
|
189
|
+
>,) =>
|
|
190
|
+
Omit<UseTRPCMutationResult<${resultType}, ${errorType}, ${argsType}, Context>, 'mutateAsync'> & {
|
|
191
|
+
mutateAsync:
|
|
192
|
+
<T extends ${genericBase}>(variables: T, opts?: UseTRPCMutationOptions<T, ${errorType}, ${resultType}, Context>) => Promise<${resultType}>
|
|
193
|
+
};
|
|
194
|
+
`);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
exports.generateRouterTyping = generateRouterTyping;
|
|
199
|
+
function generateRouterTypingImports(sourceFile, model) {
|
|
200
|
+
const importingDir = sourceFile.getDirectoryPath();
|
|
201
|
+
const prismaImport = (0, sdk_1.getPrismaClientImportSpec)(model, importingDir);
|
|
202
|
+
sourceFile.addStatements([
|
|
203
|
+
`import type { Prisma } from '${prismaImport}';`,
|
|
204
|
+
`import type { UseTRPCMutationOptions, UseTRPCMutationResult, UseTRPCQueryOptions, UseTRPCQueryResult, UseTRPCInfiniteQueryOptions, UseTRPCInfiniteQueryResult } from '@trpc/react-query/shared';`,
|
|
205
|
+
`import type { TRPCClientErrorLike } from '@trpc/client';`,
|
|
206
|
+
`import type { AnyRouter } from '@trpc/server';`,
|
|
207
|
+
]);
|
|
208
|
+
}
|
|
209
|
+
exports.generateRouterTypingImports = generateRouterTypingImports;
|
|
210
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
211
|
+
function generateRouterSchemaImports(sourceFile, name, zodSchemasImport) {
|
|
212
|
+
sourceFile.addStatements(`import { ${name}InputSchema } from '${zodSchemasImport}/input';`);
|
|
22
213
|
}
|
|
23
214
|
exports.generateRouterSchemaImports = generateRouterSchemaImports;
|
|
24
215
|
function generateHelperImport(sourceFile) {
|
|
25
216
|
sourceFile.addStatements(`import { checkRead, checkMutate } from '../helper';`);
|
|
26
217
|
}
|
|
27
218
|
exports.generateHelperImport = generateHelperImport;
|
|
28
|
-
const
|
|
219
|
+
const getInputSchemaByOpName = (opName, modelName) => {
|
|
29
220
|
let inputType;
|
|
30
221
|
switch (opName) {
|
|
31
222
|
case 'findUnique':
|
|
32
|
-
inputType = `${modelName}
|
|
223
|
+
inputType = `${modelName}InputSchema.findUnique`;
|
|
33
224
|
break;
|
|
34
225
|
case 'findFirst':
|
|
35
|
-
inputType = `${modelName}
|
|
226
|
+
inputType = `${modelName}InputSchema.findFirst`;
|
|
36
227
|
break;
|
|
37
228
|
case 'findMany':
|
|
38
|
-
inputType = `${modelName}
|
|
229
|
+
inputType = `${modelName}InputSchema.findMany`;
|
|
39
230
|
break;
|
|
40
231
|
case 'findRaw':
|
|
41
|
-
inputType = `${modelName}
|
|
232
|
+
inputType = `${modelName}InputSchema.findRawObject`;
|
|
42
233
|
break;
|
|
43
234
|
case 'createOne':
|
|
44
|
-
inputType = `${modelName}
|
|
235
|
+
inputType = `${modelName}InputSchema.create`;
|
|
45
236
|
break;
|
|
46
237
|
case 'createMany':
|
|
47
|
-
inputType = `${modelName}
|
|
238
|
+
inputType = `${modelName}InputSchema.createMany`;
|
|
48
239
|
break;
|
|
49
240
|
case 'deleteOne':
|
|
50
|
-
inputType = `${modelName}
|
|
241
|
+
inputType = `${modelName}InputSchema.delete`;
|
|
51
242
|
break;
|
|
52
243
|
case 'updateOne':
|
|
53
|
-
inputType = `${modelName}
|
|
244
|
+
inputType = `${modelName}InputSchema.update`;
|
|
54
245
|
break;
|
|
55
246
|
case 'deleteMany':
|
|
56
|
-
inputType = `${modelName}
|
|
247
|
+
inputType = `${modelName}InputSchema.deleteMany`;
|
|
57
248
|
break;
|
|
58
249
|
case 'updateMany':
|
|
59
|
-
inputType = `${modelName}
|
|
250
|
+
inputType = `${modelName}InputSchema.updateMany`;
|
|
60
251
|
break;
|
|
61
252
|
case 'upsertOne':
|
|
62
|
-
inputType = `${modelName}
|
|
253
|
+
inputType = `${modelName}InputSchema.upsert`;
|
|
63
254
|
break;
|
|
64
255
|
case 'aggregate':
|
|
65
|
-
inputType = `${modelName}
|
|
256
|
+
inputType = `${modelName}InputSchema.aggregate`;
|
|
66
257
|
break;
|
|
67
258
|
case 'aggregateRaw':
|
|
68
|
-
inputType = `${modelName}
|
|
259
|
+
inputType = `${modelName}InputSchema.aggregateRawObject`;
|
|
69
260
|
break;
|
|
70
261
|
case 'groupBy':
|
|
71
|
-
inputType = `${modelName}
|
|
262
|
+
inputType = `${modelName}InputSchema.groupBy`;
|
|
72
263
|
break;
|
|
73
264
|
default:
|
|
74
265
|
console.log('getInputTypeByOpName: ', { opName, modelName });
|
|
75
266
|
}
|
|
76
267
|
return inputType;
|
|
77
268
|
};
|
|
78
|
-
exports.
|
|
269
|
+
exports.getInputSchemaByOpName = getInputSchemaByOpName;
|
|
79
270
|
const getProcedureTypeByOpName = (opName) => {
|
|
80
271
|
let procType;
|
|
81
272
|
switch (opName) {
|