prisma-generator-express 1.59.0 → 1.61.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/README.md +150 -14
- 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/autoIncludePlannerGuarded.ts +477 -0
- package/src/copy/autoIncludeRuntime.ts +269 -261
- package/src/copy/autoIncludeRuntimeGuarded.ts +379 -0
- 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
|
@@ -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":"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"}
|
|
@@ -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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"}
|
|
@@ -3,58 +3,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateRouterFunction = generateRouterFunction;
|
|
4
4
|
const generateRouteConfigType_1 = require("./generateRouteConfigType");
|
|
5
5
|
const importExt_1 = require("../utils/importExt");
|
|
6
|
+
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
7
|
+
function pathExpr(basePath, suffix) {
|
|
8
|
+
if (!suffix)
|
|
9
|
+
return basePath || '/';
|
|
10
|
+
if (!basePath)
|
|
11
|
+
return `'${suffix}'`;
|
|
12
|
+
return `\`\${basePath}${suffix}\``;
|
|
13
|
+
}
|
|
14
|
+
function emitReadOp(meta, modelName) {
|
|
15
|
+
const c = meta.name.charAt(0).toUpperCase() + meta.name.slice(1);
|
|
16
|
+
const handlerName = `${modelName}${c}`;
|
|
17
|
+
const pathValue = pathExpr('basePath', meta.pathSuffix);
|
|
18
|
+
const postReadBlock = meta.supportsPostRead
|
|
19
|
+
? ` if (postReadsEnabled) {
|
|
20
|
+
const postPath = ${meta.name === 'findMany' ? "basePath ? `${basePath}/read` : '/read'" : `path`}
|
|
21
|
+
router.post(postPath, parseBodyAsQuery, setShape(opConfig), ...before, ${handlerName} as RequestHandler, ...after, respond)
|
|
22
|
+
}`
|
|
23
|
+
: '';
|
|
24
|
+
return ` if (isEnabled(config.${meta.configKey})) {
|
|
25
|
+
const opConfig: OperationConfigLike = (config.${meta.configKey} as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
26
|
+
const { before = [], after = [] } = opConfig
|
|
27
|
+
const path = ${pathValue}
|
|
28
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.${meta.coreName}, '${meta.name}'), ${handlerName} as RequestHandler, ...after, respond)
|
|
29
|
+
${postReadBlock}
|
|
30
|
+
}`;
|
|
31
|
+
}
|
|
32
|
+
function emitWriteOp(meta, modelName) {
|
|
33
|
+
const c = meta.name.charAt(0).toUpperCase() + meta.name.slice(1);
|
|
34
|
+
const handlerName = `${modelName}${c}`;
|
|
35
|
+
const pathValue = pathExpr('basePath', meta.pathSuffix);
|
|
36
|
+
const respondFn = meta.successStatus === 201 ? 'respondCreated' : 'respond';
|
|
37
|
+
return ` if (isEnabled(config.${meta.configKey})) {
|
|
38
|
+
const opConfig: OperationConfigLike = (config.${meta.configKey} as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
39
|
+
const { before = [], after = [] } = opConfig
|
|
40
|
+
const path = ${pathValue}
|
|
41
|
+
router.${meta.method}(path, setShape(opConfig), ...before, ${handlerName} as RequestHandler, ...after, ${respondFn})
|
|
42
|
+
}`;
|
|
43
|
+
}
|
|
6
44
|
function generateRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, }) {
|
|
7
45
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
8
46
|
const modelName = model.name;
|
|
9
47
|
const modelNameLower = modelName.toLowerCase();
|
|
10
48
|
const delegateKey = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
11
49
|
const routerFunctionName = `${modelName}Router`;
|
|
12
|
-
const
|
|
13
|
-
name
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
relationFromFields: f.relationFromFields,
|
|
22
|
-
}));
|
|
23
|
-
const referencedEnumTypes = new Set(model.fields.filter((f) => f.kind === 'enum').map((f) => f.type));
|
|
24
|
-
const enumsMeta = enums
|
|
25
|
-
.filter((e) => referencedEnumTypes.has(e.name))
|
|
26
|
-
.map((e) => ({
|
|
27
|
-
name: e.name,
|
|
28
|
-
values: e.values.map((v) => ({ name: v.name })),
|
|
29
|
-
}));
|
|
50
|
+
const handlerImports = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.name !== 'updateEach')
|
|
51
|
+
.map((m) => ` ${modelName}${m.name.charAt(0).toUpperCase() + m.name.slice(1)},`)
|
|
52
|
+
.join('\n');
|
|
53
|
+
const readOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'read');
|
|
54
|
+
const writeOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'write' || m.kind === 'batch').filter((m) => m.name !== 'updateEach');
|
|
55
|
+
const readOpBlocks = readOps.map((m) => emitReadOp(m, modelName)).join('\n\n');
|
|
56
|
+
const writeOpBlocks = writeOps
|
|
57
|
+
.map((m) => emitWriteOp(m, modelName))
|
|
58
|
+
.join('\n\n');
|
|
30
59
|
return `import express from 'express'
|
|
31
60
|
import type { Request, Response, NextFunction, RequestHandler } from 'express'
|
|
32
61
|
import { startQueryBuilder } from '../queryBuilder${ext}'
|
|
33
62
|
import {
|
|
34
|
-
|
|
35
|
-
${modelName}FindUniqueOrThrow,
|
|
36
|
-
${modelName}FindFirst,
|
|
37
|
-
${modelName}FindFirstOrThrow,
|
|
38
|
-
${modelName}FindMany,
|
|
39
|
-
${modelName}FindManyPaginated,
|
|
40
|
-
${modelName}Create,
|
|
41
|
-
${modelName}CreateMany,
|
|
42
|
-
${modelName}CreateManyAndReturn,
|
|
43
|
-
${modelName}Update,
|
|
44
|
-
${modelName}UpdateMany,
|
|
45
|
-
${modelName}UpdateManyAndReturn,
|
|
46
|
-
${modelName}Upsert,
|
|
47
|
-
${modelName}Delete,
|
|
48
|
-
${modelName}DeleteMany,
|
|
49
|
-
${modelName}Aggregate,
|
|
50
|
-
${modelName}Count,
|
|
51
|
-
${modelName}GroupBy,
|
|
63
|
+
${handlerImports}
|
|
52
64
|
} from './${modelName}Handlers${ext}'
|
|
53
65
|
import * as core from './${modelName}Core${ext}'
|
|
54
66
|
import type {
|
|
55
67
|
RouteConfig,
|
|
56
68
|
QueryBuilderConfig,
|
|
57
|
-
WriteStrategy,
|
|
58
69
|
FindManyPaginatedMode,
|
|
59
70
|
PaginationConfig,
|
|
60
71
|
} from '../routeConfig.target${ext}'
|
|
@@ -63,30 +74,26 @@ import { sanitizeKeys, normalizePrefix, getEnv } from '../misc${ext}'
|
|
|
63
74
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
64
75
|
import { validateCountSourceWhere } from '../routeConfig${ext}'
|
|
65
76
|
import type { OperationContext } from '../operationRuntime${ext}'
|
|
77
|
+
import { transformResult } from '../operationRuntime${ext}'
|
|
78
|
+
import { HttpError, mapError } from '../errorMapper${ext}'
|
|
79
|
+
import { mergePaginationConfig } from '../pagination${ext}'
|
|
66
80
|
import {
|
|
67
|
-
transformResult,
|
|
68
81
|
acceptsEventStream,
|
|
69
82
|
runProgressiveEndpoint,
|
|
70
83
|
runSingleResultSSE,
|
|
71
84
|
emitTerminalSSEError,
|
|
72
85
|
removeReqCloseListener,
|
|
73
|
-
|
|
74
|
-
mapError,
|
|
75
|
-
HttpError,
|
|
76
|
-
} from '../operationRuntime${ext}'
|
|
86
|
+
} from '../sse${ext}'
|
|
77
87
|
import { relationModels } from '../relationModels${ext}'
|
|
78
88
|
import { runAutoIncludeProgressive } from '../autoIncludeRuntime${ext}'
|
|
89
|
+
import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
|
|
79
90
|
|
|
80
91
|
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
|
|
81
92
|
const _env = getEnv()
|
|
82
93
|
|
|
83
|
-
const WRITE_STRATEGY: WriteStrategy = '${writeStrategy}'
|
|
84
94
|
const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
|
|
85
95
|
const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
|
|
86
96
|
|
|
87
|
-
const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
88
|
-
const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
|
|
89
|
-
|
|
90
97
|
type OperationConfigLike = {
|
|
91
98
|
before?: RequestHandler[]
|
|
92
99
|
after?: RequestHandler[]
|
|
@@ -160,7 +167,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
160
167
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
161
168
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
162
169
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
163
|
-
{ format: 'json', writeStrategy:
|
|
170
|
+
{ format: 'json', writeStrategy: '${writeStrategy}' },
|
|
164
171
|
)
|
|
165
172
|
}
|
|
166
173
|
return _openApiJsonCache
|
|
@@ -173,7 +180,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
173
180
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
174
181
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
175
182
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
176
|
-
{ format: 'yaml', writeStrategy:
|
|
183
|
+
{ format: 'yaml', writeStrategy: '${writeStrategy}' },
|
|
177
184
|
) as string
|
|
178
185
|
}
|
|
179
186
|
return _openApiYamlCache
|
|
@@ -351,12 +358,14 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
351
358
|
}
|
|
352
359
|
|
|
353
360
|
const respond: RequestHandler = (_req, res) => {
|
|
361
|
+
if (res.headersSent || res.writableEnded) return
|
|
354
362
|
const data = readLocals(res).data
|
|
355
363
|
if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
|
|
356
364
|
return res.json(transformResult(data))
|
|
357
365
|
}
|
|
358
366
|
|
|
359
367
|
const respondCreated: RequestHandler = (_req, res) => {
|
|
368
|
+
if (res.headersSent || res.writableEnded) return
|
|
360
369
|
const data = readLocals(res).data
|
|
361
370
|
if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
|
|
362
371
|
return res.status(201).json(transformResult(data))
|
|
@@ -373,127 +382,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
373
382
|
})
|
|
374
383
|
}
|
|
375
384
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
380
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst, 'findFirst'), ${modelName}FindFirst as RequestHandler, ...after, respond)
|
|
381
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindFirst as RequestHandler, ...after, respond)
|
|
382
|
-
}
|
|
383
|
-
if (isEnabled(config.findFirstOrThrow)) {
|
|
384
|
-
const opConfig: OperationConfigLike = (config.findFirstOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
385
|
-
const { before = [], after = [] } = opConfig
|
|
386
|
-
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
387
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow, 'findFirstOrThrow'), ${modelName}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
388
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
389
|
-
}
|
|
390
|
-
if (isEnabled(config.findManyPaginated)) {
|
|
391
|
-
const opConfig: OperationConfigLike = (config.findManyPaginated as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
392
|
-
const { before = [], after = [] } = opConfig
|
|
393
|
-
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
394
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated, 'findManyPaginated'), ${modelName}FindManyPaginated as RequestHandler, ...after, respond)
|
|
395
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindManyPaginated as RequestHandler, ...after, respond)
|
|
396
|
-
}
|
|
397
|
-
if (isEnabled(config.aggregate)) {
|
|
398
|
-
const opConfig: OperationConfigLike = (config.aggregate as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
399
|
-
const { before = [], after = [] } = opConfig
|
|
400
|
-
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
401
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate, 'aggregate'), ${modelName}Aggregate as RequestHandler, ...after, respond)
|
|
402
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}Aggregate as RequestHandler, ...after, respond)
|
|
403
|
-
}
|
|
404
|
-
if (isEnabled(config.count)) {
|
|
405
|
-
const opConfig: OperationConfigLike = (config.count as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
406
|
-
const { before = [], after = [] } = opConfig
|
|
407
|
-
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
408
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count, 'count'), ${modelName}Count as RequestHandler, ...after, respond)
|
|
409
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}Count as RequestHandler, ...after, respond)
|
|
410
|
-
}
|
|
411
|
-
if (isEnabled(config.groupBy)) {
|
|
412
|
-
const opConfig: OperationConfigLike = (config.groupBy as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
413
|
-
const { before = [], after = [] } = opConfig
|
|
414
|
-
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
415
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy, 'groupBy'), ${modelName}GroupBy as RequestHandler, ...after, respond)
|
|
416
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}GroupBy as RequestHandler, ...after, respond)
|
|
417
|
-
}
|
|
418
|
-
if (isEnabled(config.findUniqueOrThrow)) {
|
|
419
|
-
const opConfig: OperationConfigLike = (config.findUniqueOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
420
|
-
const { before = [], after = [] } = opConfig
|
|
421
|
-
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
422
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow, 'findUniqueOrThrow'), ${modelName}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
423
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
424
|
-
}
|
|
425
|
-
if (isEnabled(config.findUnique)) {
|
|
426
|
-
const opConfig: OperationConfigLike = (config.findUnique as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
427
|
-
const { before = [], after = [] } = opConfig
|
|
428
|
-
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
429
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique, 'findUnique'), ${modelName}FindUnique as RequestHandler, ...after, respond)
|
|
430
|
-
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindUnique as RequestHandler, ...after, respond)
|
|
431
|
-
}
|
|
432
|
-
if (isEnabled(config.findMany)) {
|
|
433
|
-
const opConfig: OperationConfigLike = (config.findMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
434
|
-
const { before = [], after = [] } = opConfig
|
|
435
|
-
const path = basePath || '/'
|
|
436
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany, 'findMany'), ${modelName}FindMany as RequestHandler, ...after, respond)
|
|
437
|
-
if (postReadsEnabled) {
|
|
438
|
-
const postPath = basePath ? \`\${basePath}/read\` : '/read'
|
|
439
|
-
router.post(postPath, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindMany as RequestHandler, ...after, respond)
|
|
440
|
-
}
|
|
441
|
-
}
|
|
385
|
+
${readOpBlocks}
|
|
386
|
+
|
|
387
|
+
${writeOpBlocks}
|
|
442
388
|
|
|
443
|
-
if (isEnabled(config.createManyAndReturn)) {
|
|
444
|
-
const opConfig: OperationConfigLike = (config.createManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
445
|
-
const { before = [], after = [] } = opConfig
|
|
446
|
-
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
447
|
-
router.post(path, setShape(opConfig), ...before, ${modelName}CreateManyAndReturn as RequestHandler, ...after, respondCreated)
|
|
448
|
-
}
|
|
449
|
-
if (isEnabled(config.createMany)) {
|
|
450
|
-
const opConfig: OperationConfigLike = (config.createMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
451
|
-
const { before = [], after = [] } = opConfig
|
|
452
|
-
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
453
|
-
router.post(path, setShape(opConfig), ...before, ${modelName}CreateMany as RequestHandler, ...after, respondCreated)
|
|
454
|
-
}
|
|
455
|
-
if (isEnabled(config.create)) {
|
|
456
|
-
const opConfig: OperationConfigLike = (config.create as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
457
|
-
const { before = [], after = [] } = opConfig
|
|
458
|
-
const path = basePath || '/'
|
|
459
|
-
router.post(path, setShape(opConfig), ...before, ${modelName}Create as RequestHandler, ...after, respondCreated)
|
|
460
|
-
}
|
|
461
|
-
if (isEnabled(config.updateManyAndReturn)) {
|
|
462
|
-
const opConfig: OperationConfigLike = (config.updateManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
463
|
-
const { before = [], after = [] } = opConfig
|
|
464
|
-
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
465
|
-
router.put(path, setShape(opConfig), ...before, ${modelName}UpdateManyAndReturn as RequestHandler, ...after, respond)
|
|
466
|
-
}
|
|
467
|
-
if (isEnabled(config.updateMany)) {
|
|
468
|
-
const opConfig: OperationConfigLike = (config.updateMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
469
|
-
const { before = [], after = [] } = opConfig
|
|
470
|
-
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
471
|
-
router.put(path, setShape(opConfig), ...before, ${modelName}UpdateMany as RequestHandler, ...after, respond)
|
|
472
|
-
}
|
|
473
|
-
if (isEnabled(config.update)) {
|
|
474
|
-
const opConfig: OperationConfigLike = (config.update as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
475
|
-
const { before = [], after = [] } = opConfig
|
|
476
|
-
const path = basePath || '/'
|
|
477
|
-
router.put(path, setShape(opConfig), ...before, ${modelName}Update as RequestHandler, ...after, respond)
|
|
478
|
-
}
|
|
479
|
-
if (isEnabled(config.upsert)) {
|
|
480
|
-
const opConfig: OperationConfigLike = (config.upsert as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
481
|
-
const { before = [], after = [] } = opConfig
|
|
482
|
-
const path = basePath || '/'
|
|
483
|
-
router.patch(path, setShape(opConfig), ...before, ${modelName}Upsert as RequestHandler, ...after, respond)
|
|
484
|
-
}
|
|
485
|
-
if (isEnabled(config.deleteMany)) {
|
|
486
|
-
const opConfig: OperationConfigLike = (config.deleteMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
487
|
-
const { before = [], after = [] } = opConfig
|
|
488
|
-
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
489
|
-
router.delete(path, setShape(opConfig), ...before, ${modelName}DeleteMany as RequestHandler, ...after, respond)
|
|
490
|
-
}
|
|
491
|
-
if (isEnabled(config.delete)) {
|
|
492
|
-
const opConfig: OperationConfigLike = (config.delete as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
493
|
-
const { before = [], after = [] } = opConfig
|
|
494
|
-
const path = basePath || '/'
|
|
495
|
-
router.delete(path, setShape(opConfig), ...before, ${modelName}Delete as RequestHandler, ...after, respond)
|
|
496
|
-
}
|
|
497
389
|
if (config.updateEach) {
|
|
498
390
|
const opConfig: OperationConfigLike = (config.updateEach as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
499
391
|
if ((!opConfig.before || opConfig.before.length === 0) && _env.NODE_ENV !== 'production') {
|
|
@@ -510,6 +402,9 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
510
402
|
...before,
|
|
511
403
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
512
404
|
try {
|
|
405
|
+
if (!Array.isArray(req.body)) {
|
|
406
|
+
throw new HttpError(400, 'updateEach body must be an array of { where, data } items')
|
|
407
|
+
}
|
|
513
408
|
const atomic = req.get('x-batch-atomic') === 'true'
|
|
514
409
|
readLocals(res).data = await core.updateEach(buildContext(req, res), atomic)
|
|
515
410
|
next()
|
|
@@ -523,15 +418,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
523
418
|
}
|
|
524
419
|
|
|
525
420
|
router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
526
|
-
|
|
527
|
-
if (err instanceof HttpError) {
|
|
528
|
-
httpError = err
|
|
529
|
-
} else if (err && typeof err === 'object' && typeof (err as { status?: number }).status === 'number') {
|
|
530
|
-
const e = err as { status: number; message?: string }
|
|
531
|
-
httpError = new HttpError(e.status, e.message || 'Internal server error')
|
|
532
|
-
} else {
|
|
533
|
-
httpError = mapError(err)
|
|
534
|
-
}
|
|
421
|
+
const httpError = mapError(err)
|
|
535
422
|
if (!res.headersSent) return res.status(httpError.status).json({ message: httpError.message })
|
|
536
423
|
next(err)
|
|
537
424
|
})
|