prisma-generator-express 1.66.0 → 1.67.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 +37 -3476
- 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.js +69 -6
- package/dist/copy/operationDefinitions.js.map +1 -1
- package/dist/generators/generateFastifyHandler.d.ts +2 -2
- package/dist/generators/generateFastifyHandler.js +15 -5
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -2
- package/dist/generators/generateHonoHandler.js +12 -5
- package/dist/generators/generateHonoHandler.js.map +1 -1
- 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/generateModelMetadata.js +20 -10
- 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 +107 -14
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +7 -4
- package/dist/generators/generateRouterFastify.js +56 -28
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +7 -4
- package/dist/generators/generateRouterHono.js +36 -23
- package/dist/generators/generateRouterHono.js.map +1 -1
- 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 +11 -3
- 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 +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.js +22 -6
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/importExt.d.ts +1 -1
- 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.map +1 -1
- package/package.json +5 -3
- 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 +153 -50
- package/src/copy/concurrency.ts +10 -8
- package/src/copy/errorMapper.ts +68 -19
- package/src/copy/guardHelpers.ts +30 -9
- package/src/copy/materializedCount.ts +17 -5
- package/src/copy/misc.ts +88 -68
- package/src/copy/ndjson.ts +72 -0
- package/src/copy/operationDefinitions.ts +99 -21
- package/src/copy/operationRuntime.ts +100 -12
- package/src/copy/pagination.ts +25 -11
- 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 +12 -9
- package/src/copy/routeConfig.ts +174 -39
- package/src/copy/scalarTypes.ts +7 -2
- package/src/copy/sse.ts +72 -19
- package/src/generators/generateFastifyHandler.ts +24 -13
- package/src/generators/generateHonoHandler.ts +21 -13
- package/src/generators/generateImportPrismaStatement.ts +93 -81
- package/src/generators/generateModelMetadata.ts +24 -12
- 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 +114 -17
- package/src/generators/generateRouterFastify.ts +67 -31
- package/src/generators/generateRouterHono.ts +60 -30
- package/src/generators/generateUnifiedDocs.ts +29 -8
- package/src/generators/generateUnifiedHandler.ts +16 -8
- package/src/generators/generateUnifiedScalarUI.ts +1 -1
- package/src/guardOptions.ts +105 -92
- package/src/index.ts +46 -4
- package/src/utils/copyFiles.ts +199 -168
- package/src/utils/importExt.ts +2 -2
- 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 +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { DMMF } from '@prisma/generator-helper';
|
|
2
|
-
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
-
import { WriteStrategy, FindManyPaginatedMode } from '../constants';
|
|
4
|
-
|
|
1
|
+
import type { DMMF } from '@prisma/generator-helper';
|
|
2
|
+
import type { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
+
import type { WriteStrategy, FindManyPaginatedMode } from '../constants';
|
|
4
|
+
import { type PathCase } from '../utils/pathCasing';
|
|
5
|
+
export declare function generateFastifyRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }: {
|
|
5
6
|
model: DMMF.Model;
|
|
6
7
|
enums: DMMF.DatamodelEnum[];
|
|
7
8
|
guardShapesImport: string | null;
|
|
9
|
+
clientImport?: string;
|
|
8
10
|
importStyle: ImportStyle;
|
|
9
11
|
writeStrategy: WriteStrategy;
|
|
10
12
|
findManyPaginatedMode: FindManyPaginatedMode;
|
|
11
13
|
dropGuard: boolean;
|
|
14
|
+
pathCase: PathCase;
|
|
12
15
|
}): string;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateFastifyRouterFunction = generateFastifyRouterFunction;
|
|
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,11 +50,11 @@ 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
55
|
instance.post(postPath, handleRead(opConfig, ${handlerName}, parseBodyAsQueryHook, '${opKind}'))
|
|
55
56
|
}`
|
|
56
|
-
: ` if (
|
|
57
|
+
: ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) instance.post(path, handleRead(opConfig, ${handlerName}, parseBodyAsQueryHook, '${opKind}'))`
|
|
57
58
|
: '';
|
|
58
59
|
return ` if (isEnabled(config.${meta.configKey})) {
|
|
59
60
|
const opConfig = opFor('${meta.configKey}')
|
|
@@ -73,19 +74,18 @@ function emitWriteOp(meta, modelName) {
|
|
|
73
74
|
instance.${meta.method}(path, handleWrite(opConfig, ${handlerName}, '${opKind}'))
|
|
74
75
|
}`;
|
|
75
76
|
}
|
|
76
|
-
function generateFastifyRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, }) {
|
|
77
|
+
function generateFastifyRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }) {
|
|
77
78
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
78
79
|
const modelName = model.name;
|
|
79
|
-
const
|
|
80
|
-
const routerFunctionName = `${
|
|
81
|
-
const handlerImports = operationDefinitions_1.OPERATION_METADATA
|
|
82
|
-
.map((m) => ` ${modelName}${m.name.charAt(0).toUpperCase() + m.name.slice(1)},`)
|
|
83
|
-
.join('\n');
|
|
80
|
+
const modelSegment = (0, pathCasing_1.modelPathSegment)(model.name, pathCase);
|
|
81
|
+
const routerFunctionName = `${model.name}Router`;
|
|
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 type { FastifyInstance, FastifyRequest, FastifyReply, FastifyError } from 'fastify'
|
|
90
90
|
import { startQueryBuilder } from '../queryBuilder${ext}'
|
|
91
91
|
import {
|
|
@@ -96,9 +96,11 @@ import type {
|
|
|
96
96
|
FastifyHookHandler,
|
|
97
97
|
FindManyPaginatedMode,
|
|
98
98
|
PaginationConfig,
|
|
99
|
+
PrismaClientLike,
|
|
100
|
+
QueryBuilderConfig,
|
|
99
101
|
} from '../routeConfig.target${ext}'
|
|
100
102
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
101
|
-
import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject } from '../misc${ext}'
|
|
103
|
+
import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject, resolveDropGuardEnv } from '../misc${ext}'
|
|
102
104
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
103
105
|
import {
|
|
104
106
|
normalizeOperation,
|
|
@@ -106,7 +108,10 @@ import {
|
|
|
106
108
|
validateCountSourceWhere,
|
|
107
109
|
validateOperationConfig,
|
|
108
110
|
validateUpdateEachConfig,
|
|
111
|
+
resolvePostReadsEnabled,
|
|
112
|
+
warnIfUnguardedRoutes,
|
|
109
113
|
} from '../routeConfig${ext}'
|
|
114
|
+
import type { RuntimeOperationOverride } from '../operationRuntime${ext}'
|
|
110
115
|
import type { NormalizedOperationConfig } from '../routeConfig${ext}'
|
|
111
116
|
import type { OperationContext } from '../operationRuntime${ext}'
|
|
112
117
|
import { transformResult } from '../operationRuntime${ext}'
|
|
@@ -118,13 +123,18 @@ import { applyDroppedGuard } from '../projectionDefaults${ext}'
|
|
|
118
123
|
import type { OpKind } from '../projectionDefaults${ext}'
|
|
119
124
|
import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
|
|
120
125
|
|
|
121
|
-
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'FastifyHookHandler', guardShapesImport, importStyle, 'fastify')}
|
|
126
|
+
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'FastifyHookHandler', guardShapesImport, importStyle, 'fastify', clientImport)}
|
|
122
127
|
const _env = getEnv()
|
|
123
128
|
|
|
124
129
|
const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
|
|
125
|
-
|
|
130
|
+
// Fixed at generation time. The environment bypass is resolved per hook,
|
|
131
|
+
// because it requires the configuration's explicit \`allowE2EGuardBypass: true\`:
|
|
132
|
+
// false or omitted means the environment cannot drop guards for this target.
|
|
133
|
+
const DROP_GUARD = ${dropGuard}
|
|
126
134
|
|
|
127
135
|
type OperationConfigLike = {
|
|
136
|
+
authorize?: FastifyHookHandler
|
|
137
|
+
override?: RuntimeOperationOverride
|
|
128
138
|
before?: FastifyHookHandler[]
|
|
129
139
|
after?: FastifyHookHandler[]
|
|
130
140
|
shape?: unknown
|
|
@@ -152,6 +162,8 @@ type FastifyExtended = FastifyRequest & {
|
|
|
152
162
|
routeConfig?: { pagination?: PaginationConfig }
|
|
153
163
|
guardShape?: Record<string, unknown>
|
|
154
164
|
guardCaller?: string
|
|
165
|
+
operationOverride?: RuntimeOperationOverride
|
|
166
|
+
resolveOperationContext?: () => unknown | Promise<unknown>
|
|
155
167
|
guardVariantKey?: string
|
|
156
168
|
guardVariantFailure?: Extract<GuardVariantResolution, { ok: false }>
|
|
157
169
|
resultData?: unknown
|
|
@@ -164,14 +176,14 @@ function normalizeFastifyOperation(
|
|
|
164
176
|
return normalizeOperation<FastifyHookHandler, FastifyHookHandler>(config)
|
|
165
177
|
}
|
|
166
178
|
|
|
167
|
-
function isQueryBuilderEnabled(config:
|
|
179
|
+
function isQueryBuilderEnabled(config: { queryBuilder?: QueryBuilderConfig | false }): boolean {
|
|
168
180
|
if (config.queryBuilder === false) return false
|
|
169
181
|
if (typeof config.queryBuilder === 'object' && config.queryBuilder.enabled === false) return false
|
|
170
182
|
if (_env.NODE_ENV === 'production') return false
|
|
171
183
|
return true
|
|
172
184
|
}
|
|
173
185
|
|
|
174
|
-
function getQueryBuilderConfig(config:
|
|
186
|
+
function getQueryBuilderConfig(config: { queryBuilder?: QueryBuilderConfig | false }) {
|
|
175
187
|
if (config.queryBuilder === false) return null
|
|
176
188
|
if (typeof config.queryBuilder === 'object') return config.queryBuilder
|
|
177
189
|
return {}
|
|
@@ -192,21 +204,35 @@ function parseBodyAsQueryHook(request: FastifyRequest): void {
|
|
|
192
204
|
(request as FastifyExtended).parsedQuery = sanitizeKeys(body as Record<string, unknown>)
|
|
193
205
|
}
|
|
194
206
|
|
|
195
|
-
function buildResolveContext(
|
|
196
|
-
config: ${modelName}RouteConfig,
|
|
207
|
+
function buildResolveContext<TCtx, TPrisma extends PrismaClientLike>(
|
|
208
|
+
config: ${modelName}RouteConfig<TCtx, TPrisma>,
|
|
197
209
|
request: FastifyRequest,
|
|
198
210
|
): (() => unknown | Promise<unknown>) | undefined {
|
|
199
211
|
if (typeof config.resolveContext !== 'function') return undefined
|
|
200
212
|
return () => (config.resolveContext as (r: FastifyRequest) => unknown | Promise<unknown>)(request)
|
|
201
213
|
}
|
|
202
214
|
|
|
203
|
-
function makeShapeHook(
|
|
204
|
-
config: ${modelName}RouteConfig,
|
|
215
|
+
function makeShapeHook<TCtx, TPrisma extends PrismaClientLike>(
|
|
216
|
+
config: ${modelName}RouteConfig<TCtx, TPrisma>,
|
|
205
217
|
opConfig: NormalizedOp,
|
|
206
218
|
opKind: OpKind,
|
|
207
219
|
): (request: FastifyRequest) => Promise<void> {
|
|
220
|
+
/**
|
|
221
|
+
* The environment bypass, and it is OPT-IN for this target.
|
|
222
|
+
*
|
|
223
|
+
* \`PGE_DROP_GUARD=true\` (deprecated alias \`E2E=true\`) downgrading enforcement
|
|
224
|
+
* in a deployed environment is a real hazard: on most platforms it is an
|
|
225
|
+
* ordinary config var, set on staging, copied forward, flagged as
|
|
226
|
+
* security-relevant nowhere. It is honoured only when this configuration
|
|
227
|
+
* states \`allowE2EGuardBypass: true\` — false or omitted means the environment
|
|
228
|
+
* cannot drop guards. The generation-time \`DROP_GUARD\` literal is unchanged.
|
|
229
|
+
*/
|
|
230
|
+
const dropGuard = DROP_GUARD || (config.allowE2EGuardBypass === true && resolveDropGuardEnv(_env))
|
|
208
231
|
return async (request: FastifyRequest) => {
|
|
209
232
|
const fx = request as FastifyExtended
|
|
233
|
+
fx.operationOverride = opConfig.override
|
|
234
|
+
let context: Promise<unknown> | undefined
|
|
235
|
+
fx.resolveOperationContext = () => context ??= Promise.resolve(config.resolveContext?.(request))
|
|
210
236
|
const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
|
|
211
237
|
if (merged) fx.routeConfig = { pagination: merged }
|
|
212
238
|
|
|
@@ -230,7 +256,7 @@ function makeShapeHook(
|
|
|
230
256
|
if (resolvedKey !== undefined) fx.guardVariantKey = resolvedKey
|
|
231
257
|
|
|
232
258
|
if (opConfig.guardShape) {
|
|
233
|
-
if (!
|
|
259
|
+
if (!dropGuard) {
|
|
234
260
|
fx.guardShape = opConfig.guardShape
|
|
235
261
|
} else {
|
|
236
262
|
await applyDroppedGuard(
|
|
@@ -289,7 +315,7 @@ function sendError(reply: FastifyReply, error: unknown): void {
|
|
|
289
315
|
reply.code(httpError.status).send({ message: httpError.message })
|
|
290
316
|
}
|
|
291
317
|
|
|
292
|
-
export async function ${routerFunctionName}<TCtx = unknown, TPrisma =
|
|
318
|
+
export async function ${routerFunctionName}<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>(
|
|
293
319
|
fastify: FastifyInstance,
|
|
294
320
|
config: ${modelName}RouteConfig<TCtx, TPrisma> = {},
|
|
295
321
|
) {
|
|
@@ -301,6 +327,7 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
301
327
|
|
|
302
328
|
await fastify.register(async (instance) => {
|
|
303
329
|
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
330
|
+
warnIfUnguardedRoutes('${modelName}', ['findMany', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findManyPaginated', 'count', 'aggregate', 'groupBy', 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany'], config, isEnabled)
|
|
304
331
|
|
|
305
332
|
const opFor = (key: string): NormalizedOp => {
|
|
306
333
|
const raw = (config as unknown as Record<string, unknown>)[key] as OperationConfigLike | undefined
|
|
@@ -309,7 +336,7 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
309
336
|
}
|
|
310
337
|
|
|
311
338
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
312
|
-
const modelPrefix = config.addModelPrefix !== false ? '/${
|
|
339
|
+
const modelPrefix = config.addModelPrefix !== false ? '/${modelSegment}' : ''
|
|
313
340
|
const basePath = customPrefix + modelPrefix
|
|
314
341
|
|
|
315
342
|
const openApiDisabled = config.disableOpenApi === true
|
|
@@ -318,7 +345,6 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
318
345
|
|| _env.DISABLE_OPENAPI === 'true'
|
|
319
346
|
))
|
|
320
347
|
|
|
321
|
-
const postReadsEnabled = !config.disablePostReads
|
|
322
348
|
|
|
323
349
|
let _openApiJsonCache: unknown = undefined
|
|
324
350
|
const getOpenApiJson = (): unknown => {
|
|
@@ -327,8 +353,8 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
327
353
|
'${modelName}',
|
|
328
354
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
329
355
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
330
|
-
config,
|
|
331
|
-
{ format: 'json', writeStrategy: '${writeStrategy}' },
|
|
356
|
+
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
357
|
+
{ format: 'json', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
332
358
|
)
|
|
333
359
|
}
|
|
334
360
|
return _openApiJsonCache
|
|
@@ -340,8 +366,8 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
340
366
|
'${modelName}',
|
|
341
367
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
342
368
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
343
|
-
config,
|
|
344
|
-
{ format: 'yaml', writeStrategy: '${writeStrategy}' },
|
|
369
|
+
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
370
|
+
{ format: 'yaml', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
345
371
|
) as string
|
|
346
372
|
}
|
|
347
373
|
return _openApiYamlCache
|
|
@@ -391,6 +417,7 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
391
417
|
opKind: OpKind,
|
|
392
418
|
) => async (request: FastifyRequest, reply: FastifyReply) => {
|
|
393
419
|
try {
|
|
420
|
+
if (await runHooks(opConfig.authorize ? [opConfig.authorize] : [], request, reply)) return
|
|
394
421
|
parseFn(request)
|
|
395
422
|
await makeShapeHook(config, opConfig, opKind)(request)
|
|
396
423
|
if (await runHooks(opConfig.operationBefore, request, reply)) return
|
|
@@ -423,6 +450,7 @@ export async function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(
|
|
|
423
450
|
opKind: OpKind,
|
|
424
451
|
) => async (request: FastifyRequest, reply: FastifyReply) => {
|
|
425
452
|
try {
|
|
453
|
+
if (await runHooks(opConfig.authorize ? [opConfig.authorize] : [], request, reply)) return
|
|
426
454
|
await makeShapeHook(config, opConfig, opKind)(request)
|
|
427
455
|
if (await runHooks(opConfig.operationBefore, request, reply)) return
|
|
428
456
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { DMMF } from '@prisma/generator-helper';
|
|
2
|
-
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
-
import { WriteStrategy } from '../constants';
|
|
4
|
-
|
|
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 generateHonoRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, dropGuard, pathCase, }: {
|
|
5
6
|
model: DMMF.Model;
|
|
6
7
|
enums: DMMF.DatamodelEnum[];
|
|
7
8
|
guardShapesImport: string | null;
|
|
9
|
+
clientImport?: string;
|
|
8
10
|
importStyle: ImportStyle;
|
|
9
11
|
writeStrategy: WriteStrategy;
|
|
10
12
|
dropGuard: boolean;
|
|
13
|
+
pathCase: PathCase;
|
|
11
14
|
}): string;
|
|
@@ -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,11 +50,11 @@ 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
55
|
app.post(postPath, handleRead(opConfig, ${handlerName}, parseBodyAsQueryMiddleware, '${opKind}'))
|
|
55
56
|
}`
|
|
56
|
-
: ` if (
|
|
57
|
+
: ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) app.post(path, handleRead(opConfig, ${handlerName}, parseBodyAsQueryMiddleware, '${opKind}'))`
|
|
57
58
|
: '';
|
|
58
59
|
return ` if (isEnabled(config.${meta.configKey})) {
|
|
59
60
|
const opConfig = opFor('${meta.configKey}')
|
|
@@ -73,19 +74,18 @@ function emitWriteOp(meta, modelName) {
|
|
|
73
74
|
app.${meta.method}(path, handleWrite(opConfig, ${handlerName}, '${opKind}'))
|
|
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
90
|
import type { Context } from 'hono'
|
|
91
91
|
import type { ContentfulStatusCode } from 'hono/utils/http-status'
|
|
@@ -101,9 +101,10 @@ import type {
|
|
|
101
101
|
HonoInternalVariables,
|
|
102
102
|
GeneratedHonoEnv,
|
|
103
103
|
PaginationConfig,
|
|
104
|
+
PrismaClientLike,
|
|
104
105
|
} from '../routeConfig.target${ext}'
|
|
105
106
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
106
|
-
import { normalizePrefix, getEnv, sanitizeKeys, isPlainObject } from '../misc${ext}'
|
|
107
|
+
import { normalizePrefix, getEnv, sanitizeKeys, isPlainObject, resolveDropGuardEnv } from '../misc${ext}'
|
|
107
108
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
108
109
|
import {
|
|
109
110
|
normalizeOperation,
|
|
@@ -113,7 +114,10 @@ import {
|
|
|
113
114
|
validateCountSourceWhere,
|
|
114
115
|
validateOperationConfig,
|
|
115
116
|
validateUpdateEachConfig,
|
|
117
|
+
resolvePostReadsEnabled,
|
|
118
|
+
warnIfUnguardedRoutes,
|
|
116
119
|
} from '../routeConfig${ext}'
|
|
120
|
+
import type { RuntimeOperationOverride } from '../operationRuntime${ext}'
|
|
117
121
|
import type { NormalizedOperationConfig } from '../routeConfig${ext}'
|
|
118
122
|
import { transformResult } from '../operationRuntime${ext}'
|
|
119
123
|
import { mapError } from '../errorMapper${ext}'
|
|
@@ -123,7 +127,7 @@ import { applyDroppedGuard } from '../projectionDefaults${ext}'
|
|
|
123
127
|
import type { OpKind } from '../projectionDefaults${ext}'
|
|
124
128
|
import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
|
|
125
129
|
|
|
126
|
-
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono')}
|
|
130
|
+
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono', clientImport)}
|
|
127
131
|
const _env = getEnv()
|
|
128
132
|
|
|
129
133
|
// Fixed at generation time. The \`allowE2EGuardBypass\` control decides whether the
|
|
@@ -142,6 +146,8 @@ const DROP_GUARD = ${dropGuard}
|
|
|
142
146
|
type JsonLike = string | number | boolean | null | unknown[] | Record<string, unknown>
|
|
143
147
|
|
|
144
148
|
type OperationConfigLike<TEnv extends HonoEnvBase> = {
|
|
149
|
+
authorize?: HonoBeforeHook<TEnv>
|
|
150
|
+
override?: RuntimeOperationOverride
|
|
145
151
|
before?: HonoBeforeHook<TEnv>[]
|
|
146
152
|
after?: HonoAfterHook<TEnv>[]
|
|
147
153
|
shape?: unknown
|
|
@@ -215,7 +221,7 @@ async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
|
215
221
|
c.set('body', body)
|
|
216
222
|
}
|
|
217
223
|
|
|
218
|
-
function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
224
|
+
function makeShapeMiddleware<TCtx, TPrisma extends PrismaClientLike, TEnv extends HonoEnvBase>(
|
|
219
225
|
config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv>,
|
|
220
226
|
opConfig: NormalizedOp<TEnv>,
|
|
221
227
|
opKind: OpKind,
|
|
@@ -225,11 +231,11 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
225
231
|
/**
|
|
226
232
|
* The environment bypass, honoured unless the consumer turned it off.
|
|
227
233
|
*
|
|
228
|
-
* \`
|
|
229
|
-
* hazard, and it is also upstream behaviour
|
|
230
|
-
* decision made here.
|
|
234
|
+
* \`PGE_DROP_GUARD=true\` downgrading enforcement in a deployed environment is
|
|
235
|
+
* a real hazard, and it is also upstream behaviour (under its deprecated
|
|
236
|
+
* \`E2E=true\` spelling) — so it is a control, not a decision made here.
|
|
231
237
|
*/
|
|
232
|
-
const dropGuard = DROP_GUARD || (policy.allowE2EGuardBypass && _env
|
|
238
|
+
const dropGuard = DROP_GUARD || (policy.allowE2EGuardBypass && resolveDropGuardEnv(_env))
|
|
233
239
|
|
|
234
240
|
return async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<void> => {
|
|
235
241
|
/**
|
|
@@ -244,6 +250,9 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
244
250
|
* in.
|
|
245
251
|
*/
|
|
246
252
|
const vars = c as unknown as HandlerContext
|
|
253
|
+
vars.set('operationOverride', opConfig.override)
|
|
254
|
+
let context: Promise<unknown> | undefined
|
|
255
|
+
vars.set('resolveOperationContext', () => context ??= Promise.resolve(config.resolveContext?.(c)))
|
|
247
256
|
|
|
248
257
|
const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
|
|
249
258
|
if (merged) vars.set('routeConfig', { pagination: merged })
|
|
@@ -267,7 +276,7 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
267
276
|
|
|
268
277
|
if (opConfig.guardShape) {
|
|
269
278
|
const resolveCtx = typeof config.resolveContext === 'function'
|
|
270
|
-
?
|
|
279
|
+
? vars.get('resolveOperationContext')
|
|
271
280
|
: undefined
|
|
272
281
|
|
|
273
282
|
/**
|
|
@@ -367,7 +376,7 @@ function sendError(c: HandlerContext, error: unknown): Response {
|
|
|
367
376
|
return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
|
|
368
377
|
}
|
|
369
378
|
|
|
370
|
-
export function ${routerFunctionName}<TCtx = unknown, TPrisma =
|
|
379
|
+
export function ${routerFunctionName}<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
|
|
371
380
|
validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
|
|
372
381
|
validateCountSourceWhere(
|
|
373
382
|
(config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
|
|
@@ -377,9 +386,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
377
386
|
const app = new Hono<GeneratedHonoEnv<TEnv>>()
|
|
378
387
|
|
|
379
388
|
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
389
|
+
warnIfUnguardedRoutes('${modelName}', ['findMany', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findManyPaginated', 'count', 'aggregate', 'groupBy', 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany'], config, isEnabled)
|
|
380
390
|
|
|
381
391
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
382
|
-
|
|
392
|
+
const modelPrefix = config.addModelPrefix !== false ? '/${modelSegment}' : ''
|
|
383
393
|
const basePath = customPrefix + modelPrefix
|
|
384
394
|
|
|
385
395
|
const openApiDisabled = config.disableOpenApi === true
|
|
@@ -388,7 +398,6 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
388
398
|
|| _env.DISABLE_OPENAPI === 'true'
|
|
389
399
|
))
|
|
390
400
|
|
|
391
|
-
const postReadsEnabled = !config.disablePostReads
|
|
392
401
|
|
|
393
402
|
let _openApiJsonCache: unknown = undefined
|
|
394
403
|
const getOpenApiJson = (): unknown => {
|
|
@@ -398,7 +407,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
398
407
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
399
408
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
400
409
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
401
|
-
{ format: 'json', writeStrategy: '${writeStrategy}' },
|
|
410
|
+
{ format: 'json', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
402
411
|
)
|
|
403
412
|
}
|
|
404
413
|
return _openApiJsonCache
|
|
@@ -411,7 +420,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
411
420
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
412
421
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
413
422
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
414
|
-
{ format: 'yaml', writeStrategy: '${writeStrategy}' },
|
|
423
|
+
{ format: 'yaml', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
415
424
|
) as string
|
|
416
425
|
}
|
|
417
426
|
return _openApiYamlCache
|
|
@@ -478,6 +487,8 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
478
487
|
opKind: OpKind,
|
|
479
488
|
) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
|
|
480
489
|
try {
|
|
490
|
+
const authorized = await runBeforeHooks<TEnv>(opConfig.authorize ? [opConfig.authorize] : [], c)
|
|
491
|
+
if (authorized) return authorized
|
|
481
492
|
await parseFn(c as unknown as HandlerContext)
|
|
482
493
|
await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
|
|
483
494
|
|
|
@@ -513,6 +524,8 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
513
524
|
opKind: OpKind,
|
|
514
525
|
) => async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
|
|
515
526
|
try {
|
|
527
|
+
const authorized = await runBeforeHooks<TEnv>(opConfig.authorize ? [opConfig.authorize] : [], c)
|
|
528
|
+
if (authorized) return authorized
|
|
516
529
|
await parseWriteBodyMiddleware(c as unknown as HandlerContext)
|
|
517
530
|
await makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig, opKind)(c)
|
|
518
531
|
|
|
@@ -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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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
2
2
|
import type { Target } from '../constants';
|
|
3
|
-
export declare function generateUnifiedDocs(modelNames: string[], target: Target, importStyle: ImportStyle): string;
|
|
3
|
+
export declare function generateUnifiedDocs(modelNames: string[], pathSegments: Record<string, string>, target: Target, importStyle: ImportStyle): string;
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateUnifiedDocs = generateUnifiedDocs;
|
|
4
4
|
const importExt_1 = require("../utils/importExt");
|
|
5
|
-
function generateUnifiedDocs(modelNames, target, importStyle) {
|
|
5
|
+
function generateUnifiedDocs(modelNames, pathSegments, target, importStyle) {
|
|
6
6
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
7
7
|
if (target === 'fastify')
|
|
8
|
-
return generateFastify(modelNames, ext);
|
|
8
|
+
return generateFastify(modelNames, pathSegments, ext);
|
|
9
9
|
if (target === 'hono')
|
|
10
|
-
return generateHono(modelNames, ext);
|
|
11
|
-
return generateExpress(modelNames, ext);
|
|
10
|
+
return generateHono(modelNames, pathSegments, ext);
|
|
11
|
+
return generateExpress(modelNames, pathSegments, ext);
|
|
12
12
|
}
|
|
13
13
|
const renderIndexFn = `function renderIndex(title: string, modelNames: string[], basePath: string): string {
|
|
14
|
+
const segments = MODEL_PATH_SEGMENTS as Record<string, string>
|
|
14
15
|
const links = modelNames
|
|
15
|
-
.map((n) => '<li><a href="' + basePath + '/' + n.toLowerCase() + '">' + n + '</a></li>')
|
|
16
|
+
.map((n) => '<li><a href="' + basePath + '/' + (segments[n] ?? n.toLowerCase()) + '">' + n + '</a></li>')
|
|
16
17
|
.join('')
|
|
17
18
|
|
|
18
19
|
return '<!DOCTYPE html><html><head><meta charset="utf-8" /><title>' + title +
|
|
@@ -23,7 +24,7 @@ const renderIndexFn = `function renderIndex(title: string, modelNames: string[],
|
|
|
23
24
|
'<ul class="mt-4 list-disc pl-6 text-sm">' + links + '</ul>' +
|
|
24
25
|
'</div></body></html>'
|
|
25
26
|
}`;
|
|
26
|
-
function generateExpress(modelNames, ext) {
|
|
27
|
+
function generateExpress(modelNames, pathSegments, ext) {
|
|
27
28
|
return `import type { Router } from 'express'
|
|
28
29
|
import { getEnv, removeTrailingSlash } from './misc${ext}'
|
|
29
30
|
|
|
@@ -31,6 +32,8 @@ const _env = getEnv()
|
|
|
31
32
|
|
|
32
33
|
const MODELS = ${JSON.stringify(modelNames)} as const
|
|
33
34
|
|
|
35
|
+
const MODEL_PATH_SEGMENTS = ${JSON.stringify(pathSegments)} as const
|
|
36
|
+
|
|
34
37
|
interface UnifiedDocsConfig {
|
|
35
38
|
title?: string
|
|
36
39
|
basePath?: string
|
|
@@ -57,7 +60,7 @@ ${renderIndexFn}
|
|
|
57
60
|
export default registerUnifiedDocs
|
|
58
61
|
`;
|
|
59
62
|
}
|
|
60
|
-
function generateFastify(modelNames, ext) {
|
|
63
|
+
function generateFastify(modelNames, pathSegments, ext) {
|
|
61
64
|
return `import type { FastifyInstance } from 'fastify'
|
|
62
65
|
import { getEnv, removeTrailingSlash } from './misc${ext}'
|
|
63
66
|
|
|
@@ -65,6 +68,8 @@ const _env = getEnv()
|
|
|
65
68
|
|
|
66
69
|
const MODELS = ${JSON.stringify(modelNames)} as const
|
|
67
70
|
|
|
71
|
+
const MODEL_PATH_SEGMENTS = ${JSON.stringify(pathSegments)} as const
|
|
72
|
+
|
|
68
73
|
interface UnifiedDocsConfig {
|
|
69
74
|
title?: string
|
|
70
75
|
basePath?: string
|
|
@@ -94,7 +99,7 @@ ${renderIndexFn}
|
|
|
94
99
|
export default registerUnifiedDocs
|
|
95
100
|
`;
|
|
96
101
|
}
|
|
97
|
-
function generateHono(modelNames, ext) {
|
|
102
|
+
function generateHono(modelNames, pathSegments, ext) {
|
|
98
103
|
return `import type { Hono } from 'hono'
|
|
99
104
|
import { getEnv, removeTrailingSlash } from './misc${ext}'
|
|
100
105
|
|
|
@@ -102,6 +107,8 @@ const _env = getEnv()
|
|
|
102
107
|
|
|
103
108
|
const MODELS = ${JSON.stringify(modelNames)} as const
|
|
104
109
|
|
|
110
|
+
const MODEL_PATH_SEGMENTS = ${JSON.stringify(pathSegments)} as const
|
|
111
|
+
|
|
105
112
|
interface UnifiedDocsConfig {
|
|
106
113
|
title?: string
|
|
107
114
|
basePath?: string
|