prisma-generator-express 1.66.0 → 1.67.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 (102) hide show
  1. package/README.md +37 -3476
  2. package/dist/client/encodeQueryParams.js +3 -1
  3. package/dist/client/encodeQueryParams.js.map +1 -1
  4. package/dist/copy/misc.d.ts +1 -0
  5. package/dist/copy/misc.js +14 -0
  6. package/dist/copy/misc.js.map +1 -1
  7. package/dist/copy/operationDefinitions.js +69 -6
  8. package/dist/copy/operationDefinitions.js.map +1 -1
  9. package/dist/generators/generateFastifyHandler.d.ts +2 -2
  10. package/dist/generators/generateFastifyHandler.js +15 -5
  11. package/dist/generators/generateFastifyHandler.js.map +1 -1
  12. package/dist/generators/generateHonoHandler.d.ts +2 -2
  13. package/dist/generators/generateHonoHandler.js +12 -5
  14. package/dist/generators/generateHonoHandler.js.map +1 -1
  15. package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
  16. package/dist/generators/generateImportPrismaStatement.js +6 -0
  17. package/dist/generators/generateImportPrismaStatement.js.map +1 -1
  18. package/dist/generators/generateModelMetadata.js +20 -10
  19. package/dist/generators/generateModelMetadata.js.map +1 -1
  20. package/dist/generators/generateOperationCore.d.ts +3 -3
  21. package/dist/generators/generateOperationCore.js +51 -16
  22. package/dist/generators/generateOperationCore.js.map +1 -1
  23. package/dist/generators/generateRelationMeta.js +2 -2
  24. package/dist/generators/generateRelationMeta.js.map +1 -1
  25. package/dist/generators/generateRouteConfigType.d.ts +2 -2
  26. package/dist/generators/generateRouteConfigType.js +29 -11
  27. package/dist/generators/generateRouteConfigType.js.map +1 -1
  28. package/dist/generators/generateRouter.d.ts +7 -4
  29. package/dist/generators/generateRouter.js +107 -14
  30. package/dist/generators/generateRouter.js.map +1 -1
  31. package/dist/generators/generateRouterFastify.d.ts +7 -4
  32. package/dist/generators/generateRouterFastify.js +56 -28
  33. package/dist/generators/generateRouterFastify.js.map +1 -1
  34. package/dist/generators/generateRouterHono.d.ts +7 -4
  35. package/dist/generators/generateRouterHono.js +36 -23
  36. package/dist/generators/generateRouterHono.js.map +1 -1
  37. package/dist/generators/generateUnifiedDocs.d.ts +1 -1
  38. package/dist/generators/generateUnifiedDocs.js +15 -8
  39. package/dist/generators/generateUnifiedDocs.js.map +1 -1
  40. package/dist/generators/generateUnifiedHandler.d.ts +2 -2
  41. package/dist/generators/generateUnifiedHandler.js +11 -3
  42. package/dist/generators/generateUnifiedHandler.js.map +1 -1
  43. package/dist/guardOptions.js +12 -7
  44. package/dist/guardOptions.js.map +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +22 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/utils/copyFiles.js +22 -6
  49. package/dist/utils/copyFiles.js.map +1 -1
  50. package/dist/utils/importExt.d.ts +1 -1
  51. package/dist/utils/pathCasing.d.ts +4 -0
  52. package/dist/utils/pathCasing.js +40 -0
  53. package/dist/utils/pathCasing.js.map +1 -0
  54. package/dist/utils/resolveImportStyle.js +13 -5
  55. package/dist/utils/resolveImportStyle.js.map +1 -1
  56. package/dist/utils/writeFileSafely.js.map +1 -1
  57. package/package.json +5 -3
  58. package/src/bin.ts +1 -1
  59. package/src/client/encodeQueryParams.ts +39 -35
  60. package/src/constants.ts +1 -1
  61. package/src/copy/autoIncludePlanner.ts +93 -27
  62. package/src/copy/autoIncludePlannerGuarded.ts +171 -48
  63. package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
  64. package/src/copy/buildModelOpenApi.ts +153 -50
  65. package/src/copy/concurrency.ts +10 -8
  66. package/src/copy/errorMapper.ts +68 -19
  67. package/src/copy/guardHelpers.ts +30 -9
  68. package/src/copy/materializedCount.ts +17 -5
  69. package/src/copy/misc.ts +88 -68
  70. package/src/copy/ndjson.ts +72 -0
  71. package/src/copy/operationDefinitions.ts +99 -21
  72. package/src/copy/operationRuntime.ts +100 -12
  73. package/src/copy/pagination.ts +25 -11
  74. package/src/copy/parseQueryParams.ts +47 -48
  75. package/src/copy/projectionDefaults.ts +6 -4
  76. package/src/copy/routeConfig.express.ts +16 -4
  77. package/src/copy/routeConfig.fastify.ts +16 -2
  78. package/src/copy/routeConfig.hono.ts +12 -9
  79. package/src/copy/routeConfig.ts +174 -39
  80. package/src/copy/scalarTypes.ts +7 -2
  81. package/src/copy/sse.ts +72 -19
  82. package/src/generators/generateFastifyHandler.ts +24 -13
  83. package/src/generators/generateHonoHandler.ts +21 -13
  84. package/src/generators/generateImportPrismaStatement.ts +93 -81
  85. package/src/generators/generateModelMetadata.ts +24 -12
  86. package/src/generators/generateOperationCore.ts +81 -33
  87. package/src/generators/generateRelationMeta.ts +23 -11
  88. package/src/generators/generateRouteConfigType.ts +39 -13
  89. package/src/generators/generateRouter.ts +114 -17
  90. package/src/generators/generateRouterFastify.ts +67 -31
  91. package/src/generators/generateRouterHono.ts +60 -30
  92. package/src/generators/generateUnifiedDocs.ts +29 -8
  93. package/src/generators/generateUnifiedHandler.ts +16 -8
  94. package/src/generators/generateUnifiedScalarUI.ts +1 -1
  95. package/src/guardOptions.ts +105 -92
  96. package/src/index.ts +46 -4
  97. package/src/utils/copyFiles.ts +199 -168
  98. package/src/utils/importExt.ts +2 -2
  99. package/src/utils/pathCasing.ts +42 -0
  100. package/src/utils/resolveImportStyle.ts +37 -15
  101. package/src/utils/strings.ts +2 -2
  102. package/src/utils/writeFileSafely.ts +6 -2
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateModelCore = generateModelCore;
4
+ const operationDefinitions_1 = require("../copy/operationDefinitions");
4
5
  const importExt_1 = require("../utils/importExt");
5
6
  function decideWriteOp(name, defaultMethod, strategy) {
6
- if (strategy === 'throwOnNonReturning' && (name === 'createMany' || name === 'updateMany')) {
7
+ if (strategy === 'throwOnNonReturning' &&
8
+ (name === 'createMany' || name === 'updateMany')) {
7
9
  return { throw: true, method: defaultMethod };
8
10
  }
9
11
  if (strategy === 'forceReturn') {
@@ -56,12 +58,17 @@ function generateModelCore(options) {
56
58
  const writeStrategy = options.writeStrategy;
57
59
  const paginatedBody = renderPaginatedBody(modelNameLower, options.findManyPaginatedMode);
58
60
  const standardReadOps = [
59
- 'findFirst', 'findUnique', 'findUniqueOrThrow', 'findFirstOrThrow',
60
- 'count', 'aggregate', 'groupBy',
61
+ 'findFirst',
62
+ 'findUnique',
63
+ 'findUniqueOrThrow',
64
+ 'findFirstOrThrow',
65
+ 'count',
66
+ 'aggregate',
67
+ 'groupBy',
61
68
  ];
62
69
  const standardReadHandlers = standardReadOps
63
70
  .map((op) => `
64
- export async function ${op}(ctx: OperationContext): Promise<unknown> {
71
+ async function default_${op}(ctx: OperationContext): Promise<unknown> {
65
72
  const query = ctx.parsedQuery || {}
66
73
  const extended = await getExtendedClient(ctx)
67
74
  const delegate = getDelegate(extended, '${modelNameLower}')
@@ -75,19 +82,36 @@ export async function ${op}(ctx: OperationContext): Promise<unknown> {
75
82
  const writeOps = [
76
83
  { name: 'create', method: 'create', requiredFields: ['data'] },
77
84
  { name: 'createMany', method: 'createMany', requiredFields: ['data'] },
78
- { name: 'createManyAndReturn', method: 'createManyAndReturn', requiredFields: ['data'] },
85
+ {
86
+ name: 'createManyAndReturn',
87
+ method: 'createManyAndReturn',
88
+ requiredFields: ['data'],
89
+ },
79
90
  { name: 'update', method: 'update', requiredFields: ['where', 'data'] },
80
- { name: 'updateMany', method: 'updateMany', requiredFields: ['where', 'data'] },
81
- { name: 'updateManyAndReturn', method: 'updateManyAndReturn', requiredFields: ['where', 'data'] },
91
+ {
92
+ name: 'updateMany',
93
+ method: 'updateMany',
94
+ requiredFields: ['where', 'data'],
95
+ },
96
+ {
97
+ name: 'updateManyAndReturn',
98
+ method: 'updateManyAndReturn',
99
+ requiredFields: ['where', 'data'],
100
+ },
82
101
  { name: 'deleteUnique', method: 'delete', requiredFields: ['where'] },
83
102
  { name: 'deleteMany', method: 'deleteMany', requiredFields: ['where'] },
84
- { name: 'upsert', method: 'upsert', requiredFields: ['where', 'create', 'update'] },
103
+ {
104
+ name: 'upsert',
105
+ method: 'upsert',
106
+ requiredFields: ['where', 'create', 'update'],
107
+ },
85
108
  ];
86
- const writeHandlers = writeOps.map((op) => {
109
+ const writeHandlers = writeOps
110
+ .map((op) => {
87
111
  const decision = decideWriteOp(op.name, op.method, writeStrategy);
88
112
  if (decision.throw) {
89
113
  return `
90
- export async function ${op.name}(_ctx: OperationContext): Promise<unknown> {
114
+ async function default_${op.name}(_ctx: OperationContext): Promise<unknown> {
91
115
  throw new HttpError(501, '${op.name} is disabled by writeStrategy="${writeStrategy}"')
92
116
  }`;
93
117
  }
@@ -96,7 +120,7 @@ export async function ${op.name}(_ctx: OperationContext): Promise<unknown> {
96
120
  .map((field) => ` requireBodyField(body, '${field}')`)
97
121
  .join('\n');
98
122
  return `
99
- export async function ${op.name}(ctx: OperationContext): Promise<unknown> {
123
+ async function default_${op.name}(ctx: OperationContext): Promise<unknown> {
100
124
  const body = validateBody(ctx.body)
101
125
  ${validationLines}
102
126
  const extended = await getExtendedClient(ctx)
@@ -107,10 +131,20 @@ ${validationLines}
107
131
  }
108
132
  return delegate.${method}(body)
109
133
  }`;
110
- }).join('\n');
134
+ })
135
+ .join('\n');
136
+ const wrappers = operationDefinitions_1.OPERATION_METADATA.filter((op) => op.name !== 'updateEach')
137
+ .map((op) => `
138
+ export async function ${op.coreName}(ctx: OperationContext): Promise<${op.name === 'findManyPaginated' ? '{ data: unknown[]; total: number; hasMore: boolean }' : 'unknown'}> {
139
+ const input = ${op.kind === 'read' ? 'ctx.parsedQuery || {}' : 'validateBody(ctx.body)'}
140
+ ${op.requiredBodyFields.map((field) => ` requireBodyField(input, '${field}')`).join('\n')}
141
+ return executeOperationOverride(ctx, '${modelNameLower}', '${op.name}', input, () => default_${op.coreName}(ctx))
142
+ }`)
143
+ .join('\n');
111
144
  return `import {
112
- OperationContext,
113
- PrismaClientLike,
145
+ type OperationContext,
146
+ executeOperationOverride,
147
+ type PrismaClientLike,
114
148
  getExtendedClient,
115
149
  getDelegate,
116
150
  validateBody,
@@ -121,7 +155,7 @@ import { applyPaginationLimits, countForPagination } from '../pagination${ext}'
121
155
  import { assertGuard } from '../guardHelpers${ext}'
122
156
  import { mapLimited } from '../concurrency${ext}'
123
157
 
124
- export async function findMany(ctx: OperationContext): Promise<unknown> {
158
+ async function default_findMany(ctx: OperationContext): Promise<unknown> {
125
159
  const rawQuery = ctx.parsedQuery || {}
126
160
  const query = applyPaginationLimits(rawQuery, ctx.paginationConfig, !!ctx.guardShape)
127
161
  const extended = await getExtendedClient(ctx)
@@ -132,10 +166,11 @@ export async function findMany(ctx: OperationContext): Promise<unknown> {
132
166
  }
133
167
  return delegate.findMany(query)
134
168
  }
169
+ ${wrappers}
135
170
  ${standardReadHandlers}
136
171
  ${writeHandlers}
137
172
 
138
- export async function findManyPaginated(
173
+ async function default_findManyPaginated(
139
174
  ctx: OperationContext,
140
175
  ): Promise<{ data: unknown[]; total: number; hasMore: boolean }> {
141
176
  const rawQuery = ctx.parsedQuery || {}
@@ -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":";;AAyEA,8CAqOC;AA9SD,uEAAiE;AAGjE,kDAA8C;AAY9C,SAAS,aAAa,CACpB,IAAY,EACZ,aAAqB,EACrB,QAAuB;IAEvB,IACE,QAAQ,KAAK,qBAAqB;QAClC,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,CAAC,EAChD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IAC/C,CAAC;IACD,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;QACnE,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;AAClC,CAAC;AAED,SAAS,mBAAmB,CAC1B,cAAsB,EACtB,IAA2B;IAE3B,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;;;;;;;0CAO+B,cAAc;;;;;;;;;;;;yBAY/B,CAAA;IACvB,CAAC;IAED,OAAO;4CACmC,cAAc;;;;;;;;;gBAS1C,CAAA;AAChB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAyB;IACzD,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;IACpC,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CACvC,cAAc,EACd,OAAO,CAAC,qBAAqB,CAC9B,CAAA;IAED,MAAM,eAAe,GAAG;QACtB,WAAW;QACX,YAAY;QACZ,mBAAmB;QACnB,kBAAkB;QAClB,OAAO;QACP,WAAW;QACX,SAAS;KACV,CAAA;IAED,MAAM,oBAAoB,GAAG,eAAe;SACzC,GAAG,CACF,CAAC,EAAE,EAAE,EAAE,CAAC;yBACW,EAAE;;;4CAGiB,cAAc;;;6DAGG,EAAE;;oBAE3C,EAAE;EACpB,CACG;SACA,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACtE;YACE,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,qBAAqB;YAC7B,cAAc,EAAE,CAAC,MAAM,CAAC;SACzB;QACD,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACvE;YACE,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;SAClC;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,qBAAqB;YAC7B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;SAClC;QACD,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACrE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACvE;YACE,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;SAC9C;KACF,CAAA;IAED,MAAM,aAAa,GAAG,QAAQ;SAC3B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAEjE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;yBACU,EAAE,CAAC,IAAI;8BACF,EAAE,CAAC,IAAI,kCAAkC,aAAa;EAClF,CAAA;QACI,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;QAC9B,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc;aACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,KAAK,IAAI,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,OAAO;yBACY,EAAE,CAAC,IAAI;;EAE9B,eAAe;;4CAE2B,cAAc;;;6DAGG,MAAM;;oBAE/C,MAAM;EACxB,CAAA;IACE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG,yCAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC;SACzE,GAAG,CACF,CAAC,EAAE,EAAE,EAAE,CAAC;wBACU,EAAE,CAAC,QAAQ,oCAAoC,EAAE,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,SAAS;kBACzJ,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB;EACvF,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,8BAA8B,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;0CAChD,cAAc,OAAO,EAAE,CAAC,IAAI,2BAA2B,EAAE,CAAC,QAAQ;EAC1G,CACG;SACA,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;;;;6BAQoB,GAAG;qDACqB,GAAG;0EACkB,GAAG;8CAC/B,GAAG;4CACL,GAAG;;;;;;4CAMH,cAAc;;;;;;;EAOxD,QAAQ;EACR,oBAAoB;EACpB,aAAa;;;;;;;;;;;;;;;EAeb,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAwD6B,cAAc;;;;;;;;;4CASd,cAAc;;;;;;;;;;;;;;;CAezD,CAAA;AACD,CAAC"}
@@ -10,10 +10,10 @@ function findOppositeField(models, targetModelName, relationName, selfModelName,
10
10
  if (!target)
11
11
  return null;
12
12
  const isSelfRelation = targetModelName === selfModelName;
13
- return target.fields.find((f) => f.kind === 'object' &&
13
+ return (target.fields.find((f) => f.kind === 'object' &&
14
14
  f.relationName === relationName &&
15
15
  f.type === selfModelName &&
16
- !(isSelfRelation && f.name === selfFieldName)) || null;
16
+ !(isSelfRelation && f.name === selfFieldName)) || null);
17
17
  }
18
18
  function computeRelation(field, selfModelName, models) {
19
19
  const selfFrom = (field.relationFromFields ?? []);
@@ -1 +1 @@
1
- {"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { ImportStyle } from '../utils/resolveImportStyle';
1
+ import type { ImportStyle } from '../utils/resolveImportStyle';
2
2
  import type { Target } from '../constants';
3
- export declare function generateRouteConfigType(modelName: string, hookHandlerType: string, guardShapesImport: string | null, importStyle: ImportStyle, target: Target): string;
3
+ export declare function generateRouteConfigType(modelName: string, hookHandlerType: string, guardShapesImport: string | null, importStyle: ImportStyle, target: Target, clientImport?: string): string;
@@ -3,9 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateRouteConfigType = generateRouteConfigType;
4
4
  const importExt_1 = require("../utils/importExt");
5
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);
6
+ const ROUTER_OPERATIONS = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.name !== 'updateEach').map((m) => m.name);
9
7
  function capitalize(str) {
10
8
  return str.charAt(0).toUpperCase() + str.slice(1);
11
9
  }
@@ -13,14 +11,14 @@ function requestTypeFor(target) {
13
11
  if (target === 'fastify')
14
12
  return `import('fastify').FastifyRequest`;
15
13
  if (target === 'hono')
16
- return `import('hono').Context<TEnv>`;
14
+ return `import('hono').Context<GeneratedHonoEnv<TEnv>>`;
17
15
  return `import('express').Request`;
18
16
  }
19
17
  function configGenericsFor(target) {
20
18
  if (target === 'hono') {
21
- return `<TCtx = unknown, TPrisma = any, TEnv extends { Variables: Record<string, unknown> } = { Variables: Record<string, unknown> }>`;
19
+ return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike, TEnv extends { Variables: Record<string, unknown> } = { Variables: Record<string, unknown> }>`;
22
20
  }
23
- return `<TCtx = unknown, TPrisma = any>`;
21
+ return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>`;
24
22
  }
25
23
  function routeConfigBaseFor(target) {
26
24
  if (target === 'hono') {
@@ -41,7 +39,7 @@ function afterHookRef(target, hookHandlerType) {
41
39
  return `HonoAfterHook<TEnv>`;
42
40
  return hookHandlerType;
43
41
  }
44
- function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target) {
42
+ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target, clientImport) {
45
43
  const ext = (0, importExt_1.importExt)(importStyle);
46
44
  const m = modelName;
47
45
  const supportsProgressive = target === 'express';
@@ -50,12 +48,29 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
50
48
  const beforeRef = beforeHookRef(target, hookHandlerType);
51
49
  const afterRef = afterHookRef(target, hookHandlerType);
52
50
  const requestType = requestTypeFor(target);
53
- const progressiveTypeImport = supportsProgressive
51
+ const clientPath = clientImport ? `${clientImport}${ext}` : '@prisma/client';
52
+ const delegate = `${m.charAt(0).toLowerCase() + m.slice(1)}`;
53
+ const modelDelegate = clientImport
54
+ ? `PrismaClient['${delegate}']`
55
+ : `(TPrisma extends Record<'${delegate}', infer D> ? D : never)`;
56
+ const overrideImports = `import type { Prisma${clientImport ? ', PrismaClient' : ''} } from '${clientPath}'\nimport type { OperationOverride } from '../operationRuntime${ext}'\n`;
57
+ const overrideType = (op) => {
58
+ const method = op === 'findManyPaginated' ? 'findMany' : op;
59
+ const args = `Prisma.Args<${modelDelegate}, '${method}'>`;
60
+ const result = `Prisma.Result<${modelDelegate}, ${args}, '${method}'>`;
61
+ const output = op === 'findManyPaginated'
62
+ ? `{ data: ${result}; total: number; hasMore: boolean }`
63
+ : result;
64
+ const methods = op === 'findManyPaginated' ? "'findMany' | 'count'" : `'${method}'`;
65
+ return `OperationOverride<${args}, ${output}, TCtx, Readonly<{ ${delegate}: Pick<${modelDelegate}, Extract<keyof ${modelDelegate}, ${methods}>> }>>`;
66
+ };
67
+ const typeImports = supportsProgressive
54
68
  ? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n`
55
69
  : '';
56
70
  if (!guardShapesImport) {
57
- return (progressiveTypeImport +
58
- `export type ${m}RouteConfig${generics} = ${baseConfig}\n`);
71
+ return (overrideImports +
72
+ typeImports +
73
+ `export type ${m}RouteConfig${generics} = Omit<${baseConfig}, ${ROUTER_OPERATIONS.map((op) => `'${op}'`).join(' | ')}> & {\n${ROUTER_OPERATIONS.map((op) => ` ${op}?: (Omit<Exclude<${baseConfig}['${op}'], false | undefined>, 'override'> & { override?: ${overrideType(op)} }) | false`).join('\n')}\n}\n`);
59
74
  }
60
75
  const shapeOps = Array.from(new Set(ROUTER_OPERATIONS));
61
76
  const opShapeImports = shapeOps
@@ -76,6 +91,8 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
76
91
  const c = capitalize(routerOp);
77
92
  const isRead = operationDefinitions_1.READ_OPERATION_NAMES.has(routerOp);
78
93
  const commonLines = [
94
+ ` override?: ${overrideType(routerOp)}`,
95
+ ` authorize?: ${beforeRef}`,
79
96
  ` before?: ${beforeRef}[]`,
80
97
  ` after?: ${afterRef}[]`,
81
98
  ` pagination?: Partial<PaginationConfig>`,
@@ -97,7 +114,8 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
97
114
  ` )) | false`);
98
115
  }).join('\n');
99
116
  const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
100
- return (progressiveTypeImport +
117
+ return (overrideImports +
118
+ typeImports +
101
119
  `import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
102
120
  `${shapeOrFnAliases}\n\n` +
103
121
  `export type ${m}RouteConfig${generics} = Omit<\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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"}
@@ -1,12 +1,15 @@
1
- import { DMMF } from '@prisma/generator-helper';
2
- import { ImportStyle } from '../utils/resolveImportStyle';
3
- import { WriteStrategy, FindManyPaginatedMode } from '../constants';
4
- export declare function generateRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, }: {
1
+ import type { DMMF } from '@prisma/generator-helper';
2
+ import type { ImportStyle } from '../utils/resolveImportStyle';
3
+ import type { WriteStrategy, FindManyPaginatedMode } from '../constants';
4
+ import { type PathCase } from '../utils/pathCasing';
5
+ export declare function generateRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }: {
5
6
  model: DMMF.Model;
6
7
  enums: DMMF.DatamodelEnum[];
7
8
  guardShapesImport: string | null;
9
+ clientImport?: string;
8
10
  importStyle: ImportStyle;
9
11
  writeStrategy: WriteStrategy;
10
12
  findManyPaginatedMode: FindManyPaginatedMode;
11
13
  dropGuard: boolean;
14
+ pathCase: PathCase;
12
15
  }): string;
@@ -3,6 +3,7 @@ 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 pathCasing_1 = require("../utils/pathCasing");
6
7
  const operationDefinitions_1 = require("../copy/operationDefinitions");
7
8
  function pathExpr(basePath, suffix) {
8
9
  if (!suffix)
@@ -50,10 +51,11 @@ function emitReadOp(meta, modelName) {
50
51
  const pathValue = pathExpr('basePath', meta.pathSuffix);
51
52
  const opKind = opKindFor(meta.name);
52
53
  const postReadBlock = meta.supportsPostRead
53
- ? ` if (postReadsEnabled) {
54
+ ? ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) {
54
55
  const postPath = ${meta.name === 'findMany' ? "basePath ? `${basePath}/read` : '/read'" : `path`}
55
56
  router.post(
56
57
  postPath,
58
+ ...(opConfig.authorize ? [opConfig.authorize] : []),
57
59
  parseBodyAsQuery,
58
60
  setShape(opConfig, '${opKind}'),
59
61
  ...opConfig.operationBefore,
@@ -71,12 +73,14 @@ function emitReadOp(meta, modelName) {
71
73
  const path = ${pathValue}
72
74
  router.get(
73
75
  path,
76
+ ...(opConfig.authorize ? [opConfig.authorize] : []),
74
77
  parseQuery,
75
78
  setShape(opConfig, '${opKind}'),
76
79
  ...opConfig.operationBefore,
77
80
  requireVariantKey(),
78
81
  variantBeforeDispatcher(opConfig),
79
82
  maybeProgressiveSSE(opConfig, core.${meta.coreName}, '${meta.name}'),
83
+ ${meta.name === 'findMany' ? 'maybeNdjsonFindMany(core.findMany),' : ''}
80
84
  ${handlerName} as RequestHandler,
81
85
  variantAfterDispatcher(opConfig),
82
86
  ...opConfig.operationAfter,
@@ -96,6 +100,7 @@ function emitWriteOp(meta, modelName) {
96
100
  const path = ${pathValue}
97
101
  router.${meta.method}(
98
102
  path,
103
+ ...(opConfig.authorize ? [opConfig.authorize] : []),
99
104
  setShape(opConfig, '${opKind}'),
100
105
  ...opConfig.operationBefore,
101
106
  requireVariantKey(),
@@ -107,10 +112,10 @@ function emitWriteOp(meta, modelName) {
107
112
  )
108
113
  }`;
109
114
  }
110
- function generateRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, }) {
115
+ function generateRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }) {
111
116
  const ext = (0, importExt_1.importExt)(importStyle);
112
117
  const modelName = model.name;
113
- const modelNameLower = modelName.toLowerCase();
118
+ const modelSegment = (0, pathCasing_1.modelPathSegment)(modelName, pathCase);
114
119
  const delegateKey = modelName.charAt(0).toLowerCase() + modelName.slice(1);
115
120
  const routerFunctionName = `${modelName}Router`;
116
121
  const handlerImports = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.name !== 'updateEach')
@@ -134,9 +139,10 @@ import type {
134
139
  QueryBuilderConfig,
135
140
  FindManyPaginatedMode,
136
141
  PaginationConfig,
142
+ PrismaClientLike,
137
143
  } from '../routeConfig.target${ext}'
138
144
  import { parseQueryParams } from '../parseQueryParams${ext}'
139
- import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject } from '../misc${ext}'
145
+ import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject, resolveDropGuardEnv } from '../misc${ext}'
140
146
  import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
141
147
  import {
142
148
  normalizeOperation,
@@ -144,7 +150,10 @@ import {
144
150
  validateCountSourceWhere,
145
151
  validateOperationConfig,
146
152
  validateUpdateEachConfig,
153
+ resolvePostReadsEnabled,
154
+ warnIfUnguardedRoutes,
147
155
  } from '../routeConfig${ext}'
156
+ import type { RuntimeOperationOverride } from '../operationRuntime${ext}'
148
157
  import type { NormalizedOperationConfig } from '../routeConfig${ext}'
149
158
  import type { OperationContext } from '../operationRuntime${ext}'
150
159
  import { transformResult } from '../operationRuntime${ext}'
@@ -152,6 +161,7 @@ import { HttpError, mapError } from '../errorMapper${ext}'
152
161
  import { formatGuardVariantResolutionError } from '../guardVariantError${ext}'
153
162
  import type { GuardVariantResolution } from '../guardVariantRouting${ext}'
154
163
  import { mergePaginationConfig } from '../pagination${ext}'
164
+ import { acceptsNdjson, runNdjsonFindMany } from '../ndjson${ext}'
155
165
  import {
156
166
  acceptsEventStream,
157
167
  runProgressiveEndpoint,
@@ -165,13 +175,18 @@ import { applyDroppedGuard } from '../projectionDefaults${ext}'
165
175
  import type { OpKind } from '../projectionDefaults${ext}'
166
176
  import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
167
177
 
168
- ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
178
+ ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express', clientImport)}
169
179
  const _env = getEnv()
170
180
 
171
181
  const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
172
- const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
182
+ // Fixed at generation time. The environment bypass is resolved per router,
183
+ // because it requires the configuration's explicit \`allowE2EGuardBypass: true\`:
184
+ // false or omitted means the environment cannot drop guards for this target.
185
+ const DROP_GUARD = ${dropGuard}
173
186
 
174
187
  type OperationConfigLike = {
188
+ authorize?: RequestHandler
189
+ override?: RuntimeOperationOverride
175
190
  before?: RequestHandler[]
176
191
  after?: RequestHandler[]
177
192
  shape?: unknown
@@ -194,7 +209,7 @@ type NormalizedOp = NormalizedOperationConfig<RequestHandler, RequestHandler> &
194
209
  }
195
210
 
196
211
  type ExtendedRequest = Request & {
197
- prisma?: unknown
212
+ prisma?: PrismaClientLike
198
213
  postgres?: unknown
199
214
  sqlite?: unknown
200
215
  }
@@ -204,6 +219,8 @@ type LocalsBag = {
204
219
  routeConfig?: { pagination?: PaginationConfig }
205
220
  guardShape?: Record<string, unknown>
206
221
  guardCaller?: string
222
+ operationOverride?: RuntimeOperationOverride
223
+ resolveOperationContext?: () => unknown | Promise<unknown>
207
224
  guardVariantKey?: string
208
225
  guardVariantFailure?: Extract<GuardVariantResolution, { ok: false }>
209
226
  data?: unknown
@@ -321,7 +338,7 @@ function requireVariantKey(): RequestHandler {
321
338
  }
322
339
  }
323
340
 
324
- export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${modelName}RouteConfig<TCtx, TPrisma> = {}) {
341
+ export function ${routerFunctionName}<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>(config: ${modelName}RouteConfig<TCtx, TPrisma> = {}) {
325
342
  validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
326
343
  validateCountSourceWhere(
327
344
  (config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
@@ -331,6 +348,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
331
348
  const router = express.Router()
332
349
 
333
350
  const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
351
+ warnIfUnguardedRoutes('${modelName}', ['findMany', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findManyPaginated', 'count', 'aggregate', 'groupBy', 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany'], config, isEnabled)
334
352
 
335
353
  const opFor = (key: string): NormalizedOp => {
336
354
  const raw = (config as unknown as Record<string, unknown>)[key] as OperationConfigLike | undefined
@@ -339,13 +357,12 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
339
357
  }
340
358
 
341
359
  const customPrefix = normalizePrefix(config.customUrlPrefix || '')
342
- const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
360
+ const modelPrefix = config.addModelPrefix !== false ? '/${modelSegment}' : ''
343
361
  const basePath = customPrefix + modelPrefix
344
362
 
345
363
  const openApiDisabled = config.disableOpenApi === true
346
364
  || (config.disableOpenApi !== false && (_env.DISABLE_OPENAPI === 'true' || _env.NODE_ENV === 'production'))
347
365
 
348
- const postReadsEnabled = !config.disablePostReads
349
366
 
350
367
  let _openApiJsonCache: unknown = undefined
351
368
  const getOpenApiJson = (): unknown => {
@@ -355,7 +372,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
355
372
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
356
373
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
357
374
  config as unknown as Parameters<typeof buildModelOpenApi>[3],
358
- { format: 'json', writeStrategy: '${writeStrategy}' },
375
+ { format: 'json', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
359
376
  )
360
377
  }
361
378
  return _openApiJsonCache
@@ -368,7 +385,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
368
385
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
369
386
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
370
387
  config as unknown as Parameters<typeof buildModelOpenApi>[3],
371
- { format: 'yaml', writeStrategy: '${writeStrategy}' },
388
+ { format: 'yaml', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
372
389
  ) as string
373
390
  }
374
391
  return _openApiYamlCache
@@ -390,6 +407,8 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
390
407
  const extReq = req as ExtendedRequest
391
408
  const locals = readLocals(res)
392
409
  return {
410
+ operationOverride: locals.operationOverride,
411
+ resolveOperationContext: locals.resolveOperationContext,
393
412
  prisma: extReq.prisma,
394
413
  postgres: extReq.postgres,
395
414
  sqlite: extReq.sqlite,
@@ -397,6 +416,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
397
416
  body: req.body,
398
417
  guardShape: locals.guardShape,
399
418
  guardCaller: locals.guardCaller,
419
+ guardVariantKey: locals.guardVariantKey,
400
420
  paginationConfig: locals.routeConfig?.pagination,
401
421
  findManyPaginatedMode: FIND_MANY_PAGINATED_MODE,
402
422
  }
@@ -424,10 +444,25 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
424
444
  next()
425
445
  }
426
446
 
447
+ /**
448
+ * The environment bypass, and it is OPT-IN for this target.
449
+ *
450
+ * \`PGE_DROP_GUARD=true\` (deprecated alias \`E2E=true\`) downgrading enforcement
451
+ * in a deployed environment is a real hazard: on most platforms it is an
452
+ * ordinary config var, set on staging, copied forward, flagged as
453
+ * security-relevant nowhere. It is honoured only when this configuration
454
+ * states \`allowE2EGuardBypass: true\` — false or omitted means the environment
455
+ * cannot drop guards. The generation-time \`DROP_GUARD\` literal is unchanged.
456
+ */
457
+ const dropGuard = DROP_GUARD || (config.allowE2EGuardBypass === true && resolveDropGuardEnv(_env))
458
+
427
459
  const setShape = (opConfig: NormalizedOp, opKind: OpKind): RequestHandler => {
428
460
  return async (req, res, next) => {
429
461
  try {
430
462
  const locals = readLocals(res)
463
+ locals.operationOverride = opConfig.override
464
+ let context: Promise<unknown> | undefined
465
+ locals.resolveOperationContext = () => context ??= Promise.resolve(config.resolveContext?.(req))
431
466
  const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
432
467
  if (merged) {
433
468
  locals.routeConfig = { pagination: merged }
@@ -452,7 +487,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
452
487
  if (resolvedKey !== undefined) locals.guardVariantKey = resolvedKey
453
488
 
454
489
  if (opConfig.guardShape) {
455
- if (!DROP_GUARD) {
490
+ if (!dropGuard) {
456
491
  locals.guardShape = opConfig.guardShape
457
492
  } else {
458
493
  await applyDroppedGuard(
@@ -487,6 +522,41 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
487
522
  }
488
523
  }
489
524
 
525
+ const maybeNdjsonFindMany = (
526
+ coreFn: (ctx: OperationContext) => Promise<unknown>,
527
+ ): RequestHandler => {
528
+ return async (req, res, next) => {
529
+ if (res.headersSent || res.writableEnded) return next()
530
+ if (req.method !== 'GET') return next()
531
+ if (!acceptsNdjson(req.headers.accept)) return next()
532
+
533
+ const locals = readLocals(res)
534
+ const rawArgs = (locals.parsedQuery ?? {}) as Record<string, unknown>
535
+ const args = { ...rawArgs }
536
+ const paginationCfg = mergePaginationConfig(config.pagination, undefined)
537
+ const requestedTake = typeof rawArgs.take === 'number' ? rawArgs.take : undefined
538
+ const initialSkip = typeof rawArgs.skip === 'number' ? rawArgs.skip : 0
539
+
540
+ try {
541
+ await runNdjsonFindMany({
542
+ res,
543
+ isClosed: () => req.destroyed,
544
+ fetchPage: (skip, pageTake) =>
545
+ coreFn({
546
+ ...buildContext(req, res),
547
+ parsedQuery: { ...args, skip, take: pageTake },
548
+ }),
549
+ initialSkip,
550
+ requestedTake,
551
+ defaultLimit: paginationCfg?.defaultLimit,
552
+ maxLimit: paginationCfg?.maxLimit ?? 1000,
553
+ })
554
+ } catch (err) {
555
+ next(err)
556
+ }
557
+ }
558
+ }
559
+
490
560
  const maybeProgressiveSSE = (
491
561
  opConfig: NormalizedOp,
492
562
  coreFn: (ctx: OperationContext) => Promise<unknown>,
@@ -513,6 +583,23 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
513
583
  }
514
584
 
515
585
  if (progressiveConfig.mode === 'autoInclude') {
586
+ if (progressiveConfig.experimental !== true) {
587
+ if (_env.NODE_ENV !== 'production') {
588
+ console.warn(
589
+ '[prisma-generator-express] auto-include progressive is experimental; set \`experimental: true\` on the progressive config to enable it. Falling back.'
590
+ )
591
+ }
592
+ if (progressiveConfig.fallback === 'error') {
593
+ emitTerminalSSEError(res, 'auto-include requires experimental: true')
594
+ return
595
+ }
596
+ await runSingleResultSSE({
597
+ req,
598
+ res,
599
+ coreQueryFn: () => coreFn(buildContext(req, res)),
600
+ })
601
+ return
602
+ }
516
603
  const isAutoIncludeReadable =
517
604
  baseOp === 'findUnique' || baseOp === 'findUniqueOrThrow' ||
518
605
  baseOp === 'findFirst' || baseOp === 'findFirstOrThrow' ||
@@ -580,11 +667,16 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
580
667
  }
581
668
 
582
669
  const ctx = await config.resolveContext(req)
670
+ const prismaClient = (req as ExtendedRequest).prisma
671
+ if (!prismaClient) {
672
+ emitTerminalSSEError(res, 'Progressive endpoint requires req.prisma to be set')
673
+ return
674
+ }
583
675
  await runProgressiveEndpoint({
584
676
  req,
585
677
  res,
586
678
  ctx,
587
- prisma: (req as ExtendedRequest).prisma,
679
+ prisma: prismaClient,
588
680
  variant: variant as string,
589
681
  stages: progressiveConfig.stages,
590
682
  stageRegistry,
@@ -640,6 +732,7 @@ ${writeOpBlocks}
640
732
  const path = basePath ? \`\${basePath}/each\` : '/each'
641
733
  router.post(
642
734
  path,
735
+ ...(opConfig.authorize ? [opConfig.authorize] : []),
643
736
  setShape(opConfig, 'noop'),
644
737
  ...opConfig.operationBefore,
645
738
  async (req: Request, res: Response, next: NextFunction) => {