@zenstackhq/trpc 1.0.0-beta.2 → 1.0.0-beta.20
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 +127 -45
- 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 +11 -7
- package/res/client/next.ts +17 -0
- package/res/client/react.ts +17 -0
- package/res/client/utils.ts +32 -0
- 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 -92
- 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 -446
- 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,56 +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 fs_1 = require("fs");
|
|
28
|
+
const fs_1 = __importDefault(require("fs"));
|
|
29
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");
|
|
31
33
|
const _1 = require(".");
|
|
32
34
|
const helpers_1 = require("./helpers");
|
|
33
35
|
const project_1 = require("./project");
|
|
34
36
|
const removeDir_1 = __importDefault(require("./utils/removeDir"));
|
|
35
|
-
const generator_1 = require("./zod/generator");
|
|
36
37
|
function generate(model, options, dmmf) {
|
|
38
|
+
var _a;
|
|
37
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
38
40
|
let outDir = (0, sdk_1.requireOption)(options, 'output');
|
|
39
41
|
outDir = (0, sdk_1.resolvePath)(outDir, options);
|
|
40
42
|
// resolve "generateModelActions" option
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
else if (Array.isArray(options.generateModelActions) &&
|
|
51
|
-
options.generateModelActions.every((i) => typeof i === 'string')) {
|
|
52
|
-
// string array
|
|
53
|
-
generateModelActions = options.generateModelActions;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
throw new sdk_1.PluginError(_1.name, `Invalid "generateModelActions" option: must be a comma-separated string or an array of strings`);
|
|
57
|
-
}
|
|
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"`);
|
|
48
|
+
}
|
|
49
|
+
if (options.zodSchemasImport && typeof options.zodSchemasImport !== 'string') {
|
|
50
|
+
throw new sdk_1.PluginError(_1.name, `Option "zodSchemasImport" must be a string`);
|
|
58
51
|
}
|
|
59
|
-
yield fs_1.promises.mkdir(outDir, { recursive: true });
|
|
52
|
+
yield fs_1.default.promises.mkdir(outDir, { recursive: true });
|
|
60
53
|
yield (0, removeDir_1.default)(outDir, true);
|
|
61
|
-
yield (0, generator_1.generate)(model, options, dmmf);
|
|
62
54
|
const prismaClientDmmf = dmmf;
|
|
63
55
|
const modelOperations = prismaClientDmmf.mappings.modelOperations;
|
|
64
56
|
const models = prismaClientDmmf.datamodel.models;
|
|
65
57
|
const hiddenModels = [];
|
|
66
58
|
(0, helpers_1.resolveModelsComments)(models, hiddenModels);
|
|
67
|
-
|
|
59
|
+
const zodSchemasImport = (_a = options.zodSchemasImport) !== null && _a !== void 0 ? _a : '@zenstackhq/runtime/zod';
|
|
60
|
+
createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions, generateClientHelpers, model, zodSchemasImport);
|
|
68
61
|
createHelper(outDir);
|
|
69
62
|
yield (0, sdk_1.saveProject)(project_1.project);
|
|
70
63
|
});
|
|
71
64
|
}
|
|
72
65
|
exports.generate = generate;
|
|
73
|
-
function createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions) {
|
|
74
|
-
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, {
|
|
75
69
|
overwrite: true,
|
|
76
70
|
});
|
|
77
71
|
appRouter.addStatements('/* eslint-disable */');
|
|
72
|
+
const prismaImport = (0, sdk_1.getPrismaClientImportSpec)(zmodel, path_1.default.dirname(indexFile));
|
|
78
73
|
appRouter.addImportDeclarations([
|
|
79
74
|
{
|
|
80
75
|
namedImports: ['AnyRootConfig'],
|
|
@@ -82,10 +77,11 @@ function createAppRouter(outDir, modelOperations, hiddenModels, generateModelAct
|
|
|
82
77
|
},
|
|
83
78
|
{
|
|
84
79
|
namedImports: ['PrismaClient'],
|
|
85
|
-
moduleSpecifier:
|
|
80
|
+
moduleSpecifier: prismaImport,
|
|
81
|
+
isTypeOnly: true,
|
|
86
82
|
},
|
|
87
83
|
{
|
|
88
|
-
namedImports: ['createRouterFactory'],
|
|
84
|
+
namedImports: ['createRouterFactory', 'AnyRouter'],
|
|
89
85
|
moduleSpecifier: '@trpc/server/dist/core/router',
|
|
90
86
|
},
|
|
91
87
|
{
|
|
@@ -112,23 +108,22 @@ function createAppRouter(outDir, modelOperations, hiddenModels, generateModelAct
|
|
|
112
108
|
}
|
|
113
109
|
|
|
114
110
|
`);
|
|
115
|
-
const
|
|
111
|
+
const filteredModelOperations = modelOperations.filter((mo) => !hiddenModels.includes(mo.model));
|
|
112
|
+
appRouter
|
|
113
|
+
.addFunction({
|
|
116
114
|
name: 'createRouter<Config extends BaseConfig>',
|
|
117
115
|
parameters: [
|
|
118
116
|
{ name: 'router', type: 'RouterFactory<Config>' },
|
|
119
117
|
{ name: 'procedure', type: 'ProcBuilder<Config>' },
|
|
120
118
|
],
|
|
121
119
|
isExported: true,
|
|
122
|
-
})
|
|
123
|
-
|
|
120
|
+
})
|
|
121
|
+
.setBodyText((writer) => {
|
|
124
122
|
writer.write('return router(');
|
|
125
123
|
writer.block(() => {
|
|
126
|
-
for (const modelOperation of
|
|
124
|
+
for (const modelOperation of filteredModelOperations) {
|
|
127
125
|
const { model } = modelOperation, operations = __rest(modelOperation, ["model"]);
|
|
128
|
-
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
generateModelCreateRouter(project_1.project, model, operations, outDir, generateModelActions);
|
|
126
|
+
generateModelCreateRouter(project_1.project, model, operations, outDir, generateModelActions, generateClientHelpers, zmodel, zodSchemasImport);
|
|
132
127
|
appRouter.addImportDeclaration({
|
|
133
128
|
defaultImport: `create${model}Router`,
|
|
134
129
|
moduleSpecifier: `./${model}.router`,
|
|
@@ -138,9 +133,49 @@ function createAppRouter(outDir, modelOperations, hiddenModels, generateModelAct
|
|
|
138
133
|
});
|
|
139
134
|
writer.write(');');
|
|
140
135
|
});
|
|
136
|
+
if (generateClientHelpers) {
|
|
137
|
+
appRouter.addInterface({
|
|
138
|
+
name: 'ClientType',
|
|
139
|
+
typeParameters: ['AppRouter extends AnyRouter'],
|
|
140
|
+
isExported: true,
|
|
141
|
+
properties: filteredModelOperations.map(({ model }) => {
|
|
142
|
+
appRouter.addImportDeclaration({
|
|
143
|
+
namedImports: [{ name: 'ClientType', alias: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType` }],
|
|
144
|
+
moduleSpecifier: `./${model}.router`,
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
name: (0, lower_case_first_1.lowerCaseFirst)(model),
|
|
148
|
+
type: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType<AppRouter>`,
|
|
149
|
+
};
|
|
150
|
+
}),
|
|
151
|
+
});
|
|
152
|
+
createClientHelpers(outDir, generateClientHelpers);
|
|
153
|
+
}
|
|
141
154
|
appRouter.formatText();
|
|
142
155
|
}
|
|
143
|
-
function
|
|
156
|
+
function createClientHelpers(outputDir, generateClientHelpers) {
|
|
157
|
+
const utils = project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', `utils.ts`), undefined, {
|
|
158
|
+
overwrite: true,
|
|
159
|
+
});
|
|
160
|
+
utils.replaceWithText(fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/utils.ts'), 'utf-8'));
|
|
161
|
+
for (const client of generateClientHelpers) {
|
|
162
|
+
switch (client) {
|
|
163
|
+
case 'react': {
|
|
164
|
+
const content = fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/react.ts'), 'utf-8');
|
|
165
|
+
project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'react.ts'), content, {
|
|
166
|
+
overwrite: true,
|
|
167
|
+
});
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'next': {
|
|
171
|
+
const content = fs_1.default.readFileSync(path_1.default.join(__dirname, './res/client/next.ts'), 'utf-8');
|
|
172
|
+
project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'next.ts'), content, { overwrite: true });
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function generateModelCreateRouter(project, model, operations, outputDir, generateModelActions, generateClientHelpers, zmodel, zodSchemasImport) {
|
|
144
179
|
const modelRouter = project.createSourceFile(path_1.default.resolve(outputDir, 'routers', `${model}.router.ts`), undefined, {
|
|
145
180
|
overwrite: true,
|
|
146
181
|
});
|
|
@@ -151,10 +186,12 @@ function generateModelCreateRouter(project, model, operations, outputDir, genera
|
|
|
151
186
|
moduleSpecifier: '.',
|
|
152
187
|
},
|
|
153
188
|
]);
|
|
154
|
-
(0, helpers_1.generateRouterSchemaImports)(modelRouter, model);
|
|
189
|
+
(0, helpers_1.generateRouterSchemaImports)(modelRouter, (0, upper_case_first_1.upperCaseFirst)(model), zodSchemasImport);
|
|
155
190
|
(0, helpers_1.generateHelperImport)(modelRouter);
|
|
156
|
-
|
|
157
|
-
.
|
|
191
|
+
if (generateClientHelpers) {
|
|
192
|
+
(0, helpers_1.generateRouterTypingImports)(modelRouter, zmodel);
|
|
193
|
+
}
|
|
194
|
+
const createRouterFunc = modelRouter.addFunction({
|
|
158
195
|
name: 'createRouter<Config extends BaseConfig>',
|
|
159
196
|
parameters: [
|
|
160
197
|
{ name: 'router', type: 'RouterFactory<Config>' },
|
|
@@ -162,23 +199,48 @@ function generateModelCreateRouter(project, model, operations, outputDir, genera
|
|
|
162
199
|
],
|
|
163
200
|
isExported: true,
|
|
164
201
|
isDefaultExport: true,
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
202
|
+
});
|
|
203
|
+
let routerTypingStructure = undefined;
|
|
204
|
+
if (generateClientHelpers) {
|
|
205
|
+
// generate an interface for precise Prisma-like typing for the router procedures
|
|
206
|
+
// which will be used to correct tRPC's typing on the client side
|
|
207
|
+
routerTypingStructure = {
|
|
208
|
+
kind: ts_morph_1.StructureKind.Interface,
|
|
209
|
+
name: 'ClientType',
|
|
210
|
+
isExported: true,
|
|
211
|
+
typeParameters: ['AppRouter extends AnyRouter', `Context = AppRouter['_def']['_config']['$types']['ctx']`],
|
|
212
|
+
properties: [],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
createRouterFunc.setBodyText((funcWriter) => {
|
|
216
|
+
funcWriter.write('return router(');
|
|
217
|
+
funcWriter.block(() => {
|
|
218
|
+
var _a;
|
|
169
219
|
for (const [opType, opNameWithModel] of Object.entries(operations)) {
|
|
170
220
|
const baseOpType = opType.replace('OrThrow', '');
|
|
171
|
-
const inputType = (0, helpers_1.
|
|
221
|
+
const inputType = (0, helpers_1.getInputSchemaByOpName)(baseOpType, model);
|
|
172
222
|
const generateOpName = opType.replace(/One$/, '');
|
|
173
223
|
if (opNameWithModel &&
|
|
174
224
|
inputType &&
|
|
175
225
|
(!generateModelActions || generateModelActions.includes(generateOpName))) {
|
|
176
|
-
(0, helpers_1.generateProcedure)(
|
|
226
|
+
(0, helpers_1.generateProcedure)(funcWriter, generateOpName, (0, upper_case_first_1.upperCaseFirst)(inputType), model, baseOpType);
|
|
227
|
+
if (routerTypingStructure) {
|
|
228
|
+
(_a = routerTypingStructure.properties) === null || _a === void 0 ? void 0 : _a.push({
|
|
229
|
+
kind: ts_morph_1.StructureKind.PropertySignature,
|
|
230
|
+
name: generateOpName,
|
|
231
|
+
type: (writer) => {
|
|
232
|
+
(0, helpers_1.generateRouterTyping)(writer, generateOpName, model, baseOpType);
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
177
236
|
}
|
|
178
237
|
}
|
|
179
238
|
});
|
|
180
|
-
|
|
239
|
+
funcWriter.write(');');
|
|
181
240
|
});
|
|
241
|
+
if (routerTypingStructure) {
|
|
242
|
+
modelRouter.addInterface(routerTypingStructure);
|
|
243
|
+
}
|
|
182
244
|
modelRouter.formatText();
|
|
183
245
|
}
|
|
184
246
|
function createHelper(outDir) {
|
|
@@ -276,4 +338,24 @@ function createHelper(outDir) {
|
|
|
276
338
|
`);
|
|
277
339
|
checkRead.formatText();
|
|
278
340
|
}
|
|
341
|
+
function parseOptionAsStrings(options, optionaName) {
|
|
342
|
+
const value = options[optionaName];
|
|
343
|
+
if (value === undefined) {
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
else if (typeof value === 'string') {
|
|
347
|
+
// comma separated string
|
|
348
|
+
return value
|
|
349
|
+
.split(',')
|
|
350
|
+
.filter((i) => !!i)
|
|
351
|
+
.map((i) => i.trim());
|
|
352
|
+
}
|
|
353
|
+
else if (Array.isArray(value) && value.every((i) => typeof i === 'string')) {
|
|
354
|
+
// string array
|
|
355
|
+
return value;
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
throw new sdk_1.PluginError(_1.name, `Invalid "${optionaName}" option: must be a comma-separated string or an array of strings`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
279
361
|
//# 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) {
|