@prisma-next/sql-contract-ts 0.13.0-dev.3 → 0.13.0-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -9
- package/dist/{build-contract-C-x2pfu4.mjs → build-contract-Bu6zubET.mjs} +18 -49
- package/dist/build-contract-Bu6zubET.mjs.map +1 -0
- package/dist/config-types.mjs +1 -1
- package/dist/contract-builder.d.mts +111 -60
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +43 -9
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +10 -10
- package/src/build-contract.ts +20 -87
- package/src/contract-builder.ts +47 -31
- package/src/contract-definition.ts +3 -23
- package/src/contract-dsl.ts +41 -17
- package/src/contract-lowering.ts +12 -24
- package/src/contract-types.ts +105 -26
- package/src/contract-warnings.ts +3 -6
- package/src/enum-type.ts +98 -28
- package/src/exports/contract-builder.ts +10 -2
- package/dist/build-contract-C-x2pfu4.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-builder.mjs","names":[],"sources":["../src/authoring-helper-runtime.ts","../src/enum-type.ts","../src/contract-dsl.ts","../src/composed-authoring-helpers.ts","../src/contract-warnings.ts","../src/contract-lowering.ts","../src/contract-builder.ts"],"sourcesContent":["import type {\n AuthoringFieldNamespace,\n AuthoringFieldPresetDescriptor,\n AuthoringTypeNamespace,\n} from '@prisma-next/framework-components/authoring';\nimport {\n instantiateAuthoringTypeConstructor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n validateAuthoringHelperArguments,\n} from '@prisma-next/framework-components/authoring';\nimport { type StorageTypeInstance, toStorageTypeInstance } from '@prisma-next/sql-contract/types';\n\nexport type RuntimeNamedConstraintSpec = {\n readonly name?: string;\n};\n\nexport function isNamedConstraintOptionsLike(value: unknown): value is RuntimeNamedConstraintSpec {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.some((key) => key !== 'name')) {\n return false;\n }\n\n const name = (value as { readonly name?: unknown }).name;\n return name === undefined || typeof name === 'string';\n}\n\nconst blockedSegments = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction assertSafeHelperKey(key: string, path: readonly string[]): void {\n if (blockedSegments.has(key)) {\n throw new Error(\n `Invalid authoring helper \"${[...path, key].join('.')}\". Helper path segments must not use \"${key}\".`,\n );\n }\n}\n\nexport function createTypeHelpersFromNamespace(\n namespace: AuthoringTypeNamespace,\n path: readonly string[] = [],\n): Record<string, unknown> {\n const helpers: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(namespace)) {\n assertSafeHelperKey(key, path);\n const currentPath = [...path, key];\n\n if (isAuthoringTypeConstructorDescriptor(value)) {\n const helperPath = currentPath.join('.');\n helpers[key] = (...args: readonly unknown[]): StorageTypeInstance => {\n validateAuthoringHelperArguments(helperPath, value.args, args);\n const triple = instantiateAuthoringTypeConstructor(value, args);\n return toStorageTypeInstance({\n codecId: triple.codecId,\n nativeType: triple.nativeType,\n typeParams: triple.typeParams ?? {},\n });\n };\n continue;\n }\n\n helpers[key] = createTypeHelpersFromNamespace(value as AuthoringTypeNamespace, currentPath);\n }\n\n return helpers;\n}\n\nexport function createFieldPresetHelper<Result>(options: {\n readonly helperPath: string;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n readonly build: (options: {\n readonly args: readonly unknown[];\n readonly namedConstraintOptions?: RuntimeNamedConstraintSpec;\n }) => Result;\n}): (...rawArgs: readonly unknown[]) => Result {\n return (...rawArgs: readonly unknown[]) => {\n const acceptsNamedConstraintOptions =\n options.descriptor.output.id === true || options.descriptor.output.unique === true;\n const declaredArguments = options.descriptor.args ?? [];\n\n if (acceptsNamedConstraintOptions && rawArgs.length > declaredArguments.length + 1) {\n throw new Error(\n `${options.helperPath} expects at most ${declaredArguments.length + 1} argument(s), received ${rawArgs.length}`,\n );\n }\n\n let args = rawArgs;\n let namedConstraintOptions: RuntimeNamedConstraintSpec | undefined;\n\n if (acceptsNamedConstraintOptions && rawArgs.length === declaredArguments.length + 1) {\n const maybeNamedConstraintOptions = rawArgs.at(-1);\n if (!isNamedConstraintOptionsLike(maybeNamedConstraintOptions)) {\n throw new Error(\n `${options.helperPath} accepts an optional trailing { name?: string } constraint options object`,\n );\n }\n namedConstraintOptions = maybeNamedConstraintOptions;\n args = rawArgs.slice(0, -1);\n }\n\n validateAuthoringHelperArguments(options.helperPath, options.descriptor.args, args);\n\n return options.build({\n args,\n ...(namedConstraintOptions ? { namedConstraintOptions } : {}),\n });\n };\n}\n\nexport function createFieldHelpersFromNamespace(\n namespace: AuthoringFieldNamespace,\n createLeafHelper: (options: {\n readonly helperPath: string;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n }) => (...rawArgs: readonly unknown[]) => unknown,\n path: readonly string[] = [],\n): Record<string, unknown> {\n const helpers: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(namespace)) {\n assertSafeHelperKey(key, path);\n const currentPath = [...path, key];\n\n if (isAuthoringFieldPresetDescriptor(value)) {\n helpers[key] = createLeafHelper({\n helperPath: currentPath.join('.'),\n descriptor: value,\n });\n continue;\n }\n\n helpers[key] = createFieldHelpersFromNamespace(\n value as AuthoringFieldNamespace,\n createLeafHelper,\n currentPath,\n );\n }\n\n return helpers;\n}\n","import type { ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport { blindCast } from '@prisma-next/utils/casts';\n\n// ---------------------------------------------------------------------------\n// EnumMember — a single member declaration with literal type preservation\n// ---------------------------------------------------------------------------\n\n/**\n * A single enum member produced by `member()`. The `Name` and `Value` generics\n * are preserved as literal types so `enumType()` can carry the ordered value\n * tuple in its return type.\n */\nexport interface EnumMember<Name extends string, Value extends string> {\n readonly name: Name;\n readonly value: Value;\n}\n\n/**\n * Declare an enum member. The `value` defaults to `name` when omitted.\n * Both generics are preserved as literals so downstream `enumType` can\n * carry the ordered value tuple in its type.\n */\nexport function member<const Name extends string>(name: Name): EnumMember<Name, Name>;\nexport function member<const Name extends string, const Value extends string>(\n name: Name,\n value: Value,\n): EnumMember<Name, Value>;\nexport function member<const Name extends string, const Value extends string = Name>(\n name: Name,\n value?: Value,\n): EnumMember<Name, Value> {\n return {\n name,\n value: blindCast<\n Value,\n 'overload signatures enforce Value=Name when value is omitted; default generic Value=Name makes this safe'\n >(value ?? name),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Internal types for inferring the literal tuple from the members spread\n// ---------------------------------------------------------------------------\n\ntype MembersToValues<Members extends readonly EnumMember<string, string>[]> = {\n readonly [K in keyof Members]: Members[K] extends EnumMember<string, infer V> ? V : never;\n};\n\ntype MembersToNames<Members extends readonly EnumMember<string, string>[]> = {\n readonly [K in keyof Members]: Members[K] extends EnumMember<infer N, string> ? N : never;\n};\n\ntype MembersAccessorMap<Members extends readonly EnumMember<string, string>[]> = {\n readonly [M in Members[number] as M['name']]: M['value'];\n};\n\n// ---------------------------------------------------------------------------\n// EnumTypeHandle — the authoring handle returned by enumType()\n// ---------------------------------------------------------------------------\n\n/**\n * Internal brand that identifies an EnumTypeHandle in the lowering pipeline.\n * Not exported — callers only interact with `EnumTypeHandle`.\n */\nexport const ENUM_TYPE_HANDLE_BRAND = Symbol('EnumTypeHandle');\n\n/**\n * Authoring handle returned by `enumType()`. Carries:\n *\n * - The ordered literal value tuple (`.values`) and name tuple (`.names`)\n * so downstream type-tests can assert literal preservation.\n * - A namespaced member accessor map (`.members`) to avoid collisions with\n * `.values` / `.has` / `.nameOf` / `.ordinalOf`.\n * - Runtime helpers `.has()`, `.nameOf()`, `.ordinalOf()`.\n * - Internal metadata (`enumName`, `codecId`, `nativeType`,\n * `enumMembers`) for the lowering pipeline.\n *\n * The type is generic over the ordered value tuple so callers that assign\n * `const Role = enumType(...)` retain the literal tuple on `.values`.\n */\nexport interface EnumTypeHandle<\n Name extends string = string,\n Values extends readonly string[] = readonly string[],\n Names extends readonly string[] = readonly string[],\n MembersMap extends Record<string, string> = Record<string, string>,\n> {\n /** Internal brand for lowering-pipeline detection. */\n readonly [ENUM_TYPE_HANDLE_BRAND]: true;\n\n /** The enum's declared name (used as the key in domain `enum` / storage `valueSet`). */\n readonly enumName: Name;\n\n /** codecId from the codec passed to `enumType`. */\n readonly codecId: string;\n\n /** nativeType from the codec passed to `enumType`. */\n readonly nativeType: string;\n\n /** Ordered member list for lowering (name + value pairs). */\n readonly enumMembers: readonly { readonly name: string; readonly value: string }[];\n\n /** Ordered literal value tuple. Declaration order is preserved. */\n readonly values: Values;\n\n /** Ordered literal name tuple. Declaration order is preserved. */\n readonly names: Names;\n\n /**\n * Namespaced accessor map: `Role.members.User === 'user'`.\n * Namespaced under `.members` to avoid collisions with `.values` / `.has`.\n */\n readonly members: MembersMap;\n\n /** Returns `true` if `v` is a declared member value. */\n has(v: string): boolean;\n\n /** Returns the member name for a value, or `undefined` if not found. */\n nameOf(v: string): string | undefined;\n\n /** Returns the zero-based declaration index of a value, or `-1` if not found. */\n ordinalOf(v: string): number;\n}\n\n// ---------------------------------------------------------------------------\n// enumType()\n// ---------------------------------------------------------------------------\n\n/**\n * Declare a domain enum for use in TS-authoring contracts.\n *\n * - The codec is an explicit required argument — the `codecId` and\n * `nativeType` are taken from the passed `ColumnTypeDescriptor` (e.g.\n * `{ codecId: 'pg/text@1', nativeType: 'text' }` from a field preset\n * output or a direct inline object).\n * - `const` generics on the members spread preserve the ordered literal\n * value tuple so `Role.values` is `readonly ['user','admin']`, not\n * `string[]`.\n * - Well-formedness assertions at construction: non-empty member list;\n * unique names; unique values.\n *\n * The returned handle wires into `field.namedType(handle)` to set\n * `valueSet` refs on both the domain field and the storage column.\n *\n * @example\n * ```ts\n * const Role = enumType('Role', { codecId: 'pg/text@1', nativeType: 'text' },\n * member('User', 'user'),\n * member('Admin', 'admin'),\n * );\n * // Role.values → readonly ['user', 'admin']\n * // Role.members.User → 'user'\n * ```\n */\nexport function enumType<\n const Name extends string,\n const Codec extends Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n const Members extends readonly [EnumMember<string, string>, ...EnumMember<string, string>[]],\n>(\n name: Name,\n codec: Codec,\n ...members: Members\n): EnumTypeHandle<\n Name,\n MembersToValues<[...Members]>,\n MembersToNames<[...Members]>,\n MembersAccessorMap<[...Members]>\n>;\nexport function enumType(\n name: string,\n codec: Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n ...members: EnumMember<string, string>[]\n): EnumTypeHandle;\nexport function enumType(\n name: string,\n codec: Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n ...members: EnumMember<string, string>[]\n): EnumTypeHandle {\n if (members.length === 0) {\n throw new Error(`enumType(\"${name}\"): must have at least one member.`);\n }\n\n const seenNames = new Set<string>();\n const seenValues = new Set<string>();\n for (const m of members) {\n if (seenNames.has(m.name)) {\n throw new Error(\n `enumType(\"${name}\"): duplicate member name \"${m.name}\". Member names must be unique.`,\n );\n }\n seenNames.add(m.name);\n\n if (seenValues.has(m.value)) {\n throw new Error(\n `enumType(\"${name}\"): duplicate member value \"${m.value}\". Member values must be unique.`,\n );\n }\n seenValues.add(m.value);\n }\n\n const values = Object.freeze(members.map((m) => m.value));\n const names = Object.freeze(members.map((m) => m.name));\n const enumMembers = Object.freeze(members.map((m) => ({ name: m.name, value: m.value })));\n\n const membersAccessor = Object.freeze(Object.fromEntries(members.map((m) => [m.name, m.value])));\n\n const valueSet = new Set(values);\n const valueToName = new Map(members.map((m) => [m.value, m.name]));\n const valueToOrdinal = new Map(values.map((v, i) => [v, i]));\n\n return {\n [ENUM_TYPE_HANDLE_BRAND]: true,\n enumName: name,\n codecId: codec.codecId,\n nativeType: codec.nativeType,\n enumMembers,\n values,\n names,\n members: membersAccessor,\n has: (v: string) => valueSet.has(v),\n nameOf: (v: string) => valueToName.get(v),\n ordinalOf: (v: string) => valueToOrdinal.get(v) ?? -1,\n };\n}\n\n/**\n * Returns true when the value is an `EnumTypeHandle` produced by\n * `enumType()`. Used in the lowering pipeline to detect enum handles\n * in field state without importing the BRAND symbol at every call site.\n */\nexport function isEnumTypeHandle(value: unknown): value is EnumTypeHandle {\n return (\n typeof value === 'object' &&\n value !== null &&\n Reflect.get(value, ENUM_TYPE_HANDLE_BRAND) === true\n );\n}\n","import type {\n ColumnDefault,\n ColumnDefaultLiteralInputValue,\n ControlPolicy,\n ExecutionMutationDefaultPhases,\n ExecutionMutationDefaultValue,\n} from '@prisma-next/contract/types';\nimport { isColumnDefault } from '@prisma-next/contract/types';\nimport type { ForeignKeyDefaultsState } from '@prisma-next/contract-authoring';\nimport type { AuthoringFieldPresetDescriptor } from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringFieldPreset } from '@prisma-next/framework-components/authoring';\nimport type { CodecLookup, ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport type { Namespace } from '@prisma-next/framework-components/ir';\nimport type {\n PostgresEnumStorageEntry,\n SqlNamespaceTablesInput,\n StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { NamedConstraintSpec } from './authoring-type-utils';\nimport type { EnumTypeHandle } from './enum-type';\nimport { isEnumTypeHandle } from './enum-type';\n\nexport type NamingStrategy = 'identity' | 'snake_case';\n\nexport type NamingConfig = {\n readonly tables?: NamingStrategy;\n readonly columns?: NamingStrategy;\n};\n\ntype NamedStorageTypeRef = string | StorageTypeInstance | PostgresEnumStorageEntry | EnumTypeHandle;\n\ntype NamedConstraintNameSpec<Name extends string = string> = {\n readonly name: Name;\n};\n\nexport type ScalarFieldState<\n CodecId extends string = string,\n TypeRef extends NamedStorageTypeRef | undefined = undefined,\n Nullable extends boolean = boolean,\n ColumnName extends string | undefined = string | undefined,\n IdSpec extends NamedConstraintSpec | undefined = undefined,\n UniqueSpec extends NamedConstraintSpec | undefined = undefined,\n> = {\n readonly kind: 'scalar';\n readonly descriptor?: (ColumnTypeDescriptor & { readonly codecId: CodecId }) | undefined;\n readonly typeRef?: TypeRef | undefined;\n readonly nullable: Nullable;\n readonly columnName?: ColumnName | undefined;\n readonly default?: ColumnDefault | undefined;\n readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;\n} & (IdSpec extends NamedConstraintSpec ? { readonly id: IdSpec } : { readonly id?: undefined }) &\n (UniqueSpec extends NamedConstraintSpec\n ? { readonly unique: UniqueSpec }\n : { readonly unique?: undefined });\n\ntype AnyScalarFieldState = {\n readonly kind: 'scalar';\n readonly descriptor?: (ColumnTypeDescriptor & { readonly codecId: string }) | undefined;\n readonly typeRef?: NamedStorageTypeRef | undefined;\n readonly nullable: boolean;\n readonly columnName?: string | undefined;\n readonly default?: ColumnDefault | undefined;\n readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;\n readonly id?: NamedConstraintSpec | undefined;\n readonly unique?: NamedConstraintSpec | undefined;\n};\n\ntype HasNamedConstraintId<State extends AnyScalarFieldState> =\n State extends ScalarFieldState<\n string,\n NamedStorageTypeRef | undefined,\n boolean,\n string | undefined,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? IdSpec extends NamedConstraintSpec\n ? true\n : false\n : false;\n\ntype HasNamedConstraintUnique<State extends AnyScalarFieldState> =\n State extends ScalarFieldState<\n string,\n NamedStorageTypeRef | undefined,\n boolean,\n string | undefined,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? UniqueSpec extends NamedConstraintSpec\n ? true\n : false\n : false;\n\ntype FieldSqlSpecForState<State extends AnyScalarFieldState> = {\n readonly column?: string;\n} & (HasNamedConstraintId<State> extends true\n ? { readonly id?: NamedConstraintNameSpec }\n : Record<never, never>) &\n (HasNamedConstraintUnique<State> extends true\n ? { readonly unique?: NamedConstraintNameSpec }\n : Record<never, never>);\n\ntype ApplyFieldSqlSpec<\n State extends AnyScalarFieldState,\n Spec extends FieldSqlSpecForState<State>,\n> =\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n Spec extends { readonly column: infer NextColumn extends string } ? NextColumn : ColumnName,\n Spec extends { readonly id: { readonly name: infer IdName extends string } }\n ? IdSpec extends NamedConstraintSpec\n ? NamedConstraintSpec<IdName>\n : IdSpec\n : IdSpec,\n Spec extends { readonly unique: { readonly name: infer UniqueName extends string } }\n ? UniqueSpec extends NamedConstraintSpec\n ? NamedConstraintSpec<UniqueName>\n : UniqueSpec\n : UniqueSpec\n >\n : never;\n\nexport type GeneratedFieldSpec = {\n readonly type: ColumnTypeDescriptor;\n readonly typeParams?: Record<string, unknown>;\n readonly generated: ExecutionMutationDefaultValue;\n};\n\nfunction toColumnDefault(value: ColumnDefaultLiteralInputValue | ColumnDefault): ColumnDefault {\n if (isColumnDefault(value)) {\n return value;\n }\n return { kind: 'literal', value };\n}\n\n// Chaining methods use `as unknown as <ConditionalType>` because TypeScript cannot narrow generic conditional return types through object spread. The runtime values are correct — the casts bridge the gap between the spread result and the compile-time conditional type that encodes the state transition.\nexport class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFieldState> {\n declare readonly __state: State;\n\n constructor(private readonly state: State) {}\n\n /**\n * Returns the physical column name when `.column(name)` was called, or\n * `undefined` when the field uses the default (logical field name) mapping.\n * Used by cross-space FK lowering to stamp the physical column name onto\n * `TargetFieldRef.columnName` so FK target columns are resolved correctly.\n */\n get physicalColumnName(): string | undefined {\n return this.state.columnName;\n }\n\n optional(): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n boolean,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n nullable: true,\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n boolean,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>\n : never);\n }\n\n column<ColumnName extends string>(\n name: ColumnName,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n string | undefined,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n columnName: name,\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n string | undefined,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>\n : never);\n }\n\n default(value: ColumnDefaultLiteralInputValue | ColumnDefault): ScalarFieldBuilder<State> {\n return new ScalarFieldBuilder({\n ...this.state,\n default: toColumnDefault(value),\n }) as ScalarFieldBuilder<State>;\n }\n\n defaultSql(expression: string): ScalarFieldBuilder<State> {\n return new ScalarFieldBuilder({\n ...this.state,\n default: { kind: 'function', expression },\n }) as ScalarFieldBuilder<State>;\n }\n\n id<const Name extends string | undefined = undefined>(\n options?: NamedConstraintSpec<Name>,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n ColumnName,\n NamedConstraintSpec<Name>,\n UniqueSpec\n >\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n id: options?.name ? { name: options.name } : {},\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n ColumnName,\n NamedConstraintSpec<Name>,\n UniqueSpec\n >\n : never);\n }\n\n unique<const Name extends string | undefined = undefined>(\n options?: NamedConstraintSpec<Name>,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n unique: options?.name ? { name: options.name } : {},\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>\n : never);\n }\n\n sql<const Spec extends FieldSqlSpecForState<State>>(\n spec: Spec,\n ): ScalarFieldBuilder<ApplyFieldSqlSpec<State, Spec>> {\n const idSpec = 'id' in spec ? spec.id : undefined;\n const uniqueSpec = 'unique' in spec ? spec.unique : undefined;\n\n if (idSpec && !this.state.id) {\n throw new Error('field.sql({ id }) requires an existing inline .id(...) declaration.');\n }\n if (uniqueSpec && !this.state.unique) {\n throw new Error(\n 'field.sql({ unique }) requires an existing inline .unique(...) declaration.',\n );\n }\n\n return new ScalarFieldBuilder({\n ...this.state,\n ...(spec.column ? { columnName: spec.column } : {}),\n ...(idSpec ? { id: { name: idSpec.name } } : {}),\n ...(uniqueSpec ? { unique: { name: uniqueSpec.name } } : {}),\n } as unknown as ApplyFieldSqlSpec<State, Spec>);\n }\n\n build(): State {\n return this.state;\n }\n}\n\nfunction columnField<Descriptor extends ColumnTypeDescriptor>(\n descriptor: Descriptor,\n): ScalarFieldBuilder<ScalarFieldState<Descriptor['codecId'], undefined, false, undefined>> {\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor,\n nullable: false,\n });\n}\n\nfunction generatedField<Descriptor extends ColumnTypeDescriptor>(\n spec: GeneratedFieldSpec & { readonly type: Descriptor },\n): ScalarFieldBuilder<ScalarFieldState<Descriptor['codecId'], undefined, false, undefined>> {\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor: {\n ...spec.type,\n ...(spec.typeParams ? { typeParams: spec.typeParams } : {}),\n },\n nullable: false,\n executionDefaults: { onCreate: spec.generated },\n });\n}\n\nfunction namedTypeField<TypeRef extends string>(\n typeRef: TypeRef,\n): ScalarFieldBuilder<ScalarFieldState<string, TypeRef, false, undefined>>;\nfunction namedTypeField<TypeRef extends StorageTypeInstance>(\n typeRef: TypeRef,\n): ScalarFieldBuilder<ScalarFieldState<TypeRef['codecId'], TypeRef, false, undefined>>;\nfunction namedTypeField<TypeRef extends PostgresEnumStorageEntry>(\n typeRef: TypeRef,\n): ScalarFieldBuilder<ScalarFieldState<string, TypeRef, false, undefined>>;\nfunction namedTypeField<Handle extends EnumTypeHandle>(\n typeRef: Handle,\n): ScalarFieldBuilder<ScalarFieldState<Handle['codecId'], Handle, false, undefined>>;\nfunction namedTypeField(\n typeRef: NamedStorageTypeRef,\n): ScalarFieldBuilder<ScalarFieldState<string, NamedStorageTypeRef, false, undefined>> {\n if (isEnumTypeHandle(typeRef)) {\n return new ScalarFieldBuilder({\n kind: 'scalar',\n typeRef,\n nullable: false,\n });\n }\n return new ScalarFieldBuilder({\n kind: 'scalar',\n typeRef,\n nullable: false,\n });\n}\n\nexport function buildFieldPreset(\n descriptor: AuthoringFieldPresetDescriptor,\n args: readonly unknown[],\n namedConstraintOptions?: NamedConstraintSpec,\n): ScalarFieldBuilder {\n const preset = instantiateAuthoringFieldPreset(descriptor, args);\n\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor: preset.descriptor,\n nullable: preset.nullable,\n ...ifDefined('default', preset.default),\n ...ifDefined('executionDefaults', preset.executionDefaults),\n ...(preset.id\n ? {\n id: namedConstraintOptions?.name ? { name: namedConstraintOptions.name } : {},\n }\n : {}),\n ...(preset.unique\n ? {\n unique: namedConstraintOptions?.name ? { name: namedConstraintOptions.name } : {},\n }\n : {}),\n });\n}\n\ntype RelationModelRefSource = 'string' | 'token' | 'lazyToken';\ntype TargetFieldRefSource = 'string' | 'token';\n\ntype EagerRelationModelName<\n ModelName extends string = string,\n Source extends Exclude<RelationModelRefSource, 'lazyToken'> = Exclude<\n RelationModelRefSource,\n 'lazyToken'\n >,\n> = {\n readonly kind: 'relationModelName';\n readonly source: Source;\n readonly modelName: ModelName;\n};\n\ntype LazyRelationModelName<ModelName extends string = string> = {\n readonly kind: 'lazyRelationModelName';\n readonly source: 'lazyToken';\n readonly resolve: () => ModelName;\n};\n\ntype RelationModelSource<ModelName extends string = string> =\n | EagerRelationModelName<ModelName>\n | LazyRelationModelName<ModelName>;\n\ntype BelongsToRelation<\n ToModel extends string = string,\n FromField extends string | readonly string[] = string | readonly string[],\n ToField extends string | readonly string[] = string | readonly string[],\n SqlSpec extends BelongsToRelationSqlSpec | undefined = undefined,\n> = {\n readonly kind: 'belongsTo';\n readonly toModel: RelationModelSource<ToModel>;\n readonly from: FromField;\n readonly to: ToField;\n readonly sql?: SqlSpec;\n /**\n * Contract-space identity of the target model. Populated when\n * `belongsTo` receives a cross-space branded handle. Absent for\n * local (same-space) relations.\n */\n readonly spaceId?: string;\n /**\n * Physical table name of the cross-space target model. Only set\n * when `spaceId` is present; read from the handle's `tableName`.\n */\n readonly tableName?: string;\n /**\n * Namespace coordinate of the cross-space target model.\n * Only set when `spaceId` is present.\n */\n readonly namespaceId?: string;\n};\n\ntype HasManyRelation<\n ToModel extends string = string,\n ByField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'hasMany';\n readonly toModel: RelationModelSource<ToModel>;\n readonly by: ByField;\n};\n\ntype HasOneRelation<\n ToModel extends string = string,\n ByField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'hasOne';\n readonly toModel: RelationModelSource<ToModel>;\n readonly by: ByField;\n};\n\ntype ManyToManyRelation<\n ToModel extends string = string,\n ThroughModel extends string = string,\n FromField extends string | readonly string[] = string | readonly string[],\n ToField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'manyToMany';\n readonly toModel: RelationModelSource<ToModel>;\n readonly through: RelationModelSource<ThroughModel>;\n readonly from: FromField;\n readonly to: ToField;\n};\n\nexport type RelationState =\n | BelongsToRelation<\n string,\n string | readonly string[],\n string | readonly string[],\n BelongsToRelationSqlSpec | undefined\n >\n | HasManyRelation\n | HasOneRelation\n | ManyToManyRelation;\n\ntype AnyRelationState = RelationState;\nexport type AnyRelationBuilder = RelationBuilder<AnyRelationState>;\n\ntype ApplyBelongsToRelationSqlSpec<\n State extends RelationState,\n SqlSpec extends BelongsToRelationSqlSpec,\n> =\n State extends BelongsToRelation<\n infer ToModel,\n infer FromField,\n infer ToField,\n BelongsToRelationSqlSpec | undefined\n >\n ? BelongsToRelation<ToModel, FromField, ToField, SqlSpec>\n : never;\n\nexport class RelationBuilder<State extends RelationState = AnyRelationState> {\n declare readonly __state: State;\n\n constructor(private readonly state: State) {}\n\n sql<const SqlSpec extends BelongsToRelationSqlSpec>(\n this: State extends BelongsToRelation<\n string,\n string | readonly string[],\n string | readonly string[],\n BelongsToRelationSqlSpec | undefined\n >\n ? RelationBuilder<State>\n : never,\n spec: SqlSpec,\n ): RelationBuilder<ApplyBelongsToRelationSqlSpec<State, SqlSpec>> {\n if (this.state.kind !== 'belongsTo') {\n throw new Error('relation.sql(...) is only supported for belongsTo relations.');\n }\n\n return new RelationBuilder({\n ...this.state,\n sql: spec,\n } as ApplyBelongsToRelationSqlSpec<State, SqlSpec>);\n }\n\n build(): State {\n return this.state;\n }\n}\n\n/**\n * Reference to a column on the current (local) model.\n *\n * Source columns are always local to the contract being authored. The\n * cross-space brand lives on `TargetFieldRef` (the target side of a foreign\n * key), not here.\n */\nexport type ColumnRef<FieldName extends string = string> = {\n readonly kind: 'columnRef';\n readonly fieldName: FieldName;\n};\n\n/**\n * Reference to a field on a target model, produced by model `.refs` and\n * `constraints.ref(modelName, fieldName)`.\n *\n * The `TSpaceId` phantom parameter carries the contract-space identity of the\n * target model. Local model handles produce `TSpaceId = '<self>'`; extension\n * handles carry the extension's `spaceId`. The brand is propagated from the\n * parent `ContractModelBuilder` via the `spaceId?` property: absent means local\n * (`'<self>'`), present means cross-space.\n */\nexport type TargetFieldRef<\n ModelName extends string = string,\n FieldName extends string = string,\n TSpaceId extends string = string,\n> = {\n readonly kind: 'targetFieldRef';\n readonly source: TargetFieldRefSource;\n readonly modelName: ModelName;\n readonly fieldName: FieldName;\n /**\n * Cross-space discriminator. When present, the referenced model lives in a\n * different contract space identified by this value. Absent for local refs.\n */\n readonly spaceId?: TSpaceId extends '<self>' ? never : TSpaceId;\n /**\n * Namespace id of the cross-space target model (e.g. `'auth'` for\n * `supabase` `auth.User`). Only present for cross-space refs.\n */\n readonly namespaceId?: string;\n /**\n * Physical table name of the cross-space target model. Only present for\n * cross-space refs; allows the lowering path to bypass the local model\n * registry.\n */\n readonly tableName?: string;\n /**\n * Physical column name of the target field. Populated for cross-space refs\n * when the extension handle's field used `.column(name)` to rename the\n * physical column. When absent the logical `fieldName` is used as the column\n * name. Only relevant for cross-space FK lowering — local FKs resolve column\n * names via the local `fieldToColumn` map.\n */\n readonly columnName?: string;\n};\n\nexport type ModelTokenRefs<\n ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n TSpaceId extends string = '<self>',\n> = {\n readonly [K in keyof Fields]: TargetFieldRef<ModelName, K & string, TSpaceId>;\n};\n\ntype ConstraintOptions<Name extends string | undefined = string | undefined> = {\n readonly name?: Name;\n};\n\nexport type IndexTypeMap = Record<string, { readonly options: unknown }>;\n\ntype IndexInput<\n Name extends string | undefined,\n IndexTypes extends IndexTypeMap,\n> = keyof IndexTypes extends never\n ? ConstraintOptions<Name>\n :\n | (ConstraintOptions<Name> & { readonly type?: never; readonly options?: never })\n | {\n readonly [K in keyof IndexTypes & string]: ConstraintOptions<Name> & {\n readonly type: K;\n readonly options: IndexTypes[K]['options'];\n };\n }[keyof IndexTypes & string];\n\ntype ForeignKeyOptions<Name extends string | undefined = string | undefined> =\n ConstraintOptions<Name> & {\n readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly constraint?: boolean;\n readonly index?: boolean;\n };\n\ntype BelongsToRelationSqlSpec<Name extends string | undefined = string | undefined> = {\n readonly fk?: ForeignKeyOptions<Name>;\n};\n\nexport type IdConstraint<\n FieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'id';\n readonly fields: FieldNames;\n readonly name?: Name;\n};\n\nexport type UniqueConstraint<FieldNames extends readonly string[] = readonly string[]> = {\n readonly kind: 'unique';\n readonly fields: FieldNames;\n readonly name?: string;\n};\n\nexport type IndexConstraint<\n FieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'index';\n readonly fields: FieldNames;\n readonly name?: Name;\n readonly type?: string;\n readonly options?: Record<string, unknown>;\n};\n\nexport type ForeignKeyConstraint<\n SourceFieldNames extends readonly string[] = readonly string[],\n TargetModelName extends string = string,\n TargetFieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'fk';\n readonly fields: SourceFieldNames;\n readonly targetModel: TargetModelName;\n readonly targetFields: TargetFieldNames;\n readonly targetSource?: TargetFieldRefSource;\n /**\n * Cross-space discriminator. When present, the FK target lives in a\n * different contract space identified by this value. Absent for local FKs.\n */\n readonly targetSpaceId?: string;\n /**\n * Namespace coordinate of the cross-space target model. Populated when\n * the target model handle carries a `namespace` (e.g. `auth` for supabase\n * `auth.User`). Absent for local FKs.\n */\n readonly targetNamespaceId?: string;\n /**\n * Table name of the cross-space target. Populated for cross-space FKs\n * so the lowering path doesn't need a local model lookup.\n */\n readonly targetTableName?: string;\n readonly name?: Name;\n readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly constraint?: boolean;\n readonly index?: boolean;\n};\n\nfunction normalizeFieldRefInput(input: ColumnRef | readonly ColumnRef[]): readonly string[] {\n return (Array.isArray(input) ? input : [input]).map((ref) => ref.fieldName);\n}\n\nfunction normalizeTargetFieldRefInput(input: TargetFieldRef | readonly TargetFieldRef[]): {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly source: TargetFieldRefSource;\n readonly spaceId: string | undefined;\n readonly namespaceId: string | undefined;\n readonly tableName: string | undefined;\n} {\n const refs = Array.isArray(input) ? input : [input];\n const [first] = refs;\n if (!first) {\n throw new Error('Expected at least one target ref');\n }\n if (refs.some((ref) => ref.modelName !== first.modelName)) {\n throw new Error('All target refs in a foreign key must point to the same model');\n }\n // F-compound: all refs in a compound FK must share the same cross-space coordinate.\n // A mismatch in spaceId, namespaceId, or tableName means the refs come from\n // different spaces despite having the same modelName — an impossible FK.\n if (refs.some((ref) => ref.spaceId !== first.spaceId)) {\n throw new Error(\n `All target refs in a compound foreign key must share the same spaceId (found mismatch: \"${first.spaceId ?? '<local>'}\" vs \"${refs.find((r) => r.spaceId !== first.spaceId)?.spaceId ?? '<local>'}\")`,\n );\n }\n if (refs.some((ref) => ref.namespaceId !== first.namespaceId)) {\n throw new Error(\n 'All target refs in a compound foreign key must share the same namespaceId (found mismatch)',\n );\n }\n if (refs.some((ref) => ref.tableName !== first.tableName)) {\n throw new Error(\n 'All target refs in a compound foreign key must share the same tableName (found mismatch)',\n );\n }\n return {\n modelName: first.modelName,\n // F-col: for cross-space refs, prefer the physical column name (columnName) over\n // the logical field name. Local refs have no columnName and use fieldName directly.\n fieldNames: refs.map((ref) => ref.columnName ?? ref.fieldName),\n source: refs.some((ref) => ref.source === 'string') ? 'string' : 'token',\n spaceId: first.spaceId,\n namespaceId: first.namespaceId,\n tableName: first.tableName,\n };\n}\n\nfunction createConstraintsDsl<IndexTypes extends IndexTypeMap = Record<never, never>>() {\n function ref<ModelName extends string, FieldName extends string>(\n modelName: ModelName,\n fieldName: FieldName,\n ): TargetFieldRef<ModelName, FieldName> {\n return {\n kind: 'targetFieldRef',\n source: 'string',\n modelName,\n fieldName,\n };\n }\n\n function id<FieldName extends string, Name extends string | undefined = undefined>(\n field: ColumnRef<FieldName>,\n options?: NamedConstraintSpec<Name>,\n ): IdConstraint<readonly [FieldName], Name>;\n function id<FieldNames extends readonly string[], Name extends string | undefined = undefined>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: NamedConstraintSpec<Name>,\n ): IdConstraint<FieldNames, Name>;\n function id(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n options?: NamedConstraintSpec,\n ): IdConstraint {\n return {\n kind: 'id',\n fields: normalizeFieldRefInput(fieldOrFields),\n ...(options?.name ? { name: options.name } : {}),\n };\n }\n\n function unique<FieldName extends string>(\n field: ColumnRef<FieldName>,\n options?: ConstraintOptions,\n ): UniqueConstraint<readonly [FieldName]>;\n function unique<FieldNames extends readonly string[]>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: ConstraintOptions,\n ): UniqueConstraint<FieldNames>;\n function unique(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n options?: ConstraintOptions,\n ): UniqueConstraint {\n return {\n kind: 'unique',\n fields: normalizeFieldRefInput(fieldOrFields),\n ...(options?.name ? { name: options.name } : {}),\n };\n }\n\n function index<FieldNames extends readonly string[], Name extends string | undefined = undefined>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: IndexInput<Name, IndexTypes>,\n ): IndexConstraint<FieldNames, Name>;\n function index(\n fields: readonly ColumnRef[],\n options?: {\n readonly name?: string;\n readonly type?: string;\n readonly options?: unknown;\n },\n ): IndexConstraint {\n return {\n kind: 'index',\n fields: normalizeFieldRefInput(fields),\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.type !== undefined ? { type: options.type } : {}),\n ...(options?.options !== undefined\n ? { options: options.options as Record<string, unknown> }\n : {}),\n };\n }\n\n function foreignKey<\n SourceFieldName extends string,\n TargetModelName extends string,\n TargetFieldName extends string,\n Name extends string | undefined = undefined,\n >(\n field: ColumnRef<SourceFieldName>,\n target: TargetFieldRef<TargetModelName, TargetFieldName>,\n options?: ForeignKeyOptions<Name>,\n ): ForeignKeyConstraint<\n readonly [SourceFieldName],\n TargetModelName,\n readonly [TargetFieldName],\n Name\n >;\n function foreignKey<\n SourceFieldNames extends readonly string[],\n TargetModelName extends string,\n TargetFieldNames extends readonly string[],\n Name extends string | undefined = undefined,\n >(\n fields: { readonly [K in keyof SourceFieldNames]: ColumnRef<SourceFieldNames[K] & string> },\n target: {\n readonly [K in keyof TargetFieldNames]: TargetFieldRef<\n TargetModelName,\n TargetFieldNames[K] & string\n >;\n },\n options?: ForeignKeyOptions<Name>,\n ): ForeignKeyConstraint<SourceFieldNames, TargetModelName, TargetFieldNames, Name>;\n function foreignKey(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n target: TargetFieldRef | readonly TargetFieldRef[],\n options?: ForeignKeyOptions,\n ): ForeignKeyConstraint {\n const normalizedTarget = normalizeTargetFieldRefInput(target);\n return {\n kind: 'fk',\n fields: normalizeFieldRefInput(fieldOrFields),\n targetModel: normalizedTarget.modelName,\n targetFields: normalizedTarget.fieldNames,\n targetSource: normalizedTarget.source,\n ...(normalizedTarget.spaceId !== undefined\n ? { targetSpaceId: normalizedTarget.spaceId }\n : {}),\n ...(normalizedTarget.namespaceId !== undefined\n ? { targetNamespaceId: normalizedTarget.namespaceId }\n : {}),\n ...(normalizedTarget.tableName !== undefined\n ? { targetTableName: normalizedTarget.tableName }\n : {}),\n ...(options?.name ? { name: options.name } : {}),\n ...(options?.onDelete ? { onDelete: options.onDelete } : {}),\n ...(options?.onUpdate ? { onUpdate: options.onUpdate } : {}),\n ...(options?.constraint !== undefined ? { constraint: options.constraint } : {}),\n ...(options?.index !== undefined ? { index: options.index } : {}),\n };\n }\n\n return {\n ref,\n id,\n unique,\n index,\n foreignKey,\n };\n}\n\nexport type ConstraintsDsl = ReturnType<typeof createConstraintsDsl>;\n\nexport type ModelAttributesSpec = {\n readonly id?: IdConstraint;\n readonly uniques?: readonly UniqueConstraint[];\n};\n\nexport type SqlStageSpec = {\n readonly table?: string;\n readonly control?: ControlPolicy;\n readonly indexes?: readonly IndexConstraint[];\n readonly foreignKeys?: readonly ForeignKeyConstraint[];\n};\n\ntype FieldRefs<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly [K in keyof Fields]: ColumnRef<K & string>;\n};\n\ntype AttributeContext<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly fields: FieldRefs<Fields>;\n readonly constraints: Pick<ConstraintsDsl, 'id' | 'unique'>;\n};\n\ntype PackAwareIndex<IndexTypes extends IndexTypeMap> = <\n FieldNames extends readonly string[],\n Name extends string | undefined = undefined,\n>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: IndexInput<Name, IndexTypes>,\n) => IndexConstraint<FieldNames, Name>;\n\ntype PackAwareSqlConstraints<IndexTypes extends IndexTypeMap> = {\n readonly foreignKey: ConstraintsDsl['foreignKey'];\n readonly ref: ConstraintsDsl['ref'];\n readonly index: PackAwareIndex<IndexTypes>;\n};\n\nexport type SqlContext<\n Fields extends Record<string, ScalarFieldBuilder>,\n IndexTypes extends IndexTypeMap = Record<never, never>,\n> = {\n readonly cols: FieldRefs<Fields>;\n readonly constraints: PackAwareSqlConstraints<IndexTypes>;\n};\n\nfunction createFieldRefs<Fields extends Record<string, ScalarFieldBuilder>>(\n fields: Fields,\n): FieldRefs<Fields> {\n const refs = {} as Record<string, ColumnRef>;\n for (const fieldName of Object.keys(fields)) {\n refs[fieldName] = { kind: 'columnRef', fieldName };\n }\n return refs as FieldRefs<Fields>;\n}\n\nfunction createModelTokenRefs<\n ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n TSpaceId extends string = '<self>',\n>(\n modelName: ModelName,\n fields: Fields,\n crossSpaceCoordinate?: {\n readonly spaceId: TSpaceId;\n readonly namespaceId?: string;\n readonly tableName?: string;\n },\n): ModelTokenRefs<ModelName, Fields, TSpaceId> {\n const refs = {} as Record<string, TargetFieldRef>;\n for (const [fieldName, fieldBuilder] of Object.entries(fields)) {\n const physicalColumn =\n crossSpaceCoordinate !== undefined ? fieldBuilder.physicalColumnName : undefined;\n refs[fieldName] = {\n kind: 'targetFieldRef',\n source: 'token',\n modelName,\n fieldName,\n ...(crossSpaceCoordinate !== undefined\n ? {\n spaceId: crossSpaceCoordinate.spaceId,\n ...(crossSpaceCoordinate.namespaceId !== undefined\n ? { namespaceId: crossSpaceCoordinate.namespaceId }\n : {}),\n ...(crossSpaceCoordinate.tableName !== undefined\n ? { tableName: crossSpaceCoordinate.tableName }\n : {}),\n ...(physicalColumn !== undefined ? { columnName: physicalColumn } : {}),\n }\n : {}),\n };\n }\n return refs as ModelTokenRefs<ModelName, Fields, TSpaceId>;\n}\n\ntype StageInput<Context, Spec> = Spec | ((context: Context) => Spec);\n\nfunction buildStageSpec<Context, Spec>(\n stageInput: StageInput<Context, Spec>,\n context: Context,\n): Spec {\n if (typeof stageInput === 'function') {\n return (stageInput as (context: Context) => Spec)(context);\n }\n return stageInput;\n}\n\nfunction createAttributeConstraintsDsl(): AttributeContext<\n Record<string, ScalarFieldBuilder>\n>['constraints'] {\n const constraints = createConstraintsDsl();\n return {\n id: constraints.id,\n unique: constraints.unique,\n };\n}\n\nfunction createSqlConstraintsDsl<\n IndexTypes extends IndexTypeMap = Record<never, never>,\n>(): SqlContext<Record<string, ScalarFieldBuilder>, IndexTypes>['constraints'] {\n const constraints = createConstraintsDsl<IndexTypes>();\n return {\n index: constraints.index,\n foreignKey: constraints.foreignKey,\n ref: constraints.ref,\n };\n}\n\nfunction createColumnRefs<Fields extends Record<string, ScalarFieldBuilder>>(\n fields: Fields,\n): SqlContext<Fields>['cols'] {\n return createFieldRefs(fields);\n}\n\ntype StaticLiteralName<Name> = Name extends string ? (string extends Name ? never : Name) : never;\n\ntype NamedConstraintLiteralName<Constraint> = Constraint extends { readonly name?: infer Name }\n ? StaticLiteralName<Name>\n : never;\n\ntype DuplicateLiteralNames<\n Items extends readonly unknown[],\n Seen extends string = never,\n Duplicates extends string = never,\n> = Items extends readonly [infer First, ...infer Rest extends readonly unknown[]]\n ? NamedConstraintLiteralName<First> extends infer Name extends string\n ? Name extends Seen\n ? DuplicateLiteralNames<Rest, Seen, Duplicates | Name>\n : DuplicateLiteralNames<Rest, Seen | Name, Duplicates>\n : DuplicateLiteralNames<Rest, Seen, Duplicates>\n : Duplicates;\n\ntype InlineIdLiteralName<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly [FieldName in keyof Fields]: FieldStateOf<Fields[FieldName]> extends {\n readonly id: { readonly name?: infer Name };\n }\n ? StaticLiteralName<Name>\n : never;\n}[keyof Fields];\n\ntype AttributeIdLiteralName<AttributesSpec extends ModelAttributesSpec | undefined> =\n AttributesSpec extends {\n readonly id?: { readonly name?: infer Name };\n }\n ? StaticLiteralName<Name>\n : never;\n\ntype ModelIdLiteralName<\n Fields extends Record<string, ScalarFieldBuilder>,\n AttributesSpec extends ModelAttributesSpec | undefined,\n> = [AttributeIdLiteralName<AttributesSpec>] extends [never]\n ? InlineIdLiteralName<Fields>\n : AttributeIdLiteralName<AttributesSpec>;\n\ntype SqlIndexes<SqlSpec extends SqlStageSpec> = SqlSpec extends {\n readonly indexes?: infer Indexes extends readonly unknown[];\n}\n ? Indexes\n : readonly [];\n\ntype SqlForeignKeys<SqlSpec extends SqlStageSpec> = SqlSpec extends {\n readonly foreignKeys?: infer ForeignKeys extends readonly unknown[];\n}\n ? ForeignKeys\n : readonly [];\n\ntype SqlNamedObjects<SqlSpec extends SqlStageSpec> = [\n ...SqlIndexes<SqlSpec>,\n ...SqlForeignKeys<SqlSpec>,\n];\n\ntype ValidateSqlStageSpec<\n Fields extends Record<string, ScalarFieldBuilder>,\n AttributesSpec extends ModelAttributesSpec | undefined,\n SqlSpec extends SqlStageSpec,\n> = [DuplicateLiteralNames<SqlNamedObjects<SqlSpec>>] extends [never]\n ? [\n Extract<\n ModelIdLiteralName<Fields, AttributesSpec>,\n NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>\n >,\n ] extends [never]\n ? SqlSpec\n : never\n : never;\n\ntype ValidateAttributesStageSpec<\n Fields extends Record<string, ScalarFieldBuilder>,\n SqlSpec extends SqlStageSpec | undefined,\n AttributesSpec extends ModelAttributesSpec,\n> = SqlSpec extends SqlStageSpec\n ? [\n Extract<\n ModelIdLiteralName<Fields, AttributesSpec>,\n NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>\n >,\n ] extends [never]\n ? AttributesSpec\n : never\n : AttributesSpec;\n\nfunction findDuplicateRelationName(\n existingRelations: Record<string, AnyRelationBuilder>,\n nextRelations: Record<string, AnyRelationBuilder>,\n): string | undefined {\n return Object.keys(nextRelations).find((relationName) =>\n Object.hasOwn(existingRelations, relationName),\n );\n}\n\nexport class ContractModelBuilder<\n ModelName extends string | undefined,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n AttributesSpec extends ModelAttributesSpec | undefined = undefined,\n SqlSpec extends SqlStageSpec | undefined = undefined,\n IndexTypes extends IndexTypeMap = Record<never, never>,\n TSpaceId extends string = '<self>',\n> {\n declare readonly __name: ModelName;\n declare readonly __fields: Fields;\n declare readonly __relations: Relations;\n declare readonly __attributes: AttributesSpec;\n declare readonly __sql: SqlSpec;\n declare readonly __indexTypes: IndexTypes;\n declare readonly __spaceId: TSpaceId;\n readonly refs: ModelName extends string ? ModelTokenRefs<ModelName, Fields, TSpaceId> : never;\n\n constructor(\n readonly stageOne: {\n readonly modelName?: ModelName;\n readonly namespace?: string;\n readonly fields: Fields;\n readonly relations: Relations;\n },\n readonly attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec>,\n readonly sqlFactory?: StageInput<SqlContext<Fields, IndexTypes>, SqlSpec>,\n readonly spaceId?: TSpaceId,\n readonly tableName?: string,\n ) {\n const crossSpaceCoordinate =\n spaceId !== undefined\n ? {\n spaceId,\n ...(stageOne.namespace !== undefined ? { namespaceId: stageOne.namespace } : {}),\n ...(tableName !== undefined ? { tableName } : {}),\n }\n : undefined;\n this.refs = blindCast<\n ModelName extends string ? ModelTokenRefs<ModelName, Fields, TSpaceId> : never,\n 'conditional generic: stageOne.modelName presence matches ModelName extends string'\n >(\n stageOne.modelName\n ? createModelTokenRefs(stageOne.modelName, stageOne.fields, crossSpaceCoordinate)\n : undefined,\n );\n }\n\n ref<FieldName extends keyof Fields & string>(\n this: ModelName extends string\n ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, SqlSpec, IndexTypes>\n : never,\n fieldName: FieldName,\n ): TargetFieldRef<ModelName & string, FieldName> {\n const modelName = this.stageOne.modelName;\n if (!modelName) {\n throw new Error('Model tokens require model(\"ModelName\", ...) before calling .ref(...)');\n }\n\n return {\n kind: 'targetFieldRef',\n source: 'token',\n modelName,\n fieldName,\n } as TargetFieldRef<ModelName & string, FieldName>;\n }\n\n relations<const NextRelations extends Record<string, AnyRelationBuilder>>(\n relations: NextRelations,\n ): ContractModelBuilder<\n ModelName,\n Fields,\n Relations & NextRelations,\n AttributesSpec,\n SqlSpec,\n IndexTypes,\n TSpaceId\n > {\n const duplicateRelationName = findDuplicateRelationName(this.stageOne.relations, relations);\n if (duplicateRelationName) {\n throw new Error(\n `Model \"${this.stageOne.modelName ?? '<anonymous>'}\" already defines relation \"${duplicateRelationName}\".`,\n );\n }\n\n return new ContractModelBuilder(\n {\n ...this.stageOne,\n relations: {\n ...this.stageOne.relations,\n ...relations,\n } as Relations & NextRelations,\n },\n this.attributesFactory,\n this.sqlFactory,\n this.spaceId,\n this.tableName,\n );\n }\n\n attributes<const NextAttributesSpec extends ModelAttributesSpec>(\n specOrFactory: StageInput<\n AttributeContext<Fields>,\n ValidateAttributesStageSpec<Fields, SqlSpec, NextAttributesSpec>\n >,\n ): ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n NextAttributesSpec,\n SqlSpec,\n IndexTypes,\n TSpaceId\n > {\n return new ContractModelBuilder(\n this.stageOne,\n specOrFactory,\n this.sqlFactory,\n this.spaceId,\n this.tableName,\n );\n }\n\n sql<const NextSqlSpec extends SqlStageSpec>(\n specOrFactory: StageInput<SqlContext<Fields, IndexTypes>, NextSqlSpec>,\n ): [ValidateSqlStageSpec<Fields, AttributesSpec, NextSqlSpec>] extends [never]\n ? ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n AttributesSpec,\n never,\n IndexTypes,\n TSpaceId\n >\n : ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n AttributesSpec,\n NextSqlSpec,\n IndexTypes,\n TSpaceId\n > {\n // Conditional return type cannot be verified by the implementation; the runtime value is always a valid ContractModelBuilder regardless of the validation outcome (validation is type-level only).\n // When specOrFactory is a static object (not a function), extract tableName for the cross-space coordinate.\n const nextTableName =\n typeof specOrFactory !== 'function' ? specOrFactory.table : this.tableName;\n return blindCast<\n never,\n 'conditional return type; runtime value is always a valid ContractModelBuilder'\n >(\n new ContractModelBuilder(\n this.stageOne,\n this.attributesFactory,\n specOrFactory,\n this.spaceId,\n nextTableName,\n ),\n );\n }\n\n buildAttributesSpec(): AttributesSpec {\n if (!this.attributesFactory) {\n return undefined as AttributesSpec;\n }\n\n return buildStageSpec(this.attributesFactory, {\n fields: createFieldRefs(this.stageOne.fields),\n constraints: createAttributeConstraintsDsl() as AttributeContext<Fields>['constraints'],\n });\n }\n\n buildSqlSpec(): SqlSpec {\n if (!this.sqlFactory) {\n return undefined as SqlSpec;\n }\n return buildStageSpec(this.sqlFactory, {\n cols: createColumnRefs(this.stageOne.fields),\n constraints: createSqlConstraintsDsl<IndexTypes>(),\n });\n }\n}\n\ntype NamedModelTokenShape<\n ModelName extends string = string,\n Fields extends Record<string, ScalarFieldBuilder> = Record<string, ScalarFieldBuilder>,\n> = {\n readonly stageOne: {\n readonly modelName?: ModelName;\n readonly fields: Fields;\n };\n};\n\ntype AnyNamedModelToken = NamedModelTokenShape<string, Record<string, ScalarFieldBuilder>>;\n\ntype LazyNamedModelToken<Token extends AnyNamedModelToken = AnyNamedModelToken> = () => Token;\n\ntype RelationFieldSelection<FieldName extends string> = FieldName | readonly FieldName[];\n\ntype RelationModelName<Target> =\n Target extends NamedModelTokenShape<\n infer ModelName extends string,\n Record<string, ScalarFieldBuilder>\n >\n ? ModelName\n : Target extends () => infer Token\n ? RelationModelName<Token>\n : never;\n\ntype RelationModelFieldNames<Target> =\n Target extends NamedModelTokenShape<string, infer Fields>\n ? keyof Fields & string\n : Target extends () => infer Token\n ? RelationModelFieldNames<Token>\n : never;\n\nfunction isLazyRelationModelName(value: unknown): value is LazyRelationModelName<string> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind?: unknown }).kind === 'lazyRelationModelName' &&\n 'resolve' in value &&\n typeof (value as { resolve?: unknown }).resolve === 'function'\n );\n}\n\nfunction resolveNamedModelTokenName(token: {\n readonly stageOne: {\n readonly modelName?: string | undefined;\n };\n}): string {\n const modelName = token.stageOne.modelName;\n if (!modelName) {\n throw new Error(\n 'Relation targets require named model tokens. Use model(\"ModelName\", ...) before passing a token to rel.*(...).',\n );\n }\n return modelName;\n}\n\nfunction normalizeRelationModelSource<Token extends AnyNamedModelToken>(\n target: Token | LazyNamedModelToken<Token>,\n): RelationModelSource<RelationModelName<Token>>;\nfunction normalizeRelationModelSource<ToModel extends string>(\n target: ToModel,\n): RelationModelSource<ToModel>;\nfunction normalizeRelationModelSource(\n target: string | AnyNamedModelToken | LazyNamedModelToken,\n): RelationModelSource<string>;\nfunction normalizeRelationModelSource(\n target: string | AnyNamedModelToken | LazyNamedModelToken,\n): RelationModelSource<string> {\n if (typeof target === 'string') {\n return {\n kind: 'relationModelName',\n source: 'string',\n modelName: target,\n };\n }\n\n if (typeof target === 'function') {\n return {\n kind: 'lazyRelationModelName',\n source: 'lazyToken',\n resolve: () => resolveNamedModelTokenName(target()),\n };\n }\n\n return {\n kind: 'relationModelName',\n source: 'token',\n modelName: resolveNamedModelTokenName(target),\n };\n}\n\nexport type ContractInput<\n Family extends FamilyPackRef<string> = FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string> = TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance> = Record<never, never>,\n Models extends Record<\n string,\n ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n > = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: NamingConfig;\n readonly storageHash?: string;\n readonly foreignKeyDefaults?: ForeignKeyDefaultsState;\n readonly defaultControlPolicy?: ControlPolicy;\n /**\n * Declared namespace coordinates the contract recognises. Per-model\n * `namespace` references must reference an entry in this list (or the\n * Postgres-specific late-binding keyword `unbound`). Reserved values:\n *\n * - `__unbound__` — IR sentinel for the late-binding slot.\n * - `__unspecified__` — parser-synthesised AST bucket for top-level\n * declarations (not a real namespace).\n * - `unbound` — Postgres-specific reserved keyword (the PSL surface\n * uses `namespace unbound { … }` to opt into late binding).\n *\n * SQLite contracts must declare an empty list (or omit the field) —\n * SQLite has no schema concept and emits unqualified DDL.\n *\n * Populates `SqlStorage.namespaces` together with the\n * {@link ContractInput.createNamespace} factory: each declared name\n * (plus the framework-reserved `UNBOUND_NAMESPACE_ID` sentinel) is\n * resolved through `createNamespace` and stored as the matching slot\n * value. Models reference declared namespaces via their per-model\n * `namespace` coordinate; entries that go unreferenced still occupy a\n * slot so contracts that pre-declare schemas surface them on the live\n * storage walk.\n */\n readonly namespaces?: readonly string[];\n /**\n * Target-supplied factory that materialises a `Namespace` concretion\n * for a declared namespace coordinate. The SQL family layer is\n * target-agnostic and cannot import concretions like\n * `PostgresSchema` or `SqliteUnboundDatabase`; the factory is the\n * seam by which target packs hand the family the right runtime\n * representation.\n *\n * Called once per distinct namespace id discovered in the contract:\n * each entry of {@link ContractInput.namespaces}, every\n * `StorageTable.namespaceId` referenced by a model, and the\n * framework `UNBOUND_NAMESPACE_ID` sentinel (always present so the\n * late-bound slot stays available regardless of authoring choices).\n *\n * When omitted, the family layer falls back to its placeholder\n * `SqlUnboundNamespace` singleton for the unbound slot and rejects\n * any non-unbound coordinate — single-namespace contracts authored\n * before targets ship their factory stay byte-stable; multi-namespace\n * contracts must pass the factory through.\n */\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n /**\n * Domain enum handles authored via `enumType()`. Each handle lowers to a\n * domain `enum` entry and a storage `valueSet` entry in the target's\n * default namespace. Fields reference the enum via `field.namedType(handle)`.\n */\n readonly enums?: Record<string, import('./enum-type').EnumTypeHandle>;\n};\n\nexport function model<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(\n modelName: ModelName,\n input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n): ContractModelBuilder<ModelName, Fields, Relations>;\n\nexport function model<\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n}): ContractModelBuilder<undefined, Fields, Relations>;\n\nexport function model<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(\n modelNameOrInput:\n | ModelName\n | {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n maybeInput?: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n): ContractModelBuilder<ModelName | undefined, Fields, Relations> {\n const input = typeof modelNameOrInput === 'string' ? maybeInput : modelNameOrInput;\n\n if (!input) {\n throw new Error('model(\"ModelName\", ...) requires a model definition.');\n }\n\n return new ContractModelBuilder({\n ...(typeof modelNameOrInput === 'string' ? { modelName: modelNameOrInput } : {}),\n ...(input.namespace !== undefined ? { namespace: input.namespace } : {}),\n fields: input.fields,\n relations: (input.relations ?? {}) as Relations,\n });\n}\n\n/**\n * Factory for building a standalone branded extension model handle.\n *\n * Use this instead of `new ContractModelBuilder(…)` when constructing handles\n * for models that live in a foreign contract space (e.g. a Supabase extension\n * model referenced by a user's contract). The `spaceId` brands the returned\n * handle so `refs.<field>.spaceId` carries the foreign space identifier.\n *\n * @param name - The domain model name as declared in the foreign contract\n * (e.g. `'AuthUser'`, not a bare table alias like `'User'`).\n * @param input.namespace - The namespace within the foreign space (e.g. `'auth'`).\n * @param input.fields - Field definitions (use `field.column(…)`).\n * @param input.table - The physical table name in the foreign schema.\n * @param spaceId - The extension space identifier (e.g. `'supabase'`).\n */\nexport function extensionModel<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n const TSpaceId extends string,\n>(\n name: ModelName,\n input: {\n readonly namespace: string;\n readonly fields: Fields;\n readonly table: string;\n },\n spaceId: TSpaceId,\n): ContractModelBuilder<\n ModelName,\n Fields,\n Record<never, never>,\n undefined,\n undefined,\n Record<never, never>,\n TSpaceId\n> {\n const builder = new ContractModelBuilder<\n ModelName,\n Fields,\n Record<never, never>,\n undefined,\n undefined,\n Record<never, never>,\n TSpaceId\n >(\n { modelName: name, namespace: input.namespace, fields: input.fields, relations: {} },\n undefined,\n undefined,\n spaceId,\n input.table,\n );\n return builder;\n}\n\n/**\n * Narrow shape for detecting a cross-space branded model handle at runtime.\n * `ContractModelBuilder` exposes these fields but `AnyNamedModelToken` does\n * not declare them; this guard bridges the gap without a bare cast.\n */\ntype CrossSpaceHandle = {\n readonly spaceId: string;\n readonly tableName?: string;\n readonly stageOne: { readonly namespace?: string };\n};\n\nfunction isCrossSpaceHandle(value: unknown): value is CrossSpaceHandle {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const rec = blindCast<\n Record<PropertyKey, unknown>,\n 'object null-check above; property access needed for runtime shape detection'\n >(value);\n return (\n typeof rec['spaceId'] === 'string' &&\n typeof rec['stageOne'] === 'object' &&\n rec['stageOne'] !== null\n );\n}\n\nfunction belongsTo<\n Token extends AnyNamedModelToken,\n FromField extends string | readonly string[],\n ToField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly from: FromField; readonly to: ToField },\n): RelationBuilder<BelongsToRelation<RelationModelName<Token>, FromField, ToField>>;\nfunction belongsTo<\n ToModel extends string,\n FromField extends string | readonly string[],\n ToField extends string | readonly string[],\n>(\n toModel: ToModel,\n options: { readonly from: FromField; readonly to: ToField },\n): RelationBuilder<BelongsToRelation<ToModel, FromField, ToField>>;\nfunction belongsTo(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: {\n readonly from: string | readonly string[];\n readonly to: string | readonly string[];\n },\n): RelationBuilder<BelongsToRelation> {\n // F-lazy: when the model is a lazy thunk (() => handle), resolve it before\n // the brand check so cross-space handles passed as lazy tokens are detected.\n // normalizeRelationModelSource still receives the original toModel (which\n // handles both lazy and non-lazy forms correctly for model-name resolution).\n const resolvedModel = typeof toModel === 'function' ? toModel() : toModel;\n\n // Extract cross-space brand from the handle when it carries a spaceId.\n // ContractModelBuilder exposes spaceId/tableName at runtime even though\n // the AnyNamedModelToken interface does not declare them.\n const crossSpaceCoordinate = isCrossSpaceHandle(resolvedModel)\n ? {\n spaceId: resolvedModel.spaceId,\n ...(resolvedModel.tableName !== undefined ? { tableName: resolvedModel.tableName } : {}),\n ...(resolvedModel.stageOne.namespace !== undefined\n ? { namespaceId: resolvedModel.stageOne.namespace }\n : {}),\n }\n : undefined;\n\n return new RelationBuilder({\n kind: 'belongsTo',\n toModel: normalizeRelationModelSource(toModel),\n from: options.from,\n to: options.to,\n ...(crossSpaceCoordinate !== undefined ? crossSpaceCoordinate : {}),\n });\n}\n\nfunction hasMany<\n Token extends AnyNamedModelToken,\n ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly by: ByField },\n): RelationBuilder<HasManyRelation<RelationModelName<Token>, ByField>>;\nfunction hasMany<ToModel extends string, ByField extends string | readonly string[]>(\n toModel: ToModel,\n options: { readonly by: ByField },\n): RelationBuilder<HasManyRelation<ToModel, ByField>>;\nfunction hasMany(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: { readonly by: string | readonly string[] },\n): RelationBuilder<HasManyRelation> {\n return new RelationBuilder({\n kind: 'hasMany',\n toModel: normalizeRelationModelSource(toModel),\n by: options.by,\n });\n}\n\nfunction hasOne<\n Token extends AnyNamedModelToken,\n ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly by: ByField },\n): RelationBuilder<HasOneRelation<RelationModelName<Token>, ByField>>;\nfunction hasOne<ToModel extends string, ByField extends string | readonly string[]>(\n toModel: ToModel,\n options: { readonly by: ByField },\n): RelationBuilder<HasOneRelation<ToModel, ByField>>;\nfunction hasOne(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: { readonly by: string | readonly string[] },\n): RelationBuilder<HasOneRelation> {\n return new RelationBuilder({\n kind: 'hasOne',\n toModel: normalizeRelationModelSource(toModel),\n by: options.by,\n });\n}\n\nfunction manyToMany<\n ToToken extends AnyNamedModelToken,\n ThroughToken extends AnyNamedModelToken,\n FromField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>,\n ToField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>,\n>(\n toModel: ToToken | LazyNamedModelToken<ToToken>,\n options: {\n readonly through: ThroughToken | LazyNamedModelToken<ThroughToken>;\n readonly from: FromField;\n readonly to: ToField;\n },\n): RelationBuilder<\n ManyToManyRelation<\n RelationModelName<ToToken>,\n RelationModelName<ThroughToken>,\n FromField,\n ToField\n >\n>;\nfunction manyToMany<\n ToModel extends string,\n ThroughModel extends string,\n FromField extends string | readonly string[],\n ToField extends string | readonly string[],\n>(\n toModel: ToModel,\n options: {\n readonly through: ThroughModel;\n readonly from: FromField;\n readonly to: ToField;\n },\n): RelationBuilder<ManyToManyRelation<ToModel, ThroughModel, FromField, ToField>>;\nfunction manyToMany(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: {\n readonly through: string | AnyNamedModelToken | LazyNamedModelToken;\n readonly from: string | readonly string[];\n readonly to: string | readonly string[];\n },\n): RelationBuilder<ManyToManyRelation> {\n return new RelationBuilder({\n kind: 'manyToMany',\n toModel: normalizeRelationModelSource(toModel),\n through: normalizeRelationModelSource(options.through),\n from: options.from,\n to: options.to,\n });\n}\n\nexport const rel = {\n belongsTo,\n hasMany,\n hasOne,\n manyToMany,\n};\n\nexport const field = {\n column: columnField,\n generated: generatedField,\n namedType: namedTypeField,\n};\n\nexport function isContractInput(value: unknown): value is ContractInput {\n if (typeof value !== 'object' || value === null || !('target' in value) || !('family' in value)) {\n return false;\n }\n const target = (value as { target: unknown }).target;\n const family = (value as { family: unknown }).family;\n return (\n typeof target === 'object' &&\n target !== null &&\n 'kind' in target &&\n target.kind === 'target' &&\n typeof family === 'object' &&\n family !== null &&\n 'kind' in family &&\n family.kind === 'family'\n );\n}\n\nfunction isRelationFieldArray(value: string | readonly string[]): value is readonly string[] {\n return Array.isArray(value);\n}\n\nexport function normalizeRelationFieldNames(value: string | readonly string[]): readonly string[] {\n if (isRelationFieldArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function resolveRelationModelName(value: RelationModelSource<string>): string {\n if (isLazyRelationModelName(value)) {\n return value.resolve();\n }\n return value.modelName;\n}\n\nexport function applyNaming(name: string, strategy: NamingStrategy | undefined): string {\n if (!strategy || strategy === 'identity') {\n return name;\n }\n\n let result = '';\n for (let index = 0; index < name.length; index += 1) {\n const char = name[index];\n if (!char) continue;\n const lower = char.toLowerCase();\n const isUpper = char !== lower;\n if (isUpper && index > 0) {\n const prev = name[index - 1];\n const next = name[index + 1];\n const prevIsLower = !!prev && prev === prev.toLowerCase();\n const nextIsLower = !!next && next === next.toLowerCase();\n if (prevIsLower || nextIsLower) {\n result += '_';\n }\n }\n result += lower;\n }\n return result;\n}\n\nexport type FieldStateOf<T> = T extends ScalarFieldBuilder<infer State> ? State : never;\nexport type RelationStateOf<T> = T extends RelationBuilder<infer State> ? State : never;\n\nexport type ModelFieldsOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n infer Fields,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n ? Fields\n : never;\n\nexport type ModelRelationsOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n infer Relations,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n ? Relations\n : never;\n\nexport type ModelAttributesOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n infer AttributesSpec,\n SqlStageSpec | undefined\n >\n ? AttributesSpec\n : undefined;\n\nexport type ModelSqlOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n infer SqlSpec\n >\n ? SqlSpec\n : undefined;\n\nexport type IdFieldNames<T> =\n T extends IdConstraint<infer FieldNames> ? FieldNames : readonly string[];\n\nexport type AttributeStageIdFieldNames<T> = T extends { readonly id?: infer I }\n ? I extends IdConstraint\n ? IdFieldNames<I>\n : undefined\n : undefined;\n","import {\n createEntityHelpersFromNamespace,\n type EntityHelpersFromNamespace,\n type ExtractAuthoringNamespaceFromPack,\n type MergeExtensionAuthoringNamespaces,\n} from '@prisma-next/contract-authoring';\nimport type {\n AuthoringArgumentDescriptor,\n AuthoringEntityTypeNamespace,\n AuthoringFieldNamespace,\n AuthoringTypeConstructorDescriptor,\n AuthoringTypeNamespace,\n} from '@prisma-next/framework-components/authoring';\nimport {\n assertNoCrossRegistryCollisions,\n isAuthoringEntityTypeDescriptor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n mergeAuthoringNamespaces,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport {\n createFieldHelpersFromNamespace,\n createFieldPresetHelper,\n createTypeHelpersFromNamespace,\n} from './authoring-helper-runtime';\nimport type {\n FieldHelpersFromNamespace,\n ResolveTemplateValue,\n TupleFromArgumentDescriptors,\n} from './authoring-type-utils';\nimport type {\n AnyRelationBuilder,\n ContractModelBuilder,\n IndexTypeMap,\n ScalarFieldBuilder,\n} from './contract-dsl';\nimport { buildFieldPreset, field, model, rel } from './contract-dsl';\nimport type { MergeExtensionIndexTypes } from './contract-types';\n\ntype ExtractTypeNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'type',\n Record<never, never>\n>;\ntype ExtractFieldNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'field',\n Record<never, never>\n>;\ntype ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'entityTypes',\n Record<never, never>\n>;\n\ntype MergeExtensionTypeNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'type'\n>;\ntype MergeExtensionFieldNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'field'\n>;\ntype MergeExtensionEntityNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'entityTypes'\n>;\n\ntype StorageTypeFromDescriptor<\n Descriptor extends AuthoringTypeConstructorDescriptor,\n Args extends readonly unknown[],\n> = {\n readonly kind: 'codec-instance';\n readonly codecId: ResolveTemplateValue<Descriptor['output']['codecId'], Args>;\n readonly nativeType: ResolveTemplateValue<Descriptor['output']['nativeType'], Args>;\n} & (Descriptor['output'] extends {\n readonly typeParams: infer TypeParams extends Record<string, unknown>;\n}\n ? {\n readonly typeParams: ResolveTemplateValue<TypeParams, Args>;\n }\n : { readonly typeParams: Record<never, never> });\n\ntype TypeHelperFunction<Descriptor extends AuthoringTypeConstructorDescriptor> =\n Descriptor extends { readonly args: infer Args extends readonly AuthoringArgumentDescriptor[] }\n ? <const Params extends TupleFromArgumentDescriptors<Args>>(\n ...args: Params\n ) => StorageTypeFromDescriptor<Descriptor, Params>\n : () => StorageTypeFromDescriptor<Descriptor, readonly []>;\n\ntype TypeHelpersFromNamespace<Namespace> = {\n readonly [K in keyof Namespace]: Namespace[K] extends AuthoringTypeConstructorDescriptor\n ? TypeHelperFunction<Namespace[K]>\n : Namespace[K] extends Record<string, unknown>\n ? TypeHelpersFromNamespace<Namespace[K]>\n : never;\n};\n\ntype CoreFieldHelpers = Pick<typeof field, 'column' | 'generated' | 'namedType'>;\n\ntype MergeAllPackIndexTypes<Family, Target, ExtensionPacks> = MergeExtensionIndexTypes<\n { readonly __family: Family; readonly __target: Target } & (ExtensionPacks extends Record<\n string,\n unknown\n >\n ? ExtensionPacks\n : Record<never, never>)\n>;\n\ntype PackAwareModel<IndexTypes extends IndexTypeMap> = {\n <\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n >(\n modelName: ModelName,\n input: { readonly fields: Fields; readonly relations?: Relations; readonly namespace?: string },\n ): ContractModelBuilder<ModelName, Fields, Relations, undefined, undefined, IndexTypes>;\n <\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n >(input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n }): ContractModelBuilder<undefined, Fields, Relations, undefined, undefined, IndexTypes>;\n};\n\nexport type ComposedAuthoringHelpers<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n> = EntityHelpersFromNamespace<\n ExtractEntitiesNamespaceFromPack<Family> &\n ExtractEntitiesNamespaceFromPack<Target> &\n MergeExtensionEntityNamespaces<ExtensionPacks>\n> & {\n readonly field: CoreFieldHelpers &\n FieldHelpersFromNamespace<\n ExtractFieldNamespaceFromPack<Family> &\n ExtractFieldNamespaceFromPack<Target> &\n MergeExtensionFieldNamespaces<ExtensionPacks>\n >;\n readonly model: PackAwareModel<MergeAllPackIndexTypes<Family, Target, ExtensionPacks>>;\n readonly rel: typeof rel;\n readonly type: TypeHelpersFromNamespace<\n ExtractTypeNamespaceFromPack<Family> &\n ExtractTypeNamespaceFromPack<Target> &\n MergeExtensionTypeNamespaces<ExtensionPacks>\n >;\n};\n\nfunction extractTypeNamespace<Pack>(pack: Pack): ExtractTypeNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly type?: unknown } }).authoring?.type ??\n {}) as ExtractTypeNamespaceFromPack<Pack>;\n}\n\nfunction extractFieldNamespace<Pack>(pack: Pack): ExtractFieldNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly field?: unknown } }).authoring?.field ??\n {}) as ExtractFieldNamespaceFromPack<Pack>;\n}\n\nfunction extractEntitiesNamespace<Pack>(pack: Pack): ExtractEntitiesNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly entityTypes?: unknown } }).authoring\n ?.entityTypes ?? {}) as ExtractEntitiesNamespaceFromPack<Pack>;\n}\n\ntype AuthoringComponent = {\n readonly authoring?: {\n readonly type?: unknown;\n readonly field?: unknown;\n readonly entityTypes?: unknown;\n };\n};\n\nfunction composeTypeNamespace(components: readonly AuthoringComponent[]): AuthoringTypeNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractTypeNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringTypeConstructorDescriptor, 'type');\n }\n }\n return merged as AuthoringTypeNamespace;\n}\n\nfunction composeFieldNamespace(components: readonly AuthoringComponent[]): AuthoringFieldNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractFieldNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringFieldPresetDescriptor, 'field');\n }\n }\n return merged as AuthoringFieldNamespace;\n}\n\nfunction composeEntityNamespace(\n components: readonly AuthoringComponent[],\n): AuthoringEntityTypeNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractEntitiesNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringEntityTypeDescriptor, 'entity');\n }\n }\n return merged as AuthoringEntityTypeNamespace;\n}\n\n/**\n * Reserved top-level keys on the composed helpers surface — the\n * built-in `model` / `rel` helpers, the `field` / `type` namespace\n * objects. Pack-contributed entity types are flattened to the same\n * top-level shape (e.g. `helpers.enum({...})`), so a pack cannot\n * contribute an entity type whose name collides with one of these\n * reserved keys without silently overwriting at runtime. Detect the\n * collision at compose time and fail loudly with a guidance message.\n */\nconst RESERVED_HELPER_KEYS: readonly string[] = ['field', 'model', 'rel', 'type'];\n\nfunction assertNoBuiltInEntityCollisions(namespace: AuthoringEntityTypeNamespace): void {\n const collisions = Object.keys(namespace).filter((name) => RESERVED_HELPER_KEYS.includes(name));\n if (collisions.length > 0) {\n throw new Error(\n `Pack-contributed entity type(s) ${collisions.map((c) => `\"${c}\"`).join(', ')} collide with the reserved built-in helper key(s) on the composed helpers surface. Reserved keys: ${RESERVED_HELPER_KEYS.map((k) => `\"${k}\"`).join(', ')}.`,\n );\n }\n}\n\nfunction createComposedFieldHelpers(\n fieldNamespace: AuthoringFieldNamespace,\n): CoreFieldHelpers & Record<string, unknown> {\n const helperNamespace = createFieldHelpersFromNamespace(\n fieldNamespace,\n ({ helperPath, descriptor }) =>\n createFieldPresetHelper({\n helperPath,\n descriptor,\n build: ({ args, namedConstraintOptions }) =>\n buildFieldPreset(descriptor, args, namedConstraintOptions),\n }),\n );\n const coreFieldHelpers = {\n column: field.column,\n generated: field.generated,\n namedType: field.namedType,\n } satisfies CoreFieldHelpers;\n\n const coreHelperNames = new Set(Object.keys(coreFieldHelpers));\n for (const helperName of Object.keys(helperNamespace)) {\n if (coreHelperNames.has(helperName)) {\n throw new Error(\n `Duplicate authoring field helper \"${helperName}\". Core field helpers reserve that name.`,\n );\n }\n }\n\n return {\n ...coreFieldHelpers,\n ...helperNamespace,\n };\n}\n\nexport function createComposedAuthoringHelpers<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n>(options: {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n}): ComposedAuthoringHelpers<Family, Target, ExtensionPacks> {\n const extensionValues: readonly ExtensionPackRef<'sql', string>[] = Object.values(\n (options.extensionPacks ?? {}) as Record<string, ExtensionPackRef<'sql', string>>,\n );\n const components: readonly AuthoringComponent[] = [\n options.family,\n options.target,\n ...extensionValues,\n ];\n\n const typeNamespace = composeTypeNamespace(components);\n const fieldNamespace = composeFieldNamespace(components);\n const entityNamespace = composeEntityNamespace(components);\n // Mirrors the call in `assembleAuthoringContributions`: PSL composes via\n // `createControlStack`, the TS DSL composes here. Both seams need the guard.\n assertNoCrossRegistryCollisions(typeNamespace, fieldNamespace, entityNamespace);\n assertNoBuiltInEntityCollisions(entityNamespace);\n\n return {\n ...createEntityHelpersFromNamespace(entityNamespace, {\n ctx: { family: options.family.familyId, target: options.target.targetId },\n }),\n field: createComposedFieldHelpers(fieldNamespace),\n model,\n rel,\n type: createTypeHelpersFromNamespace(typeNamespace),\n } as ComposedAuthoringHelpers<Family, Target, ExtensionPacks>;\n}\n","import type {\n PostgresEnumStorageEntry,\n StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport {\n type ContractModelBuilder,\n type ModelAttributesSpec,\n normalizeRelationFieldNames,\n type RelationBuilder,\n type RelationState,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n} from './contract-dsl';\n\ntype RuntimeModel = ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, RelationBuilder<RelationState>>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n>;\n\ntype RuntimeModelSpec = {\n readonly modelName: string;\n readonly tableName: string;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n readonly sqlSpec: SqlStageSpec | undefined;\n};\n\ntype RuntimeCollection = {\n readonly storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>;\n readonly models: Record<string, RuntimeModel>;\n readonly modelSpecs: ReadonlyMap<string, RuntimeModelSpec>;\n};\n\nfunction hasNamedModelToken(models: Record<string, RuntimeModel>, modelName: string): boolean {\n return models[modelName]?.stageOne.modelName === modelName;\n}\n\nfunction formatFieldSelection(fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `'${fieldNames[0]}'`;\n }\n\n return `[${fieldNames.map((fieldName) => `'${fieldName}'`).join(', ')}]`;\n}\n\nfunction formatTokenFieldSelection(modelName: string, fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `${modelName}.refs.${fieldNames[0]}`;\n }\n\n return `[${fieldNames.map((fieldName) => `${modelName}.refs.${fieldName}`).join(', ')}]`;\n}\n\nfunction formatConstraintsRefCall(modelName: string, fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `constraints.ref('${modelName}', '${fieldNames[0]}')`;\n }\n\n return `[${fieldNames\n .map((fieldName) => `constraints.ref('${modelName}', '${fieldName}')`)\n .join(', ')}]`;\n}\n\nfunction formatRelationModelDisplay(\n relationModel:\n | RelationState['toModel']\n | Extract<RelationState, { kind: 'manyToMany' }>['through'],\n): string {\n if (relationModel.kind === 'lazyRelationModelName') {\n return `() => ${relationModel.resolve()}`;\n }\n\n return relationModel.source === 'string'\n ? `'${relationModel.modelName}'`\n : relationModel.modelName;\n}\n\nfunction formatRelationCall(relation: RelationState, targetModelDisplay: string): string {\n if (relation.kind === 'belongsTo') {\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.belongsTo(${targetModelDisplay}, { from: ${from}, to: ${to} })`;\n }\n\n if (relation.kind === 'hasMany' || relation.kind === 'hasOne') {\n const by = formatFieldSelection(normalizeRelationFieldNames(relation.by));\n return `rel.${relation.kind}(${targetModelDisplay}, { by: ${by} })`;\n }\n\n const throughDisplay = formatRelationModelDisplay(relation.through);\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.manyToMany(${targetModelDisplay}, { through: ${throughDisplay}, from: ${from}, to: ${to} })`;\n}\n\nfunction formatManyToManyCallWithThrough(\n relation: Extract<RelationState, { kind: 'manyToMany' }>,\n throughDisplay: string,\n): string {\n const targetDisplay = formatRelationModelDisplay(relation.toModel);\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.manyToMany(${targetDisplay}, { through: ${throughDisplay}, from: ${from}, to: ${to} })`;\n}\n\nconst WARNING_BATCH_THRESHOLD = 5;\n\nfunction flushWarnings(warnings: readonly string[]): void {\n if (warnings.length === 0) {\n return;\n }\n\n if (warnings.length <= WARNING_BATCH_THRESHOLD) {\n for (const message of warnings) {\n process.emitWarning(message, { code: 'PN_CONTRACT_TYPED_FALLBACK_AVAILABLE' });\n }\n return;\n }\n\n process.emitWarning(\n `${warnings.length} contract references use string fallbacks where typed alternatives are available. ` +\n 'Use named model tokens and typed storage type refs for autocomplete and type safety.\\n' +\n warnings.map((w) => ` - ${w}`).join('\\n'),\n { code: 'PN_CONTRACT_TYPED_FALLBACK_AVAILABLE' },\n );\n}\n\nfunction formatFallbackWarning(location: string, current: string, suggested: string): string {\n return (\n `Contract ${location} uses ${current}. ` +\n `Use ${suggested} when the named model token is available in the same contract to keep typed relation targets and model refs.`\n );\n}\n\nexport function emitTypedNamedTypeFallbackWarnings(\n models: Record<string, RuntimeModel>,\n storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n): void {\n const warnings: string[] = [];\n const warnedFields = new Set<string>();\n\n for (const [modelName, modelDefinition] of Object.entries(models)) {\n for (const [fieldName, fieldBuilder] of Object.entries(modelDefinition.stageOne.fields)) {\n const fieldState = fieldBuilder.build();\n if (typeof fieldState.typeRef !== 'string' || !(fieldState.typeRef in storageTypes)) {\n continue;\n }\n\n const warningKey = `${modelName}.${fieldName}`;\n if (warnedFields.has(warningKey)) {\n continue;\n }\n warnedFields.add(warningKey);\n\n warnings.push(\n `Contract field \"${modelName}.${fieldName}\" uses field.namedType('${fieldState.typeRef}'). ` +\n `Use field.namedType(types.${fieldState.typeRef}) when the storage type is declared in the same contract to keep autocomplete and typed local refs.`,\n );\n }\n }\n\n flushWarnings(warnings);\n}\n\nexport function emitTypedCrossModelFallbackWarnings(collection: RuntimeCollection): void {\n const warnings: string[] = [];\n const warnedKeys = new Set<string>();\n\n for (const spec of collection.modelSpecs.values()) {\n for (const [relationName, relationBuilder] of Object.entries(spec.relations)) {\n const relation = relationBuilder.build();\n\n if (\n relation.toModel.kind === 'relationModelName' &&\n relation.toModel.source === 'string' &&\n hasNamedModelToken(collection.models, relation.toModel.modelName)\n ) {\n const warningKey = `${spec.modelName}.${relationName}.toModel`;\n if (!warnedKeys.has(warningKey)) {\n warnedKeys.add(warningKey);\n\n const current = formatRelationCall(relation, `'${relation.toModel.modelName}'`);\n const suggested = formatRelationCall(relation, relation.toModel.modelName);\n warnings.push(\n formatFallbackWarning(\n `relation \"${spec.modelName}.${relationName}\"`,\n current,\n suggested,\n ),\n );\n }\n }\n\n if (\n relation.kind === 'manyToMany' &&\n relation.through.kind === 'relationModelName' &&\n relation.through.source === 'string' &&\n hasNamedModelToken(collection.models, relation.through.modelName)\n ) {\n const warningKey = `${spec.modelName}.${relationName}.through`;\n if (!warnedKeys.has(warningKey)) {\n warnedKeys.add(warningKey);\n\n const current = formatManyToManyCallWithThrough(\n relation,\n `'${relation.through.modelName}'`,\n );\n const suggested = formatManyToManyCallWithThrough(relation, relation.through.modelName);\n warnings.push(\n formatFallbackWarning(\n `relation \"${spec.modelName}.${relationName}\"`,\n current,\n suggested,\n ),\n );\n }\n }\n }\n\n for (const [foreignKeyIndex, foreignKey] of (spec.sqlSpec?.foreignKeys ?? []).entries()) {\n if (\n foreignKey.targetSource !== 'string' ||\n !hasNamedModelToken(collection.models, foreignKey.targetModel)\n ) {\n continue;\n }\n\n const warningKey = `${spec.modelName}.sql.foreignKeys.${foreignKeyIndex}`;\n if (warnedKeys.has(warningKey)) {\n continue;\n }\n warnedKeys.add(warningKey);\n\n const current = formatConstraintsRefCall(foreignKey.targetModel, foreignKey.targetFields);\n const suggested = formatTokenFieldSelection(foreignKey.targetModel, foreignKey.targetFields);\n warnings.push(\n formatFallbackWarning(`model \"${spec.modelName}\"`, `${current} in .sql(...)`, suggested),\n );\n }\n }\n\n flushWarnings(warnings);\n}\n","import type { ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport type { ExtensionPackRef } from '@prisma-next/framework-components/components';\nimport {\n isPostgresEnumStorageEntry,\n type PostgresEnumStorageEntry,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ContractDefinition,\n FieldNode,\n ForeignKeyNode,\n IndexNode,\n ModelNode,\n PrimaryKeyNode,\n RelationNode,\n UniqueConstraintNode,\n} from './contract-definition';\nimport {\n applyNaming,\n type ContractInput,\n type ContractModelBuilder,\n type FieldStateOf,\n type ForeignKeyConstraint,\n type IdConstraint,\n type ModelAttributesSpec,\n normalizeRelationFieldNames,\n type RelationBuilder,\n type RelationState,\n resolveRelationModelName,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n type UniqueConstraint,\n} from './contract-dsl';\nimport {\n emitTypedCrossModelFallbackWarnings,\n emitTypedNamedTypeFallbackWarnings,\n} from './contract-warnings';\nimport { isEnumTypeHandle } from './enum-type';\n\ntype RuntimeModel = ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, RelationBuilder<RelationState>>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n>;\n\ntype RuntimeModelSpec = {\n readonly modelName: string;\n readonly tableName: string;\n readonly namespace: string | undefined;\n readonly fieldBuilders: Record<string, ScalarFieldBuilder>;\n readonly fieldToColumn: Record<string, string>;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n readonly attributesSpec: ModelAttributesSpec | undefined;\n readonly sqlSpec: SqlStageSpec | undefined;\n readonly idConstraint: IdConstraint | undefined;\n};\n\ntype RuntimeCollection = {\n readonly storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>;\n readonly models: Record<string, RuntimeModel>;\n readonly modelSpecs: ReadonlyMap<string, RuntimeModelSpec>;\n};\n\nfunction buildStorageTypeReverseLookup(\n storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n): ReadonlyMap<StorageTypeInstance | PostgresEnumStorageEntry, string> {\n const lookup = new Map<StorageTypeInstance | PostgresEnumStorageEntry, string>();\n for (const [key, instance] of Object.entries(storageTypes)) {\n lookup.set(instance, key);\n }\n return lookup;\n}\n\nfunction resolveFieldDescriptor(\n modelName: string,\n fieldName: string,\n fieldState: FieldStateOf<ScalarFieldBuilder>,\n storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n storageTypeReverseLookup: ReadonlyMap<StorageTypeInstance | PostgresEnumStorageEntry, string>,\n): ColumnTypeDescriptor {\n if ('descriptor' in fieldState && fieldState.descriptor) {\n return fieldState.descriptor;\n }\n\n if ('typeRef' in fieldState && fieldState.typeRef) {\n if (isEnumTypeHandle(fieldState.typeRef)) {\n return {\n codecId: fieldState.typeRef.codecId,\n nativeType: fieldState.typeRef.nativeType,\n };\n }\n\n const typeRef =\n typeof fieldState.typeRef === 'string'\n ? fieldState.typeRef\n : storageTypeReverseLookup.get(\n fieldState.typeRef as StorageTypeInstance | PostgresEnumStorageEntry,\n );\n\n if (!typeRef) {\n throw new Error(\n `Field \"${modelName}.${fieldName}\" references a storage type instance that is not present in definition.types`,\n );\n }\n\n const referencedType = storageTypes[typeRef];\n if (!referencedType) {\n throw new Error(\n `Field \"${modelName}.${fieldName}\" references unknown storage type \"${typeRef}\"`,\n );\n }\n\n const codecId = isPostgresEnumStorageEntry(referencedType)\n ? referencedType.codecId\n : referencedType.codecId;\n return {\n codecId,\n nativeType: referencedType.nativeType,\n typeRef,\n };\n }\n\n throw new Error(`Field \"${modelName}.${fieldName}\" does not resolve to a storage descriptor`);\n}\n\nfunction mapFieldNamesToColumnNames(\n modelName: string,\n fieldNames: readonly string[],\n fieldToColumn: Record<string, string>,\n): readonly string[] {\n return fieldNames.map((fieldName) => {\n const columnName = fieldToColumn[fieldName];\n if (!columnName) {\n throw new Error(`Unknown field \"${modelName}.${fieldName}\" in contract definition`);\n }\n return columnName;\n });\n}\n\nfunction assertRelationFieldArity(params: {\n readonly modelName: string;\n readonly relationName: string;\n readonly leftLabel: string;\n readonly leftFields: readonly string[];\n readonly rightLabel: string;\n readonly rightFields: readonly string[];\n}): void {\n if (params.leftFields.length === params.rightFields.length) {\n return;\n }\n\n throw new Error(\n `Relation \"${params.modelName}.${params.relationName}\" maps ${params.leftFields.length} ${params.leftLabel} field(s) to ${params.rightFields.length} ${params.rightLabel} field(s).`,\n );\n}\n\nfunction resolveInlineIdConstraint(\n spec: Pick<RuntimeModelSpec, 'modelName' | 'fieldBuilders'>,\n): IdConstraint | undefined {\n const inlineIdFields: string[] = [];\n let idName: string | undefined;\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n if (!fieldState.id) {\n continue;\n }\n\n inlineIdFields.push(fieldName);\n if (fieldState.id.name) {\n idName = fieldState.id.name;\n }\n }\n\n if (inlineIdFields.length === 0) {\n return undefined;\n }\n\n if (inlineIdFields.length > 1) {\n throw new Error(\n `Model \"${spec.modelName}\" marks multiple fields with .id(). Use .attributes(...) for compound identities.`,\n );\n }\n\n const [inlineIdField] = inlineIdFields;\n if (!inlineIdField) {\n return undefined;\n }\n\n return {\n kind: 'id',\n fields: [inlineIdField],\n ...(idName ? { name: idName } : {}),\n };\n}\n\nfunction collectInlineUniqueConstraints(spec: RuntimeModelSpec): readonly UniqueConstraint[] {\n const constraints: UniqueConstraint[] = [];\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n if (!fieldState.unique) {\n continue;\n }\n\n constraints.push({\n kind: 'unique',\n fields: [fieldName],\n ...(fieldState.unique.name ? { name: fieldState.unique.name } : {}),\n });\n }\n\n return constraints;\n}\n\nfunction resolveModelIdConstraint(\n spec: Pick<RuntimeModelSpec, 'modelName' | 'fieldBuilders' | 'attributesSpec'>,\n): IdConstraint | undefined {\n const inlineId = resolveInlineIdConstraint(spec);\n const attributeId = spec.attributesSpec?.id;\n\n if (inlineId && attributeId) {\n throw new Error(\n `Model \"${spec.modelName}\" defines identity both inline and in .attributes(...). Pick one identity style.`,\n );\n }\n\n const resolvedId = attributeId ?? inlineId;\n if (resolvedId && resolvedId.fields.length === 0) {\n throw new Error(`Model \"${spec.modelName}\" defines an empty identity. Add at least one field.`);\n }\n\n return resolvedId;\n}\n\nfunction resolveModelUniqueConstraints(spec: RuntimeModelSpec): readonly UniqueConstraint[] {\n const attributeUniques = spec.attributesSpec?.uniques ?? [];\n for (const unique of attributeUniques) {\n if (unique.fields.length === 0) {\n throw new Error(\n `Model \"${spec.modelName}\" defines an empty unique constraint. Add at least one field.`,\n );\n }\n }\n\n return [...collectInlineUniqueConstraints(spec), ...attributeUniques];\n}\n\nfunction resolveRelationForeignKeys(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): readonly ForeignKeyConstraint[] {\n const foreignKeys: ForeignKeyConstraint[] = [];\n\n for (const [relationName, relationBuilder] of Object.entries(spec.relations)) {\n const relation = relationBuilder.build();\n if (relation.kind !== 'belongsTo' || !relation.sql?.fk) {\n continue;\n }\n\n const targetModelName = resolveRelationModelName(relation.toModel);\n\n // F-relfk: cross-space relations carry a spaceId; skip the local spec lookup\n // and include cross-space coordinates so resolveForeignKeyNodes routes the FK\n // through the cross-space path.\n if (relation.spaceId !== undefined) {\n const fields = normalizeRelationFieldNames(relation.from);\n const targetFields = normalizeRelationFieldNames(relation.to);\n assertRelationFieldArity({\n modelName: spec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fields,\n rightLabel: 'target',\n rightFields: targetFields,\n });\n\n foreignKeys.push({\n kind: 'fk',\n fields,\n targetModel: targetModelName,\n targetFields,\n targetSpaceId: relation.spaceId,\n ...(relation.namespaceId !== undefined ? { targetNamespaceId: relation.namespaceId } : {}),\n ...(relation.tableName !== undefined ? { targetTableName: relation.tableName } : {}),\n ...(relation.sql.fk.name ? { name: relation.sql.fk.name } : {}),\n ...(relation.sql.fk.onDelete ? { onDelete: relation.sql.fk.onDelete } : {}),\n ...(relation.sql.fk.onUpdate ? { onUpdate: relation.sql.fk.onUpdate } : {}),\n ...(relation.sql.fk.constraint !== undefined\n ? { constraint: relation.sql.fk.constraint }\n : {}),\n ...(relation.sql.fk.index !== undefined ? { index: relation.sql.fk.index } : {}),\n });\n continue;\n }\n\n if (!allSpecs.has(targetModelName)) {\n throw new Error(\n `Relation \"${spec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const fields = normalizeRelationFieldNames(relation.from);\n const targetFields = normalizeRelationFieldNames(relation.to);\n assertRelationFieldArity({\n modelName: spec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fields,\n rightLabel: 'target',\n rightFields: targetFields,\n });\n\n foreignKeys.push({\n kind: 'fk',\n fields,\n targetModel: targetModelName,\n targetFields,\n ...(relation.sql.fk.name ? { name: relation.sql.fk.name } : {}),\n ...(relation.sql.fk.onDelete ? { onDelete: relation.sql.fk.onDelete } : {}),\n ...(relation.sql.fk.onUpdate ? { onUpdate: relation.sql.fk.onUpdate } : {}),\n ...(relation.sql.fk.constraint !== undefined\n ? { constraint: relation.sql.fk.constraint }\n : {}),\n ...(relation.sql.fk.index !== undefined ? { index: relation.sql.fk.index } : {}),\n });\n }\n\n return foreignKeys;\n}\n\nfunction resolveRelationAnchorFields(spec: RuntimeModelSpec): readonly string[] {\n const idFields = spec.idConstraint?.fields;\n if (idFields && idFields.length > 0) {\n return idFields;\n }\n\n if ('id' in spec.fieldToColumn) {\n return ['id'];\n }\n\n throw new Error(\n `Model \"${spec.modelName}\" needs an explicit id or an \"id\" field to anchor non-owning relations`,\n );\n}\n\nfunction lowerBelongsToRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'belongsTo' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const fromFields = normalizeRelationFieldNames(relation.from);\n const toFields = normalizeRelationFieldNames(relation.to);\n\n assertRelationFieldArity({\n modelName: currentSpec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fromFields,\n rightLabel: 'target',\n rightFields: toFields,\n });\n\n // Cross-space path: the target lives in a different contract space.\n // Resolve from the brand carried on the BelongsToRelation instead of\n // requiring a local model spec — matching how the FK lowering works.\n if (relation.spaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n relation.spaceId,\n `Relation \"${currentSpec.modelName}.${relationName}\"`,\n );\n const targetTable = relation.tableName ?? targetModelName.toLowerCase();\n const parentColumns = mapFieldNamesToColumnNames(\n currentSpec.modelName,\n fromFields,\n currentSpec.fieldToColumn,\n );\n // For cross-space relations, the `to` field names map directly to column\n // names because we have no fieldToColumn map for the remote model.\n // (The brand carries the table name; field→column resolution on the remote\n // side is deferred to the planner which has access to the remote contract.)\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetTable,\n cardinality: 'N:1',\n spaceId: relation.spaceId,\n ...(relation.namespaceId !== undefined ? { namespaceId: relation.namespaceId } : {}),\n on: {\n parentTable: currentSpec.tableName,\n parentColumns,\n childTable: targetTable,\n childColumns: toFields,\n },\n };\n }\n\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: 'N:1',\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n fromFields,\n currentSpec.fieldToColumn,\n ),\n childTable: targetSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n toFields,\n targetSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction lowerHasOwnershipRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'hasMany' | 'hasOne' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const parentFields = resolveRelationAnchorFields(currentSpec);\n const childFields = normalizeRelationFieldNames(relation.by);\n assertRelationFieldArity({\n modelName: currentSpec.modelName,\n relationName,\n leftLabel: 'anchor',\n leftFields: parentFields,\n rightLabel: 'child',\n rightFields: childFields,\n });\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: relation.kind === 'hasMany' ? '1:N' : '1:1',\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n parentFields,\n currentSpec.fieldToColumn,\n ),\n childTable: targetSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n childFields,\n targetSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction lowerManyToManyRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'manyToMany' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const throughModelName = resolveRelationModelName(relation.through);\n const throughSpec = allSpecs.get(throughModelName);\n if (!throughSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown through model \"${throughModelName}\"`,\n );\n }\n\n const currentAnchorFields = resolveRelationAnchorFields(currentSpec);\n const targetAnchorFields = resolveRelationAnchorFields(targetSpec);\n const throughFromFields = normalizeRelationFieldNames(relation.from);\n const throughToFields = normalizeRelationFieldNames(relation.to);\n if (\n currentAnchorFields.length !== throughFromFields.length ||\n targetAnchorFields.length !== throughToFields.length\n ) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" has mismatched many-to-many field counts.`,\n );\n }\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: 'N:M',\n through: {\n table: throughSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughFromFields,\n throughSpec.fieldToColumn,\n ),\n childColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughToFields,\n throughSpec.fieldToColumn,\n ),\n },\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n currentAnchorFields,\n currentSpec.fieldToColumn,\n ),\n childTable: throughSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughFromFields,\n throughSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction resolveRelationNode(\n relationName: string,\n relation: RelationState,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): RelationNode {\n if (relation.kind === 'belongsTo') {\n return lowerBelongsToRelation(relationName, relation, currentSpec, allSpecs, extensionPacks);\n }\n\n if (relation.kind === 'hasMany' || relation.kind === 'hasOne') {\n return lowerHasOwnershipRelation(relationName, relation, currentSpec, allSpecs);\n }\n\n return lowerManyToManyRelation(relationName, relation, currentSpec, allSpecs);\n}\n\nfunction lowerLocalForeignKeyNode(\n spec: RuntimeModelSpec,\n targetSpec: RuntimeModelSpec,\n foreignKey: {\n readonly fields: readonly string[];\n readonly targetFields: readonly string[];\n readonly name?: string | undefined;\n readonly onDelete?: ForeignKeyConstraint['onDelete'] | undefined;\n readonly onUpdate?: ForeignKeyConstraint['onUpdate'] | undefined;\n readonly constraint?: boolean | undefined;\n readonly index?: boolean | undefined;\n },\n): ForeignKeyNode {\n return {\n columns: mapFieldNamesToColumnNames(spec.modelName, foreignKey.fields, spec.fieldToColumn),\n references: {\n model: targetSpec.modelName,\n table: targetSpec.tableName,\n columns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n foreignKey.targetFields,\n targetSpec.fieldToColumn,\n ),\n },\n ...(foreignKey.name ? { name: foreignKey.name } : {}),\n ...(foreignKey.onDelete ? { onDelete: foreignKey.onDelete } : {}),\n ...(foreignKey.onUpdate ? { onUpdate: foreignKey.onUpdate } : {}),\n ...(foreignKey.constraint !== undefined ? { constraint: foreignKey.constraint } : {}),\n ...(foreignKey.index !== undefined ? { index: foreignKey.index } : {}),\n };\n}\n\nfunction lowerCrossSpaceForeignKeyNode(\n spec: RuntimeModelSpec,\n foreignKey: {\n readonly fields: readonly string[];\n readonly targetFields: readonly string[];\n readonly targetModel: string;\n readonly targetSpaceId: string;\n readonly targetNamespaceId?: string;\n readonly targetTableName?: string;\n readonly name?: string | undefined;\n readonly onDelete?: ForeignKeyConstraint['onDelete'] | undefined;\n readonly onUpdate?: ForeignKeyConstraint['onUpdate'] | undefined;\n readonly constraint?: boolean | undefined;\n readonly index?: boolean | undefined;\n },\n): ForeignKeyNode {\n return {\n columns: mapFieldNamesToColumnNames(spec.modelName, foreignKey.fields, spec.fieldToColumn),\n references: {\n model: foreignKey.targetModel,\n table: foreignKey.targetTableName ?? foreignKey.targetModel.toLowerCase(),\n columns: foreignKey.targetFields,\n ...(foreignKey.targetNamespaceId !== undefined\n ? { namespaceId: foreignKey.targetNamespaceId }\n : {}),\n spaceId: foreignKey.targetSpaceId,\n },\n ...(foreignKey.name ? { name: foreignKey.name } : {}),\n ...(foreignKey.onDelete ? { onDelete: foreignKey.onDelete } : {}),\n ...(foreignKey.onUpdate ? { onUpdate: foreignKey.onUpdate } : {}),\n ...(foreignKey.constraint !== undefined ? { constraint: foreignKey.constraint } : {}),\n ...(foreignKey.index !== undefined ? { index: foreignKey.index } : {}),\n };\n}\n\nfunction assertKnownExtensionPack(\n extensionPacks: Record<string, ExtensionPackRef<'sql', string>> | undefined,\n spaceId: string,\n context: string,\n): void {\n if (extensionPacks !== undefined && Object.hasOwn(extensionPacks, spaceId)) {\n return;\n }\n throw new Error(\n `${context} references contract space \"${spaceId}\" but \"${spaceId}\" is not declared in extensionPacks. Add the pack to extensionPacks.`,\n );\n}\n\nfunction resolveForeignKeyNodes(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): readonly ForeignKeyNode[] {\n const relationForeignKeys = resolveRelationForeignKeys(spec, allSpecs).map((foreignKey) => {\n // F-relfk: relation-derived FKs for cross-space targets carry targetSpaceId;\n // route them through the cross-space path, just like explicit sql() FKs.\n if (foreignKey.targetSpaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n foreignKey.targetSpaceId,\n `Relation-derived foreign key on \"${spec.modelName}\"`,\n );\n return lowerCrossSpaceForeignKeyNode(spec, {\n ...foreignKey,\n targetSpaceId: foreignKey.targetSpaceId,\n });\n }\n\n const targetSpec = allSpecs.get(foreignKey.targetModel);\n if (!targetSpec) {\n throw new Error(\n `Foreign key on \"${spec.modelName}\" references unknown model \"${foreignKey.targetModel}\"`,\n );\n }\n\n return lowerLocalForeignKeyNode(spec, targetSpec, foreignKey);\n });\n\n const sqlForeignKeys = (spec.sqlSpec?.foreignKeys ?? []).map((foreignKey) => {\n if (foreignKey.targetSpaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n foreignKey.targetSpaceId,\n `Foreign key on \"${spec.modelName}\"`,\n );\n return lowerCrossSpaceForeignKeyNode(spec, {\n ...foreignKey,\n targetSpaceId: foreignKey.targetSpaceId,\n });\n }\n\n const targetSpec = allSpecs.get(foreignKey.targetModel);\n if (!targetSpec) {\n throw new Error(\n `Foreign key on \"${spec.modelName}\" references unknown model \"${foreignKey.targetModel}\"`,\n );\n }\n\n return lowerLocalForeignKeyNode(spec, targetSpec, foreignKey);\n });\n\n return [...relationForeignKeys, ...sqlForeignKeys];\n}\n\nfunction resolveModelNode(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n storageTypeReverseLookup: ReadonlyMap<StorageTypeInstance | PostgresEnumStorageEntry, string>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): ModelNode {\n const fields: FieldNode[] = [];\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n const descriptor = resolveFieldDescriptor(\n spec.modelName,\n fieldName,\n fieldState,\n storageTypes,\n storageTypeReverseLookup,\n );\n const columnName = spec.fieldToColumn[fieldName];\n if (!columnName) {\n throw new Error(`Column name resolution failed for \"${spec.modelName}.${fieldName}\"`);\n }\n\n const enumHandle =\n 'typeRef' in fieldState && isEnumTypeHandle(fieldState.typeRef)\n ? fieldState.typeRef\n : undefined;\n\n fields.push({\n fieldName,\n columnName,\n descriptor,\n nullable: fieldState.nullable,\n ...(fieldState.default ? { default: fieldState.default } : {}),\n ...(fieldState.executionDefaults ? { executionDefaults: fieldState.executionDefaults } : {}),\n ...(enumHandle !== undefined ? { enumTypeHandle: enumHandle } : {}),\n });\n }\n\n const { idConstraint } = spec;\n const uniques = resolveModelUniqueConstraints(spec).map((unique) => ({\n columns: mapFieldNamesToColumnNames(spec.modelName, unique.fields, spec.fieldToColumn),\n ...(unique.name ? { name: unique.name } : {}),\n })) satisfies readonly UniqueConstraintNode[];\n const indexes = (spec.sqlSpec?.indexes ?? []).map((index) => ({\n columns: mapFieldNamesToColumnNames(spec.modelName, index.fields, spec.fieldToColumn),\n ...ifDefined('name', index.name),\n ...ifDefined('type', index.type),\n ...ifDefined('options', index.options),\n })) satisfies readonly IndexNode[];\n const foreignKeys = resolveForeignKeyNodes(spec, allSpecs, extensionPacks);\n const relations = Object.entries(spec.relations).map(([relationName, relationBuilder]) =>\n resolveRelationNode(relationName, relationBuilder.build(), spec, allSpecs, extensionPacks),\n );\n\n return {\n modelName: spec.modelName,\n tableName: spec.tableName,\n ...(spec.namespace !== undefined ? { namespaceId: spec.namespace } : {}),\n fields,\n ...(idConstraint\n ? {\n id: {\n columns: mapFieldNamesToColumnNames(\n spec.modelName,\n idConstraint.fields,\n spec.fieldToColumn,\n ),\n ...(idConstraint.name ? { name: idConstraint.name } : {}),\n } satisfies PrimaryKeyNode,\n }\n : {}),\n ...(uniques.length > 0 ? { uniques } : {}),\n ...(indexes.length > 0 ? { indexes } : {}),\n ...(foreignKeys.length > 0 ? { foreignKeys } : {}),\n ...(relations.length > 0 ? { relations } : {}),\n ...ifDefined('control', spec.sqlSpec?.control),\n };\n}\n\nfunction collectRuntimeModelSpecs(definition: ContractInput): RuntimeCollection {\n const storageTypes = { ...(definition.types ?? {}) } as Record<\n string,\n StorageTypeInstance | PostgresEnumStorageEntry\n >;\n const models = { ...(definition.models ?? {}) } as Record<string, RuntimeModel>;\n\n emitTypedNamedTypeFallbackWarnings(models, storageTypes);\n\n const modelSpecs = new Map<string, RuntimeModelSpec>();\n const tableOwners = new Map<string, string>();\n\n for (const [modelName, modelDefinition] of Object.entries(models)) {\n const tokenModelName = modelDefinition.stageOne.modelName;\n if (tokenModelName && tokenModelName !== modelName) {\n throw new Error(\n `Model token \"${tokenModelName}\" must be assigned to models.${tokenModelName}. Received models.${modelName}.`,\n );\n }\n\n const attributesSpec = modelDefinition.buildAttributesSpec();\n const sqlSpec = modelDefinition.buildSqlSpec();\n const tableName = sqlSpec?.table ?? applyNaming(modelName, definition.naming?.tables);\n const existingModel = tableOwners.get(tableName);\n if (existingModel) {\n throw new Error(\n `Models \"${existingModel}\" and \"${modelName}\" both map to table \"${tableName}\".`,\n );\n }\n tableOwners.set(tableName, modelName);\n\n const fieldToColumn: Record<string, string> = {};\n const columnOwners = new Map<string, string>();\n\n for (const [fieldName, fieldBuilder] of Object.entries(modelDefinition.stageOne.fields)) {\n const fieldState = fieldBuilder.build();\n const columnName =\n fieldState.columnName ?? applyNaming(fieldName, definition.naming?.columns);\n const existingField = columnOwners.get(columnName);\n if (existingField) {\n throw new Error(\n `Model \"${modelName}\" maps both \"${existingField}\" and \"${fieldName}\" to column \"${columnName}\".`,\n );\n }\n columnOwners.set(columnName, fieldName);\n fieldToColumn[fieldName] = columnName;\n }\n\n const fieldBuilders = modelDefinition.stageOne.fields;\n const idConstraint = resolveModelIdConstraint({ modelName, fieldBuilders, attributesSpec });\n modelSpecs.set(modelName, {\n modelName,\n tableName,\n namespace: modelDefinition.stageOne.namespace,\n fieldBuilders,\n fieldToColumn,\n relations: modelDefinition.stageOne.relations,\n attributesSpec,\n sqlSpec,\n idConstraint,\n });\n }\n\n return {\n storageTypes,\n models,\n modelSpecs,\n };\n}\n\nfunction lowerModels(\n collection: RuntimeCollection,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): readonly ModelNode[] {\n emitTypedCrossModelFallbackWarnings(collection);\n\n const storageTypeReverseLookup = buildStorageTypeReverseLookup(collection.storageTypes);\n return Array.from(collection.modelSpecs.values()).map((spec) =>\n resolveModelNode(\n spec,\n collection.modelSpecs,\n collection.storageTypes,\n storageTypeReverseLookup,\n extensionPacks,\n ),\n );\n}\n\nexport function buildContractDefinition(definition: ContractInput): ContractDefinition {\n const collection = collectRuntimeModelSpecs(definition);\n const models = lowerModels(collection, definition.extensionPacks);\n\n return {\n target: definition.target,\n ...ifDefined('defaultControlPolicy', definition.defaultControlPolicy),\n ...(definition.extensionPacks ? { extensionPacks: definition.extensionPacks } : {}),\n ...(definition.storageHash ? { storageHash: definition.storageHash } : {}),\n ...(definition.foreignKeyDefaults ? { foreignKeyDefaults: definition.foreignKeyDefaults } : {}),\n ...(Object.keys(collection.storageTypes).length > 0\n ? { storageTypes: collection.storageTypes }\n : {}),\n ...(definition.namespaces ? { namespaces: definition.namespaces } : {}),\n ...(definition.createNamespace ? { createNamespace: definition.createNamespace } : {}),\n ...(definition.enums && Object.keys(definition.enums).length > 0\n ? { enums: definition.enums }\n : {}),\n models,\n };\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type { ForeignKeyDefaultsState } from '@prisma-next/contract-authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport type { Namespace } from '@prisma-next/framework-components/ir';\nimport type {\n PostgresEnumStorageEntry,\n SqlNamespaceTablesInput,\n StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { buildSqlContractFromDefinition } from './build-contract';\nimport {\n type ComposedAuthoringHelpers,\n createComposedAuthoringHelpers,\n} from './composed-authoring-helpers';\nimport {\n type ContractInput,\n type ContractModelBuilder,\n extensionModel,\n field,\n isContractInput,\n type ModelAttributesSpec,\n model,\n type RelationBuilder,\n type RelationState,\n rel,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n} from './contract-dsl';\nimport { buildContractDefinition } from './contract-lowering';\nimport type { SqlContractResult } from './contract-types';\nimport type { EnumTypeHandle } from './enum-type';\n\nexport { buildSqlContractFromDefinition } from './build-contract';\n\ntype ModelLike = {\n readonly stageOne: {\n readonly modelName?: string;\n readonly namespace?: string;\n readonly fields: Record<string, ScalarFieldBuilder>;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n };\n readonly __attributes: ModelAttributesSpec | undefined;\n readonly __sql: SqlStageSpec | undefined;\n buildAttributesSpec(): ModelAttributesSpec | undefined;\n buildSqlSpec(): SqlStageSpec | undefined;\n};\n\ntype ContractDefinition<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n Models extends Record<string, ModelLike>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Record<string, EnumTypeHandle>;\n};\n\ntype ContractScaffold<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: never;\n readonly models?: never;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Record<string, EnumTypeHandle>;\n};\n\ntype ContractFactory<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n Models extends Record<string, ModelLike>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n> = (helpers: ComposedAuthoringHelpers<Family, Target, ExtensionPacks>) => {\n readonly types?: Types;\n readonly models?: Models;\n};\n\nfunction validateTargetPackRef(\n family: FamilyPackRef<string>,\n target: TargetPackRef<'sql', string>,\n): void {\n if (family.familyId !== 'sql') {\n throw new Error(\n `defineContract only accepts SQL family packs. Received family \"${family.familyId}\".`,\n );\n }\n\n if (target.familyId !== family.familyId) {\n throw new Error(\n `target pack \"${target.id}\" targets family \"${target.familyId}\" but contract family is \"${family.familyId}\".`,\n );\n }\n}\n\n/**\n * Per-target reserved namespace names enforced by `defineContract` for\n * SQL family contracts. Two categories:\n *\n * 1. **IR sentinels** (`__unbound__`, `__unspecified__`) — reserved on\n * every SQL target. The double-underscore decoration marks them as\n * framework-reserved coordinates; user code must not declare them\n * explicitly.\n * 2. **Target-specific PSL keywords** — Postgres reserves the bare\n * `unbound` identifier for the late-binding opt-in\n * (`namespace unbound { … }`) so the TS surface must reject it from\n * `defineContract({ namespaces })` lists. SQLite has no schema\n * concept and rejects every non-empty namespaces list outright;\n * callers should declare `namespaces: []` or omit the field.\n */\nfunction validateNamespaceDeclarations(\n target: TargetPackRef<'sql', string>,\n namespaces: readonly string[] | undefined,\n): void {\n if (!namespaces) {\n return;\n }\n\n if (target.targetId === 'sqlite' && namespaces.length > 0) {\n throw new Error(\n `defineContract: SQLite contracts cannot declare namespaces (SQLite has no schema concept; emitted DDL is always unqualified). Received namespaces: [${namespaces\n .map((name) => `\"${name}\"`)\n .join(', ')}].`,\n );\n }\n\n const seen = new Set<string>();\n for (const namespace of namespaces) {\n if (namespace.length === 0) {\n throw new Error('defineContract: namespace names cannot be empty.');\n }\n if (namespace.trim().length === 0) {\n throw new Error(`defineContract: namespace name \"${namespace}\" cannot be whitespace-only.`);\n }\n if (namespace === '__unbound__' || namespace === '__unspecified__') {\n throw new Error(\n `defineContract: namespace name \"${namespace}\" is a reserved IR sentinel and cannot appear in the declared namespaces list.`,\n );\n }\n if (target.targetId === 'postgres' && namespace === 'unbound') {\n throw new Error(\n `defineContract: namespace name \"unbound\" is reserved by Postgres for the late-binding opt-in (use \\`namespace unbound { … }\\` in PSL instead of declaring it as a regular schema).`,\n );\n }\n if (seen.has(namespace)) {\n throw new Error(`defineContract: namespaces list contains duplicate entry \"${namespace}\".`);\n }\n seen.add(namespace);\n }\n}\n\n/**\n * Per-model `namespace` validation paired with\n * {@link validateNamespaceDeclarations}. Mirrors the reserved-name\n * rules so the per-model surface stays consistent with the contract-\n * level surface:\n *\n * - `__unbound__` / `__unspecified__` — reserved IR sentinels on\n * every SQL target.\n * - `unbound` on Postgres — reserved for the PSL\n * `namespace unbound { … }` opt-in.\n *\n * Additionally enforces that each per-model `namespace` either\n * references an entry in the contract's declared `namespaces` list or\n * names the Postgres late-binding keyword (`unbound`) — the latter is\n * not a \"declared namespace\" but is a legal opt-in only via PSL today,\n * so the TS surface also rejects it on the per-model side and points\n * authors at the PSL `namespace unbound { … }` block.\n *\n * The SQLite per-model `namespace` field is rejected outright (SQLite\n * has no schema concept).\n */\nfunction validatePerModelNamespaces(\n target: TargetPackRef<'sql', string>,\n namespaces: readonly string[] | undefined,\n models: Record<string, ModelLike>,\n): void {\n const declaredNamespaces = new Set<string>(namespaces ?? []);\n\n for (const [modelKey, modelBuilder] of Object.entries(models)) {\n const perModelNamespace = modelBuilder.stageOne.namespace;\n if (perModelNamespace === undefined) {\n continue;\n }\n\n if (target.targetId === 'sqlite') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"${perModelNamespace}\"\\` but the target is SQLite (SQLite has no schema concept; remove the per-model \\`namespace\\` field).`,\n );\n }\n\n if (perModelNamespace === '__unbound__' || perModelNamespace === '__unspecified__') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"${perModelNamespace}\"\\` but that name is a reserved IR sentinel and cannot appear in user code.`,\n );\n }\n\n if (target.targetId === 'postgres' && perModelNamespace === 'unbound') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"unbound\"\\` but that name is reserved by Postgres for the late-binding opt-in (use \\`namespace unbound { … }\\` in PSL instead — there is no equivalent surface in the TS builder today).`,\n );\n }\n\n if (!declaredNamespaces.has(perModelNamespace)) {\n const hint =\n declaredNamespaces.size > 0\n ? ` Declared namespaces: [${[...declaredNamespaces].map((name) => `\"${name}\"`).join(', ')}].`\n : ' The contract does not declare any namespaces; add `namespaces: [\"…\"]` to `defineContract` first.';\n throw new Error(\n `defineContract: model \"${modelKey}\" references namespace \"${perModelNamespace}\" but that name does not appear in the contract's declared \\`namespaces\\` list.${hint}`,\n );\n }\n }\n}\n\nfunction validateExtensionPackRefs(\n target: TargetPackRef<'sql', string>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): void {\n if (!extensionPacks) {\n return;\n }\n\n for (const packRef of Object.values(extensionPacks)) {\n if (packRef.kind !== 'extension') {\n throw new Error(\n `defineContract only accepts extension pack refs in extensionPacks. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== target.familyId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but contract target family is \"${target.familyId}\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== target.targetId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but contract target is \"${target.targetId}\".`,\n );\n }\n }\n}\n\nfunction buildContractFromDsl<Definition extends ContractInput>(\n definition: Definition,\n): SqlContractResult<Definition> {\n validateTargetPackRef(definition.family, definition.target);\n validateExtensionPackRefs(definition.target, definition.extensionPacks);\n validateNamespaceDeclarations(definition.target, definition.namespaces);\n validatePerModelNamespaces(\n definition.target,\n definition.namespaces,\n (definition.models ?? {}) as Record<string, ModelLike>,\n );\n\n return blindCast<\n SqlContractResult<Definition>,\n 'buildSqlContractFromDefinition return type is wide; SqlContractResult conditional resolves correctly at runtime for any concrete Definition'\n >(buildSqlContractFromDefinition(buildContractDefinition(definition), definition.codecLookup));\n}\n\n// Input for buildBoundContract — all fields from ContractInput except family/target\n// (those are injected by the builder, pre-bound at the call site).\ntype BoundDefinitionInput<\n Types extends Record<string, StorageTypeInstance | PostgresEnumStorageEntry> = Record<\n never,\n never\n >,\n Models extends Record<string, ModelLike> = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined = undefined,\n Naming extends ContractInput['naming'] | undefined = undefined,\n StorageHash extends string | undefined = undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n> = {\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Record<string, EnumTypeHandle>;\n};\n\n// Merges a bound input with the pre-bound family/target to produce a full ContractDefinition.\ntype WithFamilyTarget<\n Input,\n F extends FamilyPackRef<string>,\n T extends TargetPackRef<'sql', string>,\n> = Input & { readonly family: F; readonly target: T };\n\n/**\n * Shared builder that assembles a SqlContract with pre-bound family and target.\n * Extension wrappers keep their own public overloads and delegate their impl body here;\n * this is a plain overloaded function (not a factory returning an overloaded function)\n * so no overloaded-function-return cast is needed.\n *\n * Overload 1: definition form (no factory).\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<'sql', string>,\n const Definition extends BoundDefinitionInput<\n Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined,\n ContractInput['naming'] | undefined,\n string | undefined,\n ForeignKeyDefaultsState | undefined,\n readonly string[] | undefined\n >,\n>(\n family: F,\n target: T,\n definition: Definition,\n factory?: undefined,\n): SqlContractResult<WithFamilyTarget<Definition, F, T>>;\n/**\n * Overload 2: factory form.\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<'sql', string>,\n const Definition extends BoundDefinitionInput<\n Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined,\n ContractInput['naming'] | undefined,\n string | undefined,\n ForeignKeyDefaultsState | undefined,\n readonly string[] | undefined\n >,\n const Built extends {\n readonly types?: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>;\n readonly models?: Record<string, ModelLike>;\n },\n>(\n family: F,\n target: T,\n definition: Definition,\n factory: (\n helpers: ComposedAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,\n ) => Built,\n): SqlContractResult<WithFamilyTarget<Definition & Built, F, T>>;\n/** Implementation. */\nexport function buildBoundContract(\n family: FamilyPackRef<string>,\n target: TargetPackRef<'sql', string>,\n definition: Omit<ContractInput, 'family' | 'target'>,\n factory?:\n | ((\n helpers: ComposedAuthoringHelpers<\n FamilyPackRef<string>,\n TargetPackRef<'sql', string>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined\n >,\n ) => {\n readonly types?: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>;\n readonly models?: Record<string, ModelLike>;\n })\n | undefined,\n) {\n const full = { ...definition, family, target };\n\n if (factory !== undefined) {\n const built = factory(\n createComposedAuthoringHelpers({\n family,\n target,\n extensionPacks: definition.extensionPacks,\n }),\n );\n return buildContractFromDsl({\n ...full,\n ...ifDefined('types', built.types),\n ...ifDefined('models', built.models),\n });\n }\n\n return buildContractFromDsl(full);\n}\n\nexport function defineContract<\n const Family extends FamilyPackRef<string>,\n const Target extends TargetPackRef<'sql', string>,\n const Types extends Record<string, StorageTypeInstance | PostgresEnumStorageEntry> = Record<\n never,\n never\n >,\n const Models extends Record<string, ModelLike> = Record<never, never>,\n const ExtensionPacks extends\n | Record<string, ExtensionPackRef<'sql', string>>\n | undefined = undefined,\n const Naming extends ContractInput['naming'] | undefined = undefined,\n const StorageHash extends string | undefined = undefined,\n const ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n const Namespaces extends readonly string[] | undefined = undefined,\n>(\n definition: ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces\n >,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces\n >\n>;\nexport function defineContract<\n const Family extends FamilyPackRef<string>,\n const Target extends TargetPackRef<'sql', string>,\n const Types extends Record<string, StorageTypeInstance | PostgresEnumStorageEntry> = Record<\n never,\n never\n >,\n const Models extends Record<string, ModelLike> = Record<never, never>,\n const ExtensionPacks extends\n | Record<string, ExtensionPackRef<'sql', string>>\n | undefined = undefined,\n const Naming extends ContractInput['naming'] | undefined = undefined,\n const StorageHash extends string | undefined = undefined,\n const ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n const Namespaces extends readonly string[] | undefined = undefined,\n>(\n definition: ContractScaffold<\n Family,\n Target,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces\n >,\n factory: ContractFactory<Family, Target, Types, Models, ExtensionPacks>,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces\n >\n>;\nexport function defineContract(\n definition: ContractInput,\n factory?: ContractFactory<\n FamilyPackRef<string>,\n TargetPackRef<'sql', string>,\n Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined\n >,\n): SqlContractResult<ContractInput> {\n if (!isContractInput(definition)) {\n throw new TypeError(\n 'defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).',\n );\n }\n\n if (factory !== undefined) {\n return buildBoundContract(definition.family, definition.target, definition, factory);\n }\n return buildBoundContract(definition.family, definition.target, definition);\n}\n\nexport type {\n ComposedAuthoringHelpers,\n ContractInput,\n ContractModelBuilder,\n ModelLike,\n ScalarFieldBuilder,\n};\nexport { extensionModel, field, model, rel };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"contract-builder.mjs","names":["#handle"],"sources":["../src/authoring-helper-runtime.ts","../src/enum-type.ts","../src/contract-dsl.ts","../src/composed-authoring-helpers.ts","../src/contract-warnings.ts","../src/contract-lowering.ts","../src/contract-builder.ts"],"sourcesContent":["import type {\n AuthoringFieldNamespace,\n AuthoringFieldPresetDescriptor,\n AuthoringTypeNamespace,\n} from '@prisma-next/framework-components/authoring';\nimport {\n instantiateAuthoringTypeConstructor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n validateAuthoringHelperArguments,\n} from '@prisma-next/framework-components/authoring';\nimport { type StorageTypeInstance, toStorageTypeInstance } from '@prisma-next/sql-contract/types';\n\nexport type RuntimeNamedConstraintSpec = {\n readonly name?: string;\n};\n\nexport function isNamedConstraintOptionsLike(value: unknown): value is RuntimeNamedConstraintSpec {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.some((key) => key !== 'name')) {\n return false;\n }\n\n const name = (value as { readonly name?: unknown }).name;\n return name === undefined || typeof name === 'string';\n}\n\nconst blockedSegments = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction assertSafeHelperKey(key: string, path: readonly string[]): void {\n if (blockedSegments.has(key)) {\n throw new Error(\n `Invalid authoring helper \"${[...path, key].join('.')}\". Helper path segments must not use \"${key}\".`,\n );\n }\n}\n\nexport function createTypeHelpersFromNamespace(\n namespace: AuthoringTypeNamespace,\n path: readonly string[] = [],\n): Record<string, unknown> {\n const helpers: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(namespace)) {\n assertSafeHelperKey(key, path);\n const currentPath = [...path, key];\n\n if (isAuthoringTypeConstructorDescriptor(value)) {\n const helperPath = currentPath.join('.');\n helpers[key] = (...args: readonly unknown[]): StorageTypeInstance => {\n validateAuthoringHelperArguments(helperPath, value.args, args);\n const triple = instantiateAuthoringTypeConstructor(value, args);\n return toStorageTypeInstance({\n codecId: triple.codecId,\n nativeType: triple.nativeType,\n typeParams: triple.typeParams ?? {},\n });\n };\n continue;\n }\n\n helpers[key] = createTypeHelpersFromNamespace(value as AuthoringTypeNamespace, currentPath);\n }\n\n return helpers;\n}\n\nexport function createFieldPresetHelper<Result>(options: {\n readonly helperPath: string;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n readonly build: (options: {\n readonly args: readonly unknown[];\n readonly namedConstraintOptions?: RuntimeNamedConstraintSpec;\n }) => Result;\n}): (...rawArgs: readonly unknown[]) => Result {\n return (...rawArgs: readonly unknown[]) => {\n const acceptsNamedConstraintOptions =\n options.descriptor.output.id === true || options.descriptor.output.unique === true;\n const declaredArguments = options.descriptor.args ?? [];\n\n if (acceptsNamedConstraintOptions && rawArgs.length > declaredArguments.length + 1) {\n throw new Error(\n `${options.helperPath} expects at most ${declaredArguments.length + 1} argument(s), received ${rawArgs.length}`,\n );\n }\n\n let args = rawArgs;\n let namedConstraintOptions: RuntimeNamedConstraintSpec | undefined;\n\n if (acceptsNamedConstraintOptions && rawArgs.length === declaredArguments.length + 1) {\n const maybeNamedConstraintOptions = rawArgs.at(-1);\n if (!isNamedConstraintOptionsLike(maybeNamedConstraintOptions)) {\n throw new Error(\n `${options.helperPath} accepts an optional trailing { name?: string } constraint options object`,\n );\n }\n namedConstraintOptions = maybeNamedConstraintOptions;\n args = rawArgs.slice(0, -1);\n }\n\n validateAuthoringHelperArguments(options.helperPath, options.descriptor.args, args);\n\n return options.build({\n args,\n ...(namedConstraintOptions ? { namedConstraintOptions } : {}),\n });\n };\n}\n\nexport function createFieldHelpersFromNamespace(\n namespace: AuthoringFieldNamespace,\n createLeafHelper: (options: {\n readonly helperPath: string;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n }) => (...rawArgs: readonly unknown[]) => unknown,\n path: readonly string[] = [],\n): Record<string, unknown> {\n const helpers: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(namespace)) {\n assertSafeHelperKey(key, path);\n const currentPath = [...path, key];\n\n if (isAuthoringFieldPresetDescriptor(value)) {\n helpers[key] = createLeafHelper({\n helperPath: currentPath.join('.'),\n descriptor: value,\n });\n continue;\n }\n\n helpers[key] = createFieldHelpersFromNamespace(\n value as AuthoringFieldNamespace,\n createLeafHelper,\n currentPath,\n );\n }\n\n return helpers;\n}\n","import type { ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport { blindCast } from '@prisma-next/utils/casts';\n\n// ---------------------------------------------------------------------------\n// EnumMember — a single member declaration with literal type preservation\n// ---------------------------------------------------------------------------\n\n/**\n * A single enum member produced by `member()`. The `Name` and `Value` generics\n * are preserved as literal types so `enumType()` can carry the ordered value\n * tuple in its return type. `Value` is whatever the codec dictates — its type\n * is constrained at `enumType` against the codec's input type, not here.\n */\nexport interface EnumMember<Name extends string, Value> {\n readonly name: Name;\n readonly value: Value;\n}\n\n/**\n * Declare an enum member. The `value` defaults to `name` when omitted. The\n * value is an unconstrained literal here; `enumType` constrains it against the\n * codec's input type. Both generics are preserved as literals so downstream\n * `enumType` carries the value union in its type; the value is serialized to its\n * codec string form only at lowering.\n */\nexport function member<const Name extends string>(name: Name): EnumMember<Name, Name>;\nexport function member<const Name extends string, const Value>(\n name: Name,\n value: Value,\n): EnumMember<Name, Value>;\nexport function member<const Name extends string, const Value = Name>(\n name: Name,\n value?: Value,\n): EnumMember<Name, Value> {\n return {\n name,\n value: blindCast<\n Value,\n 'overload signatures enforce Value=Name when value is omitted; default generic Value=Name makes this safe'\n >(value ?? name),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Internal types for inferring the literal tuple from the members spread\n// ---------------------------------------------------------------------------\n\ntype MembersToValues<Members extends readonly EnumMember<string, unknown>[]> = {\n readonly [K in keyof Members]: Members[K] extends EnumMember<string, infer V> ? V : never;\n};\n\ntype MembersToNames<Members extends readonly EnumMember<string, unknown>[]> = {\n readonly [K in keyof Members]: Members[K] extends EnumMember<infer N, unknown> ? N : never;\n};\n\ntype MembersAccessorMap<Members extends readonly EnumMember<string, unknown>[]> = {\n readonly [M in Members[number] as M['name']]: M['value'];\n};\n\n// ---------------------------------------------------------------------------\n// EnumTypeHandle — the authoring handle returned by enumType()\n// ---------------------------------------------------------------------------\n\n/**\n * Internal brand that identifies an EnumTypeHandle in the lowering pipeline.\n * Not exported — callers only interact with `EnumTypeHandle`.\n */\nexport const ENUM_TYPE_HANDLE_BRAND = Symbol('EnumTypeHandle');\n\n/**\n * Authoring handle returned by `enumType()`. Carries:\n *\n * - The ordered literal value tuple (`.values`) and name tuple (`.names`)\n * so downstream type-tests can assert literal preservation.\n * - A namespaced member accessor map (`.members`) to avoid collisions with\n * `.values` / `.has` / `.nameOf` / `.ordinalOf`.\n * - Runtime helpers `.has()`, `.nameOf()`, `.ordinalOf()`.\n * - Internal metadata (`enumName`, `codecId`, `nativeType`,\n * `enumMembers`) for the lowering pipeline.\n *\n * The type is generic over the ordered value tuple so callers that assign\n * `const Role = enumType(...)` retain the literal tuple on `.values`.\n */\nexport interface EnumTypeHandle<\n Name extends string = string,\n Values extends readonly unknown[] = readonly unknown[],\n Names extends readonly string[] = readonly string[],\n MembersMap extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** Internal brand for lowering-pipeline detection. */\n readonly [ENUM_TYPE_HANDLE_BRAND]: true;\n\n /** The enum's declared name (used as the key in domain `enum` / storage `valueSet`). */\n readonly enumName: Name;\n\n /** codecId from the codec passed to `enumType`. */\n readonly codecId: string;\n\n /** nativeType from the codec passed to `enumType`. */\n readonly nativeType: string;\n\n /** Ordered member list for lowering (name + value pairs). */\n readonly enumMembers: readonly { readonly name: string; readonly value: Values[number] }[];\n\n /** Ordered literal value tuple. Declaration order is preserved. */\n readonly values: Values;\n\n /** Ordered literal name tuple. Declaration order is preserved. */\n readonly names: Names;\n\n /**\n * Namespaced accessor map: `Role.members.User === 'user'`.\n * Namespaced under `.members` to avoid collisions with `.values` / `.has`.\n */\n readonly members: MembersMap;\n\n /** Returns `true` if `v` is a declared member value. */\n has(v: Values[number]): boolean;\n\n /** Returns the member name for a value, or `undefined` if not found. */\n nameOf(v: Values[number]): string | undefined;\n\n /** Returns the zero-based declaration index of a value, or `-1` if not found. */\n ordinalOf(v: Values[number]): number;\n}\n\n// ---------------------------------------------------------------------------\n// enumType()\n// ---------------------------------------------------------------------------\n\n/**\n * A codec typemap: codecId → `{ input, output }`, the same shape the query\n * lanes consume (e.g. `{ 'pg/text@1': { input: string }, 'pg/int4@1': { input: number } }`).\n * The bound `enumType` wrappers supply the target pack's typemap; the core\n * defaults to an empty map (no codec is known), so member values stay\n * unconstrained.\n */\nexport type CodecTypeMap = Record<string, { readonly input?: unknown }>;\n\n/**\n * The application input type the codec dictates for an enum's member values:\n * looks `Codec['codecId']` up in the supplied codec typemap. When the codecId\n * isn't in the map (the core's empty default, or an unknown codec) the input is\n * unconstrained, so any member-value literal is accepted and inferred verbatim.\n */\nexport type CodecInput<\n CodecTypes extends CodecTypeMap,\n Codec extends { readonly codecId: string },\n> = Codec['codecId'] extends keyof CodecTypes\n ? CodecTypes[Codec['codecId']] extends { readonly input: infer In }\n ? In\n : unknown\n : unknown;\n\n/**\n * Declare a domain enum for use in TS-authoring contracts.\n *\n * - The codec is an explicit required argument — the `codecId` and\n * `nativeType` are taken from the passed `ColumnTypeDescriptor` (e.g.\n * `{ codecId: 'pg/text@1', nativeType: 'text' }` from a field preset\n * output or a direct inline object).\n * - `const` generics on the members spread preserve the ordered literal\n * value tuple so `Role.values` is `readonly ['user','admin']`, not\n * `string[]`.\n * - Well-formedness assertions at construction: non-empty member list;\n * unique names; unique values.\n *\n * The returned handle wires into `field.namedType(handle)` to set\n * `valueSet` refs on both the domain field and the storage column.\n *\n * @example\n * ```ts\n * const Role = enumType('Role', { codecId: 'pg/text@1', nativeType: 'text' },\n * member('User', 'user'),\n * member('Admin', 'admin'),\n * );\n * // Role.values → readonly ['user', 'admin']\n * // Role.members.User → 'user'\n * ```\n */\nexport function enumType<\n CodecTypes extends CodecTypeMap = Record<string, never>,\n const Name extends string = string,\n const Codec extends Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'> = Pick<\n ColumnTypeDescriptor,\n 'codecId' | 'nativeType'\n >,\n const Members extends readonly [\n EnumMember<string, CodecInput<CodecTypes, Codec>>,\n ...EnumMember<string, CodecInput<CodecTypes, Codec>>[],\n ] = readonly [EnumMember<string, CodecInput<CodecTypes, Codec>>],\n>(\n name: Name,\n codec: Codec,\n ...members: Members\n): EnumTypeHandle<\n Name,\n MembersToValues<[...Members]>,\n MembersToNames<[...Members]>,\n MembersAccessorMap<[...Members]>\n>;\nexport function enumType(\n name: string,\n codec: Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n ...members: EnumMember<string, unknown>[]\n): EnumTypeHandle;\nexport function enumType(\n name: string,\n codec: Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n ...members: EnumMember<string, unknown>[]\n): EnumTypeHandle {\n if (members.length === 0) {\n throw new Error(`enumType(\"${name}\"): must have at least one member.`);\n }\n\n const seenNames = new Set<string>();\n const seenValues = new Set<string>();\n for (const m of members) {\n if (seenNames.has(m.name)) {\n throw new Error(\n `enumType(\"${name}\"): duplicate member name \"${m.name}\". Member names must be unique.`,\n );\n }\n seenNames.add(m.name);\n\n const loweredValue = String(m.value);\n if (seenValues.has(loweredValue)) {\n throw new Error(\n `enumType(\"${name}\"): duplicate member value \"${loweredValue}\". Member values must be unique.`,\n );\n }\n seenValues.add(loweredValue);\n }\n\n const values = Object.freeze(members.map((m) => m.value));\n const names = Object.freeze(members.map((m) => m.name));\n const enumMembers = Object.freeze(members.map((m) => ({ name: m.name, value: m.value })));\n\n const membersAccessor = Object.freeze(Object.fromEntries(members.map((m) => [m.name, m.value])));\n\n const valueSet = new Set(values);\n const valueToName = new Map(members.map((m) => [m.value, m.name]));\n const valueToOrdinal = new Map(values.map((v, i) => [v, i]));\n\n return {\n [ENUM_TYPE_HANDLE_BRAND]: true,\n enumName: name,\n codecId: codec.codecId,\n nativeType: codec.nativeType,\n enumMembers,\n values,\n names,\n members: membersAccessor,\n has: (v: unknown) => valueSet.has(v),\n nameOf: (v: unknown) => valueToName.get(v),\n ordinalOf: (v: unknown) => valueToOrdinal.get(v) ?? -1,\n };\n}\n\n/**\n * The signature of an `enumType` whose codec typemap is already bound — the\n * shape a target-bound wrapper (e.g. `@prisma-next/postgres/contract-builder`)\n * exposes. The member values are constrained to the codec's input type drawn\n * from `CodecTypes` (so a `pg/text@1` codec rejects numeric members, etc.),\n * while `Name`, `Codec`, and the member tuple still infer from the call.\n */\nexport type BoundEnumType<CodecTypes extends CodecTypeMap> = <\n const Name extends string,\n const Codec extends Pick<ColumnTypeDescriptor, 'codecId' | 'nativeType'>,\n const Members extends readonly [\n EnumMember<string, CodecInput<CodecTypes, Codec>>,\n ...EnumMember<string, CodecInput<CodecTypes, Codec>>[],\n ],\n>(\n name: Name,\n codec: Codec,\n ...members: Members\n) => EnumTypeHandle<\n Name,\n MembersToValues<[...Members]>,\n MembersToNames<[...Members]>,\n MembersAccessorMap<[...Members]>\n>;\n\n/**\n * Bind `enumType` to a target's codec typemap. The returned function is the\n * same runtime `enumType`, retyped so member values are constrained to the\n * codec's input type. Target packages call this with their pack's\n * `ExtractCodecTypesFromPack<Pack>` to expose a codec-aware `enumType`.\n */\nexport function bindEnumType<CodecTypes extends CodecTypeMap>(): BoundEnumType<CodecTypes> {\n return enumType;\n}\n\n/**\n * Returns true when the value is an `EnumTypeHandle` produced by\n * `enumType()`. Used in the lowering pipeline to detect enum handles\n * in field state without importing the BRAND symbol at every call site.\n */\nexport function isEnumTypeHandle(value: unknown): value is EnumTypeHandle {\n return (\n typeof value === 'object' &&\n value !== null &&\n Reflect.get(value, ENUM_TYPE_HANDLE_BRAND) === true\n );\n}\n","import type {\n ColumnDefault,\n ColumnDefaultLiteralInputValue,\n ControlPolicy,\n ExecutionMutationDefaultPhases,\n ExecutionMutationDefaultValue,\n} from '@prisma-next/contract/types';\nimport { isColumnDefault } from '@prisma-next/contract/types';\nimport type { ForeignKeyDefaultsState } from '@prisma-next/contract-authoring';\nimport type { AuthoringFieldPresetDescriptor } from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringFieldPreset } from '@prisma-next/framework-components/authoring';\nimport type { CodecLookup, ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport type { Namespace } from '@prisma-next/framework-components/ir';\nimport type { SqlNamespaceTablesInput, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { NamedConstraintSpec } from './authoring-type-utils';\nimport type { EnumTypeHandle } from './enum-type';\nimport { isEnumTypeHandle } from './enum-type';\n\nexport type NamingStrategy = 'identity' | 'snake_case';\n\nexport type NamingConfig = {\n readonly tables?: NamingStrategy;\n readonly columns?: NamingStrategy;\n};\n\ntype NamedStorageTypeRef = string | StorageTypeInstance | EnumTypeHandle;\n\ntype NamedConstraintNameSpec<Name extends string = string> = {\n readonly name: Name;\n};\n\nexport type ScalarFieldState<\n CodecId extends string = string,\n TypeRef extends NamedStorageTypeRef | undefined = undefined,\n Nullable extends boolean = boolean,\n ColumnName extends string | undefined = string | undefined,\n IdSpec extends NamedConstraintSpec | undefined = undefined,\n UniqueSpec extends NamedConstraintSpec | undefined = undefined,\n> = {\n readonly kind: 'scalar';\n readonly descriptor?: (ColumnTypeDescriptor & { readonly codecId: CodecId }) | undefined;\n readonly typeRef?: TypeRef | undefined;\n readonly nullable: Nullable;\n readonly columnName?: ColumnName | undefined;\n readonly default?: ColumnDefault | undefined;\n readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;\n} & (IdSpec extends NamedConstraintSpec ? { readonly id: IdSpec } : { readonly id?: undefined }) &\n (UniqueSpec extends NamedConstraintSpec\n ? { readonly unique: UniqueSpec }\n : { readonly unique?: undefined });\n\ntype AnyScalarFieldState = {\n readonly kind: 'scalar';\n readonly descriptor?: (ColumnTypeDescriptor & { readonly codecId: string }) | undefined;\n readonly typeRef?: NamedStorageTypeRef | undefined;\n readonly nullable: boolean;\n readonly columnName?: string | undefined;\n readonly default?: ColumnDefault | undefined;\n readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;\n readonly id?: NamedConstraintSpec | undefined;\n readonly unique?: NamedConstraintSpec | undefined;\n};\n\ntype HasNamedConstraintId<State extends AnyScalarFieldState> =\n State extends ScalarFieldState<\n string,\n NamedStorageTypeRef | undefined,\n boolean,\n string | undefined,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? IdSpec extends NamedConstraintSpec\n ? true\n : false\n : false;\n\ntype HasNamedConstraintUnique<State extends AnyScalarFieldState> =\n State extends ScalarFieldState<\n string,\n NamedStorageTypeRef | undefined,\n boolean,\n string | undefined,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? UniqueSpec extends NamedConstraintSpec\n ? true\n : false\n : false;\n\ntype FieldSqlSpecForState<State extends AnyScalarFieldState> = {\n readonly column?: string;\n} & (HasNamedConstraintId<State> extends true\n ? { readonly id?: NamedConstraintNameSpec }\n : Record<never, never>) &\n (HasNamedConstraintUnique<State> extends true\n ? { readonly unique?: NamedConstraintNameSpec }\n : Record<never, never>);\n\ntype ApplyFieldSqlSpec<\n State extends AnyScalarFieldState,\n Spec extends FieldSqlSpecForState<State>,\n> =\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n Spec extends { readonly column: infer NextColumn extends string } ? NextColumn : ColumnName,\n Spec extends { readonly id: { readonly name: infer IdName extends string } }\n ? IdSpec extends NamedConstraintSpec\n ? NamedConstraintSpec<IdName>\n : IdSpec\n : IdSpec,\n Spec extends { readonly unique: { readonly name: infer UniqueName extends string } }\n ? UniqueSpec extends NamedConstraintSpec\n ? NamedConstraintSpec<UniqueName>\n : UniqueSpec\n : UniqueSpec\n >\n : never;\n\nexport type GeneratedFieldSpec = {\n readonly type: ColumnTypeDescriptor;\n readonly typeParams?: Record<string, unknown>;\n readonly generated: ExecutionMutationDefaultValue;\n};\n\nfunction toColumnDefault(value: ColumnDefaultLiteralInputValue | ColumnDefault): ColumnDefault {\n if (isColumnDefault(value)) {\n return value;\n }\n return { kind: 'literal', value };\n}\n\n// Chaining methods use `as unknown as <ConditionalType>` because TypeScript cannot narrow generic conditional return types through object spread. The runtime values are correct — the casts bridge the gap between the spread result and the compile-time conditional type that encodes the state transition.\nexport class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFieldState> {\n declare readonly __state: State;\n\n constructor(private readonly state: State) {}\n\n /**\n * Returns the physical column name when `.column(name)` was called, or\n * `undefined` when the field uses the default (logical field name) mapping.\n * Used by cross-space FK lowering to stamp the physical column name onto\n * `TargetFieldRef.columnName` so FK target columns are resolved correctly.\n */\n get physicalColumnName(): string | undefined {\n return this.state.columnName;\n }\n\n optional(): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n boolean,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n nullable: true,\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n boolean,\n infer ColumnName,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>\n : never);\n }\n\n column<ColumnName extends string>(\n name: ColumnName,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n string | undefined,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n columnName: name,\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n string | undefined,\n infer IdSpec,\n infer UniqueSpec\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>\n : never);\n }\n\n default(value: ColumnDefaultLiteralInputValue | ColumnDefault): ScalarFieldBuilder<State> {\n return new ScalarFieldBuilder({\n ...this.state,\n default: toColumnDefault(value),\n }) as ScalarFieldBuilder<State>;\n }\n\n defaultSql(expression: string): ScalarFieldBuilder<State> {\n return new ScalarFieldBuilder({\n ...this.state,\n default: { kind: 'function', expression },\n }) as ScalarFieldBuilder<State>;\n }\n\n id<const Name extends string | undefined = undefined>(\n options?: NamedConstraintSpec<Name>,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n ColumnName,\n NamedConstraintSpec<Name>,\n UniqueSpec\n >\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n id: options?.name ? { name: options.name } : {},\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n NamedConstraintSpec | undefined,\n infer UniqueSpec\n >\n ? ScalarFieldState<\n CodecId,\n TypeRef,\n Nullable,\n ColumnName,\n NamedConstraintSpec<Name>,\n UniqueSpec\n >\n : never);\n }\n\n unique<const Name extends string | undefined = undefined>(\n options?: NamedConstraintSpec<Name>,\n ): ScalarFieldBuilder<\n State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>\n : never\n > {\n return new ScalarFieldBuilder({\n ...this.state,\n unique: options?.name ? { name: options.name } : {},\n } as unknown as State extends ScalarFieldState<\n infer CodecId,\n infer TypeRef,\n infer Nullable,\n infer ColumnName,\n infer IdSpec,\n NamedConstraintSpec | undefined\n >\n ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>\n : never);\n }\n\n sql<const Spec extends FieldSqlSpecForState<State>>(\n spec: Spec,\n ): ScalarFieldBuilder<ApplyFieldSqlSpec<State, Spec>> {\n const idSpec = 'id' in spec ? spec.id : undefined;\n const uniqueSpec = 'unique' in spec ? spec.unique : undefined;\n\n if (idSpec && !this.state.id) {\n throw new Error('field.sql({ id }) requires an existing inline .id(...) declaration.');\n }\n if (uniqueSpec && !this.state.unique) {\n throw new Error(\n 'field.sql({ unique }) requires an existing inline .unique(...) declaration.',\n );\n }\n\n return new ScalarFieldBuilder({\n ...this.state,\n ...(spec.column ? { columnName: spec.column } : {}),\n ...(idSpec ? { id: { name: idSpec.name } } : {}),\n ...(uniqueSpec ? { unique: { name: uniqueSpec.name } } : {}),\n } as unknown as ApplyFieldSqlSpec<State, Spec>);\n }\n\n build(): State {\n return this.state;\n }\n}\n\nexport class EnumScalarFieldBuilder<\n Handle extends EnumTypeHandle,\n State extends AnyScalarFieldState = ScalarFieldState<Handle['codecId'], Handle, false, undefined>,\n> extends ScalarFieldBuilder<State> {\n readonly #handle: Handle;\n\n constructor(state: State, handle: Handle) {\n super(state);\n this.#handle = handle;\n }\n\n override default(value: Handle['values'][number]): EnumScalarFieldBuilder<Handle, State> {\n return blindCast<\n EnumScalarFieldBuilder<Handle, State>,\n 'object spread does not narrow the generic State conditional; runtime shape is correct'\n >(\n new EnumScalarFieldBuilder(\n { ...this.build(), default: { kind: 'literal', value } },\n this.#handle,\n ),\n );\n }\n\n override defaultSql(_expression: never): never {\n throw new Error(\n 'defaultSql is not available on an enum field; use .default(members.X) instead',\n );\n }\n}\n\nfunction columnField<Descriptor extends ColumnTypeDescriptor>(\n descriptor: Descriptor,\n): ScalarFieldBuilder<ScalarFieldState<Descriptor['codecId'], undefined, false, undefined>> {\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor,\n nullable: false,\n });\n}\n\nfunction generatedField<Descriptor extends ColumnTypeDescriptor>(\n spec: GeneratedFieldSpec & { readonly type: Descriptor },\n): ScalarFieldBuilder<ScalarFieldState<Descriptor['codecId'], undefined, false, undefined>> {\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor: {\n ...spec.type,\n ...(spec.typeParams ? { typeParams: spec.typeParams } : {}),\n },\n nullable: false,\n executionDefaults: { onCreate: spec.generated },\n });\n}\n\nfunction namedTypeField<TypeRef extends string>(\n typeRef: TypeRef,\n): ScalarFieldBuilder<ScalarFieldState<string, TypeRef, false, undefined>>;\nfunction namedTypeField<TypeRef extends StorageTypeInstance>(\n typeRef: TypeRef,\n): ScalarFieldBuilder<ScalarFieldState<TypeRef['codecId'], TypeRef, false, undefined>>;\nfunction namedTypeField<Handle extends EnumTypeHandle>(\n typeRef: Handle,\n): EnumScalarFieldBuilder<Handle>;\nfunction namedTypeField(typeRef: NamedStorageTypeRef): ScalarFieldBuilder {\n if (isEnumTypeHandle(typeRef)) {\n return new EnumScalarFieldBuilder(\n {\n kind: 'scalar',\n typeRef,\n nullable: false,\n },\n typeRef,\n );\n }\n return new ScalarFieldBuilder({\n kind: 'scalar',\n typeRef,\n nullable: false,\n });\n}\n\nexport function buildFieldPreset(\n descriptor: AuthoringFieldPresetDescriptor,\n args: readonly unknown[],\n namedConstraintOptions?: NamedConstraintSpec,\n): ScalarFieldBuilder {\n const preset = instantiateAuthoringFieldPreset(descriptor, args);\n\n return new ScalarFieldBuilder({\n kind: 'scalar',\n descriptor: preset.descriptor,\n nullable: preset.nullable,\n ...ifDefined('default', preset.default),\n ...ifDefined('executionDefaults', preset.executionDefaults),\n ...(preset.id\n ? {\n id: namedConstraintOptions?.name ? { name: namedConstraintOptions.name } : {},\n }\n : {}),\n ...(preset.unique\n ? {\n unique: namedConstraintOptions?.name ? { name: namedConstraintOptions.name } : {},\n }\n : {}),\n });\n}\n\ntype RelationModelRefSource = 'string' | 'token' | 'lazyToken';\ntype TargetFieldRefSource = 'string' | 'token';\n\ntype EagerRelationModelName<\n ModelName extends string = string,\n Source extends Exclude<RelationModelRefSource, 'lazyToken'> = Exclude<\n RelationModelRefSource,\n 'lazyToken'\n >,\n> = {\n readonly kind: 'relationModelName';\n readonly source: Source;\n readonly modelName: ModelName;\n};\n\ntype LazyRelationModelName<ModelName extends string = string> = {\n readonly kind: 'lazyRelationModelName';\n readonly source: 'lazyToken';\n readonly resolve: () => ModelName;\n};\n\ntype RelationModelSource<ModelName extends string = string> =\n | EagerRelationModelName<ModelName>\n | LazyRelationModelName<ModelName>;\n\ntype BelongsToRelation<\n ToModel extends string = string,\n FromField extends string | readonly string[] = string | readonly string[],\n ToField extends string | readonly string[] = string | readonly string[],\n SqlSpec extends BelongsToRelationSqlSpec | undefined = undefined,\n> = {\n readonly kind: 'belongsTo';\n readonly toModel: RelationModelSource<ToModel>;\n readonly from: FromField;\n readonly to: ToField;\n readonly sql?: SqlSpec;\n /**\n * Contract-space identity of the target model. Populated when\n * `belongsTo` receives a cross-space branded handle. Absent for\n * local (same-space) relations.\n */\n readonly spaceId?: string;\n /**\n * Physical table name of the cross-space target model. Only set\n * when `spaceId` is present; read from the handle's `tableName`.\n */\n readonly tableName?: string;\n /**\n * Namespace coordinate of the cross-space target model.\n * Only set when `spaceId` is present.\n */\n readonly namespaceId?: string;\n};\n\ntype HasManyRelation<\n ToModel extends string = string,\n ByField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'hasMany';\n readonly toModel: RelationModelSource<ToModel>;\n readonly by: ByField;\n};\n\ntype HasOneRelation<\n ToModel extends string = string,\n ByField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'hasOne';\n readonly toModel: RelationModelSource<ToModel>;\n readonly by: ByField;\n};\n\ntype ManyToManyRelation<\n ToModel extends string = string,\n ThroughModel extends string = string,\n FromField extends string | readonly string[] = string | readonly string[],\n ToField extends string | readonly string[] = string | readonly string[],\n> = {\n readonly kind: 'manyToMany';\n readonly toModel: RelationModelSource<ToModel>;\n readonly through: RelationModelSource<ThroughModel>;\n readonly from: FromField;\n readonly to: ToField;\n};\n\nexport type RelationState =\n | BelongsToRelation<\n string,\n string | readonly string[],\n string | readonly string[],\n BelongsToRelationSqlSpec | undefined\n >\n | HasManyRelation\n | HasOneRelation\n | ManyToManyRelation;\n\ntype AnyRelationState = RelationState;\nexport type AnyRelationBuilder = RelationBuilder<AnyRelationState>;\n\ntype ApplyBelongsToRelationSqlSpec<\n State extends RelationState,\n SqlSpec extends BelongsToRelationSqlSpec,\n> =\n State extends BelongsToRelation<\n infer ToModel,\n infer FromField,\n infer ToField,\n BelongsToRelationSqlSpec | undefined\n >\n ? BelongsToRelation<ToModel, FromField, ToField, SqlSpec>\n : never;\n\nexport class RelationBuilder<State extends RelationState = AnyRelationState> {\n declare readonly __state: State;\n\n constructor(private readonly state: State) {}\n\n sql<const SqlSpec extends BelongsToRelationSqlSpec>(\n this: State extends BelongsToRelation<\n string,\n string | readonly string[],\n string | readonly string[],\n BelongsToRelationSqlSpec | undefined\n >\n ? RelationBuilder<State>\n : never,\n spec: SqlSpec,\n ): RelationBuilder<ApplyBelongsToRelationSqlSpec<State, SqlSpec>> {\n if (this.state.kind !== 'belongsTo') {\n throw new Error('relation.sql(...) is only supported for belongsTo relations.');\n }\n\n return new RelationBuilder({\n ...this.state,\n sql: spec,\n } as ApplyBelongsToRelationSqlSpec<State, SqlSpec>);\n }\n\n build(): State {\n return this.state;\n }\n}\n\n/**\n * Reference to a column on the current (local) model.\n *\n * Source columns are always local to the contract being authored. The\n * cross-space brand lives on `TargetFieldRef` (the target side of a foreign\n * key), not here.\n */\nexport type ColumnRef<FieldName extends string = string> = {\n readonly kind: 'columnRef';\n readonly fieldName: FieldName;\n};\n\n/**\n * Reference to a field on a target model, produced by model `.refs` and\n * `constraints.ref(modelName, fieldName)`.\n *\n * The `TSpaceId` phantom parameter carries the contract-space identity of the\n * target model. Local model handles produce `TSpaceId = '<self>'`; extension\n * handles carry the extension's `spaceId`. The brand is propagated from the\n * parent `ContractModelBuilder` via the `spaceId?` property: absent means local\n * (`'<self>'`), present means cross-space.\n */\nexport type TargetFieldRef<\n ModelName extends string = string,\n FieldName extends string = string,\n TSpaceId extends string = string,\n> = {\n readonly kind: 'targetFieldRef';\n readonly source: TargetFieldRefSource;\n readonly modelName: ModelName;\n readonly fieldName: FieldName;\n /**\n * Cross-space discriminator. When present, the referenced model lives in a\n * different contract space identified by this value. Absent for local refs.\n */\n readonly spaceId?: TSpaceId extends '<self>' ? never : TSpaceId;\n /**\n * Namespace id of the cross-space target model (e.g. `'auth'` for\n * `supabase` `auth.User`). Only present for cross-space refs.\n */\n readonly namespaceId?: string;\n /**\n * Physical table name of the cross-space target model. Only present for\n * cross-space refs; allows the lowering path to bypass the local model\n * registry.\n */\n readonly tableName?: string;\n /**\n * Physical column name of the target field. Populated for cross-space refs\n * when the extension handle's field used `.column(name)` to rename the\n * physical column. When absent the logical `fieldName` is used as the column\n * name. Only relevant for cross-space FK lowering — local FKs resolve column\n * names via the local `fieldToColumn` map.\n */\n readonly columnName?: string;\n};\n\nexport type ModelTokenRefs<\n ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n TSpaceId extends string = '<self>',\n> = {\n readonly [K in keyof Fields]: TargetFieldRef<ModelName, K & string, TSpaceId>;\n};\n\ntype ConstraintOptions<Name extends string | undefined = string | undefined> = {\n readonly name?: Name;\n};\n\nexport type IndexTypeMap = Record<string, { readonly options: unknown }>;\n\ntype IndexInput<\n Name extends string | undefined,\n IndexTypes extends IndexTypeMap,\n> = keyof IndexTypes extends never\n ? ConstraintOptions<Name>\n :\n | (ConstraintOptions<Name> & { readonly type?: never; readonly options?: never })\n | {\n readonly [K in keyof IndexTypes & string]: ConstraintOptions<Name> & {\n readonly type: K;\n readonly options: IndexTypes[K]['options'];\n };\n }[keyof IndexTypes & string];\n\ntype ForeignKeyOptions<Name extends string | undefined = string | undefined> =\n ConstraintOptions<Name> & {\n readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly constraint?: boolean;\n readonly index?: boolean;\n };\n\ntype BelongsToRelationSqlSpec<Name extends string | undefined = string | undefined> = {\n readonly fk?: ForeignKeyOptions<Name>;\n};\n\nexport type IdConstraint<\n FieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'id';\n readonly fields: FieldNames;\n readonly name?: Name;\n};\n\nexport type UniqueConstraint<FieldNames extends readonly string[] = readonly string[]> = {\n readonly kind: 'unique';\n readonly fields: FieldNames;\n readonly name?: string;\n};\n\nexport type IndexConstraint<\n FieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'index';\n readonly fields: FieldNames;\n readonly name?: Name;\n readonly type?: string;\n readonly options?: Record<string, unknown>;\n};\n\nexport type ForeignKeyConstraint<\n SourceFieldNames extends readonly string[] = readonly string[],\n TargetModelName extends string = string,\n TargetFieldNames extends readonly string[] = readonly string[],\n Name extends string | undefined = string | undefined,\n> = {\n readonly kind: 'fk';\n readonly fields: SourceFieldNames;\n readonly targetModel: TargetModelName;\n readonly targetFields: TargetFieldNames;\n readonly targetSource?: TargetFieldRefSource;\n /**\n * Cross-space discriminator. When present, the FK target lives in a\n * different contract space identified by this value. Absent for local FKs.\n */\n readonly targetSpaceId?: string;\n /**\n * Namespace coordinate of the cross-space target model. Populated when\n * the target model handle carries a `namespace` (e.g. `auth` for supabase\n * `auth.User`). Absent for local FKs.\n */\n readonly targetNamespaceId?: string;\n /**\n * Table name of the cross-space target. Populated for cross-space FKs\n * so the lowering path doesn't need a local model lookup.\n */\n readonly targetTableName?: string;\n readonly name?: Name;\n readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n readonly constraint?: boolean;\n readonly index?: boolean;\n};\n\nfunction normalizeFieldRefInput(input: ColumnRef | readonly ColumnRef[]): readonly string[] {\n return (Array.isArray(input) ? input : [input]).map((ref) => ref.fieldName);\n}\n\nfunction normalizeTargetFieldRefInput(input: TargetFieldRef | readonly TargetFieldRef[]): {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly source: TargetFieldRefSource;\n readonly spaceId: string | undefined;\n readonly namespaceId: string | undefined;\n readonly tableName: string | undefined;\n} {\n const refs = Array.isArray(input) ? input : [input];\n const [first] = refs;\n if (!first) {\n throw new Error('Expected at least one target ref');\n }\n if (refs.some((ref) => ref.modelName !== first.modelName)) {\n throw new Error('All target refs in a foreign key must point to the same model');\n }\n // F-compound: all refs in a compound FK must share the same cross-space coordinate.\n // A mismatch in spaceId, namespaceId, or tableName means the refs come from\n // different spaces despite having the same modelName — an impossible FK.\n if (refs.some((ref) => ref.spaceId !== first.spaceId)) {\n throw new Error(\n `All target refs in a compound foreign key must share the same spaceId (found mismatch: \"${first.spaceId ?? '<local>'}\" vs \"${refs.find((r) => r.spaceId !== first.spaceId)?.spaceId ?? '<local>'}\")`,\n );\n }\n if (refs.some((ref) => ref.namespaceId !== first.namespaceId)) {\n throw new Error(\n 'All target refs in a compound foreign key must share the same namespaceId (found mismatch)',\n );\n }\n if (refs.some((ref) => ref.tableName !== first.tableName)) {\n throw new Error(\n 'All target refs in a compound foreign key must share the same tableName (found mismatch)',\n );\n }\n return {\n modelName: first.modelName,\n // F-col: for cross-space refs, prefer the physical column name (columnName) over\n // the logical field name. Local refs have no columnName and use fieldName directly.\n fieldNames: refs.map((ref) => ref.columnName ?? ref.fieldName),\n source: refs.some((ref) => ref.source === 'string') ? 'string' : 'token',\n spaceId: first.spaceId,\n namespaceId: first.namespaceId,\n tableName: first.tableName,\n };\n}\n\nfunction createConstraintsDsl<IndexTypes extends IndexTypeMap = Record<never, never>>() {\n function ref<ModelName extends string, FieldName extends string>(\n modelName: ModelName,\n fieldName: FieldName,\n ): TargetFieldRef<ModelName, FieldName> {\n return {\n kind: 'targetFieldRef',\n source: 'string',\n modelName,\n fieldName,\n };\n }\n\n function id<FieldName extends string, Name extends string | undefined = undefined>(\n field: ColumnRef<FieldName>,\n options?: NamedConstraintSpec<Name>,\n ): IdConstraint<readonly [FieldName], Name>;\n function id<FieldNames extends readonly string[], Name extends string | undefined = undefined>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: NamedConstraintSpec<Name>,\n ): IdConstraint<FieldNames, Name>;\n function id(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n options?: NamedConstraintSpec,\n ): IdConstraint {\n return {\n kind: 'id',\n fields: normalizeFieldRefInput(fieldOrFields),\n ...(options?.name ? { name: options.name } : {}),\n };\n }\n\n function unique<FieldName extends string>(\n field: ColumnRef<FieldName>,\n options?: ConstraintOptions,\n ): UniqueConstraint<readonly [FieldName]>;\n function unique<FieldNames extends readonly string[]>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: ConstraintOptions,\n ): UniqueConstraint<FieldNames>;\n function unique(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n options?: ConstraintOptions,\n ): UniqueConstraint {\n return {\n kind: 'unique',\n fields: normalizeFieldRefInput(fieldOrFields),\n ...(options?.name ? { name: options.name } : {}),\n };\n }\n\n function index<FieldNames extends readonly string[], Name extends string | undefined = undefined>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: IndexInput<Name, IndexTypes>,\n ): IndexConstraint<FieldNames, Name>;\n function index(\n fields: readonly ColumnRef[],\n options?: {\n readonly name?: string;\n readonly type?: string;\n readonly options?: unknown;\n },\n ): IndexConstraint {\n return {\n kind: 'index',\n fields: normalizeFieldRefInput(fields),\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.type !== undefined ? { type: options.type } : {}),\n ...(options?.options !== undefined\n ? { options: options.options as Record<string, unknown> }\n : {}),\n };\n }\n\n function foreignKey<\n SourceFieldName extends string,\n TargetModelName extends string,\n TargetFieldName extends string,\n Name extends string | undefined = undefined,\n >(\n field: ColumnRef<SourceFieldName>,\n target: TargetFieldRef<TargetModelName, TargetFieldName>,\n options?: ForeignKeyOptions<Name>,\n ): ForeignKeyConstraint<\n readonly [SourceFieldName],\n TargetModelName,\n readonly [TargetFieldName],\n Name\n >;\n function foreignKey<\n SourceFieldNames extends readonly string[],\n TargetModelName extends string,\n TargetFieldNames extends readonly string[],\n Name extends string | undefined = undefined,\n >(\n fields: { readonly [K in keyof SourceFieldNames]: ColumnRef<SourceFieldNames[K] & string> },\n target: {\n readonly [K in keyof TargetFieldNames]: TargetFieldRef<\n TargetModelName,\n TargetFieldNames[K] & string\n >;\n },\n options?: ForeignKeyOptions<Name>,\n ): ForeignKeyConstraint<SourceFieldNames, TargetModelName, TargetFieldNames, Name>;\n function foreignKey(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n target: TargetFieldRef | readonly TargetFieldRef[],\n options?: ForeignKeyOptions,\n ): ForeignKeyConstraint {\n const normalizedTarget = normalizeTargetFieldRefInput(target);\n return {\n kind: 'fk',\n fields: normalizeFieldRefInput(fieldOrFields),\n targetModel: normalizedTarget.modelName,\n targetFields: normalizedTarget.fieldNames,\n targetSource: normalizedTarget.source,\n ...(normalizedTarget.spaceId !== undefined\n ? { targetSpaceId: normalizedTarget.spaceId }\n : {}),\n ...(normalizedTarget.namespaceId !== undefined\n ? { targetNamespaceId: normalizedTarget.namespaceId }\n : {}),\n ...(normalizedTarget.tableName !== undefined\n ? { targetTableName: normalizedTarget.tableName }\n : {}),\n ...(options?.name ? { name: options.name } : {}),\n ...(options?.onDelete ? { onDelete: options.onDelete } : {}),\n ...(options?.onUpdate ? { onUpdate: options.onUpdate } : {}),\n ...(options?.constraint !== undefined ? { constraint: options.constraint } : {}),\n ...(options?.index !== undefined ? { index: options.index } : {}),\n };\n }\n\n return {\n ref,\n id,\n unique,\n index,\n foreignKey,\n };\n}\n\nexport type ConstraintsDsl = ReturnType<typeof createConstraintsDsl>;\n\nexport type ModelAttributesSpec = {\n readonly id?: IdConstraint;\n readonly uniques?: readonly UniqueConstraint[];\n};\n\nexport type SqlStageSpec = {\n readonly table?: string;\n readonly control?: ControlPolicy;\n readonly indexes?: readonly IndexConstraint[];\n readonly foreignKeys?: readonly ForeignKeyConstraint[];\n};\n\ntype FieldRefs<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly [K in keyof Fields]: ColumnRef<K & string>;\n};\n\ntype AttributeContext<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly fields: FieldRefs<Fields>;\n readonly constraints: Pick<ConstraintsDsl, 'id' | 'unique'>;\n};\n\ntype PackAwareIndex<IndexTypes extends IndexTypeMap> = <\n FieldNames extends readonly string[],\n Name extends string | undefined = undefined,\n>(\n fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> },\n options?: IndexInput<Name, IndexTypes>,\n) => IndexConstraint<FieldNames, Name>;\n\ntype PackAwareSqlConstraints<IndexTypes extends IndexTypeMap> = {\n readonly foreignKey: ConstraintsDsl['foreignKey'];\n readonly ref: ConstraintsDsl['ref'];\n readonly index: PackAwareIndex<IndexTypes>;\n};\n\nexport type SqlContext<\n Fields extends Record<string, ScalarFieldBuilder>,\n IndexTypes extends IndexTypeMap = Record<never, never>,\n> = {\n readonly cols: FieldRefs<Fields>;\n readonly constraints: PackAwareSqlConstraints<IndexTypes>;\n};\n\nfunction createFieldRefs<Fields extends Record<string, ScalarFieldBuilder>>(\n fields: Fields,\n): FieldRefs<Fields> {\n const refs = {} as Record<string, ColumnRef>;\n for (const fieldName of Object.keys(fields)) {\n refs[fieldName] = { kind: 'columnRef', fieldName };\n }\n return refs as FieldRefs<Fields>;\n}\n\nfunction createModelTokenRefs<\n ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n TSpaceId extends string = '<self>',\n>(\n modelName: ModelName,\n fields: Fields,\n crossSpaceCoordinate?: {\n readonly spaceId: TSpaceId;\n readonly namespaceId?: string;\n readonly tableName?: string;\n },\n): ModelTokenRefs<ModelName, Fields, TSpaceId> {\n const refs = {} as Record<string, TargetFieldRef>;\n for (const [fieldName, fieldBuilder] of Object.entries(fields)) {\n const physicalColumn =\n crossSpaceCoordinate !== undefined ? fieldBuilder.physicalColumnName : undefined;\n refs[fieldName] = {\n kind: 'targetFieldRef',\n source: 'token',\n modelName,\n fieldName,\n ...(crossSpaceCoordinate !== undefined\n ? {\n spaceId: crossSpaceCoordinate.spaceId,\n ...(crossSpaceCoordinate.namespaceId !== undefined\n ? { namespaceId: crossSpaceCoordinate.namespaceId }\n : {}),\n ...(crossSpaceCoordinate.tableName !== undefined\n ? { tableName: crossSpaceCoordinate.tableName }\n : {}),\n ...(physicalColumn !== undefined ? { columnName: physicalColumn } : {}),\n }\n : {}),\n };\n }\n return refs as ModelTokenRefs<ModelName, Fields, TSpaceId>;\n}\n\ntype StageInput<Context, Spec> = Spec | ((context: Context) => Spec);\n\nfunction buildStageSpec<Context, Spec>(\n stageInput: StageInput<Context, Spec>,\n context: Context,\n): Spec {\n if (typeof stageInput === 'function') {\n return (stageInput as (context: Context) => Spec)(context);\n }\n return stageInput;\n}\n\nfunction createAttributeConstraintsDsl(): AttributeContext<\n Record<string, ScalarFieldBuilder>\n>['constraints'] {\n const constraints = createConstraintsDsl();\n return {\n id: constraints.id,\n unique: constraints.unique,\n };\n}\n\nfunction createSqlConstraintsDsl<\n IndexTypes extends IndexTypeMap = Record<never, never>,\n>(): SqlContext<Record<string, ScalarFieldBuilder>, IndexTypes>['constraints'] {\n const constraints = createConstraintsDsl<IndexTypes>();\n return {\n index: constraints.index,\n foreignKey: constraints.foreignKey,\n ref: constraints.ref,\n };\n}\n\nfunction createColumnRefs<Fields extends Record<string, ScalarFieldBuilder>>(\n fields: Fields,\n): SqlContext<Fields>['cols'] {\n return createFieldRefs(fields);\n}\n\ntype StaticLiteralName<Name> = Name extends string ? (string extends Name ? never : Name) : never;\n\ntype NamedConstraintLiteralName<Constraint> = Constraint extends { readonly name?: infer Name }\n ? StaticLiteralName<Name>\n : never;\n\ntype DuplicateLiteralNames<\n Items extends readonly unknown[],\n Seen extends string = never,\n Duplicates extends string = never,\n> = Items extends readonly [infer First, ...infer Rest extends readonly unknown[]]\n ? NamedConstraintLiteralName<First> extends infer Name extends string\n ? Name extends Seen\n ? DuplicateLiteralNames<Rest, Seen, Duplicates | Name>\n : DuplicateLiteralNames<Rest, Seen | Name, Duplicates>\n : DuplicateLiteralNames<Rest, Seen, Duplicates>\n : Duplicates;\n\ntype InlineIdLiteralName<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly [FieldName in keyof Fields]: FieldStateOf<Fields[FieldName]> extends {\n readonly id: { readonly name?: infer Name };\n }\n ? StaticLiteralName<Name>\n : never;\n}[keyof Fields];\n\ntype AttributeIdLiteralName<AttributesSpec extends ModelAttributesSpec | undefined> =\n AttributesSpec extends {\n readonly id?: { readonly name?: infer Name };\n }\n ? StaticLiteralName<Name>\n : never;\n\ntype ModelIdLiteralName<\n Fields extends Record<string, ScalarFieldBuilder>,\n AttributesSpec extends ModelAttributesSpec | undefined,\n> = [AttributeIdLiteralName<AttributesSpec>] extends [never]\n ? InlineIdLiteralName<Fields>\n : AttributeIdLiteralName<AttributesSpec>;\n\ntype SqlIndexes<SqlSpec extends SqlStageSpec> = SqlSpec extends {\n readonly indexes?: infer Indexes extends readonly unknown[];\n}\n ? Indexes\n : readonly [];\n\ntype SqlForeignKeys<SqlSpec extends SqlStageSpec> = SqlSpec extends {\n readonly foreignKeys?: infer ForeignKeys extends readonly unknown[];\n}\n ? ForeignKeys\n : readonly [];\n\ntype SqlNamedObjects<SqlSpec extends SqlStageSpec> = [\n ...SqlIndexes<SqlSpec>,\n ...SqlForeignKeys<SqlSpec>,\n];\n\ntype ValidateSqlStageSpec<\n Fields extends Record<string, ScalarFieldBuilder>,\n AttributesSpec extends ModelAttributesSpec | undefined,\n SqlSpec extends SqlStageSpec,\n> = [DuplicateLiteralNames<SqlNamedObjects<SqlSpec>>] extends [never]\n ? [\n Extract<\n ModelIdLiteralName<Fields, AttributesSpec>,\n NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>\n >,\n ] extends [never]\n ? SqlSpec\n : never\n : never;\n\ntype ValidateAttributesStageSpec<\n Fields extends Record<string, ScalarFieldBuilder>,\n SqlSpec extends SqlStageSpec | undefined,\n AttributesSpec extends ModelAttributesSpec,\n> = SqlSpec extends SqlStageSpec\n ? [\n Extract<\n ModelIdLiteralName<Fields, AttributesSpec>,\n NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>\n >,\n ] extends [never]\n ? AttributesSpec\n : never\n : AttributesSpec;\n\nfunction findDuplicateRelationName(\n existingRelations: Record<string, AnyRelationBuilder>,\n nextRelations: Record<string, AnyRelationBuilder>,\n): string | undefined {\n return Object.keys(nextRelations).find((relationName) =>\n Object.hasOwn(existingRelations, relationName),\n );\n}\n\nexport class ContractModelBuilder<\n ModelName extends string | undefined,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n AttributesSpec extends ModelAttributesSpec | undefined = undefined,\n SqlSpec extends SqlStageSpec | undefined = undefined,\n IndexTypes extends IndexTypeMap = Record<never, never>,\n TSpaceId extends string = '<self>',\n> {\n declare readonly __name: ModelName;\n declare readonly __fields: Fields;\n declare readonly __relations: Relations;\n declare readonly __attributes: AttributesSpec;\n declare readonly __sql: SqlSpec;\n declare readonly __indexTypes: IndexTypes;\n declare readonly __spaceId: TSpaceId;\n readonly refs: ModelName extends string ? ModelTokenRefs<ModelName, Fields, TSpaceId> : never;\n\n constructor(\n readonly stageOne: {\n readonly modelName?: ModelName;\n readonly namespace?: string;\n readonly fields: Fields;\n readonly relations: Relations;\n },\n readonly attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec>,\n readonly sqlFactory?: StageInput<SqlContext<Fields, IndexTypes>, SqlSpec>,\n readonly spaceId?: TSpaceId,\n readonly tableName?: string,\n ) {\n const crossSpaceCoordinate =\n spaceId !== undefined\n ? {\n spaceId,\n ...(stageOne.namespace !== undefined ? { namespaceId: stageOne.namespace } : {}),\n ...(tableName !== undefined ? { tableName } : {}),\n }\n : undefined;\n this.refs = blindCast<\n ModelName extends string ? ModelTokenRefs<ModelName, Fields, TSpaceId> : never,\n 'conditional generic: stageOne.modelName presence matches ModelName extends string'\n >(\n stageOne.modelName\n ? createModelTokenRefs(stageOne.modelName, stageOne.fields, crossSpaceCoordinate)\n : undefined,\n );\n }\n\n ref<FieldName extends keyof Fields & string>(\n this: ModelName extends string\n ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, SqlSpec, IndexTypes>\n : never,\n fieldName: FieldName,\n ): TargetFieldRef<ModelName & string, FieldName> {\n const modelName = this.stageOne.modelName;\n if (!modelName) {\n throw new Error('Model tokens require model(\"ModelName\", ...) before calling .ref(...)');\n }\n\n return {\n kind: 'targetFieldRef',\n source: 'token',\n modelName,\n fieldName,\n } as TargetFieldRef<ModelName & string, FieldName>;\n }\n\n relations<const NextRelations extends Record<string, AnyRelationBuilder>>(\n relations: NextRelations,\n ): ContractModelBuilder<\n ModelName,\n Fields,\n Relations & NextRelations,\n AttributesSpec,\n SqlSpec,\n IndexTypes,\n TSpaceId\n > {\n const duplicateRelationName = findDuplicateRelationName(this.stageOne.relations, relations);\n if (duplicateRelationName) {\n throw new Error(\n `Model \"${this.stageOne.modelName ?? '<anonymous>'}\" already defines relation \"${duplicateRelationName}\".`,\n );\n }\n\n return new ContractModelBuilder(\n {\n ...this.stageOne,\n relations: {\n ...this.stageOne.relations,\n ...relations,\n } as Relations & NextRelations,\n },\n this.attributesFactory,\n this.sqlFactory,\n this.spaceId,\n this.tableName,\n );\n }\n\n attributes<const NextAttributesSpec extends ModelAttributesSpec>(\n specOrFactory: StageInput<\n AttributeContext<Fields>,\n ValidateAttributesStageSpec<Fields, SqlSpec, NextAttributesSpec>\n >,\n ): ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n NextAttributesSpec,\n SqlSpec,\n IndexTypes,\n TSpaceId\n > {\n return new ContractModelBuilder(\n this.stageOne,\n specOrFactory,\n this.sqlFactory,\n this.spaceId,\n this.tableName,\n );\n }\n\n sql<const NextSqlSpec extends SqlStageSpec>(\n specOrFactory: StageInput<SqlContext<Fields, IndexTypes>, NextSqlSpec>,\n ): [ValidateSqlStageSpec<Fields, AttributesSpec, NextSqlSpec>] extends [never]\n ? ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n AttributesSpec,\n never,\n IndexTypes,\n TSpaceId\n >\n : ContractModelBuilder<\n ModelName,\n Fields,\n Relations,\n AttributesSpec,\n NextSqlSpec,\n IndexTypes,\n TSpaceId\n > {\n // Conditional return type cannot be verified by the implementation; the runtime value is always a valid ContractModelBuilder regardless of the validation outcome (validation is type-level only).\n // When specOrFactory is a static object (not a function), extract tableName for the cross-space coordinate.\n const nextTableName =\n typeof specOrFactory !== 'function' ? specOrFactory.table : this.tableName;\n return blindCast<\n never,\n 'conditional return type; runtime value is always a valid ContractModelBuilder'\n >(\n new ContractModelBuilder(\n this.stageOne,\n this.attributesFactory,\n specOrFactory,\n this.spaceId,\n nextTableName,\n ),\n );\n }\n\n buildAttributesSpec(): AttributesSpec {\n if (!this.attributesFactory) {\n return undefined as AttributesSpec;\n }\n\n return buildStageSpec(this.attributesFactory, {\n fields: createFieldRefs(this.stageOne.fields),\n constraints: createAttributeConstraintsDsl() as AttributeContext<Fields>['constraints'],\n });\n }\n\n buildSqlSpec(): SqlSpec {\n if (!this.sqlFactory) {\n return undefined as SqlSpec;\n }\n return buildStageSpec(this.sqlFactory, {\n cols: createColumnRefs(this.stageOne.fields),\n constraints: createSqlConstraintsDsl<IndexTypes>(),\n });\n }\n}\n\ntype NamedModelTokenShape<\n ModelName extends string = string,\n Fields extends Record<string, ScalarFieldBuilder> = Record<string, ScalarFieldBuilder>,\n> = {\n readonly stageOne: {\n readonly modelName?: ModelName;\n readonly fields: Fields;\n };\n};\n\ntype AnyNamedModelToken = NamedModelTokenShape<string, Record<string, ScalarFieldBuilder>>;\n\ntype LazyNamedModelToken<Token extends AnyNamedModelToken = AnyNamedModelToken> = () => Token;\n\ntype RelationFieldSelection<FieldName extends string> = FieldName | readonly FieldName[];\n\ntype RelationModelName<Target> =\n Target extends NamedModelTokenShape<\n infer ModelName extends string,\n Record<string, ScalarFieldBuilder>\n >\n ? ModelName\n : Target extends () => infer Token\n ? RelationModelName<Token>\n : never;\n\ntype RelationModelFieldNames<Target> =\n Target extends NamedModelTokenShape<string, infer Fields>\n ? keyof Fields & string\n : Target extends () => infer Token\n ? RelationModelFieldNames<Token>\n : never;\n\nfunction isLazyRelationModelName(value: unknown): value is LazyRelationModelName<string> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind?: unknown }).kind === 'lazyRelationModelName' &&\n 'resolve' in value &&\n typeof (value as { resolve?: unknown }).resolve === 'function'\n );\n}\n\nfunction resolveNamedModelTokenName(token: {\n readonly stageOne: {\n readonly modelName?: string | undefined;\n };\n}): string {\n const modelName = token.stageOne.modelName;\n if (!modelName) {\n throw new Error(\n 'Relation targets require named model tokens. Use model(\"ModelName\", ...) before passing a token to rel.*(...).',\n );\n }\n return modelName;\n}\n\nfunction normalizeRelationModelSource<Token extends AnyNamedModelToken>(\n target: Token | LazyNamedModelToken<Token>,\n): RelationModelSource<RelationModelName<Token>>;\nfunction normalizeRelationModelSource<ToModel extends string>(\n target: ToModel,\n): RelationModelSource<ToModel>;\nfunction normalizeRelationModelSource(\n target: string | AnyNamedModelToken | LazyNamedModelToken,\n): RelationModelSource<string>;\nfunction normalizeRelationModelSource(\n target: string | AnyNamedModelToken | LazyNamedModelToken,\n): RelationModelSource<string> {\n if (typeof target === 'string') {\n return {\n kind: 'relationModelName',\n source: 'string',\n modelName: target,\n };\n }\n\n if (typeof target === 'function') {\n return {\n kind: 'lazyRelationModelName',\n source: 'lazyToken',\n resolve: () => resolveNamedModelTokenName(target()),\n };\n }\n\n return {\n kind: 'relationModelName',\n source: 'token',\n modelName: resolveNamedModelTokenName(target),\n };\n}\n\nexport type ContractInput<\n Family extends FamilyPackRef<string> = FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string> = TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance> = Record<never, never>,\n Models extends Record<\n string,\n ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n > = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: NamingConfig;\n readonly storageHash?: string;\n readonly foreignKeyDefaults?: ForeignKeyDefaultsState;\n readonly defaultControlPolicy?: ControlPolicy;\n /**\n * Declared namespace coordinates the contract recognises. Per-model\n * `namespace` references must reference an entry in this list (or the\n * Postgres-specific late-binding keyword `unbound`). Reserved values:\n *\n * - `__unbound__` — IR sentinel for the late-binding slot.\n * - `__unspecified__` — parser-synthesised AST bucket for top-level\n * declarations (not a real namespace).\n * - `unbound` — Postgres-specific reserved keyword (the PSL surface\n * uses `namespace unbound { … }` to opt into late binding).\n *\n * SQLite contracts must declare an empty list (or omit the field) —\n * SQLite has no schema concept and emits unqualified DDL.\n *\n * Populates `SqlStorage.namespaces` together with the\n * {@link ContractInput.createNamespace} factory: each declared name\n * (plus the framework-reserved `UNBOUND_NAMESPACE_ID` sentinel) is\n * resolved through `createNamespace` and stored as the matching slot\n * value. Models reference declared namespaces via their per-model\n * `namespace` coordinate; entries that go unreferenced still occupy a\n * slot so contracts that pre-declare schemas surface them on the live\n * storage walk.\n */\n readonly namespaces?: readonly string[];\n /**\n * Target-supplied factory that materialises a `Namespace` concretion\n * for a declared namespace coordinate. The SQL family layer is\n * target-agnostic and cannot import concretions like\n * `PostgresSchema` or `SqliteUnboundDatabase`; the factory is the\n * seam by which target packs hand the family the right runtime\n * representation.\n *\n * Called once per distinct namespace id discovered in the contract:\n * each entry of {@link ContractInput.namespaces}, every\n * `StorageTable.namespaceId` referenced by a model, and the\n * framework `UNBOUND_NAMESPACE_ID` sentinel (always present so the\n * late-bound slot stays available regardless of authoring choices).\n *\n * When omitted, the family layer falls back to its placeholder\n * `SqlUnboundNamespace` singleton for the unbound slot and rejects\n * any non-unbound coordinate — single-namespace contracts authored\n * before targets ship their factory stay byte-stable; multi-namespace\n * contracts must pass the factory through.\n */\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n /**\n * Domain enum handles authored via `enumType()`. Each handle lowers to a\n * domain `enum` entry and a storage `valueSet` entry in the target's\n * default namespace. Fields reference the enum via `field.namedType(handle)`.\n */\n readonly enums?: Record<string, import('./enum-type').EnumTypeHandle>;\n};\n\nexport function model<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(\n modelName: ModelName,\n input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n): ContractModelBuilder<ModelName, Fields, Relations>;\n\nexport function model<\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n}): ContractModelBuilder<undefined, Fields, Relations>;\n\nexport function model<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n>(\n modelNameOrInput:\n | ModelName\n | {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n maybeInput?: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n },\n): ContractModelBuilder<ModelName | undefined, Fields, Relations> {\n const input = typeof modelNameOrInput === 'string' ? maybeInput : modelNameOrInput;\n\n if (!input) {\n throw new Error('model(\"ModelName\", ...) requires a model definition.');\n }\n\n return new ContractModelBuilder({\n ...(typeof modelNameOrInput === 'string' ? { modelName: modelNameOrInput } : {}),\n ...(input.namespace !== undefined ? { namespace: input.namespace } : {}),\n fields: input.fields,\n relations: (input.relations ?? {}) as Relations,\n });\n}\n\n/**\n * Factory for building a standalone branded extension model handle.\n *\n * Use this instead of `new ContractModelBuilder(…)` when constructing handles\n * for models that live in a foreign contract space (e.g. a Supabase extension\n * model referenced by a user's contract). The `spaceId` brands the returned\n * handle so `refs.<field>.spaceId` carries the foreign space identifier.\n *\n * @param name - The domain model name as declared in the foreign contract\n * (e.g. `'AuthUser'`, not a bare table alias like `'User'`).\n * @param input.namespace - The namespace within the foreign space (e.g. `'auth'`).\n * @param input.fields - Field definitions (use `field.column(…)`).\n * @param input.table - The physical table name in the foreign schema.\n * @param spaceId - The extension space identifier (e.g. `'supabase'`).\n */\nexport function extensionModel<\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n const TSpaceId extends string,\n>(\n name: ModelName,\n input: {\n readonly namespace: string;\n readonly fields: Fields;\n readonly table: string;\n },\n spaceId: TSpaceId,\n): ContractModelBuilder<\n ModelName,\n Fields,\n Record<never, never>,\n undefined,\n undefined,\n Record<never, never>,\n TSpaceId\n> {\n const builder = new ContractModelBuilder<\n ModelName,\n Fields,\n Record<never, never>,\n undefined,\n undefined,\n Record<never, never>,\n TSpaceId\n >(\n { modelName: name, namespace: input.namespace, fields: input.fields, relations: {} },\n undefined,\n undefined,\n spaceId,\n input.table,\n );\n return builder;\n}\n\n/**\n * Narrow shape for detecting a cross-space branded model handle at runtime.\n * `ContractModelBuilder` exposes these fields but `AnyNamedModelToken` does\n * not declare them; this guard bridges the gap without a bare cast.\n */\ntype CrossSpaceHandle = {\n readonly spaceId: string;\n readonly tableName?: string;\n readonly stageOne: { readonly namespace?: string };\n};\n\nfunction isCrossSpaceHandle(value: unknown): value is CrossSpaceHandle {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const rec = blindCast<\n Record<PropertyKey, unknown>,\n 'object null-check above; property access needed for runtime shape detection'\n >(value);\n return (\n typeof rec['spaceId'] === 'string' &&\n typeof rec['stageOne'] === 'object' &&\n rec['stageOne'] !== null\n );\n}\n\nfunction belongsTo<\n Token extends AnyNamedModelToken,\n FromField extends string | readonly string[],\n ToField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly from: FromField; readonly to: ToField },\n): RelationBuilder<BelongsToRelation<RelationModelName<Token>, FromField, ToField>>;\nfunction belongsTo<\n ToModel extends string,\n FromField extends string | readonly string[],\n ToField extends string | readonly string[],\n>(\n toModel: ToModel,\n options: { readonly from: FromField; readonly to: ToField },\n): RelationBuilder<BelongsToRelation<ToModel, FromField, ToField>>;\nfunction belongsTo(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: {\n readonly from: string | readonly string[];\n readonly to: string | readonly string[];\n },\n): RelationBuilder<BelongsToRelation> {\n // F-lazy: when the model is a lazy thunk (() => handle), resolve it before\n // the brand check so cross-space handles passed as lazy tokens are detected.\n // normalizeRelationModelSource still receives the original toModel (which\n // handles both lazy and non-lazy forms correctly for model-name resolution).\n const resolvedModel = typeof toModel === 'function' ? toModel() : toModel;\n\n // Extract cross-space brand from the handle when it carries a spaceId.\n // ContractModelBuilder exposes spaceId/tableName at runtime even though\n // the AnyNamedModelToken interface does not declare them.\n const crossSpaceCoordinate = isCrossSpaceHandle(resolvedModel)\n ? {\n spaceId: resolvedModel.spaceId,\n ...(resolvedModel.tableName !== undefined ? { tableName: resolvedModel.tableName } : {}),\n ...(resolvedModel.stageOne.namespace !== undefined\n ? { namespaceId: resolvedModel.stageOne.namespace }\n : {}),\n }\n : undefined;\n\n return new RelationBuilder({\n kind: 'belongsTo',\n toModel: normalizeRelationModelSource(toModel),\n from: options.from,\n to: options.to,\n ...(crossSpaceCoordinate !== undefined ? crossSpaceCoordinate : {}),\n });\n}\n\nfunction hasMany<\n Token extends AnyNamedModelToken,\n ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly by: ByField },\n): RelationBuilder<HasManyRelation<RelationModelName<Token>, ByField>>;\nfunction hasMany<ToModel extends string, ByField extends string | readonly string[]>(\n toModel: ToModel,\n options: { readonly by: ByField },\n): RelationBuilder<HasManyRelation<ToModel, ByField>>;\nfunction hasMany(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: { readonly by: string | readonly string[] },\n): RelationBuilder<HasManyRelation> {\n return new RelationBuilder({\n kind: 'hasMany',\n toModel: normalizeRelationModelSource(toModel),\n by: options.by,\n });\n}\n\nfunction hasOne<\n Token extends AnyNamedModelToken,\n ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>,\n>(\n toModel: Token | LazyNamedModelToken<Token>,\n options: { readonly by: ByField },\n): RelationBuilder<HasOneRelation<RelationModelName<Token>, ByField>>;\nfunction hasOne<ToModel extends string, ByField extends string | readonly string[]>(\n toModel: ToModel,\n options: { readonly by: ByField },\n): RelationBuilder<HasOneRelation<ToModel, ByField>>;\nfunction hasOne(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: { readonly by: string | readonly string[] },\n): RelationBuilder<HasOneRelation> {\n return new RelationBuilder({\n kind: 'hasOne',\n toModel: normalizeRelationModelSource(toModel),\n by: options.by,\n });\n}\n\nfunction manyToMany<\n ToToken extends AnyNamedModelToken,\n ThroughToken extends AnyNamedModelToken,\n FromField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>,\n ToField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>,\n>(\n toModel: ToToken | LazyNamedModelToken<ToToken>,\n options: {\n readonly through: ThroughToken | LazyNamedModelToken<ThroughToken>;\n readonly from: FromField;\n readonly to: ToField;\n },\n): RelationBuilder<\n ManyToManyRelation<\n RelationModelName<ToToken>,\n RelationModelName<ThroughToken>,\n FromField,\n ToField\n >\n>;\nfunction manyToMany<\n ToModel extends string,\n ThroughModel extends string,\n FromField extends string | readonly string[],\n ToField extends string | readonly string[],\n>(\n toModel: ToModel,\n options: {\n readonly through: ThroughModel;\n readonly from: FromField;\n readonly to: ToField;\n },\n): RelationBuilder<ManyToManyRelation<ToModel, ThroughModel, FromField, ToField>>;\nfunction manyToMany(\n toModel: string | AnyNamedModelToken | LazyNamedModelToken,\n options: {\n readonly through: string | AnyNamedModelToken | LazyNamedModelToken;\n readonly from: string | readonly string[];\n readonly to: string | readonly string[];\n },\n): RelationBuilder<ManyToManyRelation> {\n return new RelationBuilder({\n kind: 'manyToMany',\n toModel: normalizeRelationModelSource(toModel),\n through: normalizeRelationModelSource(options.through),\n from: options.from,\n to: options.to,\n });\n}\n\nexport const rel = {\n belongsTo,\n hasMany,\n hasOne,\n manyToMany,\n};\n\nexport const field = {\n column: columnField,\n generated: generatedField,\n namedType: namedTypeField,\n};\n\nexport function isContractInput(value: unknown): value is ContractInput {\n if (typeof value !== 'object' || value === null || !('target' in value) || !('family' in value)) {\n return false;\n }\n const target = (value as { target: unknown }).target;\n const family = (value as { family: unknown }).family;\n return (\n typeof target === 'object' &&\n target !== null &&\n 'kind' in target &&\n target.kind === 'target' &&\n typeof family === 'object' &&\n family !== null &&\n 'kind' in family &&\n family.kind === 'family'\n );\n}\n\nfunction isRelationFieldArray(value: string | readonly string[]): value is readonly string[] {\n return Array.isArray(value);\n}\n\nexport function normalizeRelationFieldNames(value: string | readonly string[]): readonly string[] {\n if (isRelationFieldArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function resolveRelationModelName(value: RelationModelSource<string>): string {\n if (isLazyRelationModelName(value)) {\n return value.resolve();\n }\n return value.modelName;\n}\n\nexport function applyNaming(name: string, strategy: NamingStrategy | undefined): string {\n if (!strategy || strategy === 'identity') {\n return name;\n }\n\n let result = '';\n for (let index = 0; index < name.length; index += 1) {\n const char = name[index];\n if (!char) continue;\n const lower = char.toLowerCase();\n const isUpper = char !== lower;\n if (isUpper && index > 0) {\n const prev = name[index - 1];\n const next = name[index + 1];\n const prevIsLower = !!prev && prev === prev.toLowerCase();\n const nextIsLower = !!next && next === next.toLowerCase();\n if (prevIsLower || nextIsLower) {\n result += '_';\n }\n }\n result += lower;\n }\n return result;\n}\n\nexport type FieldStateOf<T> = T extends ScalarFieldBuilder<infer State> ? State : never;\nexport type RelationStateOf<T> = T extends RelationBuilder<infer State> ? State : never;\n\nexport type ModelFieldsOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n infer Fields,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n ? Fields\n : never;\n\nexport type ModelRelationsOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n infer Relations,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n >\n ? Relations\n : never;\n\nexport type ModelAttributesOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n infer AttributesSpec,\n SqlStageSpec | undefined\n >\n ? AttributesSpec\n : undefined;\n\nexport type ModelSqlOf<T> =\n T extends ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n ModelAttributesSpec | undefined,\n infer SqlSpec\n >\n ? SqlSpec\n : undefined;\n\nexport type IdFieldNames<T> =\n T extends IdConstraint<infer FieldNames> ? FieldNames : readonly string[];\n\nexport type AttributeStageIdFieldNames<T> = T extends { readonly id?: infer I }\n ? I extends IdConstraint\n ? IdFieldNames<I>\n : undefined\n : undefined;\n","import {\n createEntityHelpersFromNamespace,\n type EntityHelpersFromNamespace,\n type ExtractAuthoringNamespaceFromPack,\n type MergeExtensionAuthoringNamespaces,\n} from '@prisma-next/contract-authoring';\nimport type {\n AuthoringArgumentDescriptor,\n AuthoringEntityTypeNamespace,\n AuthoringFieldNamespace,\n AuthoringTypeConstructorDescriptor,\n AuthoringTypeNamespace,\n} from '@prisma-next/framework-components/authoring';\nimport {\n assertNoCrossRegistryCollisions,\n isAuthoringEntityTypeDescriptor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n mergeAuthoringNamespaces,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport {\n createFieldHelpersFromNamespace,\n createFieldPresetHelper,\n createTypeHelpersFromNamespace,\n} from './authoring-helper-runtime';\nimport type {\n FieldHelpersFromNamespace,\n ResolveTemplateValue,\n TupleFromArgumentDescriptors,\n} from './authoring-type-utils';\nimport type {\n AnyRelationBuilder,\n ContractModelBuilder,\n IndexTypeMap,\n ScalarFieldBuilder,\n} from './contract-dsl';\nimport { buildFieldPreset, field, model, rel } from './contract-dsl';\nimport type { MergeExtensionIndexTypes } from './contract-types';\n\ntype ExtractTypeNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'type',\n Record<never, never>\n>;\ntype ExtractFieldNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'field',\n Record<never, never>\n>;\ntype ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'entityTypes',\n Record<never, never>\n>;\n\ntype MergeExtensionTypeNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'type'\n>;\ntype MergeExtensionFieldNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'field'\n>;\ntype MergeExtensionEntityNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'entityTypes'\n>;\n\ntype StorageTypeFromDescriptor<\n Descriptor extends AuthoringTypeConstructorDescriptor,\n Args extends readonly unknown[],\n> = {\n readonly kind: 'codec-instance';\n readonly codecId: ResolveTemplateValue<Descriptor['output']['codecId'], Args>;\n readonly nativeType: ResolveTemplateValue<Descriptor['output']['nativeType'], Args>;\n} & (Descriptor['output'] extends {\n readonly typeParams: infer TypeParams extends Record<string, unknown>;\n}\n ? {\n readonly typeParams: ResolveTemplateValue<TypeParams, Args>;\n }\n : { readonly typeParams: Record<never, never> });\n\ntype TypeHelperFunction<Descriptor extends AuthoringTypeConstructorDescriptor> =\n Descriptor extends { readonly args: infer Args extends readonly AuthoringArgumentDescriptor[] }\n ? <const Params extends TupleFromArgumentDescriptors<Args>>(\n ...args: Params\n ) => StorageTypeFromDescriptor<Descriptor, Params>\n : () => StorageTypeFromDescriptor<Descriptor, readonly []>;\n\ntype TypeHelpersFromNamespace<Namespace> = {\n readonly [K in keyof Namespace]: Namespace[K] extends AuthoringTypeConstructorDescriptor\n ? TypeHelperFunction<Namespace[K]>\n : Namespace[K] extends Record<string, unknown>\n ? TypeHelpersFromNamespace<Namespace[K]>\n : never;\n};\n\ntype CoreFieldHelpers = Pick<typeof field, 'column' | 'generated' | 'namedType'>;\n\ntype MergeAllPackIndexTypes<Family, Target, ExtensionPacks> = MergeExtensionIndexTypes<\n { readonly __family: Family; readonly __target: Target } & (ExtensionPacks extends Record<\n string,\n unknown\n >\n ? ExtensionPacks\n : Record<never, never>)\n>;\n\ntype PackAwareModel<IndexTypes extends IndexTypeMap> = {\n <\n const ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n >(\n modelName: ModelName,\n input: { readonly fields: Fields; readonly relations?: Relations; readonly namespace?: string },\n ): ContractModelBuilder<ModelName, Fields, Relations, undefined, undefined, IndexTypes>;\n <\n Fields extends Record<string, ScalarFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<never, never>,\n >(input: {\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly namespace?: string;\n }): ContractModelBuilder<undefined, Fields, Relations, undefined, undefined, IndexTypes>;\n};\n\nexport type ComposedAuthoringHelpers<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n> = EntityHelpersFromNamespace<\n ExtractEntitiesNamespaceFromPack<Family> &\n ExtractEntitiesNamespaceFromPack<Target> &\n MergeExtensionEntityNamespaces<ExtensionPacks>\n> & {\n readonly field: CoreFieldHelpers &\n FieldHelpersFromNamespace<\n ExtractFieldNamespaceFromPack<Family> &\n ExtractFieldNamespaceFromPack<Target> &\n MergeExtensionFieldNamespaces<ExtensionPacks>\n >;\n readonly model: PackAwareModel<MergeAllPackIndexTypes<Family, Target, ExtensionPacks>>;\n readonly rel: typeof rel;\n readonly type: TypeHelpersFromNamespace<\n ExtractTypeNamespaceFromPack<Family> &\n ExtractTypeNamespaceFromPack<Target> &\n MergeExtensionTypeNamespaces<ExtensionPacks>\n >;\n};\n\nfunction extractTypeNamespace<Pack>(pack: Pack): ExtractTypeNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly type?: unknown } }).authoring?.type ??\n {}) as ExtractTypeNamespaceFromPack<Pack>;\n}\n\nfunction extractFieldNamespace<Pack>(pack: Pack): ExtractFieldNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly field?: unknown } }).authoring?.field ??\n {}) as ExtractFieldNamespaceFromPack<Pack>;\n}\n\nfunction extractEntitiesNamespace<Pack>(pack: Pack): ExtractEntitiesNamespaceFromPack<Pack> {\n return ((pack as { readonly authoring?: { readonly entityTypes?: unknown } }).authoring\n ?.entityTypes ?? {}) as ExtractEntitiesNamespaceFromPack<Pack>;\n}\n\ntype AuthoringComponent = {\n readonly authoring?: {\n readonly type?: unknown;\n readonly field?: unknown;\n readonly entityTypes?: unknown;\n };\n};\n\nfunction composeTypeNamespace(components: readonly AuthoringComponent[]): AuthoringTypeNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractTypeNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringTypeConstructorDescriptor, 'type');\n }\n }\n return merged as AuthoringTypeNamespace;\n}\n\nfunction composeFieldNamespace(components: readonly AuthoringComponent[]): AuthoringFieldNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractFieldNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringFieldPresetDescriptor, 'field');\n }\n }\n return merged as AuthoringFieldNamespace;\n}\n\nfunction composeEntityNamespace(\n components: readonly AuthoringComponent[],\n): AuthoringEntityTypeNamespace {\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractEntitiesNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringEntityTypeDescriptor, 'entity');\n }\n }\n return merged as AuthoringEntityTypeNamespace;\n}\n\n/**\n * Reserved top-level keys on the composed helpers surface — the\n * built-in `model` / `rel` helpers, the `field` / `type` namespace\n * objects. Pack-contributed entity types are flattened to the same\n * top-level shape (e.g. `helpers.enum({...})`), so a pack cannot\n * contribute an entity type whose name collides with one of these\n * reserved keys without silently overwriting at runtime. Detect the\n * collision at compose time and fail loudly with a guidance message.\n */\nconst RESERVED_HELPER_KEYS: readonly string[] = ['field', 'model', 'rel', 'type'];\n\nfunction assertNoBuiltInEntityCollisions(namespace: AuthoringEntityTypeNamespace): void {\n const collisions = Object.keys(namespace).filter((name) => RESERVED_HELPER_KEYS.includes(name));\n if (collisions.length > 0) {\n throw new Error(\n `Pack-contributed entity type(s) ${collisions.map((c) => `\"${c}\"`).join(', ')} collide with the reserved built-in helper key(s) on the composed helpers surface. Reserved keys: ${RESERVED_HELPER_KEYS.map((k) => `\"${k}\"`).join(', ')}.`,\n );\n }\n}\n\nfunction createComposedFieldHelpers(\n fieldNamespace: AuthoringFieldNamespace,\n): CoreFieldHelpers & Record<string, unknown> {\n const helperNamespace = createFieldHelpersFromNamespace(\n fieldNamespace,\n ({ helperPath, descriptor }) =>\n createFieldPresetHelper({\n helperPath,\n descriptor,\n build: ({ args, namedConstraintOptions }) =>\n buildFieldPreset(descriptor, args, namedConstraintOptions),\n }),\n );\n const coreFieldHelpers = {\n column: field.column,\n generated: field.generated,\n namedType: field.namedType,\n } satisfies CoreFieldHelpers;\n\n const coreHelperNames = new Set(Object.keys(coreFieldHelpers));\n for (const helperName of Object.keys(helperNamespace)) {\n if (coreHelperNames.has(helperName)) {\n throw new Error(\n `Duplicate authoring field helper \"${helperName}\". Core field helpers reserve that name.`,\n );\n }\n }\n\n return {\n ...coreFieldHelpers,\n ...helperNamespace,\n };\n}\n\nexport function createComposedAuthoringHelpers<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n>(options: {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n}): ComposedAuthoringHelpers<Family, Target, ExtensionPacks> {\n const extensionValues: readonly ExtensionPackRef<'sql', string>[] = Object.values(\n (options.extensionPacks ?? {}) as Record<string, ExtensionPackRef<'sql', string>>,\n );\n const components: readonly AuthoringComponent[] = [\n options.family,\n options.target,\n ...extensionValues,\n ];\n\n const typeNamespace = composeTypeNamespace(components);\n const fieldNamespace = composeFieldNamespace(components);\n const entityNamespace = composeEntityNamespace(components);\n // Mirrors the call in `assembleAuthoringContributions`: PSL composes via\n // `createControlStack`, the TS DSL composes here. Both seams need the guard.\n assertNoCrossRegistryCollisions(typeNamespace, fieldNamespace, entityNamespace);\n assertNoBuiltInEntityCollisions(entityNamespace);\n\n return {\n ...createEntityHelpersFromNamespace(entityNamespace, {\n ctx: { family: options.family.familyId, target: options.target.targetId },\n }),\n field: createComposedFieldHelpers(fieldNamespace),\n model,\n rel,\n type: createTypeHelpersFromNamespace(typeNamespace),\n } as ComposedAuthoringHelpers<Family, Target, ExtensionPacks>;\n}\n","import type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n type ContractModelBuilder,\n type ModelAttributesSpec,\n normalizeRelationFieldNames,\n type RelationBuilder,\n type RelationState,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n} from './contract-dsl';\n\ntype RuntimeModel = ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, RelationBuilder<RelationState>>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n>;\n\ntype RuntimeModelSpec = {\n readonly modelName: string;\n readonly tableName: string;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n readonly sqlSpec: SqlStageSpec | undefined;\n};\n\ntype RuntimeCollection = {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly models: Record<string, RuntimeModel>;\n readonly modelSpecs: ReadonlyMap<string, RuntimeModelSpec>;\n};\n\nfunction hasNamedModelToken(models: Record<string, RuntimeModel>, modelName: string): boolean {\n return models[modelName]?.stageOne.modelName === modelName;\n}\n\nfunction formatFieldSelection(fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `'${fieldNames[0]}'`;\n }\n\n return `[${fieldNames.map((fieldName) => `'${fieldName}'`).join(', ')}]`;\n}\n\nfunction formatTokenFieldSelection(modelName: string, fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `${modelName}.refs.${fieldNames[0]}`;\n }\n\n return `[${fieldNames.map((fieldName) => `${modelName}.refs.${fieldName}`).join(', ')}]`;\n}\n\nfunction formatConstraintsRefCall(modelName: string, fieldNames: readonly string[]): string {\n if (fieldNames.length === 1) {\n return `constraints.ref('${modelName}', '${fieldNames[0]}')`;\n }\n\n return `[${fieldNames\n .map((fieldName) => `constraints.ref('${modelName}', '${fieldName}')`)\n .join(', ')}]`;\n}\n\nfunction formatRelationModelDisplay(\n relationModel:\n | RelationState['toModel']\n | Extract<RelationState, { kind: 'manyToMany' }>['through'],\n): string {\n if (relationModel.kind === 'lazyRelationModelName') {\n return `() => ${relationModel.resolve()}`;\n }\n\n return relationModel.source === 'string'\n ? `'${relationModel.modelName}'`\n : relationModel.modelName;\n}\n\nfunction formatRelationCall(relation: RelationState, targetModelDisplay: string): string {\n if (relation.kind === 'belongsTo') {\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.belongsTo(${targetModelDisplay}, { from: ${from}, to: ${to} })`;\n }\n\n if (relation.kind === 'hasMany' || relation.kind === 'hasOne') {\n const by = formatFieldSelection(normalizeRelationFieldNames(relation.by));\n return `rel.${relation.kind}(${targetModelDisplay}, { by: ${by} })`;\n }\n\n const throughDisplay = formatRelationModelDisplay(relation.through);\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.manyToMany(${targetModelDisplay}, { through: ${throughDisplay}, from: ${from}, to: ${to} })`;\n}\n\nfunction formatManyToManyCallWithThrough(\n relation: Extract<RelationState, { kind: 'manyToMany' }>,\n throughDisplay: string,\n): string {\n const targetDisplay = formatRelationModelDisplay(relation.toModel);\n const from = formatFieldSelection(normalizeRelationFieldNames(relation.from));\n const to = formatFieldSelection(normalizeRelationFieldNames(relation.to));\n return `rel.manyToMany(${targetDisplay}, { through: ${throughDisplay}, from: ${from}, to: ${to} })`;\n}\n\nconst WARNING_BATCH_THRESHOLD = 5;\n\nfunction flushWarnings(warnings: readonly string[]): void {\n if (warnings.length === 0) {\n return;\n }\n\n if (warnings.length <= WARNING_BATCH_THRESHOLD) {\n for (const message of warnings) {\n process.emitWarning(message, { code: 'PN_CONTRACT_TYPED_FALLBACK_AVAILABLE' });\n }\n return;\n }\n\n process.emitWarning(\n `${warnings.length} contract references use string fallbacks where typed alternatives are available. ` +\n 'Use named model tokens and typed storage type refs for autocomplete and type safety.\\n' +\n warnings.map((w) => ` - ${w}`).join('\\n'),\n { code: 'PN_CONTRACT_TYPED_FALLBACK_AVAILABLE' },\n );\n}\n\nfunction formatFallbackWarning(location: string, current: string, suggested: string): string {\n return (\n `Contract ${location} uses ${current}. ` +\n `Use ${suggested} when the named model token is available in the same contract to keep typed relation targets and model refs.`\n );\n}\n\nexport function emitTypedNamedTypeFallbackWarnings(\n models: Record<string, RuntimeModel>,\n storageTypes: Record<string, StorageTypeInstance>,\n): void {\n const warnings: string[] = [];\n const warnedFields = new Set<string>();\n\n for (const [modelName, modelDefinition] of Object.entries(models)) {\n for (const [fieldName, fieldBuilder] of Object.entries(modelDefinition.stageOne.fields)) {\n const fieldState = fieldBuilder.build();\n if (typeof fieldState.typeRef !== 'string' || !(fieldState.typeRef in storageTypes)) {\n continue;\n }\n\n const warningKey = `${modelName}.${fieldName}`;\n if (warnedFields.has(warningKey)) {\n continue;\n }\n warnedFields.add(warningKey);\n\n warnings.push(\n `Contract field \"${modelName}.${fieldName}\" uses field.namedType('${fieldState.typeRef}'). ` +\n `Use field.namedType(types.${fieldState.typeRef}) when the storage type is declared in the same contract to keep autocomplete and typed local refs.`,\n );\n }\n }\n\n flushWarnings(warnings);\n}\n\nexport function emitTypedCrossModelFallbackWarnings(collection: RuntimeCollection): void {\n const warnings: string[] = [];\n const warnedKeys = new Set<string>();\n\n for (const spec of collection.modelSpecs.values()) {\n for (const [relationName, relationBuilder] of Object.entries(spec.relations)) {\n const relation = relationBuilder.build();\n\n if (\n relation.toModel.kind === 'relationModelName' &&\n relation.toModel.source === 'string' &&\n hasNamedModelToken(collection.models, relation.toModel.modelName)\n ) {\n const warningKey = `${spec.modelName}.${relationName}.toModel`;\n if (!warnedKeys.has(warningKey)) {\n warnedKeys.add(warningKey);\n\n const current = formatRelationCall(relation, `'${relation.toModel.modelName}'`);\n const suggested = formatRelationCall(relation, relation.toModel.modelName);\n warnings.push(\n formatFallbackWarning(\n `relation \"${spec.modelName}.${relationName}\"`,\n current,\n suggested,\n ),\n );\n }\n }\n\n if (\n relation.kind === 'manyToMany' &&\n relation.through.kind === 'relationModelName' &&\n relation.through.source === 'string' &&\n hasNamedModelToken(collection.models, relation.through.modelName)\n ) {\n const warningKey = `${spec.modelName}.${relationName}.through`;\n if (!warnedKeys.has(warningKey)) {\n warnedKeys.add(warningKey);\n\n const current = formatManyToManyCallWithThrough(\n relation,\n `'${relation.through.modelName}'`,\n );\n const suggested = formatManyToManyCallWithThrough(relation, relation.through.modelName);\n warnings.push(\n formatFallbackWarning(\n `relation \"${spec.modelName}.${relationName}\"`,\n current,\n suggested,\n ),\n );\n }\n }\n }\n\n for (const [foreignKeyIndex, foreignKey] of (spec.sqlSpec?.foreignKeys ?? []).entries()) {\n if (\n foreignKey.targetSource !== 'string' ||\n !hasNamedModelToken(collection.models, foreignKey.targetModel)\n ) {\n continue;\n }\n\n const warningKey = `${spec.modelName}.sql.foreignKeys.${foreignKeyIndex}`;\n if (warnedKeys.has(warningKey)) {\n continue;\n }\n warnedKeys.add(warningKey);\n\n const current = formatConstraintsRefCall(foreignKey.targetModel, foreignKey.targetFields);\n const suggested = formatTokenFieldSelection(foreignKey.targetModel, foreignKey.targetFields);\n warnings.push(\n formatFallbackWarning(`model \"${spec.modelName}\"`, `${current} in .sql(...)`, suggested),\n );\n }\n }\n\n flushWarnings(warnings);\n}\n","import type { ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';\nimport type { ExtensionPackRef } from '@prisma-next/framework-components/components';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ContractDefinition,\n FieldNode,\n ForeignKeyNode,\n IndexNode,\n ModelNode,\n PrimaryKeyNode,\n RelationNode,\n UniqueConstraintNode,\n} from './contract-definition';\nimport {\n applyNaming,\n type ContractInput,\n type ContractModelBuilder,\n type FieldStateOf,\n type ForeignKeyConstraint,\n type IdConstraint,\n type ModelAttributesSpec,\n normalizeRelationFieldNames,\n type RelationBuilder,\n type RelationState,\n resolveRelationModelName,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n type UniqueConstraint,\n} from './contract-dsl';\nimport {\n emitTypedCrossModelFallbackWarnings,\n emitTypedNamedTypeFallbackWarnings,\n} from './contract-warnings';\nimport { isEnumTypeHandle } from './enum-type';\n\ntype RuntimeModel = ContractModelBuilder<\n string | undefined,\n Record<string, ScalarFieldBuilder>,\n Record<string, RelationBuilder<RelationState>>,\n ModelAttributesSpec | undefined,\n SqlStageSpec | undefined\n>;\n\ntype RuntimeModelSpec = {\n readonly modelName: string;\n readonly tableName: string;\n readonly namespace: string | undefined;\n readonly fieldBuilders: Record<string, ScalarFieldBuilder>;\n readonly fieldToColumn: Record<string, string>;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n readonly attributesSpec: ModelAttributesSpec | undefined;\n readonly sqlSpec: SqlStageSpec | undefined;\n readonly idConstraint: IdConstraint | undefined;\n};\n\ntype RuntimeCollection = {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly models: Record<string, RuntimeModel>;\n readonly modelSpecs: ReadonlyMap<string, RuntimeModelSpec>;\n};\n\nfunction buildStorageTypeReverseLookup(\n storageTypes: Record<string, StorageTypeInstance>,\n): ReadonlyMap<StorageTypeInstance, string> {\n const lookup = new Map<StorageTypeInstance, string>();\n for (const [key, instance] of Object.entries(storageTypes)) {\n lookup.set(instance, key);\n }\n return lookup;\n}\n\nfunction resolveFieldDescriptor(\n modelName: string,\n fieldName: string,\n fieldState: FieldStateOf<ScalarFieldBuilder>,\n storageTypes: Record<string, StorageTypeInstance>,\n storageTypeReverseLookup: ReadonlyMap<StorageTypeInstance, string>,\n): ColumnTypeDescriptor {\n if ('descriptor' in fieldState && fieldState.descriptor) {\n return fieldState.descriptor;\n }\n\n if ('typeRef' in fieldState && fieldState.typeRef) {\n if (isEnumTypeHandle(fieldState.typeRef)) {\n return {\n codecId: fieldState.typeRef.codecId,\n nativeType: fieldState.typeRef.nativeType,\n };\n }\n\n const typeRef =\n typeof fieldState.typeRef === 'string'\n ? fieldState.typeRef\n : storageTypeReverseLookup.get(fieldState.typeRef as StorageTypeInstance);\n\n if (!typeRef) {\n throw new Error(\n `Field \"${modelName}.${fieldName}\" references a storage type instance that is not present in definition.types`,\n );\n }\n\n const referencedType = storageTypes[typeRef];\n if (!referencedType) {\n throw new Error(\n `Field \"${modelName}.${fieldName}\" references unknown storage type \"${typeRef}\"`,\n );\n }\n\n return {\n codecId: referencedType.codecId,\n nativeType: referencedType.nativeType,\n typeRef,\n };\n }\n\n throw new Error(`Field \"${modelName}.${fieldName}\" does not resolve to a storage descriptor`);\n}\n\nfunction mapFieldNamesToColumnNames(\n modelName: string,\n fieldNames: readonly string[],\n fieldToColumn: Record<string, string>,\n): readonly string[] {\n return fieldNames.map((fieldName) => {\n const columnName = fieldToColumn[fieldName];\n if (!columnName) {\n throw new Error(`Unknown field \"${modelName}.${fieldName}\" in contract definition`);\n }\n return columnName;\n });\n}\n\nfunction assertRelationFieldArity(params: {\n readonly modelName: string;\n readonly relationName: string;\n readonly leftLabel: string;\n readonly leftFields: readonly string[];\n readonly rightLabel: string;\n readonly rightFields: readonly string[];\n}): void {\n if (params.leftFields.length === params.rightFields.length) {\n return;\n }\n\n throw new Error(\n `Relation \"${params.modelName}.${params.relationName}\" maps ${params.leftFields.length} ${params.leftLabel} field(s) to ${params.rightFields.length} ${params.rightLabel} field(s).`,\n );\n}\n\nfunction resolveInlineIdConstraint(\n spec: Pick<RuntimeModelSpec, 'modelName' | 'fieldBuilders'>,\n): IdConstraint | undefined {\n const inlineIdFields: string[] = [];\n let idName: string | undefined;\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n if (!fieldState.id) {\n continue;\n }\n\n inlineIdFields.push(fieldName);\n if (fieldState.id.name) {\n idName = fieldState.id.name;\n }\n }\n\n if (inlineIdFields.length === 0) {\n return undefined;\n }\n\n if (inlineIdFields.length > 1) {\n throw new Error(\n `Model \"${spec.modelName}\" marks multiple fields with .id(). Use .attributes(...) for compound identities.`,\n );\n }\n\n const [inlineIdField] = inlineIdFields;\n if (!inlineIdField) {\n return undefined;\n }\n\n return {\n kind: 'id',\n fields: [inlineIdField],\n ...(idName ? { name: idName } : {}),\n };\n}\n\nfunction collectInlineUniqueConstraints(spec: RuntimeModelSpec): readonly UniqueConstraint[] {\n const constraints: UniqueConstraint[] = [];\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n if (!fieldState.unique) {\n continue;\n }\n\n constraints.push({\n kind: 'unique',\n fields: [fieldName],\n ...(fieldState.unique.name ? { name: fieldState.unique.name } : {}),\n });\n }\n\n return constraints;\n}\n\nfunction resolveModelIdConstraint(\n spec: Pick<RuntimeModelSpec, 'modelName' | 'fieldBuilders' | 'attributesSpec'>,\n): IdConstraint | undefined {\n const inlineId = resolveInlineIdConstraint(spec);\n const attributeId = spec.attributesSpec?.id;\n\n if (inlineId && attributeId) {\n throw new Error(\n `Model \"${spec.modelName}\" defines identity both inline and in .attributes(...). Pick one identity style.`,\n );\n }\n\n const resolvedId = attributeId ?? inlineId;\n if (resolvedId && resolvedId.fields.length === 0) {\n throw new Error(`Model \"${spec.modelName}\" defines an empty identity. Add at least one field.`);\n }\n\n return resolvedId;\n}\n\nfunction resolveModelUniqueConstraints(spec: RuntimeModelSpec): readonly UniqueConstraint[] {\n const attributeUniques = spec.attributesSpec?.uniques ?? [];\n for (const unique of attributeUniques) {\n if (unique.fields.length === 0) {\n throw new Error(\n `Model \"${spec.modelName}\" defines an empty unique constraint. Add at least one field.`,\n );\n }\n }\n\n return [...collectInlineUniqueConstraints(spec), ...attributeUniques];\n}\n\nfunction resolveRelationForeignKeys(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): readonly ForeignKeyConstraint[] {\n const foreignKeys: ForeignKeyConstraint[] = [];\n\n for (const [relationName, relationBuilder] of Object.entries(spec.relations)) {\n const relation = relationBuilder.build();\n if (relation.kind !== 'belongsTo' || !relation.sql?.fk) {\n continue;\n }\n\n const targetModelName = resolveRelationModelName(relation.toModel);\n\n // F-relfk: cross-space relations carry a spaceId; skip the local spec lookup\n // and include cross-space coordinates so resolveForeignKeyNodes routes the FK\n // through the cross-space path.\n if (relation.spaceId !== undefined) {\n const fields = normalizeRelationFieldNames(relation.from);\n const targetFields = normalizeRelationFieldNames(relation.to);\n assertRelationFieldArity({\n modelName: spec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fields,\n rightLabel: 'target',\n rightFields: targetFields,\n });\n\n foreignKeys.push({\n kind: 'fk',\n fields,\n targetModel: targetModelName,\n targetFields,\n targetSpaceId: relation.spaceId,\n ...(relation.namespaceId !== undefined ? { targetNamespaceId: relation.namespaceId } : {}),\n ...(relation.tableName !== undefined ? { targetTableName: relation.tableName } : {}),\n ...(relation.sql.fk.name ? { name: relation.sql.fk.name } : {}),\n ...(relation.sql.fk.onDelete ? { onDelete: relation.sql.fk.onDelete } : {}),\n ...(relation.sql.fk.onUpdate ? { onUpdate: relation.sql.fk.onUpdate } : {}),\n ...(relation.sql.fk.constraint !== undefined\n ? { constraint: relation.sql.fk.constraint }\n : {}),\n ...(relation.sql.fk.index !== undefined ? { index: relation.sql.fk.index } : {}),\n });\n continue;\n }\n\n if (!allSpecs.has(targetModelName)) {\n throw new Error(\n `Relation \"${spec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const fields = normalizeRelationFieldNames(relation.from);\n const targetFields = normalizeRelationFieldNames(relation.to);\n assertRelationFieldArity({\n modelName: spec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fields,\n rightLabel: 'target',\n rightFields: targetFields,\n });\n\n foreignKeys.push({\n kind: 'fk',\n fields,\n targetModel: targetModelName,\n targetFields,\n ...(relation.sql.fk.name ? { name: relation.sql.fk.name } : {}),\n ...(relation.sql.fk.onDelete ? { onDelete: relation.sql.fk.onDelete } : {}),\n ...(relation.sql.fk.onUpdate ? { onUpdate: relation.sql.fk.onUpdate } : {}),\n ...(relation.sql.fk.constraint !== undefined\n ? { constraint: relation.sql.fk.constraint }\n : {}),\n ...(relation.sql.fk.index !== undefined ? { index: relation.sql.fk.index } : {}),\n });\n }\n\n return foreignKeys;\n}\n\nfunction resolveRelationAnchorFields(spec: RuntimeModelSpec): readonly string[] {\n const idFields = spec.idConstraint?.fields;\n if (idFields && idFields.length > 0) {\n return idFields;\n }\n\n if ('id' in spec.fieldToColumn) {\n return ['id'];\n }\n\n throw new Error(\n `Model \"${spec.modelName}\" needs an explicit id or an \"id\" field to anchor non-owning relations`,\n );\n}\n\nfunction lowerBelongsToRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'belongsTo' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const fromFields = normalizeRelationFieldNames(relation.from);\n const toFields = normalizeRelationFieldNames(relation.to);\n\n assertRelationFieldArity({\n modelName: currentSpec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fromFields,\n rightLabel: 'target',\n rightFields: toFields,\n });\n\n // Cross-space path: the target lives in a different contract space.\n // Resolve from the brand carried on the BelongsToRelation instead of\n // requiring a local model spec — matching how the FK lowering works.\n if (relation.spaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n relation.spaceId,\n `Relation \"${currentSpec.modelName}.${relationName}\"`,\n );\n const targetTable = relation.tableName ?? targetModelName.toLowerCase();\n const parentColumns = mapFieldNamesToColumnNames(\n currentSpec.modelName,\n fromFields,\n currentSpec.fieldToColumn,\n );\n // For cross-space relations, the `to` field names map directly to column\n // names because we have no fieldToColumn map for the remote model.\n // (The brand carries the table name; field→column resolution on the remote\n // side is deferred to the planner which has access to the remote contract.)\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetTable,\n cardinality: 'N:1',\n spaceId: relation.spaceId,\n ...(relation.namespaceId !== undefined ? { namespaceId: relation.namespaceId } : {}),\n on: {\n parentTable: currentSpec.tableName,\n parentColumns,\n childTable: targetTable,\n childColumns: toFields,\n },\n };\n }\n\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: 'N:1',\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n fromFields,\n currentSpec.fieldToColumn,\n ),\n childTable: targetSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n toFields,\n targetSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction lowerHasOwnershipRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'hasMany' | 'hasOne' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const parentFields = resolveRelationAnchorFields(currentSpec);\n const childFields = normalizeRelationFieldNames(relation.by);\n assertRelationFieldArity({\n modelName: currentSpec.modelName,\n relationName,\n leftLabel: 'anchor',\n leftFields: parentFields,\n rightLabel: 'child',\n rightFields: childFields,\n });\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: relation.kind === 'hasMany' ? '1:N' : '1:1',\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n parentFields,\n currentSpec.fieldToColumn,\n ),\n childTable: targetSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n childFields,\n targetSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction lowerManyToManyRelation(\n relationName: string,\n relation: Extract<RelationState, { kind: 'manyToMany' }>,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): RelationNode {\n const targetModelName = resolveRelationModelName(relation.toModel);\n const targetSpec = allSpecs.get(targetModelName);\n if (!targetSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n\n const throughModelName = resolveRelationModelName(relation.through);\n const throughSpec = allSpecs.get(throughModelName);\n if (!throughSpec) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" references unknown through model \"${throughModelName}\"`,\n );\n }\n\n const currentAnchorFields = resolveRelationAnchorFields(currentSpec);\n const targetAnchorFields = resolveRelationAnchorFields(targetSpec);\n const throughFromFields = normalizeRelationFieldNames(relation.from);\n const throughToFields = normalizeRelationFieldNames(relation.to);\n if (\n currentAnchorFields.length !== throughFromFields.length ||\n targetAnchorFields.length !== throughToFields.length\n ) {\n throw new Error(\n `Relation \"${currentSpec.modelName}.${relationName}\" has mismatched many-to-many field counts.`,\n );\n }\n\n return {\n fieldName: relationName,\n toModel: targetModelName,\n toTable: targetSpec.tableName,\n cardinality: 'N:M',\n through: {\n table: throughSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughFromFields,\n throughSpec.fieldToColumn,\n ),\n childColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughToFields,\n throughSpec.fieldToColumn,\n ),\n },\n on: {\n parentTable: currentSpec.tableName,\n parentColumns: mapFieldNamesToColumnNames(\n currentSpec.modelName,\n currentAnchorFields,\n currentSpec.fieldToColumn,\n ),\n childTable: throughSpec.tableName,\n childColumns: mapFieldNamesToColumnNames(\n throughSpec.modelName,\n throughFromFields,\n throughSpec.fieldToColumn,\n ),\n },\n };\n}\n\nfunction resolveRelationNode(\n relationName: string,\n relation: RelationState,\n currentSpec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): RelationNode {\n if (relation.kind === 'belongsTo') {\n return lowerBelongsToRelation(relationName, relation, currentSpec, allSpecs, extensionPacks);\n }\n\n if (relation.kind === 'hasMany' || relation.kind === 'hasOne') {\n return lowerHasOwnershipRelation(relationName, relation, currentSpec, allSpecs);\n }\n\n return lowerManyToManyRelation(relationName, relation, currentSpec, allSpecs);\n}\n\nfunction lowerLocalForeignKeyNode(\n spec: RuntimeModelSpec,\n targetSpec: RuntimeModelSpec,\n foreignKey: {\n readonly fields: readonly string[];\n readonly targetFields: readonly string[];\n readonly name?: string | undefined;\n readonly onDelete?: ForeignKeyConstraint['onDelete'] | undefined;\n readonly onUpdate?: ForeignKeyConstraint['onUpdate'] | undefined;\n readonly constraint?: boolean | undefined;\n readonly index?: boolean | undefined;\n },\n): ForeignKeyNode {\n return {\n columns: mapFieldNamesToColumnNames(spec.modelName, foreignKey.fields, spec.fieldToColumn),\n references: {\n model: targetSpec.modelName,\n table: targetSpec.tableName,\n columns: mapFieldNamesToColumnNames(\n targetSpec.modelName,\n foreignKey.targetFields,\n targetSpec.fieldToColumn,\n ),\n },\n ...(foreignKey.name ? { name: foreignKey.name } : {}),\n ...(foreignKey.onDelete ? { onDelete: foreignKey.onDelete } : {}),\n ...(foreignKey.onUpdate ? { onUpdate: foreignKey.onUpdate } : {}),\n ...(foreignKey.constraint !== undefined ? { constraint: foreignKey.constraint } : {}),\n ...(foreignKey.index !== undefined ? { index: foreignKey.index } : {}),\n };\n}\n\nfunction lowerCrossSpaceForeignKeyNode(\n spec: RuntimeModelSpec,\n foreignKey: {\n readonly fields: readonly string[];\n readonly targetFields: readonly string[];\n readonly targetModel: string;\n readonly targetSpaceId: string;\n readonly targetNamespaceId?: string;\n readonly targetTableName?: string;\n readonly name?: string | undefined;\n readonly onDelete?: ForeignKeyConstraint['onDelete'] | undefined;\n readonly onUpdate?: ForeignKeyConstraint['onUpdate'] | undefined;\n readonly constraint?: boolean | undefined;\n readonly index?: boolean | undefined;\n },\n): ForeignKeyNode {\n return {\n columns: mapFieldNamesToColumnNames(spec.modelName, foreignKey.fields, spec.fieldToColumn),\n references: {\n model: foreignKey.targetModel,\n table: foreignKey.targetTableName ?? foreignKey.targetModel.toLowerCase(),\n columns: foreignKey.targetFields,\n ...(foreignKey.targetNamespaceId !== undefined\n ? { namespaceId: foreignKey.targetNamespaceId }\n : {}),\n spaceId: foreignKey.targetSpaceId,\n },\n ...(foreignKey.name ? { name: foreignKey.name } : {}),\n ...(foreignKey.onDelete ? { onDelete: foreignKey.onDelete } : {}),\n ...(foreignKey.onUpdate ? { onUpdate: foreignKey.onUpdate } : {}),\n ...(foreignKey.constraint !== undefined ? { constraint: foreignKey.constraint } : {}),\n ...(foreignKey.index !== undefined ? { index: foreignKey.index } : {}),\n };\n}\n\nfunction assertKnownExtensionPack(\n extensionPacks: Record<string, ExtensionPackRef<'sql', string>> | undefined,\n spaceId: string,\n context: string,\n): void {\n if (extensionPacks !== undefined && Object.hasOwn(extensionPacks, spaceId)) {\n return;\n }\n throw new Error(\n `${context} references contract space \"${spaceId}\" but \"${spaceId}\" is not declared in extensionPacks. Add the pack to extensionPacks.`,\n );\n}\n\nfunction resolveForeignKeyNodes(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): readonly ForeignKeyNode[] {\n const relationForeignKeys = resolveRelationForeignKeys(spec, allSpecs).map((foreignKey) => {\n // F-relfk: relation-derived FKs for cross-space targets carry targetSpaceId;\n // route them through the cross-space path, just like explicit sql() FKs.\n if (foreignKey.targetSpaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n foreignKey.targetSpaceId,\n `Relation-derived foreign key on \"${spec.modelName}\"`,\n );\n return lowerCrossSpaceForeignKeyNode(spec, {\n ...foreignKey,\n targetSpaceId: foreignKey.targetSpaceId,\n });\n }\n\n const targetSpec = allSpecs.get(foreignKey.targetModel);\n if (!targetSpec) {\n throw new Error(\n `Foreign key on \"${spec.modelName}\" references unknown model \"${foreignKey.targetModel}\"`,\n );\n }\n\n return lowerLocalForeignKeyNode(spec, targetSpec, foreignKey);\n });\n\n const sqlForeignKeys = (spec.sqlSpec?.foreignKeys ?? []).map((foreignKey) => {\n if (foreignKey.targetSpaceId !== undefined) {\n assertKnownExtensionPack(\n extensionPacks,\n foreignKey.targetSpaceId,\n `Foreign key on \"${spec.modelName}\"`,\n );\n return lowerCrossSpaceForeignKeyNode(spec, {\n ...foreignKey,\n targetSpaceId: foreignKey.targetSpaceId,\n });\n }\n\n const targetSpec = allSpecs.get(foreignKey.targetModel);\n if (!targetSpec) {\n throw new Error(\n `Foreign key on \"${spec.modelName}\" references unknown model \"${foreignKey.targetModel}\"`,\n );\n }\n\n return lowerLocalForeignKeyNode(spec, targetSpec, foreignKey);\n });\n\n return [...relationForeignKeys, ...sqlForeignKeys];\n}\n\nfunction resolveModelNode(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n storageTypes: Record<string, StorageTypeInstance>,\n storageTypeReverseLookup: ReadonlyMap<StorageTypeInstance, string>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): ModelNode {\n const fields: FieldNode[] = [];\n\n for (const [fieldName, fieldBuilder] of Object.entries(spec.fieldBuilders)) {\n const fieldState = fieldBuilder.build();\n const descriptor = resolveFieldDescriptor(\n spec.modelName,\n fieldName,\n fieldState,\n storageTypes,\n storageTypeReverseLookup,\n );\n const columnName = spec.fieldToColumn[fieldName];\n if (!columnName) {\n throw new Error(`Column name resolution failed for \"${spec.modelName}.${fieldName}\"`);\n }\n\n const enumHandle =\n 'typeRef' in fieldState && isEnumTypeHandle(fieldState.typeRef)\n ? fieldState.typeRef\n : undefined;\n\n fields.push({\n fieldName,\n columnName,\n descriptor,\n nullable: fieldState.nullable,\n ...(fieldState.default ? { default: fieldState.default } : {}),\n ...(fieldState.executionDefaults ? { executionDefaults: fieldState.executionDefaults } : {}),\n ...(enumHandle !== undefined ? { enumTypeHandle: enumHandle } : {}),\n });\n }\n\n const { idConstraint } = spec;\n const uniques = resolveModelUniqueConstraints(spec).map((unique) => ({\n columns: mapFieldNamesToColumnNames(spec.modelName, unique.fields, spec.fieldToColumn),\n ...(unique.name ? { name: unique.name } : {}),\n })) satisfies readonly UniqueConstraintNode[];\n const indexes = (spec.sqlSpec?.indexes ?? []).map((index) => ({\n columns: mapFieldNamesToColumnNames(spec.modelName, index.fields, spec.fieldToColumn),\n ...ifDefined('name', index.name),\n ...ifDefined('type', index.type),\n ...ifDefined('options', index.options),\n })) satisfies readonly IndexNode[];\n const foreignKeys = resolveForeignKeyNodes(spec, allSpecs, extensionPacks);\n const relations = Object.entries(spec.relations).map(([relationName, relationBuilder]) =>\n resolveRelationNode(relationName, relationBuilder.build(), spec, allSpecs, extensionPacks),\n );\n\n return {\n modelName: spec.modelName,\n tableName: spec.tableName,\n ...(spec.namespace !== undefined ? { namespaceId: spec.namespace } : {}),\n fields,\n ...(idConstraint\n ? {\n id: {\n columns: mapFieldNamesToColumnNames(\n spec.modelName,\n idConstraint.fields,\n spec.fieldToColumn,\n ),\n ...(idConstraint.name ? { name: idConstraint.name } : {}),\n } satisfies PrimaryKeyNode,\n }\n : {}),\n ...(uniques.length > 0 ? { uniques } : {}),\n ...(indexes.length > 0 ? { indexes } : {}),\n ...(foreignKeys.length > 0 ? { foreignKeys } : {}),\n ...(relations.length > 0 ? { relations } : {}),\n ...ifDefined('control', spec.sqlSpec?.control),\n };\n}\n\nfunction collectRuntimeModelSpecs(definition: ContractInput): RuntimeCollection {\n const storageTypes = { ...(definition.types ?? {}) } as Record<string, StorageTypeInstance>;\n const models = { ...(definition.models ?? {}) } as Record<string, RuntimeModel>;\n\n emitTypedNamedTypeFallbackWarnings(models, storageTypes);\n\n const modelSpecs = new Map<string, RuntimeModelSpec>();\n const tableOwners = new Map<string, string>();\n\n for (const [modelName, modelDefinition] of Object.entries(models)) {\n const tokenModelName = modelDefinition.stageOne.modelName;\n if (tokenModelName && tokenModelName !== modelName) {\n throw new Error(\n `Model token \"${tokenModelName}\" must be assigned to models.${tokenModelName}. Received models.${modelName}.`,\n );\n }\n\n const attributesSpec = modelDefinition.buildAttributesSpec();\n const sqlSpec = modelDefinition.buildSqlSpec();\n const tableName = sqlSpec?.table ?? applyNaming(modelName, definition.naming?.tables);\n const existingModel = tableOwners.get(tableName);\n if (existingModel) {\n throw new Error(\n `Models \"${existingModel}\" and \"${modelName}\" both map to table \"${tableName}\".`,\n );\n }\n tableOwners.set(tableName, modelName);\n\n const fieldToColumn: Record<string, string> = {};\n const columnOwners = new Map<string, string>();\n\n for (const [fieldName, fieldBuilder] of Object.entries(modelDefinition.stageOne.fields)) {\n const fieldState = fieldBuilder.build();\n const columnName =\n fieldState.columnName ?? applyNaming(fieldName, definition.naming?.columns);\n const existingField = columnOwners.get(columnName);\n if (existingField) {\n throw new Error(\n `Model \"${modelName}\" maps both \"${existingField}\" and \"${fieldName}\" to column \"${columnName}\".`,\n );\n }\n columnOwners.set(columnName, fieldName);\n fieldToColumn[fieldName] = columnName;\n }\n\n const fieldBuilders = modelDefinition.stageOne.fields;\n const idConstraint = resolveModelIdConstraint({ modelName, fieldBuilders, attributesSpec });\n modelSpecs.set(modelName, {\n modelName,\n tableName,\n namespace: modelDefinition.stageOne.namespace,\n fieldBuilders,\n fieldToColumn,\n relations: modelDefinition.stageOne.relations,\n attributesSpec,\n sqlSpec,\n idConstraint,\n });\n }\n\n return {\n storageTypes,\n models,\n modelSpecs,\n };\n}\n\nfunction lowerModels(\n collection: RuntimeCollection,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): readonly ModelNode[] {\n emitTypedCrossModelFallbackWarnings(collection);\n\n const storageTypeReverseLookup = buildStorageTypeReverseLookup(collection.storageTypes);\n return Array.from(collection.modelSpecs.values()).map((spec) =>\n resolveModelNode(\n spec,\n collection.modelSpecs,\n collection.storageTypes,\n storageTypeReverseLookup,\n extensionPacks,\n ),\n );\n}\n\nexport function buildContractDefinition(definition: ContractInput): ContractDefinition {\n const collection = collectRuntimeModelSpecs(definition);\n const models = lowerModels(collection, definition.extensionPacks);\n\n return {\n target: definition.target,\n ...ifDefined('defaultControlPolicy', definition.defaultControlPolicy),\n ...(definition.extensionPacks ? { extensionPacks: definition.extensionPacks } : {}),\n ...(definition.storageHash ? { storageHash: definition.storageHash } : {}),\n ...(definition.foreignKeyDefaults ? { foreignKeyDefaults: definition.foreignKeyDefaults } : {}),\n ...(Object.keys(collection.storageTypes).length > 0\n ? { storageTypes: collection.storageTypes }\n : {}),\n ...(definition.namespaces ? { namespaces: definition.namespaces } : {}),\n ...(definition.createNamespace ? { createNamespace: definition.createNamespace } : {}),\n ...(definition.enums && Object.keys(definition.enums).length > 0\n ? { enums: definition.enums }\n : {}),\n models,\n };\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type { ForeignKeyDefaultsState } from '@prisma-next/contract-authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport type { Namespace } from '@prisma-next/framework-components/ir';\nimport type { SqlNamespaceTablesInput, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { buildSqlContractFromDefinition } from './build-contract';\nimport {\n type ComposedAuthoringHelpers,\n createComposedAuthoringHelpers,\n} from './composed-authoring-helpers';\nimport {\n type ContractInput,\n type ContractModelBuilder,\n extensionModel,\n field,\n isContractInput,\n type ModelAttributesSpec,\n model,\n type RelationBuilder,\n type RelationState,\n rel,\n type ScalarFieldBuilder,\n type SqlStageSpec,\n} from './contract-dsl';\nimport { buildContractDefinition } from './contract-lowering';\nimport type { SqlContractResult } from './contract-types';\nimport type { EnumTypeHandle } from './enum-type';\n\nexport { buildSqlContractFromDefinition } from './build-contract';\n\ntype ModelLike = {\n readonly stageOne: {\n readonly modelName?: string;\n readonly namespace?: string;\n readonly fields: Record<string, ScalarFieldBuilder>;\n readonly relations: Record<string, RelationBuilder<RelationState>>;\n };\n readonly __attributes: ModelAttributesSpec | undefined;\n readonly __sql: SqlStageSpec | undefined;\n buildAttributesSpec(): ModelAttributesSpec | undefined;\n buildSqlSpec(): SqlStageSpec | undefined;\n};\n\ntype ContractDefinition<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance>,\n Models extends Record<string, ModelLike>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n Enums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Enums;\n};\n\ntype ContractScaffold<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n Enums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: never;\n readonly models?: never;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Enums;\n};\n\ntype ContractFactory<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n Types extends Record<string, StorageTypeInstance>,\n Models extends Record<string, ModelLike>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n Enums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n> = (helpers: ComposedAuthoringHelpers<Family, Target, ExtensionPacks>) => {\n readonly types?: Types;\n readonly models?: Models;\n readonly enums?: Enums;\n};\n\nfunction validateTargetPackRef(\n family: FamilyPackRef<string>,\n target: TargetPackRef<'sql', string>,\n): void {\n if (family.familyId !== 'sql') {\n throw new Error(\n `defineContract only accepts SQL family packs. Received family \"${family.familyId}\".`,\n );\n }\n\n if (target.familyId !== family.familyId) {\n throw new Error(\n `target pack \"${target.id}\" targets family \"${target.familyId}\" but contract family is \"${family.familyId}\".`,\n );\n }\n}\n\n/**\n * Per-target reserved namespace names enforced by `defineContract` for\n * SQL family contracts. Two categories:\n *\n * 1. **IR sentinels** (`__unbound__`, `__unspecified__`) — reserved on\n * every SQL target. The double-underscore decoration marks them as\n * framework-reserved coordinates; user code must not declare them\n * explicitly.\n * 2. **Target-specific PSL keywords** — Postgres reserves the bare\n * `unbound` identifier for the late-binding opt-in\n * (`namespace unbound { … }`) so the TS surface must reject it from\n * `defineContract({ namespaces })` lists. SQLite has no schema\n * concept and rejects every non-empty namespaces list outright;\n * callers should declare `namespaces: []` or omit the field.\n */\nfunction validateNamespaceDeclarations(\n target: TargetPackRef<'sql', string>,\n namespaces: readonly string[] | undefined,\n): void {\n if (!namespaces) {\n return;\n }\n\n if (target.targetId === 'sqlite' && namespaces.length > 0) {\n throw new Error(\n `defineContract: SQLite contracts cannot declare namespaces (SQLite has no schema concept; emitted DDL is always unqualified). Received namespaces: [${namespaces\n .map((name) => `\"${name}\"`)\n .join(', ')}].`,\n );\n }\n\n const seen = new Set<string>();\n for (const namespace of namespaces) {\n if (namespace.length === 0) {\n throw new Error('defineContract: namespace names cannot be empty.');\n }\n if (namespace.trim().length === 0) {\n throw new Error(`defineContract: namespace name \"${namespace}\" cannot be whitespace-only.`);\n }\n if (namespace === '__unbound__' || namespace === '__unspecified__') {\n throw new Error(\n `defineContract: namespace name \"${namespace}\" is a reserved IR sentinel and cannot appear in the declared namespaces list.`,\n );\n }\n if (target.targetId === 'postgres' && namespace === 'unbound') {\n throw new Error(\n `defineContract: namespace name \"unbound\" is reserved by Postgres for the late-binding opt-in (use \\`namespace unbound { … }\\` in PSL instead of declaring it as a regular schema).`,\n );\n }\n if (seen.has(namespace)) {\n throw new Error(`defineContract: namespaces list contains duplicate entry \"${namespace}\".`);\n }\n seen.add(namespace);\n }\n}\n\n/**\n * Per-model `namespace` validation paired with\n * {@link validateNamespaceDeclarations}. Mirrors the reserved-name\n * rules so the per-model surface stays consistent with the contract-\n * level surface:\n *\n * - `__unbound__` / `__unspecified__` — reserved IR sentinels on\n * every SQL target.\n * - `unbound` on Postgres — reserved for the PSL\n * `namespace unbound { … }` opt-in.\n *\n * Additionally enforces that each per-model `namespace` either\n * references an entry in the contract's declared `namespaces` list or\n * names the Postgres late-binding keyword (`unbound`) — the latter is\n * not a \"declared namespace\" but is a legal opt-in only via PSL today,\n * so the TS surface also rejects it on the per-model side and points\n * authors at the PSL `namespace unbound { … }` block.\n *\n * The SQLite per-model `namespace` field is rejected outright (SQLite\n * has no schema concept).\n */\nfunction validatePerModelNamespaces(\n target: TargetPackRef<'sql', string>,\n namespaces: readonly string[] | undefined,\n models: Record<string, ModelLike>,\n): void {\n const declaredNamespaces = new Set<string>(namespaces ?? []);\n\n for (const [modelKey, modelBuilder] of Object.entries(models)) {\n const perModelNamespace = modelBuilder.stageOne.namespace;\n if (perModelNamespace === undefined) {\n continue;\n }\n\n if (target.targetId === 'sqlite') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"${perModelNamespace}\"\\` but the target is SQLite (SQLite has no schema concept; remove the per-model \\`namespace\\` field).`,\n );\n }\n\n if (perModelNamespace === '__unbound__' || perModelNamespace === '__unspecified__') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"${perModelNamespace}\"\\` but that name is a reserved IR sentinel and cannot appear in user code.`,\n );\n }\n\n if (target.targetId === 'postgres' && perModelNamespace === 'unbound') {\n throw new Error(\n `defineContract: model \"${modelKey}\" sets \\`namespace: \"unbound\"\\` but that name is reserved by Postgres for the late-binding opt-in (use \\`namespace unbound { … }\\` in PSL instead — there is no equivalent surface in the TS builder today).`,\n );\n }\n\n if (!declaredNamespaces.has(perModelNamespace)) {\n const hint =\n declaredNamespaces.size > 0\n ? ` Declared namespaces: [${[...declaredNamespaces].map((name) => `\"${name}\"`).join(', ')}].`\n : ' The contract does not declare any namespaces; add `namespaces: [\"…\"]` to `defineContract` first.';\n throw new Error(\n `defineContract: model \"${modelKey}\" references namespace \"${perModelNamespace}\" but that name does not appear in the contract's declared \\`namespaces\\` list.${hint}`,\n );\n }\n }\n}\n\nfunction validateExtensionPackRefs(\n target: TargetPackRef<'sql', string>,\n extensionPacks?: Record<string, ExtensionPackRef<'sql', string>>,\n): void {\n if (!extensionPacks) {\n return;\n }\n\n for (const packRef of Object.values(extensionPacks)) {\n if (packRef.kind !== 'extension') {\n throw new Error(\n `defineContract only accepts extension pack refs in extensionPacks. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== target.familyId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but contract target family is \"${target.familyId}\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== target.targetId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but contract target is \"${target.targetId}\".`,\n );\n }\n }\n}\n\nfunction buildContractFromDsl<Definition extends ContractInput>(\n definition: Definition,\n): SqlContractResult<Definition> {\n validateTargetPackRef(definition.family, definition.target);\n validateExtensionPackRefs(definition.target, definition.extensionPacks);\n validateNamespaceDeclarations(definition.target, definition.namespaces);\n validatePerModelNamespaces(\n definition.target,\n definition.namespaces,\n (definition.models ?? {}) as Record<string, ModelLike>,\n );\n\n return blindCast<\n SqlContractResult<Definition>,\n 'buildSqlContractFromDefinition return type is wide; SqlContractResult conditional resolves correctly at runtime for any concrete Definition'\n >(buildSqlContractFromDefinition(buildContractDefinition(definition), definition.codecLookup));\n}\n\n// Input for buildBoundContract — all fields from ContractInput except family/target\n// (those are injected by the builder, pre-bound at the call site).\ntype BoundDefinitionInput<\n Types extends Record<string, StorageTypeInstance> = Record<never, never>,\n Models extends Record<string, ModelLike> = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined = undefined,\n Naming extends ContractInput['naming'] | undefined = undefined,\n StorageHash extends string | undefined = undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n Namespaces extends readonly string[] | undefined = undefined,\n> = {\n readonly extensionPacks?: ExtensionPacks;\n readonly naming?: Naming;\n readonly storageHash?: StorageHash;\n readonly foreignKeyDefaults?: ForeignKeyDefaults;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly namespaces?: Namespaces;\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\n readonly enums?: Record<string, EnumTypeHandle>;\n};\n\n// A bare `Record<string, EnumTypeHandle>` (no literal keys) is the widened\n// default for a side that declared no enums; drop it so the merge keeps only\n// literally-authored enum handles.\ntype LiteralEnums<E extends Record<string, EnumTypeHandle>> = string extends keyof E\n ? Record<never, never>\n : E;\n\n// Merges enum handles authored on the scaffold definition with those returned\n// from the factory callback. Either side may be the widened default (empty).\nexport type MergeEnums<\n ScaffoldEnums extends Record<string, EnumTypeHandle>,\n FactoryEnums extends Record<string, EnumTypeHandle>,\n> = LiteralEnums<ScaffoldEnums> & LiteralEnums<FactoryEnums>;\n\n// Merges a bound input with the pre-bound family/target to produce a full ContractDefinition.\ntype WithFamilyTarget<\n Input,\n F extends FamilyPackRef<string>,\n T extends TargetPackRef<'sql', string>,\n> = Input & { readonly family: F; readonly target: T };\n\n/**\n * Shared builder that assembles a SqlContract with pre-bound family and target.\n * Extension wrappers keep their own public overloads and delegate their impl body here;\n * this is a plain overloaded function (not a factory returning an overloaded function)\n * so no overloaded-function-return cast is needed.\n *\n * Overload 1: definition form (no factory).\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<'sql', string>,\n const Definition extends BoundDefinitionInput<\n Record<string, StorageTypeInstance>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined,\n ContractInput['naming'] | undefined,\n string | undefined,\n ForeignKeyDefaultsState | undefined,\n readonly string[] | undefined\n >,\n>(\n family: F,\n target: T,\n definition: Definition,\n factory?: undefined,\n): SqlContractResult<WithFamilyTarget<Definition, F, T>>;\n/**\n * Overload 2: factory form.\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<'sql', string>,\n const Definition extends BoundDefinitionInput<\n Record<string, StorageTypeInstance>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined,\n ContractInput['naming'] | undefined,\n string | undefined,\n ForeignKeyDefaultsState | undefined,\n readonly string[] | undefined\n >,\n const Built extends {\n readonly types?: Record<string, StorageTypeInstance>;\n readonly models?: Record<string, ModelLike>;\n readonly enums?: Record<string, EnumTypeHandle>;\n },\n>(\n family: F,\n target: T,\n definition: Definition,\n factory: (\n helpers: ComposedAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,\n ) => Built,\n): SqlContractResult<WithFamilyTarget<Definition & Built, F, T>>;\n/** Implementation. */\nexport function buildBoundContract(\n family: FamilyPackRef<string>,\n target: TargetPackRef<'sql', string>,\n definition: Omit<ContractInput, 'family' | 'target'>,\n factory?:\n | ((\n helpers: ComposedAuthoringHelpers<\n FamilyPackRef<string>,\n TargetPackRef<'sql', string>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined\n >,\n ) => {\n readonly types?: Record<string, StorageTypeInstance>;\n readonly models?: Record<string, ModelLike>;\n readonly enums?: Record<string, EnumTypeHandle>;\n })\n | undefined,\n) {\n const full = { ...definition, family, target };\n\n if (factory !== undefined) {\n const built = factory(\n createComposedAuthoringHelpers({\n family,\n target,\n extensionPacks: definition.extensionPacks,\n }),\n );\n const mergedEnums = { ...(definition.enums ?? {}), ...built.enums };\n return buildContractFromDsl({\n ...full,\n ...ifDefined('types', built.types),\n ...ifDefined('models', built.models),\n ...ifDefined('enums', Object.keys(mergedEnums).length > 0 ? mergedEnums : undefined),\n });\n }\n\n return buildContractFromDsl(full);\n}\n\nexport function defineContract<\n const Family extends FamilyPackRef<string>,\n const Target extends TargetPackRef<'sql', string>,\n const Types extends Record<string, StorageTypeInstance> = Record<never, never>,\n const Models extends Record<string, ModelLike> = Record<never, never>,\n const ExtensionPacks extends\n | Record<string, ExtensionPackRef<'sql', string>>\n | undefined = undefined,\n const Naming extends ContractInput['naming'] | undefined = undefined,\n const StorageHash extends string | undefined = undefined,\n const ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n const Namespaces extends readonly string[] | undefined = undefined,\n const Enums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n>(\n definition: ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces,\n Enums\n >,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces,\n Enums\n >\n>;\nexport function defineContract<\n const Family extends FamilyPackRef<string>,\n const Target extends TargetPackRef<'sql', string>,\n const Types extends Record<string, StorageTypeInstance> = Record<never, never>,\n const Models extends Record<string, ModelLike> = Record<never, never>,\n const ExtensionPacks extends\n | Record<string, ExtensionPackRef<'sql', string>>\n | undefined = undefined,\n const Naming extends ContractInput['naming'] | undefined = undefined,\n const StorageHash extends string | undefined = undefined,\n const ForeignKeyDefaults extends ForeignKeyDefaultsState | undefined = undefined,\n const Namespaces extends readonly string[] | undefined = undefined,\n const ScaffoldEnums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n const FactoryEnums extends Record<string, EnumTypeHandle> = Record<string, EnumTypeHandle>,\n>(\n definition: ContractScaffold<\n Family,\n Target,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces,\n ScaffoldEnums\n >,\n factory: ContractFactory<Family, Target, Types, Models, ExtensionPacks, FactoryEnums>,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Naming,\n StorageHash,\n ForeignKeyDefaults,\n Namespaces,\n MergeEnums<ScaffoldEnums, FactoryEnums>\n >\n>;\nexport function defineContract(\n definition: ContractInput,\n factory?: ContractFactory<\n FamilyPackRef<string>,\n TargetPackRef<'sql', string>,\n Record<string, StorageTypeInstance>,\n Record<string, ModelLike>,\n Record<string, ExtensionPackRef<'sql', string>> | undefined\n >,\n): SqlContractResult<ContractInput> {\n if (!isContractInput(definition)) {\n throw new TypeError(\n 'defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).',\n );\n }\n\n if (factory !== undefined) {\n return buildBoundContract(definition.family, definition.target, definition, factory);\n }\n return buildBoundContract(definition.family, definition.target, definition);\n}\n\nexport type {\n ComposedAuthoringHelpers,\n ContractInput,\n ContractModelBuilder,\n ModelLike,\n ScalarFieldBuilder,\n};\nexport { extensionModel, field, model, rel };\n"],"mappings":"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"}
|