{"version":3,"file":"index.mjs","names":[],"sources":["../src/attribute-helpers.ts","../src/resolve.ts","../src/attribute-spec/combinators/diagnostic.ts","../src/attribute-spec/combinators/bool.ts","../src/attribute-spec/combinators/entity-ref.ts","../src/attribute-spec/combinators/field-ref.ts","../src/attribute-spec/interpret.ts","../src/attribute-spec/combinators/func-call.ts","../src/attribute-spec/combinators/identifier.ts","../src/attribute-spec/combinators/int.ts","../src/attribute-spec/combinators/list.ts","../src/attribute-spec/combinators/num.ts","../src/attribute-spec/combinators/one-of.ts","../src/attribute-spec/combinators/record.ts","../src/attribute-spec/combinators/str.ts","../src/attribute-spec/field-attribute.ts","../src/attribute-spec/model-attribute.ts","../src/attribute-spec/optional.ts","../src/extension-block.ts","../src/block-reconstruction.ts","../src/symbol-table.ts"],"sourcesContent":["import type { PslAttribute } from '@prisma-next/framework-components/psl-ast';\n\nexport function getPositionalArgument(attribute: PslAttribute, index = 0): string | undefined {\n  const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n  return entries[index]?.value;\n}\n\nexport function parseQuotedStringLiteral(value: string): string | undefined {\n  const trimmed = value.trim();\n  const match = trimmed.match(/^(['\"])(.*)\\1$/);\n  if (!match) return undefined;\n  return match[2] ?? '';\n}\n","import type { PslSpan } from '@prisma-next/framework-components/psl-ast';\nimport type { Position, Range, SourceFile } from './source-file';\nimport type {\n  AttributeArgListAst,\n  FieldAttributeAst,\n  ModelAttributeAst,\n} from './syntax/ast/attributes';\nimport type { ExpressionAst } from './syntax/ast/expressions';\nimport type { QualifiedNameAst } from './syntax/ast/qualified-name';\nimport type { TypeAnnotationAst } from './syntax/ast/type-annotation';\nimport { printSyntax } from './syntax/ast-helpers';\nimport type { SyntaxNode } from './syntax/red';\n\nexport interface ResolvedAttributeArg {\n  readonly kind: 'positional' | 'named';\n  readonly name?: string;\n  readonly value: string;\n  readonly expression?: ExpressionAst;\n  readonly span: PslSpan;\n}\n\nexport interface ResolvedAttribute {\n  readonly name: string;\n  readonly args: readonly ResolvedAttributeArg[];\n  readonly span: PslSpan;\n}\n\nexport interface ResolvedTypeConstructorCall {\n  readonly path: readonly string[];\n  readonly args: readonly ResolvedAttributeArg[];\n  readonly span: PslSpan;\n}\n\nexport function readResolvedAttribute(\n  attribute: FieldAttributeAst | ModelAttributeAst,\n  sourceFile: SourceFile,\n): ResolvedAttribute {\n  return {\n    name: attributeName(attribute.name()),\n    args: readResolvedArgList(attribute.argList(), sourceFile),\n    span: nodePslSpan(attribute.syntax, sourceFile),\n  };\n}\n\nexport function readResolvedAttributes(\n  attributes: Iterable<FieldAttributeAst | ModelAttributeAst>,\n  sourceFile: SourceFile,\n): readonly ResolvedAttribute[] {\n  return Array.from(attributes, (attribute) => readResolvedAttribute(attribute, sourceFile));\n}\n\nexport function readResolvedConstructorCall(\n  annotation: TypeAnnotationAst | undefined,\n  sourceFile: SourceFile,\n): ResolvedTypeConstructorCall | undefined {\n  const argList = annotation?.argList();\n  if (annotation === undefined || argList === undefined) return undefined;\n  return {\n    path: annotation.name()?.path() ?? [],\n    args: readResolvedArgList(argList, sourceFile),\n    span: nodePslSpan(annotation.syntax, sourceFile),\n  };\n}\n\nfunction readResolvedArgList(\n  argList: AttributeArgListAst | undefined,\n  sourceFile: SourceFile,\n): readonly ResolvedAttributeArg[] {\n  if (argList === undefined) return [];\n  const args: ResolvedAttributeArg[] = [];\n  for (const arg of argList.args()) {\n    const name = arg.name()?.name();\n    const expression = arg.value();\n    args.push({\n      kind: name !== undefined ? 'named' : 'positional',\n      ...(name !== undefined ? { name } : {}),\n      value: renderExpression(expression),\n      ...(expression !== undefined ? { expression } : {}),\n      span: nodePslSpan(arg.syntax, sourceFile),\n    });\n  }\n  return args;\n}\n\nfunction attributeName(name: QualifiedNameAst | undefined): string {\n  return name?.path().join('.') ?? '';\n}\n\nfunction renderExpression(expression: ExpressionAst | undefined): string {\n  if (expression === undefined) return '';\n  return printSyntax(expression.syntax).trim();\n}\n\nexport function nodePslSpan(node: SyntaxNode, sourceFile: SourceFile): PslSpan {\n  const start = node.offset;\n  const end = start + node.green.textLength;\n  return {\n    start: offsetToPslPosition(start, sourceFile),\n    end: offsetToPslPosition(end, sourceFile),\n  };\n}\n\n/** Unsupported-top-level-block diagnostics are anchored to the keyword token. */\nexport function keywordPslSpan(node: SyntaxNode, keyword: string, sourceFile: SourceFile): PslSpan {\n  const start = node.offset;\n  const end = start + keyword.length;\n  return {\n    start: offsetToPslPosition(start, sourceFile),\n    end: offsetToPslPosition(end, sourceFile),\n  };\n}\n\nexport function rangeToPslSpan(range: Range, sourceFile: SourceFile): PslSpan {\n  return {\n    start: offsetToPslPosition(sourceFile.offsetAt(range.start), sourceFile),\n    end: offsetToPslPosition(sourceFile.offsetAt(range.end), sourceFile),\n  };\n}\n\nfunction offsetToPslPosition(offset: number, sourceFile: SourceFile): PslSpan['start'] {\n  const position: Position = sourceFile.positionAt(offset);\n  return { offset, line: position.line + 1, column: position.character + 1 };\n}\n","import type { PslDiagnostic, PslDiagnosticCode } from '@prisma-next/framework-components/psl-ast';\nimport { nodePslSpan } from '../../resolve';\nimport type { AstNode } from '../../syntax/ast-helpers';\nimport type { InterpretCtx } from '../types';\n\nexport const ATTRIBUTE_DIAGNOSTIC_CODE: PslDiagnosticCode = 'PSL_INVALID_ATTRIBUTE_SYNTAX';\n\nexport function leafDiagnostic(ctx: InterpretCtx, node: AstNode, message: string): PslDiagnostic {\n  return {\n    code: ATTRIBUTE_DIAGNOSTIC_CODE,\n    message,\n    sourceId: ctx.sourceId,\n    span: nodePslSpan(node.syntax, ctx.sourceFile),\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { BooleanLiteralExprAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport function bool(): ArgType<boolean> {\n  return {\n    kind: 'bool',\n    label: 'boolean',\n    parse: (arg, ctx): Result<boolean, readonly PslDiagnostic[]> => {\n      if (arg instanceof BooleanLiteralExprAst) {\n        const value = arg.value();\n        if (value !== undefined) return ok(value);\n      }\n      return notOk([leafDiagnostic(ctx, arg, 'Expected a boolean literal')]);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { IdentifierAst } from '../../syntax/ast/identifier';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\n// A bare model-name reference. Existence of a model with this name is resolved\n// downstream (e.g. `resolvePolymorphism`), not here.\nexport function entityRef(): ArgType<string> {\n  return {\n    kind: 'entityRef',\n    label: 'model name',\n    parse: (arg, ctx): Result<string, readonly PslDiagnostic[]> => {\n      if (!(arg instanceof IdentifierAst)) {\n        return notOk([leafDiagnostic(ctx, arg, 'Expected a model name')]);\n      }\n      const name = arg.name();\n      if (name === undefined) {\n        return notOk([leafDiagnostic(ctx, arg, 'Expected a model name')]);\n      }\n      return ok(name);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { IdentifierAst } from '../../syntax/ast/identifier';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport type FieldRefScope = 'self' | 'referenced';\n\nexport interface FieldRefArgType extends ArgType<string> {\n  readonly scope: FieldRefScope;\n}\n\nexport function fieldRef(scope: FieldRefScope): FieldRefArgType {\n  return {\n    kind: 'fieldRef',\n    label: 'field name',\n    scope,\n    parse: (arg, ctx): Result<string, readonly PslDiagnostic[]> => {\n      if (!(arg instanceof IdentifierAst)) {\n        return notOk([leafDiagnostic(ctx, arg, 'Expected a field name')]);\n      }\n      const name = arg.name();\n      if (name === undefined) {\n        return notOk([leafDiagnostic(ctx, arg, 'Expected a field name')]);\n      }\n      const model = scope === 'self' ? ctx.selfModel : ctx.resolveReferencedModel();\n      // A referenced model in another space can't be resolved here (resolveReferencedModel returns undefined); skip the existence check — it runs where that model is known.\n      if (model !== undefined && !Object.hasOwn(model.fields, name)) {\n        return notOk([\n          leafDiagnostic(ctx, arg, `Field \"${name}\" does not exist on model \"${model.name}\"`),\n        ]);\n      }\n      return ok(name);\n    },\n  };\n}\n","import type { PslDiagnostic, PslSpan } from '@prisma-next/framework-components/psl-ast';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { nodePslSpan } from '../resolve';\nimport type { FieldAttributeAst, ModelAttributeAst } from '../syntax/ast/attributes';\nimport type { AttributeArgAst } from '../syntax/ast/expressions';\nimport { ATTRIBUTE_DIAGNOSTIC_CODE } from './combinators/diagnostic';\nimport type {\n  ArgType,\n  AttributeSpec,\n  InterpretCtx,\n  OptionalArgType,\n  Param,\n  PositionalParam,\n} from './types';\n\n// The positional/named argument-binding for an attribute or a function call. `name` labels the\n// callee in binding diagnostics (`Attribute \"<name>\" …`); `span` anchors the arity diagnostics\n// (too-many / missing) that have no per-argument node to point at.\nexport interface ArgBindingSpec {\n  readonly name: string;\n  readonly positional: readonly PositionalParam<unknown>[];\n  readonly named: Readonly<Record<string, Param<unknown>>>;\n}\n\nexport function interpretArgs(\n  args: Iterable<AttributeArgAst>,\n  spec: ArgBindingSpec,\n  ctx: InterpretCtx,\n  span: PslSpan,\n): Result<Record<string, unknown>, readonly PslDiagnostic[]> {\n  const diagnostics: PslDiagnostic[] = [];\n\n  const output: Record<string, unknown> = {};\n  const seen = new Set<string>();\n  let positionalSlot = 0;\n  let reportedExcess = false;\n\n  for (const arg of args) {\n    const name = arg.name()?.name();\n\n    let key: string;\n    let param: Param<unknown>;\n    if (name === undefined) {\n      const posParam = spec.positional[positionalSlot];\n      if (posParam === undefined) {\n        if (!reportedExcess) {\n          diagnostics.push(\n            diagnostic(\n              `Attribute \"${spec.name}\" received too many positional arguments`,\n              ctx,\n              span,\n            ),\n          );\n          reportedExcess = true;\n        }\n        continue;\n      }\n      positionalSlot += 1;\n      key = posParam.key;\n      param = posParam.type;\n    } else {\n      const namedParam = Object.hasOwn(spec.named, name) ? spec.named[name] : undefined;\n      if (namedParam === undefined) {\n        diagnostics.push(\n          diagnostic(\n            `Attribute \"${spec.name}\" received unknown argument \"${name}\"`,\n            ctx,\n            nodePslSpan(arg.syntax, ctx.sourceFile),\n          ),\n        );\n        continue;\n      }\n      key = name;\n      param = namedParam;\n    }\n\n    if (seen.has(key)) {\n      diagnostics.push(\n        diagnostic(\n          `Attribute \"${spec.name}\" received duplicate argument \"${key}\"`,\n          ctx,\n          nodePslSpan(arg.syntax, ctx.sourceFile),\n        ),\n      );\n      continue;\n    }\n    seen.add(key);\n    const result = parseArgValue(arg, param, ctx, diagnostics);\n    if (result.ok) output[key] = result.value;\n  }\n\n  const finalized = new Set<string>();\n  const finalizeAbsentKey = (\n    key: string,\n    positionalParam: Param<unknown> | undefined,\n    namedParam: Param<unknown> | undefined,\n  ): void => {\n    if (finalized.has(key) || seen.has(key)) return;\n    finalized.add(key);\n    const effective = namedParam ?? positionalParam;\n    if (effective === undefined) return;\n    if (isOptionalArgType(effective)) {\n      if (effective.hasDefault) output[key] = effective.defaultValue;\n      return;\n    }\n    diagnostics.push(\n      diagnostic(`Attribute \"${spec.name}\" is missing required argument \"${key}\"`, ctx, span),\n    );\n  };\n\n  for (const param of spec.positional) {\n    const namedParam = Object.hasOwn(spec.named, param.key) ? spec.named[param.key] : undefined;\n    finalizeAbsentKey(param.key, param.type, namedParam);\n  }\n  for (const key of Object.keys(spec.named)) {\n    finalizeAbsentKey(key, undefined, spec.named[key]);\n  }\n\n  if (diagnostics.length > 0) {\n    return notOk<readonly PslDiagnostic[]>(diagnostics);\n  }\n  return ok(output);\n}\n\nexport function interpretAttribute<Out>(\n  attrNode: FieldAttributeAst | ModelAttributeAst,\n  spec: AttributeSpec<Out>,\n  ctx: InterpretCtx,\n): Result<Out, readonly PslDiagnostic[]> {\n  const attributeSpan = nodePslSpan(attrNode.syntax, ctx.sourceFile);\n  const bound = interpretArgs(attrNode.argList()?.args() ?? [], spec, ctx, attributeSpan);\n  if (!bound.ok) return notOk<readonly PslDiagnostic[]>(bound.failure);\n\n  const value = blindCast<\n    Out,\n    'The engine builds the output object structurally from the spec; TypeScript cannot relate the dynamically-keyed record to the spec-inferred output type.'\n  >(bound.value);\n  if (spec.refine !== undefined) {\n    const refineDiagnostics = spec.refine(value, ctx);\n    if (refineDiagnostics.length > 0) {\n      return notOk<readonly PslDiagnostic[]>(refineDiagnostics);\n    }\n  }\n  return ok(value);\n}\n\nfunction parseArgValue(\n  arg: AttributeArgAst,\n  argType: ArgType<unknown>,\n  ctx: InterpretCtx,\n  diagnostics: PslDiagnostic[],\n): Result<unknown, readonly PslDiagnostic[]> {\n  const value = arg.value();\n  if (value === undefined) {\n    const missing = diagnostic(\n      'Attribute argument is missing a value',\n      ctx,\n      nodePslSpan(arg.syntax, ctx.sourceFile),\n    );\n    diagnostics.push(missing);\n    return notOk<readonly PslDiagnostic[]>([missing]);\n  }\n  const result = argType.parse(value, ctx);\n  if (!result.ok) {\n    for (const failure of result.failure) diagnostics.push(failure);\n  }\n  return result;\n}\n\nfunction isOptionalArgType(param: Param<unknown>): param is OptionalArgType<unknown> {\n  return 'optional' in param && param.optional === true;\n}\n\nfunction diagnostic(message: string, ctx: InterpretCtx, span: PslSpan): PslDiagnostic {\n  return { code: ATTRIBUTE_DIAGNOSTIC_CODE, message, sourceId: ctx.sourceId, span };\n}\n","import type { PslDiagnostic, PslSpan } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { nodePslSpan } from '../../resolve';\nimport type { ExpressionAst } from '../../syntax/ast/expressions';\nimport { FunctionCallAst } from '../../syntax/ast/expressions';\nimport { interpretArgs } from '../interpret';\nimport type { ArgType, InterpretCtx, Param, PositionalParam } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\n// The argument signature of a pinned function call — the same positional/named shape an attribute\n// spec uses. Omitted groups default to empty, so a nullary call needs neither key.\nexport interface FuncCallSig {\n  readonly positional?: readonly PositionalParam<unknown>[];\n  readonly named?: Readonly<Record<string, Param<unknown>>>;\n}\n\nexport interface TypedFuncCall {\n  readonly fn: string;\n  readonly span: PslSpan;\n  readonly args: Readonly<Record<string, unknown>>;\n}\n\n// A name-pinned function-call argument — `funcCall('now', {})` matches `now()`, parsing the call's\n// arguments through `sig`.\nexport function funcCall(name: string, sig: FuncCallSig): ArgType<TypedFuncCall> {\n  return {\n    kind: 'funcCall',\n    label: 'function call',\n    parse: (arg, ctx): Result<TypedFuncCall, readonly PslDiagnostic[]> => {\n      const guard = matchCallee(arg, name, ctx);\n      if (!guard.ok) return guard;\n      const span = nodePslSpan(guard.value.syntax, ctx.sourceFile);\n      const bound = interpretArgs(\n        guard.value.args(),\n        { name, positional: sig.positional ?? [], named: sig.named ?? {} },\n        ctx,\n        span,\n      );\n      if (!bound.ok) return notOk<readonly PslDiagnostic[]>(bound.failure);\n      return ok({ fn: name, span, args: bound.value });\n    },\n  };\n}\n\nfunction matchCallee(\n  arg: ExpressionAst,\n  name: string,\n  ctx: InterpretCtx,\n): Result<FunctionCallAst, readonly PslDiagnostic[]> {\n  if (!(arg instanceof FunctionCallAst)) {\n    return notOk([leafDiagnostic(ctx, arg, 'Expected a function call')]);\n  }\n  const qname = arg.name();\n  if (qname === undefined || qname.dot() !== undefined || qname.colon() !== undefined) {\n    return notOk([leafDiagnostic(ctx, arg, 'Expected a function call')]);\n  }\n  const calleeName = qname.identifier()?.token()?.text;\n  if (calleeName === undefined) {\n    return notOk([leafDiagnostic(ctx, arg, 'Expected a function call')]);\n  }\n  if (calleeName !== name) {\n    return notOk([leafDiagnostic(ctx, arg, `Expected ${name}()`)]);\n  }\n  return ok(arg);\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { IdentifierAst } from '../../syntax/ast/identifier';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport function identifier<const N extends string>(name: N): ArgType<N> {\n  return {\n    kind: 'identifier',\n    label: name,\n    parse: (arg, ctx): Result<N, readonly PslDiagnostic[]> => {\n      if (arg instanceof IdentifierAst && arg.name() === name) return ok(name);\n      return notOk([leafDiagnostic(ctx, arg, `Expected ${name}`)]);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { NumberLiteralExprAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\n// An integer literal reduced to its numeric value. Passing `min`/`max` additionally rejects\n// out-of-range integers with a distinct range message, leaving the integer-only check intact.\nexport function int(opts?: { min?: number; max?: number }): ArgType<number> {\n  const min = opts?.min;\n  const max = opts?.max;\n  return {\n    kind: 'int',\n    label: 'integer',\n    parse: (arg, ctx): Result<number, readonly PslDiagnostic[]> => {\n      if (arg instanceof NumberLiteralExprAst) {\n        const value = arg.value();\n        if (value !== undefined && Number.isInteger(value)) {\n          if ((min === undefined || value >= min) && (max === undefined || value <= max)) {\n            return ok(value);\n          }\n          return notOk([leafDiagnostic(ctx, arg, rangeMessage(min, max))]);\n        }\n      }\n      return notOk([leafDiagnostic(ctx, arg, 'Expected an integer literal')]);\n    },\n  };\n}\n\nfunction rangeMessage(min: number | undefined, max: number | undefined): string {\n  if (min !== undefined && max !== undefined)\n    return `Expected an integer between ${min} and ${max}`;\n  if (min !== undefined) return `Expected an integer greater than or equal to ${min}`;\n  return `Expected an integer less than or equal to ${max}`;\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { ArrayLiteralAst, type ExpressionAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport interface ListOptions {\n  readonly nonEmpty?: boolean;\n  readonly unique?: boolean;\n}\n\nexport function list<T>(of: ArgType<T>, opts?: ListOptions): ArgType<T[]> {\n  return {\n    kind: 'list',\n    label: `${of.label}[]`,\n    parse: (arg, ctx): Result<T[], readonly PslDiagnostic[]> => {\n      if (!(arg instanceof ArrayLiteralAst)) {\n        return notOk([leafDiagnostic(ctx, arg, `Expected a list of ${of.label}`)]);\n      }\n      const diagnostics: PslDiagnostic[] = [];\n      const parsed: { node: ExpressionAst; value: T }[] = [];\n      let count = 0;\n      for (const element of arg.elements()) {\n        count += 1;\n        const result = of.parse(element, ctx);\n        if (result.ok) parsed.push({ node: element, value: result.value });\n        else diagnostics.push(...result.failure);\n      }\n      if (opts?.nonEmpty === true && count === 0) {\n        diagnostics.push(leafDiagnostic(ctx, arg, 'Expected a non-empty list'));\n      }\n      if (opts?.unique === true) {\n        const seen = new Set<T>();\n        for (const { node, value } of parsed) {\n          if (seen.has(value)) diagnostics.push(leafDiagnostic(ctx, node, 'Duplicate list entry'));\n          else seen.add(value);\n        }\n      }\n      if (diagnostics.length > 0) return notOk(diagnostics);\n      return ok(parsed.map((entry) => entry.value));\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { NumberLiteralExprAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\n// A general number literal — any number, including floats — reduced to its numeric value.\n// Passing `value` pins the combinator to that single literal (`num(4)` matches only `4`),\n// mirroring how `identifier(name)` pins a bare identifier. Use `int()` when only integer\n// literals are allowed.\nexport function num(): ArgType<number>;\nexport function num(value: number): ArgType<number>;\nexport function num(value?: number): ArgType<number> {\n  return {\n    kind: 'num',\n    label: value === undefined ? 'number' : String(value),\n    parse: (arg, ctx): Result<number, readonly PslDiagnostic[]> => {\n      if (arg instanceof NumberLiteralExprAst) {\n        const parsed = arg.value();\n        if (parsed !== undefined && (value === undefined || parsed === value)) return ok(parsed);\n      }\n      const message = value === undefined ? 'Expected a number literal' : `Expected ${value}`;\n      return notOk([leafDiagnostic(ctx, arg, message)]);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport type { ArgType, OutOf } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport function oneOf<Alts extends readonly [ArgType<unknown>, ...ArgType<unknown>[]]>(\n  ...alts: Alts\n): ArgType<OutOf<Alts[number]>> {\n  const label = alts.map((alt) => alt.label).join(' | ');\n  return {\n    kind: 'oneOf',\n    label,\n    parse: (arg, ctx): Result<OutOf<Alts[number]>, readonly PslDiagnostic[]> => {\n      for (const alt of alts) {\n        const result = alt.parse(arg, ctx);\n        if (result.ok) {\n          return ok(\n            blindCast<\n              OutOf<Alts[number]>,\n              'The matched value comes from an alternative whose output type is a member of the union, but iterating the tuple widens each element to ArgType<unknown>, erasing that relationship.'\n            >(result.value),\n          );\n        }\n      }\n      return notOk([leafDiagnostic(ctx, arg, `Expected one of: ${label}`)]);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { ObjectLiteralExprAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport function record<T>(of: ArgType<T>): ArgType<Record<string, T>> {\n  return {\n    kind: 'record',\n    label: `{ [key]: ${of.label} }`,\n    parse: (arg, ctx): Result<Record<string, T>, readonly PslDiagnostic[]> => {\n      if (!(arg instanceof ObjectLiteralExprAst)) {\n        return notOk([leafDiagnostic(ctx, arg, 'Expected an object literal')]);\n      }\n      const diagnostics: PslDiagnostic[] = [];\n      const result: Record<string, T> = {};\n      for (const field of arg.fields()) {\n        const key = field.keyName();\n        if (key === undefined) {\n          diagnostics.push(leafDiagnostic(ctx, field, 'Expected a key'));\n          continue;\n        }\n        const value = field.value();\n        if (value === undefined) {\n          diagnostics.push(leafDiagnostic(ctx, field, `Expected a value for key \"${key}\"`));\n          continue;\n        }\n        const parsed = of.parse(value, ctx);\n        if (!parsed.ok) {\n          diagnostics.push(...parsed.failure);\n          continue;\n        }\n        if (Object.hasOwn(result, key)) {\n          diagnostics.push(leafDiagnostic(ctx, field, `Duplicate key \"${key}\"`));\n          continue;\n        }\n        result[key] = parsed.value;\n      }\n      if (diagnostics.length > 0) return notOk(diagnostics);\n      return ok(result);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { StringLiteralExprAst } from '../../syntax/ast/expressions';\nimport type { ArgType } from '../types';\nimport { leafDiagnostic } from './diagnostic';\n\nexport function str(): ArgType<string> {\n  return {\n    kind: 'str',\n    label: 'string',\n    parse: (arg, ctx): Result<string, readonly PslDiagnostic[]> => {\n      if (arg instanceof StringLiteralExprAst) {\n        const value = arg.value();\n        if (value !== undefined) return ok(value);\n      }\n      return notOk([leafDiagnostic(ctx, arg, 'Expected a string literal')]);\n    },\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport type { AttributeOut, AttributeSpec, InterpretCtx, Param, PositionalParam } from './types';\n\ninterface FieldAttributeConfig<\n  Pos extends readonly PositionalParam[],\n  Named extends Record<string, Param<unknown>>,\n> {\n  readonly positional?: Pos;\n  readonly named?: Named;\n  readonly refine?: (\n    parsed: AttributeOut<Pos, Named>,\n    ctx: InterpretCtx,\n  ) => readonly PslDiagnostic[];\n}\n\nexport function fieldAttribute<\n  const Pos extends readonly PositionalParam[] = readonly [],\n  const Named extends Record<string, Param<unknown>> = Record<never, never>,\n>(name: string, config: FieldAttributeConfig<Pos, Named>): AttributeSpec<AttributeOut<Pos, Named>> {\n  return {\n    level: 'field',\n    name,\n    positional: config.positional ?? [],\n    named: config.named ?? {},\n    ...(config.refine !== undefined ? { refine: config.refine } : {}),\n  };\n}\n","import type { PslDiagnostic } from '@prisma-next/framework-components/psl-ast';\nimport type { AttributeOut, AttributeSpec, InterpretCtx, Param, PositionalParam } from './types';\n\ninterface ModelAttributeConfig<\n  Pos extends readonly PositionalParam[],\n  Named extends Record<string, Param<unknown>>,\n> {\n  readonly positional?: Pos;\n  readonly named?: Named;\n  readonly refine?: (\n    parsed: AttributeOut<Pos, Named>,\n    ctx: InterpretCtx,\n  ) => readonly PslDiagnostic[];\n}\n\nexport function modelAttribute<\n  const Pos extends readonly PositionalParam[] = readonly [],\n  const Named extends Record<string, Param<unknown>> = Record<never, never>,\n>(name: string, config: ModelAttributeConfig<Pos, Named>): AttributeSpec<AttributeOut<Pos, Named>> {\n  return {\n    level: 'model',\n    name,\n    positional: config.positional ?? [],\n    named: config.named ?? {},\n    ...(config.refine !== undefined ? { refine: config.refine } : {}),\n  };\n}\n","import type { ArgType, OptionalArgType } from './types';\n\nexport function optional<T>(type: ArgType<T>, ...rest: [defaultValue: T] | []): OptionalArgType<T> {\n  if (rest.length === 0) {\n    return { ...type, optional: true, hasDefault: false };\n  }\n  return { ...type, optional: true, hasDefault: true, defaultValue: rest[0] };\n}\n","import {\n  type AuthoringPslBlockDescriptor,\n  type AuthoringPslBlockDescriptorNamespace,\n  isAuthoringPslBlockDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport {\n  makePslNamespace,\n  makePslNamespaceEntries,\n  type PslDiagnostic,\n  type PslModel,\n  type PslSpan,\n  UNSPECIFIED_PSL_NAMESPACE_ID,\n  validateExtensionBlock,\n} from '@prisma-next/framework-components/psl-ast';\nimport type { SourceFile } from './source-file';\nimport type { BlockSymbol, ModelSymbol, SymbolTable } from './symbol-table';\n\nexport function findBlockDescriptor(\n  descriptors: AuthoringPslBlockDescriptorNamespace | undefined,\n  keyword: string,\n): AuthoringPslBlockDescriptor | undefined {\n  if (descriptors === undefined) return undefined;\n  for (const value of Object.values(descriptors)) {\n    if (value === undefined) continue;\n    if (isAuthoringPslBlockDescriptor(value)) {\n      if (value.keyword === keyword) return value;\n      continue;\n    }\n    const nested = findBlockDescriptor(value, keyword);\n    if (nested !== undefined) return nested;\n  }\n  return undefined;\n}\n\nexport function validateExtensionBlockFromSymbol(input: {\n  readonly block: BlockSymbol;\n  readonly descriptor: AuthoringPslBlockDescriptor;\n  readonly symbolTable: SymbolTable;\n  readonly sourceFile: SourceFile;\n  readonly sourceId: string;\n  readonly codecLookup: CodecLookup;\n}): readonly PslDiagnostic[] {\n  const refCtx = buildRefResolutionContext(input.symbolTable, input.block);\n  return validateExtensionBlock(\n    input.block.block,\n    input.descriptor,\n    input.sourceId,\n    input.codecLookup,\n    refCtx,\n  );\n}\n\nconst ZERO_SPAN: PslSpan = {\n  start: { offset: 0, line: 1, column: 1 },\n  end: { offset: 0, line: 1, column: 1 },\n};\n\nfunction buildRefResolutionContext(\n  symbolTable: SymbolTable,\n  block: BlockSymbol,\n): {\n  ownerNamespace: ReturnType<typeof makePslNamespace>;\n  allNamespaces: readonly ReturnType<typeof makePslNamespace>[];\n} {\n  const unspecifiedNamespace = makeNamespace(\n    UNSPECIFIED_PSL_NAMESPACE_ID,\n    Object.values(symbolTable.topLevel.models),\n  );\n  const namedNamespaces = Object.values(symbolTable.topLevel.namespaces).map((namespace) =>\n    makeNamespace(namespace.name, Object.values(namespace.models)),\n  );\n  const allNamespaces = [unspecifiedNamespace, ...namedNamespaces];\n  const ownerNamespaceName = findOwnerNamespaceName(symbolTable, block);\n  const ownerNamespace =\n    allNamespaces.find((namespace) => namespace.name === ownerNamespaceName) ??\n    unspecifiedNamespace;\n  return { ownerNamespace, allNamespaces };\n}\n\nfunction makeNamespace(\n  name: string,\n  models: readonly ModelSymbol[],\n): ReturnType<typeof makePslNamespace> {\n  const modelStubs: PslModel[] = models.map((model) => ({\n    kind: 'model',\n    name: model.name,\n    fields: [],\n    attributes: [],\n    span: ZERO_SPAN,\n  }));\n  return makePslNamespace({\n    kind: 'namespace',\n    name,\n    entries: makePslNamespaceEntries(modelStubs, [], []),\n    span: ZERO_SPAN,\n  });\n}\n\nfunction findOwnerNamespaceName(symbolTable: SymbolTable, block: BlockSymbol): string {\n  for (const namespace of Object.values(symbolTable.topLevel.namespaces)) {\n    if (Object.values(namespace.blocks).some((candidate) => candidate === block)) {\n      return namespace.name;\n    }\n  }\n  return UNSPECIFIED_PSL_NAMESPACE_ID;\n}\n","import type { AuthoringPslBlockDescriptor } from '@prisma-next/framework-components/authoring';\nimport type {\n  PslBlockParam,\n  PslExtensionBlock,\n  PslExtensionBlockAttribute,\n  PslExtensionBlockParamValue,\n  PslSpan,\n} from '@prisma-next/framework-components/psl-ast';\nimport type { ParseDiagnostic } from './parse';\nimport { nodePslSpan } from './resolve';\nimport type { SourceFile } from './source-file';\nimport type { GenericBlockDeclarationAst, KeyValuePairAst } from './syntax/ast/declarations';\nimport { ArrayLiteralAst, type ExpressionAst } from './syntax/ast/expressions';\nimport { printSyntax } from './syntax/ast-helpers';\n\n/**\n * Descriptor-free and unknown parameters become `value` stubs so validation can\n * report them via key-set comparison. Duplicate member names are first-wins.\n */\nexport function reconstructExtensionBlock(\n  node: GenericBlockDeclarationAst,\n  descriptor: AuthoringPslBlockDescriptor | undefined,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): PslExtensionBlock {\n  const keyword = node.keyword()?.text ?? '';\n  const blockName = node.name()?.name() ?? '';\n\n  const blockAttributes: PslExtensionBlockAttribute[] = [];\n  for (const attribute of node.attributes()) {\n    const name = attribute.name()?.path().join('.') ?? '';\n    const args = Array.from(attribute.argList()?.args() ?? [], (arg) => {\n      const value = arg.value();\n      return {\n        kind: 'positional' as const,\n        value: value === undefined ? '' : printSyntax(value.syntax).trim(),\n        span: nodePslSpan(arg.syntax, sourceFile),\n      };\n    });\n    blockAttributes.push({\n      name,\n      args,\n      span: nodePslSpan(attribute.syntax, sourceFile),\n    });\n  }\n\n  const parameters: Record<string, PslExtensionBlockParamValue> = {};\n  for (const entry of node.entries()) {\n    const key = entry.key()?.name();\n    if (key === undefined) continue;\n    const span = nodePslSpan(entry.syntax, sourceFile);\n    if (Object.hasOwn(parameters, key)) {\n      diagnostics.push({\n        code: 'PSL_EXTENSION_DUPLICATE_PARAMETER',\n        message: `Duplicate parameter \"${key}\" in \"${keyword}\" block \"${blockName}\"; first occurrence wins`,\n        range: {\n          start: sourceFile.positionAt(entry.syntax.offset),\n          end: sourceFile.positionAt(entry.syntax.offset + entry.syntax.green.textLength),\n        },\n      });\n      continue;\n    }\n    parameters[key] = reconstructParamValue(\n      entry,\n      descriptor?.parameters[key],\n      span,\n      sourceFile,\n      diagnostics,\n    );\n  }\n\n  return {\n    kind: descriptor?.discriminator ?? keyword,\n    keyword,\n    name: blockName,\n    parameters,\n    blockAttributes,\n    span: nodePslSpan(node.syntax, sourceFile),\n  };\n}\n\nfunction reconstructParamValue(\n  entry: KeyValuePairAst,\n  param: PslBlockParam | undefined,\n  span: PslSpan,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): PslExtensionBlockParamValue {\n  const value = entry.value();\n  if (value === undefined) {\n    return { kind: 'bare', span };\n  }\n  return reconstructFromExpression(value, param, span, sourceFile, diagnostics);\n}\n\nfunction reconstructFromExpression(\n  value: ExpressionAst,\n  param: PslBlockParam | undefined,\n  span: PslSpan,\n  sourceFile: SourceFile,\n  diagnostics?: ParseDiagnostic[],\n): PslExtensionBlockParamValue {\n  const raw = printSyntax(value.syntax).trim();\n  if (param?.kind === 'list') {\n    const array = ArrayLiteralAst.cast(value.syntax);\n    if (!array) {\n      diagnostics?.push({\n        code: 'PSL_EXTENSION_INVALID_VALUE',\n        message: `List parameter expects an array literal, got ${raw}`,\n        range: {\n          start: sourceFile.positionAt(value.syntax.offset),\n          end: sourceFile.positionAt(value.syntax.offset + value.syntax.green.textLength),\n        },\n      });\n      return { kind: 'value', raw, span };\n    }\n\n    const items: PslExtensionBlockParamValue[] = [];\n    for (const element of array.elements()) {\n      items.push(\n        reconstructFromExpression(\n          element,\n          param.of,\n          nodePslSpan(element.syntax, sourceFile),\n          sourceFile,\n          diagnostics,\n        ),\n      );\n    }\n    return { kind: 'list', items, span };\n  }\n  switch (param?.kind) {\n    case 'ref':\n      return { kind: 'ref', identifier: raw, span };\n    case 'option':\n      return { kind: 'option', token: raw, span };\n    default:\n      return { kind: 'value', raw, span };\n  }\n}\n","import type { AuthoringPslBlockDescriptorNamespace } from '@prisma-next/framework-components/authoring';\nimport type { PslExtensionBlock, PslSpan } from '@prisma-next/framework-components/psl-ast';\nimport { reconstructExtensionBlock } from './block-reconstruction';\nimport { findBlockDescriptor } from './extension-block';\nimport type { ParseDiagnostic } from './parse';\nimport {\n  nodePslSpan,\n  type ResolvedAttribute,\n  type ResolvedTypeConstructorCall,\n  readResolvedAttributes,\n  readResolvedConstructorCall,\n} from './resolve';\nimport type { Range, SourceFile } from './source-file';\nimport {\n  CompositeTypeDeclarationAst,\n  type DocumentAst,\n  type FieldDeclarationAst,\n  GenericBlockDeclarationAst,\n  ModelDeclarationAst,\n  type NamedTypeDeclarationAst,\n  NamespaceDeclarationAst,\n  TypesBlockAst,\n} from './syntax/ast/declarations';\nimport type { IdentifierAst } from './syntax/ast/identifier';\nimport type { SyntaxNode } from './syntax/red';\n\nexport type {\n  ResolvedAttribute,\n  ResolvedAttributeArg,\n  ResolvedTypeConstructorCall,\n} from './resolve';\n\nexport interface SymbolTable {\n  readonly topLevel: TopLevelScope;\n}\n\nexport interface TopLevelScope {\n  readonly namespaces: Record<string, NamespaceSymbol>;\n  readonly scalars: Record<string, ScalarSymbol>;\n  readonly typeAliases: Record<string, TypeAliasSymbol>;\n  readonly blocks: Record<string, BlockSymbol>;\n  readonly models: Record<string, ModelSymbol>;\n  readonly compositeTypes: Record<string, CompositeTypeSymbol>;\n}\n\nexport interface NamespaceSymbol {\n  readonly kind: 'namespace';\n  readonly name: string;\n  readonly node: NamespaceDeclarationAst;\n  readonly span: PslSpan;\n  readonly models: Record<string, ModelSymbol>;\n  readonly compositeTypes: Record<string, CompositeTypeSymbol>;\n  readonly blocks: Record<string, BlockSymbol>;\n}\n\nexport interface ModelSymbol {\n  readonly kind: 'model';\n  readonly name: string;\n  readonly node: ModelDeclarationAst;\n  readonly span: PslSpan;\n  readonly fields: Record<string, FieldSymbol>;\n  readonly attributes: readonly ResolvedAttribute[];\n}\n\nexport interface CompositeTypeSymbol {\n  readonly kind: 'compositeType';\n  readonly name: string;\n  readonly node: CompositeTypeDeclarationAst;\n  readonly span: PslSpan;\n  readonly fields: Record<string, FieldSymbol>;\n  readonly attributes: readonly ResolvedAttribute[];\n}\n\nexport interface BlockSymbol {\n  readonly kind: 'block';\n  readonly name: string;\n  readonly keyword: string;\n  readonly node: GenericBlockDeclarationAst;\n  readonly span: PslSpan;\n  /** Resolved once so consumers do not independently classify block parameters. */\n  readonly block: PslExtensionBlock;\n}\n\nexport interface ResolvedNamedTypeBinding {\n  readonly baseType?: string;\n  readonly typeConstructor?: ResolvedTypeConstructorCall;\n  readonly isConstructor: boolean;\n  readonly attributes: readonly ResolvedAttribute[];\n}\n\nexport interface ScalarSymbol extends ResolvedNamedTypeBinding {\n  readonly kind: 'scalar';\n  readonly name: string;\n  readonly node: NamedTypeDeclarationAst;\n  readonly span: PslSpan;\n}\n\nexport interface TypeAliasSymbol extends ResolvedNamedTypeBinding {\n  readonly kind: 'typeAlias';\n  readonly name: string;\n  readonly node: NamedTypeDeclarationAst;\n  readonly span: PslSpan;\n}\n\nexport interface FieldSymbol {\n  readonly kind: 'field';\n  readonly name: string;\n  readonly node: FieldDeclarationAst;\n  readonly span: PslSpan;\n  readonly typeName: string;\n  readonly typeNamespaceId?: string;\n  readonly typeContractSpaceId?: string;\n  readonly optional: boolean;\n  readonly list: boolean;\n  readonly typeConstructor?: ResolvedTypeConstructorCall;\n  readonly attributes: readonly ResolvedAttribute[];\n  /** Prevents cascading unsupported-type diagnostics after invalid qualification. */\n  readonly malformedType?: boolean;\n}\n\nexport interface BuildSymbolTableOptions {\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly scalarTypes: readonly string[];\n  readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n}\n\nexport interface SymbolTableResult {\n  readonly table: SymbolTable;\n  readonly diagnostics: readonly ParseDiagnostic[];\n}\n\n/**\n * Owns duplicate-declaration detection for all PSL scopes; downstream consumers\n * should consume first-wins symbols rather than re-emitting duplicate diagnostics.\n */\nexport function buildSymbolTable(options: BuildSymbolTableOptions): SymbolTableResult {\n  const { document, sourceFile, scalarTypes, pslBlockDescriptors } = options;\n  const diagnostics: ParseDiagnostic[] = [];\n  const scalarSet = new Set(scalarTypes);\n\n  const namespaces: Record<string, NamespaceSymbol> = {};\n  const scalars: Record<string, ScalarSymbol> = {};\n  const typeAliases: Record<string, TypeAliasSymbol> = {};\n  const blocks: Record<string, BlockSymbol> = {};\n  const models: Record<string, ModelSymbol> = {};\n  const compositeTypes: Record<string, CompositeTypeSymbol> = {};\n  const topLevelNames = new Set<string>();\n\n  const claim = (taken: Set<string>, name: IdentifierAst | undefined): string | undefined => {\n    const text = name?.name();\n    if (text === undefined) return undefined;\n    if (taken.has(text)) {\n      const range = nameRange(name, sourceFile);\n      if (range) {\n        diagnostics.push({\n          code: 'PSL_DUPLICATE_DECLARATION',\n          message: `Duplicate declaration of \"${text}\"`,\n          range,\n        });\n      }\n      return undefined;\n    }\n    taken.add(text);\n    return text;\n  };\n\n  for (const declaration of document.declarations()) {\n    if (declaration instanceof ModelDeclarationAst) {\n      const name = claim(topLevelNames, declaration.name());\n      if (name !== undefined) models[name] = buildModel(name, declaration, sourceFile, diagnostics);\n    } else if (declaration instanceof CompositeTypeDeclarationAst) {\n      const name = claim(topLevelNames, declaration.name());\n      if (name !== undefined) {\n        compositeTypes[name] = buildCompositeType(name, declaration, sourceFile, diagnostics);\n      }\n    } else if (declaration instanceof GenericBlockDeclarationAst) {\n      const name = claim(topLevelNames, declaration.name());\n      if (name !== undefined) {\n        blocks[name] = buildBlock(name, declaration, sourceFile, pslBlockDescriptors, diagnostics);\n      }\n    } else if (declaration instanceof NamespaceDeclarationAst) {\n      const name = claim(topLevelNames, declaration.name());\n      if (name !== undefined) {\n        namespaces[name] = buildNamespace(\n          name,\n          declaration,\n          diagnostics,\n          sourceFile,\n          pslBlockDescriptors,\n        );\n      }\n    } else if (declaration instanceof TypesBlockAst) {\n      for (const binding of declaration.declarations()) {\n        const name = claim(topLevelNames, binding.name());\n        if (name === undefined) continue;\n        const resolved = resolveNamedTypeBinding(binding, sourceFile);\n        const span = nodePslSpan(binding.syntax, sourceFile);\n        if (isScalarBinding(binding, scalarSet)) {\n          scalars[name] = { kind: 'scalar', name, node: binding, span, ...resolved };\n        } else {\n          typeAliases[name] = { kind: 'typeAlias', name, node: binding, span, ...resolved };\n        }\n      }\n    }\n  }\n\n  const table: SymbolTable = {\n    topLevel: { namespaces, scalars, typeAliases, blocks, models, compositeTypes },\n  };\n  return { table, diagnostics };\n}\n\nfunction buildModel(\n  name: string,\n  node: ModelDeclarationAst,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): ModelSymbol {\n  return {\n    kind: 'model',\n    name,\n    node,\n    span: nodePslSpan(node.syntax, sourceFile),\n    fields: buildFields(name, node.fields(), sourceFile, diagnostics),\n    attributes: readResolvedAttributes(node.attributes(), sourceFile),\n  };\n}\n\nfunction buildCompositeType(\n  name: string,\n  node: CompositeTypeDeclarationAst,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): CompositeTypeSymbol {\n  return {\n    kind: 'compositeType',\n    name,\n    node,\n    span: nodePslSpan(node.syntax, sourceFile),\n    fields: buildFields(name, node.fields(), sourceFile, diagnostics),\n    attributes: readResolvedAttributes(node.attributes(), sourceFile),\n  };\n}\n\nfunction buildBlock(\n  name: string,\n  node: GenericBlockDeclarationAst,\n  sourceFile: SourceFile,\n  pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace,\n  diagnostics: ParseDiagnostic[],\n): BlockSymbol {\n  const keyword = node.keyword()?.text ?? '';\n  const descriptor = findBlockDescriptor(pslBlockDescriptors, keyword);\n  return {\n    kind: 'block',\n    name,\n    keyword,\n    node,\n    span: nodePslSpan(node.syntax, sourceFile),\n    block: reconstructExtensionBlock(node, descriptor, sourceFile, diagnostics),\n  };\n}\n\nfunction buildNamespace(\n  name: string,\n  node: NamespaceDeclarationAst,\n  diagnostics: ParseDiagnostic[],\n  sourceFile: SourceFile,\n  pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace,\n): NamespaceSymbol {\n  const models: Record<string, ModelSymbol> = {};\n  const compositeTypes: Record<string, CompositeTypeSymbol> = {};\n  const blocks: Record<string, BlockSymbol> = {};\n  const taken = new Set<string>();\n\n  for (const member of node.declarations()) {\n    const memberName = member.name()?.name();\n    if (memberName === undefined) continue;\n    if (taken.has(memberName)) {\n      const range = nameRange(member.name(), sourceFile);\n      if (range) {\n        diagnostics.push({\n          code: 'PSL_DUPLICATE_DECLARATION',\n          message: `Duplicate declaration of \"${memberName}\"`,\n          range,\n        });\n      }\n      continue;\n    }\n    taken.add(memberName);\n    if (member instanceof ModelDeclarationAst) {\n      models[memberName] = buildModel(memberName, member, sourceFile, diagnostics);\n    } else if (member instanceof CompositeTypeDeclarationAst) {\n      compositeTypes[memberName] = buildCompositeType(memberName, member, sourceFile, diagnostics);\n    } else if (member instanceof GenericBlockDeclarationAst) {\n      blocks[memberName] = buildBlock(\n        memberName,\n        member,\n        sourceFile,\n        pslBlockDescriptors,\n        diagnostics,\n      );\n    }\n  }\n\n  return {\n    kind: 'namespace',\n    name,\n    node,\n    span: nodePslSpan(node.syntax, sourceFile),\n    models,\n    compositeTypes,\n    blocks,\n  };\n}\n\nfunction buildFields(\n  ownerName: string,\n  fields: Iterable<FieldDeclarationAst>,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): Record<string, FieldSymbol> {\n  const result: Record<string, FieldSymbol> = {};\n  for (const field of fields) {\n    const nameNode = field.name();\n    const name = nameNode?.name();\n    if (name === undefined) continue;\n    if (Object.hasOwn(result, name)) {\n      const range = nameRange(nameNode, sourceFile);\n      if (range) {\n        diagnostics.push({\n          code: 'PSL_DUPLICATE_DECLARATION',\n          message: `Duplicate declaration of \"${name}\"`,\n          range,\n        });\n      }\n      continue;\n    }\n    result[name] = buildField(ownerName, name, field, sourceFile, diagnostics);\n  }\n  return result;\n}\n\nfunction buildField(\n  ownerName: string,\n  name: string,\n  node: FieldDeclarationAst,\n  sourceFile: SourceFile,\n  diagnostics: ParseDiagnostic[],\n): FieldSymbol {\n  const attributes = readResolvedAttributes(node.attributes(), sourceFile);\n  const span = nodePslSpan(node.syntax, sourceFile);\n  const annotation = node.typeAnnotation();\n  const typeName = annotation?.name();\n\n  if (typeName?.isOverQualified()) {\n    const path = typeName.path();\n    diagnostics.push({\n      code: 'PSL_INVALID_QUALIFIED_TYPE',\n      message: `Field \"${ownerName}.${name}\" has an invalid qualified type \"${path.join('.')}\"; use at most one namespace qualifier (e.g. \"ns.TypeName\")`,\n      range: nodeRange(typeName.syntax, sourceFile),\n    });\n    return {\n      kind: 'field',\n      name,\n      node,\n      span,\n      typeName: path[path.length - 1] ?? '',\n      optional: false,\n      list: false,\n      malformedType: true,\n      attributes,\n    };\n  }\n\n  const typeConstructor = annotation?.isConstructor()\n    ? readResolvedConstructorCall(annotation, sourceFile)\n    : undefined;\n  const typeNamespaceId = typeName?.namespace()?.name();\n  const typeContractSpaceId = typeName?.space()?.name();\n\n  return {\n    kind: 'field',\n    name,\n    node,\n    span,\n    typeName: typeName?.identifier()?.name() ?? '',\n    ...(typeNamespaceId !== undefined ? { typeNamespaceId } : {}),\n    ...(typeContractSpaceId !== undefined ? { typeContractSpaceId } : {}),\n    optional: annotation?.isOptional() ?? false,\n    list: annotation?.isList() ?? false,\n    ...(typeConstructor !== undefined ? { typeConstructor } : {}),\n    attributes,\n  };\n}\n\nfunction resolveNamedTypeBinding(\n  node: NamedTypeDeclarationAst,\n  sourceFile: SourceFile,\n): {\n  baseType?: string;\n  typeConstructor?: ResolvedTypeConstructorCall;\n  isConstructor: boolean;\n  attributes: readonly ResolvedAttribute[];\n} {\n  const annotation = node.typeAnnotation();\n  const isConstructor = annotation?.isConstructor() ?? false;\n  const baseType = annotation?.name()?.identifier()?.name();\n  const typeConstructor = readResolvedConstructorCall(annotation, sourceFile);\n  return {\n    isConstructor,\n    ...(!isConstructor && baseType !== undefined ? { baseType } : {}),\n    ...(typeConstructor !== undefined ? { typeConstructor } : {}),\n    attributes: readResolvedAttributes(node.attributes(), sourceFile),\n  };\n}\n\nfunction isScalarBinding(node: NamedTypeDeclarationAst, scalarTypes: Set<string>): boolean {\n  const annotation = node.typeAnnotation();\n  if (annotation === undefined || annotation.isConstructor()) return false;\n  const base = annotation.name()?.identifier()?.name();\n  return base !== undefined && scalarTypes.has(base);\n}\n\nfunction nameRange(name: IdentifierAst | undefined, sourceFile: SourceFile): Range | undefined {\n  if (name === undefined) return undefined;\n  for (const token of name.syntax.tokens()) {\n    if (token.kind === 'Ident') {\n      return {\n        start: sourceFile.positionAt(token.offset),\n        end: sourceFile.positionAt(token.offset + token.text.length),\n      };\n    }\n  }\n  return undefined;\n}\n\nfunction nodeRange(node: SyntaxNode, sourceFile: SourceFile): Range {\n  const start = node.offset;\n  const end = start + node.green.textLength;\n  return {\n    start: sourceFile.positionAt(start),\n    end: sourceFile.positionAt(end),\n  };\n}\n"],"mappings":"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"}