prisma-generator-express 1.66.0 → 1.68.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 (130) hide show
  1. package/README.md +188 -3432
  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.d.ts +4 -1
  8. package/dist/copy/operationDefinitions.js +133 -9
  9. package/dist/copy/operationDefinitions.js.map +1 -1
  10. package/dist/generators/generateFastifyHandler.d.ts +2 -2
  11. package/dist/generators/generateFastifyHandler.js +68 -12
  12. package/dist/generators/generateFastifyHandler.js.map +1 -1
  13. package/dist/generators/generateHonoHandler.d.ts +2 -2
  14. package/dist/generators/generateHonoHandler.js +53 -6
  15. package/dist/generators/generateHonoHandler.js.map +1 -1
  16. package/dist/generators/generateHonoOpenApi.d.ts +13 -0
  17. package/dist/generators/generateHonoOpenApi.js +70 -0
  18. package/dist/generators/generateHonoOpenApi.js.map +1 -0
  19. package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
  20. package/dist/generators/generateImportPrismaStatement.js +6 -0
  21. package/dist/generators/generateImportPrismaStatement.js.map +1 -1
  22. package/dist/generators/generateMcpApp.d.ts +10 -0
  23. package/dist/generators/generateMcpApp.js +113 -0
  24. package/dist/generators/generateMcpApp.js.map +1 -0
  25. package/dist/generators/generateModelMcp.d.ts +9 -0
  26. package/dist/generators/generateModelMcp.js +145 -0
  27. package/dist/generators/generateModelMcp.js.map +1 -0
  28. package/dist/generators/generateModelMetadata.js +29 -15
  29. package/dist/generators/generateModelMetadata.js.map +1 -1
  30. package/dist/generators/generateOperationCore.d.ts +3 -3
  31. package/dist/generators/generateOperationCore.js +51 -16
  32. package/dist/generators/generateOperationCore.js.map +1 -1
  33. package/dist/generators/generateRelationMeta.js +2 -2
  34. package/dist/generators/generateRelationMeta.js.map +1 -1
  35. package/dist/generators/generateRouteConfigType.d.ts +2 -2
  36. package/dist/generators/generateRouteConfigType.js +29 -11
  37. package/dist/generators/generateRouteConfigType.js.map +1 -1
  38. package/dist/generators/generateRouter.d.ts +7 -4
  39. package/dist/generators/generateRouter.js +164 -65
  40. package/dist/generators/generateRouter.js.map +1 -1
  41. package/dist/generators/generateRouterFastify.d.ts +7 -4
  42. package/dist/generators/generateRouterFastify.js +106 -86
  43. package/dist/generators/generateRouterFastify.js.map +1 -1
  44. package/dist/generators/generateRouterHono.d.ts +7 -4
  45. package/dist/generators/generateRouterHono.js +59 -414
  46. package/dist/generators/generateRouterHono.js.map +1 -1
  47. package/dist/generators/generateRouterPartsHono.d.ts +14 -0
  48. package/dist/generators/generateRouterPartsHono.js +180 -0
  49. package/dist/generators/generateRouterPartsHono.js.map +1 -0
  50. package/dist/generators/generateUnifiedDocs.d.ts +1 -1
  51. package/dist/generators/generateUnifiedDocs.js +15 -8
  52. package/dist/generators/generateUnifiedDocs.js.map +1 -1
  53. package/dist/generators/generateUnifiedHandler.d.ts +2 -2
  54. package/dist/generators/generateUnifiedHandler.js +42 -18
  55. package/dist/generators/generateUnifiedHandler.js.map +1 -1
  56. package/dist/guardOptions.js +12 -7
  57. package/dist/guardOptions.js.map +1 -1
  58. package/dist/index.d.ts +3 -1
  59. package/dist/index.js +123 -4
  60. package/dist/index.js.map +1 -1
  61. package/dist/utils/copyFiles.d.ts +1 -1
  62. package/dist/utils/copyFiles.js +42 -7
  63. package/dist/utils/copyFiles.js.map +1 -1
  64. package/dist/utils/importExt.d.ts +1 -1
  65. package/dist/utils/mcpGate.d.ts +10 -0
  66. package/dist/utils/mcpGate.js +118 -0
  67. package/dist/utils/mcpGate.js.map +1 -0
  68. package/dist/utils/pathCasing.d.ts +4 -0
  69. package/dist/utils/pathCasing.js +40 -0
  70. package/dist/utils/pathCasing.js.map +1 -0
  71. package/dist/utils/resolveImportStyle.js +13 -5
  72. package/dist/utils/resolveImportStyle.js.map +1 -1
  73. package/dist/utils/writeFileSafely.js +6 -0
  74. package/dist/utils/writeFileSafely.js.map +1 -1
  75. package/package.json +22 -5
  76. package/src/bin.ts +1 -1
  77. package/src/client/encodeQueryParams.ts +39 -35
  78. package/src/constants.ts +1 -1
  79. package/src/copy/autoIncludePlanner.ts +93 -27
  80. package/src/copy/autoIncludePlannerGuarded.ts +171 -48
  81. package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
  82. package/src/copy/buildModelOpenApi.ts +229 -176
  83. package/src/copy/concurrency.ts +10 -8
  84. package/src/copy/docsRenderer.ts +14 -15
  85. package/src/copy/errorMapper.ts +68 -19
  86. package/src/copy/guardHelpers.ts +30 -9
  87. package/src/copy/materializedCount.ts +17 -5
  88. package/src/copy/mcpRuntime.ts +1017 -0
  89. package/src/copy/misc.ts +88 -68
  90. package/src/copy/ndjson.ts +72 -0
  91. package/src/copy/operationDefinitions.ts +177 -25
  92. package/src/copy/operationPipeline.ts +267 -0
  93. package/src/copy/operationRuntime.ts +124 -26
  94. package/src/copy/operationSchemas.ts +2773 -0
  95. package/src/copy/pagination.ts +35 -13
  96. package/src/copy/parseQueryParams.ts +47 -48
  97. package/src/copy/projectionDefaults.ts +6 -4
  98. package/src/copy/routeConfig.express.ts +16 -4
  99. package/src/copy/routeConfig.fastify.ts +16 -2
  100. package/src/copy/routeConfig.hono.ts +46 -14
  101. package/src/copy/routeConfig.ts +175 -40
  102. package/src/copy/routerParts.ts +524 -0
  103. package/src/copy/scalarTypes.ts +7 -2
  104. package/src/copy/sse.ts +72 -19
  105. package/src/generators/generateFastifyHandler.ts +77 -20
  106. package/src/generators/generateHonoHandler.ts +62 -14
  107. package/src/generators/generateHonoOpenApi.ts +93 -0
  108. package/src/generators/generateImportPrismaStatement.ts +93 -81
  109. package/src/generators/generateMcpApp.ts +133 -0
  110. package/src/generators/generateModelMcp.ts +208 -0
  111. package/src/generators/generateModelMetadata.ts +40 -22
  112. package/src/generators/generateOperationCore.ts +81 -33
  113. package/src/generators/generateRelationMeta.ts +23 -11
  114. package/src/generators/generateRouteConfigType.ts +39 -13
  115. package/src/generators/generateRouter.ts +171 -68
  116. package/src/generators/generateRouterFastify.ts +117 -89
  117. package/src/generators/generateRouterHono.ts +84 -464
  118. package/src/generators/generateRouterPartsHono.ts +220 -0
  119. package/src/generators/generateUnifiedDocs.ts +29 -8
  120. package/src/generators/generateUnifiedHandler.ts +47 -24
  121. package/src/generators/generateUnifiedScalarUI.ts +1 -1
  122. package/src/guardOptions.ts +105 -92
  123. package/src/index.ts +161 -6
  124. package/src/utils/copyFiles.ts +235 -168
  125. package/src/utils/importExt.ts +2 -2
  126. package/src/utils/mcpGate.ts +157 -0
  127. package/src/utils/pathCasing.ts +42 -0
  128. package/src/utils/resolveImportStyle.ts +37 -15
  129. package/src/utils/strings.ts +2 -2
  130. package/src/utils/writeFileSafely.ts +12 -2
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateHonoRouterFunction = generateHonoRouterFunction;
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(suffix) {
8
9
  if (!suffix)
@@ -49,16 +50,16 @@ function emitReadOp(meta, modelName) {
49
50
  const opKind = opKindFor(meta.name);
50
51
  const postReadLine = meta.supportsPostRead
51
52
  ? meta.name === 'findMany'
52
- ? ` if (postReadsEnabled) {
53
+ ? ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) {
53
54
  const postPath = basePath ? \`\${basePath}/read\` : '/read'
54
- app.post(postPath, handleRead(opConfig, ${handlerName}, parseBodyAsQueryMiddleware, '${opKind}'))
55
+ app.post(postPath, createReadRoute<TCtx, TPrisma, TEnv>({ config, opConfig, opKind: '${opKind}', handler: ${handlerName}, parse: 'body', dropGuard, settleBeforeHooks: SETTLE_BEFORE_HOOKS }))
55
56
  }`
56
- : ` if (postReadsEnabled) app.post(path, handleRead(opConfig, ${handlerName}, parseBodyAsQueryMiddleware, '${opKind}'))`
57
+ : ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) app.post(path, createReadRoute<TCtx, TPrisma, TEnv>({ config, opConfig, opKind: '${opKind}', handler: ${handlerName}, parse: 'body', dropGuard, settleBeforeHooks: SETTLE_BEFORE_HOOKS }))`
57
58
  : '';
58
59
  return ` if (isEnabled(config.${meta.configKey})) {
59
60
  const opConfig = opFor('${meta.configKey}')
60
61
  const path = ${pathValue}
61
- app.get(path, handleRead(opConfig, ${handlerName}, parseQueryMiddleware, '${opKind}'))
62
+ app.get(path, createReadRoute<TCtx, TPrisma, TEnv>({ config, opConfig, opKind: '${opKind}', handler: ${handlerName}, parse: 'query', dropGuard, settleBeforeHooks: SETTLE_BEFORE_HOOKS }))
62
63
  ${postReadLine}
63
64
  }`;
64
65
  }
@@ -70,60 +71,57 @@ function emitWriteOp(meta, modelName) {
70
71
  return ` if (isEnabled(config.${meta.configKey})) {
71
72
  const opConfig = opFor('${meta.configKey}')
72
73
  const path = ${pathValue}
73
- app.${meta.method}(path, handleWrite(opConfig, ${handlerName}, '${opKind}'))
74
+ app.${meta.method}(path, createWriteRoute<TCtx, TPrisma, TEnv>({ config, opConfig, opKind: '${opKind}', handler: ${handlerName}, dropGuard, settleBeforeHooks: SETTLE_BEFORE_HOOKS }))
74
75
  }`;
75
76
  }
76
- function generateHonoRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, dropGuard, }) {
77
+ function generateHonoRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, dropGuard, pathCase, }) {
77
78
  const ext = (0, importExt_1.importExt)(importStyle);
78
79
  const modelName = model.name;
79
- const modelNameLower = modelName.toLowerCase();
80
+ const modelSegment = (0, pathCasing_1.modelPathSegment)(modelName, pathCase);
80
81
  const routerFunctionName = `${modelName}Router`;
81
- const handlerImports = operationDefinitions_1.OPERATION_METADATA
82
- .map((m) => ` ${modelName}${m.name.charAt(0).toUpperCase() + m.name.slice(1)},`)
83
- .join('\n');
82
+ const handlerImports = operationDefinitions_1.OPERATION_METADATA.map((m) => ` ${modelName}${m.name.charAt(0).toUpperCase() + m.name.slice(1)},`).join('\n');
84
83
  const readOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'read');
85
- const writeOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'write' || m.kind === 'batch')
86
- .filter((m) => m.name !== 'updateEach');
84
+ const writeOps = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.kind === 'write' || m.kind === 'batch').filter((m) => m.name !== 'updateEach');
87
85
  const readOpBlocks = readOps.map((m) => emitReadOp(m, modelName)).join('\n\n');
88
- const writeOpBlocks = writeOps.map((m) => emitWriteOp(m, modelName)).join('\n\n');
86
+ const writeOpBlocks = writeOps
87
+ .map((m) => emitWriteOp(m, modelName))
88
+ .join('\n\n');
89
89
  return `import { Hono } from 'hono'
90
- import type { Context } from 'hono'
91
- import type { ContentfulStatusCode } from 'hono/utils/http-status'
92
- import { HTTPException } from 'hono/http-exception'
93
90
  import {
94
91
  ${handlerImports}
95
92
  } from './${modelName}Handlers${ext}'
96
93
  import type {
97
94
  RouteConfig,
98
- HonoBeforeHook,
99
- HonoAfterHook,
100
95
  HonoEnvBase,
101
- HonoInternalVariables,
102
96
  GeneratedHonoEnv,
103
- PaginationConfig,
97
+ PrismaClientLike,
104
98
  } from '../routeConfig.target${ext}'
105
- import { parseQueryParams } from '../parseQueryParams${ext}'
106
- import { normalizePrefix, getEnv, sanitizeKeys, isPlainObject } from '../misc${ext}'
99
+ import { normalizePrefix, getEnv, resolveDropGuardEnv } from '../misc${ext}'
107
100
  import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
108
101
  import {
109
- normalizeOperation,
110
- resolveOperationVariantKey,
111
102
  resolveGuardPolicy,
112
- resolveGuardShapeOnce,
103
+ resolvePostReadsEnabled,
113
104
  validateCountSourceWhere,
114
- validateOperationConfig,
115
105
  validateUpdateEachConfig,
106
+ warnIfUnguardedRoutes,
116
107
  } from '../routeConfig${ext}'
117
- import type { NormalizedOperationConfig } from '../routeConfig${ext}'
118
- import { transformResult } from '../operationRuntime${ext}'
119
- import { mapError } from '../errorMapper${ext}'
120
- import { formatGuardVariantResolutionError } from '../guardVariantError${ext}'
121
- import { mergePaginationConfig } from '../pagination${ext}'
122
- import { applyDroppedGuard } from '../projectionDefaults${ext}'
123
- import type { OpKind } from '../projectionDefaults${ext}'
108
+ import {
109
+ createReadRoute,
110
+ createWriteRoute,
111
+ createUpdateEachRoute,
112
+ opConfigFor,
113
+ normalizeHonoOperation,
114
+ registerOpenApiRoutes,
115
+ sendError,
116
+ type HandlerContext,
117
+ type HonoOpConfig,
118
+ } from '../routerParts${ext}'
119
+ // The legacy router factory preserves pre-parts behavior: materialized-view
120
+ // counting is registered on import. The per-op parts boundary keeps this
121
+ // module out of opt-in small bundles.
124
122
  import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
125
123
 
126
- ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono')}
124
+ ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono', clientImport)}
127
125
  const _env = getEnv()
128
126
 
129
127
  // Fixed at generation time. The \`allowE2EGuardBypass\` control decides whether the
@@ -131,243 +129,7 @@ const _env = getEnv()
131
129
  // which is upstream behaviour. See generateRouterHono.ts.
132
130
  const DROP_GUARD = ${dropGuard}
133
131
 
134
- /**
135
- * DELIBERATELY NOT RECURSIVE.
136
- *
137
- * A self-referential JSON type sent through \`c.json()\` makes Hono's response
138
- * inference instantiate without a fixed point, and TypeScript answers
139
- * "type instantiation is excessively deep" — in the emitted file, for every
140
- * consumer. One level is all this needs: the value is serialised, not walked.
141
- */
142
- type JsonLike = string | number | boolean | null | unknown[] | Record<string, unknown>
143
-
144
- type OperationConfigLike<TEnv extends HonoEnvBase> = {
145
- before?: HonoBeforeHook<TEnv>[]
146
- after?: HonoAfterHook<TEnv>[]
147
- shape?: unknown
148
- variants?: Record<
149
- string,
150
- {
151
- shape?: unknown
152
- before?: HonoBeforeHook<TEnv>[]
153
- after?: HonoAfterHook<TEnv>[]
154
- }
155
- >
156
- pagination?: Partial<PaginationConfig>
157
- }
158
-
159
- type NormalizedOp<TEnv extends HonoEnvBase> = NormalizedOperationConfig<
160
- HonoBeforeHook<TEnv>,
161
- HonoAfterHook<TEnv>
162
- >
163
-
164
- function normalizeHonoOperation<TEnv extends HonoEnvBase>(
165
- config: OperationConfigLike<TEnv> | undefined,
166
- ): NormalizedOp<TEnv> {
167
- return normalizeOperation<HonoBeforeHook<TEnv>, HonoAfterHook<TEnv>>(config)
168
- }
169
-
170
- type HandlerContext = Context<{ Variables: HonoInternalVariables }>
171
-
172
- async function parseQueryMiddleware(c: HandlerContext): Promise<void> {
173
- const raw = c.req.query() as Record<string, unknown>
174
- if (raw && Object.keys(raw).length > 0) {
175
- c.set('parsedQuery', parseQueryParams(raw) as Record<string, unknown>)
176
- }
177
- }
178
-
179
- async function parseBodyAsQueryMiddleware(c: HandlerContext): Promise<void> {
180
- let body: unknown
181
- try {
182
- body = await c.req.json()
183
- } catch {
184
- throw new HTTPException(400, { message: 'Request body must be a JSON object' })
185
- }
186
- if (!body || typeof body !== 'object' || Array.isArray(body)) {
187
- throw new HTTPException(400, { message: 'Request body must be a JSON object' })
188
- }
189
- c.set('parsedQuery', sanitizeKeys(body as Record<string, unknown>))
190
- }
191
-
192
- async function parseUpdateEachBodyMiddleware(c: HandlerContext): Promise<void> {
193
- let body: unknown
194
- try {
195
- body = await c.req.json()
196
- } catch {
197
- throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
198
- }
199
- if (!Array.isArray(body)) {
200
- throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
201
- }
202
- c.set('body', body)
203
- }
204
-
205
- async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
206
- let body: unknown
207
- try {
208
- body = await c.req.json()
209
- } catch {
210
- throw new HTTPException(400, { message: 'Request body must be a JSON object' })
211
- }
212
- if (!body || typeof body !== 'object' || Array.isArray(body)) {
213
- throw new HTTPException(400, { message: 'Request body must be a JSON object' })
214
- }
215
- c.set('body', body)
216
- }
217
-
218
- function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
219
- config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv>,
220
- opConfig: NormalizedOp<TEnv>,
221
- opKind: OpKind,
222
- ) {
223
- const policy = resolveGuardPolicy(config)
224
-
225
- /**
226
- * The environment bypass, honoured unless the consumer turned it off.
227
- *
228
- * \`E2E=true\` downgrading enforcement in a deployed environment is a real
229
- * hazard, and it is also upstream behaviour — so it is a control, not a
230
- * decision made here.
231
- */
232
- const dropGuard = DROP_GUARD || (policy.allowE2EGuardBypass && _env.E2E === 'true')
233
-
234
- return async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<void> => {
235
- /**
236
- * INTERNAL REQUEST STATE IS SET THROUGH A CONCRETE CONTEXT.
237
- *
238
- * \`GeneratedHonoEnv<TEnv>['Variables']\` is \`HonoInternalVariables & TEnv['Variables']\`,
239
- * and inside this generic function TypeScript cannot know that the consumer's
240
- * half does not also declare \`routeConfig\` — so setting that key straight
241
- * onto \`c\` is unassignable to the intersection and the emitted router does not
242
- * typecheck under \`strict\` for ANY consumer. These keys belong to this
243
- * router, so they are written through the internal shape they were declared
244
- * in.
245
- */
246
- const vars = c as unknown as HandlerContext
247
-
248
- const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
249
- if (merged) vars.set('routeConfig', { pagination: merged })
250
-
251
- const headerName = config.guard?.variantHeader || 'x-api-variant'
252
- const headerValue = c.req.header(headerName)
253
- const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
254
- if (typeof caller === 'string') vars.set('guardCaller', caller)
255
-
256
- const resolution = resolveOperationVariantKey(opConfig.guardRouting, caller)
257
- if (!resolution.ok) {
258
- vars.set('guardVariantFailure', resolution)
259
- return
260
- }
261
-
262
- const resolvedKey =
263
- opConfig.guardRouting.kind === 'named'
264
- ? resolution.key
265
- : undefined
266
- if (resolvedKey !== undefined) vars.set('guardVariantKey', resolvedKey)
267
-
268
- if (opConfig.guardShape) {
269
- const resolveCtx = typeof config.resolveContext === 'function'
270
- ? () => (config.resolveContext as unknown as (ctx: Context<GeneratedHonoEnv<TEnv>>) => unknown | Promise<unknown>)(c)
271
- : undefined
272
-
273
- /**
274
- * With \`validateResolvedShapes\`, resolved ONCE here and the validated value
275
- * is what travels onward — see resolveGuardShapeOnce. Passing the function
276
- * on would let it return a different shape when it is enforced than when it
277
- * was checked.
278
- *
279
- * Without it the raw shape is passed through untouched, which is upstream
280
- * behaviour: it is resolved at the point of use, and a function returning
281
- * something unusable is not this router's business to refuse.
282
- */
283
- let effectiveShape: Record<string, unknown> | undefined = opConfig.guardShape
284
- if (policy.validateResolvedShapes) {
285
- const resolution = await resolveGuardShapeOnce(opConfig.guardShape, resolvedKey, resolveCtx)
286
- if (!resolution.ok) {
287
- vars.set('guardShapeFailure', resolution.problem)
288
- return
289
- }
290
- // \`ok\` means the resolved value is a shape object; the fallback keeps the
291
- // declared shape rather than storing something the context cannot hold.
292
- effectiveShape = isPlainObject(resolution.shape) ? resolution.shape : opConfig.guardShape
293
- }
294
-
295
- if (!dropGuard) {
296
- vars.set('guardShape', effectiveShape)
297
- } else {
298
- await applyDroppedGuard(
299
- effectiveShape,
300
- resolvedKey,
301
- resolveCtx,
302
- opKind,
303
- {
304
- readQuery: vars.get('parsedQuery'),
305
- writeBody: isPlainObject(vars.get('body'))
306
- ? (vars.get('body') as Record<string, unknown>)
307
- : undefined,
308
- },
309
- () => {
310
- let target = vars.get('parsedQuery')
311
- if (!target) {
312
- target = {}
313
- vars.set('parsedQuery', target)
314
- }
315
- return target
316
- },
317
- () => {
318
- let target = vars.get('body')
319
- if (!isPlainObject(target)) {
320
- target = {}
321
- vars.set('body', target)
322
- }
323
- return target as Record<string, unknown>
324
- },
325
- )
326
- }
327
- }
328
- }
329
- }
330
-
331
- async function runBeforeHooks<TEnv extends HonoEnvBase>(
332
- hooks: readonly HonoBeforeHook<TEnv>[],
333
- c: Context<GeneratedHonoEnv<TEnv>>,
334
- ): Promise<Response | undefined> {
335
- for (const hook of hooks) {
336
- const result = await hook(c)
337
- if (result instanceof Response) return result
338
- }
339
- return undefined
340
- }
341
-
342
- async function runAfterHooks<TEnv extends HonoEnvBase>(
343
- hooks: readonly HonoAfterHook<TEnv>[],
344
- c: Context<GeneratedHonoEnv<TEnv>>,
345
- ): Promise<Response | undefined> {
346
- for (const hook of hooks) {
347
- const result = await hook(c)
348
- if (result instanceof Response) return result
349
- }
350
- return undefined
351
- }
352
-
353
- function sendResult(c: HandlerContext): Response {
354
- const data = c.get('resultData')
355
- const status = (c.get('resultStatus') as number | undefined) ?? 200
356
- if (data === undefined) {
357
- throw new HTTPException(500, { message: 'No data set by handler' })
358
- }
359
- return c.json(transformResult(data) as JsonLike, status as ContentfulStatusCode)
360
- }
361
-
362
- function sendError(c: HandlerContext, error: unknown): Response {
363
- if (error instanceof HTTPException) {
364
- return c.json({ message: error.message }, error.status as ContentfulStatusCode)
365
- }
366
- const httpError = mapError(error)
367
- return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
368
- }
369
-
370
- export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
132
+ export function ${routerFunctionName}<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
371
133
  validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
372
134
  validateCountSourceWhere(
373
135
  (config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
@@ -377,19 +139,36 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
377
139
  const app = new Hono<GeneratedHonoEnv<TEnv>>()
378
140
 
379
141
  const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
142
+ warnIfUnguardedRoutes('${modelName}', ['findMany', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findManyPaginated', 'count', 'aggregate', 'groupBy', 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany'], config, isEnabled)
380
143
 
381
144
  const customPrefix = normalizePrefix(config.customUrlPrefix || '')
382
- const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
145
+ const modelPrefix = config.addModelPrefix !== false ? '/${modelSegment}' : ''
383
146
  const basePath = customPrefix + modelPrefix
384
147
 
148
+ const POLICY = resolveGuardPolicy(config)
149
+ const SETTLE_BEFORE_HOOKS = POLICY.guardResolutionOrder === 'before-hooks'
150
+
151
+ /**
152
+ * The environment bypass, honoured unless the consumer turned it off.
153
+ * \`PGE_DROP_GUARD=true\` downgrading enforcement in a deployed environment is
154
+ * a real hazard, and it is also upstream behaviour (under its deprecated
155
+ * \`E2E=true\` spelling) — so it is a control, not a decision made here.
156
+ */
157
+ const dropGuard = DROP_GUARD || (POLICY.allowE2EGuardBypass && resolveDropGuardEnv(_env))
158
+
159
+ const opFor = <K extends keyof ${modelName}RouteConfig<TCtx, TPrisma, TEnv>>(
160
+ key: K,
161
+ ): HonoOpConfig<TEnv> => {
162
+ const raw = config[key] as unknown as Parameters<typeof normalizeHonoOperation<TEnv>>[0]
163
+ return opConfigFor<TEnv>(raw, '${modelName}.' + String(key), POLICY)
164
+ }
165
+
385
166
  const openApiDisabled = config.disableOpenApi === true
386
167
  || (config.disableOpenApi !== false && (
387
168
  _env.NODE_ENV === 'production'
388
169
  || _env.DISABLE_OPENAPI === 'true'
389
170
  ))
390
171
 
391
- const postReadsEnabled = !config.disablePostReads
392
-
393
172
  let _openApiJsonCache: unknown = undefined
394
173
  const getOpenApiJson = (): unknown => {
395
174
  if (_openApiJsonCache === undefined) {
@@ -398,7 +177,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
398
177
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
399
178
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
400
179
  config as unknown as Parameters<typeof buildModelOpenApi>[3],
401
- { format: 'json', writeStrategy: '${writeStrategy}' },
180
+ { format: 'json', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
402
181
  )
403
182
  }
404
183
  return _openApiJsonCache
@@ -411,7 +190,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
411
190
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
412
191
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
413
192
  config as unknown as Parameters<typeof buildModelOpenApi>[3],
414
- { format: 'yaml', writeStrategy: '${writeStrategy}' },
193
+ { format: 'yaml', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
415
194
  ) as string
416
195
  }
417
196
  return _openApiYamlCache
@@ -429,125 +208,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
429
208
  })
430
209
 
431
210
  if (!openApiDisabled) {
432
- const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
433
- const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
434
- app.get(openapiJsonPath, (c) => c.json(getOpenApiJson() as JsonLike))
435
- app.get(openapiYamlPath, (c) => {
436
- c.header('Content-Type', 'application/yaml')
437
- return c.body(getOpenApiYaml())
438
- })
439
- }
440
-
441
- const POLICY = resolveGuardPolicy(config)
442
- const SETTLE_BEFORE_HOOKS = POLICY.guardResolutionOrder === 'before-hooks'
443
-
444
- /**
445
- * The guard-resolution failures, raised in one place so both handlers and both
446
- * orderings share exactly one definition of what a failure is.
447
- *
448
- * WHERE it is called is the behavioural difference, and it is the
449
- * \`guardResolutionOrder\` control. \`'before-hooks'\` runs it before any operation
450
- * hook, because a hook that returns a Response — an auth gate, a cache, a
451
- * short-circuit for a known caller — would otherwise answer a request whose
452
- * guard was never established. \`'after-hooks'\` is upstream behaviour.
453
- *
454
- * \`guardShapeFailure\` is only ever set when \`validateResolvedShapes\` is on, so
455
- * that branch is inert rather than merely unreached when it is off.
456
- */
457
- const settleGuard = (c: Context<GeneratedHonoEnv<TEnv>>): void => {
458
- const vars = c as unknown as HandlerContext
459
- const failure = vars.get('guardVariantFailure')
460
- if (failure) {
461
- throw new HTTPException(400, {
462
- message: formatGuardVariantResolutionError(failure),
463
- })
464
- }
465
-
466
- const shapeFailure = vars.get('guardShapeFailure')
467
- if (shapeFailure) {
468
- throw new HTTPException(500, {
469
- message: 'guard shape could not be resolved: ' + shapeFailure,
470
- })
471
- }
472
- }
473
-
474
- const handleRead = (
475
- opConfig: NormalizedOp<TEnv>,
476
- handlerFn: (c: HandlerContext) => Promise<void>,
477
- parseFn: (c: HandlerContext) => Promise<void>,
478
- opKind: OpKind,
479
- ) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
480
- try {
481
- await parseFn(c as unknown as HandlerContext)
482
- await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
483
-
484
- // Settled BEFORE any hook can answer the request, when asked for.
485
- if (SETTLE_BEFORE_HOOKS) settleGuard(c)
486
-
487
- const operationBefore = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
488
- if (operationBefore) return operationBefore
489
-
490
- // Upstream order: hooks first, guard failure after.
491
- if (!SETTLE_BEFORE_HOOKS) settleGuard(c)
492
-
493
- const key = (c as unknown as HandlerContext).get('guardVariantKey')
494
- const variantHooks =
495
- key !== undefined ? opConfig.variantHooks[key] : undefined
496
-
497
- const variantBefore = await runBeforeHooks<TEnv>(variantHooks?.before ?? [], c)
498
- if (variantBefore) return variantBefore
499
- await handlerFn(c as unknown as HandlerContext)
500
- const variantAfter = await runAfterHooks<TEnv>(variantHooks?.after ?? [], c)
501
- if (variantAfter) return variantAfter
502
- const operationAfter = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
503
- if (operationAfter) return operationAfter
504
- return sendResult(c as unknown as HandlerContext)
505
- } catch (error: unknown) {
506
- return sendError(c as unknown as HandlerContext, error)
507
- }
508
- }
509
-
510
- const handleWrite = (
511
- opConfig: NormalizedOp<TEnv>,
512
- handlerFn: (c: HandlerContext) => Promise<void>,
513
- opKind: OpKind,
514
- ) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
515
- try {
516
- await parseWriteBodyMiddleware(c as unknown as HandlerContext)
517
- await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
518
-
519
- // Settled BEFORE any hook can answer the request, when asked for.
520
- if (SETTLE_BEFORE_HOOKS) settleGuard(c)
521
-
522
- const operationBefore = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
523
- if (operationBefore) return operationBefore
524
-
525
- // Upstream order: hooks first, guard failure after.
526
- if (!SETTLE_BEFORE_HOOKS) settleGuard(c)
527
-
528
- const key = (c as unknown as HandlerContext).get('guardVariantKey')
529
- const variantHooks =
530
- key !== undefined ? opConfig.variantHooks[key] : undefined
531
-
532
- const variantBefore = await runBeforeHooks<TEnv>(variantHooks?.before ?? [], c)
533
- if (variantBefore) return variantBefore
534
- await handlerFn(c as unknown as HandlerContext)
535
- const variantAfter = await runAfterHooks<TEnv>(variantHooks?.after ?? [], c)
536
- if (variantAfter) return variantAfter
537
- const operationAfter = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
538
- if (operationAfter) return operationAfter
539
- return sendResult(c as unknown as HandlerContext)
540
- } catch (error: unknown) {
541
- return sendError(c as unknown as HandlerContext, error)
542
- }
543
- }
544
-
545
- const opFor = <K extends keyof ${modelName}RouteConfig<TCtx, TPrisma, TEnv>>(
546
- key: K,
547
- ): NormalizedOp<TEnv> => {
548
- const raw = config[key] as unknown as OperationConfigLike<TEnv> | undefined
549
- validateOperationConfig(raw, '${modelName}.' + String(key), POLICY)
550
- return normalizeHonoOperation(raw)
211
+ registerOpenApiRoutes(app, basePath, getOpenApiJson, getOpenApiYaml)
551
212
  }
552
213
 
553
214
  ${readOpBlocks}
@@ -560,9 +221,6 @@ ${writeOpBlocks}
560
221
  * endpoint is a batch of { where, data } applied directly — and the only thing
561
222
  * between it and an unguarded mass mutation is a console.warn suppressed in
562
223
  * production. A warning is not a security boundary.
563
- *
564
- * Removing the route outright was a breaking change to a published package,
565
- * so by default it registers exactly as it did, warning and all.
566
224
  */
567
225
  if (!POLICY.enableUpdateEach) {
568
226
  throw new Error(
@@ -574,9 +232,9 @@ ${writeOpBlocks}
574
232
  )
575
233
  }
576
234
 
577
- const rawUpdateEach = config.updateEach as unknown as OperationConfigLike<TEnv>
235
+ const rawUpdateEach = config.updateEach as unknown as Parameters<typeof normalizeHonoOperation<TEnv>>[0]
578
236
  validateUpdateEachConfig(rawUpdateEach, '${modelName}.updateEach')
579
- const opConfig = normalizeHonoOperation(rawUpdateEach)
237
+ const opConfig = normalizeHonoOperation<TEnv>(rawUpdateEach)
580
238
  if (opConfig.operationBefore.length === 0 && _env.NODE_ENV !== 'production') {
581
239
  console.warn(
582
240
  '[${modelName}Router] updateEach is enabled without a before hook. ' +
@@ -584,20 +242,7 @@ ${writeOpBlocks}
584
242
  )
585
243
  }
586
244
  const path = basePath ? \`\${basePath}/each\` : '/each'
587
- app.post(path, async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
588
- try {
589
- await parseUpdateEachBodyMiddleware(c as unknown as HandlerContext)
590
- await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, 'noop')(c)
591
- const beforeResponse = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
592
- if (beforeResponse) return beforeResponse
593
- await ${modelName}UpdateEach(c as unknown as HandlerContext)
594
- const afterResponse = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
595
- if (afterResponse) return afterResponse
596
- return sendResult(c as unknown as HandlerContext)
597
- } catch (error: unknown) {
598
- return sendError(c as unknown as HandlerContext, error)
599
- }
600
- })
245
+ app.post(path, createUpdateEachRoute<TCtx, TPrisma, TEnv>({ config, opConfig, handler: ${modelName}UpdateEach, dropGuard }))
601
246
  }
602
247
 
603
248
  return app
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DMMF } from '@prisma/generator-helper';
2
+ import type { ImportStyle } from '../utils/resolveImportStyle';
3
+ import type { WriteStrategy } from '../constants';
4
+ import { type PathCase } from '../utils/pathCasing';
5
+ export declare function generateHonoRouterParts({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, dropGuard, pathCase, }: {
6
+ model: DMMF.Model;
7
+ enums: DMMF.DatamodelEnum[];
8
+ guardShapesImport: string | null;
9
+ clientImport?: string;
10
+ importStyle: ImportStyle;
11
+ writeStrategy: WriteStrategy;
12
+ dropGuard: boolean;
13
+ pathCase: PathCase;
14
+ }): string;