@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 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
- let generateModelActions = undefined;
42
- if (options.generateModelActions) {
43
- if (typeof options.generateModelActions === 'string') {
44
- // comma separated string
45
- generateModelActions = options.generateModelActions
46
- .split(',')
47
- .filter((i) => !!i)
48
- .map((i) => i.trim());
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
- createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions);
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 appRouter = project_1.project.createSourceFile(path_1.default.resolve(outDir, 'routers', `index.ts`), undefined, {
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: '@prisma/client',
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 createFunction = appRouter.addFunction({
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
- createFunction.setBodyText((writer) => {
120
+ })
121
+ .setBodyText((writer) => {
124
122
  writer.write('return router(');
125
123
  writer.block(() => {
126
- for (const modelOperation of modelOperations) {
124
+ for (const modelOperation of filteredModelOperations) {
127
125
  const { model } = modelOperation, operations = __rest(modelOperation, ["model"]);
128
- if (hiddenModels.includes(model)) {
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 generateModelCreateRouter(project, model, operations, outputDir, generateModelActions) {
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
- modelRouter
157
- .addFunction({
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
- .setBodyText((writer) => {
167
- writer.write('return router(');
168
- writer.block(() => {
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.getInputTypeByOpName)(baseOpType, model);
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)(writer, generateOpName, inputType, model, baseOpType);
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
- writer.write(');');
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":"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"}
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
- export declare function generateRouterSchemaImports(sourceFile: SourceFile, name: string): void;
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 getInputTypeByOpName: (opName: string, modelName: string) => string | undefined;
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.getInputTypeByOpName = exports.generateHelperImport = exports.generateRouterSchemaImports = exports.generateProcedure = void 0;
4
- const uncapitalizeFirstLetter_1 = require("./utils/uncapitalizeFirstLetter");
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, uncapitalizeFirstLetter_1.uncapitalizeFirstLetter)(modelName)}.${prismaMethod}(input))),
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, uncapitalizeFirstLetter_1.uncapitalizeFirstLetter)(modelName)}.${prismaMethod}(input))),
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
- function generateRouterSchemaImports(sourceFile, name) {
21
- sourceFile.addStatements(`import { ${name}Schema } from '../schemas/${name}.schema';`);
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 getInputTypeByOpName = (opName, modelName) => {
219
+ const getInputSchemaByOpName = (opName, modelName) => {
29
220
  let inputType;
30
221
  switch (opName) {
31
222
  case 'findUnique':
32
- inputType = `${modelName}Schema.findUnique`;
223
+ inputType = `${modelName}InputSchema.findUnique`;
33
224
  break;
34
225
  case 'findFirst':
35
- inputType = `${modelName}Schema.findFirst`;
226
+ inputType = `${modelName}InputSchema.findFirst`;
36
227
  break;
37
228
  case 'findMany':
38
- inputType = `${modelName}Schema.findMany`;
229
+ inputType = `${modelName}InputSchema.findMany`;
39
230
  break;
40
231
  case 'findRaw':
41
- inputType = `${modelName}Schema.findRawObject`;
232
+ inputType = `${modelName}InputSchema.findRawObject`;
42
233
  break;
43
234
  case 'createOne':
44
- inputType = `${modelName}Schema.create`;
235
+ inputType = `${modelName}InputSchema.create`;
45
236
  break;
46
237
  case 'createMany':
47
- inputType = `${modelName}Schema.createMany`;
238
+ inputType = `${modelName}InputSchema.createMany`;
48
239
  break;
49
240
  case 'deleteOne':
50
- inputType = `${modelName}Schema.delete`;
241
+ inputType = `${modelName}InputSchema.delete`;
51
242
  break;
52
243
  case 'updateOne':
53
- inputType = `${modelName}Schema.update`;
244
+ inputType = `${modelName}InputSchema.update`;
54
245
  break;
55
246
  case 'deleteMany':
56
- inputType = `${modelName}Schema.deleteMany`;
247
+ inputType = `${modelName}InputSchema.deleteMany`;
57
248
  break;
58
249
  case 'updateMany':
59
- inputType = `${modelName}Schema.updateMany`;
250
+ inputType = `${modelName}InputSchema.updateMany`;
60
251
  break;
61
252
  case 'upsertOne':
62
- inputType = `${modelName}Schema.upsert`;
253
+ inputType = `${modelName}InputSchema.upsert`;
63
254
  break;
64
255
  case 'aggregate':
65
- inputType = `${modelName}Schema.aggregate`;
256
+ inputType = `${modelName}InputSchema.aggregate`;
66
257
  break;
67
258
  case 'aggregateRaw':
68
- inputType = `${modelName}Schema.aggregateRawObject`;
259
+ inputType = `${modelName}InputSchema.aggregateRawObject`;
69
260
  break;
70
261
  case 'groupBy':
71
- inputType = `${modelName}Schema.groupBy`;
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.getInputTypeByOpName = getInputTypeByOpName;
269
+ exports.getInputSchemaByOpName = getInputSchemaByOpName;
79
270
  const getProcedureTypeByOpName = (opName) => {
80
271
  let procType;
81
272
  switch (opName) {