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.
- package/README.md +188 -3432
- package/dist/client/encodeQueryParams.js +3 -1
- package/dist/client/encodeQueryParams.js.map +1 -1
- package/dist/copy/misc.d.ts +1 -0
- package/dist/copy/misc.js +14 -0
- package/dist/copy/misc.js.map +1 -1
- package/dist/copy/operationDefinitions.d.ts +4 -1
- package/dist/copy/operationDefinitions.js +133 -9
- package/dist/copy/operationDefinitions.js.map +1 -1
- package/dist/generators/generateFastifyHandler.d.ts +2 -2
- package/dist/generators/generateFastifyHandler.js +68 -12
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -2
- package/dist/generators/generateHonoHandler.js +53 -6
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateHonoOpenApi.d.ts +13 -0
- package/dist/generators/generateHonoOpenApi.js +70 -0
- package/dist/generators/generateHonoOpenApi.js.map +1 -0
- package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
- package/dist/generators/generateImportPrismaStatement.js +6 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -1
- package/dist/generators/generateMcpApp.d.ts +10 -0
- package/dist/generators/generateMcpApp.js +113 -0
- package/dist/generators/generateMcpApp.js.map +1 -0
- package/dist/generators/generateModelMcp.d.ts +9 -0
- package/dist/generators/generateModelMcp.js +145 -0
- package/dist/generators/generateModelMcp.js.map +1 -0
- package/dist/generators/generateModelMetadata.js +29 -15
- package/dist/generators/generateModelMetadata.js.map +1 -1
- package/dist/generators/generateOperationCore.d.ts +3 -3
- package/dist/generators/generateOperationCore.js +51 -16
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRelationMeta.js +2 -2
- package/dist/generators/generateRelationMeta.js.map +1 -1
- package/dist/generators/generateRouteConfigType.d.ts +2 -2
- package/dist/generators/generateRouteConfigType.js +29 -11
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.d.ts +7 -4
- package/dist/generators/generateRouter.js +164 -65
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +7 -4
- package/dist/generators/generateRouterFastify.js +106 -86
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +7 -4
- package/dist/generators/generateRouterHono.js +59 -414
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateRouterPartsHono.d.ts +14 -0
- package/dist/generators/generateRouterPartsHono.js +180 -0
- package/dist/generators/generateRouterPartsHono.js.map +1 -0
- package/dist/generators/generateUnifiedDocs.d.ts +1 -1
- package/dist/generators/generateUnifiedDocs.js +15 -8
- package/dist/generators/generateUnifiedDocs.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.d.ts +2 -2
- package/dist/generators/generateUnifiedHandler.js +42 -18
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/guardOptions.js +12 -7
- package/dist/guardOptions.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +123 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.d.ts +1 -1
- package/dist/utils/copyFiles.js +42 -7
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/importExt.d.ts +1 -1
- package/dist/utils/mcpGate.d.ts +10 -0
- package/dist/utils/mcpGate.js +118 -0
- package/dist/utils/mcpGate.js.map +1 -0
- package/dist/utils/pathCasing.d.ts +4 -0
- package/dist/utils/pathCasing.js +40 -0
- package/dist/utils/pathCasing.js.map +1 -0
- package/dist/utils/resolveImportStyle.js +13 -5
- package/dist/utils/resolveImportStyle.js.map +1 -1
- package/dist/utils/writeFileSafely.js +6 -0
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +22 -5
- package/src/bin.ts +1 -1
- package/src/client/encodeQueryParams.ts +39 -35
- package/src/constants.ts +1 -1
- package/src/copy/autoIncludePlanner.ts +93 -27
- package/src/copy/autoIncludePlannerGuarded.ts +171 -48
- package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
- package/src/copy/buildModelOpenApi.ts +229 -176
- package/src/copy/concurrency.ts +10 -8
- package/src/copy/docsRenderer.ts +14 -15
- package/src/copy/errorMapper.ts +68 -19
- package/src/copy/guardHelpers.ts +30 -9
- package/src/copy/materializedCount.ts +17 -5
- package/src/copy/mcpRuntime.ts +1017 -0
- package/src/copy/misc.ts +88 -68
- package/src/copy/ndjson.ts +72 -0
- package/src/copy/operationDefinitions.ts +177 -25
- package/src/copy/operationPipeline.ts +267 -0
- package/src/copy/operationRuntime.ts +124 -26
- package/src/copy/operationSchemas.ts +2773 -0
- package/src/copy/pagination.ts +35 -13
- package/src/copy/parseQueryParams.ts +47 -48
- package/src/copy/projectionDefaults.ts +6 -4
- package/src/copy/routeConfig.express.ts +16 -4
- package/src/copy/routeConfig.fastify.ts +16 -2
- package/src/copy/routeConfig.hono.ts +46 -14
- package/src/copy/routeConfig.ts +175 -40
- package/src/copy/routerParts.ts +524 -0
- package/src/copy/scalarTypes.ts +7 -2
- package/src/copy/sse.ts +72 -19
- package/src/generators/generateFastifyHandler.ts +77 -20
- package/src/generators/generateHonoHandler.ts +62 -14
- package/src/generators/generateHonoOpenApi.ts +93 -0
- package/src/generators/generateImportPrismaStatement.ts +93 -81
- package/src/generators/generateMcpApp.ts +133 -0
- package/src/generators/generateModelMcp.ts +208 -0
- package/src/generators/generateModelMetadata.ts +40 -22
- package/src/generators/generateOperationCore.ts +81 -33
- package/src/generators/generateRelationMeta.ts +23 -11
- package/src/generators/generateRouteConfigType.ts +39 -13
- package/src/generators/generateRouter.ts +171 -68
- package/src/generators/generateRouterFastify.ts +117 -89
- package/src/generators/generateRouterHono.ts +84 -464
- package/src/generators/generateRouterPartsHono.ts +220 -0
- package/src/generators/generateUnifiedDocs.ts +29 -8
- package/src/generators/generateUnifiedHandler.ts +47 -24
- package/src/generators/generateUnifiedScalarUI.ts +1 -1
- package/src/guardOptions.ts +105 -92
- package/src/index.ts +161 -6
- package/src/utils/copyFiles.ts +235 -168
- package/src/utils/importExt.ts +2 -2
- package/src/utils/mcpGate.ts +157 -0
- package/src/utils/pathCasing.ts +42 -0
- package/src/utils/resolveImportStyle.ts +37 -15
- package/src/utils/strings.ts +2 -2
- 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 (
|
|
53
|
+
? ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) {
|
|
53
54
|
const postPath = basePath ? \`\${basePath}/read\` : '/read'
|
|
54
|
-
app.post(postPath,
|
|
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 (
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
97
|
+
PrismaClientLike,
|
|
104
98
|
} from '../routeConfig.target${ext}'
|
|
105
|
-
import {
|
|
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
|
-
|
|
103
|
+
resolvePostReadsEnabled,
|
|
113
104
|
validateCountSourceWhere,
|
|
114
|
-
validateOperationConfig,
|
|
115
105
|
validateUpdateEachConfig,
|
|
106
|
+
warnIfUnguardedRoutes,
|
|
116
107
|
} from '../routeConfig${ext}'
|
|
117
|
-
import
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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 ? '/${
|
|
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
|
-
|
|
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
|
|
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,
|
|
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":";;
|
|
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;
|