prisma-generator-express 1.41.0 → 1.43.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/dist/generators/generateFastifyHandler.js +17 -4
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.js +4 -4
- package/dist/generators/generateOperationCore.d.ts +0 -1
- package/dist/generators/generateOperationCore.js +34 -546
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRelationMeta.d.ts +13 -0
- package/dist/generators/generateRelationMeta.js +106 -0
- package/dist/generators/generateRelationMeta.js.map +1 -0
- package/dist/generators/generateRouteConfigType.js +6 -6
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.js +141 -60
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.js +127 -384
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.js +48 -36
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.js +24 -8
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/index.js +21 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.js +12 -0
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/writeFileSafely.js +3 -0
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/autoIncludePlanner.ts +299 -0
- package/src/copy/autoIncludeRuntime.ts +307 -0
- package/src/copy/operationRuntime.ts +603 -0
- package/src/copy/routeConfig.express.ts +5 -3
- package/src/copy/routeConfig.fastify.ts +2 -2
- package/src/copy/routeConfig.hono.ts +3 -3
- package/src/copy/routeConfig.ts +20 -9
- package/src/generators/generateFastifyHandler.ts +17 -4
- package/src/generators/generateHonoHandler.ts +4 -4
- package/src/generators/generateOperationCore.ts +34 -546
- package/src/generators/generateRelationMeta.ts +154 -0
- package/src/generators/generateRouteConfigType.ts +7 -7
- package/src/generators/generateRouter.ts +141 -60
- package/src/generators/generateRouterFastify.ts +127 -384
- package/src/generators/generateRouterHono.ts +48 -36
- package/src/generators/generateUnifiedHandler.ts +24 -8
- package/src/index.ts +25 -7
- package/src/utils/copyFiles.ts +13 -0
- package/src/utils/writeFileSafely.ts +3 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRelationMeta = generateRelationMeta;
|
|
4
|
+
exports.generateRelationModelsIndex = generateRelationModelsIndex;
|
|
5
|
+
const importExt_1 = require("../utils/importExt");
|
|
6
|
+
function findOppositeField(models, targetModelName, relationName, selfModelName) {
|
|
7
|
+
if (!relationName)
|
|
8
|
+
return null;
|
|
9
|
+
const target = models.find((m) => m.name === targetModelName);
|
|
10
|
+
if (!target)
|
|
11
|
+
return null;
|
|
12
|
+
return target.fields.find((f) => f.kind === 'object' && f.relationName === relationName && f.type === selfModelName) || null;
|
|
13
|
+
}
|
|
14
|
+
function computeRelation(field, selfModelName, models) {
|
|
15
|
+
const selfFrom = (field.relationFromFields ?? []);
|
|
16
|
+
const selfTo = (field.relationToFields ?? []);
|
|
17
|
+
if (selfFrom.length > 0) {
|
|
18
|
+
return {
|
|
19
|
+
name: field.name,
|
|
20
|
+
type: field.type,
|
|
21
|
+
isList: field.isList,
|
|
22
|
+
isRequired: field.isRequired,
|
|
23
|
+
direction: 'parentOwnsFk',
|
|
24
|
+
parentLinkFields: selfFrom,
|
|
25
|
+
childLinkFields: selfTo,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const opposite = findOppositeField(models, field.type, field.relationName, selfModelName);
|
|
29
|
+
if (opposite) {
|
|
30
|
+
const oppFrom = (opposite.relationFromFields ?? []);
|
|
31
|
+
const oppTo = (opposite.relationToFields ?? []);
|
|
32
|
+
if (oppFrom.length > 0) {
|
|
33
|
+
return {
|
|
34
|
+
name: field.name,
|
|
35
|
+
type: field.type,
|
|
36
|
+
isList: field.isList,
|
|
37
|
+
isRequired: field.isRequired,
|
|
38
|
+
direction: 'childOwnsFk',
|
|
39
|
+
parentLinkFields: oppTo,
|
|
40
|
+
childLinkFields: oppFrom,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
name: field.name,
|
|
46
|
+
type: field.type,
|
|
47
|
+
isList: field.isList,
|
|
48
|
+
isRequired: field.isRequired,
|
|
49
|
+
direction: 'implicitM2M',
|
|
50
|
+
parentLinkFields: [],
|
|
51
|
+
childLinkFields: [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function buildModelMeta(model, models) {
|
|
55
|
+
const scalarFields = [];
|
|
56
|
+
const idFields = [];
|
|
57
|
+
const relations = {};
|
|
58
|
+
for (const field of model.fields) {
|
|
59
|
+
if (field.kind === 'object') {
|
|
60
|
+
relations[field.name] = computeRelation(field, model.name, models);
|
|
61
|
+
}
|
|
62
|
+
else if (field.kind === 'scalar' || field.kind === 'enum') {
|
|
63
|
+
scalarFields.push(field.name);
|
|
64
|
+
if (field.isId)
|
|
65
|
+
idFields.push(field.name);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (model.primaryKey && Array.isArray(model.primaryKey.fields)) {
|
|
69
|
+
for (const f of model.primaryKey.fields) {
|
|
70
|
+
if (!idFields.includes(f))
|
|
71
|
+
idFields.push(f);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
name: model.name,
|
|
76
|
+
delegateKey: model.name.charAt(0).toLowerCase() + model.name.slice(1),
|
|
77
|
+
scalarFields,
|
|
78
|
+
idFields,
|
|
79
|
+
relations,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function generateRelationMeta(options) {
|
|
83
|
+
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
84
|
+
const meta = buildModelMeta(options.model, options.allModels);
|
|
85
|
+
return `import type { ModelRelationMap } from '../autoIncludePlanner${ext}'
|
|
86
|
+
|
|
87
|
+
export const ${options.model.name}Relations: ModelRelationMap = ${JSON.stringify(meta, null, 2)}
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
function generateRelationModelsIndex(options) {
|
|
91
|
+
const ext = (0, importExt_1.importExt)(options.importStyle);
|
|
92
|
+
const imports = options.modelNames
|
|
93
|
+
.map((n) => `import { ${n}Relations } from './${n}/${n}Relations${ext}'`)
|
|
94
|
+
.join('\n');
|
|
95
|
+
const entries = options.modelNames
|
|
96
|
+
.map((n) => ` ${n}: ${n}Relations,`)
|
|
97
|
+
.join('\n');
|
|
98
|
+
return `import type { ModelRelationMap } from './autoIncludePlanner${ext}'
|
|
99
|
+
${imports}
|
|
100
|
+
|
|
101
|
+
export const relationModels: Record<string, ModelRelationMap> = {
|
|
102
|
+
${entries}
|
|
103
|
+
}
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=generateRelationMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,8 +40,11 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
40
40
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
41
41
|
const m = modelName;
|
|
42
42
|
const supportsProgressive = target === 'express';
|
|
43
|
+
const progressiveTypeImport = supportsProgressive
|
|
44
|
+
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n\n`
|
|
45
|
+
: '';
|
|
43
46
|
if (!guardShapesImport) {
|
|
44
|
-
return `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string,
|
|
47
|
+
return progressiveTypeImport + `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig<Record<string, unknown>, TCtx>\n`;
|
|
45
48
|
}
|
|
46
49
|
const shapeOps = Object.values(ROUTER_OP_TO_SHAPE_OP).filter((v, i, a) => a.indexOf(v) === i);
|
|
47
50
|
const opShapeImports = shapeOps.map((op) => `${m}${capitalize(op)}ShapeInput`).join(',\n ');
|
|
@@ -61,13 +64,10 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
61
64
|
return ` ${routerOp}?: {\n${lines.join('\n')}\n }`;
|
|
62
65
|
}).join('\n');
|
|
63
66
|
const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
|
|
64
|
-
const progressiveTypeImport = supportsProgressive
|
|
65
|
-
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n\n`
|
|
66
|
-
: '';
|
|
67
67
|
return (progressiveTypeImport +
|
|
68
|
-
`import type {\n ${opShapeImports}\n} from '${guardShapesImport}'\n\n` +
|
|
68
|
+
`import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
|
|
69
69
|
`export type ${m}RouteConfig<TCtx = unknown> = Omit<\n` +
|
|
70
|
-
` RouteConfig<Record<string,
|
|
70
|
+
` RouteConfig<Record<string, unknown>, TCtx>,\n` +
|
|
71
71
|
` | ${omitKeys}\n` +
|
|
72
72
|
` | 'resolveContext'\n` +
|
|
73
73
|
`> & {\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":";;AA4CA,0DAmDC;AA9FD,kDAA8C;AAG9C,MAAM,iBAAiB,GAAG;IACxB,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB;IAClE,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS;IAChE,QAAQ,EAAE,YAAY,EAAE,qBAAqB;IAC7C,QAAQ,EAAE,YAAY,EAAE,qBAAqB;IAC7C,QAAQ,EAAE,QAAQ,EAAE,YAAY;CACxB,CAAA;AAIV,MAAM,eAAe,GAAiC,IAAI,GAAG,CAAkB;IAC7E,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB;IAClE,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS;CACjE,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAoC;IAC7D,UAAU,EAAE,YAAY;IACxB,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,iBAAiB,EAAE,mBAAmB;IACtC,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;CACzB,CAAA;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,eAAuB,EACvB,iBAAgC,EAChC,WAAwB,EACxB,MAAc;IAEd,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,WAAW,CAAC,CAAA;IAClC,MAAM,CAAC,GAAG,SAAS,CAAA;IACnB,MAAM,mBAAmB,GAAG,MAAM,KAAK,SAAS,CAAA;IAEhD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ function generateRouterFunction({ model, enums, guardShapesImport, importStyle,
|
|
|
9
9
|
const modelName = model.name;
|
|
10
10
|
const prefix = (0, strings_1.toCamelCase)(modelName);
|
|
11
11
|
const modelNameLower = modelName.toLowerCase();
|
|
12
|
+
const delegateKey = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
12
13
|
const routerFunctionName = `${prefix}Router`;
|
|
13
14
|
const fieldsMeta = model.fields.map((f) => ({
|
|
14
15
|
name: f.name,
|
|
@@ -30,6 +31,7 @@ function generateRouterFunction({ model, enums, guardShapesImport, importStyle,
|
|
|
30
31
|
}));
|
|
31
32
|
return `import express from 'express'
|
|
32
33
|
import type { Request, Response, NextFunction, RequestHandler } from 'express'
|
|
34
|
+
import { startQueryBuilder } from '../queryBuilder${ext}'
|
|
33
35
|
import {
|
|
34
36
|
${prefix}FindUnique,
|
|
35
37
|
${prefix}FindUniqueOrThrow,
|
|
@@ -62,6 +64,8 @@ import {
|
|
|
62
64
|
runProgressiveEndpoint,
|
|
63
65
|
runSingleResultSSE,
|
|
64
66
|
} from '../operationRuntime${ext}'
|
|
67
|
+
import { relationModels } from '../relationModels${ext}'
|
|
68
|
+
import { runAutoIncludeProgressive } from '../autoIncludeRuntime${ext}'
|
|
65
69
|
|
|
66
70
|
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
|
|
67
71
|
const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
|
|
@@ -69,9 +73,31 @@ const _env = typeof process !== 'undefined' && process.env ? process.env : {} as
|
|
|
69
73
|
const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
|
|
70
74
|
const MODEL_ENUMS = ${JSON.stringify(enumsMeta, null, 2)} as const
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
before
|
|
74
|
-
after
|
|
76
|
+
type OperationConfigLike = {
|
|
77
|
+
before?: RequestHandler[]
|
|
78
|
+
after?: RequestHandler[]
|
|
79
|
+
shape?: Record<string, unknown>
|
|
80
|
+
progressive?: Record<string, ProgressiveVariantConfig>
|
|
81
|
+
progressiveStages?: Record<string, ProgressiveStage<unknown>>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type ExtendedRequest = Request & {
|
|
85
|
+
prisma?: unknown
|
|
86
|
+
postgres?: unknown
|
|
87
|
+
sqlite?: unknown
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
type LocalsBag = {
|
|
91
|
+
parsedQuery?: Record<string, unknown>
|
|
92
|
+
routeConfig?: { pagination?: OperationContext['paginationConfig'] }
|
|
93
|
+
guardShape?: Record<string, unknown>
|
|
94
|
+
guardCaller?: string
|
|
95
|
+
data?: unknown
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const defaultOpConfig: OperationConfigLike = {
|
|
99
|
+
before: [],
|
|
100
|
+
after: [],
|
|
75
101
|
}
|
|
76
102
|
|
|
77
103
|
function normalizePrefix(p: string): string {
|
|
@@ -96,6 +122,10 @@ function getQueryBuilderConfig(config: RouteConfig) {
|
|
|
96
122
|
return {}
|
|
97
123
|
}
|
|
98
124
|
|
|
125
|
+
function readLocals(res: Response): LocalsBag {
|
|
126
|
+
return res.locals as LocalsBag
|
|
127
|
+
}
|
|
128
|
+
|
|
99
129
|
export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteConfig<TCtx> = {}) {
|
|
100
130
|
const router = express.Router()
|
|
101
131
|
router.use(express.json())
|
|
@@ -113,25 +143,34 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
113
143
|
if (qbEnabled) {
|
|
114
144
|
const qbConfig = getQueryBuilderConfig(config)
|
|
115
145
|
if (qbConfig) {
|
|
116
|
-
try {
|
|
146
|
+
try {
|
|
147
|
+
startQueryBuilder(qbConfig)
|
|
148
|
+
} catch (err) {
|
|
149
|
+
if (_env.NODE_ENV !== 'production') console.warn('[query-builder]', err)
|
|
150
|
+
}
|
|
117
151
|
}
|
|
118
152
|
}
|
|
119
153
|
|
|
120
|
-
const buildContext = (req: Request, res: Response): OperationContext =>
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
154
|
+
const buildContext = (req: Request, res: Response): OperationContext => {
|
|
155
|
+
const extReq = req as ExtendedRequest
|
|
156
|
+
const locals = readLocals(res)
|
|
157
|
+
return {
|
|
158
|
+
prisma: extReq.prisma,
|
|
159
|
+
postgres: extReq.postgres,
|
|
160
|
+
sqlite: extReq.sqlite,
|
|
161
|
+
parsedQuery: locals.parsedQuery,
|
|
162
|
+
body: req.body,
|
|
163
|
+
guardShape: locals.guardShape,
|
|
164
|
+
guardCaller: locals.guardCaller,
|
|
165
|
+
paginationConfig: locals.routeConfig?.pagination,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
130
168
|
|
|
131
169
|
const parseQuery: RequestHandler = (req, res, next) => {
|
|
132
170
|
const rawQuery = req.query
|
|
133
171
|
if (rawQuery && Object.keys(rawQuery).length > 0) {
|
|
134
|
-
|
|
172
|
+
const parsed = parseQueryParams(rawQuery as Record<string, unknown>) as Record<string, unknown>
|
|
173
|
+
readLocals(res).parsedQuery = parsed
|
|
135
174
|
}
|
|
136
175
|
next()
|
|
137
176
|
}
|
|
@@ -140,29 +179,37 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
140
179
|
if (!req.body || typeof req.body !== 'object' || Array.isArray(req.body)) {
|
|
141
180
|
return next({ status: 400, message: 'Request body must be a JSON object' })
|
|
142
181
|
}
|
|
143
|
-
res.
|
|
182
|
+
readLocals(res).parsedQuery = sanitizeKeys(req.body as Record<string, unknown>)
|
|
144
183
|
next()
|
|
145
184
|
}
|
|
146
185
|
|
|
147
|
-
const setShape = (opConfig:
|
|
186
|
+
const setShape = (opConfig: OperationConfigLike): RequestHandler => {
|
|
148
187
|
return (req, res, next) => {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
188
|
+
const locals = readLocals(res)
|
|
189
|
+
if (config.pagination) {
|
|
190
|
+
locals.routeConfig = { pagination: config.pagination }
|
|
191
|
+
}
|
|
192
|
+
const headerName = config.guard?.variantHeader || 'x-api-variant'
|
|
193
|
+
const headerValue = req.get(headerName)
|
|
194
|
+
const caller = config.guard?.resolveVariant?.(req) ?? headerValue ?? undefined
|
|
195
|
+
if (caller) locals.guardCaller = caller
|
|
196
|
+
if (opConfig.shape) locals.guardShape = opConfig.shape
|
|
155
197
|
next()
|
|
156
198
|
}
|
|
157
199
|
}
|
|
158
200
|
|
|
159
|
-
const maybeProgressiveSSE = (
|
|
201
|
+
const maybeProgressiveSSE = (
|
|
202
|
+
opConfig: OperationConfigLike,
|
|
203
|
+
coreFn: (ctx: OperationContext) => Promise<unknown>,
|
|
204
|
+
baseOp: string,
|
|
205
|
+
): RequestHandler => {
|
|
160
206
|
return async (req, res, next) => {
|
|
161
207
|
if (res.headersSent || res.writableEnded) return next()
|
|
162
208
|
if (req.method !== 'GET') return next()
|
|
163
209
|
if (!acceptsEventStream(req.headers.accept)) return next()
|
|
164
210
|
|
|
165
|
-
const
|
|
211
|
+
const locals = readLocals(res)
|
|
212
|
+
const variant = locals.guardCaller
|
|
166
213
|
const progressiveConfig = variant ? opConfig.progressive?.[variant] : undefined
|
|
167
214
|
|
|
168
215
|
try {
|
|
@@ -175,6 +222,38 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
175
222
|
return
|
|
176
223
|
}
|
|
177
224
|
|
|
225
|
+
if (progressiveConfig.mode === 'autoInclude') {
|
|
226
|
+
const isSingleRecordRead =
|
|
227
|
+
baseOp === 'findUnique' || baseOp === 'findUniqueOrThrow' ||
|
|
228
|
+
baseOp === 'findFirst' || baseOp === 'findFirstOrThrow'
|
|
229
|
+
|
|
230
|
+
if (!isSingleRecordRead) {
|
|
231
|
+
if (progressiveConfig.fallback === 'error') {
|
|
232
|
+
return next({ status: 400, message: 'autoInclude mode supports only single-record reads' })
|
|
233
|
+
}
|
|
234
|
+
await runSingleResultSSE({
|
|
235
|
+
req,
|
|
236
|
+
res,
|
|
237
|
+
coreQueryFn: () => coreFn(buildContext(req, res)),
|
|
238
|
+
})
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
await runAutoIncludeProgressive({
|
|
243
|
+
req,
|
|
244
|
+
res,
|
|
245
|
+
ctx: buildContext(req, res),
|
|
246
|
+
args: locals.parsedQuery ?? {},
|
|
247
|
+
baseOp: baseOp as 'findUnique' | 'findUniqueOrThrow' | 'findFirst' | 'findFirstOrThrow',
|
|
248
|
+
modelName: '${modelName}',
|
|
249
|
+
delegateKey: '${delegateKey}',
|
|
250
|
+
models: relationModels,
|
|
251
|
+
variantConfig: progressiveConfig,
|
|
252
|
+
coreQueryFn: () => coreFn(buildContext(req, res)),
|
|
253
|
+
})
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
|
|
178
257
|
if (!Array.isArray(progressiveConfig.stages)) {
|
|
179
258
|
return next({ status: 500, message: 'Progressive endpoint requires stages array' })
|
|
180
259
|
}
|
|
@@ -196,12 +275,13 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
196
275
|
req,
|
|
197
276
|
res,
|
|
198
277
|
ctx,
|
|
199
|
-
prisma: (req as
|
|
278
|
+
prisma: (req as ExtendedRequest).prisma,
|
|
200
279
|
variant: variant as string,
|
|
201
280
|
stages: progressiveConfig.stages,
|
|
202
281
|
stageRegistry,
|
|
203
282
|
})
|
|
204
283
|
} catch (err) {
|
|
284
|
+
console.error('[progressive] dispatch error:', err)
|
|
205
285
|
if (!res.headersSent) {
|
|
206
286
|
return next({ status: 500, message: 'Internal server error' })
|
|
207
287
|
}
|
|
@@ -210,13 +290,13 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
210
290
|
}
|
|
211
291
|
|
|
212
292
|
const respond: RequestHandler = (_req, res) => {
|
|
213
|
-
const data = res.
|
|
293
|
+
const data = readLocals(res).data
|
|
214
294
|
if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
|
|
215
295
|
return res.json(transformResult(data))
|
|
216
296
|
}
|
|
217
297
|
|
|
218
298
|
const respondCreated: RequestHandler = (_req, res) => {
|
|
219
|
-
const data = res.
|
|
299
|
+
const data = readLocals(res).data
|
|
220
300
|
if (data === undefined) return res.status(500).json({ message: 'No data set by handler' })
|
|
221
301
|
return res.status(201).json(transformResult(data))
|
|
222
302
|
}
|
|
@@ -225,76 +305,76 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
225
305
|
const openapiJsonPath = basePath ? \`\${basePath}/openapi.json\` : '/openapi.json'
|
|
226
306
|
const openapiYamlPath = basePath ? \`\${basePath}/openapi.yaml\` : '/openapi.yaml'
|
|
227
307
|
router.get(openapiJsonPath, (_req, res) => {
|
|
228
|
-
const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as
|
|
308
|
+
const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1], MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2], config, { format: 'json' })
|
|
229
309
|
res.json(spec)
|
|
230
310
|
})
|
|
231
311
|
router.get(openapiYamlPath, (_req, res) => {
|
|
232
|
-
const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as
|
|
312
|
+
const spec = buildModelOpenApi('${modelName}', MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1], MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2], config, { format: 'yaml' })
|
|
233
313
|
res.type('application/yaml').send(spec as string)
|
|
234
314
|
})
|
|
235
315
|
}
|
|
236
316
|
|
|
237
317
|
if (config.enableAll || config.findFirst) {
|
|
238
|
-
const opConfig:
|
|
318
|
+
const opConfig: OperationConfigLike = (config.findFirst as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
239
319
|
const { before = [], after = [] } = opConfig
|
|
240
320
|
const path = basePath ? \`\${basePath}/first\` : '/first'
|
|
241
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst), ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
321
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirst, 'findFirst'), ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
242
322
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirst as RequestHandler, ...after, respond)
|
|
243
323
|
}
|
|
244
324
|
if (config.enableAll || config.findFirstOrThrow) {
|
|
245
|
-
const opConfig:
|
|
325
|
+
const opConfig: OperationConfigLike = (config.findFirstOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
246
326
|
const { before = [], after = [] } = opConfig
|
|
247
327
|
const path = basePath ? \`\${basePath}/first/strict\` : '/first/strict'
|
|
248
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
328
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findFirstOrThrow, 'findFirstOrThrow'), ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
249
329
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindFirstOrThrow as RequestHandler, ...after, respond)
|
|
250
330
|
}
|
|
251
331
|
if (config.enableAll || config.findManyPaginated) {
|
|
252
|
-
const opConfig:
|
|
332
|
+
const opConfig: OperationConfigLike = (config.findManyPaginated as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
253
333
|
const { before = [], after = [] } = opConfig
|
|
254
334
|
const path = basePath ? \`\${basePath}/paginated\` : '/paginated'
|
|
255
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
335
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findManyPaginated, 'findManyPaginated'), ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
256
336
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindManyPaginated as RequestHandler, ...after, respond)
|
|
257
337
|
}
|
|
258
338
|
if (config.enableAll || config.aggregate) {
|
|
259
|
-
const opConfig:
|
|
339
|
+
const opConfig: OperationConfigLike = (config.aggregate as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
260
340
|
const { before = [], after = [] } = opConfig
|
|
261
341
|
const path = basePath ? \`\${basePath}/aggregate\` : '/aggregate'
|
|
262
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate), ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
342
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.aggregate, 'aggregate'), ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
263
343
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Aggregate as RequestHandler, ...after, respond)
|
|
264
344
|
}
|
|
265
345
|
if (config.enableAll || config.count) {
|
|
266
|
-
const opConfig:
|
|
346
|
+
const opConfig: OperationConfigLike = (config.count as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
267
347
|
const { before = [], after = [] } = opConfig
|
|
268
348
|
const path = basePath ? \`\${basePath}/count\` : '/count'
|
|
269
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count), ${prefix}Count as RequestHandler, ...after, respond)
|
|
349
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.count, 'count'), ${prefix}Count as RequestHandler, ...after, respond)
|
|
270
350
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}Count as RequestHandler, ...after, respond)
|
|
271
351
|
}
|
|
272
352
|
if (config.enableAll || config.groupBy) {
|
|
273
|
-
const opConfig:
|
|
353
|
+
const opConfig: OperationConfigLike = (config.groupBy as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
274
354
|
const { before = [], after = [] } = opConfig
|
|
275
355
|
const path = basePath ? \`\${basePath}/groupby\` : '/groupby'
|
|
276
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy), ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
356
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.groupBy, 'groupBy'), ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
277
357
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}GroupBy as RequestHandler, ...after, respond)
|
|
278
358
|
}
|
|
279
359
|
if (config.enableAll || config.findUniqueOrThrow) {
|
|
280
|
-
const opConfig:
|
|
360
|
+
const opConfig: OperationConfigLike = (config.findUniqueOrThrow as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
281
361
|
const { before = [], after = [] } = opConfig
|
|
282
362
|
const path = basePath ? \`\${basePath}/unique/strict\` : '/unique/strict'
|
|
283
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
363
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUniqueOrThrow, 'findUniqueOrThrow'), ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
284
364
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUniqueOrThrow as RequestHandler, ...after, respond)
|
|
285
365
|
}
|
|
286
366
|
if (config.enableAll || config.findUnique) {
|
|
287
|
-
const opConfig:
|
|
367
|
+
const opConfig: OperationConfigLike = (config.findUnique as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
288
368
|
const { before = [], after = [] } = opConfig
|
|
289
369
|
const path = basePath ? \`\${basePath}/unique\` : '/unique'
|
|
290
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique), ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
370
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findUnique, 'findUnique'), ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
291
371
|
if (postReadsEnabled) router.post(path, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindUnique as RequestHandler, ...after, respond)
|
|
292
372
|
}
|
|
293
373
|
if (config.enableAll || config.findMany) {
|
|
294
|
-
const opConfig:
|
|
374
|
+
const opConfig: OperationConfigLike = (config.findMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
295
375
|
const { before = [], after = [] } = opConfig
|
|
296
376
|
const path = basePath || '/'
|
|
297
|
-
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany), ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
377
|
+
router.get(path, parseQuery, setShape(opConfig), ...before, maybeProgressiveSSE(opConfig, core.findMany, 'findMany'), ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
298
378
|
if (postReadsEnabled) {
|
|
299
379
|
const postPath = basePath ? \`\${basePath}/read\` : '/read'
|
|
300
380
|
router.post(postPath, parseBodyAsQuery, setShape(opConfig), ...before, ${prefix}FindMany as RequestHandler, ...after, respond)
|
|
@@ -302,63 +382,64 @@ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteC
|
|
|
302
382
|
}
|
|
303
383
|
|
|
304
384
|
if (config.enableAll || config.createManyAndReturn) {
|
|
305
|
-
const opConfig:
|
|
385
|
+
const opConfig: OperationConfigLike = (config.createManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
306
386
|
const { before = [], after = [] } = opConfig
|
|
307
387
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
308
388
|
router.post(path, setShape(opConfig), ...before, ${prefix}CreateManyAndReturn as RequestHandler, ...after, respondCreated)
|
|
309
389
|
}
|
|
310
390
|
if (config.enableAll || config.createMany) {
|
|
311
|
-
const opConfig:
|
|
391
|
+
const opConfig: OperationConfigLike = (config.createMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
312
392
|
const { before = [], after = [] } = opConfig
|
|
313
393
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
314
394
|
router.post(path, setShape(opConfig), ...before, ${prefix}CreateMany as RequestHandler, ...after, respondCreated)
|
|
315
395
|
}
|
|
316
396
|
if (config.enableAll || config.create) {
|
|
317
|
-
const opConfig:
|
|
397
|
+
const opConfig: OperationConfigLike = (config.create as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
318
398
|
const { before = [], after = [] } = opConfig
|
|
319
399
|
const path = basePath || '/'
|
|
320
400
|
router.post(path, setShape(opConfig), ...before, ${prefix}Create as RequestHandler, ...after, respondCreated)
|
|
321
401
|
}
|
|
322
402
|
if (config.enableAll || config.updateManyAndReturn) {
|
|
323
|
-
const opConfig:
|
|
403
|
+
const opConfig: OperationConfigLike = (config.updateManyAndReturn as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
324
404
|
const { before = [], after = [] } = opConfig
|
|
325
405
|
const path = basePath ? \`\${basePath}/many/return\` : '/many/return'
|
|
326
406
|
router.put(path, setShape(opConfig), ...before, ${prefix}UpdateManyAndReturn as RequestHandler, ...after, respond)
|
|
327
407
|
}
|
|
328
408
|
if (config.enableAll || config.updateMany) {
|
|
329
|
-
const opConfig:
|
|
409
|
+
const opConfig: OperationConfigLike = (config.updateMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
330
410
|
const { before = [], after = [] } = opConfig
|
|
331
411
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
332
412
|
router.put(path, setShape(opConfig), ...before, ${prefix}UpdateMany as RequestHandler, ...after, respond)
|
|
333
413
|
}
|
|
334
414
|
if (config.enableAll || config.update) {
|
|
335
|
-
const opConfig:
|
|
415
|
+
const opConfig: OperationConfigLike = (config.update as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
336
416
|
const { before = [], after = [] } = opConfig
|
|
337
417
|
const path = basePath || '/'
|
|
338
418
|
router.put(path, setShape(opConfig), ...before, ${prefix}Update as RequestHandler, ...after, respond)
|
|
339
419
|
}
|
|
340
420
|
if (config.enableAll || config.upsert) {
|
|
341
|
-
const opConfig:
|
|
421
|
+
const opConfig: OperationConfigLike = (config.upsert as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
342
422
|
const { before = [], after = [] } = opConfig
|
|
343
423
|
const path = basePath || '/'
|
|
344
424
|
router.patch(path, setShape(opConfig), ...before, ${prefix}Upsert as RequestHandler, ...after, respond)
|
|
345
425
|
}
|
|
346
426
|
if (config.enableAll || config.deleteMany) {
|
|
347
|
-
const opConfig:
|
|
427
|
+
const opConfig: OperationConfigLike = (config.deleteMany as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
348
428
|
const { before = [], after = [] } = opConfig
|
|
349
429
|
const path = basePath ? \`\${basePath}/many\` : '/many'
|
|
350
430
|
router.delete(path, setShape(opConfig), ...before, ${prefix}DeleteMany as RequestHandler, ...after, respond)
|
|
351
431
|
}
|
|
352
432
|
if (config.enableAll || config.delete) {
|
|
353
|
-
const opConfig:
|
|
433
|
+
const opConfig: OperationConfigLike = (config.delete as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
354
434
|
const { before = [], after = [] } = opConfig
|
|
355
435
|
const path = basePath || '/'
|
|
356
436
|
router.delete(path, setShape(opConfig), ...before, ${prefix}Delete as RequestHandler, ...after, respond)
|
|
357
437
|
}
|
|
358
438
|
|
|
359
|
-
router.use((err:
|
|
360
|
-
const
|
|
361
|
-
const
|
|
439
|
+
router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
440
|
+
const e = err as { status?: number; message?: string }
|
|
441
|
+
const status = typeof e.status === 'number' ? e.status : 500
|
|
442
|
+
const message = e.message || 'Internal server error'
|
|
362
443
|
if (!res.headersSent) return res.status(status).json({ message })
|
|
363
444
|
next(err)
|
|
364
445
|
})
|
|
@@ -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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"}
|