prisma-generator-express 1.41.0 → 1.43.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.
Files changed (45) hide show
  1. package/dist/generators/generateFastifyHandler.js +17 -4
  2. package/dist/generators/generateFastifyHandler.js.map +1 -1
  3. package/dist/generators/generateHonoHandler.js +4 -4
  4. package/dist/generators/generateOperationCore.d.ts +0 -1
  5. package/dist/generators/generateOperationCore.js +34 -546
  6. package/dist/generators/generateOperationCore.js.map +1 -1
  7. package/dist/generators/generateRelationMeta.d.ts +13 -0
  8. package/dist/generators/generateRelationMeta.js +106 -0
  9. package/dist/generators/generateRelationMeta.js.map +1 -0
  10. package/dist/generators/generateRouteConfigType.js +6 -6
  11. package/dist/generators/generateRouteConfigType.js.map +1 -1
  12. package/dist/generators/generateRouter.js +141 -60
  13. package/dist/generators/generateRouter.js.map +1 -1
  14. package/dist/generators/generateRouterFastify.js +127 -384
  15. package/dist/generators/generateRouterFastify.js.map +1 -1
  16. package/dist/generators/generateRouterHono.js +48 -36
  17. package/dist/generators/generateRouterHono.js.map +1 -1
  18. package/dist/generators/generateUnifiedHandler.js +24 -8
  19. package/dist/generators/generateUnifiedHandler.js.map +1 -1
  20. package/dist/index.js +21 -5
  21. package/dist/index.js.map +1 -1
  22. package/dist/utils/copyFiles.js +12 -0
  23. package/dist/utils/copyFiles.js.map +1 -1
  24. package/dist/utils/writeFileSafely.js +3 -0
  25. package/dist/utils/writeFileSafely.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/copy/autoIncludePlanner.ts +299 -0
  28. package/src/copy/autoIncludeRuntime.ts +307 -0
  29. package/src/copy/operationRuntime.ts +603 -0
  30. package/src/copy/routeConfig.express.ts +5 -3
  31. package/src/copy/routeConfig.fastify.ts +2 -2
  32. package/src/copy/routeConfig.hono.ts +3 -3
  33. package/src/copy/routeConfig.ts +20 -9
  34. package/src/generators/generateFastifyHandler.ts +17 -4
  35. package/src/generators/generateHonoHandler.ts +4 -4
  36. package/src/generators/generateOperationCore.ts +34 -546
  37. package/src/generators/generateRelationMeta.ts +154 -0
  38. package/src/generators/generateRouteConfigType.ts +7 -7
  39. package/src/generators/generateRouter.ts +141 -60
  40. package/src/generators/generateRouterFastify.ts +127 -384
  41. package/src/generators/generateRouterHono.ts +48 -36
  42. package/src/generators/generateUnifiedHandler.ts +24 -8
  43. package/src/index.ts +25 -7
  44. package/src/utils/copyFiles.ts +13 -0
  45. package/src/utils/writeFileSafely.ts +3 -0
@@ -0,0 +1,106 @@
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) {
7
+ if (!relationName)
8
+ return null;
9
+ const target = models.find((m) => m.name === targetModelName);
10
+ if (!target)
11
+ return null;
12
+ return target.fields.find((f) => f.kind === 'object' && f.relationName === relationName && f.type === selfModelName) || null;
13
+ }
14
+ function computeRelation(field, selfModelName, models) {
15
+ const selfFrom = (field.relationFromFields ?? []);
16
+ const selfTo = (field.relationToFields ?? []);
17
+ if (selfFrom.length > 0) {
18
+ return {
19
+ name: field.name,
20
+ type: field.type,
21
+ isList: field.isList,
22
+ isRequired: field.isRequired,
23
+ direction: 'parentOwnsFk',
24
+ parentLinkFields: selfFrom,
25
+ childLinkFields: selfTo,
26
+ };
27
+ }
28
+ const opposite = findOppositeField(models, field.type, field.relationName, selfModelName);
29
+ if (opposite) {
30
+ const oppFrom = (opposite.relationFromFields ?? []);
31
+ const oppTo = (opposite.relationToFields ?? []);
32
+ if (oppFrom.length > 0) {
33
+ return {
34
+ name: field.name,
35
+ type: field.type,
36
+ isList: field.isList,
37
+ isRequired: field.isRequired,
38
+ direction: 'childOwnsFk',
39
+ parentLinkFields: oppTo,
40
+ childLinkFields: oppFrom,
41
+ };
42
+ }
43
+ }
44
+ return {
45
+ name: field.name,
46
+ type: field.type,
47
+ isList: field.isList,
48
+ isRequired: field.isRequired,
49
+ direction: 'implicitM2M',
50
+ parentLinkFields: [],
51
+ childLinkFields: [],
52
+ };
53
+ }
54
+ function buildModelMeta(model, models) {
55
+ const scalarFields = [];
56
+ const idFields = [];
57
+ const relations = {};
58
+ for (const field of model.fields) {
59
+ if (field.kind === 'object') {
60
+ relations[field.name] = computeRelation(field, model.name, models);
61
+ }
62
+ else if (field.kind === 'scalar' || field.kind === 'enum') {
63
+ scalarFields.push(field.name);
64
+ if (field.isId)
65
+ idFields.push(field.name);
66
+ }
67
+ }
68
+ if (model.primaryKey && Array.isArray(model.primaryKey.fields)) {
69
+ for (const f of model.primaryKey.fields) {
70
+ if (!idFields.includes(f))
71
+ idFields.push(f);
72
+ }
73
+ }
74
+ return {
75
+ name: model.name,
76
+ delegateKey: model.name.charAt(0).toLowerCase() + model.name.slice(1),
77
+ scalarFields,
78
+ idFields,
79
+ relations,
80
+ };
81
+ }
82
+ function generateRelationMeta(options) {
83
+ const ext = (0, importExt_1.importExt)(options.importStyle);
84
+ const meta = buildModelMeta(options.model, options.allModels);
85
+ return `import type { ModelRelationMap } from '../autoIncludePlanner${ext}'
86
+
87
+ export const ${options.model.name}Relations: ModelRelationMap = ${JSON.stringify(meta, null, 2)}
88
+ `;
89
+ }
90
+ function generateRelationModelsIndex(options) {
91
+ const ext = (0, importExt_1.importExt)(options.importStyle);
92
+ const imports = options.modelNames
93
+ .map((n) => `import { ${n}Relations } from './${n}/${n}Relations${ext}'`)
94
+ .join('\n');
95
+ const entries = options.modelNames
96
+ .map((n) => ` ${n}: ${n}Relations,`)
97
+ .join('\n');
98
+ return `import type { ModelRelationMap } from './autoIncludePlanner${ext}'
99
+ ${imports}
100
+
101
+ export const relationModels: Record<string, ModelRelationMap> = {
102
+ ${entries}
103
+ }
104
+ `;
105
+ }
106
+ //# 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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"}
@@ -40,8 +40,11 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
40
40
  const ext = (0, importExt_1.importExt)(importStyle);
41
41
  const m = modelName;
42
42
  const supportsProgressive = target === 'express';
43
+ const progressiveTypeImport = supportsProgressive
44
+ ? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n\n`
45
+ : '';
43
46
  if (!guardShapesImport) {
44
- return `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string, any>, TCtx>\n`;
47
+ return progressiveTypeImport + `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string, unknown>, TCtx>\n`;
45
48
  }
46
49
  const shapeOps = Object.values(ROUTER_OP_TO_SHAPE_OP).filter((v, i, a) => a.indexOf(v) === i);
47
50
  const opShapeImports = shapeOps.map((op) => `${m}${capitalize(op)}ShapeInput`).join(',\n ');
@@ -61,13 +64,10 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
61
64
  return ` ${routerOp}?: {\n${lines.join('\n')}\n }`;
62
65
  }).join('\n');
63
66
  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
67
  return (progressiveTypeImport +
68
- `import type {\n ${opShapeImports}\n} from '${guardShapesImport}'\n\n` +
68
+ `import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
69
69
  `export type ${m}RouteConfig<TCtx = unknown> = Omit<\n` +
70
- ` RouteConfig<Record<string, any>, TCtx>,\n` +
70
+ ` RouteConfig<Record<string, unknown>, TCtx>,\n` +
71
71
  ` | ${omitKeys}\n` +
72
72
  ` | 'resolveContext'\n` +
73
73
  `> & {\n` +
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":"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"}
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,
@@ -30,6 +31,7 @@ function generateRouterFunction({ model, enums, guardShapesImport, importStyle,
30
31
  }));
31
32
  return `import express from 'express'
32
33
  import type { Request, Response, NextFunction, RequestHandler } from 'express'
34
+ import { startQueryBuilder } from '../queryBuilder${ext}'
33
35
  import {
34
36
  ${prefix}FindUnique,
35
37
  ${prefix}FindUniqueOrThrow,
@@ -62,6 +64,8 @@ import {
62
64
  runProgressiveEndpoint,
63
65
  runSingleResultSSE,
64
66
  } from '../operationRuntime${ext}'
67
+ import { relationModels } from '../relationModels${ext}'
68
+ import { runAutoIncludeProgressive } from '../autoIncludeRuntime${ext}'
65
69
 
66
70
  ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
67
71
  const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
@@ -69,9 +73,31 @@ const _env = typeof process !== 'undefined' && process.env ? process.env : {} as
69
73
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
70
74
  const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
71
75
 
72
- const defaultOpConfig = {
73
- before: [] as RequestHandler[],
74
- after: [] as RequestHandler[],
76
+ type OperationConfigLike = {
77
+ before?: RequestHandler[]
78
+ after?: RequestHandler[]
79
+ shape?: Record<string, unknown>
80
+ progressive?: Record<string, ProgressiveVariantConfig>
81
+ progressiveStages?: Record<string, ProgressiveStage<unknown>>
82
+ }
83
+
84
+ type ExtendedRequest = Request & {
85
+ prisma?: unknown
86
+ postgres?: unknown
87
+ sqlite?: unknown
88
+ }
89
+
90
+ type LocalsBag = {
91
+ parsedQuery?: Record<string, unknown>
92
+ routeConfig?: { pagination?: OperationContext['paginationConfig'] }
93
+ guardShape?: Record<string, unknown>
94
+ guardCaller?: string
95
+ data?: unknown
96
+ }
97
+
98
+ const defaultOpConfig: OperationConfigLike = {
99
+ before: [],
100
+ after: [],
75
101
  }
76
102
 
77
103
  function normalizePrefix(p: string): string {
@@ -96,6 +122,10 @@ function getQueryBuilderConfig(config: RouteConfig) {
96
122
  return {}
97
123
  }
98
124
 
125
+ function readLocals(res: Response): LocalsBag {
126
+ return res.locals as LocalsBag
127
+ }
128
+
99
129
  export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteConfig<TCtx> = {}) {
100
130
  const router = express.Router()
101
131
  router.use(express.json())
@@ -113,25 +143,34 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
113
143
  if (qbEnabled) {
114
144
  const qbConfig = getQueryBuilderConfig(config)
115
145
  if (qbConfig) {
116
- try { require('../queryBuilder${ext}').startQueryBuilder(qbConfig) } catch (err) { if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err) }
146
+ try {
147
+ startQueryBuilder(qbConfig)
148
+ } catch (err) {
149
+ if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err)
150
+ }
117
151
  }
118
152
  }
119
153
 
120
- const buildContext = (req: Request, res: Response): OperationContext => ({
121
- prisma: (req as any).prisma,
122
- postgres: (req as any).postgres,
123
- sqlite: (req as any).sqlite,
124
- parsedQuery: res.locals.parsedQuery,
125
- body: req.body,
126
- guardShape: res.locals.guardShape,
127
- guardCaller: res.locals.guardCaller,
128
- paginationConfig: res.locals.routeConfig?.pagination,
129
- })
154
+ const buildContext = (req: Request, res: Response): OperationContext => {
155
+ const extReq = req as ExtendedRequest
156
+ const locals = readLocals(res)
157
+ return {
158
+ prisma: extReq.prisma,
159
+ postgres: extReq.postgres,
160
+ sqlite: extReq.sqlite,
161
+ parsedQuery: locals.parsedQuery,
162
+ body: req.body,
163
+ guardShape: locals.guardShape,
164
+ guardCaller: locals.guardCaller,
165
+ paginationConfig: locals.routeConfig?.pagination,
166
+ }
167
+ }
130
168
 
131
169
  const parseQuery: RequestHandler = (req, res, next) => {
132
170
  const rawQuery = req.query
133
171
  if (rawQuery && Object.keys(rawQuery).length > 0) {
134
- res.locals.parsedQuery = parseQueryParams(rawQuery as Record<string, unknown>)
172
+ const parsed = parseQueryParams(rawQuery as Record<string, unknown>) as Record<string, unknown>
173
+ readLocals(res).parsedQuery = parsed
135
174
  }
136
175
  next()
137
176
  }
@@ -140,29 +179,37 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
140
179
  if (!req.body || typeof req.body !== 'object' || Array.isArray(req.body)) {
141
180
  return next({ status: 400, message: 'Request body must be a JSON object' })
142
181
  }
143
- res.locals.parsedQuery = sanitizeKeys(req.body)
182
+ readLocals(res).parsedQuery = sanitizeKeys(req.body as Record<string, unknown>)
144
183
  next()
145
184
  }
146
185
 
147
- const setShape = (opConfig: any): RequestHandler => {
186
+ const setShape = (opConfig: OperationConfigLike): RequestHandler => {
148
187
  return (req, res, next) => {
149
- res.locals.routeConfig = config
150
- const caller = config.guard?.resolveVariant?.(req)
151
- ?? req.get(config.guard?.variantHeader || 'x-api-variant')
152
- ?? undefined
153
- if (caller) res.locals.guardCaller = caller
154
- if (opConfig.shape) res.locals.guardShape = opConfig.shape
188
+ const locals = readLocals(res)
189
+ if (config.pagination) {
190
+ locals.routeConfig = { pagination: config.pagination }
191
+ }
192
+ const headerName = config.guard?.variantHeader || 'x-api-variant'
193
+ const headerValue = req.get(headerName)
194
+ const caller = config.guard?.resolveVariant?.(req) ?? headerValue ?? undefined
195
+ if (caller) locals.guardCaller = caller
196
+ if (opConfig.shape) locals.guardShape = opConfig.shape
155
197
  next()
156
198
  }
157
199
  }
158
200
 
159
- const maybeProgressiveSSE = (opConfig: any, coreFn: (ctx: OperationContext) => Promise<unknown>): RequestHandler => {
201
+ const maybeProgressiveSSE = (
202
+ opConfig: OperationConfigLike,
203
+ coreFn: (ctx: OperationContext) => Promise<unknown>,
204
+ baseOp: string,
205
+ ): RequestHandler => {
160
206
  return async (req, res, next) => {
161
207
  if (res.headersSent || res.writableEnded) return next()
162
208
  if (req.method !== 'GET') return next()
163
209
  if (!acceptsEventStream(req.headers.accept)) return next()
164
210
 
165
- const variant = res.locals.guardCaller as string | undefined
211
+ const locals = readLocals(res)
212
+ const variant = locals.guardCaller
166
213
  const progressiveConfig = variant ? opConfig.progressive?.[variant] : undefined
167
214
 
168
215
  try {
@@ -175,6 +222,38 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
175
222
  return
176
223
  }
177
224
 
225
+ if (progressiveConfig.mode === 'autoInclude') {
226
+ const isSingleRecordRead =
227
+ baseOp === 'findUnique' || baseOp === 'findUniqueOrThrow' ||
228
+ baseOp === 'findFirst' || baseOp === 'findFirstOrThrow'
229
+
230
+ if (!isSingleRecordRead) {
231
+ if (progressiveConfig.fallback === 'error') {
232
+ return next({ status: 400, message: 'autoInclude mode supports only single-record reads' })
233
+ }
234
+ await runSingleResultSSE({
235
+ req,
236
+ res,
237
+ coreQueryFn: () => coreFn(buildContext(req, res)),
238
+ })
239
+ return
240
+ }
241
+
242
+ await runAutoIncludeProgressive({
243
+ req,
244
+ res,
245
+ ctx: buildContext(req, res),
246
+ args: locals.parsedQuery ?? {},
247
+ baseOp: baseOp as 'findUnique' | 'findUniqueOrThrow' | 'findFirst' | 'findFirstOrThrow',
248
+ modelName: '${modelName}',
249
+ delegateKey: '${delegateKey}',
250
+ models: relationModels,
251
+ variantConfig: progressiveConfig,
252
+ coreQueryFn: () => coreFn(buildContext(req, res)),
253
+ })
254
+ return
255
+ }
256
+
178
257
  if (!Array.isArray(progressiveConfig.stages)) {
179
258
  return next({ status: 500, message: 'Progressive endpoint requires stages array' })
180
259
  }
@@ -196,12 +275,13 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
196
275
  req,
197
276
  res,
198
277
  ctx,
199
- prisma: (req as any).prisma,
278
+ prisma: (req as ExtendedRequest).prisma,
200
279
  variant: variant as string,
201
280
  stages: progressiveConfig.stages,
202
281
  stageRegistry,
203
282
  })
204
283
  } catch (err) {
284
+ console.error('[progressive] dispatch error:', err)
205
285
  if (!res.headersSent) {
206
286
  return next({ status: 500, message: 'Internal server error' })
207
287
  }
@@ -210,13 +290,13 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
210
290
  }
211
291
 
212
292
  const respond: RequestHandler = (_req, res) => {
213
- const data = res.locals.data
293
+ const data = readLocals(res).data
214
294
  if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
215
295
  return res.json(transformResult(data))
216
296
  }
217
297
 
218
298
  const respondCreated: RequestHandler = (_req, res) => {
219
- const data = res.locals.data
299
+ const data = readLocals(res).data
220
300
  if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
221
301
  return res.status(201).json(transformResult(data))
222
302
  }
@@ -225,76 +305,76 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
225
305
  const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
226
306
  const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
227
307
  router.get(openapiJsonPath, (_req, res) => {
228
- const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as any, MODEL_ENUMS as any, config, { format: 'json' })
308
+ const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1], MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2], config, { format: 'json' })
229
309
  res.json(spec)
230
310
  })
231
311
  router.get(openapiYamlPath, (_req, res) => {
232
- const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as any, MODEL_ENUMS as any, config, { format: 'yaml' })
312
+ const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1], MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2], config, { format: 'yaml' })
233
313
  res.type('application/yaml').send(spec as string)
234
314
  })
235
315
  }
236
316
 
237
317
  if (config.enableAll || config.findFirst) {
238
- const opConfig: any = config.findFirst || defaultOpConfig
318
+ const opConfig: OperationConfigLike = (config.findFirst as OperationConfigLike | undefined) ?? defaultOpConfig
239
319
  const { before = [], after = [] } = opConfig
240
320
  const path = basePath ? \`\${basePath}/first\` : '/first'
241
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst), ${prefix}FindFirst as RequestHandler, ...after, respond)
321
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst, 'findFirst'), ${prefix}FindFirst as RequestHandler, ...after, respond)
242
322
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirst as RequestHandler, ...after, respond)
243
323
  }
244
324
  if (config.enableAll || config.findFirstOrThrow) {
245
- const opConfig: any = config.findFirstOrThrow || defaultOpConfig
325
+ const opConfig: OperationConfigLike = (config.findFirstOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
246
326
  const { before = [], after = [] } = opConfig
247
327
  const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
248
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
328
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow, 'findFirstOrThrow'), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
249
329
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
250
330
  }
251
331
  if (config.enableAll || config.findManyPaginated) {
252
- const opConfig: any = config.findManyPaginated || defaultOpConfig
332
+ const opConfig: OperationConfigLike = (config.findManyPaginated as OperationConfigLike | undefined) ?? defaultOpConfig
253
333
  const { before = [], after = [] } = opConfig
254
334
  const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
255
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
335
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated, 'findManyPaginated'), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
256
336
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
257
337
  }
258
338
  if (config.enableAll || config.aggregate) {
259
- const opConfig: any = config.aggregate || defaultOpConfig
339
+ const opConfig: OperationConfigLike = (config.aggregate as OperationConfigLike | undefined) ?? defaultOpConfig
260
340
  const { before = [], after = [] } = opConfig
261
341
  const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
262
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate), ${prefix}Aggregate as RequestHandler, ...after, respond)
342
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate, 'aggregate'), ${prefix}Aggregate as RequestHandler, ...after, respond)
263
343
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Aggregate as RequestHandler, ...after, respond)
264
344
  }
265
345
  if (config.enableAll || config.count) {
266
- const opConfig: any = config.count || defaultOpConfig
346
+ const opConfig: OperationConfigLike = (config.count as OperationConfigLike | undefined) ?? defaultOpConfig
267
347
  const { before = [], after = [] } = opConfig
268
348
  const path = basePath ? \`\${basePath}/count\` : '/count'
269
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count), ${prefix}Count as RequestHandler, ...after, respond)
349
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count, 'count'), ${prefix}Count as RequestHandler, ...after, respond)
270
350
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Count as RequestHandler, ...after, respond)
271
351
  }
272
352
  if (config.enableAll || config.groupBy) {
273
- const opConfig: any = config.groupBy || defaultOpConfig
353
+ const opConfig: OperationConfigLike = (config.groupBy as OperationConfigLike | undefined) ?? defaultOpConfig
274
354
  const { before = [], after = [] } = opConfig
275
355
  const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
276
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy), ${prefix}GroupBy as RequestHandler, ...after, respond)
356
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy, 'groupBy'), ${prefix}GroupBy as RequestHandler, ...after, respond)
277
357
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}GroupBy as RequestHandler, ...after, respond)
278
358
  }
279
359
  if (config.enableAll || config.findUniqueOrThrow) {
280
- const opConfig: any = config.findUniqueOrThrow || defaultOpConfig
360
+ const opConfig: OperationConfigLike = (config.findUniqueOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
281
361
  const { before = [], after = [] } = opConfig
282
362
  const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
283
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
363
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow, 'findUniqueOrThrow'), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
284
364
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
285
365
  }
286
366
  if (config.enableAll || config.findUnique) {
287
- const opConfig: any = config.findUnique || defaultOpConfig
367
+ const opConfig: OperationConfigLike = (config.findUnique as OperationConfigLike | undefined) ?? defaultOpConfig
288
368
  const { before = [], after = [] } = opConfig
289
369
  const path = basePath ? \`\${basePath}/unique\` : '/unique'
290
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique), ${prefix}FindUnique as RequestHandler, ...after, respond)
370
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique, 'findUnique'), ${prefix}FindUnique as RequestHandler, ...after, respond)
291
371
  if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUnique as RequestHandler, ...after, respond)
292
372
  }
293
373
  if (config.enableAll || config.findMany) {
294
- const opConfig: any = config.findMany || defaultOpConfig
374
+ const opConfig: OperationConfigLike = (config.findMany as OperationConfigLike | undefined) ?? defaultOpConfig
295
375
  const { before = [], after = [] } = opConfig
296
376
  const path = basePath || '/'
297
- router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany), ${prefix}FindMany as RequestHandler, ...after, respond)
377
+ router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany, 'findMany'), ${prefix}FindMany as RequestHandler, ...after, respond)
298
378
  if (postReadsEnabled) {
299
379
  const postPath = basePath ? \`\${basePath}/read\` : '/read'
300
380
  router.post(postPath, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindMany as RequestHandler, ...after, respond)
@@ -302,63 +382,64 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
302
382
  }
303
383
 
304
384
  if (config.enableAll || config.createManyAndReturn) {
305
- const opConfig: any = config.createManyAndReturn || defaultOpConfig
385
+ const opConfig: OperationConfigLike = (config.createManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
306
386
  const { before = [], after = [] } = opConfig
307
387
  const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
308
388
  router.post(path, setShape(opConfig), ...before, ${prefix}CreateManyAndReturn as RequestHandler, ...after, respondCreated)
309
389
  }
310
390
  if (config.enableAll || config.createMany) {
311
- const opConfig: any = config.createMany || defaultOpConfig
391
+ const opConfig: OperationConfigLike = (config.createMany as OperationConfigLike | undefined) ?? defaultOpConfig
312
392
  const { before = [], after = [] } = opConfig
313
393
  const path = basePath ? \`\${basePath}/many\` : '/many'
314
394
  router.post(path, setShape(opConfig), ...before, ${prefix}CreateMany as RequestHandler, ...after, respondCreated)
315
395
  }
316
396
  if (config.enableAll || config.create) {
317
- const opConfig: any = config.create || defaultOpConfig
397
+ const opConfig: OperationConfigLike = (config.create as OperationConfigLike | undefined) ?? defaultOpConfig
318
398
  const { before = [], after = [] } = opConfig
319
399
  const path = basePath || '/'
320
400
  router.post(path, setShape(opConfig), ...before, ${prefix}Create as RequestHandler, ...after, respondCreated)
321
401
  }
322
402
  if (config.enableAll || config.updateManyAndReturn) {
323
- const opConfig: any = config.updateManyAndReturn || defaultOpConfig
403
+ const opConfig: OperationConfigLike = (config.updateManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
324
404
  const { before = [], after = [] } = opConfig
325
405
  const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
326
406
  router.put(path, setShape(opConfig), ...before, ${prefix}UpdateManyAndReturn as RequestHandler, ...after, respond)
327
407
  }
328
408
  if (config.enableAll || config.updateMany) {
329
- const opConfig: any = config.updateMany || defaultOpConfig
409
+ const opConfig: OperationConfigLike = (config.updateMany as OperationConfigLike | undefined) ?? defaultOpConfig
330
410
  const { before = [], after = [] } = opConfig
331
411
  const path = basePath ? \`\${basePath}/many\` : '/many'
332
412
  router.put(path, setShape(opConfig), ...before, ${prefix}UpdateMany as RequestHandler, ...after, respond)
333
413
  }
334
414
  if (config.enableAll || config.update) {
335
- const opConfig: any = config.update || defaultOpConfig
415
+ const opConfig: OperationConfigLike = (config.update as OperationConfigLike | undefined) ?? defaultOpConfig
336
416
  const { before = [], after = [] } = opConfig
337
417
  const path = basePath || '/'
338
418
  router.put(path, setShape(opConfig), ...before, ${prefix}Update as RequestHandler, ...after, respond)
339
419
  }
340
420
  if (config.enableAll || config.upsert) {
341
- const opConfig: any = config.upsert || defaultOpConfig
421
+ const opConfig: OperationConfigLike = (config.upsert as OperationConfigLike | undefined) ?? defaultOpConfig
342
422
  const { before = [], after = [] } = opConfig
343
423
  const path = basePath || '/'
344
424
  router.patch(path, setShape(opConfig), ...before, ${prefix}Upsert as RequestHandler, ...after, respond)
345
425
  }
346
426
  if (config.enableAll || config.deleteMany) {
347
- const opConfig: any = config.deleteMany || defaultOpConfig
427
+ const opConfig: OperationConfigLike = (config.deleteMany as OperationConfigLike | undefined) ?? defaultOpConfig
348
428
  const { before = [], after = [] } = opConfig
349
429
  const path = basePath ? \`\${basePath}/many\` : '/many'
350
430
  router.delete(path, setShape(opConfig), ...before, ${prefix}DeleteMany as RequestHandler, ...after, respond)
351
431
  }
352
432
  if (config.enableAll || config.delete) {
353
- const opConfig: any = config.delete || defaultOpConfig
433
+ const opConfig: OperationConfigLike = (config.delete as OperationConfigLike | undefined) ?? defaultOpConfig
354
434
  const { before = [], after = [] } = opConfig
355
435
  const path = basePath || '/'
356
436
  router.delete(path, setShape(opConfig), ...before, ${prefix}Delete as RequestHandler, ...after, respond)
357
437
  }
358
438
 
359
- router.use((err: any, _req: Request, res: Response, next: NextFunction) => {
360
- const status = typeof err.status === 'number' ? err.status : 500
361
- const message = err.message || 'Internal server error'
439
+ router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
440
+ const e = err as { status?: number; message?: string }
441
+ const status = typeof e.status === 'number' ? e.status : 500
442
+ const message = e.message || 'Internal server error'
362
443
  if (!res.headersSent) return res.status(status).json({ message })
363
444
  next(err)
364
445
  })
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}