prisma-generator-express 1.42.0 → 1.44.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/generators/generateFastifyHandler.d.ts +2 -0
- package/dist/generators/generateFastifyHandler.js +21 -6
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -0
- package/dist/generators/generateHonoHandler.js +8 -6
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateOperationCore.d.ts +0 -1
- package/dist/generators/generateOperationCore.js +34 -546
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRelationMeta.d.ts +13 -0
- package/dist/generators/generateRelationMeta.js +110 -0
- package/dist/generators/generateRelationMeta.js.map +1 -0
- package/dist/generators/generateRouteConfigType.js +13 -5
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.js +83 -19
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.js +127 -384
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.js +48 -36
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.d.ts +2 -0
- package/dist/generators/generateUnifiedHandler.js +28 -10
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/generators/generateUnifiedScalarUI.d.ts +2 -0
- package/dist/generators/generateUnifiedScalarUI.js +19 -16
- package/dist/generators/generateUnifiedScalarUI.js.map +1 -1
- package/dist/index.js +21 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.js +12 -0
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/writeFileSafely.js +2 -2
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/autoIncludePlanner.ts +354 -0
- package/src/copy/autoIncludeRuntime.ts +362 -0
- package/src/copy/operationRuntime.ts +614 -0
- package/src/copy/routeConfig.express.ts +5 -3
- package/src/copy/routeConfig.fastify.ts +2 -2
- package/src/copy/routeConfig.hono.ts +3 -3
- package/src/copy/routeConfig.ts +20 -9
- package/src/generators/generateFastifyHandler.ts +23 -6
- package/src/generators/generateHonoHandler.ts +10 -6
- package/src/generators/generateOperationCore.ts +34 -546
- package/src/generators/generateRelationMeta.ts +160 -0
- package/src/generators/generateRouteConfigType.ts +13 -6
- package/src/generators/generateRouter.ts +83 -19
- package/src/generators/generateRouterFastify.ts +127 -384
- package/src/generators/generateRouterHono.ts +48 -36
- package/src/generators/generateUnifiedHandler.ts +30 -10
- package/src/generators/generateUnifiedScalarUI.ts +21 -16
- package/src/index.ts +31 -13
- package/src/utils/copyFiles.ts +13 -0
- package/src/utils/writeFileSafely.ts +2 -2
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRelationMeta = generateRelationMeta;
|
|
4
|
+
exports.generateRelationModelsIndex = generateRelationModelsIndex;
|
|
5
|
+
const importExt_1 = require("../utils/importExt");
|
|
6
|
+
function findOppositeField(models, targetModelName, relationName, selfModelName, selfFieldName) {
|
|
7
|
+
if (!relationName)
|
|
8
|
+
return null;
|
|
9
|
+
const target = models.find((m) => m.name === targetModelName);
|
|
10
|
+
if (!target)
|
|
11
|
+
return null;
|
|
12
|
+
const isSelfRelation = targetModelName === selfModelName;
|
|
13
|
+
return target.fields.find((f) => f.kind === 'object' &&
|
|
14
|
+
f.relationName === relationName &&
|
|
15
|
+
f.type === selfModelName &&
|
|
16
|
+
!(isSelfRelation && f.name === selfFieldName)) || null;
|
|
17
|
+
}
|
|
18
|
+
function computeRelation(field, selfModelName, models) {
|
|
19
|
+
const selfFrom = (field.relationFromFields ?? []);
|
|
20
|
+
const selfTo = (field.relationToFields ?? []);
|
|
21
|
+
if (selfFrom.length > 0) {
|
|
22
|
+
return {
|
|
23
|
+
name: field.name,
|
|
24
|
+
type: field.type,
|
|
25
|
+
isList: field.isList,
|
|
26
|
+
isRequired: field.isRequired,
|
|
27
|
+
direction: 'parentOwnsFk',
|
|
28
|
+
parentLinkFields: selfFrom,
|
|
29
|
+
childLinkFields: selfTo,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const opposite = findOppositeField(models, field.type, field.relationName, selfModelName, field.name);
|
|
33
|
+
if (opposite) {
|
|
34
|
+
const oppFrom = (opposite.relationFromFields ?? []);
|
|
35
|
+
const oppTo = (opposite.relationToFields ?? []);
|
|
36
|
+
if (oppFrom.length > 0) {
|
|
37
|
+
return {
|
|
38
|
+
name: field.name,
|
|
39
|
+
type: field.type,
|
|
40
|
+
isList: field.isList,
|
|
41
|
+
isRequired: field.isRequired,
|
|
42
|
+
direction: 'childOwnsFk',
|
|
43
|
+
parentLinkFields: oppTo,
|
|
44
|
+
childLinkFields: oppFrom,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
name: field.name,
|
|
50
|
+
type: field.type,
|
|
51
|
+
isList: field.isList,
|
|
52
|
+
isRequired: field.isRequired,
|
|
53
|
+
direction: 'implicitM2M',
|
|
54
|
+
parentLinkFields: [],
|
|
55
|
+
childLinkFields: [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function buildModelMeta(model, models) {
|
|
59
|
+
const scalarFields = [];
|
|
60
|
+
const idFields = [];
|
|
61
|
+
const relations = {};
|
|
62
|
+
for (const field of model.fields) {
|
|
63
|
+
if (field.kind === 'object') {
|
|
64
|
+
relations[field.name] = computeRelation(field, model.name, models);
|
|
65
|
+
}
|
|
66
|
+
else if (field.kind === 'scalar' || field.kind === 'enum') {
|
|
67
|
+
scalarFields.push(field.name);
|
|
68
|
+
if (field.isId)
|
|
69
|
+
idFields.push(field.name);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (model.primaryKey && Array.isArray(model.primaryKey.fields)) {
|
|
73
|
+
for (const f of model.primaryKey.fields) {
|
|
74
|
+
if (!idFields.includes(f))
|
|
75
|
+
idFields.push(f);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
name: model.name,
|
|
80
|
+
delegateKey: model.name.charAt(0).toLowerCase() + model.name.slice(1),
|
|
81
|
+
scalarFields,
|
|
82
|
+
idFields,
|
|
83
|
+
relations,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function generateRelationMeta(options) {
|
|
87
|
+
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
88
|
+
const meta = buildModelMeta(options.model, options.allModels);
|
|
89
|
+
return `import type { ModelRelationMap } from '../autoIncludePlanner${ext}'
|
|
90
|
+
|
|
91
|
+
export const ${options.model.name}Relations: ModelRelationMap = ${JSON.stringify(meta, null, 2)}
|
|
92
|
+
`;
|
|
93
|
+
}
|
|
94
|
+
function generateRelationModelsIndex(options) {
|
|
95
|
+
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
96
|
+
const imports = options.modelNames
|
|
97
|
+
.map((n) => `import { ${n}Relations } from './${n}/${n}Relations${ext}'`)
|
|
98
|
+
.join('\n');
|
|
99
|
+
const entries = options.modelNames
|
|
100
|
+
.map((n) => ` ${n}: ${n}Relations,`)
|
|
101
|
+
.join('\n');
|
|
102
|
+
return `import type { ModelRelationMap } from './autoIncludePlanner${ext}'
|
|
103
|
+
${imports}
|
|
104
|
+
|
|
105
|
+
export const relationModels: Record<string, ModelRelationMap> = {
|
|
106
|
+
${entries}
|
|
107
|
+
}
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=generateRelationMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,12 +36,23 @@ const ROUTER_OP_TO_SHAPE_OP = {
|
|
|
36
36
|
function capitalize(s) {
|
|
37
37
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
38
38
|
}
|
|
39
|
+
function requestTypeFor(target) {
|
|
40
|
+
if (target === 'fastify')
|
|
41
|
+
return `import('fastify').FastifyRequest`;
|
|
42
|
+
if (target === 'hono')
|
|
43
|
+
return `import('hono').Context`;
|
|
44
|
+
return `import('express').Request`;
|
|
45
|
+
}
|
|
39
46
|
function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target) {
|
|
40
47
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
41
48
|
const m = modelName;
|
|
42
49
|
const supportsProgressive = target === 'express';
|
|
50
|
+
const requestType = requestTypeFor(target);
|
|
51
|
+
const progressiveTypeImport = supportsProgressive
|
|
52
|
+
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n\n`
|
|
53
|
+
: '';
|
|
43
54
|
if (!guardShapesImport) {
|
|
44
|
-
return `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string, unknown>, TCtx>\n`;
|
|
55
|
+
return progressiveTypeImport + `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string, unknown>, TCtx>\n`;
|
|
45
56
|
}
|
|
46
57
|
const shapeOps = Object.values(ROUTER_OP_TO_SHAPE_OP).filter((v, i, a) => a.indexOf(v) === i);
|
|
47
58
|
const opShapeImports = shapeOps.map((op) => `${m}${capitalize(op)}ShapeInput`).join(',\n ');
|
|
@@ -61,9 +72,6 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
61
72
|
return ` ${routerOp}?: {\n${lines.join('\n')}\n }`;
|
|
62
73
|
}).join('\n');
|
|
63
74
|
const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
|
|
64
|
-
const progressiveTypeImport = supportsProgressive
|
|
65
|
-
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n\n`
|
|
66
|
-
: '';
|
|
67
75
|
return (progressiveTypeImport +
|
|
68
76
|
`import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
|
|
69
77
|
`export type ${m}RouteConfig<TCtx = unknown> = Omit<\n` +
|
|
@@ -71,7 +79,7 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
71
79
|
` | ${omitKeys}\n` +
|
|
72
80
|
` | 'resolveContext'\n` +
|
|
73
81
|
`> & {\n` +
|
|
74
|
-
` resolveContext?: (request:
|
|
82
|
+
` resolveContext?: (request: ${requestType}) => TCtx | Promise<TCtx>\n` +
|
|
75
83
|
`${overrides}\n}\n`);
|
|
76
84
|
}
|
|
77
85
|
//# sourceMappingURL=generateRouteConfigType.js.map
|
|
@@ -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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"}
|
|
@@ -9,6 +9,7 @@ function generateRouterFunction({ model, enums, guardShapesImport, importStyle,
|
|
|
9
9
|
const modelName = model.name;
|
|
10
10
|
const prefix = (0, strings_1.toCamelCase)(modelName);
|
|
11
11
|
const modelNameLower = modelName.toLowerCase();
|
|
12
|
+
const delegateKey = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
12
13
|
const routerFunctionName = `${prefix}Router`;
|
|
13
14
|
const fieldsMeta = model.fields.map((f) => ({
|
|
14
15
|
name: f.name,
|
|
@@ -52,7 +53,7 @@ import {
|
|
|
52
53
|
${prefix}GroupBy,
|
|
53
54
|
} from './${modelName}Handlers${ext}'
|
|
54
55
|
import * as core from './${modelName}Core${ext}'
|
|
55
|
-
import type { RouteConfig
|
|
56
|
+
import type { RouteConfig } from '../routeConfig.target${ext}'
|
|
56
57
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
57
58
|
import { sanitizeKeys } from '../misc${ext}'
|
|
58
59
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
@@ -62,7 +63,13 @@ import {
|
|
|
62
63
|
acceptsEventStream,
|
|
63
64
|
runProgressiveEndpoint,
|
|
64
65
|
runSingleResultSSE,
|
|
66
|
+
emitTerminalSSEError,
|
|
67
|
+
removeReqCloseListener,
|
|
68
|
+
mapError,
|
|
69
|
+
HttpError,
|
|
65
70
|
} from '../operationRuntime${ext}'
|
|
71
|
+
import { relationModels } from '../relationModels${ext}'
|
|
72
|
+
import { runAutoIncludeProgressive } from '../autoIncludeRuntime${ext}'
|
|
66
73
|
|
|
67
74
|
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
|
|
68
75
|
const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
|
|
@@ -86,7 +93,7 @@ type ExtendedRequest = Request & {
|
|
|
86
93
|
|
|
87
94
|
type LocalsBag = {
|
|
88
95
|
parsedQuery?: Record<string, unknown>
|
|
89
|
-
routeConfig?:
|
|
96
|
+
routeConfig?: { pagination?: OperationContext['paginationConfig'] }
|
|
90
97
|
guardShape?: Record<string, unknown>
|
|
91
98
|
guardCaller?: string
|
|
92
99
|
data?: unknown
|
|
@@ -183,7 +190,9 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
183
190
|
const setShape = (opConfig: OperationConfigLike): RequestHandler => {
|
|
184
191
|
return (req, res, next) => {
|
|
185
192
|
const locals = readLocals(res)
|
|
186
|
-
|
|
193
|
+
if (config.pagination) {
|
|
194
|
+
locals.routeConfig = { pagination: config.pagination }
|
|
195
|
+
}
|
|
187
196
|
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
188
197
|
const headerValue = req.get(headerName)
|
|
189
198
|
const caller = config.guard?.resolveVariant?.(req) ?? headerValue ?? undefined
|
|
@@ -193,9 +202,10 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
193
202
|
}
|
|
194
203
|
}
|
|
195
204
|
|
|
196
|
-
|
|
205
|
+
const maybeProgressiveSSE = (
|
|
197
206
|
opConfig: OperationConfigLike,
|
|
198
207
|
coreFn: (ctx: OperationContext) => Promise<unknown>,
|
|
208
|
+
baseOp: string,
|
|
199
209
|
): RequestHandler => {
|
|
200
210
|
return async (req, res, next) => {
|
|
201
211
|
if (res.headersSent || res.writableEnded) return next()
|
|
@@ -216,13 +226,61 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
216
226
|
return
|
|
217
227
|
}
|
|
218
228
|
|
|
229
|
+
if (progressiveConfig.mode === 'autoInclude') {
|
|
230
|
+
const isSingleRecordRead =
|
|
231
|
+
baseOp === 'findUnique' || baseOp === 'findUniqueOrThrow' ||
|
|
232
|
+
baseOp === 'findFirst' || baseOp === 'findFirstOrThrow'
|
|
233
|
+
|
|
234
|
+
if (!isSingleRecordRead) {
|
|
235
|
+
if (progressiveConfig.fallback === 'error') {
|
|
236
|
+
emitTerminalSSEError(res, 'auto-progressive fallback: operation not single-record')
|
|
237
|
+
return
|
|
238
|
+
}
|
|
239
|
+
await runSingleResultSSE({
|
|
240
|
+
req,
|
|
241
|
+
res,
|
|
242
|
+
coreQueryFn: () => coreFn(buildContext(req, res)),
|
|
243
|
+
})
|
|
244
|
+
return
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const ctx = buildContext(req, res)
|
|
248
|
+
const args = (locals.parsedQuery ?? {}) as Record<string, unknown>
|
|
249
|
+
const controller = new AbortController()
|
|
250
|
+
const onClose = () => controller.abort()
|
|
251
|
+
req.on('close', onClose)
|
|
252
|
+
try {
|
|
253
|
+
await runAutoIncludeProgressive({
|
|
254
|
+
req,
|
|
255
|
+
res,
|
|
256
|
+
ctx,
|
|
257
|
+
args,
|
|
258
|
+
baseOp: baseOp as 'findUnique' | 'findUniqueOrThrow' | 'findFirst' | 'findFirstOrThrow',
|
|
259
|
+
modelName: '${modelName}',
|
|
260
|
+
delegateKey: '${delegateKey}',
|
|
261
|
+
models: relationModels,
|
|
262
|
+
variantConfig: progressiveConfig,
|
|
263
|
+
coreQueryFn: () => coreFn(ctx),
|
|
264
|
+
signal: controller.signal,
|
|
265
|
+
})
|
|
266
|
+
} finally {
|
|
267
|
+
removeReqCloseListener(req, onClose)
|
|
268
|
+
}
|
|
269
|
+
return
|
|
270
|
+
}
|
|
271
|
+
|
|
219
272
|
if (!Array.isArray(progressiveConfig.stages)) {
|
|
220
|
-
|
|
273
|
+
await runSingleResultSSE({
|
|
274
|
+
req,
|
|
275
|
+
res,
|
|
276
|
+
coreQueryFn: () => coreFn(buildContext(req, res)),
|
|
277
|
+
})
|
|
278
|
+
return
|
|
221
279
|
}
|
|
222
280
|
|
|
223
281
|
const stageRegistry = opConfig.progressiveStages ?? {}
|
|
224
282
|
const missingStage = progressiveConfig.stages.find(
|
|
225
|
-
(name) => typeof stageRegistry[name] !== 'function',
|
|
283
|
+
(name: string) => typeof stageRegistry[name] !== 'function',
|
|
226
284
|
)
|
|
227
285
|
if (missingStage) {
|
|
228
286
|
return next({ status: 500, message: 'Missing progressive stage: ' + missingStage })
|
|
@@ -280,63 +338,63 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
280
338
|
const opConfig: OperationConfigLike = (config.findFirst as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
281
339
|
const { before = [], after = [] } = opConfig
|
|
282
340
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
283
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst), ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
341
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst, 'findFirst'), ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
284
342
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
285
343
|
}
|
|
286
344
|
if (config.enableAll || config.findFirstOrThrow) {
|
|
287
345
|
const opConfig: OperationConfigLike = (config.findFirstOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
288
346
|
const { before = [], after = [] } = opConfig
|
|
289
347
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
290
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
348
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow, 'findFirstOrThrow'), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
291
349
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
292
350
|
}
|
|
293
351
|
if (config.enableAll || config.findManyPaginated) {
|
|
294
352
|
const opConfig: OperationConfigLike = (config.findManyPaginated as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
295
353
|
const { before = [], after = [] } = opConfig
|
|
296
354
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
297
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
355
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated, 'findManyPaginated'), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
298
356
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
299
357
|
}
|
|
300
358
|
if (config.enableAll || config.aggregate) {
|
|
301
359
|
const opConfig: OperationConfigLike = (config.aggregate as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
302
360
|
const { before = [], after = [] } = opConfig
|
|
303
361
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
304
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate), ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
362
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate, 'aggregate'), ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
305
363
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
306
364
|
}
|
|
307
365
|
if (config.enableAll || config.count) {
|
|
308
366
|
const opConfig: OperationConfigLike = (config.count as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
309
367
|
const { before = [], after = [] } = opConfig
|
|
310
368
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
311
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count), ${prefix}Count as RequestHandler, ...after, respond)
|
|
369
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count, 'count'), ${prefix}Count as RequestHandler, ...after, respond)
|
|
312
370
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Count as RequestHandler, ...after, respond)
|
|
313
371
|
}
|
|
314
372
|
if (config.enableAll || config.groupBy) {
|
|
315
373
|
const opConfig: OperationConfigLike = (config.groupBy as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
316
374
|
const { before = [], after = [] } = opConfig
|
|
317
375
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
318
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy), ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
376
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy, 'groupBy'), ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
319
377
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
320
378
|
}
|
|
321
379
|
if (config.enableAll || config.findUniqueOrThrow) {
|
|
322
380
|
const opConfig: OperationConfigLike = (config.findUniqueOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
323
381
|
const { before = [], after = [] } = opConfig
|
|
324
382
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
325
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
383
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow, 'findUniqueOrThrow'), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
326
384
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
327
385
|
}
|
|
328
386
|
if (config.enableAll || config.findUnique) {
|
|
329
387
|
const opConfig: OperationConfigLike = (config.findUnique as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
330
388
|
const { before = [], after = [] } = opConfig
|
|
331
389
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
332
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique), ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
390
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique, 'findUnique'), ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
333
391
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
334
392
|
}
|
|
335
393
|
if (config.enableAll || config.findMany) {
|
|
336
394
|
const opConfig: OperationConfigLike = (config.findMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
337
395
|
const { before = [], after = [] } = opConfig
|
|
338
396
|
const path = basePath || '/'
|
|
339
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany), ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
397
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany, 'findMany'), ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
340
398
|
if (postReadsEnabled) {
|
|
341
399
|
const postPath = basePath ? \`\${basePath}/read\` : '/read'
|
|
342
400
|
router.post(postPath, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
@@ -399,10 +457,16 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
399
457
|
}
|
|
400
458
|
|
|
401
459
|
router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
if (
|
|
460
|
+
let httpError: HttpError
|
|
461
|
+
if (err instanceof HttpError) {
|
|
462
|
+
httpError = err
|
|
463
|
+
} else if (err && typeof err === 'object' && typeof (err as { status?: number }).status === 'number') {
|
|
464
|
+
const e = err as { status: number; message?: string }
|
|
465
|
+
httpError = new HttpError(e.status, e.message || 'Internal server error')
|
|
466
|
+
} else {
|
|
467
|
+
httpError = mapError(err)
|
|
468
|
+
}
|
|
469
|
+
if (!res.headersSent) return res.status(httpError.status).json({ message: httpError.message })
|
|
406
470
|
next(err)
|
|
407
471
|
})
|
|
408
472
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
|