prisma-generator-express 1.62.3 → 1.63.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.
- package/README.md +234 -95
- package/dist/generators/generateRouteConfigType.js +26 -6
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.js +245 -44
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.js +100 -28
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.js +104 -36
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/utils/copyFiles.js +2 -0
- package/dist/utils/copyFiles.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/docsRenderer.ts +1 -0
- package/src/copy/guardVariantError.ts +28 -0
- package/src/copy/guardVariantRouting.ts +109 -0
- package/src/copy/projectionDefaults.ts +5 -6
- package/src/copy/routeConfig.hono.ts +15 -5
- package/src/copy/routeConfig.ts +220 -27
- package/src/generators/generateRouteConfigType.ts +37 -6
- package/src/generators/generateRouter.ts +246 -44
- package/src/generators/generateRouterFastify.ts +100 -28
- package/src/generators/generateRouterHono.ts +104 -36
- package/src/utils/copyFiles.ts +2 -0
|
@@ -56,7 +56,7 @@ function emitReadOp(meta, modelName) {
|
|
|
56
56
|
: ` if (postReadsEnabled) instance.post(path, handleRead(opConfig, ${handlerName}, parseBodyAsQueryHook, '${opKind}'))`
|
|
57
57
|
: '';
|
|
58
58
|
return ` if (isEnabled(config.${meta.configKey})) {
|
|
59
|
-
const opConfig
|
|
59
|
+
const opConfig = opFor('${meta.configKey}')
|
|
60
60
|
const path = ${pathValue}
|
|
61
61
|
instance.get(path, handleRead(opConfig, ${handlerName}, parseQueryHook, '${opKind}'))
|
|
62
62
|
${postReadLine}
|
|
@@ -68,7 +68,7 @@ function emitWriteOp(meta, modelName) {
|
|
|
68
68
|
const pathValue = pathExpr(meta.pathSuffix);
|
|
69
69
|
const opKind = opKindFor(meta.name);
|
|
70
70
|
return ` if (isEnabled(config.${meta.configKey})) {
|
|
71
|
-
const opConfig
|
|
71
|
+
const opConfig = opFor('${meta.configKey}')
|
|
72
72
|
const path = ${pathValue}
|
|
73
73
|
instance.${meta.method}(path, handleWrite(opConfig, ${handlerName}, '${opKind}'))
|
|
74
74
|
}`;
|
|
@@ -100,10 +100,19 @@ import type {
|
|
|
100
100
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
101
101
|
import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject } from '../misc${ext}'
|
|
102
102
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
103
|
-
import {
|
|
103
|
+
import {
|
|
104
|
+
normalizeOperation,
|
|
105
|
+
resolveOperationVariantKey,
|
|
106
|
+
validateCountSourceWhere,
|
|
107
|
+
validateOperationConfig,
|
|
108
|
+
validateUpdateEachConfig,
|
|
109
|
+
} from '../routeConfig${ext}'
|
|
110
|
+
import type { NormalizedOperationConfig } from '../routeConfig${ext}'
|
|
104
111
|
import type { OperationContext } from '../operationRuntime${ext}'
|
|
105
112
|
import { transformResult } from '../operationRuntime${ext}'
|
|
106
113
|
import { HttpError, mapError } from '../errorMapper${ext}'
|
|
114
|
+
import { formatGuardVariantResolutionError } from '../guardVariantError${ext}'
|
|
115
|
+
import type { GuardVariantResolution } from '../guardVariantRouting${ext}'
|
|
107
116
|
import { mergePaginationConfig } from '../pagination${ext}'
|
|
108
117
|
import { applyDroppedGuard } from '../projectionDefaults${ext}'
|
|
109
118
|
import type { OpKind } from '../projectionDefaults${ext}'
|
|
@@ -118,10 +127,23 @@ const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
|
|
|
118
127
|
type OperationConfigLike = {
|
|
119
128
|
before?: FastifyHookHandler[]
|
|
120
129
|
after?: FastifyHookHandler[]
|
|
121
|
-
shape?:
|
|
130
|
+
shape?: unknown
|
|
131
|
+
variants?: Record<
|
|
132
|
+
string,
|
|
133
|
+
{
|
|
134
|
+
shape?: unknown
|
|
135
|
+
before?: FastifyHookHandler[]
|
|
136
|
+
after?: FastifyHookHandler[]
|
|
137
|
+
}
|
|
138
|
+
>
|
|
122
139
|
pagination?: Partial<PaginationConfig>
|
|
123
140
|
}
|
|
124
141
|
|
|
142
|
+
type NormalizedOp = NormalizedOperationConfig<
|
|
143
|
+
FastifyHookHandler,
|
|
144
|
+
FastifyHookHandler
|
|
145
|
+
>
|
|
146
|
+
|
|
125
147
|
type FastifyExtended = FastifyRequest & {
|
|
126
148
|
prisma?: unknown
|
|
127
149
|
postgres?: unknown
|
|
@@ -130,14 +152,17 @@ type FastifyExtended = FastifyRequest & {
|
|
|
130
152
|
routeConfig?: { pagination?: PaginationConfig }
|
|
131
153
|
guardShape?: Record<string, unknown>
|
|
132
154
|
guardCaller?: string
|
|
155
|
+
guardVariantKey?: string
|
|
156
|
+
guardVariantFailure?: Extract<GuardVariantResolution, { ok: false }>
|
|
133
157
|
resultData?: unknown
|
|
134
158
|
resultStatus?: number
|
|
135
159
|
}
|
|
136
160
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
161
|
+
function normalizeFastifyOperation(
|
|
162
|
+
config: OperationConfigLike | undefined,
|
|
163
|
+
): NormalizedOp {
|
|
164
|
+
return normalizeOperation<FastifyHookHandler, FastifyHookHandler>(config)
|
|
165
|
+
}
|
|
141
166
|
|
|
142
167
|
function isQueryBuilderEnabled(config: RouteConfig): boolean {
|
|
143
168
|
if (config.queryBuilder === false) return false
|
|
@@ -177,7 +202,7 @@ function buildResolveContext(
|
|
|
177
202
|
|
|
178
203
|
function makeShapeHook(
|
|
179
204
|
config: ${modelName}RouteConfig,
|
|
180
|
-
opConfig:
|
|
205
|
+
opConfig: NormalizedOp,
|
|
181
206
|
opKind: OpKind,
|
|
182
207
|
): (request: FastifyRequest) => Promise<void> {
|
|
183
208
|
return async (request: FastifyRequest) => {
|
|
@@ -190,15 +215,27 @@ function makeShapeHook(
|
|
|
190
215
|
const caller = config.guard?.resolveVariant?.(request)
|
|
191
216
|
?? (Array.isArray(headerValue) ? headerValue[0] : headerValue)
|
|
192
217
|
?? undefined
|
|
193
|
-
if (caller) fx.guardCaller = caller
|
|
218
|
+
if (typeof caller === 'string') fx.guardCaller = caller
|
|
219
|
+
|
|
220
|
+
const resolution = resolveOperationVariantKey(opConfig.guardRouting, caller)
|
|
221
|
+
if (!resolution.ok) {
|
|
222
|
+
fx.guardVariantFailure = resolution
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const resolvedKey =
|
|
227
|
+
opConfig.guardRouting.kind === 'named'
|
|
228
|
+
? resolution.key
|
|
229
|
+
: undefined
|
|
230
|
+
if (resolvedKey !== undefined) fx.guardVariantKey = resolvedKey
|
|
194
231
|
|
|
195
|
-
if (opConfig.
|
|
232
|
+
if (opConfig.guardShape) {
|
|
196
233
|
if (!DROP_GUARD) {
|
|
197
|
-
fx.guardShape = opConfig.
|
|
234
|
+
fx.guardShape = opConfig.guardShape
|
|
198
235
|
} else {
|
|
199
236
|
await applyDroppedGuard(
|
|
200
|
-
opConfig.
|
|
201
|
-
|
|
237
|
+
opConfig.guardShape,
|
|
238
|
+
resolvedKey,
|
|
202
239
|
buildResolveContext(config, request),
|
|
203
240
|
opKind,
|
|
204
241
|
{
|
|
@@ -224,7 +261,7 @@ function makeShapeHook(
|
|
|
224
261
|
}
|
|
225
262
|
|
|
226
263
|
async function runHooks(
|
|
227
|
-
hooks: FastifyHookHandler[],
|
|
264
|
+
hooks: readonly FastifyHookHandler[],
|
|
228
265
|
request: FastifyRequest,
|
|
229
266
|
reply: FastifyReply,
|
|
230
267
|
): Promise<boolean> {
|
|
@@ -265,6 +302,12 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
265
302
|
await fastify.register(async (instance) => {
|
|
266
303
|
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
267
304
|
|
|
305
|
+
const opFor = (key: string): NormalizedOp => {
|
|
306
|
+
const raw = (config as unknown as Record<string, unknown>)[key] as OperationConfigLike | undefined
|
|
307
|
+
validateOperationConfig(raw, '${modelName}.' + key)
|
|
308
|
+
return normalizeFastifyOperation(raw)
|
|
309
|
+
}
|
|
310
|
+
|
|
268
311
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
269
312
|
const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
|
|
270
313
|
const basePath = customPrefix + modelPrefix
|
|
@@ -342,7 +385,7 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
342
385
|
}
|
|
343
386
|
|
|
344
387
|
const handleRead = (
|
|
345
|
-
opConfig:
|
|
388
|
+
opConfig: NormalizedOp,
|
|
346
389
|
handlerFn: (req: FastifyRequest, reply: FastifyReply) => Promise<void>,
|
|
347
390
|
parseFn: (req: FastifyRequest) => void,
|
|
348
391
|
opKind: OpKind,
|
|
@@ -350,10 +393,24 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
350
393
|
try {
|
|
351
394
|
parseFn(request)
|
|
352
395
|
await makeShapeHook(config, opConfig, opKind)(request)
|
|
353
|
-
|
|
354
|
-
|
|
396
|
+
if (await runHooks(opConfig.operationBefore, request, reply)) return
|
|
397
|
+
|
|
398
|
+
const fx = request as FastifyExtended
|
|
399
|
+
if (fx.guardVariantFailure) {
|
|
400
|
+
throw new HttpError(
|
|
401
|
+
400,
|
|
402
|
+
formatGuardVariantResolutionError(fx.guardVariantFailure),
|
|
403
|
+
)
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const key = fx.guardVariantKey
|
|
407
|
+
const variantHooks =
|
|
408
|
+
key !== undefined ? opConfig.variantHooks[key] : undefined
|
|
409
|
+
|
|
410
|
+
if (await runHooks(variantHooks?.before ?? [], request, reply)) return
|
|
355
411
|
await handlerFn(request, reply)
|
|
356
|
-
if (await runHooks(after, request, reply)) return
|
|
412
|
+
if (await runHooks(variantHooks?.after ?? [], request, reply)) return
|
|
413
|
+
if (await runHooks(opConfig.operationAfter, request, reply)) return
|
|
357
414
|
sendResult(request, reply)
|
|
358
415
|
} catch (error: unknown) {
|
|
359
416
|
sendError(reply, error)
|
|
@@ -361,16 +418,30 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
361
418
|
}
|
|
362
419
|
|
|
363
420
|
const handleWrite = (
|
|
364
|
-
opConfig:
|
|
421
|
+
opConfig: NormalizedOp,
|
|
365
422
|
handlerFn: (req: FastifyRequest, reply: FastifyReply) => Promise<void>,
|
|
366
423
|
opKind: OpKind,
|
|
367
424
|
) => async (request: FastifyRequest, reply: FastifyReply) => {
|
|
368
425
|
try {
|
|
369
426
|
await makeShapeHook(config, opConfig, opKind)(request)
|
|
370
|
-
|
|
371
|
-
|
|
427
|
+
if (await runHooks(opConfig.operationBefore, request, reply)) return
|
|
428
|
+
|
|
429
|
+
const fx = request as FastifyExtended
|
|
430
|
+
if (fx.guardVariantFailure) {
|
|
431
|
+
throw new HttpError(
|
|
432
|
+
400,
|
|
433
|
+
formatGuardVariantResolutionError(fx.guardVariantFailure),
|
|
434
|
+
)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const key = fx.guardVariantKey
|
|
438
|
+
const variantHooks =
|
|
439
|
+
key !== undefined ? opConfig.variantHooks[key] : undefined
|
|
440
|
+
|
|
441
|
+
if (await runHooks(variantHooks?.before ?? [], request, reply)) return
|
|
372
442
|
await handlerFn(request, reply)
|
|
373
|
-
if (await runHooks(after, request, reply)) return
|
|
443
|
+
if (await runHooks(variantHooks?.after ?? [], request, reply)) return
|
|
444
|
+
if (await runHooks(opConfig.operationAfter, request, reply)) return
|
|
374
445
|
sendResult(request, reply)
|
|
375
446
|
} catch (error: unknown) {
|
|
376
447
|
sendError(reply, error)
|
|
@@ -382,8 +453,10 @@ ${readOpBlocks}
|
|
|
382
453
|
${writeOpBlocks}
|
|
383
454
|
|
|
384
455
|
if (config.updateEach) {
|
|
385
|
-
const
|
|
386
|
-
|
|
456
|
+
const rawUpdateEach = config.updateEach as unknown as OperationConfigLike
|
|
457
|
+
validateUpdateEachConfig(rawUpdateEach, '${modelName}.updateEach')
|
|
458
|
+
const opConfig = normalizeFastifyOperation(rawUpdateEach)
|
|
459
|
+
if (opConfig.operationBefore.length === 0 && _env.NODE_ENV !== 'production') {
|
|
387
460
|
console.warn(
|
|
388
461
|
'[${modelName}Router] updateEach is enabled without a before hook. ' +
|
|
389
462
|
'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
|
|
@@ -396,10 +469,9 @@ ${writeOpBlocks}
|
|
|
396
469
|
throw new HttpError(400, 'updateEach body must be an array of { where, data } items')
|
|
397
470
|
}
|
|
398
471
|
await makeShapeHook(config, opConfig, 'noop')(request)
|
|
399
|
-
|
|
400
|
-
if (await runHooks(before, request, reply)) return
|
|
472
|
+
if (await runHooks(opConfig.operationBefore, request, reply)) return
|
|
401
473
|
await ${modelName}UpdateEach(request, reply)
|
|
402
|
-
if (await runHooks(
|
|
474
|
+
if (await runHooks(opConfig.operationAfter, request, reply)) return
|
|
403
475
|
sendResult(request, reply)
|
|
404
476
|
} catch (error: unknown) {
|
|
405
477
|
sendError(reply, error)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":";;AAwFA,
|
|
1
|
+
{"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,9 +105,17 @@ import type {
|
|
|
105
105
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
106
106
|
import { normalizePrefix, getEnv, sanitizeKeys, isPlainObject } from '../misc${ext}'
|
|
107
107
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
108
|
-
import {
|
|
108
|
+
import {
|
|
109
|
+
normalizeOperation,
|
|
110
|
+
resolveOperationVariantKey,
|
|
111
|
+
validateCountSourceWhere,
|
|
112
|
+
validateOperationConfig,
|
|
113
|
+
validateUpdateEachConfig,
|
|
114
|
+
} from '../routeConfig${ext}'
|
|
115
|
+
import type { NormalizedOperationConfig } from '../routeConfig${ext}'
|
|
109
116
|
import { transformResult } from '../operationRuntime${ext}'
|
|
110
117
|
import { mapError } from '../errorMapper${ext}'
|
|
118
|
+
import { formatGuardVariantResolutionError } from '../guardVariantError${ext}'
|
|
111
119
|
import { mergePaginationConfig } from '../pagination${ext}'
|
|
112
120
|
import { applyDroppedGuard } from '../projectionDefaults${ext}'
|
|
113
121
|
import type { OpKind } from '../projectionDefaults${ext}'
|
|
@@ -129,14 +137,28 @@ type JsonLike =
|
|
|
129
137
|
type OperationConfigLike<TEnv extends HonoEnvBase> = {
|
|
130
138
|
before?: HonoBeforeHook<TEnv>[]
|
|
131
139
|
after?: HonoAfterHook<TEnv>[]
|
|
132
|
-
shape?:
|
|
140
|
+
shape?: unknown
|
|
141
|
+
variants?: Record<
|
|
142
|
+
string,
|
|
143
|
+
{
|
|
144
|
+
shape?: unknown
|
|
145
|
+
before?: HonoBeforeHook<TEnv>[]
|
|
146
|
+
after?: HonoAfterHook<TEnv>[]
|
|
147
|
+
}
|
|
148
|
+
>
|
|
133
149
|
pagination?: Partial<PaginationConfig>
|
|
134
150
|
}
|
|
135
151
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
152
|
+
type NormalizedOp<TEnv extends HonoEnvBase> = NormalizedOperationConfig<
|
|
153
|
+
HonoBeforeHook<TEnv>,
|
|
154
|
+
HonoAfterHook<TEnv>
|
|
155
|
+
>
|
|
156
|
+
|
|
157
|
+
function normalizeHonoOperation<TEnv extends HonoEnvBase>(
|
|
158
|
+
config: OperationConfigLike<TEnv> | undefined,
|
|
159
|
+
): NormalizedOp<TEnv> {
|
|
160
|
+
return normalizeOperation<HonoBeforeHook<TEnv>, HonoAfterHook<TEnv>>(config)
|
|
161
|
+
}
|
|
140
162
|
|
|
141
163
|
type HandlerContext = Context<{ Variables: HonoInternalVariables }>
|
|
142
164
|
|
|
@@ -188,7 +210,7 @@ async function parseUpdateEachBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
|
188
210
|
|
|
189
211
|
function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
190
212
|
config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv>,
|
|
191
|
-
opConfig:
|
|
213
|
+
opConfig: NormalizedOp<TEnv>,
|
|
192
214
|
opKind: OpKind,
|
|
193
215
|
) {
|
|
194
216
|
return async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<void> => {
|
|
@@ -198,19 +220,31 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
198
220
|
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
199
221
|
const headerValue = c.req.header(headerName)
|
|
200
222
|
const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
|
|
201
|
-
if (caller) c.set('guardCaller', caller)
|
|
223
|
+
if (typeof caller === 'string') c.set('guardCaller', caller)
|
|
224
|
+
|
|
225
|
+
const resolution = resolveOperationVariantKey(opConfig.guardRouting, caller)
|
|
226
|
+
if (!resolution.ok) {
|
|
227
|
+
c.set('guardVariantFailure', resolution)
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const resolvedKey =
|
|
232
|
+
opConfig.guardRouting.kind === 'named'
|
|
233
|
+
? resolution.key
|
|
234
|
+
: undefined
|
|
235
|
+
if (resolvedKey !== undefined) c.set('guardVariantKey', resolvedKey)
|
|
202
236
|
|
|
203
|
-
if (opConfig.
|
|
237
|
+
if (opConfig.guardShape) {
|
|
204
238
|
if (!DROP_GUARD) {
|
|
205
|
-
c.set('guardShape', opConfig.
|
|
239
|
+
c.set('guardShape', opConfig.guardShape)
|
|
206
240
|
} else {
|
|
207
241
|
const resolveCtx = typeof config.resolveContext === 'function'
|
|
208
242
|
? () => (config.resolveContext as (ctx: Context<GeneratedHonoEnv<TEnv>>) => unknown | Promise<unknown>)(c)
|
|
209
243
|
: undefined
|
|
210
244
|
|
|
211
245
|
await applyDroppedGuard(
|
|
212
|
-
opConfig.
|
|
213
|
-
|
|
246
|
+
opConfig.guardShape,
|
|
247
|
+
resolvedKey,
|
|
214
248
|
resolveCtx,
|
|
215
249
|
opKind,
|
|
216
250
|
{
|
|
@@ -242,7 +276,7 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
242
276
|
}
|
|
243
277
|
|
|
244
278
|
async function runBeforeHooks<TEnv extends HonoEnvBase>(
|
|
245
|
-
hooks: HonoBeforeHook<TEnv>[],
|
|
279
|
+
hooks: readonly HonoBeforeHook<TEnv>[],
|
|
246
280
|
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
247
281
|
): Promise<Response | undefined> {
|
|
248
282
|
for (const hook of hooks) {
|
|
@@ -253,7 +287,7 @@ async function runBeforeHooks<TEnv extends HonoEnvBase>(
|
|
|
253
287
|
}
|
|
254
288
|
|
|
255
289
|
async function runAfterHooks<TEnv extends HonoEnvBase>(
|
|
256
|
-
hooks: HonoAfterHook<TEnv>[],
|
|
290
|
+
hooks: readonly HonoAfterHook<TEnv>[],
|
|
257
291
|
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
258
292
|
): Promise<Response | undefined> {
|
|
259
293
|
for (const hook of hooks) {
|
|
@@ -352,7 +386,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
352
386
|
}
|
|
353
387
|
|
|
354
388
|
const handleRead = (
|
|
355
|
-
opConfig:
|
|
389
|
+
opConfig: NormalizedOp<TEnv>,
|
|
356
390
|
handlerFn: (c: HandlerContext) => Promise<void>,
|
|
357
391
|
parseFn: (c: HandlerContext) => Promise<void>,
|
|
358
392
|
opKind: OpKind,
|
|
@@ -360,12 +394,27 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
360
394
|
try {
|
|
361
395
|
await parseFn(c as unknown as HandlerContext)
|
|
362
396
|
await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
|
|
397
|
+
const operationBefore = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
|
|
398
|
+
if (operationBefore) return operationBefore
|
|
399
|
+
|
|
400
|
+
const failure = c.get('guardVariantFailure')
|
|
401
|
+
if (failure) {
|
|
402
|
+
throw new HTTPException(400, {
|
|
403
|
+
message: formatGuardVariantResolutionError(failure),
|
|
404
|
+
})
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const key = c.get('guardVariantKey')
|
|
408
|
+
const variantHooks =
|
|
409
|
+
key !== undefined ? opConfig.variantHooks[key] : undefined
|
|
410
|
+
|
|
411
|
+
const variantBefore = await runBeforeHooks<TEnv>(variantHooks?.before ?? [], c)
|
|
412
|
+
if (variantBefore) return variantBefore
|
|
366
413
|
await handlerFn(c as unknown as HandlerContext)
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
414
|
+
const variantAfter = await runAfterHooks<TEnv>(variantHooks?.after ?? [], c)
|
|
415
|
+
if (variantAfter) return variantAfter
|
|
416
|
+
const operationAfter = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
|
|
417
|
+
if (operationAfter) return operationAfter
|
|
369
418
|
return sendResult(c as unknown as HandlerContext)
|
|
370
419
|
} catch (error: unknown) {
|
|
371
420
|
return sendError(c as unknown as HandlerContext, error)
|
|
@@ -373,28 +422,46 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
373
422
|
}
|
|
374
423
|
|
|
375
424
|
const handleWrite = (
|
|
376
|
-
opConfig:
|
|
425
|
+
opConfig: NormalizedOp<TEnv>,
|
|
377
426
|
handlerFn: (c: HandlerContext) => Promise<void>,
|
|
378
427
|
opKind: OpKind,
|
|
379
428
|
) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
|
|
380
429
|
try {
|
|
381
430
|
await parseWriteBodyMiddleware(c as unknown as HandlerContext)
|
|
382
431
|
await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
|
|
432
|
+
const operationBefore = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
|
|
433
|
+
if (operationBefore) return operationBefore
|
|
434
|
+
|
|
435
|
+
const failure = c.get('guardVariantFailure')
|
|
436
|
+
if (failure) {
|
|
437
|
+
throw new HTTPException(400, {
|
|
438
|
+
message: formatGuardVariantResolutionError(failure),
|
|
439
|
+
})
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const key = c.get('guardVariantKey')
|
|
443
|
+
const variantHooks =
|
|
444
|
+
key !== undefined ? opConfig.variantHooks[key] : undefined
|
|
445
|
+
|
|
446
|
+
const variantBefore = await runBeforeHooks<TEnv>(variantHooks?.before ?? [], c)
|
|
447
|
+
if (variantBefore) return variantBefore
|
|
386
448
|
await handlerFn(c as unknown as HandlerContext)
|
|
387
|
-
const
|
|
388
|
-
if (
|
|
449
|
+
const variantAfter = await runAfterHooks<TEnv>(variantHooks?.after ?? [], c)
|
|
450
|
+
if (variantAfter) return variantAfter
|
|
451
|
+
const operationAfter = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
|
|
452
|
+
if (operationAfter) return operationAfter
|
|
389
453
|
return sendResult(c as unknown as HandlerContext)
|
|
390
454
|
} catch (error: unknown) {
|
|
391
455
|
return sendError(c as unknown as HandlerContext, error)
|
|
392
456
|
}
|
|
393
457
|
}
|
|
394
458
|
|
|
395
|
-
const opFor = <K extends keyof ${modelName}RouteConfig<TCtx, TPrisma, TEnv>>(
|
|
396
|
-
|
|
397
|
-
|
|
459
|
+
const opFor = <K extends keyof ${modelName}RouteConfig<TCtx, TPrisma, TEnv>>(
|
|
460
|
+
key: K,
|
|
461
|
+
): NormalizedOp<TEnv> => {
|
|
462
|
+
const raw = config[key] as unknown as OperationConfigLike<TEnv> | undefined
|
|
463
|
+
validateOperationConfig(raw, '${modelName}.' + String(key))
|
|
464
|
+
return normalizeHonoOperation(raw)
|
|
398
465
|
}
|
|
399
466
|
|
|
400
467
|
${readOpBlocks}
|
|
@@ -402,8 +469,10 @@ ${readOpBlocks}
|
|
|
402
469
|
${writeOpBlocks}
|
|
403
470
|
|
|
404
471
|
if (config.updateEach) {
|
|
405
|
-
const
|
|
406
|
-
|
|
472
|
+
const rawUpdateEach = config.updateEach as unknown as OperationConfigLike<TEnv>
|
|
473
|
+
validateUpdateEachConfig(rawUpdateEach, '${modelName}.updateEach')
|
|
474
|
+
const opConfig = normalizeHonoOperation(rawUpdateEach)
|
|
475
|
+
if (opConfig.operationBefore.length === 0 && _env.NODE_ENV !== 'production') {
|
|
407
476
|
console.warn(
|
|
408
477
|
'[${modelName}Router] updateEach is enabled without a before hook. ' +
|
|
409
478
|
'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
|
|
@@ -414,12 +483,11 @@ ${writeOpBlocks}
|
|
|
414
483
|
try {
|
|
415
484
|
await parseUpdateEachBodyMiddleware(c as unknown as HandlerContext)
|
|
416
485
|
await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, 'noop')(c)
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
if (beforeResp) return beforeResp
|
|
486
|
+
const beforeResponse = await runBeforeHooks<TEnv>(opConfig.operationBefore, c)
|
|
487
|
+
if (beforeResponse) return beforeResponse
|
|
420
488
|
await ${modelName}UpdateEach(c as unknown as HandlerContext)
|
|
421
|
-
const
|
|
422
|
-
if (
|
|
489
|
+
const afterResponse = await runAfterHooks<TEnv>(opConfig.operationAfter, c)
|
|
490
|
+
if (afterResponse) return afterResponse
|
|
423
491
|
return sendResult(c as unknown as HandlerContext)
|
|
424
492
|
} catch (error: unknown) {
|
|
425
493
|
return sendError(c as unknown as HandlerContext, error)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":";;AAkFA,
|
|
1
|
+
{"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/copyFiles.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copyFiles.js","sourceRoot":"","sources":["../../src/utils/copyFiles.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"copyFiles.js","sourceRoot":"","sources":["../../src/utils/copyFiles.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.
|
|
4
|
+
"version": "1.63.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
package/src/copy/docsRenderer.ts
CHANGED
|
@@ -1109,6 +1109,7 @@ export function renderDocs(
|
|
|
1109
1109
|
escapeHtml(guardVariantHeader) +
|
|
1110
1110
|
'</span> header or a custom resolver function.',
|
|
1111
1111
|
'Forced values (literals instead of true) are injected server-side and cannot be overridden by the client.',
|
|
1112
|
+
'Operation hooks run before variant hooks. After the handler, variant hooks run before operation hooks. A terminal response or error stops the remaining hooks in that phase; operation after-hooks are not guaranteed cleanup handlers.',
|
|
1112
1113
|
]
|
|
1113
1114
|
|
|
1114
1115
|
const writeStrategyNotes =
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GuardVariantResolution } from './guardVariantRouting'
|
|
2
|
+
|
|
3
|
+
export function formatGuardVariantResolutionError(
|
|
4
|
+
resolution: Extract<GuardVariantResolution, { ok: false }>,
|
|
5
|
+
): string {
|
|
6
|
+
const keys = resolution.keys.map((key) => `"${key}"`).join(', ')
|
|
7
|
+
|
|
8
|
+
if (resolution.code === 'reserved-key') {
|
|
9
|
+
return `Caller key "${resolution.key}" collides with reserved guard shape key. Rename the caller path.`
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (resolution.code === 'missing-caller') {
|
|
13
|
+
return (
|
|
14
|
+
`Missing caller. This guard uses named shape routing with keys: ${keys}. ` +
|
|
15
|
+
'Provide caller via guard(input, caller).'
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (resolution.code === 'ambiguous-caller') {
|
|
20
|
+
const matches = (resolution.matches ?? [])
|
|
21
|
+
.map((pattern) => `"${pattern}"`)
|
|
22
|
+
.join(', ')
|
|
23
|
+
|
|
24
|
+
return `Ambiguous caller "${resolution.caller}" matches multiple patterns: ${matches}`
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return `Unknown caller: "${resolution.caller}". Allowed: ${keys}`
|
|
28
|
+
}
|