prisma-generator-express 1.57.0 → 1.58.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -29
- package/dist/copy/misc.js +25 -6
- package/dist/copy/misc.js.map +1 -1
- package/dist/generators/generateFastifyHandler.js +11 -0
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.js +14 -20
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateImportPrismaStatement.js +7 -1
- package/dist/generators/generateImportPrismaStatement.js.map +1 -1
- package/dist/generators/generateOperationCore.js +58 -17
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRouteConfigType.js +12 -7
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.js +57 -32
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.js +235 -191
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +2 -3
- package/dist/generators/generateRouterHono.js +131 -89
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/autoIncludeRuntime.ts +9 -5
- package/src/copy/buildModelOpenApi.ts +96 -0
- package/src/copy/docsRenderer.ts +577 -174
- package/src/copy/materializedRouter.ts +40 -1
- package/src/copy/misc.ts +23 -6
- package/src/copy/operationDefinitions.ts +10 -0
- package/src/copy/operationRuntime.ts +28 -9
- package/src/copy/routeConfig.express.ts +9 -9
- package/src/copy/routeConfig.hono.ts +63 -5
- package/src/copy/routeConfig.ts +44 -22
- package/src/generators/generateFastifyHandler.ts +12 -0
- package/src/generators/generateHonoHandler.ts +15 -20
- package/src/generators/generateImportPrismaStatement.ts +10 -1
- package/src/generators/generateOperationCore.ts +58 -17
- package/src/generators/generateRouteConfigType.ts +13 -8
- package/src/generators/generateRouter.ts +57 -32
- package/src/generators/generateRouterFastify.ts +235 -191
- package/src/generators/generateRouterHono.ts +131 -91
- package/src/index.ts +11 -7
|
@@ -3,7 +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
|
-
function generateHonoRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy,
|
|
6
|
+
function generateHonoRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, dropGuard, }) {
|
|
7
7
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
8
8
|
const modelName = model.name;
|
|
9
9
|
const modelNameLower = modelName.toLowerCase();
|
|
@@ -27,10 +27,9 @@ function generateHonoRouterFunction({ model, enums, guardShapesImport, importSty
|
|
|
27
27
|
values: e.values.map((v) => ({ name: v.name })),
|
|
28
28
|
}));
|
|
29
29
|
return `import { Hono } from 'hono'
|
|
30
|
-
import type { Context
|
|
30
|
+
import type { Context } from 'hono'
|
|
31
31
|
import type { ContentfulStatusCode } from 'hono/utils/http-status'
|
|
32
32
|
import { HTTPException } from 'hono/http-exception'
|
|
33
|
-
import { startQueryBuilder } from '../queryBuilder${ext}'
|
|
34
33
|
import {
|
|
35
34
|
${modelName}FindUnique,
|
|
36
35
|
${modelName}FindUniqueOrThrow,
|
|
@@ -50,41 +49,49 @@ import {
|
|
|
50
49
|
${modelName}Aggregate,
|
|
51
50
|
${modelName}Count,
|
|
52
51
|
${modelName}GroupBy,
|
|
52
|
+
${modelName}UpdateEach,
|
|
53
53
|
} from './${modelName}Handlers${ext}'
|
|
54
54
|
import type {
|
|
55
55
|
RouteConfig,
|
|
56
|
-
|
|
56
|
+
HonoBeforeHook,
|
|
57
|
+
HonoAfterHook,
|
|
57
58
|
HonoEnvBase,
|
|
58
59
|
HonoInternalVariables,
|
|
59
60
|
GeneratedHonoEnv,
|
|
60
61
|
WriteStrategy,
|
|
61
|
-
FindManyPaginatedMode,
|
|
62
62
|
PaginationConfig,
|
|
63
63
|
} from '../routeConfig.target${ext}'
|
|
64
64
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
65
|
-
import {
|
|
65
|
+
import { normalizePrefix, getEnv, sanitizeKeys } from '../misc${ext}'
|
|
66
66
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
67
|
+
import { validateCountSourceWhere } from '../routeConfig${ext}'
|
|
67
68
|
import {
|
|
68
69
|
mapError,
|
|
69
70
|
transformResult,
|
|
70
71
|
mergePaginationConfig,
|
|
71
|
-
type OperationContext,
|
|
72
72
|
} from '../operationRuntime${ext}'
|
|
73
73
|
|
|
74
|
-
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, '
|
|
74
|
+
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'HonoBeforeHook', guardShapesImport, importStyle, 'hono')}
|
|
75
75
|
const _env = getEnv()
|
|
76
76
|
|
|
77
77
|
const WRITE_STRATEGY: WriteStrategy = '${writeStrategy}'
|
|
78
|
-
const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
|
|
79
78
|
const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
|
|
80
79
|
|
|
80
|
+
type JsonLike =
|
|
81
|
+
| string
|
|
82
|
+
| number
|
|
83
|
+
| boolean
|
|
84
|
+
| null
|
|
85
|
+
| JsonLike[]
|
|
86
|
+
| { [k: string]: JsonLike }
|
|
87
|
+
|
|
81
88
|
const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
82
89
|
|
|
83
90
|
const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
|
|
84
91
|
|
|
85
92
|
type OperationConfigLike<TEnv extends HonoEnvBase> = {
|
|
86
|
-
before?:
|
|
87
|
-
after?:
|
|
93
|
+
before?: HonoBeforeHook<TEnv>[]
|
|
94
|
+
after?: HonoAfterHook<TEnv>[]
|
|
88
95
|
shape?: Record<string, unknown>
|
|
89
96
|
pagination?: Partial<PaginationConfig>
|
|
90
97
|
}
|
|
@@ -94,20 +101,7 @@ const defaultOpConfig = Object.freeze({
|
|
|
94
101
|
after: Object.freeze([]),
|
|
95
102
|
}) as unknown as OperationConfigLike<HonoEnvBase>
|
|
96
103
|
|
|
97
|
-
type HandlerContext = Context<{ Variables: HonoInternalVariables
|
|
98
|
-
|
|
99
|
-
function isQueryBuilderEnabled(config: RouteConfig): boolean {
|
|
100
|
-
if (config.queryBuilder === false) return false
|
|
101
|
-
if (typeof config.queryBuilder === 'object' && config.queryBuilder.enabled === false) return false
|
|
102
|
-
if (_env.NODE_ENV === 'production') return false
|
|
103
|
-
return true
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function getQueryBuilderConfig(config: RouteConfig) {
|
|
107
|
-
if (config.queryBuilder === false) return null
|
|
108
|
-
if (typeof config.queryBuilder === 'object') return config.queryBuilder
|
|
109
|
-
return {}
|
|
110
|
-
}
|
|
104
|
+
type HandlerContext = Context<{ Variables: HonoInternalVariables }>
|
|
111
105
|
|
|
112
106
|
async function parseQueryMiddleware(c: HandlerContext): Promise<void> {
|
|
113
107
|
const raw = c.req.query() as Record<string, unknown>
|
|
@@ -139,7 +133,20 @@ async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
|
139
133
|
if (!body || typeof body !== 'object' || Array.isArray(body)) {
|
|
140
134
|
throw new HTTPException(400, { message: 'Request body must be a JSON object' })
|
|
141
135
|
}
|
|
142
|
-
c.set('body',
|
|
136
|
+
c.set('body', body)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function parseUpdateEachBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
140
|
+
let body: unknown
|
|
141
|
+
try {
|
|
142
|
+
body = await c.req.json()
|
|
143
|
+
} catch {
|
|
144
|
+
throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
|
|
145
|
+
}
|
|
146
|
+
if (!Array.isArray(body)) {
|
|
147
|
+
throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
|
|
148
|
+
}
|
|
149
|
+
c.set('body', body)
|
|
143
150
|
}
|
|
144
151
|
|
|
145
152
|
function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
@@ -151,7 +158,6 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
151
158
|
if (merged) {
|
|
152
159
|
c.set('routeConfig', { pagination: merged })
|
|
153
160
|
}
|
|
154
|
-
;(c as unknown as HandlerContext).set('findManyPaginatedMode', FIND_MANY_PAGINATED_MODE)
|
|
155
161
|
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
156
162
|
const headerValue = c.req.header(headerName)
|
|
157
163
|
const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
|
|
@@ -162,26 +168,24 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
162
168
|
}
|
|
163
169
|
}
|
|
164
170
|
|
|
165
|
-
async function
|
|
166
|
-
hooks:
|
|
171
|
+
async function runBeforeHooks<TEnv extends HonoEnvBase>(
|
|
172
|
+
hooks: HonoBeforeHook<TEnv>[],
|
|
167
173
|
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
168
174
|
): Promise<Response | undefined> {
|
|
169
175
|
for (const hook of hooks) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
176
|
+
const result = await hook(c)
|
|
177
|
+
if (result instanceof Response) return result
|
|
178
|
+
}
|
|
179
|
+
return undefined
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async function runAfterHooks<TEnv extends HonoEnvBase>(
|
|
183
|
+
hooks: HonoAfterHook<TEnv>[],
|
|
184
|
+
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
185
|
+
): Promise<Response | undefined> {
|
|
186
|
+
for (const hook of hooks) {
|
|
187
|
+
const result = await hook(c)
|
|
175
188
|
if (result instanceof Response) return result
|
|
176
|
-
if (!advanced) {
|
|
177
|
-
if (_env.NODE_ENV !== 'production') {
|
|
178
|
-
console.warn(
|
|
179
|
-
'[hono-router] Hook returned without calling next() or returning a Response. ' +
|
|
180
|
-
'Use \`return c.json(...)\` to short-circuit, or \`await next()\` to continue.',
|
|
181
|
-
)
|
|
182
|
-
}
|
|
183
|
-
return c.body(null) ?? undefined
|
|
184
|
-
}
|
|
185
189
|
}
|
|
186
190
|
return undefined
|
|
187
191
|
}
|
|
@@ -192,73 +196,85 @@ function sendResult(c: HandlerContext): Response {
|
|
|
192
196
|
if (data === undefined) {
|
|
193
197
|
throw new HTTPException(500, { message: 'No data set by handler' })
|
|
194
198
|
}
|
|
195
|
-
return c.json(transformResult(data) as
|
|
199
|
+
return c.json(transformResult(data) as JsonLike, status as ContentfulStatusCode)
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
function sendError(c: HandlerContext, error: unknown): Response {
|
|
203
|
+
if (error instanceof HTTPException) {
|
|
204
|
+
return c.json({ message: error.message }, error.status as ContentfulStatusCode)
|
|
205
|
+
}
|
|
199
206
|
const httpError = mapError(error)
|
|
200
207
|
return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
|
|
201
208
|
}
|
|
202
209
|
|
|
203
210
|
export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
|
|
211
|
+
validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
|
|
212
|
+
validateCountSourceWhere(
|
|
213
|
+
(config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
|
|
214
|
+
'${modelName} findManyPaginated pagination',
|
|
215
|
+
)
|
|
216
|
+
|
|
204
217
|
const app = new Hono<GeneratedHonoEnv<TEnv>>()
|
|
205
218
|
|
|
219
|
+
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
220
|
+
|
|
206
221
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
207
222
|
const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
|
|
208
223
|
const basePath = customPrefix + modelPrefix
|
|
209
224
|
|
|
210
225
|
const openApiDisabled = config.disableOpenApi === true
|
|
211
226
|
|| (config.disableOpenApi !== false && (
|
|
212
|
-
_env.
|
|
213
|
-
|| _env.
|
|
227
|
+
_env.NODE_ENV === 'production'
|
|
228
|
+
|| _env.DISABLE_OPENAPI === 'true'
|
|
214
229
|
))
|
|
215
230
|
|
|
216
231
|
const postReadsEnabled = !config.disablePostReads
|
|
217
232
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
233
|
+
let _openApiJsonCache: unknown = undefined
|
|
234
|
+
const getOpenApiJson = (): unknown => {
|
|
235
|
+
if (_openApiJsonCache === undefined) {
|
|
236
|
+
_openApiJsonCache = buildModelOpenApi(
|
|
221
237
|
'${modelName}',
|
|
222
238
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
223
239
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
224
240
|
config as RouteConfig,
|
|
225
241
|
{ format: 'json', writeStrategy: WRITE_STRATEGY },
|
|
226
242
|
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
243
|
+
}
|
|
244
|
+
return _openApiJsonCache
|
|
245
|
+
}
|
|
246
|
+
let _openApiYamlCache: string | undefined = undefined
|
|
247
|
+
const getOpenApiYaml = (): string => {
|
|
248
|
+
if (_openApiYamlCache === undefined) {
|
|
249
|
+
_openApiYamlCache = buildModelOpenApi(
|
|
230
250
|
'${modelName}',
|
|
231
251
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
232
252
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
233
253
|
config as RouteConfig,
|
|
234
254
|
{ format: 'yaml', writeStrategy: WRITE_STRATEGY },
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
if (isQueryBuilderEnabled(config as RouteConfig)) {
|
|
238
|
-
const qbConfig = getQueryBuilderConfig(config as RouteConfig)
|
|
239
|
-
if (qbConfig) {
|
|
240
|
-
try {
|
|
241
|
-
startQueryBuilder(qbConfig)
|
|
242
|
-
} catch (err) {
|
|
243
|
-
if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err)
|
|
244
|
-
}
|
|
255
|
+
) as string
|
|
245
256
|
}
|
|
257
|
+
return _openApiYamlCache
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (config.queryBuilder && config.queryBuilder !== false && _env.NODE_ENV !== 'production') {
|
|
261
|
+
console.warn(
|
|
262
|
+
'[${modelName}Router] queryBuilder config is present but Hono target does not auto-start it. ' +
|
|
263
|
+
'Run \`npx prisma-query-builder-ui\` in a separate process.',
|
|
264
|
+
)
|
|
246
265
|
}
|
|
247
266
|
|
|
248
267
|
app.onError((err, c) => {
|
|
249
|
-
if (err instanceof HTTPException) {
|
|
250
|
-
return c.json({ message: err.message }, err.status as ContentfulStatusCode)
|
|
251
|
-
}
|
|
252
268
|
return sendError(c as HandlerContext, err)
|
|
253
269
|
})
|
|
254
270
|
|
|
255
271
|
if (!openApiDisabled) {
|
|
256
272
|
const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
|
|
257
273
|
const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
|
|
258
|
-
app.get(openapiJsonPath, (c) => c.json(
|
|
274
|
+
app.get(openapiJsonPath, (c) => c.json(getOpenApiJson() as JsonLike))
|
|
259
275
|
app.get(openapiYamlPath, (c) => {
|
|
260
276
|
c.header('Content-Type', 'application/yaml')
|
|
261
|
-
return c.body(
|
|
277
|
+
return c.body(getOpenApiYaml())
|
|
262
278
|
})
|
|
263
279
|
}
|
|
264
280
|
|
|
@@ -271,10 +287,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
271
287
|
await parseFn(c as unknown as HandlerContext)
|
|
272
288
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
273
289
|
const { before = [], after = [] } = opConfig
|
|
274
|
-
const beforeResp = await
|
|
290
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
275
291
|
if (beforeResp) return beforeResp
|
|
276
292
|
await handlerFn(c as unknown as HandlerContext)
|
|
277
|
-
const afterResp = await
|
|
293
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
278
294
|
if (afterResp) return afterResp
|
|
279
295
|
return sendResult(c as unknown as HandlerContext)
|
|
280
296
|
} catch (error: unknown) {
|
|
@@ -290,10 +306,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
290
306
|
await parseWriteBodyMiddleware(c as unknown as HandlerContext)
|
|
291
307
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
292
308
|
const { before = [], after = [] } = opConfig
|
|
293
|
-
const beforeResp = await
|
|
309
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
294
310
|
if (beforeResp) return beforeResp
|
|
295
311
|
await handlerFn(c as unknown as HandlerContext)
|
|
296
|
-
const afterResp = await
|
|
312
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
297
313
|
if (afterResp) return afterResp
|
|
298
314
|
return sendResult(c as unknown as HandlerContext)
|
|
299
315
|
} catch (error: unknown) {
|
|
@@ -306,55 +322,55 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
306
322
|
?? (defaultOpConfig as OperationConfigLike<TEnv>)
|
|
307
323
|
}
|
|
308
324
|
|
|
309
|
-
if (config.
|
|
325
|
+
if (isEnabled(config.findFirst)) {
|
|
310
326
|
const opConfig = opFor('findFirst')
|
|
311
327
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
312
328
|
app.get(path, handleRead(opConfig, ${modelName}FindFirst, parseQueryMiddleware))
|
|
313
329
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirst, parseBodyAsQueryMiddleware))
|
|
314
330
|
}
|
|
315
|
-
if (config.
|
|
331
|
+
if (isEnabled(config.findFirstOrThrow)) {
|
|
316
332
|
const opConfig = opFor('findFirstOrThrow')
|
|
317
333
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
318
334
|
app.get(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseQueryMiddleware))
|
|
319
335
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseBodyAsQueryMiddleware))
|
|
320
336
|
}
|
|
321
|
-
if (config.
|
|
337
|
+
if (isEnabled(config.findManyPaginated)) {
|
|
322
338
|
const opConfig = opFor('findManyPaginated')
|
|
323
339
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
324
340
|
app.get(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseQueryMiddleware))
|
|
325
341
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseBodyAsQueryMiddleware))
|
|
326
342
|
}
|
|
327
|
-
if (config.
|
|
343
|
+
if (isEnabled(config.aggregate)) {
|
|
328
344
|
const opConfig = opFor('aggregate')
|
|
329
345
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
330
346
|
app.get(path, handleRead(opConfig, ${modelName}Aggregate, parseQueryMiddleware))
|
|
331
347
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Aggregate, parseBodyAsQueryMiddleware))
|
|
332
348
|
}
|
|
333
|
-
if (config.
|
|
349
|
+
if (isEnabled(config.count)) {
|
|
334
350
|
const opConfig = opFor('count')
|
|
335
351
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
336
352
|
app.get(path, handleRead(opConfig, ${modelName}Count, parseQueryMiddleware))
|
|
337
353
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Count, parseBodyAsQueryMiddleware))
|
|
338
354
|
}
|
|
339
|
-
if (config.
|
|
355
|
+
if (isEnabled(config.groupBy)) {
|
|
340
356
|
const opConfig = opFor('groupBy')
|
|
341
357
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
342
358
|
app.get(path, handleRead(opConfig, ${modelName}GroupBy, parseQueryMiddleware))
|
|
343
359
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}GroupBy, parseBodyAsQueryMiddleware))
|
|
344
360
|
}
|
|
345
|
-
if (config.
|
|
361
|
+
if (isEnabled(config.findUniqueOrThrow)) {
|
|
346
362
|
const opConfig = opFor('findUniqueOrThrow')
|
|
347
363
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
348
364
|
app.get(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseQueryMiddleware))
|
|
349
365
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseBodyAsQueryMiddleware))
|
|
350
366
|
}
|
|
351
|
-
if (config.
|
|
367
|
+
if (isEnabled(config.findUnique)) {
|
|
352
368
|
const opConfig = opFor('findUnique')
|
|
353
369
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
354
370
|
app.get(path, handleRead(opConfig, ${modelName}FindUnique, parseQueryMiddleware))
|
|
355
371
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUnique, parseBodyAsQueryMiddleware))
|
|
356
372
|
}
|
|
357
|
-
if (config.
|
|
373
|
+
if (isEnabled(config.findMany)) {
|
|
358
374
|
const opConfig = opFor('findMany')
|
|
359
375
|
const path = basePath || '/'
|
|
360
376
|
app.get(path, handleRead(opConfig, ${modelName}FindMany, parseQueryMiddleware))
|
|
@@ -364,52 +380,78 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
364
380
|
}
|
|
365
381
|
}
|
|
366
382
|
|
|
367
|
-
if (config.
|
|
383
|
+
if (isEnabled(config.createManyAndReturn)) {
|
|
368
384
|
const opConfig = opFor('createManyAndReturn')
|
|
369
385
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
370
386
|
app.post(path, handleWrite(opConfig, ${modelName}CreateManyAndReturn))
|
|
371
387
|
}
|
|
372
|
-
if (config.
|
|
388
|
+
if (isEnabled(config.createMany)) {
|
|
373
389
|
const opConfig = opFor('createMany')
|
|
374
390
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
375
391
|
app.post(path, handleWrite(opConfig, ${modelName}CreateMany))
|
|
376
392
|
}
|
|
377
|
-
if (config.
|
|
393
|
+
if (isEnabled(config.create)) {
|
|
378
394
|
const opConfig = opFor('create')
|
|
379
395
|
const path = basePath || '/'
|
|
380
396
|
app.post(path, handleWrite(opConfig, ${modelName}Create))
|
|
381
397
|
}
|
|
382
|
-
if (config.
|
|
398
|
+
if (isEnabled(config.updateManyAndReturn)) {
|
|
383
399
|
const opConfig = opFor('updateManyAndReturn')
|
|
384
400
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
385
401
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateManyAndReturn))
|
|
386
402
|
}
|
|
387
|
-
if (config.
|
|
403
|
+
if (isEnabled(config.updateMany)) {
|
|
388
404
|
const opConfig = opFor('updateMany')
|
|
389
405
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
390
406
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateMany))
|
|
391
407
|
}
|
|
392
|
-
if (config.
|
|
408
|
+
if (isEnabled(config.update)) {
|
|
393
409
|
const opConfig = opFor('update')
|
|
394
410
|
const path = basePath || '/'
|
|
395
411
|
app.put(path, handleWrite(opConfig, ${modelName}Update))
|
|
396
412
|
}
|
|
397
|
-
if (config.
|
|
413
|
+
if (isEnabled(config.upsert)) {
|
|
398
414
|
const opConfig = opFor('upsert')
|
|
399
415
|
const path = basePath || '/'
|
|
400
416
|
app.patch(path, handleWrite(opConfig, ${modelName}Upsert))
|
|
401
417
|
}
|
|
402
|
-
if (config.
|
|
418
|
+
if (isEnabled(config.deleteMany)) {
|
|
403
419
|
const opConfig = opFor('deleteMany')
|
|
404
420
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
405
421
|
app.delete(path, handleWrite(opConfig, ${modelName}DeleteMany))
|
|
406
422
|
}
|
|
407
|
-
if (config.
|
|
423
|
+
if (isEnabled(config.delete)) {
|
|
408
424
|
const opConfig = opFor('delete')
|
|
409
425
|
const path = basePath || '/'
|
|
410
426
|
app.delete(path, handleWrite(opConfig, ${modelName}Delete))
|
|
411
427
|
}
|
|
412
428
|
|
|
429
|
+
if (config.updateEach) {
|
|
430
|
+
const opConfig = (config.updateEach as unknown as OperationConfigLike<TEnv> | undefined) ?? (defaultOpConfig as OperationConfigLike<TEnv>)
|
|
431
|
+
if ((!opConfig.before || opConfig.before.length === 0) && _env.NODE_ENV !== 'production') {
|
|
432
|
+
console.warn(
|
|
433
|
+
'[${modelName}Router] updateEach is enabled without a before hook. ' +
|
|
434
|
+
'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
|
|
435
|
+
)
|
|
436
|
+
}
|
|
437
|
+
const path = basePath ? \`\${basePath}/each\` : '/each'
|
|
438
|
+
app.post(path, async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
|
|
439
|
+
try {
|
|
440
|
+
await parseUpdateEachBodyMiddleware(c as unknown as HandlerContext)
|
|
441
|
+
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
442
|
+
const { before = [], after = [] } = opConfig
|
|
443
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
444
|
+
if (beforeResp) return beforeResp
|
|
445
|
+
await ${modelName}UpdateEach(c as unknown as HandlerContext)
|
|
446
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
447
|
+
if (afterResp) return afterResp
|
|
448
|
+
return sendResult(c as unknown as HandlerContext)
|
|
449
|
+
} catch (error: unknown) {
|
|
450
|
+
return sendError(c as unknown as HandlerContext, error)
|
|
451
|
+
}
|
|
452
|
+
})
|
|
453
|
+
}
|
|
454
|
+
|
|
413
455
|
return app
|
|
414
456
|
}
|
|
415
457
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"generateRouterHono.js","sourceRoot":"","sources":["../../src/generators/generateRouterHono.ts"],"names":[],"mappings":";;AAMA,gEAwdC;AA7dD,uEAAmE;AAEnE,kDAA8C;AAG9C,SAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,GAQV;IACC,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,WAAW,CAAC,CAAA;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;IAC9C,MAAM,kBAAkB,GAAG,GAAG,SAAS,QAAQ,CAAA;IAE/C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,KAAK;QACnC,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;KACzC,CAAC,CAAC,CAAA;IAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACjE,CAAA;IAED,MAAM,SAAS,GAAG,KAAK;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAChD,CAAC,CAAC,CAAA;IAEL,OAAO;;;;;IAKL,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;YACD,SAAS,WAAW,GAAG;;;;;;;;;;+BAUJ,GAAG;uDACqB,GAAG;gEACM,GAAG;yDACV,GAAG;0DACF,GAAG;;;;;6BAKhC,GAAG;;EAE9B,IAAA,iDAAuB,EAAC,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC;;;yCAGrD,aAAa;qBACjC,SAAS;;;;;;;;;;uBAUP,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;;sBAEpC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA+D5C,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyDH,kBAAkB,mFAAmF,SAAS;8DAClE,SAAS;;;OAGhE,SAAS;;;;;;;;4DAQ4C,cAAc;;;;;;;;;;;;;;;WAe/D,SAAS;;;;;;;;;;;;;WAaT,SAAS;;;;;;;;;;;;UAYV,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA0DgB,SAAS;;;;;;;;yCAQH,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;gEACc,SAAS;;;;;yCAKhC,SAAS;;;gDAGF,SAAS;;;;;;;2CAOd,SAAS;;;;;2CAKT,SAAS;;;;;2CAKT,SAAS;;;;;0CAKV,SAAS;;;;;0CAKT,SAAS;;;;;0CAKT,SAAS;;;;;4CAKP,SAAS;;;;;6CAKR,SAAS;;;;;6CAKT,SAAS;;;;;;;YAO1C,SAAS;;;;;;;;;;;;gBAYL,SAAS;;;;;;;;;;;;CAYxB,CAAA;AACD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@ const writeFileSafely_1 = require("./utils/writeFileSafely");
|
|
|
21
21
|
const copyFiles_1 = require("./utils/copyFiles");
|
|
22
22
|
const resolveImportStyle_1 = require("./utils/resolveImportStyle");
|
|
23
23
|
const constants_1 = require("./constants");
|
|
24
|
-
const GENERATOR_OFF_RE =
|
|
24
|
+
const GENERATOR_OFF_RE = /^\s*generator off\s*$/m;
|
|
25
25
|
function getTarget(options) {
|
|
26
26
|
const raw = String(options.generator.config.target ?? 'express').toLowerCase();
|
|
27
27
|
if (raw === 'express' || raw === 'fastify' || raw === 'hono')
|
|
@@ -63,7 +63,10 @@ function getDropGuard(options) {
|
|
|
63
63
|
return true;
|
|
64
64
|
if (lower === 'false' || lower === '0')
|
|
65
65
|
return false;
|
|
66
|
-
|
|
66
|
+
console.warn(`[prisma-generator-express] dropGuard="${raw}" is not a recognized boolean value. ` +
|
|
67
|
+
`Treating as false. Expected "true", "false", "1", "0", or "" (unset). ` +
|
|
68
|
+
`If you used env("VAR_NAME"), set VAR_NAME to "true" or "false".`);
|
|
69
|
+
return false;
|
|
67
70
|
}
|
|
68
71
|
function validateClientGeneratorPresent(options) {
|
|
69
72
|
(0, generateImportPrismaStatement_1.getRelativeClientPath)(options, options.dmmf.datamodel.models[0]?.name ?? 'Model');
|
|
@@ -72,7 +75,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
72
75
|
onManifest() {
|
|
73
76
|
return {
|
|
74
77
|
version: require('../package.json').version,
|
|
75
|
-
defaultOutput: '../generated/
|
|
78
|
+
defaultOutput: '../generated/output',
|
|
76
79
|
prettyName: constants_1.GENERATOR_NAME,
|
|
77
80
|
};
|
|
78
81
|
},
|
|
@@ -81,7 +84,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
81
84
|
const writeStrategy = getWriteStrategy(options);
|
|
82
85
|
const findManyPaginatedMode = getFindManyPaginatedMode(options);
|
|
83
86
|
const dropGuard = getDropGuard(options);
|
|
84
|
-
const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated',
|
|
87
|
+
const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated', 'output');
|
|
85
88
|
const currentOutput = options.generator.output?.value;
|
|
86
89
|
const isUnsetOrManifestDefault = !currentOutput || path_1.default.resolve(currentOutput) === manifestDefaultAbs;
|
|
87
90
|
if (isUnsetOrManifestDefault) {
|
|
@@ -96,7 +99,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
96
99
|
console.log(` Import style: ${importStyle}`);
|
|
97
100
|
console.log(` Write strategy: ${writeStrategy}`);
|
|
98
101
|
console.log(` findManyPaginated mode: ${findManyPaginatedMode}`);
|
|
99
|
-
console.log(` Drop guard: ${dropGuard}`);
|
|
102
|
+
console.log(` Drop guard (generator): ${dropGuard}${dropGuard ? '' : ' (runtime E2E=true will also drop guard)'}`);
|
|
100
103
|
if (options.dmmf.datamodel.models.length > 0) {
|
|
101
104
|
validateClientGeneratorPresent(options);
|
|
102
105
|
}
|
|
@@ -151,7 +154,6 @@ function validateClientGeneratorPresent(options) {
|
|
|
151
154
|
guardShapesImport,
|
|
152
155
|
importStyle,
|
|
153
156
|
writeStrategy,
|
|
154
|
-
findManyPaginatedMode,
|
|
155
157
|
dropGuard,
|
|
156
158
|
})
|
|
157
159
|
: (0, generateRouter_1.generateRouterFunction)({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,+DAIiC;AACjC,gDAAuB;AACvB,gFAA4E;AAC5E,gFAA4E;AAC5E,0EAAsE;AACtE,gEAAoE;AACpE,8EAAkF;AAClF,wEAA4E;AAC5E,kFAA8E;AAC9E,0EAAsE;AACtE,wFAAoF;AACpF,8EAAsE;AACtE,4EAG0C;AAC1C,8FAGmD;AACnD,6DAAyD;AACzD,iDAA6C;AAC7C,mEAA4E;AAC5E,2CAKoB;AAEpB,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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.58.1",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
@@ -393,11 +393,13 @@ async function runAutoIncludeSingle(
|
|
|
393
393
|
const publicState: Record<string, unknown> = { ...publicRoot }
|
|
394
394
|
for (const [k, v] of Object.entries(publicRoot)) {
|
|
395
395
|
if (isClientGone()) return
|
|
396
|
-
sendSSEField(res, k, v)
|
|
396
|
+
const okField = sendSSEField(res, k, v)
|
|
397
|
+
if (!okField) return
|
|
397
398
|
}
|
|
398
399
|
|
|
399
400
|
if (isClientGone()) return
|
|
400
|
-
sendSSEProgress(res, 'root', 0, plan.stages.length)
|
|
401
|
+
const okStart = sendSSEProgress(res, 'root', 0, plan.stages.length)
|
|
402
|
+
if (!okStart) return
|
|
401
403
|
|
|
402
404
|
const groups = groupStagesByDepth(plan.stages)
|
|
403
405
|
let completed = 0
|
|
@@ -433,7 +435,8 @@ async function runAutoIncludeSingle(
|
|
|
433
435
|
}
|
|
434
436
|
if (isAborted()) return
|
|
435
437
|
completed++
|
|
436
|
-
sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
|
|
438
|
+
const ok = sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
|
|
439
|
+
if (!ok) return
|
|
437
440
|
})
|
|
438
441
|
}
|
|
439
442
|
|
|
@@ -699,7 +702,8 @@ async function processFindManyStages(args: {
|
|
|
699
702
|
}
|
|
700
703
|
if (isAborted()) return
|
|
701
704
|
completed++
|
|
702
|
-
sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
|
|
705
|
+
const ok = sendSSEProgress(res, stage.relationPath, completed, plan.stages.length)
|
|
706
|
+
if (!ok) return
|
|
703
707
|
})
|
|
704
708
|
}
|
|
705
709
|
return stageErrorMessage
|
|
@@ -875,7 +879,7 @@ async function runAutoIncludePaginated(
|
|
|
875
879
|
const skip = typeof rootArgs.skip === 'number' ? rootArgs.skip : 0
|
|
876
880
|
const takeRaw = typeof rootArgs.take === 'number' ? rootArgs.take : rootRows.length
|
|
877
881
|
const absTake = Math.abs(takeRaw)
|
|
878
|
-
const hasMore = rootRows.length >= absTake && skip + rootRows.length < total
|
|
882
|
+
const hasMore = absTake > 0 && rootRows.length >= absTake && skip + rootRows.length < total
|
|
879
883
|
|
|
880
884
|
const { publicRows, rootPairs } = buildRootPairs(rootRows, plan.internalFieldPaths)
|
|
881
885
|
|