prisma-generator-express 1.57.0 → 1.58.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 (41) hide show
  1. package/README.md +111 -29
  2. package/dist/copy/misc.js +25 -6
  3. package/dist/copy/misc.js.map +1 -1
  4. package/dist/generators/generateFastifyHandler.js +11 -0
  5. package/dist/generators/generateFastifyHandler.js.map +1 -1
  6. package/dist/generators/generateHonoHandler.js +14 -20
  7. package/dist/generators/generateHonoHandler.js.map +1 -1
  8. package/dist/generators/generateImportPrismaStatement.js +7 -1
  9. package/dist/generators/generateImportPrismaStatement.js.map +1 -1
  10. package/dist/generators/generateOperationCore.js +58 -17
  11. package/dist/generators/generateOperationCore.js.map +1 -1
  12. package/dist/generators/generateRouteConfigType.js +12 -7
  13. package/dist/generators/generateRouteConfigType.js.map +1 -1
  14. package/dist/generators/generateRouter.js +57 -32
  15. package/dist/generators/generateRouter.js.map +1 -1
  16. package/dist/generators/generateRouterFastify.js +235 -191
  17. package/dist/generators/generateRouterFastify.js.map +1 -1
  18. package/dist/generators/generateRouterHono.js +121 -87
  19. package/dist/generators/generateRouterHono.js.map +1 -1
  20. package/dist/index.js +4 -4
  21. package/dist/index.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/copy/autoIncludeRuntime.ts +9 -5
  24. package/src/copy/buildModelOpenApi.ts +96 -0
  25. package/src/copy/docsRenderer.ts +577 -174
  26. package/src/copy/materializedRouter.ts +40 -1
  27. package/src/copy/misc.ts +23 -6
  28. package/src/copy/operationDefinitions.ts +10 -0
  29. package/src/copy/operationRuntime.ts +28 -9
  30. package/src/copy/routeConfig.express.ts +9 -9
  31. package/src/copy/routeConfig.hono.ts +63 -5
  32. package/src/copy/routeConfig.ts +44 -22
  33. package/src/generators/generateFastifyHandler.ts +12 -0
  34. package/src/generators/generateHonoHandler.ts +15 -20
  35. package/src/generators/generateImportPrismaStatement.ts +10 -1
  36. package/src/generators/generateOperationCore.ts +58 -17
  37. package/src/generators/generateRouteConfigType.ts +13 -8
  38. package/src/generators/generateRouter.ts +57 -32
  39. package/src/generators/generateRouterFastify.ts +235 -191
  40. package/src/generators/generateRouterHono.ts +121 -87
  41. package/src/index.ts +6 -4
@@ -27,10 +27,9 @@ function generateHonoRouterFunction({ model, enums, guardShapesImport, importSty
27
27
  values: e.values.map((v) => ({ name: v.name })),
28
28
  }));
29
29
  return `import { Hono } from 'hono'
30
- import type { Context, Next } from 'hono'
30
+ import type { Context } from 'hono'
31
31
  import type { ContentfulStatusCode } from 'hono/utils/http-status'
32
32
  import { HTTPException } from 'hono/http-exception'
33
- import { startQueryBuilder } from '../queryBuilder${ext}'
34
33
  import {
35
34
  ${modelName}FindUnique,
36
35
  ${modelName}FindUniqueOrThrow,
@@ -50,32 +49,32 @@ import {
50
49
  ${modelName}Aggregate,
51
50
  ${modelName}Count,
52
51
  ${modelName}GroupBy,
52
+ ${modelName}UpdateEach,
53
53
  } from './${modelName}Handlers${ext}'
54
54
  import type {
55
55
  RouteConfig,
56
- HonoHookHandler,
56
+ HonoBeforeHook,
57
+ HonoAfterHook,
57
58
  HonoEnvBase,
58
59
  HonoInternalVariables,
59
60
  GeneratedHonoEnv,
60
61
  WriteStrategy,
61
- FindManyPaginatedMode,
62
62
  PaginationConfig,
63
63
  } from '../routeConfig.target${ext}'
64
64
  import { parseQueryParams } from '../parseQueryParams${ext}'
65
- import { sanitizeKeys, normalizePrefix, getEnv } from '../misc${ext}'
65
+ import { normalizePrefix, getEnv, sanitizeKeys } from '../misc${ext}'
66
66
  import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
67
+ import { validateCountSourceWhere } from '../routeConfig${ext}'
67
68
  import {
68
69
  mapError,
69
70
  transformResult,
70
71
  mergePaginationConfig,
71
- type OperationContext,
72
72
  } from '../operationRuntime${ext}'
73
73
 
74
- ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoHookHandler', guardShapesImport, importStyle, 'hono')}
74
+ ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono')}
75
75
  const _env = getEnv()
76
76
 
77
77
  const WRITE_STRATEGY: WriteStrategy = '${writeStrategy}'
78
- const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
79
78
  const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
80
79
 
81
80
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
@@ -83,8 +82,8 @@ const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
83
82
  const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
84
83
 
85
84
  type OperationConfigLike<TEnv extends HonoEnvBase> = {
86
- before?: HonoHookHandler<TEnv>[]
87
- after?: HonoHookHandler<TEnv>[]
85
+ before?: HonoBeforeHook<TEnv>[]
86
+ after?: HonoAfterHook<TEnv>[]
88
87
  shape?: Record<string, unknown>
89
88
  pagination?: Partial<PaginationConfig>
90
89
  }
@@ -94,20 +93,7 @@ const defaultOpConfig = Object.freeze({
94
93
  after: Object.freeze([]),
95
94
  }) as unknown as OperationConfigLike<HonoEnvBase>
96
95
 
97
- type HandlerContext = Context<{ Variables: HonoInternalVariables & { findManyPaginatedMode?: FindManyPaginatedMode } }>
98
-
99
- function isQueryBuilderEnabled(config: RouteConfig): boolean {
100
- if (config.queryBuilder === false) return false
101
- if (typeof config.queryBuilder === 'object' && config.queryBuilder.enabled === false) return false
102
- if (_env.NODE_ENV === 'production') return false
103
- return true
104
- }
105
-
106
- function getQueryBuilderConfig(config: RouteConfig) {
107
- if (config.queryBuilder === false) return null
108
- if (typeof config.queryBuilder === 'object') return config.queryBuilder
109
- return {}
110
- }
96
+ type HandlerContext = Context<{ Variables: HonoInternalVariables }>
111
97
 
112
98
  async function parseQueryMiddleware(c: HandlerContext): Promise<void> {
113
99
  const raw = c.req.query() as Record<string, unknown>
@@ -139,7 +125,20 @@ async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
139
125
  if (!body || typeof body !== 'object' || Array.isArray(body)) {
140
126
  throw new HTTPException(400, { message: 'Request body must be a JSON object' })
141
127
  }
142
- c.set('body', sanitizeKeys(body as Record<string, unknown>))
128
+ c.set('body', body)
129
+ }
130
+
131
+ async function parseUpdateEachBodyMiddleware(c: HandlerContext): Promise<void> {
132
+ let body: unknown
133
+ try {
134
+ body = await c.req.json()
135
+ } catch {
136
+ throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
137
+ }
138
+ if (!Array.isArray(body)) {
139
+ throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
140
+ }
141
+ c.set('body', body)
143
142
  }
144
143
 
145
144
  function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
@@ -151,7 +150,6 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
151
150
  if (merged) {
152
151
  c.set('routeConfig', { pagination: merged })
153
152
  }
154
- ;(c as unknown as HandlerContext).set('findManyPaginatedMode', FIND_MANY_PAGINATED_MODE)
155
153
  const headerName = config.guard?.variantHeader || 'x-api-variant'
156
154
  const headerValue = c.req.header(headerName)
157
155
  const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
@@ -162,26 +160,24 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
162
160
  }
163
161
  }
164
162
 
165
- async function runHooks<TEnv extends HonoEnvBase>(
166
- hooks: HonoHookHandler<TEnv>[],
163
+ async function runBeforeHooks<TEnv extends HonoEnvBase>(
164
+ hooks: HonoBeforeHook<TEnv>[],
167
165
  c: Context<GeneratedHonoEnv<TEnv>>,
168
166
  ): Promise<Response | undefined> {
169
167
  for (const hook of hooks) {
170
- let advanced = false
171
- const next: Next = async () => {
172
- advanced = true
173
- }
174
- const result = await hook(c, next)
168
+ const result = await hook(c)
169
+ if (result instanceof Response) return result
170
+ }
171
+ return undefined
172
+ }
173
+
174
+ async function runAfterHooks<TEnv extends HonoEnvBase>(
175
+ hooks: HonoAfterHook<TEnv>[],
176
+ c: Context<GeneratedHonoEnv<TEnv>>,
177
+ ): Promise<Response | undefined> {
178
+ for (const hook of hooks) {
179
+ const result = await hook(c)
175
180
  if (result instanceof Response) return result
176
- if (!advanced) {
177
- if (_env.NODE_ENV !== 'production') {
178
- console.warn(
179
- '[hono-router] Hook returned without calling next() or returning a Response. ' +
180
- 'Use \`return c.json(...)\` to short-circuit, or \`await next()\` to continue.',
181
- )
182
- }
183
- return c.body(null) ?? undefined
184
- }
185
181
  }
186
182
  return undefined
187
183
  }
@@ -196,69 +192,81 @@ function sendResult(c: HandlerContext): Response {
196
192
  }
197
193
 
198
194
  function sendError(c: HandlerContext, error: unknown): Response {
195
+ if (error instanceof HTTPException) {
196
+ return c.json({ message: error.message }, error.status as ContentfulStatusCode)
197
+ }
199
198
  const httpError = mapError(error)
200
199
  return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
201
200
  }
202
201
 
203
202
  export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
203
+ validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
204
+ validateCountSourceWhere(
205
+ (config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
206
+ '${modelName} findManyPaginated pagination',
207
+ )
208
+
204
209
  const app = new Hono<GeneratedHonoEnv<TEnv>>()
205
210
 
211
+ const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
212
+
206
213
  const customPrefix = normalizePrefix(config.customUrlPrefix || '')
207
214
  const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
208
215
  const basePath = customPrefix + modelPrefix
209
216
 
210
217
  const openApiDisabled = config.disableOpenApi === true
211
218
  || (config.disableOpenApi !== false && (
212
- _env.DISABLE_OPENAPI === 'true'
213
- || _env.NODE_ENV === 'production'
219
+ _env.NODE_ENV === 'production'
220
+ || _env.DISABLE_OPENAPI === 'true'
214
221
  ))
215
222
 
216
223
  const postReadsEnabled = !config.disablePostReads
217
224
 
218
- const openApiJsonSpec = openApiDisabled
219
- ? null
220
- : buildModelOpenApi(
225
+ let _openApiJsonCache: unknown = undefined
226
+ const getOpenApiJson = (): unknown => {
227
+ if (_openApiJsonCache === undefined) {
228
+ _openApiJsonCache = buildModelOpenApi(
221
229
  '${modelName}',
222
230
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
223
231
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
224
232
  config as RouteConfig,
225
233
  { format: 'json', writeStrategy: WRITE_STRATEGY },
226
234
  )
227
- const openApiYamlSpec = openApiDisabled
228
- ? null
229
- : buildModelOpenApi(
235
+ }
236
+ return _openApiJsonCache
237
+ }
238
+ let _openApiYamlCache: string | undefined = undefined
239
+ const getOpenApiYaml = (): string => {
240
+ if (_openApiYamlCache === undefined) {
241
+ _openApiYamlCache = buildModelOpenApi(
230
242
  '${modelName}',
231
243
  MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
232
244
  MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
233
245
  config as RouteConfig,
234
246
  { format: 'yaml', writeStrategy: WRITE_STRATEGY },
235
- )
236
-
237
- if (isQueryBuilderEnabled(config as RouteConfig)) {
238
- const qbConfig = getQueryBuilderConfig(config as RouteConfig)
239
- if (qbConfig) {
240
- try {
241
- startQueryBuilder(qbConfig)
242
- } catch (err) {
243
- if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err)
244
- }
247
+ ) as string
245
248
  }
249
+ return _openApiYamlCache
250
+ }
251
+
252
+ if (config.queryBuilder && config.queryBuilder !== false && _env.NODE_ENV !== 'production') {
253
+ console.warn(
254
+ '[${modelName}Router] queryBuilder config is present but Hono target does not auto-start it. ' +
255
+ 'Run \`npx prisma-query-builder-ui\` in a separate process.',
256
+ )
246
257
  }
247
258
 
248
259
  app.onError((err, c) => {
249
- if (err instanceof HTTPException) {
250
- return c.json({ message: err.message }, err.status as ContentfulStatusCode)
251
- }
252
260
  return sendError(c as HandlerContext, err)
253
261
  })
254
262
 
255
263
  if (!openApiDisabled) {
256
264
  const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
257
265
  const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
258
- app.get(openapiJsonPath, (c) => c.json(openApiJsonSpec as Record<string, unknown>))
266
+ app.get(openapiJsonPath, (c) => c.json(getOpenApiJson() as Record<string, unknown>))
259
267
  app.get(openapiYamlPath, (c) => {
260
268
  c.header('Content-Type', 'application/yaml')
261
- return c.body(openApiYamlSpec as string)
269
+ return c.body(getOpenApiYaml())
262
270
  })
263
271
  }
264
272
 
@@ -271,10 +279,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
271
279
  await parseFn(c as unknown as HandlerContext)
272
280
  makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
273
281
  const { before = [], after = [] } = opConfig
274
- const beforeResp = await runHooks<TEnv>(before, c)
282
+ const beforeResp = await runBeforeHooks<TEnv>(before, c)
275
283
  if (beforeResp) return beforeResp
276
284
  await handlerFn(c as unknown as HandlerContext)
277
- const afterResp = await runHooks<TEnv>(after, c)
285
+ const afterResp = await runAfterHooks<TEnv>(after, c)
278
286
  if (afterResp) return afterResp
279
287
  return sendResult(c as unknown as HandlerContext)
280
288
  } catch (error: unknown) {
@@ -290,10 +298,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
290
298
  await parseWriteBodyMiddleware(c as unknown as HandlerContext)
291
299
  makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
292
300
  const { before = [], after = [] } = opConfig
293
- const beforeResp = await runHooks<TEnv>(before, c)
301
+ const beforeResp = await runBeforeHooks<TEnv>(before, c)
294
302
  if (beforeResp) return beforeResp
295
303
  await handlerFn(c as unknown as HandlerContext)
296
- const afterResp = await runHooks<TEnv>(after, c)
304
+ const afterResp = await runAfterHooks<TEnv>(after, c)
297
305
  if (afterResp) return afterResp
298
306
  return sendResult(c as unknown as HandlerContext)
299
307
  } catch (error: unknown) {
@@ -306,55 +314,55 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
306
314
  ?? (defaultOpConfig as OperationConfigLike<TEnv>)
307
315
  }
308
316
 
309
- if (config.enableAll || config.findFirst) {
317
+ if (isEnabled(config.findFirst)) {
310
318
  const opConfig = opFor('findFirst')
311
319
  const path = basePath ? \`\${basePath}/first\` : '/first'
312
320
  app.get(path, handleRead(opConfig, ${modelName}FindFirst, parseQueryMiddleware))
313
321
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirst, parseBodyAsQueryMiddleware))
314
322
  }
315
- if (config.enableAll || config.findFirstOrThrow) {
323
+ if (isEnabled(config.findFirstOrThrow)) {
316
324
  const opConfig = opFor('findFirstOrThrow')
317
325
  const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
318
326
  app.get(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseQueryMiddleware))
319
327
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseBodyAsQueryMiddleware))
320
328
  }
321
- if (config.enableAll || config.findManyPaginated) {
329
+ if (isEnabled(config.findManyPaginated)) {
322
330
  const opConfig = opFor('findManyPaginated')
323
331
  const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
324
332
  app.get(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseQueryMiddleware))
325
333
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseBodyAsQueryMiddleware))
326
334
  }
327
- if (config.enableAll || config.aggregate) {
335
+ if (isEnabled(config.aggregate)) {
328
336
  const opConfig = opFor('aggregate')
329
337
  const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
330
338
  app.get(path, handleRead(opConfig, ${modelName}Aggregate, parseQueryMiddleware))
331
339
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Aggregate, parseBodyAsQueryMiddleware))
332
340
  }
333
- if (config.enableAll || config.count) {
341
+ if (isEnabled(config.count)) {
334
342
  const opConfig = opFor('count')
335
343
  const path = basePath ? \`\${basePath}/count\` : '/count'
336
344
  app.get(path, handleRead(opConfig, ${modelName}Count, parseQueryMiddleware))
337
345
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Count, parseBodyAsQueryMiddleware))
338
346
  }
339
- if (config.enableAll || config.groupBy) {
347
+ if (isEnabled(config.groupBy)) {
340
348
  const opConfig = opFor('groupBy')
341
349
  const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
342
350
  app.get(path, handleRead(opConfig, ${modelName}GroupBy, parseQueryMiddleware))
343
351
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}GroupBy, parseBodyAsQueryMiddleware))
344
352
  }
345
- if (config.enableAll || config.findUniqueOrThrow) {
353
+ if (isEnabled(config.findUniqueOrThrow)) {
346
354
  const opConfig = opFor('findUniqueOrThrow')
347
355
  const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
348
356
  app.get(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseQueryMiddleware))
349
357
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseBodyAsQueryMiddleware))
350
358
  }
351
- if (config.enableAll || config.findUnique) {
359
+ if (isEnabled(config.findUnique)) {
352
360
  const opConfig = opFor('findUnique')
353
361
  const path = basePath ? \`\${basePath}/unique\` : '/unique'
354
362
  app.get(path, handleRead(opConfig, ${modelName}FindUnique, parseQueryMiddleware))
355
363
  if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUnique, parseBodyAsQueryMiddleware))
356
364
  }
357
- if (config.enableAll || config.findMany) {
365
+ if (isEnabled(config.findMany)) {
358
366
  const opConfig = opFor('findMany')
359
367
  const path = basePath || '/'
360
368
  app.get(path, handleRead(opConfig, ${modelName}FindMany, parseQueryMiddleware))
@@ -364,52 +372,78 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
364
372
  }
365
373
  }
366
374
 
367
- if (config.enableAll || config.createManyAndReturn) {
375
+ if (isEnabled(config.createManyAndReturn)) {
368
376
  const opConfig = opFor('createManyAndReturn')
369
377
  const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
370
378
  app.post(path, handleWrite(opConfig, ${modelName}CreateManyAndReturn))
371
379
  }
372
- if (config.enableAll || config.createMany) {
380
+ if (isEnabled(config.createMany)) {
373
381
  const opConfig = opFor('createMany')
374
382
  const path = basePath ? \`\${basePath}/many\` : '/many'
375
383
  app.post(path, handleWrite(opConfig, ${modelName}CreateMany))
376
384
  }
377
- if (config.enableAll || config.create) {
385
+ if (isEnabled(config.create)) {
378
386
  const opConfig = opFor('create')
379
387
  const path = basePath || '/'
380
388
  app.post(path, handleWrite(opConfig, ${modelName}Create))
381
389
  }
382
- if (config.enableAll || config.updateManyAndReturn) {
390
+ if (isEnabled(config.updateManyAndReturn)) {
383
391
  const opConfig = opFor('updateManyAndReturn')
384
392
  const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
385
393
  app.put(path, handleWrite(opConfig, ${modelName}UpdateManyAndReturn))
386
394
  }
387
- if (config.enableAll || config.updateMany) {
395
+ if (isEnabled(config.updateMany)) {
388
396
  const opConfig = opFor('updateMany')
389
397
  const path = basePath ? \`\${basePath}/many\` : '/many'
390
398
  app.put(path, handleWrite(opConfig, ${modelName}UpdateMany))
391
399
  }
392
- if (config.enableAll || config.update) {
400
+ if (isEnabled(config.update)) {
393
401
  const opConfig = opFor('update')
394
402
  const path = basePath || '/'
395
403
  app.put(path, handleWrite(opConfig, ${modelName}Update))
396
404
  }
397
- if (config.enableAll || config.upsert) {
405
+ if (isEnabled(config.upsert)) {
398
406
  const opConfig = opFor('upsert')
399
407
  const path = basePath || '/'
400
408
  app.patch(path, handleWrite(opConfig, ${modelName}Upsert))
401
409
  }
402
- if (config.enableAll || config.deleteMany) {
410
+ if (isEnabled(config.deleteMany)) {
403
411
  const opConfig = opFor('deleteMany')
404
412
  const path = basePath ? \`\${basePath}/many\` : '/many'
405
413
  app.delete(path, handleWrite(opConfig, ${modelName}DeleteMany))
406
414
  }
407
- if (config.enableAll || config.delete) {
415
+ if (isEnabled(config.delete)) {
408
416
  const opConfig = opFor('delete')
409
417
  const path = basePath || '/'
410
418
  app.delete(path, handleWrite(opConfig, ${modelName}Delete))
411
419
  }
412
420
 
421
+ if (config.updateEach) {
422
+ const opConfig = (config.updateEach as unknown as OperationConfigLike<TEnv> | undefined) ?? (defaultOpConfig as OperationConfigLike<TEnv>)
423
+ if ((!opConfig.before || opConfig.before.length === 0) && _env.NODE_ENV !== 'production') {
424
+ console.warn(
425
+ '[${modelName}Router] updateEach is enabled without a before hook. ' +
426
+ 'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
427
+ )
428
+ }
429
+ const path = basePath ? \`\${basePath}/each\` : '/each'
430
+ app.post(path, async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
431
+ try {
432
+ await parseUpdateEachBodyMiddleware(c as unknown as HandlerContext)
433
+ makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
434
+ const { before = [], after = [] } = opConfig
435
+ const beforeResp = await runBeforeHooks<TEnv>(before, c)
436
+ if (beforeResp) return beforeResp
437
+ await ${modelName}UpdateEach(c as unknown as HandlerContext)
438
+ const afterResp = await runAfterHooks<TEnv>(after, c)
439
+ if (afterResp) return afterResp
440
+ return sendResult(c as unknown as HandlerContext)
441
+ } catch (error: unknown) {
442
+ return sendError(c as unknown as HandlerContext, error)
443
+ }
444
+ })
445
+ }
446
+
413
447
  return app
414
448
  }
415
449
  `;
@@ -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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"}
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ const writeFileSafely_1 = require("./utils/writeFileSafely");
21
21
  const copyFiles_1 = require("./utils/copyFiles");
22
22
  const resolveImportStyle_1 = require("./utils/resolveImportStyle");
23
23
  const constants_1 = require("./constants");
24
- const GENERATOR_OFF_RE = /\bgenerator off\b/;
24
+ const GENERATOR_OFF_RE = /^\s*generator off\s*$/m;
25
25
  function getTarget(options) {
26
26
  const raw = String(options.generator.config.target ?? 'express').toLowerCase();
27
27
  if (raw === 'express' || raw === 'fastify' || raw === 'hono')
@@ -72,7 +72,7 @@ function validateClientGeneratorPresent(options) {
72
72
  onManifest() {
73
73
  return {
74
74
  version: require('../package.json').version,
75
- defaultOutput: '../generated/express',
75
+ defaultOutput: '../generated/output',
76
76
  prettyName: constants_1.GENERATOR_NAME,
77
77
  };
78
78
  },
@@ -81,7 +81,7 @@ function validateClientGeneratorPresent(options) {
81
81
  const writeStrategy = getWriteStrategy(options);
82
82
  const findManyPaginatedMode = getFindManyPaginatedMode(options);
83
83
  const dropGuard = getDropGuard(options);
84
- const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated', target);
84
+ const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated', 'output');
85
85
  const currentOutput = options.generator.output?.value;
86
86
  const isUnsetOrManifestDefault = !currentOutput || path_1.default.resolve(currentOutput) === manifestDefaultAbs;
87
87
  if (isUnsetOrManifestDefault) {
@@ -96,7 +96,7 @@ function validateClientGeneratorPresent(options) {
96
96
  console.log(` Import style: ${importStyle}`);
97
97
  console.log(` Write strategy: ${writeStrategy}`);
98
98
  console.log(` findManyPaginated mode: ${findManyPaginatedMode}`);
99
- console.log(` Drop guard: ${dropGuard}`);
99
+ console.log(` Drop guard (generator): ${dropGuard}${dropGuard ? '' : ' (runtime E2E=true will also drop guard)'}`);
100
100
  if (options.dmmf.datamodel.models.length > 0) {
101
101
  validateClientGeneratorPresent(options);
102
102
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prisma-generator-express",
3
3
  "description": "Prisma generator for Express, Fastify, and Hono CRUD APIs with OpenAPI documentation",
4
- "version": "1.57.0",
4
+ "version": "1.58.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
@@ -393,11 +393,13 @@ async function runAutoIncludeSingle(
393
393
  const publicState: Record<string, unknown> = { ...publicRoot }
394
394
  for (const [k, v] of Object.entries(publicRoot)) {
395
395
  if (isClientGone()) return
396
- sendSSEField(res, k, v)
396
+ const okField = sendSSEField(res, k, v)
397
+ if (!okField) return
397
398
  }
398
399
 
399
400
  if (isClientGone()) return
400
- sendSSEProgress(res, 'root', 0, plan.stages.length)
401
+ const okStart = sendSSEProgress(res, 'root', 0, plan.stages.length)
402
+ if (!okStart) return
401
403
 
402
404
  const groups = groupStagesByDepth(plan.stages)
403
405
  let completed = 0
@@ -433,7 +435,8 @@ async function runAutoIncludeSingle(
433
435
  }
434
436
  if (isAborted()) return
435
437
  completed++
436
- sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
438
+ const ok = sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
439
+ if (!ok) return
437
440
  })
438
441
  }
439
442
 
@@ -699,7 +702,8 @@ async function processFindManyStages(args: {
699
702
  }
700
703
  if (isAborted()) return
701
704
  completed++
702
- sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
705
+ const ok = sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
706
+ if (!ok) return
703
707
  })
704
708
  }
705
709
  return stageErrorMessage
@@ -875,7 +879,7 @@ async function runAutoIncludePaginated(
875
879
  const skip = typeof rootArgs.skip === 'number' ? rootArgs.skip : 0
876
880
  const takeRaw = typeof rootArgs.take === 'number' ? rootArgs.take : rootRows.length
877
881
  const absTake = Math.abs(takeRaw)
878
- const hasMore = rootRows.length >= absTake && skip + rootRows.length < total
882
+ const hasMore = absTake > 0 && rootRows.length >= absTake && skip + rootRows.length < total
879
883
 
880
884
  const { publicRows, rootPairs } = buildRootPairs(rootRows, plan.internalFieldPaths)
881
885