@prisma-next/mongo-contract-psl 0.0.1 → 0.3.0-dev.146
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/exports/provider.d.mts +11 -0
- package/dist/exports/provider.d.mts.map +1 -0
- package/dist/exports/provider.mjs +48 -0
- package/dist/exports/provider.mjs.map +1 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/scalar-type-descriptors-Bou6SVVa.mjs +459 -0
- package/dist/scalar-type-descriptors-Bou6SVVa.mjs.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ContractConfig } from "@prisma-next/config/config-types";
|
|
2
|
+
|
|
3
|
+
//#region src/provider.d.ts
|
|
4
|
+
interface MongoContractOptions {
|
|
5
|
+
readonly output?: string;
|
|
6
|
+
readonly scalarTypeDescriptors?: ReadonlyMap<string, string>;
|
|
7
|
+
}
|
|
8
|
+
declare function mongoContract(schemaPath: string, options?: MongoContractOptions): ContractConfig;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { type MongoContractOptions, mongoContract };
|
|
11
|
+
//# sourceMappingURL=provider.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../src/provider.ts"],"sourcesContent":[],"mappings":";;;UASiB,oBAAA;;EAAA,SAAA,qBAAoB,CAAA,EAEF,WAAA,CAAA,MAAW,EAAA,MAAA,CAAA;AAG9C;iBAAgB,aAAA,+BAA4C,uBAAuB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { n as interpretPslDocumentToMongoContract, t as createMongoScalarTypeDescriptors } from "../scalar-type-descriptors-Bou6SVVa.mjs";
|
|
2
|
+
import { notOk, ok } from "@prisma-next/utils/result";
|
|
3
|
+
import { parsePslDocument } from "@prisma-next/psl-parser";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
6
|
+
import { resolve } from "pathe";
|
|
7
|
+
|
|
8
|
+
//#region src/provider.ts
|
|
9
|
+
function mongoContract(schemaPath, options) {
|
|
10
|
+
return {
|
|
11
|
+
source: async (_context) => {
|
|
12
|
+
const absoluteSchemaPath = resolve(schemaPath);
|
|
13
|
+
let schema;
|
|
14
|
+
try {
|
|
15
|
+
schema = await readFile(absoluteSchemaPath, "utf-8");
|
|
16
|
+
} catch (error) {
|
|
17
|
+
const message = String(error);
|
|
18
|
+
return notOk({
|
|
19
|
+
summary: `Failed to read Prisma schema at "${schemaPath}"`,
|
|
20
|
+
diagnostics: [{
|
|
21
|
+
code: "PSL_SCHEMA_READ_FAILED",
|
|
22
|
+
message,
|
|
23
|
+
sourceId: schemaPath
|
|
24
|
+
}],
|
|
25
|
+
meta: {
|
|
26
|
+
schemaPath,
|
|
27
|
+
absoluteSchemaPath,
|
|
28
|
+
cause: message
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const interpreted = interpretPslDocumentToMongoContract({
|
|
33
|
+
document: parsePslDocument({
|
|
34
|
+
schema,
|
|
35
|
+
sourceId: schemaPath
|
|
36
|
+
}),
|
|
37
|
+
scalarTypeDescriptors: options?.scalarTypeDescriptors ?? createMongoScalarTypeDescriptors()
|
|
38
|
+
});
|
|
39
|
+
if (!interpreted.ok) return interpreted;
|
|
40
|
+
return ok(interpreted.value);
|
|
41
|
+
},
|
|
42
|
+
...ifDefined("output", options?.output)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { mongoContract };
|
|
48
|
+
//# sourceMappingURL=provider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":["schema: string"],"sources":["../../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceContext } from '@prisma-next/config/config-types';\nimport { parsePslDocument } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { resolve } from 'pathe';\nimport { interpretPslDocumentToMongoContract } from './interpreter';\nimport { createMongoScalarTypeDescriptors } from './scalar-type-descriptors';\n\nexport interface MongoContractOptions {\n readonly output?: string;\n readonly scalarTypeDescriptors?: ReadonlyMap<string, string>;\n}\n\nexport function mongoContract(schemaPath: string, options?: MongoContractOptions): ContractConfig {\n return {\n source: async (_context: ContractSourceContext) => {\n const absoluteSchemaPath = resolve(schemaPath);\n let schema: string;\n try {\n schema = await readFile(absoluteSchemaPath, 'utf-8');\n } catch (error) {\n const message = String(error);\n return notOk({\n summary: `Failed to read Prisma schema at \"${schemaPath}\"`,\n diagnostics: [\n {\n code: 'PSL_SCHEMA_READ_FAILED',\n message,\n sourceId: schemaPath,\n },\n ],\n meta: { schemaPath, absoluteSchemaPath, cause: message },\n });\n }\n\n const document = parsePslDocument({\n schema,\n sourceId: schemaPath,\n });\n\n const interpreted = interpretPslDocumentToMongoContract({\n document,\n scalarTypeDescriptors: options?.scalarTypeDescriptors ?? createMongoScalarTypeDescriptors(),\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n ...ifDefined('output', options?.output),\n };\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,cAAc,YAAoB,SAAgD;AAChG,QAAO;EACL,QAAQ,OAAO,aAAoC;GACjD,MAAM,qBAAqB,QAAQ,WAAW;GAC9C,IAAIA;AACJ,OAAI;AACF,aAAS,MAAM,SAAS,oBAAoB,QAAQ;YAC7C,OAAO;IACd,MAAM,UAAU,OAAO,MAAM;AAC7B,WAAO,MAAM;KACX,SAAS,oCAAoC,WAAW;KACxD,aAAa,CACX;MACE,MAAM;MACN;MACA,UAAU;MACX,CACF;KACD,MAAM;MAAE;MAAY;MAAoB,OAAO;MAAS;KACzD,CAAC;;GAQJ,MAAM,cAAc,oCAAoC;IACtD,UANe,iBAAiB;KAChC;KACA,UAAU;KACX,CAAC;IAIA,uBAAuB,SAAS,yBAAyB,kCAAkC;IAC5F,CAAC;AACF,OAAI,CAAC,YAAY,GACf,QAAO;AAGT,UAAO,GAAG,YAAY,MAAM;;EAE9B,GAAG,UAAU,UAAU,SAAS,OAAO;EACxC"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Result } from "@prisma-next/utils/result";
|
|
2
|
+
import { ParsePslDocumentResult } from "@prisma-next/psl-parser";
|
|
3
|
+
import { ContractSourceDiagnostics } from "@prisma-next/config/config-types";
|
|
4
|
+
import { Contract } from "@prisma-next/contract/types";
|
|
5
|
+
|
|
6
|
+
//#region src/interpreter.d.ts
|
|
7
|
+
interface InterpretPslDocumentToMongoContractInput {
|
|
8
|
+
readonly document: ParsePslDocumentResult;
|
|
9
|
+
readonly scalarTypeDescriptors: ReadonlyMap<string, string>;
|
|
10
|
+
}
|
|
11
|
+
declare function interpretPslDocumentToMongoContract(input: InterpretPslDocumentToMongoContractInput): Result<Contract, ContractSourceDiagnostics>;
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/scalar-type-descriptors.d.ts
|
|
14
|
+
declare function createMongoScalarTypeDescriptors(): ReadonlyMap<string, string>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { type InterpretPslDocumentToMongoContractInput, createMongoScalarTypeDescriptors, interpretPslDocumentToMongoContract };
|
|
17
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/interpreter.ts","../src/scalar-type-descriptors.ts"],"sourcesContent":[],"mappings":";;;;;;UAsBiB,wCAAA;qBACI;EADJ,SAAA,qBAAA,EAEiB,WAFuB,CAAA,MAAA,EAAA,MACpC,CAAA;AAuSrB;AACS,iBADO,mCAAA,CACP,KAAA,EAAA,wCAAA,CAAA,EACN,MADM,CACC,QADD,EACW,yBADX,CAAA;;;iBC/TO,gCAAA,CAAA,GAAoC"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
|
|
2
|
+
import { notOk, ok } from "@prisma-next/utils/result";
|
|
3
|
+
import { getPositionalArgument, parseQuotedStringLiteral } from "@prisma-next/psl-parser";
|
|
4
|
+
|
|
5
|
+
//#region src/psl-helpers.ts
|
|
6
|
+
function lowerFirst(value) {
|
|
7
|
+
if (value.length === 0) return value;
|
|
8
|
+
return value[0]?.toLowerCase() + value.slice(1);
|
|
9
|
+
}
|
|
10
|
+
function getAttribute(attributes, name) {
|
|
11
|
+
return attributes.find((attr) => attr.name === name);
|
|
12
|
+
}
|
|
13
|
+
function getMapName(attributes) {
|
|
14
|
+
const mapAttr = getAttribute(attributes, "map");
|
|
15
|
+
if (!mapAttr) return void 0;
|
|
16
|
+
const arg = mapAttr.args[0];
|
|
17
|
+
if (!arg) return void 0;
|
|
18
|
+
return stripQuotes(arg.value);
|
|
19
|
+
}
|
|
20
|
+
function parseRelationAttribute(attributes) {
|
|
21
|
+
const relationAttr = getAttribute(attributes, "relation");
|
|
22
|
+
if (!relationAttr) return void 0;
|
|
23
|
+
let relationName;
|
|
24
|
+
let fieldsArg;
|
|
25
|
+
let referencesArg;
|
|
26
|
+
for (const arg of relationAttr.args) if (arg.kind === "positional") relationName = stripQuotes(arg.value);
|
|
27
|
+
else if (arg.name === "name") relationName = stripQuotes(arg.value);
|
|
28
|
+
else if (arg.name === "fields") fieldsArg = arg;
|
|
29
|
+
else if (arg.name === "references") referencesArg = arg;
|
|
30
|
+
const fields = fieldsArg ? parseFieldList(fieldsArg.value) : void 0;
|
|
31
|
+
const references = referencesArg ? parseFieldList(referencesArg.value) : void 0;
|
|
32
|
+
return {
|
|
33
|
+
...relationName !== void 0 ? { relationName } : {},
|
|
34
|
+
...fields !== void 0 ? { fields } : {},
|
|
35
|
+
...references !== void 0 ? { references } : {}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function parseFieldList(value) {
|
|
39
|
+
const inner = value.replace(/^\[/, "").replace(/\]$/, "").trim();
|
|
40
|
+
if (inner.length === 0) return [];
|
|
41
|
+
return inner.split(",").map((s) => s.trim());
|
|
42
|
+
}
|
|
43
|
+
function stripQuotes(value) {
|
|
44
|
+
if (value.startsWith("\"") && value.endsWith("\"")) return value.slice(1, -1);
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/interpreter.ts
|
|
50
|
+
function fkRelationPairKey(declaringModel, targetModel) {
|
|
51
|
+
return `${declaringModel}::${targetModel}`;
|
|
52
|
+
}
|
|
53
|
+
function resolveFieldMappings(model) {
|
|
54
|
+
const pslNameToMapped = /* @__PURE__ */ new Map();
|
|
55
|
+
for (const field of model.fields) {
|
|
56
|
+
const mapped = getMapName(field.attributes) ?? field.name;
|
|
57
|
+
pslNameToMapped.set(field.name, mapped);
|
|
58
|
+
}
|
|
59
|
+
return { pslNameToMapped };
|
|
60
|
+
}
|
|
61
|
+
function resolveCollectionName(model) {
|
|
62
|
+
return getMapName(model.attributes) ?? lowerFirst(model.name);
|
|
63
|
+
}
|
|
64
|
+
function collectPolymorphismDeclarations(document, sourceId, diagnostics) {
|
|
65
|
+
const discriminatorDeclarations = /* @__PURE__ */ new Map();
|
|
66
|
+
const baseDeclarations = /* @__PURE__ */ new Map();
|
|
67
|
+
for (const pslModel of document.ast.models) for (const attr of pslModel.attributes) {
|
|
68
|
+
if (attr.name === "discriminator") {
|
|
69
|
+
const fieldName = getPositionalArgument(attr);
|
|
70
|
+
if (!fieldName) {
|
|
71
|
+
diagnostics.push({
|
|
72
|
+
code: "PSL_INVALID_ATTRIBUTE_ARGUMENT",
|
|
73
|
+
message: `Model "${pslModel.name}" @@discriminator requires a field name argument`,
|
|
74
|
+
sourceId,
|
|
75
|
+
span: attr.span
|
|
76
|
+
});
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const discField = pslModel.fields.find((f) => f.name === fieldName);
|
|
80
|
+
if (discField && discField.typeName !== "String") {
|
|
81
|
+
diagnostics.push({
|
|
82
|
+
code: "PSL_INVALID_ATTRIBUTE_ARGUMENT",
|
|
83
|
+
message: `Discriminator field "${fieldName}" on model "${pslModel.name}" must be of type String, but is "${discField.typeName}"`,
|
|
84
|
+
sourceId,
|
|
85
|
+
span: attr.span
|
|
86
|
+
});
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
discriminatorDeclarations.set(pslModel.name, {
|
|
90
|
+
fieldName,
|
|
91
|
+
span: attr.span
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (attr.name === "base") {
|
|
95
|
+
const baseName = getPositionalArgument(attr, 0);
|
|
96
|
+
const rawValue = getPositionalArgument(attr, 1);
|
|
97
|
+
if (!baseName || !rawValue) {
|
|
98
|
+
diagnostics.push({
|
|
99
|
+
code: "PSL_INVALID_ATTRIBUTE_ARGUMENT",
|
|
100
|
+
message: `Model "${pslModel.name}" @@base requires two arguments: base model name and discriminator value`,
|
|
101
|
+
sourceId,
|
|
102
|
+
span: attr.span
|
|
103
|
+
});
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const value = parseQuotedStringLiteral(rawValue);
|
|
107
|
+
if (value === void 0) {
|
|
108
|
+
diagnostics.push({
|
|
109
|
+
code: "PSL_INVALID_ATTRIBUTE_ARGUMENT",
|
|
110
|
+
message: `Model "${pslModel.name}" @@base discriminator value must be a quoted string literal`,
|
|
111
|
+
sourceId,
|
|
112
|
+
span: attr.span
|
|
113
|
+
});
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const collectionName = resolveCollectionName(pslModel);
|
|
117
|
+
baseDeclarations.set(pslModel.name, {
|
|
118
|
+
baseName,
|
|
119
|
+
value,
|
|
120
|
+
collectionName,
|
|
121
|
+
span: attr.span
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
discriminatorDeclarations,
|
|
127
|
+
baseDeclarations
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function resolvePolymorphism(input) {
|
|
131
|
+
const { discriminatorDeclarations, baseDeclarations, modelNames, sourceId, document } = input;
|
|
132
|
+
let patched = input.models;
|
|
133
|
+
let roots = input.roots;
|
|
134
|
+
const diagnostics = [];
|
|
135
|
+
for (const [modelName, decl] of discriminatorDeclarations) {
|
|
136
|
+
if (baseDeclarations.has(modelName)) {
|
|
137
|
+
diagnostics.push({
|
|
138
|
+
code: "PSL_DISCRIMINATOR_AND_BASE",
|
|
139
|
+
message: `Model "${modelName}" cannot have both @@discriminator and @@base`,
|
|
140
|
+
sourceId,
|
|
141
|
+
span: decl.span
|
|
142
|
+
});
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const model = patched[modelName];
|
|
146
|
+
if (!model) continue;
|
|
147
|
+
if (!Object.hasOwn(model.fields, decl.fieldName)) {
|
|
148
|
+
diagnostics.push({
|
|
149
|
+
code: "PSL_DISCRIMINATOR_FIELD_NOT_FOUND",
|
|
150
|
+
message: `Discriminator field "${decl.fieldName}" is not a field on model "${modelName}"`,
|
|
151
|
+
sourceId,
|
|
152
|
+
span: decl.span
|
|
153
|
+
});
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const variants = {};
|
|
157
|
+
for (const [variantName, baseDecl] of baseDeclarations) {
|
|
158
|
+
if (baseDecl.baseName !== modelName) continue;
|
|
159
|
+
variants[variantName] = { value: baseDecl.value };
|
|
160
|
+
}
|
|
161
|
+
if (Object.keys(variants).length === 0) {
|
|
162
|
+
diagnostics.push({
|
|
163
|
+
code: "PSL_ORPHANED_DISCRIMINATOR",
|
|
164
|
+
message: `Model "${modelName}" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,
|
|
165
|
+
sourceId,
|
|
166
|
+
span: decl.span
|
|
167
|
+
});
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
patched = {
|
|
171
|
+
...patched,
|
|
172
|
+
[modelName]: {
|
|
173
|
+
...model,
|
|
174
|
+
discriminator: { field: decl.fieldName },
|
|
175
|
+
variants
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
for (const [variantName, baseDecl] of baseDeclarations) {
|
|
180
|
+
if (!modelNames.has(baseDecl.baseName)) {
|
|
181
|
+
diagnostics.push({
|
|
182
|
+
code: "PSL_BASE_TARGET_NOT_FOUND",
|
|
183
|
+
message: `Model "${variantName}" @@base references non-existent model "${baseDecl.baseName}"`,
|
|
184
|
+
sourceId,
|
|
185
|
+
span: baseDecl.span
|
|
186
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (!discriminatorDeclarations.has(baseDecl.baseName)) {
|
|
190
|
+
diagnostics.push({
|
|
191
|
+
code: "PSL_ORPHANED_BASE",
|
|
192
|
+
message: `Model "${variantName}" declares @@base(${baseDecl.baseName}, ...) but "${baseDecl.baseName}" has no @@discriminator`,
|
|
193
|
+
sourceId,
|
|
194
|
+
span: baseDecl.span
|
|
195
|
+
});
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (discriminatorDeclarations.has(variantName)) continue;
|
|
199
|
+
const baseModel = patched[baseDecl.baseName];
|
|
200
|
+
const variantPslModel = document.ast.models.find((m) => m.name === variantName);
|
|
201
|
+
if (!variantPslModel) continue;
|
|
202
|
+
if (getMapName(variantPslModel.attributes) !== void 0 && baseModel && baseDecl.collectionName !== baseModel.storage.collection) {
|
|
203
|
+
diagnostics.push({
|
|
204
|
+
code: "PSL_MONGO_VARIANT_SEPARATE_COLLECTION",
|
|
205
|
+
message: `Mongo variant "${variantName}" cannot use a different collection than its base "${baseDecl.baseName}". Mongo only supports single-collection polymorphism.`,
|
|
206
|
+
sourceId,
|
|
207
|
+
span: baseDecl.span
|
|
208
|
+
});
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const baseCollection = baseModel?.storage.collection ?? baseDecl.collectionName;
|
|
212
|
+
const variantModel = patched[variantName];
|
|
213
|
+
if (variantModel) patched = {
|
|
214
|
+
...patched,
|
|
215
|
+
[variantName]: {
|
|
216
|
+
...variantModel,
|
|
217
|
+
base: baseDecl.baseName,
|
|
218
|
+
storage: { collection: baseCollection }
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const variantCollectionName = resolveCollectionName(variantPslModel);
|
|
222
|
+
if (roots[variantCollectionName] === variantName) if (variantCollectionName === baseCollection && baseModel) roots = {
|
|
223
|
+
...roots,
|
|
224
|
+
[variantCollectionName]: baseDecl.baseName
|
|
225
|
+
};
|
|
226
|
+
else roots = Object.fromEntries(Object.entries(roots).filter(([key]) => key !== variantCollectionName));
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
models: patched,
|
|
230
|
+
roots,
|
|
231
|
+
diagnostics
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function isRelationField(field, modelNames) {
|
|
235
|
+
return modelNames.has(field.typeName);
|
|
236
|
+
}
|
|
237
|
+
function resolveFieldCodecId(field, scalarTypeDescriptors) {
|
|
238
|
+
return scalarTypeDescriptors.get(field.typeName);
|
|
239
|
+
}
|
|
240
|
+
function resolveNonRelationField(field, ownerName, compositeTypeNames, scalarTypeDescriptors, sourceId, diagnostics) {
|
|
241
|
+
if (compositeTypeNames.has(field.typeName)) {
|
|
242
|
+
const result$1 = {
|
|
243
|
+
type: {
|
|
244
|
+
kind: "valueObject",
|
|
245
|
+
name: field.typeName
|
|
246
|
+
},
|
|
247
|
+
nullable: field.optional
|
|
248
|
+
};
|
|
249
|
+
return field.list ? {
|
|
250
|
+
...result$1,
|
|
251
|
+
many: true
|
|
252
|
+
} : result$1;
|
|
253
|
+
}
|
|
254
|
+
const codecId = resolveFieldCodecId(field, scalarTypeDescriptors);
|
|
255
|
+
if (!codecId) {
|
|
256
|
+
diagnostics.push({
|
|
257
|
+
code: "PSL_UNSUPPORTED_FIELD_TYPE",
|
|
258
|
+
message: `Field "${ownerName}.${field.name}" type "${field.typeName}" is not supported in Mongo PSL interpreter`,
|
|
259
|
+
sourceId,
|
|
260
|
+
span: field.span
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const result = {
|
|
265
|
+
type: {
|
|
266
|
+
kind: "scalar",
|
|
267
|
+
codecId
|
|
268
|
+
},
|
|
269
|
+
nullable: field.optional
|
|
270
|
+
};
|
|
271
|
+
return field.list ? {
|
|
272
|
+
...result,
|
|
273
|
+
many: true
|
|
274
|
+
} : result;
|
|
275
|
+
}
|
|
276
|
+
function interpretPslDocumentToMongoContract(input) {
|
|
277
|
+
const { document, scalarTypeDescriptors } = input;
|
|
278
|
+
const sourceId = document.ast.sourceId;
|
|
279
|
+
const diagnostics = [];
|
|
280
|
+
const modelNames = new Set(document.ast.models.map((m) => m.name));
|
|
281
|
+
const compositeTypeNames = new Set(document.ast.compositeTypes.map((ct) => ct.name));
|
|
282
|
+
const models = {};
|
|
283
|
+
const collections = {};
|
|
284
|
+
const roots = {};
|
|
285
|
+
const allFkRelations = [];
|
|
286
|
+
const backrelationCandidates = [];
|
|
287
|
+
for (const pslModel of document.ast.models) {
|
|
288
|
+
const collectionName = resolveCollectionName(pslModel);
|
|
289
|
+
const fieldMappings = resolveFieldMappings(pslModel);
|
|
290
|
+
const fields = {};
|
|
291
|
+
const relations = {};
|
|
292
|
+
for (const field of pslModel.fields) {
|
|
293
|
+
if (isRelationField(field, modelNames)) {
|
|
294
|
+
const relation = parseRelationAttribute(field.attributes);
|
|
295
|
+
if (field.list || !(relation?.fields && relation?.references)) {
|
|
296
|
+
backrelationCandidates.push({
|
|
297
|
+
modelName: pslModel.name,
|
|
298
|
+
fieldName: field.name,
|
|
299
|
+
targetModelName: field.typeName,
|
|
300
|
+
...relation?.relationName !== void 0 ? { relationName: relation.relationName } : {},
|
|
301
|
+
cardinality: field.list ? "1:N" : "1:1",
|
|
302
|
+
field
|
|
303
|
+
});
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
if (relation?.fields && relation?.references) {
|
|
307
|
+
const localMapped = relation.fields.map((f) => fieldMappings.pslNameToMapped.get(f) ?? f);
|
|
308
|
+
const targetModel = document.ast.models.find((m) => m.name === field.typeName);
|
|
309
|
+
const targetFieldMappings = targetModel ? resolveFieldMappings(targetModel) : void 0;
|
|
310
|
+
const targetMapped = relation.references.map((f) => targetFieldMappings?.pslNameToMapped.get(f) ?? f);
|
|
311
|
+
relations[field.name] = {
|
|
312
|
+
to: field.typeName,
|
|
313
|
+
cardinality: "N:1",
|
|
314
|
+
on: {
|
|
315
|
+
localFields: localMapped,
|
|
316
|
+
targetFields: targetMapped
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
allFkRelations.push({
|
|
320
|
+
declaringModel: pslModel.name,
|
|
321
|
+
fieldName: field.name,
|
|
322
|
+
targetModel: field.typeName,
|
|
323
|
+
...relation.relationName !== void 0 ? { relationName: relation.relationName } : {},
|
|
324
|
+
localFields: localMapped,
|
|
325
|
+
targetFields: targetMapped
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
const resolved = resolveNonRelationField(field, pslModel.name, compositeTypeNames, scalarTypeDescriptors, sourceId, diagnostics);
|
|
331
|
+
if (!resolved) continue;
|
|
332
|
+
const mappedName = fieldMappings.pslNameToMapped.get(field.name) ?? field.name;
|
|
333
|
+
fields[mappedName] = resolved;
|
|
334
|
+
}
|
|
335
|
+
const isVariantModel = pslModel.attributes.some((attr) => attr.name === "base");
|
|
336
|
+
if (!pslModel.fields.some((f) => getAttribute(f.attributes, "id") !== void 0) && !isVariantModel) diagnostics.push({
|
|
337
|
+
code: "PSL_MISSING_ID_FIELD",
|
|
338
|
+
message: `Model "${pslModel.name}" has no field with @id attribute. Every model must have exactly one @id field.`,
|
|
339
|
+
sourceId
|
|
340
|
+
});
|
|
341
|
+
models[pslModel.name] = {
|
|
342
|
+
fields,
|
|
343
|
+
relations,
|
|
344
|
+
storage: { collection: collectionName }
|
|
345
|
+
};
|
|
346
|
+
collections[collectionName] = {};
|
|
347
|
+
roots[collectionName] = pslModel.name;
|
|
348
|
+
}
|
|
349
|
+
const valueObjects = {};
|
|
350
|
+
for (const compositeType of document.ast.compositeTypes) {
|
|
351
|
+
const fields = {};
|
|
352
|
+
for (const field of compositeType.fields) {
|
|
353
|
+
const resolved = resolveNonRelationField(field, compositeType.name, compositeTypeNames, scalarTypeDescriptors, sourceId, diagnostics);
|
|
354
|
+
if (!resolved) continue;
|
|
355
|
+
fields[field.name] = resolved;
|
|
356
|
+
}
|
|
357
|
+
valueObjects[compositeType.name] = { fields };
|
|
358
|
+
}
|
|
359
|
+
const fkRelationsByPair = /* @__PURE__ */ new Map();
|
|
360
|
+
for (const fk of allFkRelations) {
|
|
361
|
+
const key = fkRelationPairKey(fk.declaringModel, fk.targetModel);
|
|
362
|
+
const existing = fkRelationsByPair.get(key);
|
|
363
|
+
if (existing) existing.push(fk);
|
|
364
|
+
else fkRelationsByPair.set(key, [fk]);
|
|
365
|
+
}
|
|
366
|
+
for (const candidate of backrelationCandidates) {
|
|
367
|
+
const pairKey = fkRelationPairKey(candidate.targetModelName, candidate.modelName);
|
|
368
|
+
const pairMatches = fkRelationsByPair.get(pairKey) ?? [];
|
|
369
|
+
const matches = candidate.relationName ? pairMatches.filter((r) => r.relationName === candidate.relationName) : [...pairMatches];
|
|
370
|
+
if (matches.length === 0) {
|
|
371
|
+
diagnostics.push({
|
|
372
|
+
code: "PSL_ORPHANED_BACKRELATION",
|
|
373
|
+
message: `Backrelation list field "${candidate.modelName}.${candidate.fieldName}" has no matching FK-side relation on model "${candidate.targetModelName}". Add @relation(fields: [...], references: [...]) on the FK-side relation or use an explicit join model for many-to-many.`,
|
|
374
|
+
sourceId,
|
|
375
|
+
span: candidate.field.span
|
|
376
|
+
});
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (matches.length > 1) {
|
|
380
|
+
diagnostics.push({
|
|
381
|
+
code: "PSL_AMBIGUOUS_BACKRELATION",
|
|
382
|
+
message: `Backrelation list field "${candidate.modelName}.${candidate.fieldName}" matches multiple FK-side relations on model "${candidate.targetModelName}". Add @relation("...") to both sides to disambiguate.`,
|
|
383
|
+
sourceId,
|
|
384
|
+
span: candidate.field.span
|
|
385
|
+
});
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
const fk = matches[0];
|
|
389
|
+
if (!fk) continue;
|
|
390
|
+
const modelEntry = models[candidate.modelName];
|
|
391
|
+
if (!modelEntry) continue;
|
|
392
|
+
modelEntry.relations[candidate.fieldName] = {
|
|
393
|
+
to: candidate.targetModelName,
|
|
394
|
+
cardinality: candidate.cardinality,
|
|
395
|
+
on: {
|
|
396
|
+
localFields: fk.targetFields,
|
|
397
|
+
targetFields: fk.localFields
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(document, sourceId, diagnostics);
|
|
402
|
+
const polyResult = resolvePolymorphism({
|
|
403
|
+
models,
|
|
404
|
+
roots,
|
|
405
|
+
document,
|
|
406
|
+
discriminatorDeclarations,
|
|
407
|
+
baseDeclarations,
|
|
408
|
+
modelNames,
|
|
409
|
+
sourceId
|
|
410
|
+
});
|
|
411
|
+
if (diagnostics.length > 0 || polyResult.diagnostics.length > 0) return notOk({
|
|
412
|
+
summary: "PSL to Mongo contract interpretation failed",
|
|
413
|
+
diagnostics: [...diagnostics, ...polyResult.diagnostics]
|
|
414
|
+
});
|
|
415
|
+
const target = "mongo";
|
|
416
|
+
const targetFamily = "mongo";
|
|
417
|
+
const storageWithoutHash = { collections };
|
|
418
|
+
const storageHash = computeStorageHash({
|
|
419
|
+
target,
|
|
420
|
+
targetFamily,
|
|
421
|
+
storage: storageWithoutHash
|
|
422
|
+
});
|
|
423
|
+
const capabilities = {};
|
|
424
|
+
return ok({
|
|
425
|
+
targetFamily,
|
|
426
|
+
target,
|
|
427
|
+
roots: polyResult.roots,
|
|
428
|
+
models: polyResult.models,
|
|
429
|
+
...Object.keys(valueObjects).length > 0 ? { valueObjects } : {},
|
|
430
|
+
storage: {
|
|
431
|
+
...storageWithoutHash,
|
|
432
|
+
storageHash
|
|
433
|
+
},
|
|
434
|
+
extensionPacks: {},
|
|
435
|
+
capabilities,
|
|
436
|
+
profileHash: computeProfileHash({
|
|
437
|
+
target,
|
|
438
|
+
targetFamily,
|
|
439
|
+
capabilities
|
|
440
|
+
}),
|
|
441
|
+
meta: {}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
//#endregion
|
|
446
|
+
//#region src/scalar-type-descriptors.ts
|
|
447
|
+
function createMongoScalarTypeDescriptors() {
|
|
448
|
+
return new Map([
|
|
449
|
+
["String", "mongo/string@1"],
|
|
450
|
+
["Int", "mongo/int32@1"],
|
|
451
|
+
["Boolean", "mongo/bool@1"],
|
|
452
|
+
["DateTime", "mongo/date@1"],
|
|
453
|
+
["ObjectId", "mongo/objectId@1"]
|
|
454
|
+
]);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
//#endregion
|
|
458
|
+
export { interpretPslDocumentToMongoContract as n, createMongoScalarTypeDescriptors as t };
|
|
459
|
+
//# sourceMappingURL=scalar-type-descriptors-Bou6SVVa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalar-type-descriptors-Bou6SVVa.mjs","names":["relationName: string | undefined","fieldsArg: PslAttributeArgument | undefined","referencesArg: PslAttributeArgument | undefined","diagnostics: ContractSourceDiagnostic[]","variants: Record<string, { readonly value: string }>","result: ContractField","result","models: Record<string, MongoModelEntry>","collections: Record<string, Record<string, unknown>>","roots: Record<string, string>","allFkRelations: FkRelation[]","backrelationCandidates: BackrelationCandidate[]","fields: Record<string, ContractField>","relations: Record<string, ContractReferenceRelation>","valueObjects: Record<string, ContractValueObject>","capabilities: Record<string, Record<string, boolean>>"],"sources":["../src/psl-helpers.ts","../src/interpreter.ts","../src/scalar-type-descriptors.ts"],"sourcesContent":["import type { PslAttribute, PslAttributeArgument } from '@prisma-next/psl-parser';\nimport { getPositionalArgument, parseQuotedStringLiteral } from '@prisma-next/psl-parser';\n\nexport { getPositionalArgument, parseQuotedStringLiteral };\n\nexport function lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nexport function getAttribute(\n attributes: readonly PslAttribute[],\n name: string,\n): PslAttribute | undefined {\n return attributes.find((attr) => attr.name === name);\n}\n\nexport function getMapName(attributes: readonly PslAttribute[]): string | undefined {\n const mapAttr = getAttribute(attributes, 'map');\n if (!mapAttr) return undefined;\n const arg = mapAttr.args[0];\n if (!arg) return undefined;\n return stripQuotes(arg.value);\n}\n\nexport interface ParsedRelationAttribute {\n readonly relationName?: string;\n readonly fields?: readonly string[];\n readonly references?: readonly string[];\n}\n\nexport function parseRelationAttribute(\n attributes: readonly PslAttribute[],\n): ParsedRelationAttribute | undefined {\n const relationAttr = getAttribute(attributes, 'relation');\n if (!relationAttr) return undefined;\n\n let relationName: string | undefined;\n let fieldsArg: PslAttributeArgument | undefined;\n let referencesArg: PslAttributeArgument | undefined;\n\n for (const arg of relationAttr.args) {\n if (arg.kind === 'positional') {\n relationName = stripQuotes(arg.value);\n } else if (arg.name === 'name') {\n relationName = stripQuotes(arg.value);\n } else if (arg.name === 'fields') {\n fieldsArg = arg;\n } else if (arg.name === 'references') {\n referencesArg = arg;\n }\n }\n\n const fields = fieldsArg ? parseFieldList(fieldsArg.value) : undefined;\n const references = referencesArg ? parseFieldList(referencesArg.value) : undefined;\n\n return {\n ...(relationName !== undefined ? { relationName } : {}),\n ...(fields !== undefined ? { fields } : {}),\n ...(references !== undefined ? { references } : {}),\n };\n}\n\nfunction parseFieldList(value: string): readonly string[] {\n const inner = value.replace(/^\\[/, '').replace(/\\]$/, '').trim();\n if (inner.length === 0) return [];\n return inner.split(',').map((s) => s.trim());\n}\n\nfunction stripQuotes(value: string): string {\n if (value.startsWith('\"') && value.endsWith('\"')) {\n return value.slice(1, -1);\n }\n return value;\n}\n","import type {\n ContractSourceDiagnostic,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport { computeProfileHash, computeStorageHash } from '@prisma-next/contract/hashing';\nimport type {\n Contract,\n ContractField,\n ContractReferenceRelation,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type { ParsePslDocumentResult, PslField, PslModel } from '@prisma-next/psl-parser';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport {\n getAttribute,\n getMapName,\n getPositionalArgument,\n lowerFirst,\n parseQuotedStringLiteral,\n parseRelationAttribute,\n} from './psl-helpers';\n\nexport interface InterpretPslDocumentToMongoContractInput {\n readonly document: ParsePslDocumentResult;\n readonly scalarTypeDescriptors: ReadonlyMap<string, string>;\n}\n\ninterface FieldMappings {\n readonly pslNameToMapped: Map<string, string>;\n}\n\ninterface FkRelation {\n readonly declaringModel: string;\n readonly fieldName: string;\n readonly targetModel: string;\n readonly relationName?: string;\n readonly localFields: readonly string[];\n readonly targetFields: readonly string[];\n}\n\nfunction fkRelationPairKey(declaringModel: string, targetModel: string): string {\n return `${declaringModel}::${targetModel}`;\n}\n\nfunction resolveFieldMappings(model: PslModel): FieldMappings {\n const pslNameToMapped = new Map<string, string>();\n for (const field of model.fields) {\n const mapped = getMapName(field.attributes) ?? field.name;\n pslNameToMapped.set(field.name, mapped);\n }\n return { pslNameToMapped };\n}\n\nfunction resolveCollectionName(model: PslModel): string {\n return getMapName(model.attributes) ?? lowerFirst(model.name);\n}\n\ninterface MongoModelEntry {\n readonly fields: Record<string, ContractField>;\n readonly relations: Record<string, ContractReferenceRelation>;\n readonly storage: { readonly collection: string };\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, { readonly value: string }>;\n readonly base?: string;\n}\n\ntype DiscriminatorDeclaration = { readonly fieldName: string; readonly span: PslModel['span'] };\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly collectionName: string;\n readonly span: PslModel['span'];\n};\n\nfunction collectPolymorphismDeclarations(\n document: ParsePslDocumentResult,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): {\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n} {\n const discriminatorDeclarations = new Map<string, DiscriminatorDeclaration>();\n const baseDeclarations = new Map<string, BaseDeclaration>();\n\n for (const pslModel of document.ast.models) {\n for (const attr of pslModel.attributes) {\n if (attr.name === 'discriminator') {\n const fieldName = getPositionalArgument(attr);\n if (!fieldName) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${pslModel.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = pslModel.fields.find((f) => f.name === fieldName);\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${pslModel.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(pslModel.name, { fieldName, span: attr.span });\n }\n if (attr.name === 'base') {\n const baseName = getPositionalArgument(attr, 0);\n const rawValue = getPositionalArgument(attr, 1);\n if (!baseName || !rawValue) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${pslModel.name}\" @@base requires two arguments: base model name and discriminator value`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const value = parseQuotedStringLiteral(rawValue);\n if (value === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${pslModel.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const collectionName = resolveCollectionName(pslModel);\n baseDeclarations.set(pslModel.name, { baseName, value, collectionName, span: attr.span });\n }\n }\n }\n\n return { discriminatorDeclarations, baseDeclarations };\n}\n\nfunction resolvePolymorphism(input: {\n models: Record<string, MongoModelEntry>;\n roots: Record<string, string>;\n document: ParsePslDocumentResult;\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n modelNames: ReadonlySet<string>;\n sourceId: string;\n}): {\n models: Record<string, MongoModelEntry>;\n roots: Record<string, string>;\n diagnostics: ContractSourceDiagnostic[];\n} {\n const { discriminatorDeclarations, baseDeclarations, modelNames, sourceId, document } = input;\n let patched = input.models;\n let roots = input.roots;\n const diagnostics: ContractSourceDiagnostic[] = [];\n\n for (const [modelName, decl] of discriminatorDeclarations) {\n if (baseDeclarations.has(modelName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_AND_BASE',\n message: `Model \"${modelName}\" cannot have both @@discriminator and @@base`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const model = patched[modelName];\n if (!model) continue;\n\n if (!Object.hasOwn(model.fields, decl.fieldName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_FIELD_NOT_FOUND',\n message: `Discriminator field \"${decl.fieldName}\" is not a field on model \"${modelName}\"`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const variants: Record<string, { readonly value: string }> = {};\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (baseDecl.baseName !== modelName) continue;\n variants[variantName] = { value: baseDecl.value };\n }\n\n if (Object.keys(variants).length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_DISCRIMINATOR',\n message: `Model \"${modelName}\" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n patched = {\n ...patched,\n [modelName]: { ...model, discriminator: { field: decl.fieldName }, variants },\n };\n }\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (!modelNames.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_BASE_TARGET_NOT_FOUND',\n message: `Model \"${variantName}\" @@base references non-existent model \"${baseDecl.baseName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (!discriminatorDeclarations.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BASE',\n message: `Model \"${variantName}\" declares @@base(${baseDecl.baseName}, ...) but \"${baseDecl.baseName}\" has no @@discriminator`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (discriminatorDeclarations.has(variantName)) {\n continue;\n }\n\n const baseModel = patched[baseDecl.baseName];\n const variantPslModel = document.ast.models.find((m) => m.name === variantName);\n if (!variantPslModel) continue;\n const hasExplicitMap = getMapName(variantPslModel.attributes) !== undefined;\n\n if (hasExplicitMap && baseModel && baseDecl.collectionName !== baseModel.storage.collection) {\n diagnostics.push({\n code: 'PSL_MONGO_VARIANT_SEPARATE_COLLECTION',\n message: `Mongo variant \"${variantName}\" cannot use a different collection than its base \"${baseDecl.baseName}\". Mongo only supports single-collection polymorphism.`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n const baseCollection = baseModel?.storage.collection ?? baseDecl.collectionName;\n const variantModel = patched[variantName];\n if (variantModel) {\n patched = {\n ...patched,\n [variantName]: {\n ...variantModel,\n base: baseDecl.baseName,\n storage: { collection: baseCollection },\n },\n };\n }\n\n const variantCollectionName = resolveCollectionName(variantPslModel);\n if (roots[variantCollectionName] === variantName) {\n if (variantCollectionName === baseCollection && baseModel) {\n roots = { ...roots, [variantCollectionName]: baseDecl.baseName };\n } else {\n roots = Object.fromEntries(\n Object.entries(roots).filter(([key]) => key !== variantCollectionName),\n );\n }\n }\n }\n\n return { models: patched, roots, diagnostics };\n}\n\nfunction isRelationField(field: PslField, modelNames: ReadonlySet<string>): boolean {\n return modelNames.has(field.typeName);\n}\n\nfunction resolveFieldCodecId(\n field: PslField,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n): string | undefined {\n return scalarTypeDescriptors.get(field.typeName);\n}\n\nfunction resolveNonRelationField(\n field: PslField,\n ownerName: string,\n compositeTypeNames: ReadonlySet<string>,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): ContractField | undefined {\n if (compositeTypeNames.has(field.typeName)) {\n const result: ContractField = {\n type: { kind: 'valueObject', name: field.typeName },\n nullable: field.optional,\n };\n return field.list ? { ...result, many: true } : result;\n }\n\n const codecId = resolveFieldCodecId(field, scalarTypeDescriptors);\n if (!codecId) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${ownerName}.${field.name}\" type \"${field.typeName}\" is not supported in Mongo PSL interpreter`,\n sourceId,\n span: field.span,\n });\n return undefined;\n }\n\n const result: ContractField = {\n type: { kind: 'scalar', codecId },\n nullable: field.optional,\n };\n return field.list ? { ...result, many: true } : result;\n}\n\nexport function interpretPslDocumentToMongoContract(\n input: InterpretPslDocumentToMongoContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const { document, scalarTypeDescriptors } = input;\n const sourceId = document.ast.sourceId;\n const diagnostics: ContractSourceDiagnostic[] = [];\n const modelNames = new Set(document.ast.models.map((m) => m.name));\n const compositeTypeNames = new Set(document.ast.compositeTypes.map((ct) => ct.name));\n\n const models: Record<string, MongoModelEntry> = {};\n const collections: Record<string, Record<string, unknown>> = {};\n const roots: Record<string, string> = {};\n const allFkRelations: FkRelation[] = [];\n\n interface BackrelationCandidate {\n readonly modelName: string;\n readonly fieldName: string;\n readonly targetModelName: string;\n readonly relationName?: string;\n readonly cardinality: '1:1' | '1:N';\n readonly field: PslField;\n }\n const backrelationCandidates: BackrelationCandidate[] = [];\n\n for (const pslModel of document.ast.models) {\n const collectionName = resolveCollectionName(pslModel);\n const fieldMappings = resolveFieldMappings(pslModel);\n\n const fields: Record<string, ContractField> = {};\n const relations: Record<string, ContractReferenceRelation> = {};\n\n for (const field of pslModel.fields) {\n if (isRelationField(field, modelNames)) {\n const relation = parseRelationAttribute(field.attributes);\n\n if (field.list || !(relation?.fields && relation?.references)) {\n backrelationCandidates.push({\n modelName: pslModel.name,\n fieldName: field.name,\n targetModelName: field.typeName,\n ...(relation?.relationName !== undefined\n ? { relationName: relation.relationName }\n : {}),\n cardinality: field.list ? '1:N' : '1:1',\n field,\n });\n continue;\n }\n\n if (relation?.fields && relation?.references) {\n const localMapped = relation.fields.map((f) => fieldMappings.pslNameToMapped.get(f) ?? f);\n\n const targetModel = document.ast.models.find((m) => m.name === field.typeName);\n const targetFieldMappings = targetModel ? resolveFieldMappings(targetModel) : undefined;\n const targetMapped = relation.references.map(\n (f) => targetFieldMappings?.pslNameToMapped.get(f) ?? f,\n );\n\n relations[field.name] = {\n to: field.typeName,\n cardinality: 'N:1' as const,\n on: {\n localFields: localMapped,\n targetFields: targetMapped,\n },\n };\n\n allFkRelations.push({\n declaringModel: pslModel.name,\n fieldName: field.name,\n targetModel: field.typeName,\n ...(relation.relationName !== undefined ? { relationName: relation.relationName } : {}),\n localFields: localMapped,\n targetFields: targetMapped,\n });\n }\n continue;\n }\n\n const resolved = resolveNonRelationField(\n field,\n pslModel.name,\n compositeTypeNames,\n scalarTypeDescriptors,\n sourceId,\n diagnostics,\n );\n if (!resolved) continue;\n\n const mappedName = fieldMappings.pslNameToMapped.get(field.name) ?? field.name;\n fields[mappedName] = resolved;\n }\n\n const isVariantModel = pslModel.attributes.some((attr) => attr.name === 'base');\n const hasIdField = pslModel.fields.some((f) => getAttribute(f.attributes, 'id') !== undefined);\n if (!hasIdField && !isVariantModel) {\n diagnostics.push({\n code: 'PSL_MISSING_ID_FIELD',\n message: `Model \"${pslModel.name}\" has no field with @id attribute. Every model must have exactly one @id field.`,\n sourceId,\n });\n }\n\n models[pslModel.name] = { fields, relations, storage: { collection: collectionName } };\n collections[collectionName] = {};\n roots[collectionName] = pslModel.name;\n }\n\n const valueObjects: Record<string, ContractValueObject> = {};\n for (const compositeType of document.ast.compositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of compositeType.fields) {\n const resolved = resolveNonRelationField(\n field,\n compositeType.name,\n compositeTypeNames,\n scalarTypeDescriptors,\n sourceId,\n diagnostics,\n );\n if (!resolved) continue;\n fields[field.name] = resolved;\n }\n valueObjects[compositeType.name] = { fields };\n }\n\n const fkRelationsByPair = new Map<string, FkRelation[]>();\n for (const fk of allFkRelations) {\n const key = fkRelationPairKey(fk.declaringModel, fk.targetModel);\n const existing = fkRelationsByPair.get(key);\n if (existing) {\n existing.push(fk);\n } else {\n fkRelationsByPair.set(key, [fk]);\n }\n }\n\n for (const candidate of backrelationCandidates) {\n const pairKey = fkRelationPairKey(candidate.targetModelName, candidate.modelName);\n const pairMatches = fkRelationsByPair.get(pairKey) ?? [];\n const matches = candidate.relationName\n ? pairMatches.filter((r) => r.relationName === candidate.relationName)\n : [...pairMatches];\n\n if (matches.length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BACKRELATION',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.fieldName}\" has no matching FK-side relation on model \"${candidate.targetModelName}\". Add @relation(fields: [...], references: [...]) on the FK-side relation or use an explicit join model for many-to-many.`,\n sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n if (matches.length > 1) {\n diagnostics.push({\n code: 'PSL_AMBIGUOUS_BACKRELATION',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.fieldName}\" matches multiple FK-side relations on model \"${candidate.targetModelName}\". Add @relation(\"...\") to both sides to disambiguate.`,\n sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n\n const fk = matches[0];\n if (!fk) continue;\n const modelEntry = models[candidate.modelName];\n if (!modelEntry) continue;\n modelEntry.relations[candidate.fieldName] = {\n to: candidate.targetModelName,\n cardinality: candidate.cardinality,\n on: {\n localFields: fk.targetFields,\n targetFields: fk.localFields,\n },\n };\n }\n\n const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(\n document,\n sourceId,\n diagnostics,\n );\n const polyResult = resolvePolymorphism({\n models,\n roots,\n document,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n sourceId,\n });\n\n if (diagnostics.length > 0 || polyResult.diagnostics.length > 0) {\n return notOk({\n summary: 'PSL to Mongo contract interpretation failed',\n diagnostics: [...diagnostics, ...polyResult.diagnostics],\n });\n }\n\n const target = 'mongo';\n const targetFamily = 'mongo';\n const storageWithoutHash = { collections };\n const storageHash = computeStorageHash({ target, targetFamily, storage: storageWithoutHash });\n const capabilities: Record<string, Record<string, boolean>> = {};\n\n return ok({\n targetFamily,\n target,\n roots: polyResult.roots,\n models: polyResult.models,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n storage: { ...storageWithoutHash, storageHash },\n extensionPacks: {},\n capabilities,\n profileHash: computeProfileHash({ target, targetFamily, capabilities }),\n meta: {},\n });\n}\n","export function createMongoScalarTypeDescriptors(): ReadonlyMap<string, string> {\n return new Map<string, string>([\n ['String', 'mongo/string@1'],\n ['Int', 'mongo/int32@1'],\n ['Boolean', 'mongo/bool@1'],\n ['DateTime', 'mongo/date@1'],\n ['ObjectId', 'mongo/objectId@1'],\n ]);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-contract-psl",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.3.0-dev.146",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "PSL-to-Mongo ContractIR interpreter for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"pathe": "^2.0.3",
|
|
9
|
-
"@prisma-next/config": "0.0.
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/utils": "0.0.
|
|
9
|
+
"@prisma-next/config": "0.3.0-dev.146",
|
|
10
|
+
"@prisma-next/contract": "0.3.0-dev.146",
|
|
11
|
+
"@prisma-next/psl-parser": "0.3.0-dev.146",
|
|
12
|
+
"@prisma-next/utils": "0.3.0-dev.146"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"tsdown": "0.18.4",
|