{"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":"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"}