prisma-generator-express 1.55.0 → 1.56.1
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.
- package/README.md +131 -12
- package/dist/constants.d.ts +1 -0
- package/dist/generators/generateFastifyHandler.js +3 -1
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.js +3 -1
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateOperationCore.d.ts +2 -1
- package/dist/generators/generateOperationCore.js +38 -36
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRouteConfigType.js +2 -1
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.d.ts +3 -2
- package/dist/generators/generateRouter.js +16 -5
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +3 -2
- package/dist/generators/generateRouterFastify.js +19 -7
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +3 -2
- package/dist/generators/generateRouterHono.js +24 -14
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +3 -1
- package/src/copy/autoIncludeRuntime.ts +60 -35
- package/src/copy/docsRenderer.ts +5 -4
- package/src/copy/operationRuntime.ts +94 -9
- package/src/copy/routeConfig.express.ts +6 -0
- package/src/copy/routeConfig.fastify.ts +7 -1
- package/src/copy/routeConfig.hono.ts +8 -2
- package/src/copy/routeConfig.ts +21 -5
- package/src/generators/generateFastifyHandler.ts +3 -1
- package/src/generators/generateHonoHandler.ts +3 -1
- package/src/generators/generateOperationCore.ts +42 -37
- package/src/generators/generateRouteConfigType.ts +2 -2
- package/src/generators/generateRouter.ts +18 -5
- package/src/generators/generateRouterFastify.ts +21 -7
- package/src/generators/generateRouterHono.ts +26 -14
- 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 {
|
|
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
|
|
160
|
-
if (
|
|
161
|
-
c.set('routeConfig', { pagination:
|
|
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({
|
|
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({
|