@zenstackhq/trpc 2.6.2 → 2.7.1

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.
@@ -0,0 +1,17 @@
1
+ import { type PluginOptions } from '@zenstackhq/sdk';
2
+ import { Project } from 'ts-morph';
3
+ import { SupportedClientHelpers } from '../utils';
4
+ export declare function generateClientTypingForModel(project: Project, generateClientHelpers: SupportedClientHelpers[], model: string, options: PluginOptions, generateOperations: Array<{
5
+ name: string;
6
+ baseType: string;
7
+ }>, version: string, outDir: string): void;
8
+ export declare function createClientHelperEntries(project: Project, outputDir: string, generateClientHelpers: SupportedClientHelpers[], models: string[], version: string): void;
9
+ /**
10
+ * Given a model and Prisma operation, returns related TS types.
11
+ */
12
+ export declare function getPrismaOperationTypes(model: string, operation: string): {
13
+ genericBase: string;
14
+ argsType: string;
15
+ resultType: string;
16
+ argsOptional: boolean;
17
+ };
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.generateClientTypingForModel = generateClientTypingForModel;
30
+ exports.createClientHelperEntries = createClientHelperEntries;
31
+ exports.getPrismaOperationTypes = getPrismaOperationTypes;
32
+ const sdk_1 = require("@zenstackhq/sdk");
33
+ const prisma_1 = require("@zenstackhq/sdk/prisma");
34
+ const fs_1 = __importDefault(require("fs"));
35
+ const lower_case_first_1 = require("lower-case-first");
36
+ const path_1 = __importDefault(require("path"));
37
+ const ts_morph_1 = require("ts-morph");
38
+ const upper_case_first_1 = require("upper-case-first");
39
+ const __1 = require("..");
40
+ const NextHelpers = __importStar(require("./next"));
41
+ const NuxtHelpers = __importStar(require("./nuxt"));
42
+ const ReactHelpers = __importStar(require("./react"));
43
+ const helpers = {
44
+ react: ReactHelpers,
45
+ next: NextHelpers,
46
+ nuxt: NuxtHelpers,
47
+ };
48
+ function generateClientTypingForModel(project, generateClientHelpers, model, options, generateOperations, version, outDir) {
49
+ var _a;
50
+ for (const clientType of generateClientHelpers) {
51
+ const sf = project.createSourceFile(path_1.default.resolve(outDir, `client/${(0, upper_case_first_1.upperCaseFirst)(model)}.${clientType}.type.ts`), undefined, {
52
+ overwrite: true,
53
+ });
54
+ sf.addStatements([`/* eslint-disable */`]);
55
+ generateImports(clientType, sf, options, version);
56
+ // generate a `ClientType` interface that contains typing for query/mutation operations
57
+ const routerTypingStructure = {
58
+ kind: ts_morph_1.StructureKind.Interface,
59
+ name: 'ClientType',
60
+ isExported: true,
61
+ typeParameters: ['AppRouter extends AnyRouter', `Context = AppRouter['_def']['_config']['$types']['ctx']`],
62
+ properties: [],
63
+ };
64
+ for (const { name: generateOpName, baseType: baseOpType } of generateOperations) {
65
+ (_a = routerTypingStructure.properties) === null || _a === void 0 ? void 0 : _a.push({
66
+ kind: ts_morph_1.StructureKind.PropertySignature,
67
+ name: generateOpName,
68
+ type: (writer) => {
69
+ helpers[clientType].generateProcedureTyping(writer, generateOpName, model, baseOpType, version);
70
+ },
71
+ });
72
+ }
73
+ sf.addInterface(routerTypingStructure);
74
+ }
75
+ }
76
+ function generateImports(clientHelperType, sourceFile, options, version) {
77
+ const importingDir = sourceFile.getDirectoryPath();
78
+ const prismaImport = (0, prisma_1.getPrismaClientImportSpec)(importingDir, options);
79
+ sourceFile.addStatements([
80
+ `import type { Prisma } from '${prismaImport}';`,
81
+ `import type { TRPCClientErrorLike, TRPCRequestOptions } from '@trpc/client';`,
82
+ ]);
83
+ // generate framework-specific imports
84
+ helpers[clientHelperType].generateRouterTypingImports(sourceFile, version);
85
+ }
86
+ function createClientHelperEntries(project, outputDir, generateClientHelpers, models, version) {
87
+ // generate utils
88
+ const content = fs_1.default.readFileSync(path_1.default.join(__dirname, `../res/client/${version}/utils.ts`), 'utf-8');
89
+ project.createSourceFile(path_1.default.resolve(outputDir, 'client', `utils.ts`), content, {
90
+ overwrite: true,
91
+ });
92
+ for (const client of generateClientHelpers) {
93
+ createClientHelperEntryForType(project, client, models, version, outputDir);
94
+ }
95
+ }
96
+ function createClientHelperEntryForType(project, clientHelperType, models, version, outputDir) {
97
+ const content = fs_1.default.readFileSync(path_1.default.join(__dirname, `../res/client/${version}/${clientHelperType}.ts`), 'utf-8');
98
+ const sf = project.createSourceFile(path_1.default.resolve(outputDir, 'client', `${clientHelperType}.ts`), content, {
99
+ overwrite: true,
100
+ });
101
+ sf.addInterface({
102
+ name: 'ClientType',
103
+ typeParameters: ['AppRouter extends AnyRouter'],
104
+ isExported: true,
105
+ properties: models.map((model) => {
106
+ sf.addImportDeclaration({
107
+ namedImports: [{ name: 'ClientType', alias: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType` }],
108
+ moduleSpecifier: `./${(0, upper_case_first_1.upperCaseFirst)(model)}.${clientHelperType}.type`,
109
+ });
110
+ return {
111
+ name: (0, lower_case_first_1.lowerCaseFirst)(model),
112
+ type: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType<AppRouter>`,
113
+ };
114
+ }),
115
+ });
116
+ }
117
+ /**
118
+ * Given a model and Prisma operation, returns related TS types.
119
+ */
120
+ function getPrismaOperationTypes(model, operation) {
121
+ // TODO: find a way to derive from Prisma Client API's generic types
122
+ // instead of duplicating them
123
+ const capModel = (0, upper_case_first_1.upperCaseFirst)(model);
124
+ const capOperation = (0, upper_case_first_1.upperCaseFirst)(operation);
125
+ let genericBase = `Prisma.${capModel}${capOperation}Args`;
126
+ const getPayload = `Prisma.${capModel}GetPayload<T>`;
127
+ const selectSubset = `Prisma.SelectSubset<T, ${genericBase}>`;
128
+ let argsType;
129
+ let resultType;
130
+ const argsOptional = ['findMany', 'findFirst', 'findFirstOrThrow', 'createMany', 'deleteMany', 'count'].includes(operation);
131
+ switch (operation) {
132
+ case 'findUnique':
133
+ case 'findFirst':
134
+ argsType = selectSubset;
135
+ resultType = `${getPayload} | null`;
136
+ break;
137
+ case 'findUniqueOrThrow':
138
+ case 'findFirstOrThrow':
139
+ argsType = selectSubset;
140
+ resultType = getPayload;
141
+ break;
142
+ case 'findMany':
143
+ argsType = selectSubset;
144
+ resultType = `Array<${getPayload}>`;
145
+ break;
146
+ case 'create':
147
+ argsType = selectSubset;
148
+ resultType = getPayload;
149
+ break;
150
+ case 'createMany':
151
+ argsType = selectSubset;
152
+ resultType = `Prisma.BatchPayload`;
153
+ break;
154
+ case 'update':
155
+ argsType = selectSubset;
156
+ resultType = getPayload;
157
+ break;
158
+ case 'updateMany':
159
+ argsType = selectSubset;
160
+ resultType = `Prisma.BatchPayload`;
161
+ break;
162
+ case 'upsert':
163
+ argsType = selectSubset;
164
+ resultType = getPayload;
165
+ break;
166
+ case 'delete':
167
+ argsType = selectSubset;
168
+ resultType = getPayload;
169
+ break;
170
+ case 'deleteMany':
171
+ argsType = selectSubset;
172
+ resultType = `Prisma.BatchPayload`;
173
+ break;
174
+ case 'count':
175
+ argsType = `Prisma.Subset<T, ${genericBase}>`;
176
+ resultType = `'select' extends keyof T
177
+ ? T['select'] extends true
178
+ ? number
179
+ : Prisma.GetScalarType<T['select'], Prisma.${capModel}CountAggregateOutputType>
180
+ : number`;
181
+ break;
182
+ case 'aggregate':
183
+ argsType = `Prisma.Subset<T, ${genericBase}>`;
184
+ resultType = `Prisma.Get${capModel}AggregateType<T>`;
185
+ break;
186
+ case 'groupBy':
187
+ genericBase = `Prisma.${capModel}GroupByArgs,
188
+ HasSelectOrTake extends Prisma.Or<
189
+ Prisma.Extends<'skip', Prisma.Keys<T>>,
190
+ Prisma.Extends<'take', Prisma.Keys<T>>
191
+ >,
192
+ OrderByArg extends Prisma.True extends HasSelectOrTake
193
+ ? { orderBy: Prisma.${capModel}GroupByArgs['orderBy'] }
194
+ : { orderBy?: Prisma.${capModel}GroupByArgs['orderBy'] },
195
+ OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>,
196
+ ByFields extends Prisma.MaybeTupleToUnion<T['by']>,
197
+ ByValid extends Prisma.Has<ByFields, OrderFields>,
198
+ HavingFields extends Prisma.GetHavingFields<T['having']>,
199
+ HavingValid extends Prisma.Has<ByFields, HavingFields>,
200
+ ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False,
201
+ InputErrors extends ByEmpty extends Prisma.True
202
+ ? \`Error: "by" must not be empty.\`
203
+ : HavingValid extends Prisma.False
204
+ ? {
205
+ [P in HavingFields]: P extends ByFields
206
+ ? never
207
+ : P extends string
208
+ ? \`Error: Field "\${P}" used in "having" needs to be provided in "by".\`
209
+ : [
210
+ Error,
211
+ 'Field ',
212
+ P,
213
+ \` in "having" needs to be provided in "by"\`,
214
+ ]
215
+ }[HavingFields]
216
+ : 'take' extends Prisma.Keys<T>
217
+ ? 'orderBy' extends Prisma.Keys<T>
218
+ ? ByValid extends Prisma.True
219
+ ? {}
220
+ : {
221
+ [P in OrderFields]: P extends ByFields
222
+ ? never
223
+ : \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
224
+ }[OrderFields]
225
+ : 'Error: If you provide "take", you also need to provide "orderBy"'
226
+ : 'skip' extends Prisma.Keys<T>
227
+ ? 'orderBy' extends Prisma.Keys<T>
228
+ ? ByValid extends Prisma.True
229
+ ? {}
230
+ : {
231
+ [P in OrderFields]: P extends ByFields
232
+ ? never
233
+ : \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
234
+ }[OrderFields]
235
+ : 'Error: If you provide "skip", you also need to provide "orderBy"'
236
+ : ByValid extends Prisma.True
237
+ ? {}
238
+ : {
239
+ [P in OrderFields]: P extends ByFields
240
+ ? never
241
+ : \`Error: Field "\${P}" in "orderBy" needs to be provided in "by"\`
242
+ }[OrderFields]
243
+ `;
244
+ argsType = `Prisma.SubsetIntersection<T, Prisma.${capModel}GroupByArgs, OrderByArg> & InputErrors`;
245
+ resultType = `{} extends InputErrors ? Prisma.Get${capModel}GroupByPayload<T> : InputErrors`;
246
+ break;
247
+ default:
248
+ throw new sdk_1.PluginError(__1.name, `Unsupported operation: "${operation}"`);
249
+ }
250
+ return { genericBase, argsType, resultType, argsOptional };
251
+ }
252
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client-helper/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { CodeBlockWriter, SourceFile } from 'ts-morph';
2
+ export declare function generateRouterTypingImports(sourceFile: SourceFile, version: string): void;
3
+ export declare function generateProcedureTyping(writer: CodeBlockWriter, opType: string, modelName: string, baseOpType: string, version: string): void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRouterTypingImports = generateRouterTypingImports;
4
+ exports.generateProcedureTyping = generateProcedureTyping;
5
+ const react_1 = require("./react");
6
+ function generateRouterTypingImports(sourceFile, version) {
7
+ // next shares the same typing imports as react
8
+ (0, react_1.generateRouterTypingImports)(sourceFile, version);
9
+ }
10
+ function generateProcedureTyping(writer, opType, modelName, baseOpType, version) {
11
+ // next shares the same procedure typing as react
12
+ (0, react_1.generateProcedureTyping)(writer, opType, modelName, baseOpType, version);
13
+ }
14
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/client-helper/next.ts"],"names":[],"mappings":";;AAMA,kEAGC;AAED,0DASC;AAnBD,mCAGiB;AAEjB,SAAgB,2BAA2B,CAAC,UAAsB,EAAE,OAAe;IAC/E,+CAA+C;IAC/C,IAAA,mCAAmC,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,uBAAuB,CACnC,MAAuB,EACvB,MAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,OAAe;IAEf,iDAAiD;IACjD,IAAA,+BAA+B,EAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CodeBlockWriter, SourceFile } from 'ts-morph';
2
+ export declare function generateRouterTypingImports(sourceFile: SourceFile, version: string): void;
3
+ export declare function generateProcedureTyping(writer: CodeBlockWriter, opType: string, modelName: string, baseOpType: string, _version: string): void;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRouterTypingImports = generateRouterTypingImports;
4
+ exports.generateProcedureTyping = generateProcedureTyping;
5
+ const utils_1 = require("../utils");
6
+ const _1 = require(".");
7
+ function generateRouterTypingImports(sourceFile, version) {
8
+ sourceFile.addStatements([
9
+ `import type { MaybeRefOrGetter, UnwrapRef } from 'vue';`,
10
+ `import type { AsyncData, AsyncDataOptions } from 'nuxt/app';`,
11
+ `import type { KeysOf, PickFrom } from './utils';`,
12
+ ]);
13
+ if (version === 'v10') {
14
+ sourceFile.addStatements([`import type { AnyRouter } from '@trpc/server';`]);
15
+ }
16
+ else {
17
+ sourceFile.addStatements([`import type { AnyTRPCRouter as AnyRouter } from '@trpc/server';`]);
18
+ }
19
+ }
20
+ function generateProcedureTyping(writer, opType, modelName, baseOpType, _version) {
21
+ const procType = (0, utils_1.getProcedureTypeByOpName)(baseOpType);
22
+ const { genericBase, argsType, argsOptional, resultType } = (0, _1.getPrismaOperationTypes)(modelName, opType);
23
+ const errorType = `TRPCClientErrorLike<AppRouter>`;
24
+ const inputOptional = argsOptional ? '?' : '';
25
+ writer.block(() => {
26
+ if (procType === 'query') {
27
+ writer.writeLine(`
28
+ query: <T extends ${genericBase}>(input${inputOptional}: ${argsType}) => Promise<${resultType}>;
29
+ useQuery: <T extends ${genericBase}, ResT = ${resultType}, DataE = ${errorType}, DataT = ResT, PickKeys extends KeysOf<DataT> = KeysOf<DataT>, DefaultT = null>(input${inputOptional}: MaybeRefOrGetter<${argsType}>, opts?: Omit<AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>, 'watch'> & {
30
+ trpc?: TRPCRequestOptions;
31
+ queryKey?: string;
32
+ watch?: AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>['watch'] | false;
33
+ }) => AsyncData<PickFrom<DataT, PickKeys> | DefaultT, DataE>;
34
+ useLazyQuery: <T extends ${genericBase}, ResT = ${resultType}, DataE = ${errorType}, DataT = ResT, PickKeys extends KeysOf<DataT> = KeysOf<DataT>, DefaultT = null>(input${inputOptional}: MaybeRefOrGetter<${argsType}>, opts?: Omit<AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>, 'lazy' | 'watch'> & {
35
+ trpc?: TRPCRequestOptions;
36
+ queryKey?: string;
37
+ watch?: AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>['watch'] | false;
38
+ }) => AsyncData<PickFrom<DataT, PickKeys> | DefaultT, DataE>;
39
+ `);
40
+ }
41
+ else if (procType === 'mutation') {
42
+ writer.writeLine(`
43
+ mutate: <T extends ${genericBase}>(input${inputOptional}: ${argsType}) => Promise<${resultType}>;
44
+ useMutation: <T extends ${genericBase}, ResT = ${resultType}, DataE = ${errorType}, DataT = ResT, PickKeys extends KeysOf<DataT> = KeysOf<DataT>, DefaultT = null>(opts?: Omit<AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>, 'lazy'> & {
45
+ trpc?: TRPCRequestOptions;
46
+ }) => AsyncData<PickFrom<DataT, PickKeys> | DefaultT, DataE> & {
47
+ mutate: <T extends ${genericBase}, ResT = ${resultType}, DataE = ${errorType}, DataT = ResT, PickKeys extends KeysOf<DataT> = KeysOf<DataT>>(input${inputOptional}: ${argsType}) => Promise<UnwrapRef<AsyncData<PickFrom<DataT, PickKeys> | null, DataE>['data']>>;
48
+ };
49
+ `);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=nuxt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxt.js","sourceRoot":"","sources":["../../src/client-helper/nuxt.ts"],"names":[],"mappings":";;AAIA,kEAYC;AAED,0DAsCC;AAvDD,oCAAoD;AACpD,wBAA4C;AAE5C,SAAgB,2BAA2B,CAAC,UAAsB,EAAE,OAAe;IAC/E,UAAU,CAAC,aAAa,CAAC;QACrB,yDAAyD;QACzD,8DAA8D;QAC9D,kDAAkD;KACrD,CAAC,CAAC;IAEH,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACpB,UAAU,CAAC,aAAa,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACJ,UAAU,CAAC,aAAa,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC;IAClG,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB,CACnC,MAAuB,EACvB,MAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAA,gCAAwB,EAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAA,0BAAuB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,gCAAgC,CAAC;IACnD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QACd,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,CAAC,SAAS,CAAC;oCACO,WAAW,UAAU,aAAa,KAAK,QAAQ,gBAAgB,UAAU;uCACtE,WAAW,YAAY,UAAU,aAAa,SAAS,yFAAyF,aAAa,sBAAsB,QAAQ;;;;;2CAKvL,WAAW,YAAY,UAAU,aAAa,SAAS,yFAAyF,aAAa,sBAAsB,QAAQ;;;;;iBAKrN,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC;qCACQ,WAAW,UAAU,aAAa,KAAK,QAAQ,gBAAgB,UAAU;0CACpE,WAAW,YAAY,UAAU,aAAa,SAAS;;;yCAGxD,WAAW,YAAY,UAAU,aAAa,SAAS,wEAAwE,aAAa,KAAK,QAAQ;;iBAEjL,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CodeBlockWriter, SourceFile } from 'ts-morph';
2
+ export declare function generateRouterTypingImports(sourceFile: SourceFile, version: string): void;
3
+ export declare function generateProcedureTyping(writer: CodeBlockWriter, opType: string, modelName: string, baseOpType: string, version: string): void;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRouterTypingImports = generateRouterTypingImports;
4
+ exports.generateProcedureTyping = generateProcedureTyping;
5
+ const utils_1 = require("../utils");
6
+ const _1 = require(".");
7
+ function generateRouterTypingImports(sourceFile, version) {
8
+ sourceFile.addStatements([
9
+ `import type { UseTRPCMutationOptions, UseTRPCMutationResult, UseTRPCQueryOptions, UseTRPCQueryResult, UseTRPCInfiniteQueryOptions, UseTRPCInfiniteQueryResult } from '@trpc/react-query/shared';`,
10
+ ]);
11
+ if (version === 'v10') {
12
+ sourceFile.addStatements([`import type { AnyRouter } from '@trpc/server';`]);
13
+ }
14
+ else {
15
+ sourceFile.addStatements([
16
+ `import type { AnyTRPCRouter as AnyRouter } from '@trpc/server';`,
17
+ `import type { UseTRPCSuspenseQueryOptions, UseTRPCSuspenseQueryResult, UseTRPCSuspenseInfiniteQueryOptions, UseTRPCSuspenseInfiniteQueryResult } from '@trpc/react-query/shared';`,
18
+ ]);
19
+ }
20
+ }
21
+ function generateProcedureTyping(writer, opType, modelName, baseOpType, version) {
22
+ const procType = (0, utils_1.getProcedureTypeByOpName)(baseOpType);
23
+ const { genericBase, argsType, argsOptional, resultType } = (0, _1.getPrismaOperationTypes)(modelName, opType);
24
+ const errorType = `TRPCClientErrorLike<AppRouter>`;
25
+ const inputOptional = argsOptional ? '?' : '';
26
+ writer.block(() => {
27
+ if (procType === 'query') {
28
+ if (version === 'v10') {
29
+ writer.writeLine(`
30
+ useQuery: <T extends ${genericBase}, TData = ${resultType}>(
31
+ input${inputOptional}: ${argsType},
32
+ opts?: UseTRPCQueryOptions<string, T, ${resultType}, TData, Error>
33
+ ) => UseTRPCQueryResult<
34
+ TData,
35
+ ${errorType}
36
+ >;
37
+ useInfiniteQuery: <T extends ${genericBase}>(
38
+ input${inputOptional}: Omit<${argsType}, 'cursor'>,
39
+ opts?: UseTRPCInfiniteQueryOptions<string, T, ${resultType}, Error>
40
+ ) => UseTRPCInfiniteQueryResult<
41
+ ${resultType},
42
+ ${errorType}
43
+ >;
44
+ `);
45
+ }
46
+ else {
47
+ writer.writeLine(`
48
+ useQuery: <T extends ${genericBase}, TData = ${resultType}>(
49
+ input${inputOptional}: ${argsType},
50
+ opts?: UseTRPCQueryOptions<${resultType}, TData, Error>
51
+ ) => UseTRPCQueryResult<
52
+ TData,
53
+ ${errorType}
54
+ >;
55
+ useInfiniteQuery: <T extends ${genericBase}>(
56
+ input${inputOptional}: Omit<${argsType}, 'cursor'>,
57
+ opts?: UseTRPCInfiniteQueryOptions<T, ${resultType}, Error>
58
+ ) => UseTRPCInfiniteQueryResult<
59
+ ${resultType},
60
+ ${errorType},
61
+ T
62
+ >;
63
+ useSuspenseQuery: <T extends ${genericBase}, TData = ${resultType}>(
64
+ input${inputOptional}: ${argsType},
65
+ opts?: UseTRPCSuspenseQueryOptions<${resultType}, TData, Error>
66
+ ) => UseTRPCSuspenseQueryResult<TData, ${errorType}>;
67
+ useSuspenseInfiniteQuery: <T extends ${genericBase}>(
68
+ input${inputOptional}: Omit<${argsType}, 'cursor'>,
69
+ opts?: UseTRPCSuspenseInfiniteQueryOptions<T, ${resultType}, Error>
70
+ ) => UseTRPCSuspenseInfiniteQueryResult<${resultType}, ${errorType}, T>;
71
+ `);
72
+ }
73
+ }
74
+ else if (procType === 'mutation') {
75
+ writer.writeLine(`
76
+ useMutation: <T extends ${genericBase}>(opts?: UseTRPCMutationOptions<
77
+ ${genericBase},
78
+ ${errorType},
79
+ ${resultType},
80
+ Context
81
+ >) =>
82
+ Omit<UseTRPCMutationResult<${resultType}, ${errorType}, ${argsType}, Context>, 'mutateAsync'> & {
83
+ mutateAsync:
84
+ <T extends ${genericBase}>(variables${inputOptional}: T, opts?: UseTRPCMutationOptions<T, ${errorType}, ${resultType}, Context>) => Promise<${resultType}>
85
+ };
86
+ `);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/client-helper/react.ts"],"names":[],"mappings":";;AAIA,kEAYC;AAED,0DAyEC;AA1FD,oCAAoD;AACpD,wBAA4C;AAE5C,SAAgB,2BAA2B,CAAC,UAAsB,EAAE,OAAe;IAC/E,UAAU,CAAC,aAAa,CAAC;QACrB,kMAAkM;KACrM,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACpB,UAAU,CAAC,aAAa,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACJ,UAAU,CAAC,aAAa,CAAC;YACrB,iEAAiE;YACjE,mLAAmL;SACtL,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB,CACnC,MAAuB,EACvB,MAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAA,gCAAwB,EAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAA,0BAAuB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,gCAAgC,CAAC;IACnD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QACd,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,SAAS,CAAC;uCACM,WAAW,aAAa,UAAU;2BAC9C,aAAa,KAAK,QAAQ;4DACO,UAAU;;;0BAG5C,SAAS;;+CAEY,WAAW;2BAC/B,aAAa,UAAU,QAAQ;oEACU,UAAU;;0BAEpD,UAAU;0BACV,SAAS;;iBAElB,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,SAAS,CAAC;uCACM,WAAW,aAAa,UAAU;2BAC9C,aAAa,KAAK,QAAQ;iDACJ,UAAU;;;0BAGjC,SAAS;;+CAEY,WAAW;2BAC/B,aAAa,UAAU,QAAQ;4DACE,UAAU;;0BAE5C,UAAU;0BACV,SAAS;;;+CAGY,WAAW,aAAa,UAAU;2BACtD,aAAa,KAAK,QAAQ;yDACI,UAAU;6DACN,SAAS;uDACf,WAAW;2BACvC,aAAa,UAAU,QAAQ;oEACU,UAAU;8DAChB,UAAU,KAAK,SAAS;iBACrE,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC;0CACa,WAAW;sBAC/B,WAAW;sBACX,SAAS;sBACT,UAAU;;;6CAGa,UAAU,KAAK,SAAS,KAAK,QAAQ;;qCAE7C,WAAW,cAAc,aAAa,yCAAyC,SAAS,KAAK,UAAU,0BAA0B,UAAU;;iBAE/J,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
package/generator.js CHANGED
@@ -27,14 +27,13 @@ exports.generate = generate;
27
27
  const sdk_1 = require("@zenstackhq/sdk");
28
28
  const ast_1 = require("@zenstackhq/sdk/ast");
29
29
  const prisma_1 = require("@zenstackhq/sdk/prisma");
30
- const fs_1 = __importDefault(require("fs"));
31
30
  const lower_case_first_1 = require("lower-case-first");
32
31
  const path_1 = __importDefault(require("path"));
33
- const ts_morph_1 = require("ts-morph");
34
32
  const upper_case_first_1 = require("upper-case-first");
35
33
  const _1 = require(".");
36
- const helpers_1 = require("./helpers");
34
+ const client_helper_1 = require("./client-helper");
37
35
  const project_1 = require("./project");
36
+ const utils_1 = require("./utils");
38
37
  function generate(model, options, dmmf) {
39
38
  return __awaiter(this, void 0, void 0, function* () {
40
39
  var _a;
@@ -44,8 +43,9 @@ function generate(model, options, dmmf) {
44
43
  const generateModelActions = (0, sdk_1.parseOptionAsStrings)(options, 'generateModelActions', _1.name);
45
44
  // resolve "generateClientHelpers" option
46
45
  const generateClientHelpers = (0, sdk_1.parseOptionAsStrings)(options, 'generateClientHelpers', _1.name);
47
- if (generateClientHelpers && !generateClientHelpers.every((v) => ['react', 'next'].includes(v))) {
48
- throw new sdk_1.PluginError(_1.name, `Option "generateClientHelpers" only support values "react" and "next"`);
46
+ if (generateClientHelpers &&
47
+ !generateClientHelpers.every((v) => utils_1.AllSupportedClientHelpers.includes(v))) {
48
+ throw new sdk_1.PluginError(_1.name, `Option "generateClientHelpers" only supports the following values: ${utils_1.AllSupportedClientHelpers.map((n) => '"' + n + '"').join(', ')}.`);
49
49
  }
50
50
  if (options.zodSchemasImport && typeof options.zodSchemasImport !== 'string') {
51
51
  throw new sdk_1.PluginError(_1.name, `Option "zodSchemasImport" must be a string`);
@@ -76,7 +76,7 @@ function generate(model, options, dmmf) {
76
76
  // TODO: remove this legacy code that deals with "@Gen.hide" comment syntax inherited
77
77
  // from original code
78
78
  const hiddenModels = [];
79
- (0, helpers_1.resolveModelsComments)(prismaClientDmmf.datamodel.models, hiddenModels);
79
+ (0, utils_1.resolveModelsComments)(prismaClientDmmf.datamodel.models, hiddenModels);
80
80
  const zodSchemasImport = (_a = options.zodSchemasImport) !== null && _a !== void 0 ? _a : '@zenstackhq/runtime/zod';
81
81
  createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions, generateClientHelpers, model, zodSchemasImport, options, version);
82
82
  createHelper(outDir);
@@ -191,47 +191,10 @@ function createAppRouter(outDir, modelOperations, hiddenModels, generateModelAct
191
191
  writer.write(');');
192
192
  });
193
193
  if (generateClientHelpers) {
194
- appRouter.addInterface({
195
- name: 'ClientType',
196
- typeParameters: ['AppRouter extends AnyRouter'],
197
- isExported: true,
198
- properties: filteredModelOperations.map(({ model }) => {
199
- appRouter.addImportDeclaration({
200
- namedImports: [{ name: 'ClientType', alias: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType` }],
201
- moduleSpecifier: `./${model}.router`,
202
- });
203
- return {
204
- name: (0, lower_case_first_1.lowerCaseFirst)(model),
205
- type: `${(0, upper_case_first_1.upperCaseFirst)(model)}ClientType<AppRouter>`,
206
- };
207
- }),
208
- });
209
- createClientHelpers(outDir, generateClientHelpers, version);
194
+ (0, client_helper_1.createClientHelperEntries)(project_1.project, outDir, generateClientHelpers, filteredModelOperations.map(({ model }) => model), version);
210
195
  }
211
196
  appRouter.formatText();
212
197
  }
213
- function createClientHelpers(outputDir, generateClientHelpers, version) {
214
- const utils = project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', `utils.ts`), undefined, {
215
- overwrite: true,
216
- });
217
- utils.replaceWithText(fs_1.default.readFileSync(path_1.default.join(__dirname, `./res/client/${version}/utils.ts`), 'utf-8'));
218
- for (const client of generateClientHelpers) {
219
- switch (client) {
220
- case 'react': {
221
- const content = fs_1.default.readFileSync(path_1.default.join(__dirname, `./res/client/${version}/react.ts`), 'utf-8');
222
- project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'react.ts'), content, {
223
- overwrite: true,
224
- });
225
- break;
226
- }
227
- case 'next': {
228
- const content = fs_1.default.readFileSync(path_1.default.join(__dirname, `./res/client/${version}/next.ts`), 'utf-8');
229
- project_1.project.createSourceFile(path_1.default.resolve(outputDir, 'client', 'next.ts'), content, { overwrite: true });
230
- break;
231
- }
232
- }
233
- }
234
- }
235
198
  function generateModelCreateRouter(project, model, operations, outputDir, generateModelActions, generateClientHelpers, zodSchemasImport, options, zmodel, version) {
236
199
  const modelRouter = project.createSourceFile(path_1.default.resolve(outputDir, 'routers', `${model}.router.ts`), undefined, {
237
200
  overwrite: true,
@@ -266,13 +229,9 @@ function generateModelCreateRouter(project, model, operations, outputDir, genera
266
229
  ]);
267
230
  }
268
231
  // zod schema import
269
- (0, helpers_1.generateRouterSchemaImport)(modelRouter, zodSchemasImport);
232
+ (0, utils_1.generateRouterSchemaImport)(modelRouter, zodSchemasImport);
270
233
  // runtime helpers
271
- (0, helpers_1.generateHelperImport)(modelRouter);
272
- // client helper imports
273
- if (generateClientHelpers) {
274
- (0, helpers_1.generateRouterTypingImports)(modelRouter, options, version);
275
- }
234
+ (0, utils_1.generateHelperImport)(modelRouter);
276
235
  const createRouterFunc = version === 'v10'
277
236
  ? modelRouter.addFunction({
278
237
  name: 'createRouter<Config extends BaseConfig>',
@@ -288,33 +247,21 @@ function generateModelCreateRouter(project, model, operations, outputDir, genera
288
247
  isExported: true,
289
248
  isDefaultExport: true,
290
249
  });
291
- let routerTypingStructure = undefined;
292
- if (generateClientHelpers) {
293
- // generate an interface for precise Prisma-like typing for the router procedures
294
- // which will be used to correct tRPC's typing on the client side
295
- routerTypingStructure = {
296
- kind: ts_morph_1.StructureKind.Interface,
297
- name: 'ClientType',
298
- isExported: true,
299
- typeParameters: ['AppRouter extends AnyRouter', `Context = AppRouter['_def']['_config']['$types']['ctx']`],
300
- properties: [],
301
- };
302
- }
303
250
  const dataModel = zmodel.declarations.find((d) => (0, ast_1.isDataModel)(d) && d.name === model);
304
251
  if (!dataModel) {
305
252
  throw new Error(`Data model "${model}" not found`);
306
253
  }
254
+ const generateOperations = [];
307
255
  createRouterFunc.setBodyText((funcWriter) => {
308
256
  funcWriter.write(`return ${version === 'v10' ? 'router' : 'createTRPCRouter'}(`);
309
257
  funcWriter.block(() => {
310
- var _a;
311
258
  for (const [opType, opNameWithModel] of Object.entries(operations)) {
312
259
  if ((0, sdk_1.isDelegateModel)(dataModel) && (opType.startsWith('create') || opType.startsWith('upsert'))) {
313
260
  // delete models don't support create or upsert operations
314
261
  continue;
315
262
  }
316
263
  const baseOpType = opType.replace('OrThrow', '');
317
- const inputType = (0, helpers_1.getInputSchemaByOpName)(baseOpType, model);
264
+ const inputType = (0, utils_1.getInputSchemaByOpName)(baseOpType, model);
318
265
  const generateOpName = opType.replace(/One$/, '');
319
266
  if (opNameWithModel &&
320
267
  inputType &&
@@ -322,23 +269,15 @@ function generateModelCreateRouter(project, model, operations, outputDir, genera
322
269
  if (generateOpName === 'createMany' && !(0, prisma_1.supportCreateMany)(zmodel)) {
323
270
  continue;
324
271
  }
325
- (0, helpers_1.generateProcedure)(funcWriter, generateOpName, (0, upper_case_first_1.upperCaseFirst)(inputType), model, baseOpType);
326
- if (routerTypingStructure) {
327
- (_a = routerTypingStructure.properties) === null || _a === void 0 ? void 0 : _a.push({
328
- kind: ts_morph_1.StructureKind.PropertySignature,
329
- name: generateOpName,
330
- type: (writer) => {
331
- (0, helpers_1.generateRouterTyping)(writer, generateOpName, model, baseOpType, version);
332
- },
333
- });
334
- }
272
+ (0, utils_1.generateProcedure)(funcWriter, generateOpName, (0, upper_case_first_1.upperCaseFirst)(inputType), model, baseOpType);
273
+ generateOperations.push({ name: generateOpName, baseType: baseOpType });
335
274
  }
336
275
  }
337
276
  });
338
277
  funcWriter.write(');');
339
278
  });
340
- if (routerTypingStructure) {
341
- modelRouter.addInterface(routerTypingStructure);
279
+ if (generateClientHelpers) {
280
+ (0, client_helper_1.generateClientTypingForModel)(project, generateClientHelpers, model, options, generateOperations, version, outputDir);
342
281
  }
343
282
  modelRouter.formatText();
344
283
  }