prisma-generator-express 1.66.0 → 1.68.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 +188 -3432
- 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.d.ts +4 -1
- package/dist/copy/operationDefinitions.js +133 -9
- package/dist/copy/operationDefinitions.js.map +1 -1
- package/dist/generators/generateFastifyHandler.d.ts +2 -2
- package/dist/generators/generateFastifyHandler.js +68 -12
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -2
- package/dist/generators/generateHonoHandler.js +53 -6
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateHonoOpenApi.d.ts +13 -0
- package/dist/generators/generateHonoOpenApi.js +70 -0
- package/dist/generators/generateHonoOpenApi.js.map +1 -0
- 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/generateMcpApp.d.ts +10 -0
- package/dist/generators/generateMcpApp.js +113 -0
- package/dist/generators/generateMcpApp.js.map +1 -0
- package/dist/generators/generateModelMcp.d.ts +9 -0
- package/dist/generators/generateModelMcp.js +145 -0
- package/dist/generators/generateModelMcp.js.map +1 -0
- package/dist/generators/generateModelMetadata.js +29 -15
- 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 +164 -65
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +7 -4
- package/dist/generators/generateRouterFastify.js +106 -86
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +7 -4
- package/dist/generators/generateRouterHono.js +59 -414
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateRouterPartsHono.d.ts +14 -0
- package/dist/generators/generateRouterPartsHono.js +180 -0
- package/dist/generators/generateRouterPartsHono.js.map +1 -0
- 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 +42 -18
- 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 +3 -1
- package/dist/index.js +123 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.d.ts +1 -1
- package/dist/utils/copyFiles.js +42 -7
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/importExt.d.ts +1 -1
- package/dist/utils/mcpGate.d.ts +10 -0
- package/dist/utils/mcpGate.js +118 -0
- package/dist/utils/mcpGate.js.map +1 -0
- 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 +6 -0
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +22 -5
- 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 +229 -176
- package/src/copy/concurrency.ts +10 -8
- package/src/copy/docsRenderer.ts +14 -15
- package/src/copy/errorMapper.ts +68 -19
- package/src/copy/guardHelpers.ts +30 -9
- package/src/copy/materializedCount.ts +17 -5
- package/src/copy/mcpRuntime.ts +1017 -0
- package/src/copy/misc.ts +88 -68
- package/src/copy/ndjson.ts +72 -0
- package/src/copy/operationDefinitions.ts +177 -25
- package/src/copy/operationPipeline.ts +267 -0
- package/src/copy/operationRuntime.ts +124 -26
- package/src/copy/operationSchemas.ts +2773 -0
- package/src/copy/pagination.ts +35 -13
- 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 +46 -14
- package/src/copy/routeConfig.ts +175 -40
- package/src/copy/routerParts.ts +524 -0
- package/src/copy/scalarTypes.ts +7 -2
- package/src/copy/sse.ts +72 -19
- package/src/generators/generateFastifyHandler.ts +77 -20
- package/src/generators/generateHonoHandler.ts +62 -14
- package/src/generators/generateHonoOpenApi.ts +93 -0
- package/src/generators/generateImportPrismaStatement.ts +93 -81
- package/src/generators/generateMcpApp.ts +133 -0
- package/src/generators/generateModelMcp.ts +208 -0
- package/src/generators/generateModelMetadata.ts +40 -22
- 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 +171 -68
- package/src/generators/generateRouterFastify.ts +117 -89
- package/src/generators/generateRouterHono.ts +84 -464
- package/src/generators/generateRouterPartsHono.ts +220 -0
- package/src/generators/generateUnifiedDocs.ts +29 -8
- package/src/generators/generateUnifiedHandler.ts +47 -24
- package/src/generators/generateUnifiedScalarUI.ts +1 -1
- package/src/guardOptions.ts +105 -92
- package/src/index.ts +161 -6
- package/src/utils/copyFiles.ts +235 -168
- package/src/utils/importExt.ts +2 -2
- package/src/utils/mcpGate.ts +157 -0
- 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 +12 -2
|
@@ -126,7 +126,9 @@ function resolveExtendsTarget(extendsValue, fromFile) {
|
|
|
126
126
|
}
|
|
127
127
|
catch {
|
|
128
128
|
try {
|
|
129
|
-
return require.resolve(extendsValue + '/tsconfig.json', {
|
|
129
|
+
return require.resolve(extendsValue + '/tsconfig.json', {
|
|
130
|
+
paths: [fromDir],
|
|
131
|
+
});
|
|
130
132
|
}
|
|
131
133
|
catch {
|
|
132
134
|
return null;
|
|
@@ -179,14 +181,17 @@ function resolveImportStyle(options) {
|
|
|
179
181
|
? config.importStyle.toLowerCase()
|
|
180
182
|
: 'auto';
|
|
181
183
|
if (!VALID_OVERRIDES.has(raw)) {
|
|
182
|
-
console.warn('[prisma-generator-express] Invalid importStyle "' +
|
|
184
|
+
console.warn('[prisma-generator-express] Invalid importStyle "' +
|
|
185
|
+
config.importStyle +
|
|
183
186
|
'". Expected one of: auto, none, js, ts. Falling back to auto.');
|
|
184
187
|
}
|
|
185
188
|
else if (raw !== 'auto') {
|
|
186
189
|
return raw;
|
|
187
190
|
}
|
|
188
191
|
const outputPath = options.generator.output?.value;
|
|
189
|
-
const schemaDir = options.schemaPath
|
|
192
|
+
const schemaDir = options.schemaPath
|
|
193
|
+
? path.dirname(options.schemaPath)
|
|
194
|
+
: process.cwd();
|
|
190
195
|
const startDir = outputPath ? path.dirname(outputPath) : schemaDir;
|
|
191
196
|
const tsconfigPath = findUpwards(startDir, 'tsconfig.json') ||
|
|
192
197
|
findUpwards(schemaDir, 'tsconfig.json');
|
|
@@ -197,10 +202,13 @@ function resolveImportStyle(options) {
|
|
|
197
202
|
return 'ts';
|
|
198
203
|
const moduleVal = String(compilerOptions.module ?? '').toLowerCase();
|
|
199
204
|
const moduleResolution = String(compilerOptions.moduleResolution ?? '').toLowerCase();
|
|
200
|
-
if (NODE_MODULE_KEYWORDS.has(moduleVal) ||
|
|
205
|
+
if (NODE_MODULE_KEYWORDS.has(moduleVal) ||
|
|
206
|
+
NODE_MODULE_KEYWORDS.has(moduleResolution)) {
|
|
201
207
|
return 'js';
|
|
202
208
|
}
|
|
203
|
-
if (moduleResolution === 'bundler' ||
|
|
209
|
+
if (moduleResolution === 'bundler' ||
|
|
210
|
+
moduleResolution === 'classic' ||
|
|
211
|
+
moduleResolution === 'node') {
|
|
204
212
|
return 'none';
|
|
205
213
|
}
|
|
206
214
|
const pkgType = readPackageType(startDir) || readPackageType(schemaDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveImportStyle.js","sourceRoot":"","sources":["../../src/utils/resolveImportStyle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"resolveImportStyle.js","sourceRoot":"","sources":["../../src/utils/resolveImportStyle.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,12 @@ async function writeFileSafely({ content, options, model, operation, }) {
|
|
|
62
62
|
case 'relationModelsIndex':
|
|
63
63
|
filePath = path.join(outputPath, 'relationModels.ts');
|
|
64
64
|
break;
|
|
65
|
+
case 'mcpApp':
|
|
66
|
+
filePath = path.join(outputPath, 'mcp.ts');
|
|
67
|
+
break;
|
|
68
|
+
case 'mcpMount':
|
|
69
|
+
filePath = path.join(outputPath, 'mcpMount.ts');
|
|
70
|
+
break;
|
|
65
71
|
default:
|
|
66
72
|
if (!model)
|
|
67
73
|
throw new Error('Model required for operation: ' + operation);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeFileSafely.js","sourceRoot":"","sources":["../../src/utils/writeFileSafely.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,
|
|
1
|
+
{"version":3,"file":"writeFileSafely.js","sourceRoot":"","sources":["../../src/utils/writeFileSafely.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,0CA6CC;AAhED,uCAAwB;AACxB,2CAA4B;AAC5B,wDAA+B;AAS/B,IAAI,gBAAqD,CAAA;AAEzD,KAAK,UAAU,kBAAkB;IAC/B,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAA;IAC3D,gBAAgB,GAAG,MAAM,kBAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC9D,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,GACQ;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAA;IAClD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAE3D,IAAI,QAAgB,CAAA;IACpB,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,cAAc;YACjB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YACnD,MAAK;QACP,KAAK,cAAc;YACjB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YACnD,MAAK;QACP,KAAK,qBAAqB;YACxB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;YACrD,MAAK;QACP,KAAK,QAAQ;YACX,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YAC1C,MAAK;QACP,KAAK,UAAU;YACb,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YAC/C,MAAK;QACP;YACE,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,SAAS,CAAC,CAAA;YACzE,QAAQ,GAAG,IAAI,CAAC,IAAI,CAClB,UAAU,EACV,KAAK,CAAC,IAAI,EACV,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,KAAK,CAC/B,CAAA;IACL,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvE,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAClD,MAAM,gBAAgB,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;QACtD,GAAG,eAAe;QAClB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAA;IAEF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;AAC9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prisma-generator-express",
|
|
3
|
-
"description": "Prisma generator for Express, Fastify, and Hono CRUD APIs with OpenAPI
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "Prisma generator for Express, Fastify, and Hono CRUD APIs with OpenAPI and guarded MCP tools",
|
|
4
|
+
"version": "1.68.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
"yaml": "^2.9.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
+
"@modelcontextprotocol/node": "^2.0.0",
|
|
39
|
+
"@modelcontextprotocol/server": "^2.0.0",
|
|
38
40
|
"@prisma/client": ">=6.0.0",
|
|
39
41
|
"express": ">=4.0.0",
|
|
40
42
|
"fastify": "^5.0.0",
|
|
@@ -44,6 +46,12 @@
|
|
|
44
46
|
"prisma-sql": ">=1.0.0"
|
|
45
47
|
},
|
|
46
48
|
"peerDependenciesMeta": {
|
|
49
|
+
"@modelcontextprotocol/node": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"@modelcontextprotocol/server": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
47
55
|
"express": {
|
|
48
56
|
"optional": true
|
|
49
57
|
},
|
|
@@ -64,13 +72,17 @@
|
|
|
64
72
|
}
|
|
65
73
|
},
|
|
66
74
|
"devDependencies": {
|
|
75
|
+
"@modelcontextprotocol/client": "^2.1.0",
|
|
76
|
+
"@modelcontextprotocol/express": "^2.0.1",
|
|
77
|
+
"@modelcontextprotocol/node": "^2.1.0",
|
|
78
|
+
"@modelcontextprotocol/server": "^2.1.0",
|
|
67
79
|
"@prisma/client": "7.5.0",
|
|
68
|
-
"@prisma/internals": "^7.5.0",
|
|
69
80
|
"@types/better-sqlite3": "^7.6.13",
|
|
70
81
|
"@types/node": "24.7.2",
|
|
71
82
|
"@types/prettier": "3.0.0",
|
|
72
83
|
"@vitest/coverage-v8": "^4.1.0",
|
|
73
84
|
"better-sqlite3": "^12.5.0",
|
|
85
|
+
"esbuild": "^0.28.2",
|
|
74
86
|
"express": "^5.2.1",
|
|
75
87
|
"fast-xml-parser": "^5.3.3",
|
|
76
88
|
"fastify": "^5.6.2",
|
|
@@ -79,9 +91,11 @@
|
|
|
79
91
|
"pino": "^10.1.0",
|
|
80
92
|
"pino-pretty": "^13.0.0",
|
|
81
93
|
"prisma": "7.5.0",
|
|
94
|
+
"prisma-guard": "1.33.0",
|
|
82
95
|
"semantic-release": "^24.2.9",
|
|
83
96
|
"typescript": "5.9.3",
|
|
84
|
-
"vitest": "^4.1.0"
|
|
97
|
+
"vitest": "^4.1.0",
|
|
98
|
+
"zod": "^4.0.0"
|
|
85
99
|
},
|
|
86
100
|
"homepage": "https://github.com/multipliedtwice/prisma-generator-express",
|
|
87
101
|
"repository": {
|
|
@@ -93,8 +107,11 @@
|
|
|
93
107
|
"prisma",
|
|
94
108
|
"express",
|
|
95
109
|
"fastify",
|
|
110
|
+
"hono",
|
|
96
111
|
"crud",
|
|
97
|
-
"generator"
|
|
112
|
+
"generator",
|
|
113
|
+
"openapi",
|
|
114
|
+
"rest"
|
|
98
115
|
],
|
|
99
116
|
"files": [
|
|
100
117
|
"dist/**/*",
|
package/src/bin.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import './index'
|
|
2
|
+
import './index'
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
-
import { isObject } from '../copy/misc'
|
|
2
|
-
|
|
3
|
-
const bigintReplacer = (_key: string, value: unknown): unknown =>
|
|
4
|
-
typeof value === 'bigint' ? value.toString() : value
|
|
5
|
-
|
|
6
|
-
const encodeEntry = (key: string, value: unknown): string | null => {
|
|
7
|
-
if (value === undefined) return null
|
|
8
|
-
|
|
9
|
-
const encodedKey = encodeURIComponent(key)
|
|
10
|
-
|
|
11
|
-
if (value === null) return encodedKey + '=null'
|
|
12
|
-
|
|
13
|
-
if (typeof value === 'bigint') {
|
|
14
|
-
return encodedKey + '=' + encodeURIComponent(value.toString())
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (typeof value === 'string') {
|
|
18
|
-
return encodedKey + '=' + encodeURIComponent(JSON.stringify(value))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (Array.isArray(value) || isObject(value)) {
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import { isObject } from '../copy/misc'
|
|
2
|
+
|
|
3
|
+
const bigintReplacer = (_key: string, value: unknown): unknown =>
|
|
4
|
+
typeof value === 'bigint' ? value.toString() : value
|
|
5
|
+
|
|
6
|
+
const encodeEntry = (key: string, value: unknown): string | null => {
|
|
7
|
+
if (value === undefined) return null
|
|
8
|
+
|
|
9
|
+
const encodedKey = encodeURIComponent(key)
|
|
10
|
+
|
|
11
|
+
if (value === null) return encodedKey + '=null'
|
|
12
|
+
|
|
13
|
+
if (typeof value === 'bigint') {
|
|
14
|
+
return encodedKey + '=' + encodeURIComponent(value.toString())
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (typeof value === 'string') {
|
|
18
|
+
return encodedKey + '=' + encodeURIComponent(JSON.stringify(value))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (Array.isArray(value) || isObject(value)) {
|
|
22
|
+
return (
|
|
23
|
+
encodedKey +
|
|
24
|
+
'=' +
|
|
25
|
+
encodeURIComponent(JSON.stringify(value, bigintReplacer))
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return encodedKey + '=' + encodeURIComponent(String(value))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const encodeQueryParams = (params: Record<string, unknown>): string => {
|
|
33
|
+
const entries: string[] = []
|
|
34
|
+
for (const [key, value] of Object.entries(params)) {
|
|
35
|
+
const entry = encodeEntry(key, value)
|
|
36
|
+
if (entry !== null) entries.push(entry)
|
|
37
|
+
}
|
|
38
|
+
return entries.join('&')
|
|
39
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { isPlainObject } from './misc'
|
|
2
2
|
|
|
3
|
-
export type ModelRelationDirection =
|
|
3
|
+
export type ModelRelationDirection =
|
|
4
|
+
| 'parentOwnsFk'
|
|
5
|
+
| 'childOwnsFk'
|
|
6
|
+
| 'implicitM2M'
|
|
4
7
|
|
|
5
8
|
export type ModelRelationField = {
|
|
6
9
|
name: string
|
|
@@ -48,10 +51,21 @@ export const DEFAULT_AUTO_INCLUDE_MAX_STAGES = 20
|
|
|
48
51
|
|
|
49
52
|
const ALLOWED_TO_ONE_ARGS = new Set(['select', 'include', 'omit'])
|
|
50
53
|
const ALLOWED_TO_MANY_ARGS = new Set([
|
|
51
|
-
'select',
|
|
54
|
+
'select',
|
|
55
|
+
'include',
|
|
56
|
+
'omit',
|
|
57
|
+
'where',
|
|
58
|
+
'orderBy',
|
|
59
|
+
'take',
|
|
60
|
+
'skip',
|
|
61
|
+
'cursor',
|
|
62
|
+
'distinct',
|
|
52
63
|
])
|
|
53
64
|
|
|
54
|
-
function isPubliclySelected(
|
|
65
|
+
function isPubliclySelected(
|
|
66
|
+
projection: Record<string, unknown>,
|
|
67
|
+
field: string,
|
|
68
|
+
): boolean {
|
|
55
69
|
return projection[field] === true
|
|
56
70
|
}
|
|
57
71
|
|
|
@@ -120,7 +134,9 @@ function walk(
|
|
|
120
134
|
depth: number,
|
|
121
135
|
): WalkResult {
|
|
122
136
|
if (depth >= ctx.maxDepth) {
|
|
123
|
-
return {
|
|
137
|
+
return {
|
|
138
|
+
unsupportedReason: 'nested depth reached maxDepth=' + ctx.maxDepth,
|
|
139
|
+
}
|
|
124
140
|
}
|
|
125
141
|
if (ctx.stages.length >= ctx.maxStages) {
|
|
126
142
|
return { unsupportedReason: 'stages reached maxStages=' + ctx.maxStages }
|
|
@@ -128,7 +144,9 @@ function walk(
|
|
|
128
144
|
|
|
129
145
|
const model = ctx.models[modelName]
|
|
130
146
|
if (!model) {
|
|
131
|
-
return {
|
|
147
|
+
return {
|
|
148
|
+
unsupportedReason: 'model ' + modelName + ' not in relation metadata',
|
|
149
|
+
}
|
|
132
150
|
}
|
|
133
151
|
|
|
134
152
|
const select = parentArgs.select
|
|
@@ -145,10 +163,17 @@ function walk(
|
|
|
145
163
|
return { unsupportedReason: '_count not supported in MVP' }
|
|
146
164
|
}
|
|
147
165
|
if (hasWhereLikeRelationReference(parentArgs, model)) {
|
|
148
|
-
return {
|
|
166
|
+
return {
|
|
167
|
+
unsupportedReason:
|
|
168
|
+
'relation used in where/orderBy/cursor is not supported in MVP',
|
|
169
|
+
}
|
|
149
170
|
}
|
|
150
171
|
|
|
151
|
-
const projection = isPlainObject(select)
|
|
172
|
+
const projection = isPlainObject(select)
|
|
173
|
+
? select
|
|
174
|
+
: isPlainObject(include)
|
|
175
|
+
? include
|
|
176
|
+
: null
|
|
152
177
|
if (!projection) {
|
|
153
178
|
return {}
|
|
154
179
|
}
|
|
@@ -174,7 +199,9 @@ function walk(
|
|
|
174
199
|
}
|
|
175
200
|
|
|
176
201
|
if (relationBranches.length === 0) {
|
|
177
|
-
return {
|
|
202
|
+
return {
|
|
203
|
+
projectionAfterStrip: isSelectMode ? updatedProjection : undefined,
|
|
204
|
+
}
|
|
178
205
|
}
|
|
179
206
|
|
|
180
207
|
for (const branch of relationBranches) {
|
|
@@ -187,22 +214,35 @@ function walk(
|
|
|
187
214
|
if (relation.direction === 'implicitM2M') {
|
|
188
215
|
return { unsupportedReason: 'implicit many-to-many not supported in MVP' }
|
|
189
216
|
}
|
|
190
|
-
if (
|
|
191
|
-
|
|
217
|
+
if (
|
|
218
|
+
relation.parentLinkFields.length === 0 ||
|
|
219
|
+
relation.childLinkFields.length === 0
|
|
220
|
+
) {
|
|
221
|
+
return {
|
|
222
|
+
unsupportedReason: 'ambiguous relation metadata for ' + relation.name,
|
|
223
|
+
}
|
|
192
224
|
}
|
|
193
225
|
if (relation.parentLinkFields.length !== relation.childLinkFields.length) {
|
|
194
|
-
return {
|
|
226
|
+
return {
|
|
227
|
+
unsupportedReason: 'mismatched link field counts for ' + relation.name,
|
|
228
|
+
}
|
|
195
229
|
}
|
|
196
230
|
if (!ctx.models[relation.type]) {
|
|
197
231
|
return {
|
|
198
|
-
unsupportedReason:
|
|
199
|
-
'
|
|
232
|
+
unsupportedReason:
|
|
233
|
+
'target model ' +
|
|
234
|
+
relation.type +
|
|
235
|
+
' not in relation metadata for ' +
|
|
236
|
+
(parentPath ? parentPath + '.' : '') +
|
|
237
|
+
branch.name,
|
|
200
238
|
}
|
|
201
239
|
}
|
|
202
240
|
|
|
203
241
|
if (branch.value !== true && !isPlainObject(branch.value)) {
|
|
204
242
|
return {
|
|
205
|
-
unsupportedReason:
|
|
243
|
+
unsupportedReason:
|
|
244
|
+
'invalid relation projection value for ' +
|
|
245
|
+
branch.name +
|
|
206
246
|
' (expected true or plain object)',
|
|
207
247
|
}
|
|
208
248
|
}
|
|
@@ -210,7 +250,10 @@ function walk(
|
|
|
210
250
|
for (const linkField of relation.parentLinkFields) {
|
|
211
251
|
if (localOmit && localOmit[linkField] === true) {
|
|
212
252
|
const where = parentPath ? parentPath + '.' : 'root.'
|
|
213
|
-
return {
|
|
253
|
+
return {
|
|
254
|
+
unsupportedReason:
|
|
255
|
+
'required parent link field omitted: ' + where + linkField,
|
|
256
|
+
}
|
|
214
257
|
}
|
|
215
258
|
}
|
|
216
259
|
|
|
@@ -222,14 +265,22 @@ function walk(
|
|
|
222
265
|
}
|
|
223
266
|
}
|
|
224
267
|
|
|
225
|
-
const relationArgs: Record<string, unknown> =
|
|
268
|
+
const relationArgs: Record<string, unknown> =
|
|
269
|
+
branch.value === true ? {} : branch.value
|
|
226
270
|
|
|
227
|
-
const allowedArgs = relation.isList
|
|
271
|
+
const allowedArgs = relation.isList
|
|
272
|
+
? ALLOWED_TO_MANY_ARGS
|
|
273
|
+
: ALLOWED_TO_ONE_ARGS
|
|
228
274
|
for (const key of Object.keys(relationArgs)) {
|
|
229
275
|
if (!allowedArgs.has(key)) {
|
|
230
276
|
return {
|
|
231
|
-
unsupportedReason:
|
|
232
|
-
|
|
277
|
+
unsupportedReason:
|
|
278
|
+
'unsupported arg "' +
|
|
279
|
+
key +
|
|
280
|
+
'" for ' +
|
|
281
|
+
(relation.isList ? 'to-many' : 'to-one') +
|
|
282
|
+
' relation ' +
|
|
283
|
+
relation.name,
|
|
233
284
|
}
|
|
234
285
|
}
|
|
235
286
|
}
|
|
@@ -237,12 +288,16 @@ function walk(
|
|
|
237
288
|
const targetModel = ctx.models[relation.type]
|
|
238
289
|
if (hasWhereLikeRelationReference(relationArgs, targetModel)) {
|
|
239
290
|
return {
|
|
240
|
-
unsupportedReason:
|
|
241
|
-
relation
|
|
291
|
+
unsupportedReason:
|
|
292
|
+
'nested relation used in where/orderBy/cursor for ' +
|
|
293
|
+
relation.name +
|
|
294
|
+
' is not supported in MVP',
|
|
242
295
|
}
|
|
243
296
|
}
|
|
244
297
|
|
|
245
|
-
const relationPath = parentPath
|
|
298
|
+
const relationPath = parentPath
|
|
299
|
+
? parentPath + '.' + branch.name
|
|
300
|
+
: branch.name
|
|
246
301
|
|
|
247
302
|
const { select: _s, include: _i, omit: _o, ...stageArgs } = relationArgs
|
|
248
303
|
|
|
@@ -263,7 +318,13 @@ function walk(
|
|
|
263
318
|
isPlainObject(relationArgs.omit)
|
|
264
319
|
|
|
265
320
|
if (hasNestedProjection) {
|
|
266
|
-
const nested = walk(
|
|
321
|
+
const nested = walk(
|
|
322
|
+
ctx,
|
|
323
|
+
relation.type,
|
|
324
|
+
relationPath,
|
|
325
|
+
relationArgs,
|
|
326
|
+
depth + 1,
|
|
327
|
+
)
|
|
267
328
|
if (nested.unsupportedReason) return nested
|
|
268
329
|
|
|
269
330
|
if (nested.projectionAfterStrip) {
|
|
@@ -278,7 +339,9 @@ function walk(
|
|
|
278
339
|
return { projectionAfterStrip: isSelectMode ? updatedProjection : undefined }
|
|
279
340
|
}
|
|
280
341
|
|
|
281
|
-
export function planAutoInclude(
|
|
342
|
+
export function planAutoInclude(
|
|
343
|
+
input: AutoIncludePlannerInput,
|
|
344
|
+
): AutoIncludePlan {
|
|
282
345
|
const maxDepth = input.maxDepth ?? DEFAULT_AUTO_INCLUDE_MAX_DEPTH
|
|
283
346
|
const maxStages = input.maxStages ?? DEFAULT_AUTO_INCLUDE_MAX_STAGES
|
|
284
347
|
|
|
@@ -297,7 +360,8 @@ export function planAutoInclude(input: AutoIncludePlannerInput): AutoIncludePlan
|
|
|
297
360
|
rootArgs: input.args,
|
|
298
361
|
stages: [],
|
|
299
362
|
internalFieldPaths: [],
|
|
300
|
-
unsupportedReason:
|
|
363
|
+
unsupportedReason:
|
|
364
|
+
'auto-progressive fallback: ' + result.unsupportedReason,
|
|
301
365
|
}
|
|
302
366
|
}
|
|
303
367
|
|
|
@@ -309,7 +373,9 @@ export function planAutoInclude(input: AutoIncludePlannerInput): AutoIncludePlan
|
|
|
309
373
|
delete rootArgs.include
|
|
310
374
|
} else if (rootModel && isPlainObject(input.args.include)) {
|
|
311
375
|
const stripped = Object.fromEntries(
|
|
312
|
-
Object.entries(input.args.include).filter(
|
|
376
|
+
Object.entries(input.args.include).filter(
|
|
377
|
+
([k]) => !rootModel.relations[k],
|
|
378
|
+
),
|
|
313
379
|
)
|
|
314
380
|
if (Object.keys(stripped).length > 0) {
|
|
315
381
|
rootArgs.include = stripped
|
|
@@ -323,4 +389,4 @@ export function planAutoInclude(input: AutoIncludePlannerInput): AutoIncludePlan
|
|
|
323
389
|
stages: ctx.stages,
|
|
324
390
|
internalFieldPaths: ctx.internalFieldPaths,
|
|
325
391
|
}
|
|
326
|
-
}
|
|
392
|
+
}
|