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.
Files changed (67) hide show
  1. package/README.md +150 -14
  2. package/dist/client/encodeQueryParams.js +19 -23
  3. package/dist/client/encodeQueryParams.js.map +1 -1
  4. package/dist/copy/operationDefinitions.d.ts +37 -0
  5. package/dist/copy/operationDefinitions.js +412 -0
  6. package/dist/copy/operationDefinitions.js.map +1 -0
  7. package/dist/generators/generateFastifyHandler.js +10 -41
  8. package/dist/generators/generateFastifyHandler.js.map +1 -1
  9. package/dist/generators/generateHonoHandler.js +10 -41
  10. package/dist/generators/generateHonoHandler.js.map +1 -1
  11. package/dist/generators/generateModelMetadata.d.ts +8 -0
  12. package/dist/generators/generateModelMetadata.js +77 -0
  13. package/dist/generators/generateModelMetadata.js.map +1 -0
  14. package/dist/generators/generateOperationCore.js +20 -30
  15. package/dist/generators/generateOperationCore.js.map +1 -1
  16. package/dist/generators/generateQueryBuilderHelper.js +1 -1
  17. package/dist/generators/generateQueryBuilderHelper.js.map +1 -1
  18. package/dist/generators/generateRouteConfigType.js +11 -57
  19. package/dist/generators/generateRouteConfigType.js.map +1 -1
  20. package/dist/generators/generateRouter.js +64 -177
  21. package/dist/generators/generateRouter.js.map +1 -1
  22. package/dist/generators/generateRouterFastify.js +59 -169
  23. package/dist/generators/generateRouterFastify.js.map +1 -1
  24. package/dist/generators/generateRouterHono.js +52 -152
  25. package/dist/generators/generateRouterHono.js.map +1 -1
  26. package/dist/generators/generateUnifiedHandler.js +7 -30
  27. package/dist/generators/generateUnifiedHandler.js.map +1 -1
  28. package/dist/generators/generateUnifiedScalarUI.js +9 -74
  29. package/dist/generators/generateUnifiedScalarUI.js.map +1 -1
  30. package/dist/index.js +11 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/utils/copyFiles.js +7 -0
  33. package/dist/utils/copyFiles.js.map +1 -1
  34. package/dist/utils/writeFileSafely.js +5 -12
  35. package/dist/utils/writeFileSafely.js.map +1 -1
  36. package/package.json +12 -2
  37. package/src/client/encodeQueryParams.ts +23 -36
  38. package/src/copy/autoIncludePlanner.ts +14 -23
  39. package/src/copy/autoIncludePlannerGuarded.ts +477 -0
  40. package/src/copy/autoIncludeRuntime.ts +269 -261
  41. package/src/copy/autoIncludeRuntimeGuarded.ts +379 -0
  42. package/src/copy/buildModelOpenApi.ts +248 -628
  43. package/src/copy/concurrency.ts +20 -0
  44. package/src/copy/docsRenderer.ts +63 -333
  45. package/src/copy/errorMapper.ts +126 -0
  46. package/src/copy/guardHelpers.ts +56 -0
  47. package/src/copy/materializedCount.ts +68 -0
  48. package/src/copy/materializedRouter.ts +33 -29
  49. package/src/copy/operationDefinitions.ts +359 -35
  50. package/src/copy/operationRuntime.ts +11 -605
  51. package/src/copy/pagination.ts +151 -0
  52. package/src/copy/scalarTypes.ts +2 -0
  53. package/src/copy/sse.ts +296 -0
  54. package/src/generators/generateFastifyHandler.ts +13 -47
  55. package/src/generators/generateHonoHandler.ts +13 -47
  56. package/src/generators/generateModelMetadata.ts +92 -0
  57. package/src/generators/generateOperationCore.ts +19 -32
  58. package/src/generators/generateQueryBuilderHelper.ts +1 -1
  59. package/src/generators/generateRouteConfigType.ts +9 -60
  60. package/src/generators/generateRouter.ts +88 -180
  61. package/src/generators/generateRouterFastify.ts +65 -172
  62. package/src/generators/generateRouterHono.ts +58 -155
  63. package/src/generators/generateUnifiedHandler.ts +8 -33
  64. package/src/generators/generateUnifiedScalarUI.ts +9 -91
  65. package/src/index.ts +13 -1
  66. package/src/utils/copyFiles.ts +7 -0
  67. 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 === 'regular') {
7
- return { mode: 'normal', method: defaultMethod };
6
+ if (strategy === 'throwOnNonReturning' && (name === 'createMany' || name === 'updateMany')) {
7
+ return { throw: true, method: defaultMethod };
8
8
  }
9
- if (strategy === 'throwOnNonReturning') {
10
- if (name === 'createMany' || name === 'updateMany') {
11
- return { mode: 'throw' };
12
- }
13
- return { mode: 'normal', method: defaultMethod };
9
+ if (strategy === 'forceReturn') {
10
+ if (name === 'createMany')
11
+ return { method: 'createManyAndReturn' };
12
+ if (name === 'updateMany')
13
+ return { method: 'updateManyAndReturn' };
14
14
  }
15
- if (name === 'createMany')
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.mode === 'throw') {
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
- let cursor = 0
226
- const workerCount = Math.min(CONCURRENCY, items.length)
227
- const workers = Array.from({ length: workerCount }, async () => {
228
- for (;;) {
229
- const i = cursor++
230
- if (i >= items.length) return
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
- await Promise.all(workers)
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":"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"}
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
- : "require('path').resolve(process.cwd(), 'prisma/schema.prisma')";
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,gEAAgE,CAAA;IAEpE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA+DsC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FxD,CAAA;AACD,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 strings_1 = require("../utils/strings");
6
- const ROUTER_OPERATIONS = [
7
- 'findUnique',
8
- 'findUniqueOrThrow',
9
- 'findFirst',
10
- 'findFirstOrThrow',
11
- 'findMany',
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 = Object.values(ROUTER_OP_TO_SHAPE_OP).filter((v, i, a) => a.indexOf(v) === i);
60
+ const shapeOps = Array.from(new Set(ROUTER_OPERATIONS));
106
61
  const opShapeImports = shapeOps
107
- .map((op) => `${m}${(0, strings_1.capitalize)(op)}ShapeInput`)
62
+ .map((op) => `${m}${capitalize(op)}ShapeInput`)
108
63
  .join(',\n ');
109
64
  const overrides = ROUTER_OPERATIONS.map((routerOp) => {
110
- const shapeOp = ROUTER_OP_TO_SHAPE_OP[routerOp];
111
- const c = (0, strings_1.capitalize)(shapeOp);
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":"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"}
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 fieldsMeta = model.fields.map((f) => ({
13
- name: f.name,
14
- kind: f.kind,
15
- type: f.type,
16
- isList: f.isList,
17
- isRequired: f.isRequired,
18
- hasDefaultValue: f.hasDefaultValue,
19
- isUpdatedAt: f.isUpdatedAt ?? false,
20
- documentation: f.documentation,
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
- ${modelName}FindUnique,
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
- mergePaginationConfig,
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: WRITE_STRATEGY },
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: WRITE_STRATEGY },
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
- if (isEnabled(config.findFirst)) {
377
- const opConfig: OperationConfigLike = (config.findFirst as OperationConfigLike | undefined) ?? defaultOpConfig
378
- const { before = [], after = [] } = opConfig
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
- let httpError: HttpError
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
  })