@prisma-next/mongo-contract-psl 0.14.0-dev.35 → 0.14.0-dev.37
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 +5 -0
- package/dist/exports/provider.d.mts.map +1 -1
- package/dist/exports/provider.mjs +3 -2
- package/dist/exports/provider.mjs.map +1 -1
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{interpreter-WfZjKUyx.mjs → interpreter-D0vfRJ7f.mjs} +2 -1
- package/dist/interpreter-D0vfRJ7f.mjs.map +1 -0
- package/package.json +12 -12
- package/src/interpreter.ts +3 -0
- package/src/provider.ts +3 -0
- package/dist/interpreter-WfZjKUyx.mjs.map +0 -1
|
@@ -3,6 +3,11 @@ import { ContractConfig } from "@prisma-next/config/config-types";
|
|
|
3
3
|
//#region src/provider.d.ts
|
|
4
4
|
interface MongoContractOptions {
|
|
5
5
|
readonly output?: string;
|
|
6
|
+
/** The target's default codec ids for an `enum` block that omits `@@type`. */
|
|
7
|
+
readonly enumInferenceCodecs?: {
|
|
8
|
+
readonly text: string;
|
|
9
|
+
readonly int: string;
|
|
10
|
+
};
|
|
6
11
|
}
|
|
7
12
|
declare function mongoContract(schemaPath: string, options?: MongoContractOptions): ContractConfig;
|
|
8
13
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../src/provider.ts"],"mappings":";;;UAUiB,oBAAA;EAAA,SACN,
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../src/provider.ts"],"mappings":";;;UAUiB,oBAAA;EAAA,SACN,MAAA;EADM;EAAA,SAGN,mBAAA;IAAA,SAAiC,IAAA;IAAA,SAAuB,GAAA;EAAA;AAAA;AAAA,iBAgBnD,aAAA,CAAc,UAAA,UAAoB,OAAA,GAAU,oBAAA,GAAuB,cAAc"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as interpretPslDocumentToMongoContract } from "../interpreter-
|
|
1
|
+
import { t as interpretPslDocumentToMongoContract } from "../interpreter-D0vfRJ7f.mjs";
|
|
2
2
|
import { buildSymbolTable, rangeToPslSpan } from "@prisma-next/psl-parser";
|
|
3
3
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
4
|
import { notOk, ok } from "@prisma-next/utils/result";
|
|
@@ -54,7 +54,8 @@ function mongoContract(schemaPath, options) {
|
|
|
54
54
|
seedDiagnostics: [...mapParseDiagnostics(parseDiagnostics, sourceFile, schemaPath), ...mapParseDiagnostics(symbolTableDiagnostics, sourceFile, schemaPath)],
|
|
55
55
|
scalarTypeDescriptors: context.scalarTypeDescriptors,
|
|
56
56
|
codecLookup: context.codecLookup,
|
|
57
|
-
authoringContributions: context.authoringContributions
|
|
57
|
+
authoringContributions: context.authoringContributions,
|
|
58
|
+
...ifDefined("enumInferenceCodecs", options?.enumInferenceCodecs)
|
|
58
59
|
});
|
|
59
60
|
if (!interpreted.ok) return interpreted;
|
|
60
61
|
return ok(interpreted.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":[],"sources":["../../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport { buildSymbolTable, rangeToPslSpan } from '@prisma-next/psl-parser';\nimport type { ParseDiagnostic, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { parse } from '@prisma-next/psl-parser/syntax';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\n\nimport { interpretPslDocumentToMongoContract } from './interpreter';\n\nexport interface MongoContractOptions {\n readonly output?: string;\n}\n\nfunction mapParseDiagnostics(\n diagnostics: readonly ParseDiagnostic[],\n sourceFile: SourceFile,\n sourceId: string,\n): ContractSourceDiagnostic[] {\n return diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId,\n span: rangeToPslSpan(diagnostic.range, sourceFile),\n }));\n}\n\nexport function mongoContract(schemaPath: string, options?: MongoContractOptions): ContractConfig {\n return {\n source: {\n sourceFormat: 'psl',\n inputs: [schemaPath],\n load: async (context) => {\n const [absoluteSchemaPath] = context.resolvedInputs;\n if (absoluteSchemaPath === undefined) {\n throw new Error(\n 'mongoContract: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\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, sourceFile, diagnostics: parseDiagnostics } = parse(schema);\n const { table: symbolTable, diagnostics: symbolTableDiagnostics } = buildSymbolTable({\n document,\n sourceFile,\n scalarTypes: [...context.scalarTypeDescriptors.keys()],\n pslBlockDescriptors: context.authoringContributions.pslBlockDescriptors,\n });\n\n // Do not short-circuit on provider-level diagnostics; recovered CST can\n // still produce interpreter diagnostics in the same response.\n const seedDiagnostics = [\n ...mapParseDiagnostics(parseDiagnostics, sourceFile, schemaPath),\n ...mapParseDiagnostics(symbolTableDiagnostics, sourceFile, schemaPath),\n ];\n\n const interpreted = interpretPslDocumentToMongoContract({\n symbolTable,\n sourceFile,\n sourceId: schemaPath,\n seedDiagnostics,\n scalarTypeDescriptors: context.scalarTypeDescriptors,\n codecLookup: context.codecLookup,\n authoringContributions: context.authoringContributions,\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n },\n ...ifDefined('output', options?.output),\n };\n}\n"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":[],"sources":["../../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport { buildSymbolTable, rangeToPslSpan } from '@prisma-next/psl-parser';\nimport type { ParseDiagnostic, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { parse } from '@prisma-next/psl-parser/syntax';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\n\nimport { interpretPslDocumentToMongoContract } from './interpreter';\n\nexport interface MongoContractOptions {\n readonly output?: string;\n /** The target's default codec ids for an `enum` block that omits `@@type`. */\n readonly enumInferenceCodecs?: { readonly text: string; readonly int: string };\n}\n\nfunction mapParseDiagnostics(\n diagnostics: readonly ParseDiagnostic[],\n sourceFile: SourceFile,\n sourceId: string,\n): ContractSourceDiagnostic[] {\n return diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId,\n span: rangeToPslSpan(diagnostic.range, sourceFile),\n }));\n}\n\nexport function mongoContract(schemaPath: string, options?: MongoContractOptions): ContractConfig {\n return {\n source: {\n sourceFormat: 'psl',\n inputs: [schemaPath],\n load: async (context) => {\n const [absoluteSchemaPath] = context.resolvedInputs;\n if (absoluteSchemaPath === undefined) {\n throw new Error(\n 'mongoContract: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\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, sourceFile, diagnostics: parseDiagnostics } = parse(schema);\n const { table: symbolTable, diagnostics: symbolTableDiagnostics } = buildSymbolTable({\n document,\n sourceFile,\n scalarTypes: [...context.scalarTypeDescriptors.keys()],\n pslBlockDescriptors: context.authoringContributions.pslBlockDescriptors,\n });\n\n // Do not short-circuit on provider-level diagnostics; recovered CST can\n // still produce interpreter diagnostics in the same response.\n const seedDiagnostics = [\n ...mapParseDiagnostics(parseDiagnostics, sourceFile, schemaPath),\n ...mapParseDiagnostics(symbolTableDiagnostics, sourceFile, schemaPath),\n ];\n\n const interpreted = interpretPslDocumentToMongoContract({\n symbolTable,\n sourceFile,\n sourceId: schemaPath,\n seedDiagnostics,\n scalarTypeDescriptors: context.scalarTypeDescriptors,\n codecLookup: context.codecLookup,\n authoringContributions: context.authoringContributions,\n ...ifDefined('enumInferenceCodecs', options?.enumInferenceCodecs),\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n },\n ...ifDefined('output', options?.output),\n };\n}\n"],"mappings":";;;;;;;AAgBA,SAAS,oBACP,aACA,YACA,UAC4B;CAC5B,OAAO,YAAY,KAAK,gBAAgB;EACtC,MAAM,WAAW;EACjB,SAAS,WAAW;EACpB;EACA,MAAM,eAAe,WAAW,OAAO,UAAU;CACnD,EAAE;AACJ;AAEA,SAAgB,cAAc,YAAoB,SAAgD;CAChG,OAAO;EACL,QAAQ;GACN,cAAc;GACd,QAAQ,CAAC,UAAU;GACnB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,sBAAsB,QAAQ;IACrC,IAAI,uBAAuB,KAAA,GACzB,MAAM,IAAI,MACR,iIACF;IAEF,IAAI;IACJ,IAAI;KACF,SAAS,MAAM,SAAS,oBAAoB,OAAO;IACrD,SAAS,OAAO;KACd,MAAM,UAAU,OAAO,KAAK;KAC5B,OAAO,MAAM;MACX,SAAS,oCAAoC,WAAW;MACxD,aAAa,CACX;OACE,MAAM;OACN;OACA,UAAU;MACZ,CACF;MACA,MAAM;OAAE;OAAY;OAAoB,OAAO;MAAQ;KACzD,CAAC;IACH;IAEA,MAAM,EAAE,UAAU,YAAY,aAAa,qBAAqB,MAAM,MAAM;IAC5E,MAAM,EAAE,OAAO,aAAa,aAAa,2BAA2B,iBAAiB;KACnF;KACA;KACA,aAAa,CAAC,GAAG,QAAQ,sBAAsB,KAAK,CAAC;KACrD,qBAAqB,QAAQ,uBAAuB;IACtD,CAAC;IASD,MAAM,cAAc,oCAAoC;KACtD;KACA;KACA,UAAU;KACV,iBAAA,CARA,GAAG,oBAAoB,kBAAkB,YAAY,UAAU,GAC/D,GAAG,oBAAoB,wBAAwB,YAAY,UAAU,CAOvD;KACd,uBAAuB,QAAQ;KAC/B,aAAa,QAAQ;KACrB,wBAAwB,QAAQ;KAChC,GAAG,UAAU,uBAAuB,SAAS,mBAAmB;IAClE,CAAC;IACD,IAAI,CAAC,YAAY,IACf,OAAO;IAGT,OAAO,GAAG,YAAY,KAAK;GAC7B;EACF;EACA,GAAG,UAAU,UAAU,SAAS,MAAM;CACxC;AACF"}
|
package/dist/index.d.mts
CHANGED
|
@@ -32,6 +32,11 @@ interface InterpretPslDocumentToMongoContractInput {
|
|
|
32
32
|
readonly codecLookup?: CodecLookup;
|
|
33
33
|
readonly seedDiagnostics?: readonly ContractSourceDiagnostic[];
|
|
34
34
|
readonly authoringContributions?: AuthoringContributions;
|
|
35
|
+
/** The target's default codec ids for an `enum` block that omits `@@type`. */
|
|
36
|
+
readonly enumInferenceCodecs?: {
|
|
37
|
+
readonly text: string;
|
|
38
|
+
readonly int: string;
|
|
39
|
+
};
|
|
35
40
|
}
|
|
36
41
|
declare function interpretPslDocumentToMongoContract(input: InterpretPslDocumentToMongoContractInput): Result<Contract, ContractSourceDiagnostics>;
|
|
37
42
|
//#endregion
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/derive-json-schema.ts","../src/interpreter.ts"],"mappings":";;;;;;;;;;;;;;;KASY,cAAA,GAAiB,MAAM;EAAA,SAAoB,MAAA,WAAiB,SAAA;AAAA;AAAA,iBA2FxD,gBAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,GACvB,YAAA,GAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,EACd,SAAA,GAAY,cAAA,GACX,cAAA;AAAA,UAQc,kBAAA;EAAA,SACN,kBAAA;EAAA,SACA,MAAA,EAAQ,MAAM,SAAS,aAAA;AAAA;AAAA,iBAGlB,2BAAA,CACd,UAAA,EAAY,MAAA,SAAe,aAAA,GAC3B,kBAAA,UACA,QAAA,WAAmB,kBAAA,IACnB,YAAA,GAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,EACd,SAAA,GAAY,cAAA,GACX,cAAA;;;UC3Cc,wCAAA;EAAA,SACN,WAAA,EAAa,WAAA;EAAA,SACb,UAAA,EAAY,UAAA;EAAA,SACZ,QAAA;EAAA,SACA,qBAAA,EAAuB,WAAA;EAAA,SACvB,WAAA,GAAc,WAAA;EAAA,SACd,eAAA,YAA2B,wBAAA;EAAA,SAC3B,sBAAA,GAAyB,sBAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/derive-json-schema.ts","../src/interpreter.ts"],"mappings":";;;;;;;;;;;;;;;KASY,cAAA,GAAiB,MAAM;EAAA,SAAoB,MAAA,WAAiB,SAAA;AAAA;AAAA,iBA2FxD,gBAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,GACvB,YAAA,GAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,EACd,SAAA,GAAY,cAAA,GACX,cAAA;AAAA,UAQc,kBAAA;EAAA,SACN,kBAAA;EAAA,SACA,MAAA,EAAQ,MAAM,SAAS,aAAA;AAAA;AAAA,iBAGlB,2BAAA,CACd,UAAA,EAAY,MAAA,SAAe,aAAA,GAC3B,kBAAA,UACA,QAAA,WAAmB,kBAAA,IACnB,YAAA,GAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,EACd,SAAA,GAAY,cAAA,GACX,cAAA;;;UC3Cc,wCAAA;EAAA,SACN,WAAA,EAAa,WAAA;EAAA,SACb,UAAA,EAAY,UAAA;EAAA,SACZ,QAAA;EAAA,SACA,qBAAA,EAAuB,WAAA;EAAA,SACvB,WAAA,GAAc,WAAA;EAAA,SACd,eAAA,YAA2B,wBAAA;EAAA,SAC3B,sBAAA,GAAyB,sBAAA;EDhFmB;EAAA,SCkF5C,mBAAA;IAAA,SAAiC,IAAA;IAAA,SAAuB,GAAA;EAAA;AAAA;AAAA,iBA41BnD,mCAAA,CACd,KAAA,EAAO,wCAAA,GACN,MAAA,CAAO,QAAA,EAAU,yBAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as deriveJsonSchema, r as derivePolymorphicJsonSchema, t as interpretPslDocumentToMongoContract } from "./interpreter-
|
|
1
|
+
import { n as deriveJsonSchema, r as derivePolymorphicJsonSchema, t as interpretPslDocumentToMongoContract } from "./interpreter-D0vfRJ7f.mjs";
|
|
2
2
|
export { deriveJsonSchema, derivePolymorphicJsonSchema, interpretPslDocumentToMongoContract };
|
|
@@ -849,6 +849,7 @@ function interpretPslDocumentToMongoContract(input) {
|
|
|
849
849
|
entityContext: {
|
|
850
850
|
family: "mongo",
|
|
851
851
|
target: "mongo",
|
|
852
|
+
...ifDefined("enumInferenceCodecs", input.enumInferenceCodecs),
|
|
852
853
|
...ifDefined("codecLookup", codecLookup),
|
|
853
854
|
sourceId,
|
|
854
855
|
diagnostics: { push: (d) => {
|
|
@@ -1090,4 +1091,4 @@ function interpretPslDocumentToMongoContract(input) {
|
|
|
1090
1091
|
//#endregion
|
|
1091
1092
|
export { deriveJsonSchema as n, derivePolymorphicJsonSchema as r, interpretPslDocumentToMongoContract as t };
|
|
1092
1093
|
|
|
1093
|
-
//# sourceMappingURL=interpreter-
|
|
1094
|
+
//# sourceMappingURL=interpreter-D0vfRJ7f.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter-D0vfRJ7f.mjs","names":[],"sources":["../src/derive-json-schema.ts","../src/psl-helpers.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractField, ContractValueObject, JsonValue } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport { MongoValidator } from '@prisma-next/mongo-contract';\n\n/**\n * The permitted values a field's value set restricts it to, keyed by the value set's name — the\n * storage `entries.valueSet` slot. The validator's `enum` keyword is sourced from these, not from\n * `domain.enum`.\n */\nexport type FieldValueSets = Record<string, { readonly values: readonly JsonValue[] }>;\n\nfunction resolveBsonType(\n codecId: string,\n codecLookup: CodecLookup | undefined,\n): string | undefined {\n return codecLookup?.targetTypesFor(codecId)?.[0];\n}\n\nfunction fieldToBsonSchema(\n field: ContractField,\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup: CodecLookup | undefined,\n valueSets: FieldValueSets | undefined,\n): Record<string, unknown> | undefined {\n if (field.type.kind === 'scalar') {\n const bsonType = resolveBsonType(field.type.codecId, codecLookup);\n if (!bsonType) return undefined;\n\n const enumValues =\n field.valueSet !== undefined\n ? (valueSets?.[field.valueSet.entityName]?.values ?? null)\n : null;\n\n if ('many' in field && field.many) {\n const items: Record<string, unknown> = { bsonType };\n if (enumValues) items['enum'] = enumValues;\n return { bsonType: 'array', items };\n }\n\n if (field.nullable) {\n const s: Record<string, unknown> = { bsonType: ['null', bsonType] };\n if (enumValues) s['enum'] = [...enumValues, null];\n return s;\n }\n\n const s: Record<string, unknown> = { bsonType };\n if (enumValues) s['enum'] = enumValues;\n return s;\n }\n\n if (field.type.kind === 'valueObject') {\n const vo = valueObjects?.[field.type.name];\n if (!vo) return undefined;\n const voSchema = deriveObjectSchema(vo.fields, valueObjects, codecLookup, valueSets);\n if ('many' in field && field.many) {\n return { bsonType: 'array', items: voSchema };\n }\n if (field.nullable) {\n return { oneOf: [{ bsonType: 'null' }, voSchema] };\n }\n return voSchema;\n }\n\n return undefined;\n}\n\nfunction deriveObjectSchema(\n fields: Record<string, ContractField>,\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup: CodecLookup | undefined,\n valueSets: FieldValueSets | undefined,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [fieldName, field] of Object.entries(fields)) {\n const schema = fieldToBsonSchema(field, valueObjects, codecLookup, valueSets);\n if (schema) {\n properties[fieldName] = schema;\n if (!field.nullable) {\n required.push(fieldName);\n }\n }\n }\n\n const result: Record<string, unknown> = {\n bsonType: 'object',\n properties,\n additionalProperties: false,\n };\n if (required.length > 0) {\n result['required'] = required.sort();\n }\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function deriveJsonSchema(\n fields: Record<string, ContractField>,\n valueObjects?: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n valueSets?: FieldValueSets,\n): MongoValidator {\n return new MongoValidator({\n jsonSchema: deriveObjectSchema(fields, valueObjects, codecLookup, valueSets),\n validationLevel: 'strict',\n validationAction: 'error',\n });\n}\n\nexport interface PolymorphicVariant {\n readonly discriminatorValue: string;\n readonly fields: Record<string, ContractField>;\n}\n\nexport function derivePolymorphicJsonSchema(\n baseFields: Record<string, ContractField>,\n discriminatorField: string,\n variants: readonly PolymorphicVariant[],\n valueObjects?: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n valueSets?: FieldValueSets,\n): MongoValidator {\n const baseSchema = deriveObjectSchema(baseFields, valueObjects, codecLookup, valueSets);\n const baseProperties = isRecord(baseSchema['properties']) ? baseSchema['properties'] : {};\n\n const oneOf: Record<string, unknown>[] = [];\n for (const variant of variants) {\n const variantOnlyFields: Record<string, ContractField> = {};\n for (const [name, field] of Object.entries(variant.fields)) {\n if (!(name in baseFields)) {\n variantOnlyFields[name] = field;\n }\n }\n\n const variantProperties: Record<string, unknown> = {};\n const variantRequired: string[] = [discriminatorField];\n for (const [name, field] of Object.entries(variantOnlyFields)) {\n const schema = fieldToBsonSchema(field, valueObjects, codecLookup, valueSets);\n if (schema) {\n variantProperties[name] = schema;\n if (!field.nullable) {\n variantRequired.push(name);\n }\n }\n }\n\n const entry: Record<string, unknown> = {\n properties: {\n ...baseProperties,\n [discriminatorField]: { enum: [variant.discriminatorValue] },\n ...variantProperties,\n },\n required: variantRequired.sort(),\n additionalProperties: false,\n };\n\n oneOf.push(entry);\n }\n\n const jsonSchema = { ...baseSchema };\n delete jsonSchema['additionalProperties'];\n if (oneOf.length > 0) {\n jsonSchema['oneOf'] = oneOf;\n }\n\n return new MongoValidator({\n jsonSchema,\n validationLevel: 'strict',\n validationAction: 'error',\n });\n}\n","import type { ResolvedAttribute, ResolvedAttributeArg } from '@prisma-next/psl-parser';\nimport { parseQuotedStringLiteral } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nexport { parseQuotedStringLiteral };\n\nexport function getPositionalArgument(attr: ResolvedAttribute, index = 0): string | undefined {\n return attr.args.filter((arg) => arg.kind === 'positional')[index]?.value;\n}\n\nexport function getNamedArgument(attr: ResolvedAttribute, name: string): string | undefined {\n const arg = attr.args.find((a) => a.kind === 'named' && a.name === name);\n return arg?.value;\n}\n\nexport function parseFieldList(value: string): readonly string[] {\n const inner = value.replace(/^\\[/, '').replace(/\\]$/, '').trim();\n if (inner.length === 0) return [];\n return splitTopLevel(inner).map((s) => s.trim());\n}\n\nexport interface ParsedIndexField {\n readonly name: string;\n readonly isWildcard: boolean;\n readonly direction?: number;\n}\n\nexport function parseIndexFieldList(value: string): readonly ParsedIndexField[] {\n const segments = parseFieldList(value);\n return segments.map(parseIndexFieldSegment);\n}\n\nfunction parseIndexFieldSegment(segment: string): ParsedIndexField {\n const wildcardMatch = segment.match(/^wildcard\\(\\s*(.*?)\\s*\\)$/);\n if (wildcardMatch) {\n const scope = wildcardMatch[1] ?? '';\n return {\n name: scope.length > 0 ? `${scope}.$**` : '$**',\n isWildcard: true,\n };\n }\n\n const modifierMatch = segment.match(/^(\\w+)\\(\\s*sort:\\s*(\\w+)\\s*\\)$/);\n if (modifierMatch) {\n const fieldName = modifierMatch[1] ?? segment;\n const sortValue = modifierMatch[2];\n return {\n name: fieldName,\n isWildcard: false,\n direction: sortValue === 'Desc' ? -1 : 1,\n };\n }\n\n return { name: segment, isWildcard: false };\n}\n\nfunction splitTopLevel(input: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === '(' || ch === '[' || ch === '{') depth++;\n else if (ch === ')' || ch === ']' || ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === ',' && depth === 0) {\n parts.push(input.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(input.slice(start));\n return parts;\n}\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 ResolvedAttribute[],\n name: string,\n): ResolvedAttribute | undefined {\n return attributes.find((attr) => attr.name === name);\n}\n\nexport function getMapName(attributes: readonly ResolvedAttribute[]): 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 ResolvedAttribute[],\n): ParsedRelationAttribute | undefined {\n const relationAttr = getAttribute(attributes, 'relation');\n if (!relationAttr) return undefined;\n\n let relationName: string | undefined;\n let fieldsArg: ResolvedAttributeArg | undefined;\n let referencesArg: ResolvedAttributeArg | 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 ...ifDefined('relationName', relationName),\n ...ifDefined('fields', fields),\n ...ifDefined('references', references),\n };\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 {\n type Contract,\n type ContractEnum,\n type ContractField,\n type ContractReferenceRelation,\n type ContractValueObject,\n type CrossReference,\n crossRef,\n type JsonValue,\n type ValueSetRef,\n} from '@prisma-next/contract/types';\nimport type { EnumTypeHandle } from '@prisma-next/contract-authoring';\nimport { errorEnumCodecNotInPackStack } from '@prisma-next/errors/control';\nimport type {\n AuthoringContributions,\n AuthoringEntityContext,\n} from '@prisma-next/framework-components/authoring';\nimport {\n instantiateAuthoringEntityType,\n isAuthoringEntityTypeDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n applyPolymorphicScopeToMongoIndex,\n buildMongoNamespace,\n type MongoCollectionInput,\n MongoIndex,\n type MongoIndexKeyDirection,\n MongoStorage,\n type MongoValueSetInput,\n} from '@prisma-next/mongo-contract';\nimport { mongoContractCanonicalizationHooks } from '@prisma-next/mongo-contract/canonicalization-hooks';\nimport type { CollationOptions } from '@prisma-next/mongo-value/mongodb-types';\nimport type {\n CompositeTypeSymbol,\n FieldSymbol,\n ModelSymbol,\n NamespaceSymbol,\n PslExtensionBlock,\n PslSpan,\n ResolvedAttribute,\n SymbolTable,\n} from '@prisma-next/psl-parser';\nimport { nodePslSpan } from '@prisma-next/psl-parser';\nimport type { SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { assertDefined } from '@prisma-next/utils/assertions';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { deriveJsonSchema, derivePolymorphicJsonSchema } from './derive-json-schema';\nimport {\n getAttribute,\n getMapName,\n getNamedArgument,\n getPositionalArgument,\n lowerFirst,\n parseIndexFieldList,\n parseQuotedStringLiteral,\n parseRelationAttribute,\n} from './psl-helpers';\n\n/**\n * Encode an authored enum value to its codec-encoded JSON form via the codec resolved by id from the\n * contract's codec lookup, so a non-identity `encodeJson` (permitted by the `mongoCodec` factory) is\n * respected. Matches the TS builder's `encodeEnumValue`: the lookup is always threaded in production,\n * and a codecId the lookup cannot resolve is a hard error — the enum uses a codec that is not part of\n * the contract's pack stack.\n */\nfunction encodeEnumValue(value: unknown, codecId: string, codecLookup: CodecLookup): JsonValue {\n const codec = codecLookup.get(codecId);\n if (!codec) {\n throw errorEnumCodecNotInPackStack({ codecId });\n }\n return codec.encodeJson(value);\n}\n\nexport interface InterpretPslDocumentToMongoContractInput {\n readonly symbolTable: SymbolTable;\n readonly sourceFile: SourceFile;\n readonly sourceId: string;\n readonly scalarTypeDescriptors: ReadonlyMap<string, string>;\n readonly codecLookup?: CodecLookup;\n readonly seedDiagnostics?: readonly ContractSourceDiagnostic[];\n readonly authoringContributions?: AuthoringContributions;\n /** The target's default codec ids for an `enum` block that omits `@@type`. */\n readonly enumInferenceCodecs?: { readonly text: string; readonly int: string };\n}\n\n/**\n * Mongo's PSL surface binds the database from the connection string, so every\n * explicit namespace block is invalid, including `namespace unbound { … }`.\n */\nfunction validateNamespaceBlocksForMongoTarget(input: {\n readonly namespaces: readonly NamespaceSymbol[];\n readonly sourceId: string;\n readonly sourceFile: SourceFile;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n for (const namespace of input.namespaces) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMESPACE_BLOCK',\n message: `Mongo does not support \\`namespace ${namespace.name} { … }\\` blocks (the database is bound by the connection string; declare models at the document top level instead).`,\n sourceId: input.sourceId,\n span: nodePslSpan(namespace.node.syntax, input.sourceFile),\n });\n }\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: ModelSymbol): FieldMappings {\n const pslNameToMapped = new Map<string, string>();\n for (const field of Object.values(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: ModelSymbol): 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?: CrossReference;\n}\n\ntype DiscriminatorDeclaration = { readonly fieldName: string; readonly span: PslSpan };\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly collectionName: string;\n readonly span: PslSpan;\n};\n\nfunction mongoCrossRef(modelName: string): CrossReference {\n return crossRef(modelName, UNBOUND_NAMESPACE_ID);\n}\n\nfunction collectPolymorphismDeclarations(\n models: readonly ModelSymbol[],\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 model of models) {\n for (const attr of model.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 \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields[fieldName];\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.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 \"${model.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 \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const collectionName = resolveCollectionName(model);\n baseDeclarations.set(model.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, CrossReference>;\n collections: Record<string, Record<string, unknown>>;\n allModels: readonly ModelSymbol[];\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n modelNames: ReadonlySet<string>;\n indexSpans: Map<MongoIndex, PslSpan>;\n modelIndexesByName: Map<string, readonly MongoIndex[]>;\n sourceId: string;\n}): {\n models: Record<string, MongoModelEntry>;\n roots: Record<string, CrossReference>;\n collections: Record<string, Record<string, unknown>>;\n diagnostics: ContractSourceDiagnostic[];\n} {\n const {\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n sourceId,\n allModels: allModelViews,\n indexSpans,\n modelIndexesByName,\n } = input;\n let patched = input.models;\n let roots = input.roots;\n let collections = input.collections;\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 const modelView = allModelViews.find((m) => m.name === modelName);\n const mappedDiscriminatorField = modelView\n ? (resolveFieldMappings(modelView).pslNameToMapped.get(decl.fieldName) ?? decl.fieldName)\n : decl.fieldName;\n\n if (!Object.hasOwn(model.fields, mappedDiscriminatorField)) {\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: mappedDiscriminatorField }, 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 variantModelView = allModelViews.find((m) => m.name === variantName);\n if (!variantModelView) continue;\n const hasExplicitMap = getMapName(variantModelView.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: mongoCrossRef(baseDecl.baseName),\n storage: { collection: baseCollection },\n },\n };\n }\n\n const variantCollectionName = resolveCollectionName(variantModelView);\n if (roots[variantCollectionName]?.model === variantName) {\n if (variantCollectionName === baseCollection && baseModel) {\n roots = { ...roots, [variantCollectionName]: mongoCrossRef(baseDecl.baseName) };\n } else {\n roots = Object.fromEntries(\n Object.entries(roots).filter(([key]) => key !== variantCollectionName),\n );\n }\n }\n\n const variantOwnIndexes = modelIndexesByName.get(variantName) ?? [];\n const baseColl = collections[baseCollection];\n\n const baseModelEntry = patched[baseDecl.baseName];\n const discriminatorField = baseModelEntry?.discriminator?.field;\n const scopedVariantIndexes: MongoIndex[] = [];\n if (discriminatorField) {\n for (const idx of variantOwnIndexes) {\n const result = applyPolymorphicScopeToMongoIndex(idx, {\n discriminatorField,\n discriminatorValue: baseDecl.value,\n });\n if (result.kind === 'conflict') {\n const span = indexSpans.get(idx) ?? baseDecl.span;\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `Variant \"${variantName}\" index conflicts with discriminator scope: ${result.reason}`,\n sourceId,\n span,\n });\n continue;\n }\n if (result.index !== idx) {\n indexSpans.set(result.index, indexSpans.get(idx) ?? baseDecl.span);\n }\n scopedVariantIndexes.push(result.index);\n }\n } else {\n scopedVariantIndexes.push(...variantOwnIndexes);\n }\n\n if (variantCollectionName !== baseCollection) {\n const filtered = Object.fromEntries(\n Object.entries(collections).filter(([key]) => key !== variantCollectionName),\n );\n if (scopedVariantIndexes.length > 0 && baseColl) {\n const baseIndexes = (baseColl['indexes'] ?? []) as MongoIndex[];\n collections = {\n ...filtered,\n [baseCollection]: {\n ...baseColl,\n indexes: [...baseIndexes, ...scopedVariantIndexes],\n },\n };\n } else {\n collections = filtered;\n }\n } else if (baseColl) {\n const existingIndexes = (baseColl['indexes'] ?? []) as MongoIndex[];\n const variantIndexSet = new Set<MongoIndex>(variantOwnIndexes);\n const withoutUnscopedVariants = existingIndexes.filter((idx) => !variantIndexSet.has(idx));\n const mergedIndexes = [...withoutUnscopedVariants];\n for (const idx of scopedVariantIndexes) {\n const idxKey = canonicalJson(idx);\n const isDuplicate = withoutUnscopedVariants.some(\n (existing) => canonicalJson(existing) === idxKey,\n );\n if (!isDuplicate) {\n mergedIndexes.push(idx);\n }\n }\n if (\n mergedIndexes.length !== existingIndexes.length ||\n mergedIndexes.some((idx, i) => idx !== existingIndexes[i])\n ) {\n const next: Record<string, unknown> = { ...baseColl };\n if (mergedIndexes.length > 0) {\n next['indexes'] = mergedIndexes;\n } else {\n delete next['indexes'];\n }\n collections = { ...collections, [baseCollection]: next };\n }\n }\n }\n\n return { models: patched, roots, collections, diagnostics };\n}\n\n// Property-order-stable serialization for structural equality of plain\n// JSON-compatible values. Used for comparing MongoIndex shapes in\n// the variant-merge dedup path where a future change to the spread order\n// would otherwise produce JSON-stringify mismatches even though the\n// indexes are structurally identical.\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`;\n }\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction parseIndexDirection(raw: string | undefined): MongoIndexKeyDirection {\n if (!raw) return 1;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n const num = Number(stripped);\n if (num === 1 || num === -1) return num;\n if (['text', '2dsphere', '2d', 'hashed'].includes(stripped))\n return stripped as MongoIndexKeyDirection;\n return 1;\n}\n\nfunction parseNumericArg(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseBooleanArg(raw: string | undefined): boolean | undefined {\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n return undefined;\n}\n\nfunction parseJsonArg(raw: string | undefined): Record<string, unknown> | undefined {\n if (!raw) return undefined;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '').replace(/\\\\\"/g, '\"');\n try {\n const parsed = JSON.parse(stripped);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // not valid JSON\n }\n return undefined;\n}\n\nfunction parseCollation(attr: ResolvedAttribute): CollationOptions | null | undefined {\n const locale = stripQuotesHelper(getNamedArgument(attr, 'collationLocale'));\n if (!locale) {\n const hasAnyCollationArg =\n getNamedArgument(attr, 'collationStrength') != null ||\n getNamedArgument(attr, 'collationCaseLevel') != null ||\n getNamedArgument(attr, 'collationCaseFirst') != null ||\n getNamedArgument(attr, 'collationNumericOrdering') != null ||\n getNamedArgument(attr, 'collationAlternate') != null ||\n getNamedArgument(attr, 'collationMaxVariable') != null ||\n getNamedArgument(attr, 'collationBackwards') != null ||\n getNamedArgument(attr, 'collationNormalization') != null;\n return hasAnyCollationArg ? null : undefined;\n }\n\n const collation: CollationOptions = { locale };\n const strength = parseNumericArg(getNamedArgument(attr, 'collationStrength'));\n if (strength != null) collation.strength = strength;\n const caseLevel = parseBooleanArg(getNamedArgument(attr, 'collationCaseLevel'));\n if (caseLevel != null) collation.caseLevel = caseLevel;\n const caseFirst = stripQuotesHelper(getNamedArgument(attr, 'collationCaseFirst'));\n if (caseFirst != null) collation.caseFirst = caseFirst;\n const numericOrdering = parseBooleanArg(getNamedArgument(attr, 'collationNumericOrdering'));\n if (numericOrdering != null) collation.numericOrdering = numericOrdering;\n const alternate = stripQuotesHelper(getNamedArgument(attr, 'collationAlternate'));\n if (alternate != null) collation.alternate = alternate;\n const maxVariable = stripQuotesHelper(getNamedArgument(attr, 'collationMaxVariable'));\n if (maxVariable != null) collation.maxVariable = maxVariable;\n const backwards = parseBooleanArg(getNamedArgument(attr, 'collationBackwards'));\n if (backwards != null) collation.backwards = backwards;\n const normalization = parseBooleanArg(getNamedArgument(attr, 'collationNormalization'));\n if (normalization != null) collation.normalization = normalization;\n return collation;\n}\n\nfunction stripQuotesHelper(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n return raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n}\n\nfunction parseProjectionList(\n raw: string | undefined,\n value: 0 | 1,\n): Record<string, 0 | 1> | undefined {\n if (!raw) return undefined;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n const inner = stripped.replace(/^\\[/, '').replace(/\\]$/, '').trim();\n if (inner.length === 0) return undefined;\n const fields = inner\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const result: Record<string, 0 | 1> = {};\n for (const f of fields) {\n result[f] = value;\n }\n return result;\n}\n\nfunction collectIndexes(\n pslModel: ModelSymbol,\n fieldMappings: FieldMappings,\n modelNames: ReadonlySet<string>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n indexSpans: Map<MongoIndex, PslSpan>,\n): MongoIndex[] {\n const indexes: MongoIndex[] = [];\n let textIndexCount = 0;\n\n // Storage-indexable PSL field names — i.e. all declared fields except\n // relation fields (which don't materialize a column on this model). The\n // index field-existence check (PSL_INDEX_FIELD_NOT_FOUND) consults this\n // rather than fieldMappings.pslNameToMapped because the latter contains\n // every PSL field including relation fields.\n const indexableFieldNames = new Set<string>();\n for (const f of Object.values(pslModel.fields)) {\n if (modelNames.has(f.typeName)) continue;\n indexableFieldNames.add(f.name);\n }\n\n for (const field of Object.values(pslModel.fields)) {\n if (modelNames.has(field.typeName)) continue;\n const uniqueAttr = getAttribute(field.attributes, 'unique');\n if (!uniqueAttr) continue;\n const mappedName = fieldMappings.pslNameToMapped.get(field.name) ?? field.name;\n const fieldUniqueIndex = new MongoIndex({\n keys: [{ field: mappedName, direction: 1 }],\n unique: true,\n });\n indexes.push(fieldUniqueIndex);\n indexSpans.set(fieldUniqueIndex, uniqueAttr.span);\n }\n\n for (const attr of pslModel.attributes) {\n const isIndex = attr.name === 'index';\n const isUnique = attr.name === 'unique';\n const isTextIndex = attr.name === 'textIndex';\n if (!isIndex && !isUnique && !isTextIndex) continue;\n\n const fieldsArg = getPositionalArgument(attr, 0);\n if (!fieldsArg) continue;\n const parsedFields = parseIndexFieldList(fieldsArg);\n if (parsedFields.length === 0) continue;\n\n const hasWildcard = parsedFields.some((f) => f.isWildcard);\n const wildcardCount = parsedFields.filter((f) => f.isWildcard).length;\n\n if (wildcardCount > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'An index can contain at most one wildcard() field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (isUnique && hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Unique indexes cannot use wildcard() fields',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (isTextIndex) {\n textIndexCount++;\n if (textIndexCount > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `Only one @@textIndex is allowed per collection (model \"${pslModel.name}\")`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message:\n 'wildcard() fields cannot be combined with type: hashed/2dsphere/2d or @@textIndex',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n }\n\n const typeArg = getNamedArgument(attr, 'type');\n const defaultDirection: MongoIndexKeyDirection = isTextIndex\n ? 'text'\n : parseIndexDirection(typeArg);\n\n if (\n hasWildcard &&\n typeof defaultDirection === 'string' &&\n ['hashed', '2dsphere', '2d'].includes(defaultDirection)\n ) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `wildcard() fields cannot be combined with type: ${defaultDirection}`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (defaultDirection === 'hashed' && parsedFields.length > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Hashed indexes must have exactly one field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n let missingField: string | undefined;\n for (const pf of parsedFields) {\n let fieldNameForLookup: string | undefined;\n if (pf.isWildcard) {\n const wildcardMatch = pf.name.match(/^(.+)\\.\\$\\*\\*$/);\n fieldNameForLookup = wildcardMatch ? wildcardMatch[1] : undefined;\n } else {\n fieldNameForLookup = pf.name;\n }\n if (fieldNameForLookup === undefined || fieldNameForLookup.length === 0) continue;\n if (!indexableFieldNames.has(fieldNameForLookup)) {\n missingField = fieldNameForLookup;\n break;\n }\n }\n if (missingField !== undefined) {\n diagnostics.push({\n code: 'PSL_INDEX_FIELD_NOT_FOUND',\n message: `Index on model \"${pslModel.name}\" references unknown field \"${missingField}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const keys = parsedFields.map((pf) => {\n const mappedName = pf.isWildcard\n ? pf.name.replace(/^(.+)\\.\\$\\*\\*$/, (_, prefix: string) => {\n const mapped = fieldMappings.pslNameToMapped.get(prefix);\n return mapped ? `${mapped}.$**` : `${prefix}.$**`;\n })\n : (fieldMappings.pslNameToMapped.get(pf.name) ?? pf.name);\n const direction: MongoIndexKeyDirection =\n pf.direction != null ? (pf.direction as MongoIndexKeyDirection) : defaultDirection;\n return { field: mappedName, direction };\n });\n\n const unique = isUnique ? true : undefined;\n const sparse = isTextIndex ? undefined : parseBooleanArg(getNamedArgument(attr, 'sparse'));\n const expireAfterSeconds = isTextIndex\n ? undefined\n : parseNumericArg(getNamedArgument(attr, 'expireAfterSeconds'));\n\n if (hasWildcard && expireAfterSeconds != null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'expireAfterSeconds cannot be combined with wildcard() fields',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const partialFilterExpression = parseJsonArg(getNamedArgument(attr, 'filter'));\n\n const includeArg = getNamedArgument(attr, 'include');\n const excludeArg = getNamedArgument(attr, 'exclude');\n\n if (includeArg != null && excludeArg != null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Cannot specify both include and exclude on the same index',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if ((includeArg != null || excludeArg != null) && !hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message:\n 'include/exclude options are only valid when the index contains a wildcard() field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const wildcardProjection =\n includeArg != null\n ? parseProjectionList(includeArg, 1)\n : excludeArg != null\n ? parseProjectionList(excludeArg, 0)\n : undefined;\n\n const collation = parseCollation(attr);\n if (collation === null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'collationLocale is required when using collation options',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const rawWeights = parseJsonArg(getNamedArgument(attr, 'weights'));\n let weights: Record<string, number> | undefined;\n if (rawWeights) {\n weights = {};\n for (const [k, v] of Object.entries(rawWeights)) {\n if (typeof v === 'number') weights[k] = v;\n }\n }\n\n const rawDefaultLang = isTextIndex\n ? getNamedArgument(attr, 'language')\n : getNamedArgument(attr, 'default_language');\n const default_language = stripQuotesHelper(rawDefaultLang);\n\n const rawLangOverride = getNamedArgument(attr, 'languageOverride');\n const language_override = stripQuotesHelper(rawLangOverride);\n\n const index = new MongoIndex({\n keys,\n ...(unique != null && { unique }),\n ...(sparse != null && { sparse }),\n ...(expireAfterSeconds != null && { expireAfterSeconds }),\n ...(partialFilterExpression != null && { partialFilterExpression }),\n ...(wildcardProjection != null && { wildcardProjection }),\n ...(collation != null && { collation }),\n ...(weights != null && { weights }),\n ...(default_language != null && { default_language }),\n ...(language_override != null && { language_override }),\n });\n\n indexes.push(index);\n indexSpans.set(index, attr.span);\n }\n\n return indexes;\n}\n\nfunction isRelationField(field: FieldSymbol, modelNames: ReadonlySet<string>): boolean {\n return modelNames.has(field.typeName);\n}\n\n// PSL scalar type name whose codec is mandated for a Mongo model's `_id`.\nconst MONGO_OBJECT_ID_PSL_TYPE = 'ObjectId';\n\nfunction resolveFieldCodecId(\n field: FieldSymbol,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n): string | undefined {\n return scalarTypeDescriptors.get(field.typeName);\n}\n\nfunction resolveNonRelationField(\n field: FieldSymbol,\n ownerName: string,\n compositeTypeNames: ReadonlySet<string>,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n codecIdByEnumName: 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 // If this field's declared type is a known enum name, treat the field as a scalar\n // with that enum's codec and stamp the domain valueSet ref.\n const enumCodecId = codecIdByEnumName.get(field.typeName);\n if (enumCodecId !== undefined) {\n const valueSet: ValueSetRef = {\n plane: 'domain',\n entityKind: 'enum',\n namespaceId: UNBOUND_NAMESPACE_ID,\n entityName: field.typeName,\n };\n const result: ContractField = {\n type: { kind: 'scalar', codecId: enumCodecId },\n nullable: field.optional,\n valueSet,\n };\n return field.list ? { ...result, many: true } : result;\n }\n\n // Avoid cascading unsupported-type diagnostics after invalid qualification.\n if (field.malformedType) {\n return undefined;\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\nfunction processEnumDeclarations(input: {\n readonly enumBlocks: readonly PslExtensionBlock[];\n readonly sourceId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly entityContext: AuthoringEntityContext;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): Record<string, ContractEnum> {\n const builtEnums: Record<string, ContractEnum> = {};\n\n if (input.enumBlocks.length === 0) return builtEnums;\n\n const enumDescriptor =\n input.authoringContributions?.entityTypes?.['enum'] !== undefined &&\n isAuthoringEntityTypeDescriptor(input.authoringContributions.entityTypes['enum'])\n ? input.authoringContributions.entityTypes['enum']\n : undefined;\n\n if (!enumDescriptor) {\n for (const decl of input.enumBlocks) {\n input.diagnostics.push({\n code: 'PSL_ENUM_MISSING_FACTORY',\n message: `enum \"${decl.name}\" requires an \"enum\" entityType factory in the active authoring contributions`,\n sourceId: input.sourceId,\n span: decl.span,\n });\n }\n return builtEnums;\n }\n\n for (const decl of input.enumBlocks) {\n const handle = instantiateAuthoringEntityType<EnumTypeHandle | undefined>(\n 'enum',\n enumDescriptor,\n [decl],\n input.entityContext,\n );\n\n if (handle === undefined || handle === null) continue;\n\n builtEnums[decl.name] = {\n codecId: handle.codecId,\n members: handle.enumMembers.map((m) => ({\n name: m.name,\n value: blindCast<JsonValue, 'factory-validated enum members are JsonValue-compatible'>(\n m.value,\n ),\n })),\n };\n }\n\n return builtEnums;\n}\n\nexport function interpretPslDocumentToMongoContract(\n input: InterpretPslDocumentToMongoContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const { symbolTable, sourceFile, scalarTypeDescriptors, codecLookup } = input;\n const sourceId = input.sourceId;\n const diagnostics: ContractSourceDiagnostic[] = [...(input.seedDiagnostics ?? [])];\n const topLevel = symbolTable.topLevel;\n validateNamespaceBlocksForMongoTarget({\n namespaces: Object.values(topLevel.namespaces),\n sourceId,\n sourceFile,\n diagnostics,\n });\n const allModels: ModelSymbol[] = Object.values(topLevel.models);\n const allCompositeTypes: CompositeTypeSymbol[] = Object.values(topLevel.compositeTypes);\n const modelNames = new Set(allModels.map((m) => m.name));\n const compositeTypeNames = new Set(allCompositeTypes.map((ct) => ct.name));\n\n const topLevelEnumBlocks = Object.values(topLevel.blocks)\n .filter((b) => b.keyword === 'enum')\n .map((b) => b.block);\n\n const builtEnums = processEnumDeclarations({\n enumBlocks: topLevelEnumBlocks,\n sourceId,\n authoringContributions: input.authoringContributions,\n entityContext: {\n family: 'mongo',\n target: 'mongo',\n ...ifDefined('enumInferenceCodecs', input.enumInferenceCodecs),\n ...ifDefined('codecLookup', codecLookup),\n sourceId,\n diagnostics: {\n push: (d) => {\n diagnostics.push(\n blindCast<ContractSourceDiagnostic, 'sink diagnostics are span-compatible'>(d),\n );\n },\n },\n },\n diagnostics,\n });\n\n const codecIdByEnumName: Map<string, string> = new Map(\n Object.entries(builtEnums).map(([name, e]) => [name, e.codecId]),\n );\n\n const models: Record<string, MongoModelEntry> = {};\n const collections: Record<string, Record<string, unknown>> = {};\n const roots: Record<string, CrossReference> = {};\n const allFkRelations: FkRelation[] = [];\n const indexSpans = new Map<MongoIndex, PslSpan>();\n const modelIndexesByName = new Map<string, readonly MongoIndex[]>();\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: FieldSymbol;\n }\n const backrelationCandidates: BackrelationCandidate[] = [];\n\n for (const pslModel of allModels) {\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 Object.values(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 ...ifDefined('relationName', relation?.relationName),\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 = allModels.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: mongoCrossRef(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 ...ifDefined('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 codecIdByEnumName,\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 = Object.values(pslModel.fields).some(\n (f) => getAttribute(f.attributes, 'id') !== undefined,\n );\n // Variant models inherit the base's identity and are validated through their base.\n if (!isVariantModel) {\n if (!hasIdField) {\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 } else {\n // The resulting document must carry an `_id` of BSON type objectId. We\n // assert on the emitted shape (the mapped-name-keyed field record), not\n // on how the user spelled it — `id ObjectId @id @map(\"_id\")` and a field\n // literally named `_id` both satisfy it; a non-objectId or unmapped id\n // does not.\n const objectIdCodecId = scalarTypeDescriptors.get(MONGO_OBJECT_ID_PSL_TYPE);\n const idField = fields['_id'];\n const idIsObjectId =\n idField !== undefined &&\n idField.type.kind === 'scalar' &&\n objectIdCodecId !== undefined &&\n idField.type.codecId === objectIdCodecId;\n if (!idIsObjectId) {\n diagnostics.push({\n code: 'PSL_MONGO_ID_REQUIRED',\n message: `Model \"${pslModel.name}\" must declare an _id field of type ObjectId (e.g. \\`id ObjectId @id @map(\"_id\")\\`).`,\n sourceId,\n });\n }\n }\n }\n\n models[pslModel.name] = { fields, relations, storage: { collection: collectionName } };\n const modelIndexes = collectIndexes(\n pslModel,\n fieldMappings,\n modelNames,\n sourceId,\n diagnostics,\n indexSpans,\n );\n modelIndexesByName.set(pslModel.name, modelIndexes);\n const existingColl = collections[collectionName];\n if (existingColl && modelIndexes.length > 0) {\n const existingIndexes = (existingColl['indexes'] ?? []) as MongoIndex[];\n collections[collectionName] = { indexes: [...existingIndexes, ...modelIndexes] };\n } else if (!existingColl) {\n collections[collectionName] = modelIndexes.length > 0 ? { indexes: modelIndexes } : {};\n }\n roots[collectionName] = mongoCrossRef(pslModel.name);\n }\n\n const valueObjects: Record<string, ContractValueObject> = {};\n for (const compositeType of allCompositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of Object.values(compositeType.fields)) {\n const resolved = resolveNonRelationField(\n field,\n compositeType.name,\n compositeTypeNames,\n scalarTypeDescriptors,\n codecIdByEnumName,\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: mongoCrossRef(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 allModels,\n sourceId,\n diagnostics,\n );\n const polyResult = resolvePolymorphism({\n models,\n roots,\n collections,\n allModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n indexSpans,\n modelIndexesByName,\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 resolvedModels = polyResult.models;\n const resolvedCollections = polyResult.collections;\n\n // The storage value set is the source of truth for both the emit typing and the validator's\n // `enum` keyword. Built once, ahead of validator derivation, from each enum's codec-encoded member\n // values (mirroring SQL's build-contract). Encoding needs the codec lookup; production always\n // threads it (the CLI control stack supplies it), so its absence when enums exist is a wiring bug,\n // not a runtime input to tolerate.\n const storageValueSets: Record<string, MongoValueSetInput> = {};\n const enumEntries = Object.entries(builtEnums);\n if (enumEntries.length > 0) {\n assertDefined(\n codecLookup,\n 'Mongo PSL interpretation requires a codec lookup to encode enum values',\n );\n for (const [enumName, builtEnum] of enumEntries) {\n storageValueSets[enumName] = {\n kind: 'valueSet',\n values: builtEnum.members.map((m) =>\n encodeEnumValue(m.value, builtEnum.codecId, codecLookup),\n ),\n };\n }\n }\n\n for (const [, modelEntry] of Object.entries(resolvedModels)) {\n if (modelEntry.base) continue;\n\n const collectionName = modelEntry.storage.collection;\n const coll = resolvedCollections[collectionName];\n if (!coll) continue;\n\n if (modelEntry.discriminator && modelEntry.variants) {\n const variantEntries = Object.entries(modelEntry.variants).map(\n ([variantName, { value }]) => ({\n discriminatorValue: value,\n fields: resolvedModels[variantName]?.fields ?? {},\n }),\n );\n coll['validator'] = derivePolymorphicJsonSchema(\n modelEntry.fields,\n modelEntry.discriminator.field,\n variantEntries,\n valueObjects,\n codecLookup,\n storageValueSets,\n );\n } else {\n coll['validator'] = deriveJsonSchema(\n modelEntry.fields,\n valueObjects,\n codecLookup,\n storageValueSets,\n );\n }\n }\n\n const target = 'mongo';\n const targetFamily = 'mongo';\n const collectionInputs: Record<string, MongoCollectionInput> = {};\n for (const [name, coll] of Object.entries(resolvedCollections)) {\n const raw: Record<string, unknown> = {};\n if (coll['indexes'] != null) raw['indexes'] = coll['indexes'];\n if (coll['validator'] != null) raw['validator'] = coll['validator'];\n if (coll['options'] != null) raw['options'] = coll['options'];\n collectionInputs[name] = blindCast<\n MongoCollectionInput,\n 'arktype-validated JSON shapes satisfy MongoCollectionInput by construction'\n >(raw);\n }\n const hasValueSets = Object.keys(storageValueSets).length > 0;\n\n const unboundNamespace = buildMongoNamespace({\n id: UNBOUND_NAMESPACE_ID,\n entries: {\n collection: collectionInputs,\n ...(hasValueSets ? { valueSet: storageValueSets } : {}),\n },\n });\n // Hash the constructed (normalized) entries, not the raw input literals —\n // persisted storageHash values were computed over the constructed form.\n const storageWithoutHash = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n entries: {\n collection: unboundNamespace.entries.collection,\n ...(unboundNamespace.entries.valueSet !== undefined\n ? { valueSet: unboundNamespace.entries.valueSet }\n : {}),\n },\n },\n },\n };\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: storageWithoutHash,\n ...mongoContractCanonicalizationHooks,\n });\n const storage = new MongoStorage({\n storageHash,\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: unboundNamespace,\n },\n }) as Contract['storage'];\n const capabilities: Record<string, Record<string, boolean>> = {};\n\n const hasEnums = Object.keys(builtEnums).length > 0;\n\n return ok({\n targetFamily,\n target,\n roots: polyResult.roots,\n domain: {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n models: polyResult.models,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n ...(hasEnums ? { enum: builtEnums } : {}),\n },\n },\n },\n storage,\n extensionPacks: {},\n capabilities,\n profileHash: computeProfileHash({ target, targetFamily, capabilities }),\n meta: {},\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,SAAS,gBACP,SACA,aACoB;CACpB,OAAO,aAAa,eAAe,OAAO,CAAC,GAAG;AAChD;AAEA,SAAS,kBACP,OACA,cACA,aACA,WACqC;CACrC,IAAI,MAAM,KAAK,SAAS,UAAU;EAChC,MAAM,WAAW,gBAAgB,MAAM,KAAK,SAAS,WAAW;EAChE,IAAI,CAAC,UAAU,OAAO,KAAA;EAEtB,MAAM,aACJ,MAAM,aAAa,KAAA,IACd,YAAY,MAAM,SAAS,WAAW,EAAE,UAAU,OACnD;EAEN,IAAI,UAAU,SAAS,MAAM,MAAM;GACjC,MAAM,QAAiC,EAAE,SAAS;GAClD,IAAI,YAAY,MAAM,UAAU;GAChC,OAAO;IAAE,UAAU;IAAS;GAAM;EACpC;EAEA,IAAI,MAAM,UAAU;GAClB,MAAM,IAA6B,EAAE,UAAU,CAAC,QAAQ,QAAQ,EAAE;GAClE,IAAI,YAAY,EAAE,UAAU,CAAC,GAAG,YAAY,IAAI;GAChD,OAAO;EACT;EAEA,MAAM,IAA6B,EAAE,SAAS;EAC9C,IAAI,YAAY,EAAE,UAAU;EAC5B,OAAO;CACT;CAEA,IAAI,MAAM,KAAK,SAAS,eAAe;EACrC,MAAM,KAAK,eAAe,MAAM,KAAK;EACrC,IAAI,CAAC,IAAI,OAAO,KAAA;EAChB,MAAM,WAAW,mBAAmB,GAAG,QAAQ,cAAc,aAAa,SAAS;EACnF,IAAI,UAAU,SAAS,MAAM,MAC3B,OAAO;GAAE,UAAU;GAAS,OAAO;EAAS;EAE9C,IAAI,MAAM,UACR,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,GAAG,QAAQ,EAAE;EAEnD,OAAO;CACT;AAGF;AAEA,SAAS,mBACP,QACA,cACA,aACA,WACyB;CACzB,MAAM,aAAsC,CAAC;CAC7C,MAAM,WAAqB,CAAC;CAE5B,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,MAAM,GAAG;EACvD,MAAM,SAAS,kBAAkB,OAAO,cAAc,aAAa,SAAS;EAC5E,IAAI,QAAQ;GACV,WAAW,aAAa;GACxB,IAAI,CAAC,MAAM,UACT,SAAS,KAAK,SAAS;EAE3B;CACF;CAEA,MAAM,SAAkC;EACtC,UAAU;EACV;EACA,sBAAsB;CACxB;CACA,IAAI,SAAS,SAAS,GACpB,OAAO,cAAc,SAAS,KAAK;CAErC,OAAO;AACT;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAgB,iBACd,QACA,cACA,aACA,WACgB;CAChB,OAAO,IAAI,eAAe;EACxB,YAAY,mBAAmB,QAAQ,cAAc,aAAa,SAAS;EAC3E,iBAAiB;EACjB,kBAAkB;CACpB,CAAC;AACH;AAOA,SAAgB,4BACd,YACA,oBACA,UACA,cACA,aACA,WACgB;CAChB,MAAM,aAAa,mBAAmB,YAAY,cAAc,aAAa,SAAS;CACtF,MAAM,iBAAiB,SAAS,WAAW,aAAa,IAAI,WAAW,gBAAgB,CAAC;CAExF,MAAM,QAAmC,CAAC;CAC1C,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,oBAAmD,CAAC;EAC1D,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,MAAM,GACvD,IAAI,EAAE,QAAQ,aACZ,kBAAkB,QAAQ;EAI9B,MAAM,oBAA6C,CAAC;EACpD,MAAM,kBAA4B,CAAC,kBAAkB;EACrD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,iBAAiB,GAAG;GAC7D,MAAM,SAAS,kBAAkB,OAAO,cAAc,aAAa,SAAS;GAC5E,IAAI,QAAQ;IACV,kBAAkB,QAAQ;IAC1B,IAAI,CAAC,MAAM,UACT,gBAAgB,KAAK,IAAI;GAE7B;EACF;EAEA,MAAM,QAAiC;GACrC,YAAY;IACV,GAAG;KACF,qBAAqB,EAAE,MAAM,CAAC,QAAQ,kBAAkB,EAAE;IAC3D,GAAG;GACL;GACA,UAAU,gBAAgB,KAAK;GAC/B,sBAAsB;EACxB;EAEA,MAAM,KAAK,KAAK;CAClB;CAEA,MAAM,aAAa,EAAE,GAAG,WAAW;CACnC,OAAO,WAAW;CAClB,IAAI,MAAM,SAAS,GACjB,WAAW,WAAW;CAGxB,OAAO,IAAI,eAAe;EACxB;EACA,iBAAiB;EACjB,kBAAkB;CACpB,CAAC;AACH;;;ACxKA,SAAgB,sBAAsB,MAAyB,QAAQ,GAAuB;CAC5F,OAAO,KAAK,KAAK,QAAQ,QAAQ,IAAI,SAAS,YAAY,CAAC,CAAC,MAAM,EAAE;AACtE;AAEA,SAAgB,iBAAiB,MAAyB,MAAkC;CAE1F,OADY,KAAK,KAAK,MAAM,MAAM,EAAE,SAAS,WAAW,EAAE,SAAS,IAC1D,CAAC,EAAE;AACd;AAEA,SAAgB,eAAe,OAAkC;CAC/D,MAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,KAAK;CAC/D,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;CAChC,OAAO,cAAc,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;AACjD;AAQA,SAAgB,oBAAoB,OAA4C;CAE9E,OADiB,eAAe,KAClB,CAAC,CAAC,IAAI,sBAAsB;AAC5C;AAEA,SAAS,uBAAuB,SAAmC;CACjE,MAAM,gBAAgB,QAAQ,MAAM,2BAA2B;CAC/D,IAAI,eAAe;EACjB,MAAM,QAAQ,cAAc,MAAM;EAClC,OAAO;GACL,MAAM,MAAM,SAAS,IAAI,GAAG,MAAM,QAAQ;GAC1C,YAAY;EACd;CACF;CAEA,MAAM,gBAAgB,QAAQ,MAAM,gCAAgC;CACpE,IAAI,eAGF,OAAO;EACL,MAHgB,cAAc,MAAM;EAIpC,YAAY;EACZ,WAJgB,cAAc,OAIL,SAAS,KAAK;CACzC;CAGF,OAAO;EAAE,MAAM;EAAS,YAAY;CAAM;AAC5C;AAEA,SAAS,cAAc,OAAyB;CAC9C,MAAM,QAAkB,CAAC;CACzB,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;OACvC,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;OACzE,IAAI,OAAO,OAAO,UAAU,GAAG;GAClC,MAAM,KAAK,MAAM,MAAM,OAAO,CAAC,CAAC;GAChC,QAAQ,IAAI;EACd;CACF;CACA,MAAM,KAAK,MAAM,MAAM,KAAK,CAAC;CAC7B,OAAO;AACT;AAEA,SAAgB,WAAW,OAAuB;CAChD,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,OAAO,MAAM,EAAE,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAChD;AAEA,SAAgB,aACd,YACA,MAC+B;CAC/B,OAAO,WAAW,MAAM,SAAS,KAAK,SAAS,IAAI;AACrD;AAEA,SAAgB,WAAW,YAA8D;CACvF,MAAM,UAAU,aAAa,YAAY,KAAK;CAC9C,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,MAAM,MAAM,QAAQ,KAAK;CACzB,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,OAAO,YAAY,IAAI,KAAK;AAC9B;AAQA,SAAgB,uBACd,YACqC;CACrC,MAAM,eAAe,aAAa,YAAY,UAAU;CACxD,IAAI,CAAC,cAAc,OAAO,KAAA;CAE1B,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,KAAK,MAAM,OAAO,aAAa,MAC7B,IAAI,IAAI,SAAS,cACf,eAAe,YAAY,IAAI,KAAK;MAC/B,IAAI,IAAI,SAAS,QACtB,eAAe,YAAY,IAAI,KAAK;MAC/B,IAAI,IAAI,SAAS,UACtB,YAAY;MACP,IAAI,IAAI,SAAS,cACtB,gBAAgB;CAIpB,MAAM,SAAS,YAAY,eAAe,UAAU,KAAK,IAAI,KAAA;CAC7D,MAAM,aAAa,gBAAgB,eAAe,cAAc,KAAK,IAAI,KAAA;CAEzE,OAAO;EACL,GAAG,UAAU,gBAAgB,YAAY;EACzC,GAAG,UAAU,UAAU,MAAM;EAC7B,GAAG,UAAU,cAAc,UAAU;CACvC;AACF;AAEA,SAAS,YAAY,OAAuB;CAC1C,IAAI,MAAM,WAAW,IAAG,KAAK,MAAM,SAAS,IAAG,GAC7C,OAAO,MAAM,MAAM,GAAG,EAAE;CAE1B,OAAO;AACT;;;;;;;;;;AC9DA,SAAS,gBAAgB,OAAgB,SAAiB,aAAqC;CAC7F,MAAM,QAAQ,YAAY,IAAI,OAAO;CACrC,IAAI,CAAC,OACH,MAAM,6BAA6B,EAAE,QAAQ,CAAC;CAEhD,OAAO,MAAM,WAAW,KAAK;AAC/B;;;;;AAkBA,SAAS,sCAAsC,OAKtC;CACP,KAAK,MAAM,aAAa,MAAM,YAC5B,MAAM,YAAY,KAAK;EACrB,MAAM;EACN,SAAS,sCAAsC,UAAU,KAAK;EAC9D,UAAU,MAAM;EAChB,MAAM,YAAY,UAAU,KAAK,QAAQ,MAAM,UAAU;CAC3D,CAAC;AAEL;AAeA,SAAS,kBAAkB,gBAAwB,aAA6B;CAC9E,OAAO,GAAG,eAAe,IAAI;AAC/B;AAEA,SAAS,qBAAqB,OAAmC;CAC/D,MAAM,kCAAkB,IAAI,IAAoB;CAChD,KAAK,MAAM,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;EAC/C,MAAM,SAAS,WAAW,MAAM,UAAU,KAAK,MAAM;EACrD,gBAAgB,IAAI,MAAM,MAAM,MAAM;CACxC;CACA,OAAO,EAAE,gBAAgB;AAC3B;AAEA,SAAS,sBAAsB,OAA4B;CACzD,OAAO,WAAW,MAAM,UAAU,KAAK,WAAW,MAAM,IAAI;AAC9D;AAmBA,SAAS,cAAc,WAAmC;CACxD,OAAO,SAAS,WAAW,oBAAoB;AACjD;AAEA,SAAS,gCACP,QACA,UACA,aAIA;CACA,MAAM,4CAA4B,IAAI,IAAsC;CAC5E,MAAM,mCAAmB,IAAI,IAA6B;CAE1D,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,QAAQ,MAAM,YAAY;EACnC,IAAI,KAAK,SAAS,iBAAiB;GACjC,MAAM,YAAY,sBAAsB,IAAI;GAC5C,IAAI,CAAC,WAAW;IACd,YAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;GACA,MAAM,YAAY,MAAM,OAAO;GAC/B,IAAI,aAAa,UAAU,aAAa,UAAU;IAChD,YAAY,KAAK;KACf,MAAM;KACN,SAAS,wBAAwB,UAAU,cAAc,MAAM,KAAK,oCAAoC,UAAU,SAAS;KAC3H;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;GACA,0BAA0B,IAAI,MAAM,MAAM;IAAE;IAAW,MAAM,KAAK;GAAK,CAAC;EAC1E;EACA,IAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,WAAW,sBAAsB,MAAM,CAAC;GAC9C,MAAM,WAAW,sBAAsB,MAAM,CAAC;GAC9C,IAAI,CAAC,YAAY,CAAC,UAAU;IAC1B,YAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;GACA,MAAM,QAAQ,yBAAyB,QAAQ;GAC/C,IAAI,UAAU,KAAA,GAAW;IACvB,YAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;GACA,MAAM,iBAAiB,sBAAsB,KAAK;GAClD,iBAAiB,IAAI,MAAM,MAAM;IAAE;IAAU;IAAO;IAAgB,MAAM,KAAK;GAAK,CAAC;EACvF;CACF;CAGF,OAAO;EAAE;EAA2B;CAAiB;AACvD;AAEA,SAAS,oBAAoB,OAgB3B;CACA,MAAM,EACJ,2BACA,kBACA,YACA,UACA,WAAW,eACX,YACA,uBACE;CACJ,IAAI,UAAU,MAAM;CACpB,IAAI,QAAQ,MAAM;CAClB,IAAI,cAAc,MAAM;CACxB,MAAM,cAA0C,CAAC;CAEjD,KAAK,MAAM,CAAC,WAAW,SAAS,2BAA2B;EACzD,IAAI,iBAAiB,IAAI,SAAS,GAAG;GACnC,YAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU;IAC7B;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,QAAQ,QAAQ;EACtB,IAAI,CAAC,OAAO;EAEZ,MAAM,YAAY,cAAc,MAAM,MAAM,EAAE,SAAS,SAAS;EAChE,MAAM,2BAA2B,YAC5B,qBAAqB,SAAS,CAAC,CAAC,gBAAgB,IAAI,KAAK,SAAS,KAAK,KAAK,YAC7E,KAAK;EAET,IAAI,CAAC,OAAO,OAAO,MAAM,QAAQ,wBAAwB,GAAG;GAC1D,YAAY,KAAK;IACf,MAAM;IACN,SAAS,wBAAwB,KAAK,UAAU,6BAA6B,UAAU;IACvF;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,WAAuD,CAAC;EAC9D,KAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;GACtD,IAAI,SAAS,aAAa,WAAW;GACrC,SAAS,eAAe,EAAE,OAAO,SAAS,MAAM;EAClD;EAEA,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,WAAW,GAAG;GACtC,YAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU,6DAA6D,UAAU;IACpG;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,UAAU;GACR,GAAG;IACF,YAAY;IAAE,GAAG;IAAO,eAAe,EAAE,OAAO,yBAAyB;IAAG;GAAS;EACxF;CACF;CAEA,KAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;EACtD,IAAI,CAAC,WAAW,IAAI,SAAS,QAAQ,GAAG;GACtC,YAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,0CAA0C,SAAS,SAAS;IAC3F;IACA,MAAM,SAAS;GACjB,CAAC;GACD;EACF;EAEA,IAAI,CAAC,0BAA0B,IAAI,SAAS,QAAQ,GAAG;GACrD,YAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,oBAAoB,SAAS,SAAS,cAAc,SAAS,SAAS;IACrG;IACA,MAAM,SAAS;GACjB,CAAC;GACD;EACF;EAEA,IAAI,0BAA0B,IAAI,WAAW,GAC3C;EAGF,MAAM,YAAY,QAAQ,SAAS;EACnC,MAAM,mBAAmB,cAAc,MAAM,MAAM,EAAE,SAAS,WAAW;EACzE,IAAI,CAAC,kBAAkB;EAGvB,IAFuB,WAAW,iBAAiB,UAAU,MAAM,KAAA,KAE7C,aAAa,SAAS,mBAAmB,UAAU,QAAQ,YAAY;GAC3F,YAAY,KAAK;IACf,MAAM;IACN,SAAS,kBAAkB,YAAY,qDAAqD,SAAS,SAAS;IAC9G;IACA,MAAM,SAAS;GACjB,CAAC;GACD;EACF;EAEA,MAAM,iBAAiB,WAAW,QAAQ,cAAc,SAAS;EACjE,MAAM,eAAe,QAAQ;EAC7B,IAAI,cACF,UAAU;GACR,GAAG;IACF,cAAc;IACb,GAAG;IACH,MAAM,cAAc,SAAS,QAAQ;IACrC,SAAS,EAAE,YAAY,eAAe;GACxC;EACF;EAGF,MAAM,wBAAwB,sBAAsB,gBAAgB;EACpE,IAAI,MAAM,sBAAsB,EAAE,UAAU,aAC1C,IAAI,0BAA0B,kBAAkB,WAC9C,QAAQ;GAAE,GAAG;IAAQ,wBAAwB,cAAc,SAAS,QAAQ;EAAE;OAE9E,QAAQ,OAAO,YACb,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,QAAQ,qBAAqB,CACvE;EAIJ,MAAM,oBAAoB,mBAAmB,IAAI,WAAW,KAAK,CAAC;EAClE,MAAM,WAAW,YAAY;EAG7B,MAAM,qBADiB,QAAQ,SAAS,SACC,EAAE,eAAe;EAC1D,MAAM,uBAAqC,CAAC;EAC5C,IAAI,oBACF,KAAK,MAAM,OAAO,mBAAmB;GACnC,MAAM,SAAS,kCAAkC,KAAK;IACpD;IACA,oBAAoB,SAAS;GAC/B,CAAC;GACD,IAAI,OAAO,SAAS,YAAY;IAC9B,MAAM,OAAO,WAAW,IAAI,GAAG,KAAK,SAAS;IAC7C,YAAY,KAAK;KACf,MAAM;KACN,SAAS,YAAY,YAAY,8CAA8C,OAAO;KACtF;KACA;IACF,CAAC;IACD;GACF;GACA,IAAI,OAAO,UAAU,KACnB,WAAW,IAAI,OAAO,OAAO,WAAW,IAAI,GAAG,KAAK,SAAS,IAAI;GAEnE,qBAAqB,KAAK,OAAO,KAAK;EACxC;OAEA,qBAAqB,KAAK,GAAG,iBAAiB;EAGhD,IAAI,0BAA0B,gBAAgB;GAC5C,MAAM,WAAW,OAAO,YACtB,OAAO,QAAQ,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,QAAQ,qBAAqB,CAC7E;GACA,IAAI,qBAAqB,SAAS,KAAK,UAAU;IAC/C,MAAM,cAAe,SAAS,cAAc,CAAC;IAC7C,cAAc;KACZ,GAAG;MACF,iBAAiB;MAChB,GAAG;MACH,SAAS,CAAC,GAAG,aAAa,GAAG,oBAAoB;KACnD;IACF;GACF,OACE,cAAc;EAElB,OAAO,IAAI,UAAU;GACnB,MAAM,kBAAmB,SAAS,cAAc,CAAC;GACjD,MAAM,kBAAkB,IAAI,IAAgB,iBAAiB;GAC7D,MAAM,0BAA0B,gBAAgB,QAAQ,QAAQ,CAAC,gBAAgB,IAAI,GAAG,CAAC;GACzF,MAAM,gBAAgB,CAAC,GAAG,uBAAuB;GACjD,KAAK,MAAM,OAAO,sBAAsB;IACtC,MAAM,SAAS,cAAc,GAAG;IAIhC,IAAI,CAHgB,wBAAwB,MACzC,aAAa,cAAc,QAAQ,MAAM,MAE7B,GACb,cAAc,KAAK,GAAG;GAE1B;GACA,IACE,cAAc,WAAW,gBAAgB,UACzC,cAAc,MAAM,KAAK,MAAM,QAAQ,gBAAgB,EAAE,GACzD;IACA,MAAM,OAAgC,EAAE,GAAG,SAAS;IACpD,IAAI,cAAc,SAAS,GACzB,KAAK,aAAa;SAElB,OAAO,KAAK;IAEd,cAAc;KAAE,GAAG;MAAc,iBAAiB;IAAK;GACzD;EACF;CACF;CAEA,OAAO;EAAE,QAAQ;EAAS;EAAO;EAAa;CAAY;AAC5D;AAOA,SAAS,cAAc,OAAwB;CAC7C,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,IAAI,MAAM,IAAI,aAAa,CAAC,CAAC,KAAK,GAAG,EAAE;CAEhD,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO,IAAI,OAAO,QAAQ,KAAgC,CAAC,CACxD,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,cAAc,KAAK,CAAC,CAAC,CACpD,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,UAAU,GAAG,EAAE,GAAG,cAAc,KAAK,GAAG,CAAC,CACvE,KAAK,GAAG,EAAE;CAEf,OAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,oBAAoB,KAAiD;CAC5E,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,WAAW,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,SAAS,EAAE;CAC7D,MAAM,MAAM,OAAO,QAAQ;CAC3B,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO;CACpC,IAAI;EAAC;EAAQ;EAAY;EAAM;CAAQ,CAAC,CAAC,SAAS,QAAQ,GACxD,OAAO;CACT,OAAO;AACT;AAEA,SAAS,gBAAgB,KAA6C;CACpE,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,MAAM,IAAI,OAAO,GAAG;CACpB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI,KAAA;AAClC;AAEA,SAAS,gBAAgB,KAA8C;CACrE,IAAI,QAAQ,QAAQ,OAAO;CAC3B,IAAI,QAAQ,SAAS,OAAO;AAE9B;AAEA,SAAS,aAAa,KAA8D;CAClF,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,MAAM,WAAW,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,QAAQ,IAAG;CAClF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,QAAQ;EAClC,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GACxE,OAAO;CAEX,QAAQ,CAER;AAEF;AAEA,SAAS,eAAe,MAA8D;CACpF,MAAM,SAAS,kBAAkB,iBAAiB,MAAM,iBAAiB,CAAC;CAC1E,IAAI,CAAC,QAUH,OARE,iBAAiB,MAAM,mBAAmB,KAAK,QAC/C,iBAAiB,MAAM,oBAAoB,KAAK,QAChD,iBAAiB,MAAM,oBAAoB,KAAK,QAChD,iBAAiB,MAAM,0BAA0B,KAAK,QACtD,iBAAiB,MAAM,oBAAoB,KAAK,QAChD,iBAAiB,MAAM,sBAAsB,KAAK,QAClD,iBAAiB,MAAM,oBAAoB,KAAK,QAChD,iBAAiB,MAAM,wBAAwB,KAAK,OAC1B,OAAO,KAAA;CAGrC,MAAM,YAA8B,EAAE,OAAO;CAC7C,MAAM,WAAW,gBAAgB,iBAAiB,MAAM,mBAAmB,CAAC;CAC5E,IAAI,YAAY,MAAM,UAAU,WAAW;CAC3C,MAAM,YAAY,gBAAgB,iBAAiB,MAAM,oBAAoB,CAAC;CAC9E,IAAI,aAAa,MAAM,UAAU,YAAY;CAC7C,MAAM,YAAY,kBAAkB,iBAAiB,MAAM,oBAAoB,CAAC;CAChF,IAAI,aAAa,MAAM,UAAU,YAAY;CAC7C,MAAM,kBAAkB,gBAAgB,iBAAiB,MAAM,0BAA0B,CAAC;CAC1F,IAAI,mBAAmB,MAAM,UAAU,kBAAkB;CACzD,MAAM,YAAY,kBAAkB,iBAAiB,MAAM,oBAAoB,CAAC;CAChF,IAAI,aAAa,MAAM,UAAU,YAAY;CAC7C,MAAM,cAAc,kBAAkB,iBAAiB,MAAM,sBAAsB,CAAC;CACpF,IAAI,eAAe,MAAM,UAAU,cAAc;CACjD,MAAM,YAAY,gBAAgB,iBAAiB,MAAM,oBAAoB,CAAC;CAC9E,IAAI,aAAa,MAAM,UAAU,YAAY;CAC7C,MAAM,gBAAgB,gBAAgB,iBAAiB,MAAM,wBAAwB,CAAC;CACtF,IAAI,iBAAiB,MAAM,UAAU,gBAAgB;CACrD,OAAO;AACT;AAEA,SAAS,kBAAkB,KAA6C;CACtE,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,OAAO,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,SAAS,EAAE;AACrD;AAEA,SAAS,oBACP,KACA,OACmC;CACnC,IAAI,CAAC,KAAK,OAAO,KAAA;CAEjB,MAAM,QADW,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,SAAS,EACtC,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,KAAK;CAClE,IAAI,MAAM,WAAW,GAAG,OAAO,KAAA;CAC/B,MAAM,SAAS,MACZ,MAAM,GAAG,CAAC,CACV,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CACpB,QAAQ,MAAM,EAAE,SAAS,CAAC;CAC7B,MAAM,SAAgC,CAAC;CACvC,KAAK,MAAM,KAAK,QACd,OAAO,KAAK;CAEd,OAAO;AACT;AAEA,SAAS,eACP,UACA,eACA,YACA,UACA,aACA,YACc;CACd,MAAM,UAAwB,CAAC;CAC/B,IAAI,iBAAiB;CAOrB,MAAM,sCAAsB,IAAI,IAAY;CAC5C,KAAK,MAAM,KAAK,OAAO,OAAO,SAAS,MAAM,GAAG;EAC9C,IAAI,WAAW,IAAI,EAAE,QAAQ,GAAG;EAChC,oBAAoB,IAAI,EAAE,IAAI;CAChC;CAEA,KAAK,MAAM,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;EAClD,IAAI,WAAW,IAAI,MAAM,QAAQ,GAAG;EACpC,MAAM,aAAa,aAAa,MAAM,YAAY,QAAQ;EAC1D,IAAI,CAAC,YAAY;EAEjB,MAAM,mBAAmB,IAAI,WAAW;GACtC,MAAM,CAAC;IAAE,OAFQ,cAAc,gBAAgB,IAAI,MAAM,IAAI,KAAK,MAAM;IAE5C,WAAW;GAAE,CAAC;GAC1C,QAAQ;EACV,CAAC;EACD,QAAQ,KAAK,gBAAgB;EAC7B,WAAW,IAAI,kBAAkB,WAAW,IAAI;CAClD;CAEA,KAAK,MAAM,QAAQ,SAAS,YAAY;EACtC,MAAM,UAAU,KAAK,SAAS;EAC9B,MAAM,WAAW,KAAK,SAAS;EAC/B,MAAM,cAAc,KAAK,SAAS;EAClC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa;EAE3C,MAAM,YAAY,sBAAsB,MAAM,CAAC;EAC/C,IAAI,CAAC,WAAW;EAChB,MAAM,eAAe,oBAAoB,SAAS;EAClD,IAAI,aAAa,WAAW,GAAG;EAE/B,MAAM,cAAc,aAAa,MAAM,MAAM,EAAE,UAAU;EAGzD,IAFsB,aAAa,QAAQ,MAAM,EAAE,UAAU,CAAC,CAAC,SAE3C,GAAG;GACrB,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,IAAI,YAAY,aAAa;GAC3B,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,IAAI,aAAa;GACf;GACA,IAAI,iBAAiB,GAAG;IACtB,YAAY,KAAK;KACf,MAAM;KACN,SAAS,0DAA0D,SAAS,KAAK;KACjF;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;GAEA,IAAI,aAAa;IACf,YAAY,KAAK;KACf,MAAM;KACN,SACE;KACF;KACA,MAAM,KAAK;IACb,CAAC;IACD;GACF;EACF;EAEA,MAAM,UAAU,iBAAiB,MAAM,MAAM;EAC7C,MAAM,mBAA2C,cAC7C,SACA,oBAAoB,OAAO;EAE/B,IACE,eACA,OAAO,qBAAqB,YAC5B;GAAC;GAAU;GAAY;EAAI,CAAC,CAAC,SAAS,gBAAgB,GACtD;GACA,YAAY,KAAK;IACf,MAAM;IACN,SAAS,mDAAmD;IAC5D;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,IAAI,qBAAqB,YAAY,aAAa,SAAS,GAAG;GAC5D,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,IAAI;EACJ,KAAK,MAAM,MAAM,cAAc;GAC7B,IAAI;GACJ,IAAI,GAAG,YAAY;IACjB,MAAM,gBAAgB,GAAG,KAAK,MAAM,gBAAgB;IACpD,qBAAqB,gBAAgB,cAAc,KAAK,KAAA;GAC1D,OACE,qBAAqB,GAAG;GAE1B,IAAI,uBAAuB,KAAA,KAAa,mBAAmB,WAAW,GAAG;GACzE,IAAI,CAAC,oBAAoB,IAAI,kBAAkB,GAAG;IAChD,eAAe;IACf;GACF;EACF;EACA,IAAI,iBAAiB,KAAA,GAAW;GAC9B,YAAY,KAAK;IACf,MAAM;IACN,SAAS,mBAAmB,SAAS,KAAK,8BAA8B,aAAa;IACrF;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,OAAO,aAAa,KAAK,OAAO;GASpC,OAAO;IAAE,OARU,GAAG,aAClB,GAAG,KAAK,QAAQ,mBAAmB,GAAG,WAAmB;KACvD,MAAM,SAAS,cAAc,gBAAgB,IAAI,MAAM;KACvD,OAAO,SAAS,GAAG,OAAO,QAAQ,GAAG,OAAO;IAC9C,CAAC,IACA,cAAc,gBAAgB,IAAI,GAAG,IAAI,KAAK,GAAG;IAG1B,WAD1B,GAAG,aAAa,OAAQ,GAAG,YAAuC;GAC9B;EACxC,CAAC;EAED,MAAM,SAAS,WAAW,OAAO,KAAA;EACjC,MAAM,SAAS,cAAc,KAAA,IAAY,gBAAgB,iBAAiB,MAAM,QAAQ,CAAC;EACzF,MAAM,qBAAqB,cACvB,KAAA,IACA,gBAAgB,iBAAiB,MAAM,oBAAoB,CAAC;EAEhE,IAAI,eAAe,sBAAsB,MAAM;GAC7C,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,0BAA0B,aAAa,iBAAiB,MAAM,QAAQ,CAAC;EAE7E,MAAM,aAAa,iBAAiB,MAAM,SAAS;EACnD,MAAM,aAAa,iBAAiB,MAAM,SAAS;EAEnD,IAAI,cAAc,QAAQ,cAAc,MAAM;GAC5C,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,KAAK,cAAc,QAAQ,cAAc,SAAS,CAAC,aAAa;GAC9D,YAAY,KAAK;IACf,MAAM;IACN,SACE;IACF;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,qBACJ,cAAc,OACV,oBAAoB,YAAY,CAAC,IACjC,cAAc,OACZ,oBAAoB,YAAY,CAAC,IACjC,KAAA;EAER,MAAM,YAAY,eAAe,IAAI;EACrC,IAAI,cAAc,MAAM;GACtB,YAAY,KAAK;IACf,MAAM;IACN,SAAS;IACT;IACA,MAAM,KAAK;GACb,CAAC;GACD;EACF;EAEA,MAAM,aAAa,aAAa,iBAAiB,MAAM,SAAS,CAAC;EACjE,IAAI;EACJ,IAAI,YAAY;GACd,UAAU,CAAC;GACX,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,UAAU,GAC5C,IAAI,OAAO,MAAM,UAAU,QAAQ,KAAK;EAE5C;EAKA,MAAM,mBAAmB,kBAHF,cACnB,iBAAiB,MAAM,UAAU,IACjC,iBAAiB,MAAM,kBAAkB,CACY;EAGzD,MAAM,oBAAoB,kBADF,iBAAiB,MAAM,kBACW,CAAC;EAE3D,MAAM,QAAQ,IAAI,WAAW;GAC3B;GACA,GAAI,UAAU,QAAQ,EAAE,OAAO;GAC/B,GAAI,UAAU,QAAQ,EAAE,OAAO;GAC/B,GAAI,sBAAsB,QAAQ,EAAE,mBAAmB;GACvD,GAAI,2BAA2B,QAAQ,EAAE,wBAAwB;GACjE,GAAI,sBAAsB,QAAQ,EAAE,mBAAmB;GACvD,GAAI,aAAa,QAAQ,EAAE,UAAU;GACrC,GAAI,WAAW,QAAQ,EAAE,QAAQ;GACjC,GAAI,oBAAoB,QAAQ,EAAE,iBAAiB;GACnD,GAAI,qBAAqB,QAAQ,EAAE,kBAAkB;EACvD,CAAC;EAED,QAAQ,KAAK,KAAK;EAClB,WAAW,IAAI,OAAO,KAAK,IAAI;CACjC;CAEA,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAoB,YAA0C;CACrF,OAAO,WAAW,IAAI,MAAM,QAAQ;AACtC;AAGA,MAAM,2BAA2B;AAEjC,SAAS,oBACP,OACA,uBACoB;CACpB,OAAO,sBAAsB,IAAI,MAAM,QAAQ;AACjD;AAEA,SAAS,wBACP,OACA,WACA,oBACA,uBACA,mBACA,UACA,aAC2B;CAC3B,IAAI,mBAAmB,IAAI,MAAM,QAAQ,GAAG;EAC1C,MAAM,SAAwB;GAC5B,MAAM;IAAE,MAAM;IAAe,MAAM,MAAM;GAAS;GAClD,UAAU,MAAM;EAClB;EACA,OAAO,MAAM,OAAO;GAAE,GAAG;GAAQ,MAAM;EAAK,IAAI;CAClD;CAIA,MAAM,cAAc,kBAAkB,IAAI,MAAM,QAAQ;CACxD,IAAI,gBAAgB,KAAA,GAAW;EAC7B,MAAM,WAAwB;GAC5B,OAAO;GACP,YAAY;GACZ,aAAa;GACb,YAAY,MAAM;EACpB;EACA,MAAM,SAAwB;GAC5B,MAAM;IAAE,MAAM;IAAU,SAAS;GAAY;GAC7C,UAAU,MAAM;GAChB;EACF;EACA,OAAO,MAAM,OAAO;GAAE,GAAG;GAAQ,MAAM;EAAK,IAAI;CAClD;CAGA,IAAI,MAAM,eACR;CAGF,MAAM,UAAU,oBAAoB,OAAO,qBAAqB;CAChE,IAAI,CAAC,SAAS;EACZ,YAAY,KAAK;GACf,MAAM;GACN,SAAS,UAAU,UAAU,GAAG,MAAM,KAAK,UAAU,MAAM,SAAS;GACpE;GACA,MAAM,MAAM;EACd,CAAC;EACD;CACF;CAEA,MAAM,SAAwB;EAC5B,MAAM;GAAE,MAAM;GAAU;EAAQ;EAChC,UAAU,MAAM;CAClB;CACA,OAAO,MAAM,OAAO;EAAE,GAAG;EAAQ,MAAM;CAAK,IAAI;AAClD;AAEA,SAAS,wBAAwB,OAMA;CAC/B,MAAM,aAA2C,CAAC;CAElD,IAAI,MAAM,WAAW,WAAW,GAAG,OAAO;CAE1C,MAAM,iBACJ,MAAM,wBAAwB,cAAc,YAAY,KAAA,KACxD,gCAAgC,MAAM,uBAAuB,YAAY,OAAO,IAC5E,MAAM,uBAAuB,YAAY,UACzC,KAAA;CAEN,IAAI,CAAC,gBAAgB;EACnB,KAAK,MAAM,QAAQ,MAAM,YACvB,MAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,SAAS,KAAK,KAAK;GAC5B,UAAU,MAAM;GAChB,MAAM,KAAK;EACb,CAAC;EAEH,OAAO;CACT;CAEA,KAAK,MAAM,QAAQ,MAAM,YAAY;EACnC,MAAM,SAAS,+BACb,QACA,gBACA,CAAC,IAAI,GACL,MAAM,aACR;EAEA,IAAI,WAAW,KAAA,KAAa,WAAW,MAAM;EAE7C,WAAW,KAAK,QAAQ;GACtB,SAAS,OAAO;GAChB,SAAS,OAAO,YAAY,KAAK,OAAO;IACtC,MAAM,EAAE;IACR,OAAO,UACL,EAAE,KACJ;GACF,EAAE;EACJ;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,oCACd,OAC6C;CAC7C,MAAM,EAAE,aAAa,YAAY,uBAAuB,gBAAgB;CACxE,MAAM,WAAW,MAAM;CACvB,MAAM,cAA0C,CAAC,GAAI,MAAM,mBAAmB,CAAC,CAAE;CACjF,MAAM,WAAW,YAAY;CAC7B,sCAAsC;EACpC,YAAY,OAAO,OAAO,SAAS,UAAU;EAC7C;EACA;EACA;CACF,CAAC;CACD,MAAM,YAA2B,OAAO,OAAO,SAAS,MAAM;CAC9D,MAAM,oBAA2C,OAAO,OAAO,SAAS,cAAc;CACtF,MAAM,aAAa,IAAI,IAAI,UAAU,KAAK,MAAM,EAAE,IAAI,CAAC;CACvD,MAAM,qBAAqB,IAAI,IAAI,kBAAkB,KAAK,OAAO,GAAG,IAAI,CAAC;CAMzE,MAAM,aAAa,wBAAwB;EACzC,YALyB,OAAO,OAAO,SAAS,MAAM,CAAC,CACtD,QAAQ,MAAM,EAAE,YAAY,MAAM,CAAC,CACnC,KAAK,MAAM,EAAE,KAGe;EAC7B;EACA,wBAAwB,MAAM;EAC9B,eAAe;GACb,QAAQ;GACR,QAAQ;GACR,GAAG,UAAU,uBAAuB,MAAM,mBAAmB;GAC7D,GAAG,UAAU,eAAe,WAAW;GACvC;GACA,aAAa,EACX,OAAO,MAAM;IACX,YAAY,KACV,UAA4E,CAAC,CAC/E;GACF,EACF;EACF;EACA;CACF,CAAC;CAED,MAAM,oBAAyC,IAAI,IACjD,OAAO,QAAQ,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CACjE;CAEA,MAAM,SAA0C,CAAC;CACjD,MAAM,cAAuD,CAAC;CAC9D,MAAM,QAAwC,CAAC;CAC/C,MAAM,iBAA+B,CAAC;CACtC,MAAM,6BAAa,IAAI,IAAyB;CAChD,MAAM,qCAAqB,IAAI,IAAmC;CAUlE,MAAM,yBAAkD,CAAC;CAEzD,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,iBAAiB,sBAAsB,QAAQ;EACrD,MAAM,gBAAgB,qBAAqB,QAAQ;EAEnD,MAAM,SAAwC,CAAC;EAC/C,MAAM,YAAuD,CAAC;EAE9D,KAAK,MAAM,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;GAClD,IAAI,gBAAgB,OAAO,UAAU,GAAG;IACtC,MAAM,WAAW,uBAAuB,MAAM,UAAU;IAExD,IAAI,MAAM,QAAQ,EAAE,UAAU,UAAU,UAAU,aAAa;KAC7D,uBAAuB,KAAK;MAC1B,WAAW,SAAS;MACpB,WAAW,MAAM;MACjB,iBAAiB,MAAM;MACvB,GAAG,UAAU,gBAAgB,UAAU,YAAY;MACnD,aAAa,MAAM,OAAO,QAAQ;MAClC;KACF,CAAC;KACD;IACF;IAEA,IAAI,UAAU,UAAU,UAAU,YAAY;KAC5C,MAAM,cAAc,SAAS,OAAO,KAAK,MAAM,cAAc,gBAAgB,IAAI,CAAC,KAAK,CAAC;KAExF,MAAM,cAAc,UAAU,MAAM,MAAM,EAAE,SAAS,MAAM,QAAQ;KACnE,MAAM,sBAAsB,cAAc,qBAAqB,WAAW,IAAI,KAAA;KAC9E,MAAM,eAAe,SAAS,WAAW,KACtC,MAAM,qBAAqB,gBAAgB,IAAI,CAAC,KAAK,CACxD;KAEA,UAAU,MAAM,QAAQ;MACtB,IAAI,cAAc,MAAM,QAAQ;MAChC,aAAa;MACb,IAAI;OACF,aAAa;OACb,cAAc;MAChB;KACF;KAEA,eAAe,KAAK;MAClB,gBAAgB,SAAS;MACzB,WAAW,MAAM;MACjB,aAAa,MAAM;MACnB,GAAG,UAAU,gBAAgB,SAAS,YAAY;MAClD,aAAa;MACb,cAAc;KAChB,CAAC;IACH;IACA;GACF;GAEA,MAAM,WAAW,wBACf,OACA,SAAS,MACT,oBACA,uBACA,mBACA,UACA,WACF;GACA,IAAI,CAAC,UAAU;GAEf,MAAM,aAAa,cAAc,gBAAgB,IAAI,MAAM,IAAI,KAAK,MAAM;GAC1E,OAAO,cAAc;EACvB;EAEA,MAAM,iBAAiB,SAAS,WAAW,MAAM,SAAS,KAAK,SAAS,MAAM;EAC9E,MAAM,aAAa,OAAO,OAAO,SAAS,MAAM,CAAC,CAAC,MAC/C,MAAM,aAAa,EAAE,YAAY,IAAI,MAAM,KAAA,CAC9C;EAEA,IAAI,CAAC,gBACH,IAAI,CAAC,YACH,YAAY,KAAK;GACf,MAAM;GACN,SAAS,UAAU,SAAS,KAAK;GACjC;EACF,CAAC;OACI;GAML,MAAM,kBAAkB,sBAAsB,IAAI,wBAAwB;GAC1E,MAAM,UAAU,OAAO;GAMvB,IAAI,EAJF,YAAY,KAAA,KACZ,QAAQ,KAAK,SAAS,YACtB,oBAAoB,KAAA,KACpB,QAAQ,KAAK,YAAY,kBAEzB,YAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,SAAS,KAAK;IACjC;GACF,CAAC;EAEL;EAGF,OAAO,SAAS,QAAQ;GAAE;GAAQ;GAAW,SAAS,EAAE,YAAY,eAAe;EAAE;EACrF,MAAM,eAAe,eACnB,UACA,eACA,YACA,UACA,aACA,UACF;EACA,mBAAmB,IAAI,SAAS,MAAM,YAAY;EAClD,MAAM,eAAe,YAAY;EACjC,IAAI,gBAAgB,aAAa,SAAS,GAExC,YAAY,kBAAkB,EAAE,SAAS,CAAC,GADjB,aAAa,cAAc,CAAC,GACS,GAAG,YAAY,EAAE;OAC1E,IAAI,CAAC,cACV,YAAY,kBAAkB,aAAa,SAAS,IAAI,EAAE,SAAS,aAAa,IAAI,CAAC;EAEvF,MAAM,kBAAkB,cAAc,SAAS,IAAI;CACrD;CAEA,MAAM,eAAoD,CAAC;CAC3D,KAAK,MAAM,iBAAiB,mBAAmB;EAC7C,MAAM,SAAwC,CAAC;EAC/C,KAAK,MAAM,SAAS,OAAO,OAAO,cAAc,MAAM,GAAG;GACvD,MAAM,WAAW,wBACf,OACA,cAAc,MACd,oBACA,uBACA,mBACA,UACA,WACF;GACA,IAAI,CAAC,UAAU;GACf,OAAO,MAAM,QAAQ;EACvB;EACA,aAAa,cAAc,QAAQ,EAAE,OAAO;CAC9C;CAEA,MAAM,oCAAoB,IAAI,IAA0B;CACxD,KAAK,MAAM,MAAM,gBAAgB;EAC/B,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,WAAW;EAC/D,MAAM,WAAW,kBAAkB,IAAI,GAAG;EAC1C,IAAI,UACF,SAAS,KAAK,EAAE;OAEhB,kBAAkB,IAAI,KAAK,CAAC,EAAE,CAAC;CAEnC;CAEA,KAAK,MAAM,aAAa,wBAAwB;EAC9C,MAAM,UAAU,kBAAkB,UAAU,iBAAiB,UAAU,SAAS;EAChF,MAAM,cAAc,kBAAkB,IAAI,OAAO,KAAK,CAAC;EACvD,MAAM,UAAU,UAAU,eACtB,YAAY,QAAQ,MAAM,EAAE,iBAAiB,UAAU,YAAY,IACnE,CAAC,GAAG,WAAW;EAEnB,IAAI,QAAQ,WAAW,GAAG;GACxB,YAAY,KAAK;IACf,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,UAAU,+CAA+C,UAAU,gBAAgB;IACzJ;IACA,MAAM,UAAU,MAAM;GACxB,CAAC;GACD;EACF;EACA,IAAI,QAAQ,SAAS,GAAG;GACtB,YAAY,KAAK;IACf,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,UAAU,iDAAiD,UAAU,gBAAgB;IAC3J;IACA,MAAM,UAAU,MAAM;GACxB,CAAC;GACD;EACF;EAEA,MAAM,KAAK,QAAQ;EACnB,IAAI,CAAC,IAAI;EACT,MAAM,aAAa,OAAO,UAAU;EACpC,IAAI,CAAC,YAAY;EACjB,WAAW,UAAU,UAAU,aAAa;GAC1C,IAAI,cAAc,UAAU,eAAe;GAC3C,aAAa,UAAU;GACvB,IAAI;IACF,aAAa,GAAG;IAChB,cAAc,GAAG;GACnB;EACF;CACF;CAEA,MAAM,EAAE,2BAA2B,qBAAqB,gCACtD,WACA,UACA,WACF;CACA,MAAM,aAAa,oBAAoB;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,IAAI,YAAY,SAAS,KAAK,WAAW,YAAY,SAAS,GAC5D,OAAO,MAAM;EACX,SAAS;EACT,aAAa,CAAC,GAAG,aAAa,GAAG,WAAW,WAAW;CACzD,CAAC;CAGH,MAAM,iBAAiB,WAAW;CAClC,MAAM,sBAAsB,WAAW;CAOvC,MAAM,mBAAuD,CAAC;CAC9D,MAAM,cAAc,OAAO,QAAQ,UAAU;CAC7C,IAAI,YAAY,SAAS,GAAG;EAC1B,cACE,aACA,wEACF;EACA,KAAK,MAAM,CAAC,UAAU,cAAc,aAClC,iBAAiB,YAAY;GAC3B,MAAM;GACN,QAAQ,UAAU,QAAQ,KAAK,MAC7B,gBAAgB,EAAE,OAAO,UAAU,SAAS,WAAW,CACzD;EACF;CAEJ;CAEA,KAAK,MAAM,GAAG,eAAe,OAAO,QAAQ,cAAc,GAAG;EAC3D,IAAI,WAAW,MAAM;EAGrB,MAAM,OAAO,oBADU,WAAW,QAAQ;EAE1C,IAAI,CAAC,MAAM;EAEX,IAAI,WAAW,iBAAiB,WAAW,UAAU;GACnD,MAAM,iBAAiB,OAAO,QAAQ,WAAW,QAAQ,CAAC,CAAC,KACxD,CAAC,aAAa,EAAE,cAAc;IAC7B,oBAAoB;IACpB,QAAQ,eAAe,YAAY,EAAE,UAAU,CAAC;GAClD,EACF;GACA,KAAK,eAAe,4BAClB,WAAW,QACX,WAAW,cAAc,OACzB,gBACA,cACA,aACA,gBACF;EACF,OACE,KAAK,eAAe,iBAClB,WAAW,QACX,cACA,aACA,gBACF;CAEJ;CAEA,MAAM,SAAS;CACf,MAAM,eAAe;CACrB,MAAM,mBAAyD,CAAC;CAChE,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,mBAAmB,GAAG;EAC9D,MAAM,MAA+B,CAAC;EACtC,IAAI,KAAK,cAAc,MAAM,IAAI,aAAa,KAAK;EACnD,IAAI,KAAK,gBAAgB,MAAM,IAAI,eAAe,KAAK;EACvD,IAAI,KAAK,cAAc,MAAM,IAAI,aAAa,KAAK;EACnD,iBAAiB,QAAQ,UAGvB,GAAG;CACP;CAGA,MAAM,mBAAmB,oBAAoB;EAC3C,IAAI;EACJ,SAAS;GACP,YAAY;GACZ,GANiB,OAAO,KAAK,gBAAgB,CAAC,CAAC,SAAS,IAMrC,EAAE,UAAU,iBAAiB,IAAI,CAAC;EACvD;CACF,CAAC;CAsBD,MAAM,UAAU,IAAI,aAAa;EAC/B,aAPkB,mBAAmB;GACrC;GACA;GACA,SAAS,EAfT,YAAY,GACT,uBAAuB;IACtB,IAAI;IACJ,SAAS;KACP,YAAY,iBAAiB,QAAQ;KACrC,GAAI,iBAAiB,QAAQ,aAAa,KAAA,IACtC,EAAE,UAAU,iBAAiB,QAAQ,SAAS,IAC9C,CAAC;IACP;GACF,EACF,EAK0B;GAC1B,GAAG;EACL,CAEY;EACV,YAAY,GACT,uBAAuB,iBAC1B;CACF,CAAC;CACD,MAAM,eAAwD,CAAC;CAE/D,MAAM,WAAW,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS;CAElD,OAAO,GAAG;EACR;EACA;EACA,OAAO,WAAW;EAClB,QAAQ,EACN,YAAY,GACT,uBAAuB;GACtB,QAAQ,WAAW;GACnB,GAAI,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;GAC/D,GAAI,WAAW,EAAE,MAAM,WAAW,IAAI,CAAC;EACzC,EACF,EACF;EACA;EACA,gBAAgB,CAAC;EACjB;EACA,aAAa,mBAAmB;GAAE;GAAQ;GAAc;EAAa,CAAC;EACtE,MAAM,CAAC;CACT,CAAC;AACH"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-contract-psl",
|
|
3
|
-
"version": "0.14.0-dev.
|
|
3
|
+
"version": "0.14.0-dev.37",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "PSL-to-Mongo ContractIR interpreter for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/config": "0.14.0-dev.
|
|
10
|
-
"@prisma-next/contract": "0.14.0-dev.
|
|
11
|
-
"@prisma-next/contract-authoring": "0.14.0-dev.
|
|
12
|
-
"@prisma-next/errors": "0.14.0-dev.
|
|
13
|
-
"@prisma-next/framework-components": "0.14.0-dev.
|
|
14
|
-
"@prisma-next/mongo-contract": "0.14.0-dev.
|
|
15
|
-
"@prisma-next/mongo-value": "0.14.0-dev.
|
|
16
|
-
"@prisma-next/psl-parser": "0.14.0-dev.
|
|
17
|
-
"@prisma-next/utils": "0.14.0-dev.
|
|
9
|
+
"@prisma-next/config": "0.14.0-dev.37",
|
|
10
|
+
"@prisma-next/contract": "0.14.0-dev.37",
|
|
11
|
+
"@prisma-next/contract-authoring": "0.14.0-dev.37",
|
|
12
|
+
"@prisma-next/errors": "0.14.0-dev.37",
|
|
13
|
+
"@prisma-next/framework-components": "0.14.0-dev.37",
|
|
14
|
+
"@prisma-next/mongo-contract": "0.14.0-dev.37",
|
|
15
|
+
"@prisma-next/mongo-value": "0.14.0-dev.37",
|
|
16
|
+
"@prisma-next/psl-parser": "0.14.0-dev.37",
|
|
17
|
+
"@prisma-next/utils": "0.14.0-dev.37",
|
|
18
18
|
"mongodb": "^7.2.0",
|
|
19
19
|
"pathe": "^2.0.3"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@prisma-next/tsconfig": "0.14.0-dev.
|
|
23
|
-
"@prisma-next/tsdown": "0.14.0-dev.
|
|
22
|
+
"@prisma-next/tsconfig": "0.14.0-dev.37",
|
|
23
|
+
"@prisma-next/tsdown": "0.14.0-dev.37",
|
|
24
24
|
"tsdown": "0.22.1",
|
|
25
25
|
"typescript": "5.9.3",
|
|
26
26
|
"vitest": "4.1.8"
|
package/src/interpreter.ts
CHANGED
|
@@ -88,6 +88,8 @@ export interface InterpretPslDocumentToMongoContractInput {
|
|
|
88
88
|
readonly codecLookup?: CodecLookup;
|
|
89
89
|
readonly seedDiagnostics?: readonly ContractSourceDiagnostic[];
|
|
90
90
|
readonly authoringContributions?: AuthoringContributions;
|
|
91
|
+
/** The target's default codec ids for an `enum` block that omits `@@type`. */
|
|
92
|
+
readonly enumInferenceCodecs?: { readonly text: string; readonly int: string };
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
/**
|
|
@@ -976,6 +978,7 @@ export function interpretPslDocumentToMongoContract(
|
|
|
976
978
|
entityContext: {
|
|
977
979
|
family: 'mongo',
|
|
978
980
|
target: 'mongo',
|
|
981
|
+
...ifDefined('enumInferenceCodecs', input.enumInferenceCodecs),
|
|
979
982
|
...ifDefined('codecLookup', codecLookup),
|
|
980
983
|
sourceId,
|
|
981
984
|
diagnostics: {
|
package/src/provider.ts
CHANGED
|
@@ -10,6 +10,8 @@ import { interpretPslDocumentToMongoContract } from './interpreter';
|
|
|
10
10
|
|
|
11
11
|
export interface MongoContractOptions {
|
|
12
12
|
readonly output?: string;
|
|
13
|
+
/** The target's default codec ids for an `enum` block that omits `@@type`. */
|
|
14
|
+
readonly enumInferenceCodecs?: { readonly text: string; readonly int: string };
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
function mapParseDiagnostics(
|
|
@@ -78,6 +80,7 @@ export function mongoContract(schemaPath: string, options?: MongoContractOptions
|
|
|
78
80
|
scalarTypeDescriptors: context.scalarTypeDescriptors,
|
|
79
81
|
codecLookup: context.codecLookup,
|
|
80
82
|
authoringContributions: context.authoringContributions,
|
|
83
|
+
...ifDefined('enumInferenceCodecs', options?.enumInferenceCodecs),
|
|
81
84
|
});
|
|
82
85
|
if (!interpreted.ok) {
|
|
83
86
|
return interpreted;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interpreter-WfZjKUyx.mjs","names":[],"sources":["../src/derive-json-schema.ts","../src/psl-helpers.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractField, ContractValueObject, JsonValue } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport { MongoValidator } from '@prisma-next/mongo-contract';\n\n/**\n * The permitted values a field's value set restricts it to, keyed by the value set's name — the\n * storage `entries.valueSet` slot. The validator's `enum` keyword is sourced from these, not from\n * `domain.enum`.\n */\nexport type FieldValueSets = Record<string, { readonly values: readonly JsonValue[] }>;\n\nfunction resolveBsonType(\n codecId: string,\n codecLookup: CodecLookup | undefined,\n): string | undefined {\n return codecLookup?.targetTypesFor(codecId)?.[0];\n}\n\nfunction fieldToBsonSchema(\n field: ContractField,\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup: CodecLookup | undefined,\n valueSets: FieldValueSets | undefined,\n): Record<string, unknown> | undefined {\n if (field.type.kind === 'scalar') {\n const bsonType = resolveBsonType(field.type.codecId, codecLookup);\n if (!bsonType) return undefined;\n\n const enumValues =\n field.valueSet !== undefined\n ? (valueSets?.[field.valueSet.entityName]?.values ?? null)\n : null;\n\n if ('many' in field && field.many) {\n const items: Record<string, unknown> = { bsonType };\n if (enumValues) items['enum'] = enumValues;\n return { bsonType: 'array', items };\n }\n\n if (field.nullable) {\n const s: Record<string, unknown> = { bsonType: ['null', bsonType] };\n if (enumValues) s['enum'] = [...enumValues, null];\n return s;\n }\n\n const s: Record<string, unknown> = { bsonType };\n if (enumValues) s['enum'] = enumValues;\n return s;\n }\n\n if (field.type.kind === 'valueObject') {\n const vo = valueObjects?.[field.type.name];\n if (!vo) return undefined;\n const voSchema = deriveObjectSchema(vo.fields, valueObjects, codecLookup, valueSets);\n if ('many' in field && field.many) {\n return { bsonType: 'array', items: voSchema };\n }\n if (field.nullable) {\n return { oneOf: [{ bsonType: 'null' }, voSchema] };\n }\n return voSchema;\n }\n\n return undefined;\n}\n\nfunction deriveObjectSchema(\n fields: Record<string, ContractField>,\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup: CodecLookup | undefined,\n valueSets: FieldValueSets | undefined,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [fieldName, field] of Object.entries(fields)) {\n const schema = fieldToBsonSchema(field, valueObjects, codecLookup, valueSets);\n if (schema) {\n properties[fieldName] = schema;\n if (!field.nullable) {\n required.push(fieldName);\n }\n }\n }\n\n const result: Record<string, unknown> = {\n bsonType: 'object',\n properties,\n additionalProperties: false,\n };\n if (required.length > 0) {\n result['required'] = required.sort();\n }\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function deriveJsonSchema(\n fields: Record<string, ContractField>,\n valueObjects?: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n valueSets?: FieldValueSets,\n): MongoValidator {\n return new MongoValidator({\n jsonSchema: deriveObjectSchema(fields, valueObjects, codecLookup, valueSets),\n validationLevel: 'strict',\n validationAction: 'error',\n });\n}\n\nexport interface PolymorphicVariant {\n readonly discriminatorValue: string;\n readonly fields: Record<string, ContractField>;\n}\n\nexport function derivePolymorphicJsonSchema(\n baseFields: Record<string, ContractField>,\n discriminatorField: string,\n variants: readonly PolymorphicVariant[],\n valueObjects?: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n valueSets?: FieldValueSets,\n): MongoValidator {\n const baseSchema = deriveObjectSchema(baseFields, valueObjects, codecLookup, valueSets);\n const baseProperties = isRecord(baseSchema['properties']) ? baseSchema['properties'] : {};\n\n const oneOf: Record<string, unknown>[] = [];\n for (const variant of variants) {\n const variantOnlyFields: Record<string, ContractField> = {};\n for (const [name, field] of Object.entries(variant.fields)) {\n if (!(name in baseFields)) {\n variantOnlyFields[name] = field;\n }\n }\n\n const variantProperties: Record<string, unknown> = {};\n const variantRequired: string[] = [discriminatorField];\n for (const [name, field] of Object.entries(variantOnlyFields)) {\n const schema = fieldToBsonSchema(field, valueObjects, codecLookup, valueSets);\n if (schema) {\n variantProperties[name] = schema;\n if (!field.nullable) {\n variantRequired.push(name);\n }\n }\n }\n\n const entry: Record<string, unknown> = {\n properties: {\n ...baseProperties,\n [discriminatorField]: { enum: [variant.discriminatorValue] },\n ...variantProperties,\n },\n required: variantRequired.sort(),\n additionalProperties: false,\n };\n\n oneOf.push(entry);\n }\n\n const jsonSchema = { ...baseSchema };\n delete jsonSchema['additionalProperties'];\n if (oneOf.length > 0) {\n jsonSchema['oneOf'] = oneOf;\n }\n\n return new MongoValidator({\n jsonSchema,\n validationLevel: 'strict',\n validationAction: 'error',\n });\n}\n","import type { ResolvedAttribute, ResolvedAttributeArg } from '@prisma-next/psl-parser';\nimport { parseQuotedStringLiteral } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nexport { parseQuotedStringLiteral };\n\nexport function getPositionalArgument(attr: ResolvedAttribute, index = 0): string | undefined {\n return attr.args.filter((arg) => arg.kind === 'positional')[index]?.value;\n}\n\nexport function getNamedArgument(attr: ResolvedAttribute, name: string): string | undefined {\n const arg = attr.args.find((a) => a.kind === 'named' && a.name === name);\n return arg?.value;\n}\n\nexport function parseFieldList(value: string): readonly string[] {\n const inner = value.replace(/^\\[/, '').replace(/\\]$/, '').trim();\n if (inner.length === 0) return [];\n return splitTopLevel(inner).map((s) => s.trim());\n}\n\nexport interface ParsedIndexField {\n readonly name: string;\n readonly isWildcard: boolean;\n readonly direction?: number;\n}\n\nexport function parseIndexFieldList(value: string): readonly ParsedIndexField[] {\n const segments = parseFieldList(value);\n return segments.map(parseIndexFieldSegment);\n}\n\nfunction parseIndexFieldSegment(segment: string): ParsedIndexField {\n const wildcardMatch = segment.match(/^wildcard\\(\\s*(.*?)\\s*\\)$/);\n if (wildcardMatch) {\n const scope = wildcardMatch[1] ?? '';\n return {\n name: scope.length > 0 ? `${scope}.$**` : '$**',\n isWildcard: true,\n };\n }\n\n const modifierMatch = segment.match(/^(\\w+)\\(\\s*sort:\\s*(\\w+)\\s*\\)$/);\n if (modifierMatch) {\n const fieldName = modifierMatch[1] ?? segment;\n const sortValue = modifierMatch[2];\n return {\n name: fieldName,\n isWildcard: false,\n direction: sortValue === 'Desc' ? -1 : 1,\n };\n }\n\n return { name: segment, isWildcard: false };\n}\n\nfunction splitTopLevel(input: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === '(' || ch === '[' || ch === '{') depth++;\n else if (ch === ')' || ch === ']' || ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === ',' && depth === 0) {\n parts.push(input.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(input.slice(start));\n return parts;\n}\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 ResolvedAttribute[],\n name: string,\n): ResolvedAttribute | undefined {\n return attributes.find((attr) => attr.name === name);\n}\n\nexport function getMapName(attributes: readonly ResolvedAttribute[]): 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 ResolvedAttribute[],\n): ParsedRelationAttribute | undefined {\n const relationAttr = getAttribute(attributes, 'relation');\n if (!relationAttr) return undefined;\n\n let relationName: string | undefined;\n let fieldsArg: ResolvedAttributeArg | undefined;\n let referencesArg: ResolvedAttributeArg | 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 ...ifDefined('relationName', relationName),\n ...ifDefined('fields', fields),\n ...ifDefined('references', references),\n };\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 {\n type Contract,\n type ContractEnum,\n type ContractField,\n type ContractReferenceRelation,\n type ContractValueObject,\n type CrossReference,\n crossRef,\n type JsonValue,\n type ValueSetRef,\n} from '@prisma-next/contract/types';\nimport type { EnumTypeHandle } from '@prisma-next/contract-authoring';\nimport { errorEnumCodecNotInPackStack } from '@prisma-next/errors/control';\nimport type {\n AuthoringContributions,\n AuthoringEntityContext,\n} from '@prisma-next/framework-components/authoring';\nimport {\n instantiateAuthoringEntityType,\n isAuthoringEntityTypeDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n applyPolymorphicScopeToMongoIndex,\n buildMongoNamespace,\n type MongoCollectionInput,\n MongoIndex,\n type MongoIndexKeyDirection,\n MongoStorage,\n type MongoValueSetInput,\n} from '@prisma-next/mongo-contract';\nimport { mongoContractCanonicalizationHooks } from '@prisma-next/mongo-contract/canonicalization-hooks';\nimport type { CollationOptions } from '@prisma-next/mongo-value/mongodb-types';\nimport type {\n CompositeTypeSymbol,\n FieldSymbol,\n ModelSymbol,\n NamespaceSymbol,\n PslExtensionBlock,\n PslSpan,\n ResolvedAttribute,\n SymbolTable,\n} from '@prisma-next/psl-parser';\nimport { nodePslSpan } from '@prisma-next/psl-parser';\nimport type { SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { assertDefined } from '@prisma-next/utils/assertions';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { deriveJsonSchema, derivePolymorphicJsonSchema } from './derive-json-schema';\nimport {\n getAttribute,\n getMapName,\n getNamedArgument,\n getPositionalArgument,\n lowerFirst,\n parseIndexFieldList,\n parseQuotedStringLiteral,\n parseRelationAttribute,\n} from './psl-helpers';\n\n/**\n * Encode an authored enum value to its codec-encoded JSON form via the codec resolved by id from the\n * contract's codec lookup, so a non-identity `encodeJson` (permitted by the `mongoCodec` factory) is\n * respected. Matches the TS builder's `encodeEnumValue`: the lookup is always threaded in production,\n * and a codecId the lookup cannot resolve is a hard error — the enum uses a codec that is not part of\n * the contract's pack stack.\n */\nfunction encodeEnumValue(value: unknown, codecId: string, codecLookup: CodecLookup): JsonValue {\n const codec = codecLookup.get(codecId);\n if (!codec) {\n throw errorEnumCodecNotInPackStack({ codecId });\n }\n return codec.encodeJson(value);\n}\n\nexport interface InterpretPslDocumentToMongoContractInput {\n readonly symbolTable: SymbolTable;\n readonly sourceFile: SourceFile;\n readonly sourceId: string;\n readonly scalarTypeDescriptors: ReadonlyMap<string, string>;\n readonly codecLookup?: CodecLookup;\n readonly seedDiagnostics?: readonly ContractSourceDiagnostic[];\n readonly authoringContributions?: AuthoringContributions;\n}\n\n/**\n * Mongo's PSL surface binds the database from the connection string, so every\n * explicit namespace block is invalid, including `namespace unbound { … }`.\n */\nfunction validateNamespaceBlocksForMongoTarget(input: {\n readonly namespaces: readonly NamespaceSymbol[];\n readonly sourceId: string;\n readonly sourceFile: SourceFile;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n for (const namespace of input.namespaces) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMESPACE_BLOCK',\n message: `Mongo does not support \\`namespace ${namespace.name} { … }\\` blocks (the database is bound by the connection string; declare models at the document top level instead).`,\n sourceId: input.sourceId,\n span: nodePslSpan(namespace.node.syntax, input.sourceFile),\n });\n }\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: ModelSymbol): FieldMappings {\n const pslNameToMapped = new Map<string, string>();\n for (const field of Object.values(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: ModelSymbol): 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?: CrossReference;\n}\n\ntype DiscriminatorDeclaration = { readonly fieldName: string; readonly span: PslSpan };\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly collectionName: string;\n readonly span: PslSpan;\n};\n\nfunction mongoCrossRef(modelName: string): CrossReference {\n return crossRef(modelName, UNBOUND_NAMESPACE_ID);\n}\n\nfunction collectPolymorphismDeclarations(\n models: readonly ModelSymbol[],\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 model of models) {\n for (const attr of model.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 \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields[fieldName];\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.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 \"${model.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 \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const collectionName = resolveCollectionName(model);\n baseDeclarations.set(model.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, CrossReference>;\n collections: Record<string, Record<string, unknown>>;\n allModels: readonly ModelSymbol[];\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n modelNames: ReadonlySet<string>;\n indexSpans: Map<MongoIndex, PslSpan>;\n modelIndexesByName: Map<string, readonly MongoIndex[]>;\n sourceId: string;\n}): {\n models: Record<string, MongoModelEntry>;\n roots: Record<string, CrossReference>;\n collections: Record<string, Record<string, unknown>>;\n diagnostics: ContractSourceDiagnostic[];\n} {\n const {\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n sourceId,\n allModels: allModelViews,\n indexSpans,\n modelIndexesByName,\n } = input;\n let patched = input.models;\n let roots = input.roots;\n let collections = input.collections;\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 const modelView = allModelViews.find((m) => m.name === modelName);\n const mappedDiscriminatorField = modelView\n ? (resolveFieldMappings(modelView).pslNameToMapped.get(decl.fieldName) ?? decl.fieldName)\n : decl.fieldName;\n\n if (!Object.hasOwn(model.fields, mappedDiscriminatorField)) {\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: mappedDiscriminatorField }, 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 variantModelView = allModelViews.find((m) => m.name === variantName);\n if (!variantModelView) continue;\n const hasExplicitMap = getMapName(variantModelView.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: mongoCrossRef(baseDecl.baseName),\n storage: { collection: baseCollection },\n },\n };\n }\n\n const variantCollectionName = resolveCollectionName(variantModelView);\n if (roots[variantCollectionName]?.model === variantName) {\n if (variantCollectionName === baseCollection && baseModel) {\n roots = { ...roots, [variantCollectionName]: mongoCrossRef(baseDecl.baseName) };\n } else {\n roots = Object.fromEntries(\n Object.entries(roots).filter(([key]) => key !== variantCollectionName),\n );\n }\n }\n\n const variantOwnIndexes = modelIndexesByName.get(variantName) ?? [];\n const baseColl = collections[baseCollection];\n\n const baseModelEntry = patched[baseDecl.baseName];\n const discriminatorField = baseModelEntry?.discriminator?.field;\n const scopedVariantIndexes: MongoIndex[] = [];\n if (discriminatorField) {\n for (const idx of variantOwnIndexes) {\n const result = applyPolymorphicScopeToMongoIndex(idx, {\n discriminatorField,\n discriminatorValue: baseDecl.value,\n });\n if (result.kind === 'conflict') {\n const span = indexSpans.get(idx) ?? baseDecl.span;\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `Variant \"${variantName}\" index conflicts with discriminator scope: ${result.reason}`,\n sourceId,\n span,\n });\n continue;\n }\n if (result.index !== idx) {\n indexSpans.set(result.index, indexSpans.get(idx) ?? baseDecl.span);\n }\n scopedVariantIndexes.push(result.index);\n }\n } else {\n scopedVariantIndexes.push(...variantOwnIndexes);\n }\n\n if (variantCollectionName !== baseCollection) {\n const filtered = Object.fromEntries(\n Object.entries(collections).filter(([key]) => key !== variantCollectionName),\n );\n if (scopedVariantIndexes.length > 0 && baseColl) {\n const baseIndexes = (baseColl['indexes'] ?? []) as MongoIndex[];\n collections = {\n ...filtered,\n [baseCollection]: {\n ...baseColl,\n indexes: [...baseIndexes, ...scopedVariantIndexes],\n },\n };\n } else {\n collections = filtered;\n }\n } else if (baseColl) {\n const existingIndexes = (baseColl['indexes'] ?? []) as MongoIndex[];\n const variantIndexSet = new Set<MongoIndex>(variantOwnIndexes);\n const withoutUnscopedVariants = existingIndexes.filter((idx) => !variantIndexSet.has(idx));\n const mergedIndexes = [...withoutUnscopedVariants];\n for (const idx of scopedVariantIndexes) {\n const idxKey = canonicalJson(idx);\n const isDuplicate = withoutUnscopedVariants.some(\n (existing) => canonicalJson(existing) === idxKey,\n );\n if (!isDuplicate) {\n mergedIndexes.push(idx);\n }\n }\n if (\n mergedIndexes.length !== existingIndexes.length ||\n mergedIndexes.some((idx, i) => idx !== existingIndexes[i])\n ) {\n const next: Record<string, unknown> = { ...baseColl };\n if (mergedIndexes.length > 0) {\n next['indexes'] = mergedIndexes;\n } else {\n delete next['indexes'];\n }\n collections = { ...collections, [baseCollection]: next };\n }\n }\n }\n\n return { models: patched, roots, collections, diagnostics };\n}\n\n// Property-order-stable serialization for structural equality of plain\n// JSON-compatible values. Used for comparing MongoIndex shapes in\n// the variant-merge dedup path where a future change to the spread order\n// would otherwise produce JSON-stringify mismatches even though the\n// indexes are structurally identical.\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`;\n }\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction parseIndexDirection(raw: string | undefined): MongoIndexKeyDirection {\n if (!raw) return 1;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n const num = Number(stripped);\n if (num === 1 || num === -1) return num;\n if (['text', '2dsphere', '2d', 'hashed'].includes(stripped))\n return stripped as MongoIndexKeyDirection;\n return 1;\n}\n\nfunction parseNumericArg(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseBooleanArg(raw: string | undefined): boolean | undefined {\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n return undefined;\n}\n\nfunction parseJsonArg(raw: string | undefined): Record<string, unknown> | undefined {\n if (!raw) return undefined;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '').replace(/\\\\\"/g, '\"');\n try {\n const parsed = JSON.parse(stripped);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // not valid JSON\n }\n return undefined;\n}\n\nfunction parseCollation(attr: ResolvedAttribute): CollationOptions | null | undefined {\n const locale = stripQuotesHelper(getNamedArgument(attr, 'collationLocale'));\n if (!locale) {\n const hasAnyCollationArg =\n getNamedArgument(attr, 'collationStrength') != null ||\n getNamedArgument(attr, 'collationCaseLevel') != null ||\n getNamedArgument(attr, 'collationCaseFirst') != null ||\n getNamedArgument(attr, 'collationNumericOrdering') != null ||\n getNamedArgument(attr, 'collationAlternate') != null ||\n getNamedArgument(attr, 'collationMaxVariable') != null ||\n getNamedArgument(attr, 'collationBackwards') != null ||\n getNamedArgument(attr, 'collationNormalization') != null;\n return hasAnyCollationArg ? null : undefined;\n }\n\n const collation: CollationOptions = { locale };\n const strength = parseNumericArg(getNamedArgument(attr, 'collationStrength'));\n if (strength != null) collation.strength = strength;\n const caseLevel = parseBooleanArg(getNamedArgument(attr, 'collationCaseLevel'));\n if (caseLevel != null) collation.caseLevel = caseLevel;\n const caseFirst = stripQuotesHelper(getNamedArgument(attr, 'collationCaseFirst'));\n if (caseFirst != null) collation.caseFirst = caseFirst;\n const numericOrdering = parseBooleanArg(getNamedArgument(attr, 'collationNumericOrdering'));\n if (numericOrdering != null) collation.numericOrdering = numericOrdering;\n const alternate = stripQuotesHelper(getNamedArgument(attr, 'collationAlternate'));\n if (alternate != null) collation.alternate = alternate;\n const maxVariable = stripQuotesHelper(getNamedArgument(attr, 'collationMaxVariable'));\n if (maxVariable != null) collation.maxVariable = maxVariable;\n const backwards = parseBooleanArg(getNamedArgument(attr, 'collationBackwards'));\n if (backwards != null) collation.backwards = backwards;\n const normalization = parseBooleanArg(getNamedArgument(attr, 'collationNormalization'));\n if (normalization != null) collation.normalization = normalization;\n return collation;\n}\n\nfunction stripQuotesHelper(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n return raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n}\n\nfunction parseProjectionList(\n raw: string | undefined,\n value: 0 | 1,\n): Record<string, 0 | 1> | undefined {\n if (!raw) return undefined;\n const stripped = raw.replace(/^[\"']/, '').replace(/[\"']$/, '');\n const inner = stripped.replace(/^\\[/, '').replace(/\\]$/, '').trim();\n if (inner.length === 0) return undefined;\n const fields = inner\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const result: Record<string, 0 | 1> = {};\n for (const f of fields) {\n result[f] = value;\n }\n return result;\n}\n\nfunction collectIndexes(\n pslModel: ModelSymbol,\n fieldMappings: FieldMappings,\n modelNames: ReadonlySet<string>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n indexSpans: Map<MongoIndex, PslSpan>,\n): MongoIndex[] {\n const indexes: MongoIndex[] = [];\n let textIndexCount = 0;\n\n // Storage-indexable PSL field names — i.e. all declared fields except\n // relation fields (which don't materialize a column on this model). The\n // index field-existence check (PSL_INDEX_FIELD_NOT_FOUND) consults this\n // rather than fieldMappings.pslNameToMapped because the latter contains\n // every PSL field including relation fields.\n const indexableFieldNames = new Set<string>();\n for (const f of Object.values(pslModel.fields)) {\n if (modelNames.has(f.typeName)) continue;\n indexableFieldNames.add(f.name);\n }\n\n for (const field of Object.values(pslModel.fields)) {\n if (modelNames.has(field.typeName)) continue;\n const uniqueAttr = getAttribute(field.attributes, 'unique');\n if (!uniqueAttr) continue;\n const mappedName = fieldMappings.pslNameToMapped.get(field.name) ?? field.name;\n const fieldUniqueIndex = new MongoIndex({\n keys: [{ field: mappedName, direction: 1 }],\n unique: true,\n });\n indexes.push(fieldUniqueIndex);\n indexSpans.set(fieldUniqueIndex, uniqueAttr.span);\n }\n\n for (const attr of pslModel.attributes) {\n const isIndex = attr.name === 'index';\n const isUnique = attr.name === 'unique';\n const isTextIndex = attr.name === 'textIndex';\n if (!isIndex && !isUnique && !isTextIndex) continue;\n\n const fieldsArg = getPositionalArgument(attr, 0);\n if (!fieldsArg) continue;\n const parsedFields = parseIndexFieldList(fieldsArg);\n if (parsedFields.length === 0) continue;\n\n const hasWildcard = parsedFields.some((f) => f.isWildcard);\n const wildcardCount = parsedFields.filter((f) => f.isWildcard).length;\n\n if (wildcardCount > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'An index can contain at most one wildcard() field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (isUnique && hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Unique indexes cannot use wildcard() fields',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (isTextIndex) {\n textIndexCount++;\n if (textIndexCount > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `Only one @@textIndex is allowed per collection (model \"${pslModel.name}\")`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message:\n 'wildcard() fields cannot be combined with type: hashed/2dsphere/2d or @@textIndex',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n }\n\n const typeArg = getNamedArgument(attr, 'type');\n const defaultDirection: MongoIndexKeyDirection = isTextIndex\n ? 'text'\n : parseIndexDirection(typeArg);\n\n if (\n hasWildcard &&\n typeof defaultDirection === 'string' &&\n ['hashed', '2dsphere', '2d'].includes(defaultDirection)\n ) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: `wildcard() fields cannot be combined with type: ${defaultDirection}`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if (defaultDirection === 'hashed' && parsedFields.length > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Hashed indexes must have exactly one field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n let missingField: string | undefined;\n for (const pf of parsedFields) {\n let fieldNameForLookup: string | undefined;\n if (pf.isWildcard) {\n const wildcardMatch = pf.name.match(/^(.+)\\.\\$\\*\\*$/);\n fieldNameForLookup = wildcardMatch ? wildcardMatch[1] : undefined;\n } else {\n fieldNameForLookup = pf.name;\n }\n if (fieldNameForLookup === undefined || fieldNameForLookup.length === 0) continue;\n if (!indexableFieldNames.has(fieldNameForLookup)) {\n missingField = fieldNameForLookup;\n break;\n }\n }\n if (missingField !== undefined) {\n diagnostics.push({\n code: 'PSL_INDEX_FIELD_NOT_FOUND',\n message: `Index on model \"${pslModel.name}\" references unknown field \"${missingField}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const keys = parsedFields.map((pf) => {\n const mappedName = pf.isWildcard\n ? pf.name.replace(/^(.+)\\.\\$\\*\\*$/, (_, prefix: string) => {\n const mapped = fieldMappings.pslNameToMapped.get(prefix);\n return mapped ? `${mapped}.$**` : `${prefix}.$**`;\n })\n : (fieldMappings.pslNameToMapped.get(pf.name) ?? pf.name);\n const direction: MongoIndexKeyDirection =\n pf.direction != null ? (pf.direction as MongoIndexKeyDirection) : defaultDirection;\n return { field: mappedName, direction };\n });\n\n const unique = isUnique ? true : undefined;\n const sparse = isTextIndex ? undefined : parseBooleanArg(getNamedArgument(attr, 'sparse'));\n const expireAfterSeconds = isTextIndex\n ? undefined\n : parseNumericArg(getNamedArgument(attr, 'expireAfterSeconds'));\n\n if (hasWildcard && expireAfterSeconds != null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'expireAfterSeconds cannot be combined with wildcard() fields',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const partialFilterExpression = parseJsonArg(getNamedArgument(attr, 'filter'));\n\n const includeArg = getNamedArgument(attr, 'include');\n const excludeArg = getNamedArgument(attr, 'exclude');\n\n if (includeArg != null && excludeArg != null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'Cannot specify both include and exclude on the same index',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n if ((includeArg != null || excludeArg != null) && !hasWildcard) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message:\n 'include/exclude options are only valid when the index contains a wildcard() field',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const wildcardProjection =\n includeArg != null\n ? parseProjectionList(includeArg, 1)\n : excludeArg != null\n ? parseProjectionList(excludeArg, 0)\n : undefined;\n\n const collation = parseCollation(attr);\n if (collation === null) {\n diagnostics.push({\n code: 'PSL_INVALID_INDEX',\n message: 'collationLocale is required when using collation options',\n sourceId,\n span: attr.span,\n });\n continue;\n }\n\n const rawWeights = parseJsonArg(getNamedArgument(attr, 'weights'));\n let weights: Record<string, number> | undefined;\n if (rawWeights) {\n weights = {};\n for (const [k, v] of Object.entries(rawWeights)) {\n if (typeof v === 'number') weights[k] = v;\n }\n }\n\n const rawDefaultLang = isTextIndex\n ? getNamedArgument(attr, 'language')\n : getNamedArgument(attr, 'default_language');\n const default_language = stripQuotesHelper(rawDefaultLang);\n\n const rawLangOverride = getNamedArgument(attr, 'languageOverride');\n const language_override = stripQuotesHelper(rawLangOverride);\n\n const index = new MongoIndex({\n keys,\n ...(unique != null && { unique }),\n ...(sparse != null && { sparse }),\n ...(expireAfterSeconds != null && { expireAfterSeconds }),\n ...(partialFilterExpression != null && { partialFilterExpression }),\n ...(wildcardProjection != null && { wildcardProjection }),\n ...(collation != null && { collation }),\n ...(weights != null && { weights }),\n ...(default_language != null && { default_language }),\n ...(language_override != null && { language_override }),\n });\n\n indexes.push(index);\n indexSpans.set(index, attr.span);\n }\n\n return indexes;\n}\n\nfunction isRelationField(field: FieldSymbol, modelNames: ReadonlySet<string>): boolean {\n return modelNames.has(field.typeName);\n}\n\n// PSL scalar type name whose codec is mandated for a Mongo model's `_id`.\nconst MONGO_OBJECT_ID_PSL_TYPE = 'ObjectId';\n\nfunction resolveFieldCodecId(\n field: FieldSymbol,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n): string | undefined {\n return scalarTypeDescriptors.get(field.typeName);\n}\n\nfunction resolveNonRelationField(\n field: FieldSymbol,\n ownerName: string,\n compositeTypeNames: ReadonlySet<string>,\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n codecIdByEnumName: 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 // If this field's declared type is a known enum name, treat the field as a scalar\n // with that enum's codec and stamp the domain valueSet ref.\n const enumCodecId = codecIdByEnumName.get(field.typeName);\n if (enumCodecId !== undefined) {\n const valueSet: ValueSetRef = {\n plane: 'domain',\n entityKind: 'enum',\n namespaceId: UNBOUND_NAMESPACE_ID,\n entityName: field.typeName,\n };\n const result: ContractField = {\n type: { kind: 'scalar', codecId: enumCodecId },\n nullable: field.optional,\n valueSet,\n };\n return field.list ? { ...result, many: true } : result;\n }\n\n // Avoid cascading unsupported-type diagnostics after invalid qualification.\n if (field.malformedType) {\n return undefined;\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\nfunction processEnumDeclarations(input: {\n readonly enumBlocks: readonly PslExtensionBlock[];\n readonly sourceId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly entityContext: AuthoringEntityContext;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): Record<string, ContractEnum> {\n const builtEnums: Record<string, ContractEnum> = {};\n\n if (input.enumBlocks.length === 0) return builtEnums;\n\n const enumDescriptor =\n input.authoringContributions?.entityTypes?.['enum'] !== undefined &&\n isAuthoringEntityTypeDescriptor(input.authoringContributions.entityTypes['enum'])\n ? input.authoringContributions.entityTypes['enum']\n : undefined;\n\n if (!enumDescriptor) {\n for (const decl of input.enumBlocks) {\n input.diagnostics.push({\n code: 'PSL_ENUM_MISSING_FACTORY',\n message: `enum \"${decl.name}\" requires an \"enum\" entityType factory in the active authoring contributions`,\n sourceId: input.sourceId,\n span: decl.span,\n });\n }\n return builtEnums;\n }\n\n for (const decl of input.enumBlocks) {\n const handle = instantiateAuthoringEntityType<EnumTypeHandle | undefined>(\n 'enum',\n enumDescriptor,\n [decl],\n input.entityContext,\n );\n\n if (handle === undefined || handle === null) continue;\n\n builtEnums[decl.name] = {\n codecId: handle.codecId,\n members: handle.enumMembers.map((m) => ({\n name: m.name,\n value: blindCast<JsonValue, 'factory-validated enum members are JsonValue-compatible'>(\n m.value,\n ),\n })),\n };\n }\n\n return builtEnums;\n}\n\nexport function interpretPslDocumentToMongoContract(\n input: InterpretPslDocumentToMongoContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const { symbolTable, sourceFile, scalarTypeDescriptors, codecLookup } = input;\n const sourceId = input.sourceId;\n const diagnostics: ContractSourceDiagnostic[] = [...(input.seedDiagnostics ?? [])];\n const topLevel = symbolTable.topLevel;\n validateNamespaceBlocksForMongoTarget({\n namespaces: Object.values(topLevel.namespaces),\n sourceId,\n sourceFile,\n diagnostics,\n });\n const allModels: ModelSymbol[] = Object.values(topLevel.models);\n const allCompositeTypes: CompositeTypeSymbol[] = Object.values(topLevel.compositeTypes);\n const modelNames = new Set(allModels.map((m) => m.name));\n const compositeTypeNames = new Set(allCompositeTypes.map((ct) => ct.name));\n\n const topLevelEnumBlocks = Object.values(topLevel.blocks)\n .filter((b) => b.keyword === 'enum')\n .map((b) => b.block);\n\n const builtEnums = processEnumDeclarations({\n enumBlocks: topLevelEnumBlocks,\n sourceId,\n authoringContributions: input.authoringContributions,\n entityContext: {\n family: 'mongo',\n target: 'mongo',\n ...ifDefined('codecLookup', codecLookup),\n sourceId,\n diagnostics: {\n push: (d) => {\n diagnostics.push(\n blindCast<ContractSourceDiagnostic, 'sink diagnostics are span-compatible'>(d),\n );\n },\n },\n },\n diagnostics,\n });\n\n const codecIdByEnumName: Map<string, string> = new Map(\n Object.entries(builtEnums).map(([name, e]) => [name, e.codecId]),\n );\n\n const models: Record<string, MongoModelEntry> = {};\n const collections: Record<string, Record<string, unknown>> = {};\n const roots: Record<string, CrossReference> = {};\n const allFkRelations: FkRelation[] = [];\n const indexSpans = new Map<MongoIndex, PslSpan>();\n const modelIndexesByName = new Map<string, readonly MongoIndex[]>();\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: FieldSymbol;\n }\n const backrelationCandidates: BackrelationCandidate[] = [];\n\n for (const pslModel of allModels) {\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 Object.values(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 ...ifDefined('relationName', relation?.relationName),\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 = allModels.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: mongoCrossRef(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 ...ifDefined('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 codecIdByEnumName,\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 = Object.values(pslModel.fields).some(\n (f) => getAttribute(f.attributes, 'id') !== undefined,\n );\n // Variant models inherit the base's identity and are validated through their base.\n if (!isVariantModel) {\n if (!hasIdField) {\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 } else {\n // The resulting document must carry an `_id` of BSON type objectId. We\n // assert on the emitted shape (the mapped-name-keyed field record), not\n // on how the user spelled it — `id ObjectId @id @map(\"_id\")` and a field\n // literally named `_id` both satisfy it; a non-objectId or unmapped id\n // does not.\n const objectIdCodecId = scalarTypeDescriptors.get(MONGO_OBJECT_ID_PSL_TYPE);\n const idField = fields['_id'];\n const idIsObjectId =\n idField !== undefined &&\n idField.type.kind === 'scalar' &&\n objectIdCodecId !== undefined &&\n idField.type.codecId === objectIdCodecId;\n if (!idIsObjectId) {\n diagnostics.push({\n code: 'PSL_MONGO_ID_REQUIRED',\n message: `Model \"${pslModel.name}\" must declare an _id field of type ObjectId (e.g. \\`id ObjectId @id @map(\"_id\")\\`).`,\n sourceId,\n });\n }\n }\n }\n\n models[pslModel.name] = { fields, relations, storage: { collection: collectionName } };\n const modelIndexes = collectIndexes(\n pslModel,\n fieldMappings,\n modelNames,\n sourceId,\n diagnostics,\n indexSpans,\n );\n modelIndexesByName.set(pslModel.name, modelIndexes);\n const existingColl = collections[collectionName];\n if (existingColl && modelIndexes.length > 0) {\n const existingIndexes = (existingColl['indexes'] ?? []) as MongoIndex[];\n collections[collectionName] = { indexes: [...existingIndexes, ...modelIndexes] };\n } else if (!existingColl) {\n collections[collectionName] = modelIndexes.length > 0 ? { indexes: modelIndexes } : {};\n }\n roots[collectionName] = mongoCrossRef(pslModel.name);\n }\n\n const valueObjects: Record<string, ContractValueObject> = {};\n for (const compositeType of allCompositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of Object.values(compositeType.fields)) {\n const resolved = resolveNonRelationField(\n field,\n compositeType.name,\n compositeTypeNames,\n scalarTypeDescriptors,\n codecIdByEnumName,\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: mongoCrossRef(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 allModels,\n sourceId,\n diagnostics,\n );\n const polyResult = resolvePolymorphism({\n models,\n roots,\n collections,\n allModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n indexSpans,\n modelIndexesByName,\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 resolvedModels = polyResult.models;\n const resolvedCollections = polyResult.collections;\n\n // The storage value set is the source of truth for both the emit typing and the validator's\n // `enum` keyword. Built once, ahead of validator derivation, from each enum's codec-encoded member\n // values (mirroring SQL's build-contract). Encoding needs the codec lookup; production always\n // threads it (the CLI control stack supplies it), so its absence when enums exist is a wiring bug,\n // not a runtime input to tolerate.\n const storageValueSets: Record<string, MongoValueSetInput> = {};\n const enumEntries = Object.entries(builtEnums);\n if (enumEntries.length > 0) {\n assertDefined(\n codecLookup,\n 'Mongo PSL interpretation requires a codec lookup to encode enum values',\n );\n for (const [enumName, builtEnum] of enumEntries) {\n storageValueSets[enumName] = {\n kind: 'valueSet',\n values: builtEnum.members.map((m) =>\n encodeEnumValue(m.value, builtEnum.codecId, codecLookup),\n ),\n };\n }\n }\n\n for (const [, modelEntry] of Object.entries(resolvedModels)) {\n if (modelEntry.base) continue;\n\n const collectionName = modelEntry.storage.collection;\n const coll = resolvedCollections[collectionName];\n if (!coll) continue;\n\n if (modelEntry.discriminator && modelEntry.variants) {\n const variantEntries = Object.entries(modelEntry.variants).map(\n ([variantName, { value }]) => ({\n discriminatorValue: value,\n fields: resolvedModels[variantName]?.fields ?? {},\n }),\n );\n coll['validator'] = derivePolymorphicJsonSchema(\n modelEntry.fields,\n modelEntry.discriminator.field,\n variantEntries,\n valueObjects,\n codecLookup,\n storageValueSets,\n );\n } else {\n coll['validator'] = deriveJsonSchema(\n modelEntry.fields,\n valueObjects,\n codecLookup,\n storageValueSets,\n );\n }\n }\n\n const target = 'mongo';\n const targetFamily = 'mongo';\n const collectionInputs: Record<string, MongoCollectionInput> = {};\n for (const [name, coll] of Object.entries(resolvedCollections)) {\n const raw: Record<string, unknown> = {};\n if (coll['indexes'] != null) raw['indexes'] = coll['indexes'];\n if (coll['validator'] != null) raw['validator'] = coll['validator'];\n if (coll['options'] != null) raw['options'] = coll['options'];\n collectionInputs[name] = blindCast<\n MongoCollectionInput,\n 'arktype-validated JSON shapes satisfy MongoCollectionInput by construction'\n >(raw);\n }\n const hasValueSets = Object.keys(storageValueSets).length > 0;\n\n const unboundNamespace = buildMongoNamespace({\n id: UNBOUND_NAMESPACE_ID,\n entries: {\n collection: collectionInputs,\n ...(hasValueSets ? { valueSet: storageValueSets } : {}),\n },\n });\n // Hash the constructed (normalized) entries, not the raw input literals —\n // persisted storageHash values were computed over the constructed form.\n const storageWithoutHash = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n entries: {\n collection: unboundNamespace.entries.collection,\n ...(unboundNamespace.entries.valueSet !== undefined\n ? { valueSet: unboundNamespace.entries.valueSet }\n : {}),\n },\n },\n },\n };\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: storageWithoutHash,\n ...mongoContractCanonicalizationHooks,\n });\n const storage = new MongoStorage({\n storageHash,\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: unboundNamespace,\n },\n }) as Contract['storage'];\n const capabilities: Record<string, Record<string, boolean>> = {};\n\n const hasEnums = Object.keys(builtEnums).length > 0;\n\n return ok({\n targetFamily,\n target,\n roots: polyResult.roots,\n domain: {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n models: polyResult.models,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n ...(hasEnums ? { enum: builtEnums } : {}),\n },\n },\n },\n storage,\n extensionPacks: {},\n capabilities,\n profileHash: computeProfileHash({ target, targetFamily, capabilities }),\n meta: {},\n });\n}\n"],"mappings":"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"}
|