prisma-generator-express 1.56.4 → 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 +286 -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 +43 -0
- 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 +44 -15
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.d.ts +2 -1
- package/dist/generators/generateRouter.js +60 -34
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +2 -1
- package/dist/generators/generateRouterFastify.js +238 -193
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +2 -1
- package/dist/generators/generateRouterHono.js +124 -89
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/index.js +22 -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 -20
- package/src/generators/generateFastifyHandler.ts +12 -0
- package/src/generators/generateHonoHandler.ts +15 -20
- package/src/generators/generateImportPrismaStatement.ts +13 -0
- package/src/generators/generateOperationCore.ts +58 -17
- package/src/generators/generateRouteConfigType.ts +52 -17
- package/src/generators/generateRouter.ts +61 -33
- package/src/generators/generateRouterFastify.ts +239 -192
- package/src/generators/generateRouterHono.ts +125 -88
- package/src/index.ts +25 -5
|
@@ -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, findManyPaginatedMode, }) {
|
|
6
|
+
function generateHonoRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, 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,40 +49,41 @@ 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
|
|
78
|
+
const DROP_GUARD = ${dropGuard} || _env.E2E === 'true'
|
|
79
79
|
|
|
80
80
|
const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
81
81
|
|
|
82
82
|
const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
|
|
83
83
|
|
|
84
84
|
type OperationConfigLike<TEnv extends HonoEnvBase> = {
|
|
85
|
-
before?:
|
|
86
|
-
after?:
|
|
85
|
+
before?: HonoBeforeHook<TEnv>[]
|
|
86
|
+
after?: HonoAfterHook<TEnv>[]
|
|
87
87
|
shape?: Record<string, unknown>
|
|
88
88
|
pagination?: Partial<PaginationConfig>
|
|
89
89
|
}
|
|
@@ -93,20 +93,7 @@ const defaultOpConfig = Object.freeze({
|
|
|
93
93
|
after: Object.freeze([]),
|
|
94
94
|
}) as unknown as OperationConfigLike<HonoEnvBase>
|
|
95
95
|
|
|
96
|
-
type HandlerContext = Context<{ Variables: HonoInternalVariables
|
|
97
|
-
|
|
98
|
-
function isQueryBuilderEnabled(config: RouteConfig): boolean {
|
|
99
|
-
if (config.queryBuilder === false) return false
|
|
100
|
-
if (typeof config.queryBuilder === 'object' && config.queryBuilder.enabled === false) return false
|
|
101
|
-
if (_env.NODE_ENV === 'production') return false
|
|
102
|
-
return true
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function getQueryBuilderConfig(config: RouteConfig) {
|
|
106
|
-
if (config.queryBuilder === false) return null
|
|
107
|
-
if (typeof config.queryBuilder === 'object') return config.queryBuilder
|
|
108
|
-
return {}
|
|
109
|
-
}
|
|
96
|
+
type HandlerContext = Context<{ Variables: HonoInternalVariables }>
|
|
110
97
|
|
|
111
98
|
async function parseQueryMiddleware(c: HandlerContext): Promise<void> {
|
|
112
99
|
const raw = c.req.query() as Record<string, unknown>
|
|
@@ -138,7 +125,20 @@ async function parseWriteBodyMiddleware(c: HandlerContext): Promise<void> {
|
|
|
138
125
|
if (!body || typeof body !== 'object' || Array.isArray(body)) {
|
|
139
126
|
throw new HTTPException(400, { message: 'Request body must be a JSON object' })
|
|
140
127
|
}
|
|
141
|
-
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)
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
@@ -150,37 +150,34 @@ function makeShapeMiddleware<TCtx, TPrisma, TEnv extends HonoEnvBase>(
|
|
|
150
150
|
if (merged) {
|
|
151
151
|
c.set('routeConfig', { pagination: merged })
|
|
152
152
|
}
|
|
153
|
-
;(c as unknown as HandlerContext).set('findManyPaginatedMode', FIND_MANY_PAGINATED_MODE)
|
|
154
153
|
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
155
154
|
const headerValue = c.req.header(headerName)
|
|
156
155
|
const caller = config.guard?.resolveVariant?.(c) ?? headerValue ?? undefined
|
|
157
156
|
if (caller) c.set('guardCaller', caller)
|
|
158
|
-
if (opConfig.shape) {
|
|
157
|
+
if (opConfig.shape && !DROP_GUARD) {
|
|
159
158
|
c.set('guardShape', opConfig.shape)
|
|
160
159
|
}
|
|
161
160
|
}
|
|
162
161
|
}
|
|
163
162
|
|
|
164
|
-
async function
|
|
165
|
-
hooks:
|
|
163
|
+
async function runBeforeHooks<TEnv extends HonoEnvBase>(
|
|
164
|
+
hooks: HonoBeforeHook<TEnv>[],
|
|
166
165
|
c: Context<GeneratedHonoEnv<TEnv>>,
|
|
167
166
|
): Promise<Response | undefined> {
|
|
168
167
|
for (const hook of hooks) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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)
|
|
174
180
|
if (result instanceof Response) return result
|
|
175
|
-
if (!advanced) {
|
|
176
|
-
if (_env.NODE_ENV !== 'production') {
|
|
177
|
-
console.warn(
|
|
178
|
-
'[hono-router] Hook returned without calling next() or returning a Response. ' +
|
|
179
|
-
'Use \`return c.json(...)\` to short-circuit, or \`await next()\` to continue.',
|
|
180
|
-
)
|
|
181
|
-
}
|
|
182
|
-
return c.body(null) ?? undefined
|
|
183
|
-
}
|
|
184
181
|
}
|
|
185
182
|
return undefined
|
|
186
183
|
}
|
|
@@ -195,69 +192,81 @@ function sendResult(c: HandlerContext): Response {
|
|
|
195
192
|
}
|
|
196
193
|
|
|
197
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
|
+
}
|
|
198
198
|
const httpError = mapError(error)
|
|
199
199
|
return c.json({ message: httpError.message }, httpError.status as ContentfulStatusCode)
|
|
200
200
|
}
|
|
201
201
|
|
|
202
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
|
+
|
|
203
209
|
const app = new Hono<GeneratedHonoEnv<TEnv>>()
|
|
204
210
|
|
|
211
|
+
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
212
|
+
|
|
205
213
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
206
214
|
const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
|
|
207
215
|
const basePath = customPrefix + modelPrefix
|
|
208
216
|
|
|
209
217
|
const openApiDisabled = config.disableOpenApi === true
|
|
210
218
|
|| (config.disableOpenApi !== false && (
|
|
211
|
-
_env.
|
|
212
|
-
|| _env.
|
|
219
|
+
_env.NODE_ENV === 'production'
|
|
220
|
+
|| _env.DISABLE_OPENAPI === 'true'
|
|
213
221
|
))
|
|
214
222
|
|
|
215
223
|
const postReadsEnabled = !config.disablePostReads
|
|
216
224
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
225
|
+
let _openApiJsonCache: unknown = undefined
|
|
226
|
+
const getOpenApiJson = (): unknown => {
|
|
227
|
+
if (_openApiJsonCache === undefined) {
|
|
228
|
+
_openApiJsonCache = buildModelOpenApi(
|
|
220
229
|
'${modelName}',
|
|
221
230
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
222
231
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
223
232
|
config as RouteConfig,
|
|
224
233
|
{ format: 'json', writeStrategy: WRITE_STRATEGY },
|
|
225
234
|
)
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
235
|
+
}
|
|
236
|
+
return _openApiJsonCache
|
|
237
|
+
}
|
|
238
|
+
let _openApiYamlCache: string | undefined = undefined
|
|
239
|
+
const getOpenApiYaml = (): string => {
|
|
240
|
+
if (_openApiYamlCache === undefined) {
|
|
241
|
+
_openApiYamlCache = buildModelOpenApi(
|
|
229
242
|
'${modelName}',
|
|
230
243
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
231
244
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
232
245
|
config as RouteConfig,
|
|
233
246
|
{ format: 'yaml', writeStrategy: WRITE_STRATEGY },
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
if (isQueryBuilderEnabled(config as RouteConfig)) {
|
|
237
|
-
const qbConfig = getQueryBuilderConfig(config as RouteConfig)
|
|
238
|
-
if (qbConfig) {
|
|
239
|
-
try {
|
|
240
|
-
startQueryBuilder(qbConfig)
|
|
241
|
-
} catch (err) {
|
|
242
|
-
if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err)
|
|
243
|
-
}
|
|
247
|
+
) as string
|
|
244
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
|
+
)
|
|
245
257
|
}
|
|
246
258
|
|
|
247
259
|
app.onError((err, c) => {
|
|
248
|
-
if (err instanceof HTTPException) {
|
|
249
|
-
return c.json({ message: err.message }, err.status as ContentfulStatusCode)
|
|
250
|
-
}
|
|
251
260
|
return sendError(c as HandlerContext, err)
|
|
252
261
|
})
|
|
253
262
|
|
|
254
263
|
if (!openApiDisabled) {
|
|
255
264
|
const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
|
|
256
265
|
const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
|
|
257
|
-
app.get(openapiJsonPath, (c) => c.json(
|
|
266
|
+
app.get(openapiJsonPath, (c) => c.json(getOpenApiJson() as Record<string, unknown>))
|
|
258
267
|
app.get(openapiYamlPath, (c) => {
|
|
259
268
|
c.header('Content-Type', 'application/yaml')
|
|
260
|
-
return c.body(
|
|
269
|
+
return c.body(getOpenApiYaml())
|
|
261
270
|
})
|
|
262
271
|
}
|
|
263
272
|
|
|
@@ -270,10 +279,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
270
279
|
await parseFn(c as unknown as HandlerContext)
|
|
271
280
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
272
281
|
const { before = [], after = [] } = opConfig
|
|
273
|
-
const beforeResp = await
|
|
282
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
274
283
|
if (beforeResp) return beforeResp
|
|
275
284
|
await handlerFn(c as unknown as HandlerContext)
|
|
276
|
-
const afterResp = await
|
|
285
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
277
286
|
if (afterResp) return afterResp
|
|
278
287
|
return sendResult(c as unknown as HandlerContext)
|
|
279
288
|
} catch (error: unknown) {
|
|
@@ -289,10 +298,10 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
289
298
|
await parseWriteBodyMiddleware(c as unknown as HandlerContext)
|
|
290
299
|
makeShapeMiddleware<TCtx, TPrisma, TEnv>(config, opConfig)(c)
|
|
291
300
|
const { before = [], after = [] } = opConfig
|
|
292
|
-
const beforeResp = await
|
|
301
|
+
const beforeResp = await runBeforeHooks<TEnv>(before, c)
|
|
293
302
|
if (beforeResp) return beforeResp
|
|
294
303
|
await handlerFn(c as unknown as HandlerContext)
|
|
295
|
-
const afterResp = await
|
|
304
|
+
const afterResp = await runAfterHooks<TEnv>(after, c)
|
|
296
305
|
if (afterResp) return afterResp
|
|
297
306
|
return sendResult(c as unknown as HandlerContext)
|
|
298
307
|
} catch (error: unknown) {
|
|
@@ -305,55 +314,55 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
305
314
|
?? (defaultOpConfig as OperationConfigLike<TEnv>)
|
|
306
315
|
}
|
|
307
316
|
|
|
308
|
-
if (config.
|
|
317
|
+
if (isEnabled(config.findFirst)) {
|
|
309
318
|
const opConfig = opFor('findFirst')
|
|
310
319
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
311
320
|
app.get(path, handleRead(opConfig, ${modelName}FindFirst, parseQueryMiddleware))
|
|
312
321
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirst, parseBodyAsQueryMiddleware))
|
|
313
322
|
}
|
|
314
|
-
if (config.
|
|
323
|
+
if (isEnabled(config.findFirstOrThrow)) {
|
|
315
324
|
const opConfig = opFor('findFirstOrThrow')
|
|
316
325
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
317
326
|
app.get(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseQueryMiddleware))
|
|
318
327
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindFirstOrThrow, parseBodyAsQueryMiddleware))
|
|
319
328
|
}
|
|
320
|
-
if (config.
|
|
329
|
+
if (isEnabled(config.findManyPaginated)) {
|
|
321
330
|
const opConfig = opFor('findManyPaginated')
|
|
322
331
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
323
332
|
app.get(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseQueryMiddleware))
|
|
324
333
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindManyPaginated, parseBodyAsQueryMiddleware))
|
|
325
334
|
}
|
|
326
|
-
if (config.
|
|
335
|
+
if (isEnabled(config.aggregate)) {
|
|
327
336
|
const opConfig = opFor('aggregate')
|
|
328
337
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
329
338
|
app.get(path, handleRead(opConfig, ${modelName}Aggregate, parseQueryMiddleware))
|
|
330
339
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Aggregate, parseBodyAsQueryMiddleware))
|
|
331
340
|
}
|
|
332
|
-
if (config.
|
|
341
|
+
if (isEnabled(config.count)) {
|
|
333
342
|
const opConfig = opFor('count')
|
|
334
343
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
335
344
|
app.get(path, handleRead(opConfig, ${modelName}Count, parseQueryMiddleware))
|
|
336
345
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}Count, parseBodyAsQueryMiddleware))
|
|
337
346
|
}
|
|
338
|
-
if (config.
|
|
347
|
+
if (isEnabled(config.groupBy)) {
|
|
339
348
|
const opConfig = opFor('groupBy')
|
|
340
349
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
341
350
|
app.get(path, handleRead(opConfig, ${modelName}GroupBy, parseQueryMiddleware))
|
|
342
351
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}GroupBy, parseBodyAsQueryMiddleware))
|
|
343
352
|
}
|
|
344
|
-
if (config.
|
|
353
|
+
if (isEnabled(config.findUniqueOrThrow)) {
|
|
345
354
|
const opConfig = opFor('findUniqueOrThrow')
|
|
346
355
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
347
356
|
app.get(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseQueryMiddleware))
|
|
348
357
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUniqueOrThrow, parseBodyAsQueryMiddleware))
|
|
349
358
|
}
|
|
350
|
-
if (config.
|
|
359
|
+
if (isEnabled(config.findUnique)) {
|
|
351
360
|
const opConfig = opFor('findUnique')
|
|
352
361
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
353
362
|
app.get(path, handleRead(opConfig, ${modelName}FindUnique, parseQueryMiddleware))
|
|
354
363
|
if (postReadsEnabled) app.post(path, handleRead(opConfig, ${modelName}FindUnique, parseBodyAsQueryMiddleware))
|
|
355
364
|
}
|
|
356
|
-
if (config.
|
|
365
|
+
if (isEnabled(config.findMany)) {
|
|
357
366
|
const opConfig = opFor('findMany')
|
|
358
367
|
const path = basePath || '/'
|
|
359
368
|
app.get(path, handleRead(opConfig, ${modelName}FindMany, parseQueryMiddleware))
|
|
@@ -363,52 +372,78 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any, TEnv extend
|
|
|
363
372
|
}
|
|
364
373
|
}
|
|
365
374
|
|
|
366
|
-
if (config.
|
|
375
|
+
if (isEnabled(config.createManyAndReturn)) {
|
|
367
376
|
const opConfig = opFor('createManyAndReturn')
|
|
368
377
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
369
378
|
app.post(path, handleWrite(opConfig, ${modelName}CreateManyAndReturn))
|
|
370
379
|
}
|
|
371
|
-
if (config.
|
|
380
|
+
if (isEnabled(config.createMany)) {
|
|
372
381
|
const opConfig = opFor('createMany')
|
|
373
382
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
374
383
|
app.post(path, handleWrite(opConfig, ${modelName}CreateMany))
|
|
375
384
|
}
|
|
376
|
-
if (config.
|
|
385
|
+
if (isEnabled(config.create)) {
|
|
377
386
|
const opConfig = opFor('create')
|
|
378
387
|
const path = basePath || '/'
|
|
379
388
|
app.post(path, handleWrite(opConfig, ${modelName}Create))
|
|
380
389
|
}
|
|
381
|
-
if (config.
|
|
390
|
+
if (isEnabled(config.updateManyAndReturn)) {
|
|
382
391
|
const opConfig = opFor('updateManyAndReturn')
|
|
383
392
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
384
393
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateManyAndReturn))
|
|
385
394
|
}
|
|
386
|
-
if (config.
|
|
395
|
+
if (isEnabled(config.updateMany)) {
|
|
387
396
|
const opConfig = opFor('updateMany')
|
|
388
397
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
389
398
|
app.put(path, handleWrite(opConfig, ${modelName}UpdateMany))
|
|
390
399
|
}
|
|
391
|
-
if (config.
|
|
400
|
+
if (isEnabled(config.update)) {
|
|
392
401
|
const opConfig = opFor('update')
|
|
393
402
|
const path = basePath || '/'
|
|
394
403
|
app.put(path, handleWrite(opConfig, ${modelName}Update))
|
|
395
404
|
}
|
|
396
|
-
if (config.
|
|
405
|
+
if (isEnabled(config.upsert)) {
|
|
397
406
|
const opConfig = opFor('upsert')
|
|
398
407
|
const path = basePath || '/'
|
|
399
408
|
app.patch(path, handleWrite(opConfig, ${modelName}Upsert))
|
|
400
409
|
}
|
|
401
|
-
if (config.
|
|
410
|
+
if (isEnabled(config.deleteMany)) {
|
|
402
411
|
const opConfig = opFor('deleteMany')
|
|
403
412
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
404
413
|
app.delete(path, handleWrite(opConfig, ${modelName}DeleteMany))
|
|
405
414
|
}
|
|
406
|
-
if (config.
|
|
415
|
+
if (isEnabled(config.delete)) {
|
|
407
416
|
const opConfig = opFor('delete')
|
|
408
417
|
const path = basePath || '/'
|
|
409
418
|
app.delete(path, handleWrite(opConfig, ${modelName}Delete))
|
|
410
419
|
}
|
|
411
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
|
+
|
|
412
447
|
return app
|
|
413
448
|
}
|
|
414
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')
|
|
@@ -54,6 +54,17 @@ function getFindManyPaginatedMode(options) {
|
|
|
54
54
|
return 'promiseAll';
|
|
55
55
|
throw new Error(`Invalid findManyPaginatedMode "${raw}". Expected "transaction" or "promiseAll".`);
|
|
56
56
|
}
|
|
57
|
+
function getDropGuard(options) {
|
|
58
|
+
const raw = options.generator.config.dropGuard;
|
|
59
|
+
if (raw === undefined || raw === null || raw === '')
|
|
60
|
+
return false;
|
|
61
|
+
const lower = String(raw).toLowerCase();
|
|
62
|
+
if (lower === 'true' || lower === '1')
|
|
63
|
+
return true;
|
|
64
|
+
if (lower === 'false' || lower === '0')
|
|
65
|
+
return false;
|
|
66
|
+
throw new Error(`Invalid dropGuard "${raw}". Expected "true" or "false".`);
|
|
67
|
+
}
|
|
57
68
|
function validateClientGeneratorPresent(options) {
|
|
58
69
|
(0, generateImportPrismaStatement_1.getRelativeClientPath)(options, options.dmmf.datamodel.models[0]?.name ?? 'Model');
|
|
59
70
|
}
|
|
@@ -61,7 +72,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
61
72
|
onManifest() {
|
|
62
73
|
return {
|
|
63
74
|
version: require('../package.json').version,
|
|
64
|
-
defaultOutput: '../generated/
|
|
75
|
+
defaultOutput: '../generated/output',
|
|
65
76
|
prettyName: constants_1.GENERATOR_NAME,
|
|
66
77
|
};
|
|
67
78
|
},
|
|
@@ -69,7 +80,8 @@ function validateClientGeneratorPresent(options) {
|
|
|
69
80
|
const target = getTarget(options);
|
|
70
81
|
const writeStrategy = getWriteStrategy(options);
|
|
71
82
|
const findManyPaginatedMode = getFindManyPaginatedMode(options);
|
|
72
|
-
const
|
|
83
|
+
const dropGuard = getDropGuard(options);
|
|
84
|
+
const manifestDefaultAbs = path_1.default.resolve(__dirname, '..', 'generated', 'output');
|
|
73
85
|
const currentOutput = options.generator.output?.value;
|
|
74
86
|
const isUnsetOrManifestDefault = !currentOutput || path_1.default.resolve(currentOutput) === manifestDefaultAbs;
|
|
75
87
|
if (isUnsetOrManifestDefault) {
|
|
@@ -84,6 +96,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
84
96
|
console.log(` Import style: ${importStyle}`);
|
|
85
97
|
console.log(` Write strategy: ${writeStrategy}`);
|
|
86
98
|
console.log(` findManyPaginated mode: ${findManyPaginatedMode}`);
|
|
99
|
+
console.log(` Drop guard (generator): ${dropGuard}${dropGuard ? '' : ' (runtime E2E=true will also drop guard)'}`);
|
|
87
100
|
if (options.dmmf.datamodel.models.length > 0) {
|
|
88
101
|
validateClientGeneratorPresent(options);
|
|
89
102
|
}
|
|
@@ -101,7 +114,9 @@ function validateClientGeneratorPresent(options) {
|
|
|
101
114
|
continue;
|
|
102
115
|
}
|
|
103
116
|
modelNames.push(model.name);
|
|
104
|
-
const guardShapesImport =
|
|
117
|
+
const guardShapesImport = dropGuard
|
|
118
|
+
? null
|
|
119
|
+
: (0, generateImportPrismaStatement_1.getGuardShapesImport)(options, model.name);
|
|
105
120
|
await (0, writeFileSafely_1.writeFileSafely)({
|
|
106
121
|
content: (0, generateOperationCore_1.generateModelCore)({
|
|
107
122
|
model: model,
|
|
@@ -127,6 +142,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
127
142
|
importStyle,
|
|
128
143
|
writeStrategy,
|
|
129
144
|
findManyPaginatedMode,
|
|
145
|
+
dropGuard,
|
|
130
146
|
})
|
|
131
147
|
: target === 'hono'
|
|
132
148
|
? (0, generateRouterHono_1.generateHonoRouterFunction)({
|
|
@@ -136,6 +152,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
136
152
|
importStyle,
|
|
137
153
|
writeStrategy,
|
|
138
154
|
findManyPaginatedMode,
|
|
155
|
+
dropGuard,
|
|
139
156
|
})
|
|
140
157
|
: (0, generateRouter_1.generateRouterFunction)({
|
|
141
158
|
model: model,
|
|
@@ -144,6 +161,7 @@ function validateClientGeneratorPresent(options) {
|
|
|
144
161
|
importStyle,
|
|
145
162
|
writeStrategy,
|
|
146
163
|
findManyPaginatedMode,
|
|
164
|
+
dropGuard,
|
|
147
165
|
});
|
|
148
166
|
await (0, writeFileSafely_1.writeFileSafely)({
|
|
149
167
|
content: routerContent,
|
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
|
|