prisma-generator-express 1.55.0 → 1.56.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 (39) hide show
  1. package/README.md +131 -12
  2. package/dist/constants.d.ts +1 -0
  3. package/dist/generators/generateFastifyHandler.js +3 -1
  4. package/dist/generators/generateFastifyHandler.js.map +1 -1
  5. package/dist/generators/generateHonoHandler.js +3 -1
  6. package/dist/generators/generateHonoHandler.js.map +1 -1
  7. package/dist/generators/generateOperationCore.d.ts +2 -1
  8. package/dist/generators/generateOperationCore.js +38 -36
  9. package/dist/generators/generateOperationCore.js.map +1 -1
  10. package/dist/generators/generateRouteConfigType.js +4 -1
  11. package/dist/generators/generateRouteConfigType.js.map +1 -1
  12. package/dist/generators/generateRouter.d.ts +3 -2
  13. package/dist/generators/generateRouter.js +16 -5
  14. package/dist/generators/generateRouter.js.map +1 -1
  15. package/dist/generators/generateRouterFastify.d.ts +3 -2
  16. package/dist/generators/generateRouterFastify.js +19 -7
  17. package/dist/generators/generateRouterFastify.js.map +1 -1
  18. package/dist/generators/generateRouterHono.d.ts +3 -2
  19. package/dist/generators/generateRouterHono.js +24 -14
  20. package/dist/generators/generateRouterHono.js.map +1 -1
  21. package/dist/index.js +20 -1
  22. package/dist/index.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/constants.ts +3 -1
  25. package/src/copy/autoIncludeRuntime.ts +60 -35
  26. package/src/copy/docsRenderer.ts +5 -4
  27. package/src/copy/operationRuntime.ts +94 -9
  28. package/src/copy/routeConfig.express.ts +6 -0
  29. package/src/copy/routeConfig.fastify.ts +7 -1
  30. package/src/copy/routeConfig.hono.ts +8 -2
  31. package/src/copy/routeConfig.ts +21 -5
  32. package/src/generators/generateFastifyHandler.ts +3 -1
  33. package/src/generators/generateHonoHandler.ts +3 -1
  34. package/src/generators/generateOperationCore.ts +42 -37
  35. package/src/generators/generateRouteConfigType.ts +5 -2
  36. package/src/generators/generateRouter.ts +18 -5
  37. package/src/generators/generateRouterFastify.ts +21 -7
  38. package/src/generators/generateRouterHono.ts +26 -14
  39. package/src/index.ts +24 -2
@@ -2,7 +2,7 @@ import { DMMF } from '@prisma/generator-helper'
2
2
  import { generateRouteConfigType } from './generateRouteConfigType'
3
3
  import { ImportStyle } from '../utils/resolveImportStyle'
4
4
  import { importExt } from '../utils/importExt'
5
- import { WriteStrategy } from '../constants'
5
+ import { WriteStrategy, FindManyPaginatedMode } from '../constants'
6
6
 
7
7
  export function generateHonoRouterFunction({
8
8
  model,
@@ -10,12 +10,14 @@ export function generateHonoRouterFunction({
10
10
  guardShapesImport,
11
11
  importStyle,
12
12
  writeStrategy,
13
+ findManyPaginatedMode,
13
14
  }: {
14
15
  model: DMMF.Model
15
16
  enums: DMMF.DatamodelEnum[]
16
17
  guardShapesImport: string | null
17
18
  importStyle: ImportStyle
18
19
  writeStrategy: WriteStrategy
20
+ findManyPaginatedMode: FindManyPaginatedMode
19
21
  }): string {
20
22
  const ext = importExt(importStyle)
21
23
  const modelName = model.name
@@ -77,16 +79,24 @@ import type {
77
79
  HonoInternalVariables,
78
80
  GeneratedHonoEnv,
79
81
  WriteStrategy,
82
+ FindManyPaginatedMode,
83
+ PaginationConfig,
80
84
  } from '../routeConfig.target${ext}'
81
85
  import { parseQueryParams } from '../parseQueryParams${ext}'
82
86
  import { sanitizeKeys, normalizePrefix, getEnv } from '../misc${ext}'
83
87
  import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
84
- import { mapError, transformResult, type OperationContext } from '../operationRuntime${ext}'
88
+ import {
89
+ mapError,
90
+ transformResult,
91
+ mergePaginationConfig,
92
+ type OperationContext,
93
+ } from '../operationRuntime${ext}'
85
94
 
86
95
  ${generateRouteConfigType(modelName, 'HonoHookHandler', guardShapesImport, importStyle, 'hono')}
87
96
  const _env = getEnv()
88
97
 
89
98
  const WRITE_STRATEGY: WriteStrategy = '${writeStrategy}'
99
+ const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
90
100
 
91
101
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
92
102
 
@@ -96,6 +106,7 @@ type OperationConfigLike<TEnv extends HonoEnvBase> = {
96
106
  before?: HonoHookHandler<TEnv>[]
97
107
  after?: HonoHookHandler<TEnv>[]
98
108
  shape?: Record<string, unknown>
109
+ pagination?: Partial<PaginationConfig>
99
110
  }
100
111
 
101
112
  const defaultOpConfig = Object.freeze({
@@ -103,7 +114,7 @@ const defaultOpConfig = Object.freeze({
103
114
  after: Object.freeze([]),
104
115
  }) as unknown as OperationConfigLike<HonoEnvBase>
105
116
 
106
- type HandlerContext = Context<{ Variables: HonoInternalVariables }>
117
+ type HandlerContext = Context<{ Variables: HonoInternalVariables & { findManyPaginatedMode?: FindManyPaginatedMode } }>
107
118
 
108
119
  function isQueryBuilderEnabled(config: RouteConfig): boolean {
109
120
  if (config.queryBuilder === false) return false
@@ -156,10 +167,11 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
156
167
  opConfig: OperationConfigLike<TEnv>,
157
168
  ) {
158
169
  return (c: Context<GeneratedHonoEnv<TEnv>>): void => {
159
- const paginationConfig = (config as { pagination?: OperationContext['paginationConfig'] }).pagination
160
- if (paginationConfig) {
161
- c.set('routeConfig', { pagination: paginationConfig })
170
+ const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
171
+ if (merged) {
172
+ c.set('routeConfig', { pagination: merged })
162
173
  }
174
+ ;(c as unknown as HandlerContext).set('findManyPaginatedMode', FIND_MANY_PAGINATED_MODE)
163
175
  const headerName = config.guard?.variantHeader || 'x-api-variant'
164
176
  const headerValue = c.req.header(headerName)
165
177
  const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
@@ -276,17 +288,17 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
276
288
  parseFn: (c: HandlerContext) => Promise<void>,
277
289
  ) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
278
290
  try {
279
- await parseFn(c)
291
+ await parseFn(c as unknown as HandlerContext)
280
292
  makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
281
293
  const { before = [], after = [] } = opConfig
282
294
  const beforeResp = await runHooks<TEnv>(before, c)
283
295
  if (beforeResp) return beforeResp
284
- await handlerFn(c)
296
+ await handlerFn(c as unknown as HandlerContext)
285
297
  const afterResp = await runHooks<TEnv>(after, c)
286
298
  if (afterResp) return afterResp
287
- return sendResult(c)
299
+ return sendResult(c as unknown as HandlerContext)
288
300
  } catch (error: unknown) {
289
- return sendError(c, error)
301
+ return sendError(c as unknown as HandlerContext, error)
290
302
  }
291
303
  }
292
304
 
@@ -295,17 +307,17 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
295
307
  handlerFn: (c: HandlerContext) => Promise<void>,
296
308
  ) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
297
309
  try {
298
- await parseWriteBodyMiddleware(c)
310
+ await parseWriteBodyMiddleware(c as unknown as HandlerContext)
299
311
  makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
300
312
  const { before = [], after = [] } = opConfig
301
313
  const beforeResp = await runHooks<TEnv>(before, c)
302
314
  if (beforeResp) return beforeResp
303
- await handlerFn(c)
315
+ await handlerFn(c as unknown as HandlerContext)
304
316
  const afterResp = await runHooks<TEnv>(after, c)
305
317
  if (afterResp) return afterResp
306
- return sendResult(c)
318
+ return sendResult(c as unknown as HandlerContext)
307
319
  } catch (error: unknown) {
308
- return sendError(c, error)
320
+ return sendError(c as unknown as HandlerContext, error)
309
321
  }
310
322
  }
311
323
 
package/src/index.ts CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  import { writeFileSafely } from './utils/writeFileSafely'
26
26
  import { copyFiles } from './utils/copyFiles'
27
27
  import { resolveImportStyle, ImportStyle } from './utils/resolveImportStyle'
28
- import { GENERATOR_NAME, Target, WriteStrategy } from './constants'
28
+ import { GENERATOR_NAME, Target, WriteStrategy, FindManyPaginatedMode } from './constants'
29
29
 
30
30
  const GENERATOR_OFF_RE = /\bgenerator off\b/
31
31
 
@@ -56,6 +56,18 @@ function getWriteStrategy(options: GeneratorOptions): WriteStrategy {
56
56
  )
57
57
  }
58
58
 
59
+ function getFindManyPaginatedMode(options: GeneratorOptions): FindManyPaginatedMode {
60
+ const raw = String(
61
+ (options.generator.config as Record<string, unknown>).findManyPaginatedMode ?? 'promiseAll',
62
+ )
63
+ const lower = raw.toLowerCase()
64
+ if (lower === 'transaction') return 'transaction'
65
+ if (lower === 'promiseall') return 'promiseAll'
66
+ throw new Error(
67
+ `Invalid findManyPaginatedMode "${raw}". Expected "transaction" or "promiseAll".`,
68
+ )
69
+ }
70
+
59
71
  function validateClientGeneratorPresent(options: GeneratorOptions): void {
60
72
  getRelativeClientPath(options, options.dmmf.datamodel.models[0]?.name ?? 'Model')
61
73
  }
@@ -72,6 +84,7 @@ generatorHandler({
72
84
  async onGenerate(options: GeneratorOptions) {
73
85
  const target = getTarget(options)
74
86
  const writeStrategy = getWriteStrategy(options)
87
+ const findManyPaginatedMode = getFindManyPaginatedMode(options)
75
88
  const hasExplicitOutput =
76
89
  !!options.generator.output?.fromEnvVar ||
77
90
  (options.generator.config as Record<string, unknown>).output !== undefined
@@ -89,6 +102,7 @@ generatorHandler({
89
102
  console.log(` Output: ${options.generator.output?.value}`)
90
103
  console.log(` Import style: ${importStyle}`)
91
104
  console.log(` Write strategy: ${writeStrategy}`)
105
+ console.log(` findManyPaginated mode: ${findManyPaginatedMode}`)
92
106
 
93
107
  if (options.dmmf.datamodel.models.length > 0) {
94
108
  validateClientGeneratorPresent(options)
@@ -119,7 +133,12 @@ generatorHandler({
119
133
  const guardShapesImport = getGuardShapesImport(options, model.name)
120
134
 
121
135
  await writeFileSafely({
122
- content: generateModelCore({ model: model as DMMF.Model, importStyle, writeStrategy }),
136
+ content: generateModelCore({
137
+ model: model as DMMF.Model,
138
+ importStyle,
139
+ writeStrategy,
140
+ findManyPaginatedMode,
141
+ }),
123
142
  options,
124
143
  model: model as DMMF.Model,
125
144
  operation: 'Core',
@@ -140,6 +159,7 @@ generatorHandler({
140
159
  guardShapesImport,
141
160
  importStyle,
142
161
  writeStrategy,
162
+ findManyPaginatedMode,
143
163
  })
144
164
  : target === 'hono'
145
165
  ? generateHonoRouterFunction({
@@ -148,6 +168,7 @@ generatorHandler({
148
168
  guardShapesImport,
149
169
  importStyle,
150
170
  writeStrategy,
171
+ findManyPaginatedMode,
151
172
  })
152
173
  : generateRouterFunction({
153
174
  model: model as DMMF.Model,
@@ -155,6 +176,7 @@ generatorHandler({
155
176
  guardShapesImport,
156
177
  importStyle,
157
178
  writeStrategy,
179
+ findManyPaginatedMode,
158
180
  })
159
181
 
160
182
  await writeFileSafely({