prisma-generator-express 1.57.0 → 1.58.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 +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.js +121 -87
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/index.js +4 -4
- 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 +121 -87
- package/src/index.ts +6 -4
|
@@ -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,32 +49,32 @@ 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
|
|
|
81
80
|
const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
@@ -83,8 +82,8 @@ const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
|
83
82
|
const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
|
|
84
83
|
|
|
85
84
|
type OperationConfigLike<TEnv extends HonoEnvBase> = {
|
|
86
|
-
before?:
|
|
87
|
-
after?:
|
|
85
|
+
before?: HonoBeforeHook<TEnv>[]
|
|
86
|
+
after?: HonoAfterHook<TEnv>[]
|
|
88
87
|
shape?: Record<string, unknown>
|
|
89
88
|
pagination?: Partial<PaginationConfig>
|
|
90
89
|
}
|
|
@@ -94,20 +93,7 @@ const defaultOpConfig = Object.freeze({
|
|
|
94
93
|
after: Object.freeze([]),
|
|
95
94
|
}) as unknown as OperationConfigLike<HonoEnvBase>
|
|
96
95
|
|
|
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
|
-
}
|
|
96
|
+
type HandlerContext = Context<{ Variables: HonoInternalVariables }>
|
|
111
97
|
|
|
112
98
|
async function parseQueryMiddleware(c: HandlerContext): Promise<void> {
|
|
113
99
|
const raw = c.req.query() as Record<string, unknown>
|
|
@@ -139,7 +125,20 @@ async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
|
139
125
|
if (!body || typeof body !== 'object' || Array.isArray(body)) {
|
|
140
126
|
throw new HTTPException(400, { message: 'Request body must be a JSON object' })
|
|
141
127
|
}
|
|
142
|
-
c.set('body',
|
|
128
|
+
c.set('body', body)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function parseUpdateEachBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
132
|
+
let body: unknown
|
|
133
|
+
try {
|
|
134
|
+
body = await c.req.json()
|
|
135
|
+
} catch {
|
|
136
|
+
throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
|
|
137
|
+
}
|
|
138
|
+
if (!Array.isArray(body)) {
|
|
139
|
+
throw new HTTPException(400, { message: 'updateEach body must be an array of { where, data } items' })
|
|
140
|
+
}
|
|
141
|
+
c.set('body', body)
|
|
143
142
|
}
|
|
144
143
|
|
|
145
144
|
function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
@@ -151,7 +150,6 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
151
150
|
if (merged) {
|
|
152
151
|
c.set('routeConfig', { pagination: merged })
|
|
153
152
|
}
|
|
154
|
-
;(c as unknown as HandlerContext).set('findManyPaginatedMode', FIND_MANY_PAGINATED_MODE)
|
|
155
153
|
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
156
154
|
const headerValue = c.req.header(headerName)
|
|
157
155
|
const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
|
|
@@ -162,26 +160,24 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
162
160
|
}
|
|
163
161
|
}
|
|
164
162
|
|
|
165
|
-
async function
|
|
166
|
-
hooks:
|
|
163
|
+
async function runBeforeHooks<TEnv extends HonoEnvBase>(
|
|
164
|
+
hooks: HonoBeforeHook<TEnv>[],
|
|
167
165
|
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
168
166
|
): Promise<Response | undefined> {
|
|
169
167
|
for (const hook of hooks) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
168
|
+
const result = await hook(c)
|
|
169
|
+
if (result instanceof Response) return result
|
|
170
|
+
}
|
|
171
|
+
return undefined
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function runAfterHooks<TEnv extends HonoEnvBase>(
|
|
175
|
+
hooks: HonoAfterHook<TEnv>[],
|
|
176
|
+
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
177
|
+
): Promise<Response | undefined> {
|
|
178
|
+
for (const hook of hooks) {
|
|
179
|
+
const result = await hook(c)
|
|
175
180
|
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
181
|
}
|
|
186
182
|
return undefined
|
|
187
183
|
}
|
|
@@ -196,69 +192,81 @@ function sendResult(c: HandlerContext): Response {
|
|
|
196
192
|
}
|
|
197
193
|
|
|
198
194
|
function sendError(c: HandlerContext, error: unknown): Response {
|
|
195
|
+
if (error instanceof HTTPException) {
|
|
196
|
+
return c.json({ message: error.message }, error.status as ContentfulStatusCode)
|
|
197
|
+
}
|
|
199
198
|
const httpError = mapError(error)
|
|
200
199
|
return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
|
|
201
200
|
}
|
|
202
201
|
|
|
203
202
|
export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extends HonoEnvBase = HonoEnvBase>(config: ${modelName}RouteConfig<TCtx, TPrisma, TEnv> = {}): Hono<GeneratedHonoEnv<TEnv>> {
|
|
203
|
+
validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
|
|
204
|
+
validateCountSourceWhere(
|
|
205
|
+
(config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
|
|
206
|
+
'${modelName} findManyPaginated pagination',
|
|
207
|
+
)
|
|
208
|
+
|
|
204
209
|
const app = new Hono<GeneratedHonoEnv<TEnv>>()
|
|
205
210
|
|
|
211
|
+
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
212
|
+
|
|
206
213
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
207
214
|
const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
|
|
208
215
|
const basePath = customPrefix + modelPrefix
|
|
209
216
|
|
|
210
217
|
const openApiDisabled = config.disableOpenApi === true
|
|
211
218
|
|| (config.disableOpenApi !== false && (
|
|
212
|
-
_env.
|
|
213
|
-
|| _env.
|
|
219
|
+
_env.NODE_ENV === 'production'
|
|
220
|
+
|| _env.DISABLE_OPENAPI === 'true'
|
|
214
221
|
))
|
|
215
222
|
|
|
216
223
|
const postReadsEnabled = !config.disablePostReads
|
|
217
224
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
225
|
+
let _openApiJsonCache: unknown = undefined
|
|
226
|
+
const getOpenApiJson = (): unknown => {
|
|
227
|
+
if (_openApiJsonCache === undefined) {
|
|
228
|
+
_openApiJsonCache = buildModelOpenApi(
|
|
221
229
|
'${modelName}',
|
|
222
230
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
223
231
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
224
232
|
config as RouteConfig,
|
|
225
233
|
{ format: 'json', writeStrategy: WRITE_STRATEGY },
|
|
226
234
|
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
235
|
+
}
|
|
236
|
+
return _openApiJsonCache
|
|
237
|
+
}
|
|
238
|
+
let _openApiYamlCache: string | undefined = undefined
|
|
239
|
+
const getOpenApiYaml = (): string => {
|
|
240
|
+
if (_openApiYamlCache === undefined) {
|
|
241
|
+
_openApiYamlCache = buildModelOpenApi(
|
|
230
242
|
'${modelName}',
|
|
231
243
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
232
244
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
233
245
|
config as RouteConfig,
|
|
234
246
|
{ 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
|
-
}
|
|
247
|
+
) as string
|
|
245
248
|
}
|
|
249
|
+
return _openApiYamlCache
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (config.queryBuilder && config.queryBuilder !== false && _env.NODE_ENV !== 'production') {
|
|
253
|
+
console.warn(
|
|
254
|
+
'[${modelName}Router] queryBuilder config is present but Hono target does not auto-start it. ' +
|
|
255
|
+
'Run \`npx prisma-query-builder-ui\` in a separate process.',
|
|
256
|
+
)
|
|
246
257
|
}
|
|
247
258
|
|
|
248
259
|
app.onError((err, c) => {
|
|
249
|
-
if (err instanceof HTTPException) {
|
|
250
|
-
return c.json({ message: err.message }, err.status as ContentfulStatusCode)
|
|
251
|
-
}
|
|
252
260
|
return sendError(c as HandlerContext, err)
|
|
253
261
|
})
|
|
254
262
|
|
|
255
263
|
if (!openApiDisabled) {
|
|
256
264
|
const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
|
|
257
265
|
const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
|
|
258
|
-
app.get(openapiJsonPath, (c) => c.json(
|
|
266
|
+
app.get(openapiJsonPath, (c) => c.json(getOpenApiJson() as Record<string, unknown>))
|
|
259
267
|
app.get(openapiYamlPath, (c) => {
|
|
260
268
|
c.header('Content-Type', 'application/yaml')
|
|
261
|
-
return c.body(
|
|
269
|
+
return c.body(getOpenApiYaml())
|
|
262
270
|
})
|
|
263
271
|
}
|
|
264
272
|
|
|
@@ -271,10 +279,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
271
279
|
await parseFn(c as unknown as HandlerContext)
|
|
272
280
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
273
281
|
const { before = [], after = [] } = opConfig
|
|
274
|
-
const beforeResp = await
|
|
282
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
275
283
|
if (beforeResp) return beforeResp
|
|
276
284
|
await handlerFn(c as unknown as HandlerContext)
|
|
277
|
-
const afterResp = await
|
|
285
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
278
286
|
if (afterResp) return afterResp
|
|
279
287
|
return sendResult(c as unknown as HandlerContext)
|
|
280
288
|
} catch (error: unknown) {
|
|
@@ -290,10 +298,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
290
298
|
await parseWriteBodyMiddleware(c as unknown as HandlerContext)
|
|
291
299
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
292
300
|
const { before = [], after = [] } = opConfig
|
|
293
|
-
const beforeResp = await
|
|
301
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
294
302
|
if (beforeResp) return beforeResp
|
|
295
303
|
await handlerFn(c as unknown as HandlerContext)
|
|
296
|
-
const afterResp = await
|
|
304
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
297
305
|
if (afterResp) return afterResp
|
|
298
306
|
return sendResult(c as unknown as HandlerContext)
|
|
299
307
|
} catch (error: unknown) {
|
|
@@ -306,55 +314,55 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
306
314
|
?? (defaultOpConfig as OperationConfigLike<TEnv>)
|
|
307
315
|
}
|
|
308
316
|
|
|
309
|
-
if (config.
|
|
317
|
+
if (isEnabled(config.findFirst)) {
|
|
310
318
|
const opConfig = opFor('findFirst')
|
|
311
319
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
312
320
|
app.get(path, handleRead(opConfig, ${modelName}FindFirst, parseQueryMiddleware))
|
|
313
321
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirst, parseBodyAsQueryMiddleware))
|
|
314
322
|
}
|
|
315
|
-
if (config.
|
|
323
|
+
if (isEnabled(config.findFirstOrThrow)) {
|
|
316
324
|
const opConfig = opFor('findFirstOrThrow')
|
|
317
325
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
318
326
|
app.get(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseQueryMiddleware))
|
|
319
327
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseBodyAsQueryMiddleware))
|
|
320
328
|
}
|
|
321
|
-
if (config.
|
|
329
|
+
if (isEnabled(config.findManyPaginated)) {
|
|
322
330
|
const opConfig = opFor('findManyPaginated')
|
|
323
331
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
324
332
|
app.get(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseQueryMiddleware))
|
|
325
333
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseBodyAsQueryMiddleware))
|
|
326
334
|
}
|
|
327
|
-
if (config.
|
|
335
|
+
if (isEnabled(config.aggregate)) {
|
|
328
336
|
const opConfig = opFor('aggregate')
|
|
329
337
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
330
338
|
app.get(path, handleRead(opConfig, ${modelName}Aggregate, parseQueryMiddleware))
|
|
331
339
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Aggregate, parseBodyAsQueryMiddleware))
|
|
332
340
|
}
|
|
333
|
-
if (config.
|
|
341
|
+
if (isEnabled(config.count)) {
|
|
334
342
|
const opConfig = opFor('count')
|
|
335
343
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
336
344
|
app.get(path, handleRead(opConfig, ${modelName}Count, parseQueryMiddleware))
|
|
337
345
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Count, parseBodyAsQueryMiddleware))
|
|
338
346
|
}
|
|
339
|
-
if (config.
|
|
347
|
+
if (isEnabled(config.groupBy)) {
|
|
340
348
|
const opConfig = opFor('groupBy')
|
|
341
349
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
342
350
|
app.get(path, handleRead(opConfig, ${modelName}GroupBy, parseQueryMiddleware))
|
|
343
351
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}GroupBy, parseBodyAsQueryMiddleware))
|
|
344
352
|
}
|
|
345
|
-
if (config.
|
|
353
|
+
if (isEnabled(config.findUniqueOrThrow)) {
|
|
346
354
|
const opConfig = opFor('findUniqueOrThrow')
|
|
347
355
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
348
356
|
app.get(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseQueryMiddleware))
|
|
349
357
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseBodyAsQueryMiddleware))
|
|
350
358
|
}
|
|
351
|
-
if (config.
|
|
359
|
+
if (isEnabled(config.findUnique)) {
|
|
352
360
|
const opConfig = opFor('findUnique')
|
|
353
361
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
354
362
|
app.get(path, handleRead(opConfig, ${modelName}FindUnique, parseQueryMiddleware))
|
|
355
363
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUnique, parseBodyAsQueryMiddleware))
|
|
356
364
|
}
|
|
357
|
-
if (config.
|
|
365
|
+
if (isEnabled(config.findMany)) {
|
|
358
366
|
const opConfig = opFor('findMany')
|
|
359
367
|
const path = basePath || '/'
|
|
360
368
|
app.get(path, handleRead(opConfig, ${modelName}FindMany, parseQueryMiddleware))
|
|
@@ -364,52 +372,78 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
364
372
|
}
|
|
365
373
|
}
|
|
366
374
|
|
|
367
|
-
if (config.
|
|
375
|
+
if (isEnabled(config.createManyAndReturn)) {
|
|
368
376
|
const opConfig = opFor('createManyAndReturn')
|
|
369
377
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
370
378
|
app.post(path, handleWrite(opConfig, ${modelName}CreateManyAndReturn))
|
|
371
379
|
}
|
|
372
|
-
if (config.
|
|
380
|
+
if (isEnabled(config.createMany)) {
|
|
373
381
|
const opConfig = opFor('createMany')
|
|
374
382
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
375
383
|
app.post(path, handleWrite(opConfig, ${modelName}CreateMany))
|
|
376
384
|
}
|
|
377
|
-
if (config.
|
|
385
|
+
if (isEnabled(config.create)) {
|
|
378
386
|
const opConfig = opFor('create')
|
|
379
387
|
const path = basePath || '/'
|
|
380
388
|
app.post(path, handleWrite(opConfig, ${modelName}Create))
|
|
381
389
|
}
|
|
382
|
-
if (config.
|
|
390
|
+
if (isEnabled(config.updateManyAndReturn)) {
|
|
383
391
|
const opConfig = opFor('updateManyAndReturn')
|
|
384
392
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
385
393
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateManyAndReturn))
|
|
386
394
|
}
|
|
387
|
-
if (config.
|
|
395
|
+
if (isEnabled(config.updateMany)) {
|
|
388
396
|
const opConfig = opFor('updateMany')
|
|
389
397
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
390
398
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateMany))
|
|
391
399
|
}
|
|
392
|
-
if (config.
|
|
400
|
+
if (isEnabled(config.update)) {
|
|
393
401
|
const opConfig = opFor('update')
|
|
394
402
|
const path = basePath || '/'
|
|
395
403
|
app.put(path, handleWrite(opConfig, ${modelName}Update))
|
|
396
404
|
}
|
|
397
|
-
if (config.
|
|
405
|
+
if (isEnabled(config.upsert)) {
|
|
398
406
|
const opConfig = opFor('upsert')
|
|
399
407
|
const path = basePath || '/'
|
|
400
408
|
app.patch(path, handleWrite(opConfig, ${modelName}Upsert))
|
|
401
409
|
}
|
|
402
|
-
if (config.
|
|
410
|
+
if (isEnabled(config.deleteMany)) {
|
|
403
411
|
const opConfig = opFor('deleteMany')
|
|
404
412
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
405
413
|
app.delete(path, handleWrite(opConfig, ${modelName}DeleteMany))
|
|
406
414
|
}
|
|
407
|
-
if (config.
|
|
415
|
+
if (isEnabled(config.delete)) {
|
|
408
416
|
const opConfig = opFor('delete')
|
|
409
417
|
const path = basePath || '/'
|
|
410
418
|
app.delete(path, handleWrite(opConfig, ${modelName}Delete))
|
|
411
419
|
}
|
|
412
420
|
|
|
421
|
+
if (config.updateEach) {
|
|
422
|
+
const opConfig = (config.updateEach as unknown as OperationConfigLike<TEnv> | undefined) ?? (defaultOpConfig as OperationConfigLike<TEnv>)
|
|
423
|
+
if ((!opConfig.before || opConfig.before.length === 0) && _env.NODE_ENV !== 'production') {
|
|
424
|
+
console.warn(
|
|
425
|
+
'[${modelName}Router] updateEach is enabled without a before hook. ' +
|
|
426
|
+
'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
|
|
427
|
+
)
|
|
428
|
+
}
|
|
429
|
+
const path = basePath ? \`\${basePath}/each\` : '/each'
|
|
430
|
+
app.post(path, async (c: Context<GeneratedHonoEnv<TEnv>>): Promise<Response> => {
|
|
431
|
+
try {
|
|
432
|
+
await parseUpdateEachBodyMiddleware(c as unknown as HandlerContext)
|
|
433
|
+
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
434
|
+
const { before = [], after = [] } = opConfig
|
|
435
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
436
|
+
if (beforeResp) return beforeResp
|
|
437
|
+
await ${modelName}UpdateEach(c as unknown as HandlerContext)
|
|
438
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
439
|
+
if (afterResp) return afterResp
|
|
440
|
+
return sendResult(c as unknown as HandlerContext)
|
|
441
|
+
} catch (error: unknown) {
|
|
442
|
+
return sendError(c as unknown as HandlerContext, error)
|
|
443
|
+
}
|
|
444
|
+
})
|
|
445
|
+
}
|
|
446
|
+
|
|
413
447
|
return app
|
|
414
448
|
}
|
|
415
449
|
`;
|
|
@@ -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":"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"}
|
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')
|
|
@@ -72,7 +72,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
72
72
|
onManifest() {
|
|
73
73
|
return {
|
|
74
74
|
version: require('../package.json').version,
|
|
75
|
-
defaultOutput: '../generated/
|
|
75
|
+
defaultOutput: '../generated/output',
|
|
76
76
|
prettyName: constants_1.GENERATOR_NAME,
|
|
77
77
|
};
|
|
78
78
|
},
|
|
@@ -81,7 +81,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
81
81
|
const writeStrategy = getWriteStrategy(options);
|
|
82
82
|
const findManyPaginatedMode = getFindManyPaginatedMode(options);
|
|
83
83
|
const dropGuard = getDropGuard(options);
|
|
84
|
-
const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated',
|
|
84
|
+
const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated', 'output');
|
|
85
85
|
const currentOutput = options.generator.output?.value;
|
|
86
86
|
const isUnsetOrManifestDefault = !currentOutput || path_1.default.resolve(currentOutput) === manifestDefaultAbs;
|
|
87
87
|
if (isUnsetOrManifestDefault) {
|
|
@@ -96,7 +96,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
96
96
|
console.log(` Import style: ${importStyle}`);
|
|
97
97
|
console.log(` Write strategy: ${writeStrategy}`);
|
|
98
98
|
console.log(` findManyPaginated mode: ${findManyPaginatedMode}`);
|
|
99
|
-
console.log(` Drop guard: ${dropGuard}`);
|
|
99
|
+
console.log(` Drop guard (generator): ${dropGuard}${dropGuard ? '' : ' (runtime E2E=true will also drop guard)'}`);
|
|
100
100
|
if (options.dmmf.datamodel.models.length > 0) {
|
|
101
101
|
validateClientGeneratorPresent(options);
|
|
102
102
|
}
|
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.0",
|
|
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
|
|