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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;AAyEA,
|
|
1
|
+
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;AAyEA,8CAkMC;AAzQD,kDAA8C;AAe9C,SAAS,aAAa,CACpB,IAAY,EACZ,aAAqB,EACrB,QAAuB;IAEvB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IAClD,CAAC;IACD,IAAI,QAAQ,KAAK,qBAAqB,EAAE,CAAC;QACvC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IAClD,CAAC;IACD,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;IACrF,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB,EAAE,IAA2B;IAC9E,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;;;;;;;0CAO+B,cAAc;;;;;;;;;;;;yBAY/B,CAAA;IACvB,CAAC;IAED,OAAO;4CACmC,cAAc;;;;;;;;;gBAS1C,CAAA;AAChB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAyB;IACzD,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;IACpC,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAC,cAAc,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAExF,MAAM,eAAe,GAAG;QACtB,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB;QAClE,OAAO,EAAE,WAAW,EAAE,SAAS;KAChC,CAAA;IAED,MAAM,oBAAoB,GAAG,eAAe;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;wBACO,EAAE;;;4CAGkB,cAAc;;;6DAGG,EAAE;;oBAE3C,EAAE;EACpB,CAAC;SACE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACtE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACxF,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QAC/E,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACjG,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACrE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;KACpF,CAAA;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAEjE,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO;wBACW,EAAE,CAAC,IAAI;8BACD,EAAE,CAAC,IAAI,kCAAkC,aAAa;EAClF,CAAA;QACE,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;QAC9B,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc;aACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,KAAK,IAAI,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,OAAO;wBACa,EAAE,CAAC,IAAI;;EAE7B,eAAe;;4CAE2B,cAAc;;;6DAGG,MAAM;;oBAE/C,MAAM;EACxB,CAAA;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;;;;;;;;6BAYoB,GAAG;;;;;;4CAMY,cAAc;;;;;;;EAOxD,oBAAoB;EACpB,aAAa;;;;;;;;;;;;;;;EAeb,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAwD6B,cAAc;;;;;;;;;4CASd,cAAc;;;;;;;;;;;;;;;;;;;;CAoBzD,CAAA;AACD,CAAC"}
|
|
@@ -76,9 +76,14 @@ function routeConfigBaseFor(target) {
|
|
|
76
76
|
}
|
|
77
77
|
return `RouteConfig<Record<string, unknown>, TCtx>`;
|
|
78
78
|
}
|
|
79
|
-
function
|
|
79
|
+
function beforeHookRef(target, hookHandlerType) {
|
|
80
80
|
if (target === 'hono')
|
|
81
|
-
return
|
|
81
|
+
return `HonoBeforeHook<TEnv>`;
|
|
82
|
+
return hookHandlerType;
|
|
83
|
+
}
|
|
84
|
+
function afterHookRef(target, hookHandlerType) {
|
|
85
|
+
if (target === 'hono')
|
|
86
|
+
return `HonoAfterHook<TEnv>`;
|
|
82
87
|
return hookHandlerType;
|
|
83
88
|
}
|
|
84
89
|
function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target) {
|
|
@@ -87,7 +92,8 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
87
92
|
const supportsProgressive = target === 'express';
|
|
88
93
|
const generics = configGenericsFor(target);
|
|
89
94
|
const baseConfig = routeConfigBaseFor(target);
|
|
90
|
-
const
|
|
95
|
+
const beforeRef = beforeHookRef(target, hookHandlerType);
|
|
96
|
+
const afterRef = afterHookRef(target, hookHandlerType);
|
|
91
97
|
const requestType = requestTypeFor(target);
|
|
92
98
|
const progressiveTypeImport = supportsProgressive
|
|
93
99
|
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n`
|
|
@@ -105,17 +111,16 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
105
111
|
const c = (0, strings_1.capitalize)(shapeOp);
|
|
106
112
|
const isRead = READ_OPERATIONS.has(routerOp);
|
|
107
113
|
const lines = [
|
|
108
|
-
` before?: ${
|
|
109
|
-
` after?: ${
|
|
114
|
+
` before?: ${beforeRef}[]`,
|
|
115
|
+
` after?: ${afterRef}[]`,
|
|
110
116
|
` shape?: ${m}${c}ShapeInput<TCtx>`,
|
|
111
117
|
` pagination?: Partial<PaginationConfig>`,
|
|
112
|
-
` dropGuard?: boolean`,
|
|
113
118
|
];
|
|
114
119
|
if (isRead && supportsProgressive) {
|
|
115
120
|
lines.push(` progressive?: Record<string, ProgressiveVariantConfig>`);
|
|
116
121
|
lines.push(` progressiveStages?: Record<string, ProgressiveStage<TCtx, TPrisma>>`);
|
|
117
122
|
}
|
|
118
|
-
return ` ${routerOp}?: {\n${lines.join('\n')}\n }`;
|
|
123
|
+
return ` ${routerOp}?: {\n${lines.join('\n')}\n } | false`;
|
|
119
124
|
}).join('\n');
|
|
120
125
|
const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
|
|
121
126
|
return (progressiveTypeImport +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,7 @@ import type {
|
|
|
61
61
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
62
62
|
import { sanitizeKeys, normalizePrefix, getEnv } from '../misc${ext}'
|
|
63
63
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
64
|
+
import { validateCountSourceWhere } from '../routeConfig${ext}'
|
|
64
65
|
import type { OperationContext } from '../operationRuntime${ext}'
|
|
65
66
|
import {
|
|
66
67
|
transformResult,
|
|
@@ -132,8 +133,16 @@ function readLocals(res: Response): LocalsBag {
|
|
|
132
133
|
}
|
|
133
134
|
|
|
134
135
|
export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${modelName}RouteConfig<TCtx, TPrisma> = {}) {
|
|
136
|
+
validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
|
|
137
|
+
validateCountSourceWhere(
|
|
138
|
+
(config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
|
|
139
|
+
'${modelName} findManyPaginated pagination',
|
|
140
|
+
)
|
|
141
|
+
|
|
135
142
|
const router = express.Router()
|
|
136
143
|
|
|
144
|
+
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
145
|
+
|
|
137
146
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
138
147
|
const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
|
|
139
148
|
const basePath = customPrefix + modelPrefix
|
|
@@ -143,24 +152,32 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
143
152
|
|
|
144
153
|
const postReadsEnabled = !config.disablePostReads
|
|
145
154
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
155
|
+
let _openApiJsonCache: unknown = undefined
|
|
156
|
+
const getOpenApiJson = (): unknown => {
|
|
157
|
+
if (_openApiJsonCache === undefined) {
|
|
158
|
+
_openApiJsonCache = buildModelOpenApi(
|
|
149
159
|
'${modelName}',
|
|
150
160
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
151
161
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
152
162
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
153
163
|
{ format: 'json', writeStrategy: WRITE_STRATEGY },
|
|
154
164
|
)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
165
|
+
}
|
|
166
|
+
return _openApiJsonCache
|
|
167
|
+
}
|
|
168
|
+
let _openApiYamlCache: string | undefined = undefined
|
|
169
|
+
const getOpenApiYaml = (): string => {
|
|
170
|
+
if (_openApiYamlCache === undefined) {
|
|
171
|
+
_openApiYamlCache = buildModelOpenApi(
|
|
158
172
|
'${modelName}',
|
|
159
173
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
160
174
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
161
175
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
162
176
|
{ format: 'yaml', writeStrategy: WRITE_STRATEGY },
|
|
163
|
-
)
|
|
177
|
+
) as string
|
|
178
|
+
}
|
|
179
|
+
return _openApiYamlCache
|
|
180
|
+
}
|
|
164
181
|
|
|
165
182
|
const qbEnabled = isQueryBuilderEnabled(config)
|
|
166
183
|
if (qbEnabled) {
|
|
@@ -201,7 +218,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
201
218
|
|
|
202
219
|
const parseBodyAsQuery: RequestHandler = (req, res, next) => {
|
|
203
220
|
if (!req.body || typeof req.body !== 'object' || Array.isArray(req.body)) {
|
|
204
|
-
return next(
|
|
221
|
+
return next(new HttpError(400, 'Request body must be a JSON object'))
|
|
205
222
|
}
|
|
206
223
|
readLocals(res).parsedQuery = sanitizeKeys(req.body as Record<string, unknown>)
|
|
207
224
|
next()
|
|
@@ -305,11 +322,13 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
305
322
|
(name: string) => typeof stageRegistry[name] !== 'function',
|
|
306
323
|
)
|
|
307
324
|
if (missingStage) {
|
|
308
|
-
|
|
325
|
+
emitTerminalSSEError(res, 'Missing progressive stage: ' + missingStage)
|
|
326
|
+
return
|
|
309
327
|
}
|
|
310
328
|
|
|
311
329
|
if (typeof config.resolveContext !== 'function') {
|
|
312
|
-
|
|
330
|
+
emitTerminalSSEError(res, 'Progressive endpoint requires config.resolveContext')
|
|
331
|
+
return
|
|
313
332
|
}
|
|
314
333
|
|
|
315
334
|
const ctx = await config.resolveContext(req)
|
|
@@ -324,8 +343,8 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
324
343
|
})
|
|
325
344
|
} catch (err) {
|
|
326
345
|
console.error('[progressive] dispatch error:', err)
|
|
327
|
-
if (!res.headersSent) {
|
|
328
|
-
|
|
346
|
+
if (!res.headersSent && !res.writableEnded) {
|
|
347
|
+
emitTerminalSSEError(res, 'Internal server error')
|
|
329
348
|
}
|
|
330
349
|
}
|
|
331
350
|
}
|
|
@@ -347,70 +366,70 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
347
366
|
const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
|
|
348
367
|
const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
|
|
349
368
|
router.get(openapiJsonPath, (_req, res) => {
|
|
350
|
-
res.json(
|
|
369
|
+
res.json(getOpenApiJson())
|
|
351
370
|
})
|
|
352
371
|
router.get(openapiYamlPath, (_req, res) => {
|
|
353
|
-
res.type('application/yaml').send(
|
|
372
|
+
res.type('application/yaml').send(getOpenApiYaml())
|
|
354
373
|
})
|
|
355
374
|
}
|
|
356
375
|
|
|
357
|
-
if (config.
|
|
376
|
+
if (isEnabled(config.findFirst)) {
|
|
358
377
|
const opConfig: OperationConfigLike = (config.findFirst as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
359
378
|
const { before = [], after = [] } = opConfig
|
|
360
379
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
361
380
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst, 'findFirst'), ${modelName}FindFirst as RequestHandler, ...after, respond)
|
|
362
381
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindFirst as RequestHandler, ...after, respond)
|
|
363
382
|
}
|
|
364
|
-
if (config.
|
|
383
|
+
if (isEnabled(config.findFirstOrThrow)) {
|
|
365
384
|
const opConfig: OperationConfigLike = (config.findFirstOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
366
385
|
const { before = [], after = [] } = opConfig
|
|
367
386
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
368
387
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow, 'findFirstOrThrow'), ${modelName}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
369
388
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
370
389
|
}
|
|
371
|
-
if (config.
|
|
390
|
+
if (isEnabled(config.findManyPaginated)) {
|
|
372
391
|
const opConfig: OperationConfigLike = (config.findManyPaginated as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
373
392
|
const { before = [], after = [] } = opConfig
|
|
374
393
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
375
394
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated, 'findManyPaginated'), ${modelName}FindManyPaginated as RequestHandler, ...after, respond)
|
|
376
395
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindManyPaginated as RequestHandler, ...after, respond)
|
|
377
396
|
}
|
|
378
|
-
if (config.
|
|
397
|
+
if (isEnabled(config.aggregate)) {
|
|
379
398
|
const opConfig: OperationConfigLike = (config.aggregate as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
380
399
|
const { before = [], after = [] } = opConfig
|
|
381
400
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
382
401
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate, 'aggregate'), ${modelName}Aggregate as RequestHandler, ...after, respond)
|
|
383
402
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}Aggregate as RequestHandler, ...after, respond)
|
|
384
403
|
}
|
|
385
|
-
if (config.
|
|
404
|
+
if (isEnabled(config.count)) {
|
|
386
405
|
const opConfig: OperationConfigLike = (config.count as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
387
406
|
const { before = [], after = [] } = opConfig
|
|
388
407
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
389
408
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count, 'count'), ${modelName}Count as RequestHandler, ...after, respond)
|
|
390
409
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}Count as RequestHandler, ...after, respond)
|
|
391
410
|
}
|
|
392
|
-
if (config.
|
|
411
|
+
if (isEnabled(config.groupBy)) {
|
|
393
412
|
const opConfig: OperationConfigLike = (config.groupBy as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
394
413
|
const { before = [], after = [] } = opConfig
|
|
395
414
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
396
415
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy, 'groupBy'), ${modelName}GroupBy as RequestHandler, ...after, respond)
|
|
397
416
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}GroupBy as RequestHandler, ...after, respond)
|
|
398
417
|
}
|
|
399
|
-
if (config.
|
|
418
|
+
if (isEnabled(config.findUniqueOrThrow)) {
|
|
400
419
|
const opConfig: OperationConfigLike = (config.findUniqueOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
401
420
|
const { before = [], after = [] } = opConfig
|
|
402
421
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
403
422
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow, 'findUniqueOrThrow'), ${modelName}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
404
423
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
405
424
|
}
|
|
406
|
-
if (config.
|
|
425
|
+
if (isEnabled(config.findUnique)) {
|
|
407
426
|
const opConfig: OperationConfigLike = (config.findUnique as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
408
427
|
const { before = [], after = [] } = opConfig
|
|
409
428
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
410
429
|
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique, 'findUnique'), ${modelName}FindUnique as RequestHandler, ...after, respond)
|
|
411
430
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${modelName}FindUnique as RequestHandler, ...after, respond)
|
|
412
431
|
}
|
|
413
|
-
if (config.
|
|
432
|
+
if (isEnabled(config.findMany)) {
|
|
414
433
|
const opConfig: OperationConfigLike = (config.findMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
415
434
|
const { before = [], after = [] } = opConfig
|
|
416
435
|
const path = basePath || '/'
|
|
@@ -421,55 +440,55 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
421
440
|
}
|
|
422
441
|
}
|
|
423
442
|
|
|
424
|
-
if (config.
|
|
443
|
+
if (isEnabled(config.createManyAndReturn)) {
|
|
425
444
|
const opConfig: OperationConfigLike = (config.createManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
426
445
|
const { before = [], after = [] } = opConfig
|
|
427
446
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
428
447
|
router.post(path, setShape(opConfig), ...before, ${modelName}CreateManyAndReturn as RequestHandler, ...after, respondCreated)
|
|
429
448
|
}
|
|
430
|
-
if (config.
|
|
449
|
+
if (isEnabled(config.createMany)) {
|
|
431
450
|
const opConfig: OperationConfigLike = (config.createMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
432
451
|
const { before = [], after = [] } = opConfig
|
|
433
452
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
434
453
|
router.post(path, setShape(opConfig), ...before, ${modelName}CreateMany as RequestHandler, ...after, respondCreated)
|
|
435
454
|
}
|
|
436
|
-
if (config.
|
|
455
|
+
if (isEnabled(config.create)) {
|
|
437
456
|
const opConfig: OperationConfigLike = (config.create as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
438
457
|
const { before = [], after = [] } = opConfig
|
|
439
458
|
const path = basePath || '/'
|
|
440
459
|
router.post(path, setShape(opConfig), ...before, ${modelName}Create as RequestHandler, ...after, respondCreated)
|
|
441
460
|
}
|
|
442
|
-
if (config.
|
|
461
|
+
if (isEnabled(config.updateManyAndReturn)) {
|
|
443
462
|
const opConfig: OperationConfigLike = (config.updateManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
444
463
|
const { before = [], after = [] } = opConfig
|
|
445
464
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
446
465
|
router.put(path, setShape(opConfig), ...before, ${modelName}UpdateManyAndReturn as RequestHandler, ...after, respond)
|
|
447
466
|
}
|
|
448
|
-
if (config.
|
|
467
|
+
if (isEnabled(config.updateMany)) {
|
|
449
468
|
const opConfig: OperationConfigLike = (config.updateMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
450
469
|
const { before = [], after = [] } = opConfig
|
|
451
470
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
452
471
|
router.put(path, setShape(opConfig), ...before, ${modelName}UpdateMany as RequestHandler, ...after, respond)
|
|
453
472
|
}
|
|
454
|
-
if (config.
|
|
473
|
+
if (isEnabled(config.update)) {
|
|
455
474
|
const opConfig: OperationConfigLike = (config.update as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
456
475
|
const { before = [], after = [] } = opConfig
|
|
457
476
|
const path = basePath || '/'
|
|
458
477
|
router.put(path, setShape(opConfig), ...before, ${modelName}Update as RequestHandler, ...after, respond)
|
|
459
478
|
}
|
|
460
|
-
if (config.
|
|
479
|
+
if (isEnabled(config.upsert)) {
|
|
461
480
|
const opConfig: OperationConfigLike = (config.upsert as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
462
481
|
const { before = [], after = [] } = opConfig
|
|
463
482
|
const path = basePath || '/'
|
|
464
483
|
router.patch(path, setShape(opConfig), ...before, ${modelName}Upsert as RequestHandler, ...after, respond)
|
|
465
484
|
}
|
|
466
|
-
if (config.
|
|
485
|
+
if (isEnabled(config.deleteMany)) {
|
|
467
486
|
const opConfig: OperationConfigLike = (config.deleteMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
468
487
|
const { before = [], after = [] } = opConfig
|
|
469
488
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
470
489
|
router.delete(path, setShape(opConfig), ...before, ${modelName}DeleteMany as RequestHandler, ...after, respond)
|
|
471
490
|
}
|
|
472
|
-
if (config.
|
|
491
|
+
if (isEnabled(config.delete)) {
|
|
473
492
|
const opConfig: OperationConfigLike = (config.delete as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
474
493
|
const { before = [], after = [] } = opConfig
|
|
475
494
|
const path = basePath || '/'
|
|
@@ -477,6 +496,12 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
477
496
|
}
|
|
478
497
|
if (config.updateEach) {
|
|
479
498
|
const opConfig: OperationConfigLike = (config.updateEach as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
499
|
+
if ((!opConfig.before || opConfig.before.length === 0) && _env.NODE_ENV !== 'production') {
|
|
500
|
+
console.warn(
|
|
501
|
+
'[${modelName}Router] updateEach is enabled without a before hook. ' +
|
|
502
|
+
'This endpoint bypasses guard shapes and should be protected by authentication middleware.',
|
|
503
|
+
)
|
|
504
|
+
}
|
|
480
505
|
const { before = [], after = [] } = opConfig
|
|
481
506
|
const path = basePath ? \`\${basePath}/each\` : '/each'
|
|
482
507
|
router.post(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
|