@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.
@@ -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"}
@@ -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,3 @@
1
+ import { n as interpretPslDocumentToMongoContract, t as createMongoScalarTypeDescriptors } from "./scalar-type-descriptors-Bou6SVVa.mjs";
2
+
3
+ export { createMongoScalarTypeDescriptors, interpretPslDocumentToMongoContract };
@@ -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":";;;;;AAKA,SAAgB,WAAW,OAAuB;AAChD,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAO,MAAM,IAAI,aAAa,GAAG,MAAM,MAAM,EAAE;;AAGjD,SAAgB,aACd,YACA,MAC0B;AAC1B,QAAO,WAAW,MAAM,SAAS,KAAK,SAAS,KAAK;;AAGtD,SAAgB,WAAW,YAAyD;CAClF,MAAM,UAAU,aAAa,YAAY,MAAM;AAC/C,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,MAAM,QAAQ,KAAK;AACzB,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,YAAY,IAAI,MAAM;;AAS/B,SAAgB,uBACd,YACqC;CACrC,MAAM,eAAe,aAAa,YAAY,WAAW;AACzD,KAAI,CAAC,aAAc,QAAO;CAE1B,IAAIA;CACJ,IAAIC;CACJ,IAAIC;AAEJ,MAAK,MAAM,OAAO,aAAa,KAC7B,KAAI,IAAI,SAAS,aACf,gBAAe,YAAY,IAAI,MAAM;UAC5B,IAAI,SAAS,OACtB,gBAAe,YAAY,IAAI,MAAM;UAC5B,IAAI,SAAS,SACtB,aAAY;UACH,IAAI,SAAS,aACtB,iBAAgB;CAIpB,MAAM,SAAS,YAAY,eAAe,UAAU,MAAM,GAAG;CAC7D,MAAM,aAAa,gBAAgB,eAAe,cAAc,MAAM,GAAG;AAEzE,QAAO;EACL,GAAI,iBAAiB,SAAY,EAAE,cAAc,GAAG,EAAE;EACtD,GAAI,WAAW,SAAY,EAAE,QAAQ,GAAG,EAAE;EAC1C,GAAI,eAAe,SAAY,EAAE,YAAY,GAAG,EAAE;EACnD;;AAGH,SAAS,eAAe,OAAkC;CACxD,MAAM,QAAQ,MAAM,QAAQ,OAAO,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM;AAChE,KAAI,MAAM,WAAW,EAAG,QAAO,EAAE;AACjC,QAAO,MAAM,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;;AAG9C,SAAS,YAAY,OAAuB;AAC1C,KAAI,MAAM,WAAW,KAAI,IAAI,MAAM,SAAS,KAAI,CAC9C,QAAO,MAAM,MAAM,GAAG,GAAG;AAE3B,QAAO;;;;;ACjCT,SAAS,kBAAkB,gBAAwB,aAA6B;AAC9E,QAAO,GAAG,eAAe,IAAI;;AAG/B,SAAS,qBAAqB,OAAgC;CAC5D,MAAM,kCAAkB,IAAI,KAAqB;AACjD,MAAK,MAAM,SAAS,MAAM,QAAQ;EAChC,MAAM,SAAS,WAAW,MAAM,WAAW,IAAI,MAAM;AACrD,kBAAgB,IAAI,MAAM,MAAM,OAAO;;AAEzC,QAAO,EAAE,iBAAiB;;AAG5B,SAAS,sBAAsB,OAAyB;AACtD,QAAO,WAAW,MAAM,WAAW,IAAI,WAAW,MAAM,KAAK;;AAoB/D,SAAS,gCACP,UACA,UACA,aAIA;CACA,MAAM,4CAA4B,IAAI,KAAuC;CAC7E,MAAM,mCAAmB,IAAI,KAA8B;AAE3D,MAAK,MAAM,YAAY,SAAS,IAAI,OAClC,MAAK,MAAM,QAAQ,SAAS,YAAY;AACtC,MAAI,KAAK,SAAS,iBAAiB;GACjC,MAAM,YAAY,sBAAsB,KAAK;AAC7C,OAAI,CAAC,WAAW;AACd,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,SAAS,KAAK;KACjC;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;GAEF,MAAM,YAAY,SAAS,OAAO,MAAM,MAAM,EAAE,SAAS,UAAU;AACnE,OAAI,aAAa,UAAU,aAAa,UAAU;AAChD,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,wBAAwB,UAAU,cAAc,SAAS,KAAK,oCAAoC,UAAU,SAAS;KAC9H;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;AAEF,6BAA0B,IAAI,SAAS,MAAM;IAAE;IAAW,MAAM,KAAK;IAAM,CAAC;;AAE9E,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,WAAW,sBAAsB,MAAM,EAAE;GAC/C,MAAM,WAAW,sBAAsB,MAAM,EAAE;AAC/C,OAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,SAAS,KAAK;KACjC;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;GAEF,MAAM,QAAQ,yBAAyB,SAAS;AAChD,OAAI,UAAU,QAAW;AACvB,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,SAAS,KAAK;KACjC;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;GAEF,MAAM,iBAAiB,sBAAsB,SAAS;AACtD,oBAAiB,IAAI,SAAS,MAAM;IAAE;IAAU;IAAO;IAAgB,MAAM,KAAK;IAAM,CAAC;;;AAK/F,QAAO;EAAE;EAA2B;EAAkB;;AAGxD,SAAS,oBAAoB,OAY3B;CACA,MAAM,EAAE,2BAA2B,kBAAkB,YAAY,UAAU,aAAa;CACxF,IAAI,UAAU,MAAM;CACpB,IAAI,QAAQ,MAAM;CAClB,MAAMC,cAA0C,EAAE;AAElD,MAAK,MAAM,CAAC,WAAW,SAAS,2BAA2B;AACzD,MAAI,iBAAiB,IAAI,UAAU,EAAE;AACnC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU;IAC7B;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;EAGF,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MAAO;AAEZ,MAAI,CAAC,OAAO,OAAO,MAAM,QAAQ,KAAK,UAAU,EAAE;AAChD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,wBAAwB,KAAK,UAAU,6BAA6B,UAAU;IACvF;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;EAGF,MAAMC,WAAuD,EAAE;AAC/D,OAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;AACtD,OAAI,SAAS,aAAa,UAAW;AACrC,YAAS,eAAe,EAAE,OAAO,SAAS,OAAO;;AAGnD,MAAI,OAAO,KAAK,SAAS,CAAC,WAAW,GAAG;AACtC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU,6DAA6D,UAAU;IACpG;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;AAGF,YAAU;GACR,GAAG;IACF,YAAY;IAAE,GAAG;IAAO,eAAe,EAAE,OAAO,KAAK,WAAW;IAAE;IAAU;GAC9E;;AAGH,MAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;AACtD,MAAI,CAAC,WAAW,IAAI,SAAS,SAAS,EAAE;AACtC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,0CAA0C,SAAS,SAAS;IAC3F;IACA,MAAM,SAAS;IAChB,CAAC;AACF;;AAGF,MAAI,CAAC,0BAA0B,IAAI,SAAS,SAAS,EAAE;AACrD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,oBAAoB,SAAS,SAAS,cAAc,SAAS,SAAS;IACrG;IACA,MAAM,SAAS;IAChB,CAAC;AACF;;AAGF,MAAI,0BAA0B,IAAI,YAAY,CAC5C;EAGF,MAAM,YAAY,QAAQ,SAAS;EACnC,MAAM,kBAAkB,SAAS,IAAI,OAAO,MAAM,MAAM,EAAE,SAAS,YAAY;AAC/E,MAAI,CAAC,gBAAiB;AAGtB,MAFuB,WAAW,gBAAgB,WAAW,KAAK,UAE5C,aAAa,SAAS,mBAAmB,UAAU,QAAQ,YAAY;AAC3F,eAAY,KAAK;IACf,MAAM;IACN,SAAS,kBAAkB,YAAY,qDAAqD,SAAS,SAAS;IAC9G;IACA,MAAM,SAAS;IAChB,CAAC;AACF;;EAGF,MAAM,iBAAiB,WAAW,QAAQ,cAAc,SAAS;EACjE,MAAM,eAAe,QAAQ;AAC7B,MAAI,aACF,WAAU;GACR,GAAG;IACF,cAAc;IACb,GAAG;IACH,MAAM,SAAS;IACf,SAAS,EAAE,YAAY,gBAAgB;IACxC;GACF;EAGH,MAAM,wBAAwB,sBAAsB,gBAAgB;AACpE,MAAI,MAAM,2BAA2B,YACnC,KAAI,0BAA0B,kBAAkB,UAC9C,SAAQ;GAAE,GAAG;IAAQ,wBAAwB,SAAS;GAAU;MAEhE,SAAQ,OAAO,YACb,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,SAAS,QAAQ,sBAAsB,CACvE;;AAKP,QAAO;EAAE,QAAQ;EAAS;EAAO;EAAa;;AAGhD,SAAS,gBAAgB,OAAiB,YAA0C;AAClF,QAAO,WAAW,IAAI,MAAM,SAAS;;AAGvC,SAAS,oBACP,OACA,uBACoB;AACpB,QAAO,sBAAsB,IAAI,MAAM,SAAS;;AAGlD,SAAS,wBACP,OACA,WACA,oBACA,uBACA,UACA,aAC2B;AAC3B,KAAI,mBAAmB,IAAI,MAAM,SAAS,EAAE;EAC1C,MAAMC,WAAwB;GAC5B,MAAM;IAAE,MAAM;IAAe,MAAM,MAAM;IAAU;GACnD,UAAU,MAAM;GACjB;AACD,SAAO,MAAM,OAAO;GAAE,GAAGC;GAAQ,MAAM;GAAM,GAAGA;;CAGlD,MAAM,UAAU,oBAAoB,OAAO,sBAAsB;AACjE,KAAI,CAAC,SAAS;AACZ,cAAY,KAAK;GACf,MAAM;GACN,SAAS,UAAU,UAAU,GAAG,MAAM,KAAK,UAAU,MAAM,SAAS;GACpE;GACA,MAAM,MAAM;GACb,CAAC;AACF;;CAGF,MAAMD,SAAwB;EAC5B,MAAM;GAAE,MAAM;GAAU;GAAS;EACjC,UAAU,MAAM;EACjB;AACD,QAAO,MAAM,OAAO;EAAE,GAAG;EAAQ,MAAM;EAAM,GAAG;;AAGlD,SAAgB,oCACd,OAC6C;CAC7C,MAAM,EAAE,UAAU,0BAA0B;CAC5C,MAAM,WAAW,SAAS,IAAI;CAC9B,MAAMF,cAA0C,EAAE;CAClD,MAAM,aAAa,IAAI,IAAI,SAAS,IAAI,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC;CAClE,MAAM,qBAAqB,IAAI,IAAI,SAAS,IAAI,eAAe,KAAK,OAAO,GAAG,KAAK,CAAC;CAEpF,MAAMI,SAA0C,EAAE;CAClD,MAAMC,cAAuD,EAAE;CAC/D,MAAMC,QAAgC,EAAE;CACxC,MAAMC,iBAA+B,EAAE;CAUvC,MAAMC,yBAAkD,EAAE;AAE1D,MAAK,MAAM,YAAY,SAAS,IAAI,QAAQ;EAC1C,MAAM,iBAAiB,sBAAsB,SAAS;EACtD,MAAM,gBAAgB,qBAAqB,SAAS;EAEpD,MAAMC,SAAwC,EAAE;EAChD,MAAMC,YAAuD,EAAE;AAE/D,OAAK,MAAM,SAAS,SAAS,QAAQ;AACnC,OAAI,gBAAgB,OAAO,WAAW,EAAE;IACtC,MAAM,WAAW,uBAAuB,MAAM,WAAW;AAEzD,QAAI,MAAM,QAAQ,EAAE,UAAU,UAAU,UAAU,aAAa;AAC7D,4BAAuB,KAAK;MAC1B,WAAW,SAAS;MACpB,WAAW,MAAM;MACjB,iBAAiB,MAAM;MACvB,GAAI,UAAU,iBAAiB,SAC3B,EAAE,cAAc,SAAS,cAAc,GACvC,EAAE;MACN,aAAa,MAAM,OAAO,QAAQ;MAClC;MACD,CAAC;AACF;;AAGF,QAAI,UAAU,UAAU,UAAU,YAAY;KAC5C,MAAM,cAAc,SAAS,OAAO,KAAK,MAAM,cAAc,gBAAgB,IAAI,EAAE,IAAI,EAAE;KAEzF,MAAM,cAAc,SAAS,IAAI,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM,SAAS;KAC9E,MAAM,sBAAsB,cAAc,qBAAqB,YAAY,GAAG;KAC9E,MAAM,eAAe,SAAS,WAAW,KACtC,MAAM,qBAAqB,gBAAgB,IAAI,EAAE,IAAI,EACvD;AAED,eAAU,MAAM,QAAQ;MACtB,IAAI,MAAM;MACV,aAAa;MACb,IAAI;OACF,aAAa;OACb,cAAc;OACf;MACF;AAED,oBAAe,KAAK;MAClB,gBAAgB,SAAS;MACzB,WAAW,MAAM;MACjB,aAAa,MAAM;MACnB,GAAI,SAAS,iBAAiB,SAAY,EAAE,cAAc,SAAS,cAAc,GAAG,EAAE;MACtF,aAAa;MACb,cAAc;MACf,CAAC;;AAEJ;;GAGF,MAAM,WAAW,wBACf,OACA,SAAS,MACT,oBACA,uBACA,UACA,YACD;AACD,OAAI,CAAC,SAAU;GAEf,MAAM,aAAa,cAAc,gBAAgB,IAAI,MAAM,KAAK,IAAI,MAAM;AAC1E,UAAO,cAAc;;EAGvB,MAAM,iBAAiB,SAAS,WAAW,MAAM,SAAS,KAAK,SAAS,OAAO;AAE/E,MAAI,CADe,SAAS,OAAO,MAAM,MAAM,aAAa,EAAE,YAAY,KAAK,KAAK,OAAU,IAC3E,CAAC,eAClB,aAAY,KAAK;GACf,MAAM;GACN,SAAS,UAAU,SAAS,KAAK;GACjC;GACD,CAAC;AAGJ,SAAO,SAAS,QAAQ;GAAE;GAAQ;GAAW,SAAS,EAAE,YAAY,gBAAgB;GAAE;AACtF,cAAY,kBAAkB,EAAE;AAChC,QAAM,kBAAkB,SAAS;;CAGnC,MAAMC,eAAoD,EAAE;AAC5D,MAAK,MAAM,iBAAiB,SAAS,IAAI,gBAAgB;EACvD,MAAMF,SAAwC,EAAE;AAChD,OAAK,MAAM,SAAS,cAAc,QAAQ;GACxC,MAAM,WAAW,wBACf,OACA,cAAc,MACd,oBACA,uBACA,UACA,YACD;AACD,OAAI,CAAC,SAAU;AACf,UAAO,MAAM,QAAQ;;AAEvB,eAAa,cAAc,QAAQ,EAAE,QAAQ;;CAG/C,MAAM,oCAAoB,IAAI,KAA2B;AACzD,MAAK,MAAM,MAAM,gBAAgB;EAC/B,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,YAAY;EAChE,MAAM,WAAW,kBAAkB,IAAI,IAAI;AAC3C,MAAI,SACF,UAAS,KAAK,GAAG;MAEjB,mBAAkB,IAAI,KAAK,CAAC,GAAG,CAAC;;AAIpC,MAAK,MAAM,aAAa,wBAAwB;EAC9C,MAAM,UAAU,kBAAkB,UAAU,iBAAiB,UAAU,UAAU;EACjF,MAAM,cAAc,kBAAkB,IAAI,QAAQ,IAAI,EAAE;EACxD,MAAM,UAAU,UAAU,eACtB,YAAY,QAAQ,MAAM,EAAE,iBAAiB,UAAU,aAAa,GACpE,CAAC,GAAG,YAAY;AAEpB,MAAI,QAAQ,WAAW,GAAG;AACxB,eAAY,KAAK;IACf,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,UAAU,+CAA+C,UAAU,gBAAgB;IACzJ;IACA,MAAM,UAAU,MAAM;IACvB,CAAC;AACF;;AAEF,MAAI,QAAQ,SAAS,GAAG;AACtB,eAAY,KAAK;IACf,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,UAAU,iDAAiD,UAAU,gBAAgB;IAC3J;IACA,MAAM,UAAU,MAAM;IACvB,CAAC;AACF;;EAGF,MAAM,KAAK,QAAQ;AACnB,MAAI,CAAC,GAAI;EACT,MAAM,aAAa,OAAO,UAAU;AACpC,MAAI,CAAC,WAAY;AACjB,aAAW,UAAU,UAAU,aAAa;GAC1C,IAAI,UAAU;GACd,aAAa,UAAU;GACvB,IAAI;IACF,aAAa,GAAG;IAChB,cAAc,GAAG;IAClB;GACF;;CAGH,MAAM,EAAE,2BAA2B,qBAAqB,gCACtD,UACA,UACA,YACD;CACD,MAAM,aAAa,oBAAoB;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,KAAI,YAAY,SAAS,KAAK,WAAW,YAAY,SAAS,EAC5D,QAAO,MAAM;EACX,SAAS;EACT,aAAa,CAAC,GAAG,aAAa,GAAG,WAAW,YAAY;EACzD,CAAC;CAGJ,MAAM,SAAS;CACf,MAAM,eAAe;CACrB,MAAM,qBAAqB,EAAE,aAAa;CAC1C,MAAM,cAAc,mBAAmB;EAAE;EAAQ;EAAc,SAAS;EAAoB,CAAC;CAC7F,MAAMG,eAAwD,EAAE;AAEhE,QAAO,GAAG;EACR;EACA;EACA,OAAO,WAAW;EAClB,QAAQ,WAAW;EACnB,GAAI,OAAO,KAAK,aAAa,CAAC,SAAS,IAAI,EAAE,cAAc,GAAG,EAAE;EAChE,SAAS;GAAE,GAAG;GAAoB;GAAa;EAC/C,gBAAgB,EAAE;EAClB;EACA,aAAa,mBAAmB;GAAE;GAAQ;GAAc;GAAc,CAAC;EACvE,MAAM,EAAE;EACT,CAAC;;;;;ACthBJ,SAAgB,mCAAgE;AAC9E,QAAO,IAAI,IAAoB;EAC7B,CAAC,UAAU,iBAAiB;EAC5B,CAAC,OAAO,gBAAgB;EACxB,CAAC,WAAW,eAAe;EAC3B,CAAC,YAAY,eAAe;EAC5B,CAAC,YAAY,mBAAmB;EACjC,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-contract-psl",
3
- "version": "0.0.1",
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.1",
10
- "@prisma-next/psl-parser": "0.0.1",
11
- "@prisma-next/contract": "0.0.1",
12
- "@prisma-next/utils": "0.0.1"
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",