prisma-generator-express 1.59.0 → 1.60.0
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/dist/client/encodeQueryParams.js +19 -23
- package/dist/client/encodeQueryParams.js.map +1 -1
- package/dist/copy/operationDefinitions.d.ts +37 -0
- package/dist/copy/operationDefinitions.js +412 -0
- package/dist/copy/operationDefinitions.js.map +1 -0
- package/dist/generators/generateFastifyHandler.js +10 -41
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.js +10 -41
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateModelMetadata.d.ts +8 -0
- package/dist/generators/generateModelMetadata.js +77 -0
- package/dist/generators/generateModelMetadata.js.map +1 -0
- package/dist/generators/generateOperationCore.js +20 -30
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateQueryBuilderHelper.js +1 -1
- package/dist/generators/generateQueryBuilderHelper.js.map +1 -1
- package/dist/generators/generateRouteConfigType.js +11 -57
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.js +64 -177
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.js +59 -169
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.js +52 -152
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.js +7 -30
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/generators/generateUnifiedScalarUI.js +9 -74
- package/dist/generators/generateUnifiedScalarUI.js.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.js +7 -0
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/writeFileSafely.js +5 -12
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +12 -2
- package/src/client/encodeQueryParams.ts +23 -36
- package/src/copy/autoIncludePlanner.ts +14 -23
- package/src/copy/autoIncludeRuntime.ts +117 -228
- package/src/copy/buildModelOpenApi.ts +248 -628
- package/src/copy/concurrency.ts +20 -0
- package/src/copy/docsRenderer.ts +63 -333
- package/src/copy/errorMapper.ts +126 -0
- package/src/copy/guardHelpers.ts +56 -0
- package/src/copy/materializedCount.ts +68 -0
- package/src/copy/materializedRouter.ts +33 -29
- package/src/copy/operationDefinitions.ts +359 -35
- package/src/copy/operationRuntime.ts +11 -605
- package/src/copy/pagination.ts +151 -0
- package/src/copy/scalarTypes.ts +2 -0
- package/src/copy/sse.ts +296 -0
- package/src/generators/generateFastifyHandler.ts +13 -47
- package/src/generators/generateHonoHandler.ts +13 -47
- package/src/generators/generateModelMetadata.ts +92 -0
- package/src/generators/generateOperationCore.ts +19 -32
- package/src/generators/generateQueryBuilderHelper.ts +1 -1
- package/src/generators/generateRouteConfigType.ts +9 -60
- package/src/generators/generateRouter.ts +88 -180
- package/src/generators/generateRouterFastify.ts +65 -172
- package/src/generators/generateRouterHono.ts +58 -155
- package/src/generators/generateUnifiedHandler.ts +8 -33
- package/src/generators/generateUnifiedScalarUI.ts +9 -91
- package/src/index.ts +13 -1
- package/src/utils/copyFiles.ts +7 -0
- package/src/utils/writeFileSafely.ts +5 -11
|
@@ -2,58 +2,27 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateHonoHandler = generateHonoHandler;
|
|
4
4
|
const importExt_1 = require("../utils/importExt");
|
|
5
|
-
const
|
|
6
|
-
delete: 'deleteUnique',
|
|
7
|
-
};
|
|
8
|
-
function coreFnName(op) {
|
|
9
|
-
return CORE_NAME_MAP[op] || op;
|
|
10
|
-
}
|
|
11
|
-
const READ_OPS = [
|
|
12
|
-
'findMany',
|
|
13
|
-
'findFirst',
|
|
14
|
-
'findFirstOrThrow',
|
|
15
|
-
'findUnique',
|
|
16
|
-
'findUniqueOrThrow',
|
|
17
|
-
'findManyPaginated',
|
|
18
|
-
'aggregate',
|
|
19
|
-
'count',
|
|
20
|
-
'groupBy',
|
|
21
|
-
];
|
|
22
|
-
const WRITE_OPS = [
|
|
23
|
-
'create',
|
|
24
|
-
'createMany',
|
|
25
|
-
'createManyAndReturn',
|
|
26
|
-
'update',
|
|
27
|
-
'updateMany',
|
|
28
|
-
'updateManyAndReturn',
|
|
29
|
-
'upsert',
|
|
30
|
-
'delete',
|
|
31
|
-
'deleteMany',
|
|
32
|
-
];
|
|
33
|
-
const CREATED_OPS = new Set([
|
|
34
|
-
'create',
|
|
35
|
-
'createMany',
|
|
36
|
-
'createManyAndReturn',
|
|
37
|
-
]);
|
|
5
|
+
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
38
6
|
function generateHonoHandler(options) {
|
|
39
7
|
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
40
8
|
const modelName = options.model.name;
|
|
41
|
-
const
|
|
42
|
-
|
|
9
|
+
const readOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'read');
|
|
10
|
+
const writeOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => (m.kind === 'write' || m.kind === 'batch') && m.name !== 'updateEach');
|
|
11
|
+
const readHandlers = readOps.map((meta) => {
|
|
12
|
+
const exportName = `${modelName}${meta.name.charAt(0).toUpperCase() + meta.name.slice(1)}`;
|
|
43
13
|
return `
|
|
44
14
|
export async function ${exportName}(c: HandlerContext): Promise<void> {
|
|
45
|
-
const data = await core.${
|
|
15
|
+
const data = await core.${meta.coreName}(buildContext(c))
|
|
46
16
|
c.set('resultData', data)
|
|
47
17
|
}`;
|
|
48
18
|
}).join('\n');
|
|
49
|
-
const writeHandlers =
|
|
50
|
-
const exportName = `${modelName}${
|
|
51
|
-
const statusCode = CREATED_OPS.has(op) ? 201 : 200;
|
|
19
|
+
const writeHandlers = writeOps.map((meta) => {
|
|
20
|
+
const exportName = `${modelName}${meta.name.charAt(0).toUpperCase() + meta.name.slice(1)}`;
|
|
52
21
|
return `
|
|
53
22
|
export async function ${exportName}(c: HandlerContext): Promise<void> {
|
|
54
|
-
const data = await core.${
|
|
23
|
+
const data = await core.${meta.coreName}(buildContext(c))
|
|
55
24
|
c.set('resultData', data)
|
|
56
|
-
c.set('resultStatus', ${
|
|
25
|
+
c.set('resultStatus', ${meta.successStatus})
|
|
57
26
|
}`;
|
|
58
27
|
}).join('\n');
|
|
59
28
|
const updateEachExportName = `${modelName}UpdateEach`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateHonoHandler.js","sourceRoot":"","sources":["../../src/generators/generateHonoHandler.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateHonoHandler.js","sourceRoot":"","sources":["../../src/generators/generateHonoHandler.ts"],"names":[],"mappings":";;AAKA,kDA8DC;AAjED,kDAA8C;AAC9C,uEAAiE;AAEjE,SAAgB,mBAAmB,CAAC,OAGnC;IACC,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;IAEpC,MAAM,OAAO,GAAG,yCAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAG,yCAAkB,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAC7E,CAAA;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,UAAU,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1F,OAAO;wBACa,UAAU;4BACN,IAAI,CAAC,QAAQ;;EAEvC,CAAA;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1F,OAAO;wBACa,UAAU;4BACN,IAAI,CAAC,QAAQ;;0BAEf,IAAI,CAAC,aAAa;EAC1C,CAAA;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,oBAAoB,GAAG,GAAG,SAAS,YAAY,CAAA;IACrD,MAAM,iBAAiB,GAAG;wBACJ,oBAAoB;;;;EAI1C,CAAA;IAEA,OAAO;2BACkB,SAAS,OAAO,GAAG;4DACc,GAAG;mEACI,GAAG;;;;;;;;;;;;;;;;EAgBpE,YAAY;EACZ,aAAa;EACb,iBAAiB;CAClB,CAAA;AACD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
2
|
+
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
+
export interface GenerateModelMetadataOptions {
|
|
4
|
+
model: DMMF.Model;
|
|
5
|
+
enums: DMMF.DatamodelEnum[];
|
|
6
|
+
importStyle: ImportStyle;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateModelMetadata(options: GenerateModelMetadataOptions): string;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateModelMetadata = generateModelMetadata;
|
|
4
|
+
const importExt_1 = require("../utils/importExt");
|
|
5
|
+
function exampleValueForType(fieldType) {
|
|
6
|
+
switch (fieldType) {
|
|
7
|
+
case 'String': return 'example';
|
|
8
|
+
case 'Int': return 1;
|
|
9
|
+
case 'BigInt': return '1';
|
|
10
|
+
case 'Float': return 1.0;
|
|
11
|
+
case 'Decimal': return '1.0';
|
|
12
|
+
case 'Boolean': return true;
|
|
13
|
+
case 'DateTime': return '2025-01-01T00:00:00.000Z';
|
|
14
|
+
case 'Json': return {};
|
|
15
|
+
case 'Bytes': return 'base64data';
|
|
16
|
+
default: return 'example';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function generateModelMetadata(options) {
|
|
20
|
+
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
21
|
+
const { model, enums } = options;
|
|
22
|
+
const modelName = model.name;
|
|
23
|
+
const fieldsMeta = model.fields.map((f) => ({
|
|
24
|
+
name: f.name,
|
|
25
|
+
kind: f.kind,
|
|
26
|
+
type: f.type,
|
|
27
|
+
isList: f.isList,
|
|
28
|
+
isRequired: f.isRequired,
|
|
29
|
+
hasDefaultValue: f.hasDefaultValue,
|
|
30
|
+
isUpdatedAt: Boolean(f.isUpdatedAt),
|
|
31
|
+
documentation: f.documentation ?? null,
|
|
32
|
+
isId: Boolean(f.isId),
|
|
33
|
+
isUnique: Boolean(f.isUnique),
|
|
34
|
+
relationFromFields: f.relationFromFields,
|
|
35
|
+
}));
|
|
36
|
+
const referencedEnumTypes = new Set(model.fields.filter((f) => f.kind === 'enum').map((f) => f.type));
|
|
37
|
+
const enumsMeta = enums
|
|
38
|
+
.filter((e) => referencedEnumTypes.has(e.name))
|
|
39
|
+
.map((e) => ({
|
|
40
|
+
name: e.name,
|
|
41
|
+
values: e.values.map((v) => ({ name: v.name })),
|
|
42
|
+
}));
|
|
43
|
+
const exampleValues = {};
|
|
44
|
+
for (const f of model.fields) {
|
|
45
|
+
if (f.isId || f.isUnique || f.kind === 'scalar' || f.kind === 'enum') {
|
|
46
|
+
if (f.kind === 'enum') {
|
|
47
|
+
const enumDef = enums.find((e) => e.name === f.type);
|
|
48
|
+
exampleValues[f.name] = enumDef?.values[0]?.name || 'VALUE';
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
exampleValues[f.name] = exampleValueForType(f.type);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const compoundId = model.primaryKey && model.primaryKey.fields.length > 1
|
|
56
|
+
? { fields: model.primaryKey.fields }
|
|
57
|
+
: null;
|
|
58
|
+
const compoundUniques = (model.uniqueIndexes || [])
|
|
59
|
+
.filter((idx) => idx.fields && idx.fields.length > 1)
|
|
60
|
+
.map((idx) => ({
|
|
61
|
+
name: idx.name || idx.fields.join('_'),
|
|
62
|
+
fields: idx.fields,
|
|
63
|
+
}));
|
|
64
|
+
return `import type { FieldMeta, EnumMeta } from '../docsRenderer${ext}'
|
|
65
|
+
|
|
66
|
+
export const MODEL_FIELDS: FieldMeta[] = ${JSON.stringify(fieldsMeta, null, 2)}
|
|
67
|
+
|
|
68
|
+
export const MODEL_ENUMS: EnumMeta[] = ${JSON.stringify(enumsMeta, null, 2)}
|
|
69
|
+
|
|
70
|
+
export const COMPOUND_ID: { fields: string[] } | null = ${JSON.stringify(compoundId)}
|
|
71
|
+
|
|
72
|
+
export const COMPOUND_UNIQUES: { name: string; fields: string[] }[] = ${JSON.stringify(compoundUniques)}
|
|
73
|
+
|
|
74
|
+
export const EXAMPLE_VALUES: Record<string, unknown> = ${JSON.stringify(exampleValues, null, 2)}
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=generateModelMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateModelMetadata.js","sourceRoot":"","sources":["../../src/generators/generateModelMetadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,20 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateModelCore = generateModelCore;
|
|
4
4
|
const importExt_1 = require("../utils/importExt");
|
|
5
5
|
function decideWriteOp(name, defaultMethod, strategy) {
|
|
6
|
-
if (strategy === '
|
|
7
|
-
return {
|
|
6
|
+
if (strategy === 'throwOnNonReturning' && (name === 'createMany' || name === 'updateMany')) {
|
|
7
|
+
return { throw: true, method: defaultMethod };
|
|
8
8
|
}
|
|
9
|
-
if (strategy === '
|
|
10
|
-
if (name === 'createMany'
|
|
11
|
-
return {
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
if (strategy === 'forceReturn') {
|
|
10
|
+
if (name === 'createMany')
|
|
11
|
+
return { method: 'createManyAndReturn' };
|
|
12
|
+
if (name === 'updateMany')
|
|
13
|
+
return { method: 'updateManyAndReturn' };
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
return { mode: 'redirect', method: 'createManyAndReturn' };
|
|
17
|
-
if (name === 'updateMany')
|
|
18
|
-
return { mode: 'redirect', method: 'updateManyAndReturn' };
|
|
19
|
-
return { mode: 'normal', method: defaultMethod };
|
|
15
|
+
return { method: defaultMethod };
|
|
20
16
|
}
|
|
21
17
|
function renderPaginatedBody(modelNameLower, mode) {
|
|
22
18
|
if (mode === 'transaction') {
|
|
@@ -89,7 +85,7 @@ export async function ${op}(ctx: OperationContext): Promise<unknown> {
|
|
|
89
85
|
];
|
|
90
86
|
const writeHandlers = writeOps.map((op) => {
|
|
91
87
|
const decision = decideWriteOp(op.name, op.method, writeStrategy);
|
|
92
|
-
if (decision.
|
|
88
|
+
if (decision.throw) {
|
|
93
89
|
return `
|
|
94
90
|
export async function ${op.name}(_ctx: OperationContext): Promise<unknown> {
|
|
95
91
|
throw new HttpError(501, '${op.name} is disabled by writeStrategy="${writeStrategy}"')
|
|
@@ -115,16 +111,15 @@ ${validationLines}
|
|
|
115
111
|
return `import {
|
|
116
112
|
OperationContext,
|
|
117
113
|
PrismaClientLike,
|
|
118
|
-
HttpError,
|
|
119
114
|
getExtendedClient,
|
|
120
115
|
getDelegate,
|
|
121
116
|
validateBody,
|
|
122
117
|
requireBodyField,
|
|
123
|
-
applyPaginationLimits,
|
|
124
|
-
assertGuard,
|
|
125
|
-
countForPagination,
|
|
126
|
-
mapError,
|
|
127
118
|
} from '../operationRuntime${ext}'
|
|
119
|
+
import { HttpError, mapError } from '../errorMapper${ext}'
|
|
120
|
+
import { applyPaginationLimits, countForPagination } from '../pagination${ext}'
|
|
121
|
+
import { assertGuard } from '../guardHelpers${ext}'
|
|
122
|
+
import { mapLimited } from '../concurrency${ext}'
|
|
128
123
|
|
|
129
124
|
export async function findMany(ctx: OperationContext): Promise<unknown> {
|
|
130
125
|
const rawQuery = ctx.parsedQuery || {}
|
|
@@ -222,20 +217,15 @@ export async function updateEach(
|
|
|
222
217
|
const CONCURRENCY = 8
|
|
223
218
|
const results: Array<{ status: 'ok'; data: unknown } | { status: 'error'; error: string }> =
|
|
224
219
|
new Array(items.length)
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
try {
|
|
232
|
-
results[i] = { status: 'ok', data: await delegate.update(items[i]) }
|
|
233
|
-
} catch (err) {
|
|
234
|
-
results[i] = { status: 'error', error: mapError(err).message }
|
|
235
|
-
}
|
|
220
|
+
|
|
221
|
+
await mapLimited(items, CONCURRENCY, async (item, i) => {
|
|
222
|
+
try {
|
|
223
|
+
results[i] = { status: 'ok', data: await delegate.update(item) }
|
|
224
|
+
} catch (err) {
|
|
225
|
+
results[i] = { status: 'error', error: mapError(err).message }
|
|
236
226
|
}
|
|
237
227
|
})
|
|
238
|
-
|
|
228
|
+
|
|
239
229
|
return results
|
|
240
230
|
}
|
|
241
231
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;AAkEA,8CA4LC;AA5PD,kDAA8C;AAY9C,SAAS,aAAa,CACpB,IAAY,EACZ,aAAqB,EACrB,QAAuB;IAEvB,IAAI,QAAQ,KAAK,qBAAqB,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QAC3F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IAC/C,CAAC;IACD,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;QACnE,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;AAClC,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB,EAAE,IAA2B;IAC9E,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;;;;;;;0CAO+B,cAAc;;;;;;;;;;;;yBAY/B,CAAA;IACvB,CAAC;IAED,OAAO;4CACmC,cAAc;;;;;;;;;gBAS1C,CAAA;AAChB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAyB;IACzD,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;IACpC,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAC,cAAc,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAExF,MAAM,eAAe,GAAG;QACtB,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB;QAClE,OAAO,EAAE,WAAW,EAAE,SAAS;KAChC,CAAA;IAED,MAAM,oBAAoB,GAAG,eAAe;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;wBACO,EAAE;;;4CAGkB,cAAc;;;6DAGG,EAAE;;oBAE3C,EAAE;EACpB,CAAC;SACE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACtE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACxF,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QAC/E,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACjG,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACrE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;KACpF,CAAA;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAEjE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;wBACW,EAAE,CAAC,IAAI;8BACD,EAAE,CAAC,IAAI,kCAAkC,aAAa;EAClF,CAAA;QACE,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;QAC9B,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc;aACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,KAAK,IAAI,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,OAAO;wBACa,EAAE,CAAC,IAAI;;EAE7B,eAAe;;4CAE2B,cAAc;;;6DAGG,MAAM;;oBAE/C,MAAM;EACxB,CAAA;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;;;6BAOoB,GAAG;qDACqB,GAAG;0EACkB,GAAG;8CAC/B,GAAG;4CACL,GAAG;;;;;;4CAMH,cAAc;;;;;;;EAOxD,oBAAoB;EACpB,aAAa;;;;;;;;;;;;;;;EAeb,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAwD6B,cAAc;;;;;;;;;4CASd,cAAc;;;;;;;;;;;;;;;CAezD,CAAA;AACD,CAAC"}
|
|
@@ -4,7 +4,7 @@ exports.generateQueryBuilderHelper = generateQueryBuilderHelper;
|
|
|
4
4
|
function generateQueryBuilderHelper(options) {
|
|
5
5
|
const schemaPath = options.schemaPath
|
|
6
6
|
? JSON.stringify(options.schemaPath)
|
|
7
|
-
: "
|
|
7
|
+
: "resolve(process.cwd(), 'prisma/schema.prisma')";
|
|
8
8
|
return `import { spawn } from 'child_process'
|
|
9
9
|
import { resolve, join, dirname } from 'path'
|
|
10
10
|
import { existsSync, readFileSync } from 'fs'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateQueryBuilderHelper.js","sourceRoot":"","sources":["../../src/generators/generateQueryBuilderHelper.ts"],"names":[],"mappings":";;AAEA,gEAgKC;AAhKD,SAAgB,0BAA0B,CAAC,OAAyB;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;QACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"generateQueryBuilderHelper.js","sourceRoot":"","sources":["../../src/generators/generateQueryBuilderHelper.ts"],"names":[],"mappings":";;AAEA,gEAgKC;AAhKD,SAAgB,0BAA0B,CAAC,OAAyB;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;QACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC,CAAC,gDAAgD,CAAA;IAEpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA+DsC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FxD,CAAA;AACD,CAAC"}
|
|
@@ -2,58 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateRouteConfigType = generateRouteConfigType;
|
|
4
4
|
const importExt_1 = require("../utils/importExt");
|
|
5
|
-
const
|
|
6
|
-
const ROUTER_OPERATIONS =
|
|
7
|
-
'
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
'findManyPaginated',
|
|
13
|
-
'count',
|
|
14
|
-
'aggregate',
|
|
15
|
-
'groupBy',
|
|
16
|
-
'create',
|
|
17
|
-
'createMany',
|
|
18
|
-
'createManyAndReturn',
|
|
19
|
-
'update',
|
|
20
|
-
'updateMany',
|
|
21
|
-
'updateManyAndReturn',
|
|
22
|
-
'upsert',
|
|
23
|
-
'delete',
|
|
24
|
-
'deleteMany',
|
|
25
|
-
];
|
|
26
|
-
const READ_OPERATIONS = new Set([
|
|
27
|
-
'findUnique',
|
|
28
|
-
'findUniqueOrThrow',
|
|
29
|
-
'findFirst',
|
|
30
|
-
'findFirstOrThrow',
|
|
31
|
-
'findMany',
|
|
32
|
-
'findManyPaginated',
|
|
33
|
-
'count',
|
|
34
|
-
'aggregate',
|
|
35
|
-
'groupBy',
|
|
36
|
-
]);
|
|
37
|
-
const ROUTER_OP_TO_SHAPE_OP = {
|
|
38
|
-
findUnique: 'findUnique',
|
|
39
|
-
findUniqueOrThrow: 'findUniqueOrThrow',
|
|
40
|
-
findFirst: 'findFirst',
|
|
41
|
-
findFirstOrThrow: 'findFirstOrThrow',
|
|
42
|
-
findMany: 'findMany',
|
|
43
|
-
findManyPaginated: 'findManyPaginated',
|
|
44
|
-
count: 'count',
|
|
45
|
-
aggregate: 'aggregate',
|
|
46
|
-
groupBy: 'groupBy',
|
|
47
|
-
create: 'create',
|
|
48
|
-
createMany: 'createMany',
|
|
49
|
-
createManyAndReturn: 'createManyAndReturn',
|
|
50
|
-
update: 'update',
|
|
51
|
-
updateMany: 'updateMany',
|
|
52
|
-
updateManyAndReturn: 'updateManyAndReturn',
|
|
53
|
-
upsert: 'upsert',
|
|
54
|
-
delete: 'delete',
|
|
55
|
-
deleteMany: 'deleteMany',
|
|
56
|
-
};
|
|
5
|
+
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
6
|
+
const ROUTER_OPERATIONS = operationDefinitions_1.OPERATION_METADATA
|
|
7
|
+
.filter((m) => m.name !== 'updateEach')
|
|
8
|
+
.map((m) => m.name);
|
|
9
|
+
function capitalize(str) {
|
|
10
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
11
|
+
}
|
|
57
12
|
function requestTypeFor(target) {
|
|
58
13
|
if (target === 'fastify')
|
|
59
14
|
return `import('fastify').FastifyRequest`;
|
|
@@ -102,14 +57,13 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
102
57
|
return (progressiveTypeImport +
|
|
103
58
|
`export type ${m}RouteConfig${generics} = ${baseConfig}\n`);
|
|
104
59
|
}
|
|
105
|
-
const shapeOps =
|
|
60
|
+
const shapeOps = Array.from(new Set(ROUTER_OPERATIONS));
|
|
106
61
|
const opShapeImports = shapeOps
|
|
107
|
-
.map((op) => `${m}${
|
|
62
|
+
.map((op) => `${m}${capitalize(op)}ShapeInput`)
|
|
108
63
|
.join(',\n ');
|
|
109
64
|
const overrides = ROUTER_OPERATIONS.map((routerOp) => {
|
|
110
|
-
const
|
|
111
|
-
const
|
|
112
|
-
const isRead = READ_OPERATIONS.has(routerOp);
|
|
65
|
+
const c = capitalize(routerOp);
|
|
66
|
+
const isRead = operationDefinitions_1.READ_OPERATION_NAMES.has(routerOp);
|
|
113
67
|
const lines = [
|
|
114
68
|
` before?: ${beforeRef}[]`,
|
|
115
69
|
` after?: ${afterRef}[]`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":"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"}
|