prisma-generator-express 1.66.0 → 1.67.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 +37 -3476
- package/dist/client/encodeQueryParams.js +3 -1
- package/dist/client/encodeQueryParams.js.map +1 -1
- package/dist/copy/misc.d.ts +1 -0
- package/dist/copy/misc.js +14 -0
- package/dist/copy/misc.js.map +1 -1
- package/dist/copy/operationDefinitions.js +69 -6
- package/dist/copy/operationDefinitions.js.map +1 -1
- package/dist/generators/generateFastifyHandler.d.ts +2 -2
- package/dist/generators/generateFastifyHandler.js +15 -5
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -2
- package/dist/generators/generateHonoHandler.js +12 -5
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
- package/dist/generators/generateImportPrismaStatement.js +6 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -1
- package/dist/generators/generateModelMetadata.js +20 -10
- package/dist/generators/generateModelMetadata.js.map +1 -1
- package/dist/generators/generateOperationCore.d.ts +3 -3
- package/dist/generators/generateOperationCore.js +51 -16
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRelationMeta.js +2 -2
- package/dist/generators/generateRelationMeta.js.map +1 -1
- package/dist/generators/generateRouteConfigType.d.ts +2 -2
- package/dist/generators/generateRouteConfigType.js +29 -11
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.d.ts +7 -4
- package/dist/generators/generateRouter.js +107 -14
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +7 -4
- package/dist/generators/generateRouterFastify.js +56 -28
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +7 -4
- package/dist/generators/generateRouterHono.js +36 -23
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateUnifiedDocs.d.ts +1 -1
- package/dist/generators/generateUnifiedDocs.js +15 -8
- package/dist/generators/generateUnifiedDocs.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.d.ts +2 -2
- package/dist/generators/generateUnifiedHandler.js +11 -3
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/guardOptions.js +12 -7
- package/dist/guardOptions.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.js +22 -6
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/importExt.d.ts +1 -1
- package/dist/utils/pathCasing.d.ts +4 -0
- package/dist/utils/pathCasing.js +40 -0
- package/dist/utils/pathCasing.js.map +1 -0
- package/dist/utils/resolveImportStyle.js +13 -5
- package/dist/utils/resolveImportStyle.js.map +1 -1
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +5 -3
- package/src/bin.ts +1 -1
- package/src/client/encodeQueryParams.ts +39 -35
- package/src/constants.ts +1 -1
- package/src/copy/autoIncludePlanner.ts +93 -27
- package/src/copy/autoIncludePlannerGuarded.ts +171 -48
- package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
- package/src/copy/buildModelOpenApi.ts +153 -50
- package/src/copy/concurrency.ts +10 -8
- package/src/copy/errorMapper.ts +68 -19
- package/src/copy/guardHelpers.ts +30 -9
- package/src/copy/materializedCount.ts +17 -5
- package/src/copy/misc.ts +88 -68
- package/src/copy/ndjson.ts +72 -0
- package/src/copy/operationDefinitions.ts +99 -21
- package/src/copy/operationRuntime.ts +100 -12
- package/src/copy/pagination.ts +25 -11
- package/src/copy/parseQueryParams.ts +47 -48
- package/src/copy/projectionDefaults.ts +6 -4
- package/src/copy/routeConfig.express.ts +16 -4
- package/src/copy/routeConfig.fastify.ts +16 -2
- package/src/copy/routeConfig.hono.ts +12 -9
- package/src/copy/routeConfig.ts +174 -39
- package/src/copy/scalarTypes.ts +7 -2
- package/src/copy/sse.ts +72 -19
- package/src/generators/generateFastifyHandler.ts +24 -13
- package/src/generators/generateHonoHandler.ts +21 -13
- package/src/generators/generateImportPrismaStatement.ts +93 -81
- package/src/generators/generateModelMetadata.ts +24 -12
- package/src/generators/generateOperationCore.ts +81 -33
- package/src/generators/generateRelationMeta.ts +23 -11
- package/src/generators/generateRouteConfigType.ts +39 -13
- package/src/generators/generateRouter.ts +114 -17
- package/src/generators/generateRouterFastify.ts +67 -31
- package/src/generators/generateRouterHono.ts +60 -30
- package/src/generators/generateUnifiedDocs.ts +29 -8
- package/src/generators/generateUnifiedHandler.ts +16 -8
- package/src/generators/generateUnifiedScalarUI.ts +1 -1
- package/src/guardOptions.ts +105 -92
- package/src/index.ts +46 -4
- package/src/utils/copyFiles.ts +199 -168
- package/src/utils/importExt.ts +2 -2
- package/src/utils/pathCasing.ts +42 -0
- package/src/utils/resolveImportStyle.ts +37 -15
- package/src/utils/strings.ts +2 -2
- package/src/utils/writeFileSafely.ts +6 -2
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateModelCore = generateModelCore;
|
|
4
|
+
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
4
5
|
const importExt_1 = require("../utils/importExt");
|
|
5
6
|
function decideWriteOp(name, defaultMethod, strategy) {
|
|
6
|
-
if (strategy === 'throwOnNonReturning' &&
|
|
7
|
+
if (strategy === 'throwOnNonReturning' &&
|
|
8
|
+
(name === 'createMany' || name === 'updateMany')) {
|
|
7
9
|
return { throw: true, method: defaultMethod };
|
|
8
10
|
}
|
|
9
11
|
if (strategy === 'forceReturn') {
|
|
@@ -56,12 +58,17 @@ function generateModelCore(options) {
|
|
|
56
58
|
const writeStrategy = options.writeStrategy;
|
|
57
59
|
const paginatedBody = renderPaginatedBody(modelNameLower, options.findManyPaginatedMode);
|
|
58
60
|
const standardReadOps = [
|
|
59
|
-
'findFirst',
|
|
60
|
-
'
|
|
61
|
+
'findFirst',
|
|
62
|
+
'findUnique',
|
|
63
|
+
'findUniqueOrThrow',
|
|
64
|
+
'findFirstOrThrow',
|
|
65
|
+
'count',
|
|
66
|
+
'aggregate',
|
|
67
|
+
'groupBy',
|
|
61
68
|
];
|
|
62
69
|
const standardReadHandlers = standardReadOps
|
|
63
70
|
.map((op) => `
|
|
64
|
-
|
|
71
|
+
async function default_${op}(ctx: OperationContext): Promise<unknown> {
|
|
65
72
|
const query = ctx.parsedQuery || {}
|
|
66
73
|
const extended = await getExtendedClient(ctx)
|
|
67
74
|
const delegate = getDelegate(extended, '${modelNameLower}')
|
|
@@ -75,19 +82,36 @@ export async function ${op}(ctx: OperationContext): Promise<unknown> {
|
|
|
75
82
|
const writeOps = [
|
|
76
83
|
{ name: 'create', method: 'create', requiredFields: ['data'] },
|
|
77
84
|
{ name: 'createMany', method: 'createMany', requiredFields: ['data'] },
|
|
78
|
-
{
|
|
85
|
+
{
|
|
86
|
+
name: 'createManyAndReturn',
|
|
87
|
+
method: 'createManyAndReturn',
|
|
88
|
+
requiredFields: ['data'],
|
|
89
|
+
},
|
|
79
90
|
{ name: 'update', method: 'update', requiredFields: ['where', 'data'] },
|
|
80
|
-
{
|
|
81
|
-
|
|
91
|
+
{
|
|
92
|
+
name: 'updateMany',
|
|
93
|
+
method: 'updateMany',
|
|
94
|
+
requiredFields: ['where', 'data'],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'updateManyAndReturn',
|
|
98
|
+
method: 'updateManyAndReturn',
|
|
99
|
+
requiredFields: ['where', 'data'],
|
|
100
|
+
},
|
|
82
101
|
{ name: 'deleteUnique', method: 'delete', requiredFields: ['where'] },
|
|
83
102
|
{ name: 'deleteMany', method: 'deleteMany', requiredFields: ['where'] },
|
|
84
|
-
{
|
|
103
|
+
{
|
|
104
|
+
name: 'upsert',
|
|
105
|
+
method: 'upsert',
|
|
106
|
+
requiredFields: ['where', 'create', 'update'],
|
|
107
|
+
},
|
|
85
108
|
];
|
|
86
|
-
const writeHandlers = writeOps
|
|
109
|
+
const writeHandlers = writeOps
|
|
110
|
+
.map((op) => {
|
|
87
111
|
const decision = decideWriteOp(op.name, op.method, writeStrategy);
|
|
88
112
|
if (decision.throw) {
|
|
89
113
|
return `
|
|
90
|
-
|
|
114
|
+
async function default_${op.name}(_ctx: OperationContext): Promise<unknown> {
|
|
91
115
|
throw new HttpError(501, '${op.name} is disabled by writeStrategy="${writeStrategy}"')
|
|
92
116
|
}`;
|
|
93
117
|
}
|
|
@@ -96,7 +120,7 @@ export async function ${op.name}(_ctx: OperationContext): Promise<unknown> {
|
|
|
96
120
|
.map((field) => ` requireBodyField(body, '${field}')`)
|
|
97
121
|
.join('\n');
|
|
98
122
|
return `
|
|
99
|
-
|
|
123
|
+
async function default_${op.name}(ctx: OperationContext): Promise<unknown> {
|
|
100
124
|
const body = validateBody(ctx.body)
|
|
101
125
|
${validationLines}
|
|
102
126
|
const extended = await getExtendedClient(ctx)
|
|
@@ -107,10 +131,20 @@ ${validationLines}
|
|
|
107
131
|
}
|
|
108
132
|
return delegate.${method}(body)
|
|
109
133
|
}`;
|
|
110
|
-
})
|
|
134
|
+
})
|
|
135
|
+
.join('\n');
|
|
136
|
+
const wrappers = operationDefinitions_1.OPERATION_METADATA.filter((op) => op.name !== 'updateEach')
|
|
137
|
+
.map((op) => `
|
|
138
|
+
export async function ${op.coreName}(ctx: OperationContext): Promise<${op.name === 'findManyPaginated' ? '{ data: unknown[]; total: number; hasMore: boolean }' : 'unknown'}> {
|
|
139
|
+
const input = ${op.kind === 'read' ? 'ctx.parsedQuery || {}' : 'validateBody(ctx.body)'}
|
|
140
|
+
${op.requiredBodyFields.map((field) => ` requireBodyField(input, '${field}')`).join('\n')}
|
|
141
|
+
return executeOperationOverride(ctx, '${modelNameLower}', '${op.name}', input, () => default_${op.coreName}(ctx))
|
|
142
|
+
}`)
|
|
143
|
+
.join('\n');
|
|
111
144
|
return `import {
|
|
112
|
-
OperationContext,
|
|
113
|
-
|
|
145
|
+
type OperationContext,
|
|
146
|
+
executeOperationOverride,
|
|
147
|
+
type PrismaClientLike,
|
|
114
148
|
getExtendedClient,
|
|
115
149
|
getDelegate,
|
|
116
150
|
validateBody,
|
|
@@ -121,7 +155,7 @@ import { applyPaginationLimits, countForPagination } from '../pagination${ext}'
|
|
|
121
155
|
import { assertGuard } from '../guardHelpers${ext}'
|
|
122
156
|
import { mapLimited } from '../concurrency${ext}'
|
|
123
157
|
|
|
124
|
-
|
|
158
|
+
async function default_findMany(ctx: OperationContext): Promise<unknown> {
|
|
125
159
|
const rawQuery = ctx.parsedQuery || {}
|
|
126
160
|
const query = applyPaginationLimits(rawQuery, ctx.paginationConfig, !!ctx.guardShape)
|
|
127
161
|
const extended = await getExtendedClient(ctx)
|
|
@@ -132,10 +166,11 @@ export async function findMany(ctx: OperationContext): Promise<unknown> {
|
|
|
132
166
|
}
|
|
133
167
|
return delegate.findMany(query)
|
|
134
168
|
}
|
|
169
|
+
${wrappers}
|
|
135
170
|
${standardReadHandlers}
|
|
136
171
|
${writeHandlers}
|
|
137
172
|
|
|
138
|
-
|
|
173
|
+
async function default_findManyPaginated(
|
|
139
174
|
ctx: OperationContext,
|
|
140
175
|
): Promise<{ data: unknown[]; total: number; hasMore: boolean }> {
|
|
141
176
|
const rawQuery = ctx.parsedQuery || {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,10 @@ function findOppositeField(models, targetModelName, relationName, selfModelName,
|
|
|
10
10
|
if (!target)
|
|
11
11
|
return null;
|
|
12
12
|
const isSelfRelation = targetModelName === selfModelName;
|
|
13
|
-
return target.fields.find((f) => f.kind === 'object' &&
|
|
13
|
+
return (target.fields.find((f) => f.kind === 'object' &&
|
|
14
14
|
f.relationName === relationName &&
|
|
15
15
|
f.type === selfModelName &&
|
|
16
|
-
!(isSelfRelation && f.name === selfFieldName)) || null;
|
|
16
|
+
!(isSelfRelation && f.name === selfFieldName)) || null);
|
|
17
17
|
}
|
|
18
18
|
function computeRelation(field, selfModelName, models) {
|
|
19
19
|
const selfFrom = (field.relationFromFields ?? []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generateRelationMeta.js","sourceRoot":"","sources":["../../src/generators/generateRelationMeta.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
1
|
+
import type { ImportStyle } from '../utils/resolveImportStyle';
|
|
2
2
|
import type { Target } from '../constants';
|
|
3
|
-
export declare function generateRouteConfigType(modelName: string, hookHandlerType: string, guardShapesImport: string | null, importStyle: ImportStyle, target: Target): string;
|
|
3
|
+
export declare function generateRouteConfigType(modelName: string, hookHandlerType: string, guardShapesImport: string | null, importStyle: ImportStyle, target: Target, clientImport?: string): string;
|
|
@@ -3,9 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateRouteConfigType = generateRouteConfigType;
|
|
4
4
|
const importExt_1 = require("../utils/importExt");
|
|
5
5
|
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
6
|
-
const ROUTER_OPERATIONS = operationDefinitions_1.OPERATION_METADATA
|
|
7
|
-
.filter((m) => m.name !== 'updateEach')
|
|
8
|
-
.map((m) => m.name);
|
|
6
|
+
const ROUTER_OPERATIONS = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.name !== 'updateEach').map((m) => m.name);
|
|
9
7
|
function capitalize(str) {
|
|
10
8
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
11
9
|
}
|
|
@@ -13,14 +11,14 @@ function requestTypeFor(target) {
|
|
|
13
11
|
if (target === 'fastify')
|
|
14
12
|
return `import('fastify').FastifyRequest`;
|
|
15
13
|
if (target === 'hono')
|
|
16
|
-
return `import('hono').Context<TEnv
|
|
14
|
+
return `import('hono').Context<GeneratedHonoEnv<TEnv>>`;
|
|
17
15
|
return `import('express').Request`;
|
|
18
16
|
}
|
|
19
17
|
function configGenericsFor(target) {
|
|
20
18
|
if (target === 'hono') {
|
|
21
|
-
return `<TCtx = unknown, TPrisma =
|
|
19
|
+
return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike, TEnv extends { Variables: Record<string, unknown> } = { Variables: Record<string, unknown> }>`;
|
|
22
20
|
}
|
|
23
|
-
return `<TCtx = unknown, TPrisma =
|
|
21
|
+
return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>`;
|
|
24
22
|
}
|
|
25
23
|
function routeConfigBaseFor(target) {
|
|
26
24
|
if (target === 'hono') {
|
|
@@ -41,7 +39,7 @@ function afterHookRef(target, hookHandlerType) {
|
|
|
41
39
|
return `HonoAfterHook<TEnv>`;
|
|
42
40
|
return hookHandlerType;
|
|
43
41
|
}
|
|
44
|
-
function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target) {
|
|
42
|
+
function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport, importStyle, target, clientImport) {
|
|
45
43
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
46
44
|
const m = modelName;
|
|
47
45
|
const supportsProgressive = target === 'express';
|
|
@@ -50,12 +48,29 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
50
48
|
const beforeRef = beforeHookRef(target, hookHandlerType);
|
|
51
49
|
const afterRef = afterHookRef(target, hookHandlerType);
|
|
52
50
|
const requestType = requestTypeFor(target);
|
|
53
|
-
const
|
|
51
|
+
const clientPath = clientImport ? `${clientImport}${ext}` : '@prisma/client';
|
|
52
|
+
const delegate = `${m.charAt(0).toLowerCase() + m.slice(1)}`;
|
|
53
|
+
const modelDelegate = clientImport
|
|
54
|
+
? `PrismaClient['${delegate}']`
|
|
55
|
+
: `(TPrisma extends Record<'${delegate}', infer D> ? D : never)`;
|
|
56
|
+
const overrideImports = `import type { Prisma${clientImport ? ', PrismaClient' : ''} } from '${clientPath}'\nimport type { OperationOverride } from '../operationRuntime${ext}'\n`;
|
|
57
|
+
const overrideType = (op) => {
|
|
58
|
+
const method = op === 'findManyPaginated' ? 'findMany' : op;
|
|
59
|
+
const args = `Prisma.Args<${modelDelegate}, '${method}'>`;
|
|
60
|
+
const result = `Prisma.Result<${modelDelegate}, ${args}, '${method}'>`;
|
|
61
|
+
const output = op === 'findManyPaginated'
|
|
62
|
+
? `{ data: ${result}; total: number; hasMore: boolean }`
|
|
63
|
+
: result;
|
|
64
|
+
const methods = op === 'findManyPaginated' ? "'findMany' | 'count'" : `'${method}'`;
|
|
65
|
+
return `OperationOverride<${args}, ${output}, TCtx, Readonly<{ ${delegate}: Pick<${modelDelegate}, Extract<keyof ${modelDelegate}, ${methods}>> }>>`;
|
|
66
|
+
};
|
|
67
|
+
const typeImports = supportsProgressive
|
|
54
68
|
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n`
|
|
55
69
|
: '';
|
|
56
70
|
if (!guardShapesImport) {
|
|
57
|
-
return (
|
|
58
|
-
|
|
71
|
+
return (overrideImports +
|
|
72
|
+
typeImports +
|
|
73
|
+
`export type ${m}RouteConfig${generics} = Omit<${baseConfig}, ${ROUTER_OPERATIONS.map((op) => `'${op}'`).join(' | ')}> & {\n${ROUTER_OPERATIONS.map((op) => ` ${op}?: (Omit<Exclude<${baseConfig}['${op}'], false | undefined>, 'override'> & { override?: ${overrideType(op)} }) | false`).join('\n')}\n}\n`);
|
|
59
74
|
}
|
|
60
75
|
const shapeOps = Array.from(new Set(ROUTER_OPERATIONS));
|
|
61
76
|
const opShapeImports = shapeOps
|
|
@@ -76,6 +91,8 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
76
91
|
const c = capitalize(routerOp);
|
|
77
92
|
const isRead = operationDefinitions_1.READ_OPERATION_NAMES.has(routerOp);
|
|
78
93
|
const commonLines = [
|
|
94
|
+
` override?: ${overrideType(routerOp)}`,
|
|
95
|
+
` authorize?: ${beforeRef}`,
|
|
79
96
|
` before?: ${beforeRef}[]`,
|
|
80
97
|
` after?: ${afterRef}[]`,
|
|
81
98
|
` pagination?: Partial<PaginationConfig>`,
|
|
@@ -97,7 +114,8 @@ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport,
|
|
|
97
114
|
` )) | false`);
|
|
98
115
|
}).join('\n');
|
|
99
116
|
const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
|
|
100
|
-
return (
|
|
117
|
+
return (overrideImports +
|
|
118
|
+
typeImports +
|
|
101
119
|
`import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
|
|
102
120
|
`${shapeOrFnAliases}\n\n` +
|
|
103
121
|
`export type ${m}RouteConfig${generics} = Omit<\n` +
|
|
@@ -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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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { DMMF } from '@prisma/generator-helper';
|
|
2
|
-
import { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
-
import { WriteStrategy, FindManyPaginatedMode } from '../constants';
|
|
4
|
-
|
|
1
|
+
import type { DMMF } from '@prisma/generator-helper';
|
|
2
|
+
import type { ImportStyle } from '../utils/resolveImportStyle';
|
|
3
|
+
import type { WriteStrategy, FindManyPaginatedMode } from '../constants';
|
|
4
|
+
import { type PathCase } from '../utils/pathCasing';
|
|
5
|
+
export declare function generateRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }: {
|
|
5
6
|
model: DMMF.Model;
|
|
6
7
|
enums: DMMF.DatamodelEnum[];
|
|
7
8
|
guardShapesImport: string | null;
|
|
9
|
+
clientImport?: string;
|
|
8
10
|
importStyle: ImportStyle;
|
|
9
11
|
writeStrategy: WriteStrategy;
|
|
10
12
|
findManyPaginatedMode: FindManyPaginatedMode;
|
|
11
13
|
dropGuard: boolean;
|
|
14
|
+
pathCase: PathCase;
|
|
12
15
|
}): string;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateRouterFunction = generateRouterFunction;
|
|
4
4
|
const generateRouteConfigType_1 = require("./generateRouteConfigType");
|
|
5
5
|
const importExt_1 = require("../utils/importExt");
|
|
6
|
+
const pathCasing_1 = require("../utils/pathCasing");
|
|
6
7
|
const operationDefinitions_1 = require("../copy/operationDefinitions");
|
|
7
8
|
function pathExpr(basePath, suffix) {
|
|
8
9
|
if (!suffix)
|
|
@@ -50,10 +51,11 @@ function emitReadOp(meta, modelName) {
|
|
|
50
51
|
const pathValue = pathExpr('basePath', meta.pathSuffix);
|
|
51
52
|
const opKind = opKindFor(meta.name);
|
|
52
53
|
const postReadBlock = meta.supportsPostRead
|
|
53
|
-
? ` if (
|
|
54
|
+
? ` if (resolvePostReadsEnabled(config.disablePostReads, opConfig.disablePostReads)) {
|
|
54
55
|
const postPath = ${meta.name === 'findMany' ? "basePath ? `${basePath}/read` : '/read'" : `path`}
|
|
55
56
|
router.post(
|
|
56
57
|
postPath,
|
|
58
|
+
...(opConfig.authorize ? [opConfig.authorize] : []),
|
|
57
59
|
parseBodyAsQuery,
|
|
58
60
|
setShape(opConfig, '${opKind}'),
|
|
59
61
|
...opConfig.operationBefore,
|
|
@@ -71,12 +73,14 @@ function emitReadOp(meta, modelName) {
|
|
|
71
73
|
const path = ${pathValue}
|
|
72
74
|
router.get(
|
|
73
75
|
path,
|
|
76
|
+
...(opConfig.authorize ? [opConfig.authorize] : []),
|
|
74
77
|
parseQuery,
|
|
75
78
|
setShape(opConfig, '${opKind}'),
|
|
76
79
|
...opConfig.operationBefore,
|
|
77
80
|
requireVariantKey(),
|
|
78
81
|
variantBeforeDispatcher(opConfig),
|
|
79
82
|
maybeProgressiveSSE(opConfig, core.${meta.coreName}, '${meta.name}'),
|
|
83
|
+
${meta.name === 'findMany' ? 'maybeNdjsonFindMany(core.findMany),' : ''}
|
|
80
84
|
${handlerName} as RequestHandler,
|
|
81
85
|
variantAfterDispatcher(opConfig),
|
|
82
86
|
...opConfig.operationAfter,
|
|
@@ -96,6 +100,7 @@ function emitWriteOp(meta, modelName) {
|
|
|
96
100
|
const path = ${pathValue}
|
|
97
101
|
router.${meta.method}(
|
|
98
102
|
path,
|
|
103
|
+
...(opConfig.authorize ? [opConfig.authorize] : []),
|
|
99
104
|
setShape(opConfig, '${opKind}'),
|
|
100
105
|
...opConfig.operationBefore,
|
|
101
106
|
requireVariantKey(),
|
|
@@ -107,10 +112,10 @@ function emitWriteOp(meta, modelName) {
|
|
|
107
112
|
)
|
|
108
113
|
}`;
|
|
109
114
|
}
|
|
110
|
-
function generateRouterFunction({ model, enums, guardShapesImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, }) {
|
|
115
|
+
function generateRouterFunction({ model, enums, guardShapesImport, clientImport, importStyle, writeStrategy, findManyPaginatedMode, dropGuard, pathCase, }) {
|
|
111
116
|
const ext = (0, importExt_1.importExt)(importStyle);
|
|
112
117
|
const modelName = model.name;
|
|
113
|
-
const
|
|
118
|
+
const modelSegment = (0, pathCasing_1.modelPathSegment)(modelName, pathCase);
|
|
114
119
|
const delegateKey = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
115
120
|
const routerFunctionName = `${modelName}Router`;
|
|
116
121
|
const handlerImports = operationDefinitions_1.OPERATION_METADATA.filter((m) => m.name !== 'updateEach')
|
|
@@ -134,9 +139,10 @@ import type {
|
|
|
134
139
|
QueryBuilderConfig,
|
|
135
140
|
FindManyPaginatedMode,
|
|
136
141
|
PaginationConfig,
|
|
142
|
+
PrismaClientLike,
|
|
137
143
|
} from '../routeConfig.target${ext}'
|
|
138
144
|
import { parseQueryParams } from '../parseQueryParams${ext}'
|
|
139
|
-
import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject } from '../misc${ext}'
|
|
145
|
+
import { sanitizeKeys, normalizePrefix, getEnv, isPlainObject, resolveDropGuardEnv } from '../misc${ext}'
|
|
140
146
|
import { buildModelOpenApi } from '../buildModelOpenApi${ext}'
|
|
141
147
|
import {
|
|
142
148
|
normalizeOperation,
|
|
@@ -144,7 +150,10 @@ import {
|
|
|
144
150
|
validateCountSourceWhere,
|
|
145
151
|
validateOperationConfig,
|
|
146
152
|
validateUpdateEachConfig,
|
|
153
|
+
resolvePostReadsEnabled,
|
|
154
|
+
warnIfUnguardedRoutes,
|
|
147
155
|
} from '../routeConfig${ext}'
|
|
156
|
+
import type { RuntimeOperationOverride } from '../operationRuntime${ext}'
|
|
148
157
|
import type { NormalizedOperationConfig } from '../routeConfig${ext}'
|
|
149
158
|
import type { OperationContext } from '../operationRuntime${ext}'
|
|
150
159
|
import { transformResult } from '../operationRuntime${ext}'
|
|
@@ -152,6 +161,7 @@ import { HttpError, mapError } from '../errorMapper${ext}'
|
|
|
152
161
|
import { formatGuardVariantResolutionError } from '../guardVariantError${ext}'
|
|
153
162
|
import type { GuardVariantResolution } from '../guardVariantRouting${ext}'
|
|
154
163
|
import { mergePaginationConfig } from '../pagination${ext}'
|
|
164
|
+
import { acceptsNdjson, runNdjsonFindMany } from '../ndjson${ext}'
|
|
155
165
|
import {
|
|
156
166
|
acceptsEventStream,
|
|
157
167
|
runProgressiveEndpoint,
|
|
@@ -165,13 +175,18 @@ import { applyDroppedGuard } from '../projectionDefaults${ext}'
|
|
|
165
175
|
import type { OpKind } from '../projectionDefaults${ext}'
|
|
166
176
|
import { MODEL_FIELDS, MODEL_ENUMS } from './${modelName}Metadata${ext}'
|
|
167
177
|
|
|
168
|
-
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express')}
|
|
178
|
+
${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport, importStyle, 'express', clientImport)}
|
|
169
179
|
const _env = getEnv()
|
|
170
180
|
|
|
171
181
|
const FIND_MANY_PAGINATED_MODE: FindManyPaginatedMode = '${findManyPaginatedMode}'
|
|
172
|
-
|
|
182
|
+
// Fixed at generation time. The environment bypass is resolved per router,
|
|
183
|
+
// because it requires the configuration's explicit \`allowE2EGuardBypass: true\`:
|
|
184
|
+
// false or omitted means the environment cannot drop guards for this target.
|
|
185
|
+
const DROP_GUARD = ${dropGuard}
|
|
173
186
|
|
|
174
187
|
type OperationConfigLike = {
|
|
188
|
+
authorize?: RequestHandler
|
|
189
|
+
override?: RuntimeOperationOverride
|
|
175
190
|
before?: RequestHandler[]
|
|
176
191
|
after?: RequestHandler[]
|
|
177
192
|
shape?: unknown
|
|
@@ -194,7 +209,7 @@ type NormalizedOp = NormalizedOperationConfig<RequestHandler, RequestHandler> &
|
|
|
194
209
|
}
|
|
195
210
|
|
|
196
211
|
type ExtendedRequest = Request & {
|
|
197
|
-
prisma?:
|
|
212
|
+
prisma?: PrismaClientLike
|
|
198
213
|
postgres?: unknown
|
|
199
214
|
sqlite?: unknown
|
|
200
215
|
}
|
|
@@ -204,6 +219,8 @@ type LocalsBag = {
|
|
|
204
219
|
routeConfig?: { pagination?: PaginationConfig }
|
|
205
220
|
guardShape?: Record<string, unknown>
|
|
206
221
|
guardCaller?: string
|
|
222
|
+
operationOverride?: RuntimeOperationOverride
|
|
223
|
+
resolveOperationContext?: () => unknown | Promise<unknown>
|
|
207
224
|
guardVariantKey?: string
|
|
208
225
|
guardVariantFailure?: Extract<GuardVariantResolution, { ok: false }>
|
|
209
226
|
data?: unknown
|
|
@@ -321,7 +338,7 @@ function requireVariantKey(): RequestHandler {
|
|
|
321
338
|
}
|
|
322
339
|
}
|
|
323
340
|
|
|
324
|
-
export function ${routerFunctionName}<TCtx = unknown, TPrisma =
|
|
341
|
+
export function ${routerFunctionName}<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>(config: ${modelName}RouteConfig<TCtx, TPrisma> = {}) {
|
|
325
342
|
validateCountSourceWhere(config.pagination?.countSource, '${modelName} pagination')
|
|
326
343
|
validateCountSourceWhere(
|
|
327
344
|
(config.findManyPaginated && typeof config.findManyPaginated === 'object' ? config.findManyPaginated : undefined)?.pagination?.countSource,
|
|
@@ -331,6 +348,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
331
348
|
const router = express.Router()
|
|
332
349
|
|
|
333
350
|
const isEnabled = (value: unknown): boolean => value !== false && !!(config.enableAll || value)
|
|
351
|
+
warnIfUnguardedRoutes('${modelName}', ['findMany', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findManyPaginated', 'count', 'aggregate', 'groupBy', 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany'], config, isEnabled)
|
|
334
352
|
|
|
335
353
|
const opFor = (key: string): NormalizedOp => {
|
|
336
354
|
const raw = (config as unknown as Record<string, unknown>)[key] as OperationConfigLike | undefined
|
|
@@ -339,13 +357,12 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
339
357
|
}
|
|
340
358
|
|
|
341
359
|
const customPrefix = normalizePrefix(config.customUrlPrefix || '')
|
|
342
|
-
const modelPrefix = config.addModelPrefix !== false ? '/${
|
|
360
|
+
const modelPrefix = config.addModelPrefix !== false ? '/${modelSegment}' : ''
|
|
343
361
|
const basePath = customPrefix + modelPrefix
|
|
344
362
|
|
|
345
363
|
const openApiDisabled = config.disableOpenApi === true
|
|
346
364
|
|| (config.disableOpenApi !== false && (_env.DISABLE_OPENAPI === 'true' || _env.NODE_ENV === 'production'))
|
|
347
365
|
|
|
348
|
-
const postReadsEnabled = !config.disablePostReads
|
|
349
366
|
|
|
350
367
|
let _openApiJsonCache: unknown = undefined
|
|
351
368
|
const getOpenApiJson = (): unknown => {
|
|
@@ -355,7 +372,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
355
372
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
356
373
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
357
374
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
358
|
-
{ format: 'json', writeStrategy: '${writeStrategy}' },
|
|
375
|
+
{ format: 'json', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
359
376
|
)
|
|
360
377
|
}
|
|
361
378
|
return _openApiJsonCache
|
|
@@ -368,7 +385,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
368
385
|
MODEL_FIELDS as unknown as Parameters<typeof buildModelOpenApi>[1],
|
|
369
386
|
MODEL_ENUMS as unknown as Parameters<typeof buildModelOpenApi>[2],
|
|
370
387
|
config as unknown as Parameters<typeof buildModelOpenApi>[3],
|
|
371
|
-
{ format: 'yaml', writeStrategy: '${writeStrategy}' },
|
|
388
|
+
{ format: 'yaml', writeStrategy: '${writeStrategy}', pathSegment: '${modelSegment}' },
|
|
372
389
|
) as string
|
|
373
390
|
}
|
|
374
391
|
return _openApiYamlCache
|
|
@@ -390,6 +407,8 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
390
407
|
const extReq = req as ExtendedRequest
|
|
391
408
|
const locals = readLocals(res)
|
|
392
409
|
return {
|
|
410
|
+
operationOverride: locals.operationOverride,
|
|
411
|
+
resolveOperationContext: locals.resolveOperationContext,
|
|
393
412
|
prisma: extReq.prisma,
|
|
394
413
|
postgres: extReq.postgres,
|
|
395
414
|
sqlite: extReq.sqlite,
|
|
@@ -397,6 +416,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
397
416
|
body: req.body,
|
|
398
417
|
guardShape: locals.guardShape,
|
|
399
418
|
guardCaller: locals.guardCaller,
|
|
419
|
+
guardVariantKey: locals.guardVariantKey,
|
|
400
420
|
paginationConfig: locals.routeConfig?.pagination,
|
|
401
421
|
findManyPaginatedMode: FIND_MANY_PAGINATED_MODE,
|
|
402
422
|
}
|
|
@@ -424,10 +444,25 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
424
444
|
next()
|
|
425
445
|
}
|
|
426
446
|
|
|
447
|
+
/**
|
|
448
|
+
* The environment bypass, and it is OPT-IN for this target.
|
|
449
|
+
*
|
|
450
|
+
* \`PGE_DROP_GUARD=true\` (deprecated alias \`E2E=true\`) downgrading enforcement
|
|
451
|
+
* in a deployed environment is a real hazard: on most platforms it is an
|
|
452
|
+
* ordinary config var, set on staging, copied forward, flagged as
|
|
453
|
+
* security-relevant nowhere. It is honoured only when this configuration
|
|
454
|
+
* states \`allowE2EGuardBypass: true\` — false or omitted means the environment
|
|
455
|
+
* cannot drop guards. The generation-time \`DROP_GUARD\` literal is unchanged.
|
|
456
|
+
*/
|
|
457
|
+
const dropGuard = DROP_GUARD || (config.allowE2EGuardBypass === true && resolveDropGuardEnv(_env))
|
|
458
|
+
|
|
427
459
|
const setShape = (opConfig: NormalizedOp, opKind: OpKind): RequestHandler => {
|
|
428
460
|
return async (req, res, next) => {
|
|
429
461
|
try {
|
|
430
462
|
const locals = readLocals(res)
|
|
463
|
+
locals.operationOverride = opConfig.override
|
|
464
|
+
let context: Promise<unknown> | undefined
|
|
465
|
+
locals.resolveOperationContext = () => context ??= Promise.resolve(config.resolveContext?.(req))
|
|
431
466
|
const merged = mergePaginationConfig(config.pagination, opConfig.pagination)
|
|
432
467
|
if (merged) {
|
|
433
468
|
locals.routeConfig = { pagination: merged }
|
|
@@ -452,7 +487,7 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
452
487
|
if (resolvedKey !== undefined) locals.guardVariantKey = resolvedKey
|
|
453
488
|
|
|
454
489
|
if (opConfig.guardShape) {
|
|
455
|
-
if (!
|
|
490
|
+
if (!dropGuard) {
|
|
456
491
|
locals.guardShape = opConfig.guardShape
|
|
457
492
|
} else {
|
|
458
493
|
await applyDroppedGuard(
|
|
@@ -487,6 +522,41 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
487
522
|
}
|
|
488
523
|
}
|
|
489
524
|
|
|
525
|
+
const maybeNdjsonFindMany = (
|
|
526
|
+
coreFn: (ctx: OperationContext) => Promise<unknown>,
|
|
527
|
+
): RequestHandler => {
|
|
528
|
+
return async (req, res, next) => {
|
|
529
|
+
if (res.headersSent || res.writableEnded) return next()
|
|
530
|
+
if (req.method !== 'GET') return next()
|
|
531
|
+
if (!acceptsNdjson(req.headers.accept)) return next()
|
|
532
|
+
|
|
533
|
+
const locals = readLocals(res)
|
|
534
|
+
const rawArgs = (locals.parsedQuery ?? {}) as Record<string, unknown>
|
|
535
|
+
const args = { ...rawArgs }
|
|
536
|
+
const paginationCfg = mergePaginationConfig(config.pagination, undefined)
|
|
537
|
+
const requestedTake = typeof rawArgs.take === 'number' ? rawArgs.take : undefined
|
|
538
|
+
const initialSkip = typeof rawArgs.skip === 'number' ? rawArgs.skip : 0
|
|
539
|
+
|
|
540
|
+
try {
|
|
541
|
+
await runNdjsonFindMany({
|
|
542
|
+
res,
|
|
543
|
+
isClosed: () => req.destroyed,
|
|
544
|
+
fetchPage: (skip, pageTake) =>
|
|
545
|
+
coreFn({
|
|
546
|
+
...buildContext(req, res),
|
|
547
|
+
parsedQuery: { ...args, skip, take: pageTake },
|
|
548
|
+
}),
|
|
549
|
+
initialSkip,
|
|
550
|
+
requestedTake,
|
|
551
|
+
defaultLimit: paginationCfg?.defaultLimit,
|
|
552
|
+
maxLimit: paginationCfg?.maxLimit ?? 1000,
|
|
553
|
+
})
|
|
554
|
+
} catch (err) {
|
|
555
|
+
next(err)
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
490
560
|
const maybeProgressiveSSE = (
|
|
491
561
|
opConfig: NormalizedOp,
|
|
492
562
|
coreFn: (ctx: OperationContext) => Promise<unknown>,
|
|
@@ -513,6 +583,23 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
513
583
|
}
|
|
514
584
|
|
|
515
585
|
if (progressiveConfig.mode === 'autoInclude') {
|
|
586
|
+
if (progressiveConfig.experimental !== true) {
|
|
587
|
+
if (_env.NODE_ENV !== 'production') {
|
|
588
|
+
console.warn(
|
|
589
|
+
'[prisma-generator-express] auto-include progressive is experimental; set \`experimental: true\` on the progressive config to enable it. Falling back.'
|
|
590
|
+
)
|
|
591
|
+
}
|
|
592
|
+
if (progressiveConfig.fallback === 'error') {
|
|
593
|
+
emitTerminalSSEError(res, 'auto-include requires experimental: true')
|
|
594
|
+
return
|
|
595
|
+
}
|
|
596
|
+
await runSingleResultSSE({
|
|
597
|
+
req,
|
|
598
|
+
res,
|
|
599
|
+
coreQueryFn: () => coreFn(buildContext(req, res)),
|
|
600
|
+
})
|
|
601
|
+
return
|
|
602
|
+
}
|
|
516
603
|
const isAutoIncludeReadable =
|
|
517
604
|
baseOp === 'findUnique' || baseOp === 'findUniqueOrThrow' ||
|
|
518
605
|
baseOp === 'findFirst' || baseOp === 'findFirstOrThrow' ||
|
|
@@ -580,11 +667,16 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
580
667
|
}
|
|
581
668
|
|
|
582
669
|
const ctx = await config.resolveContext(req)
|
|
670
|
+
const prismaClient = (req as ExtendedRequest).prisma
|
|
671
|
+
if (!prismaClient) {
|
|
672
|
+
emitTerminalSSEError(res, 'Progressive endpoint requires req.prisma to be set')
|
|
673
|
+
return
|
|
674
|
+
}
|
|
583
675
|
await runProgressiveEndpoint({
|
|
584
676
|
req,
|
|
585
677
|
res,
|
|
586
678
|
ctx,
|
|
587
|
-
prisma:
|
|
679
|
+
prisma: prismaClient,
|
|
588
680
|
variant: variant as string,
|
|
589
681
|
stages: progressiveConfig.stages,
|
|
590
682
|
stageRegistry,
|
|
@@ -640,6 +732,7 @@ ${writeOpBlocks}
|
|
|
640
732
|
const path = basePath ? \`\${basePath}/each\` : '/each'
|
|
641
733
|
router.post(
|
|
642
734
|
path,
|
|
735
|
+
...(opConfig.authorize ? [opConfig.authorize] : []),
|
|
643
736
|
setShape(opConfig, 'noop'),
|
|
644
737
|
...opConfig.operationBefore,
|
|
645
738
|
async (req: Request, res: Response, next: NextFunction) => {
|