@prisma-next/sql-contract-ts 0.3.0-pr.99.6 → 0.4.0-dev.1

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.
Files changed (41) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +206 -73
  3. package/dist/config-types.d.mts +8 -0
  4. package/dist/config-types.d.mts.map +1 -0
  5. package/dist/config-types.mjs +14 -0
  6. package/dist/config-types.mjs.map +1 -0
  7. package/dist/contract-builder.d.mts +769 -0
  8. package/dist/contract-builder.d.mts.map +1 -0
  9. package/dist/contract-builder.mjs +1288 -0
  10. package/dist/contract-builder.mjs.map +1 -0
  11. package/package.json +19 -16
  12. package/schemas/data-contract-sql-v1.json +189 -23
  13. package/src/authoring-helper-runtime.ts +139 -0
  14. package/src/authoring-type-utils.ts +168 -0
  15. package/src/build-contract.ts +463 -0
  16. package/src/composed-authoring-helpers.ts +256 -0
  17. package/src/config-types.ts +11 -0
  18. package/src/contract-builder.ts +232 -551
  19. package/src/contract-definition.ts +103 -0
  20. package/src/contract-dsl.ts +1492 -0
  21. package/src/contract-lowering.ts +703 -0
  22. package/src/contract-types.ts +534 -0
  23. package/src/contract-warnings.ts +242 -0
  24. package/src/exports/config-types.ts +2 -0
  25. package/src/exports/contract-builder.ts +23 -2
  26. package/dist/chunk-HTNUNGA2.js +0 -346
  27. package/dist/chunk-HTNUNGA2.js.map +0 -1
  28. package/dist/contract-builder.d.ts +0 -101
  29. package/dist/contract-builder.d.ts.map +0 -1
  30. package/dist/contract.d.ts +0 -50
  31. package/dist/contract.d.ts.map +0 -1
  32. package/dist/exports/contract-builder.d.ts +0 -3
  33. package/dist/exports/contract-builder.d.ts.map +0 -1
  34. package/dist/exports/contract-builder.js +0 -231
  35. package/dist/exports/contract-builder.js.map +0 -1
  36. package/dist/exports/contract.d.ts +0 -2
  37. package/dist/exports/contract.d.ts.map +0 -1
  38. package/dist/exports/contract.js +0 -9
  39. package/dist/exports/contract.js.map +0 -1
  40. package/src/contract.ts +0 -582
  41. package/src/exports/contract.ts +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-builder.mjs","names":["field","encodedDefault","storageTables: Record<string, StorageTable>","executionDefaults: ExecutionMutationDefault[]","models: Record<string, ContractModel>","roots: Record<string, string>","columns: Record<string, StorageColumn>","fieldToColumn: Record<string, string>","domainFields: Record<string, ContractField>","domainFieldRefs: Record<string, DomainFieldRef>","storageFields: Record<string, { readonly column: string }>","modelRelations: Record<string, ContractRelation>","storageHash: StorageHashBase<string>","storage: SqlStorage","extensionPacks: Record<string, unknown>","capabilities: Record<string, Record<string, boolean>>","valueObjects: Record<string, ContractValueObject> | undefined","contract: Contract<SqlStorage>","helpers: Record<string, unknown>","namedConstraintOptions: RuntimeNamedConstraintSpec | undefined","state: State","stageOne: {\n readonly modelName?: ModelName;\n readonly fields: Fields;\n readonly relations: Relations;\n }","attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec>","sqlFactory?: StageInput<SqlContext<Fields>, SqlSpec>","merged: Record<string, unknown>","extensionValues: readonly ExtensionPackRef<'sql', string>[]","components: readonly AuthoringComponent[]","warnings: string[]","inlineIdFields: string[]","idName: string | undefined","constraints: UniqueConstraint[]","foreignKeys: ForeignKeyConstraint[]","fields: FieldNode[]","fieldToColumn: Record<string, string>"],"sources":["../src/build-contract.ts","../src/authoring-helper-runtime.ts","../src/contract-dsl.ts","../src/composed-authoring-helpers.ts","../src/contract-warnings.ts","../src/contract-lowering.ts","../src/contract-builder.ts"],"sourcesContent":["import {\n computeExecutionHash,\n computeProfileHash,\n computeStorageHash,\n} from '@prisma-next/contract/hashing';\nimport {\n type ColumnDefault,\n type ColumnDefaultLiteralInputValue,\n type Contract,\n type ContractField,\n type ContractModel,\n type ContractRelation,\n type ContractValueObject,\n coreHash,\n type ExecutionMutationDefault,\n type ExecutionMutationDefaultValue,\n type JsonValue,\n type StorageHashBase,\n} from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport {\n applyFkDefaults,\n type SqlStorage,\n type StorageColumn,\n type StorageTable,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport { validateStorageSemantics } from '@prisma-next/sql-contract/validators';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ContractDefinition,\n FieldNode,\n ModelNode,\n ValueObjectFieldNode,\n} from './contract-definition';\n\ntype DomainFieldRef =\n | { readonly kind: 'scalar'; readonly many?: boolean }\n | { readonly kind: 'valueObject'; readonly name: string; readonly many?: boolean };\n\nfunction encodeDefaultLiteralValue(\n value: ColumnDefaultLiteralInputValue,\n codecId: string,\n codecLookup?: CodecLookup,\n): JsonValue {\n const codec = codecLookup?.get(codecId);\n if (codec) {\n return codec.encodeJson(value);\n }\n return value as JsonValue;\n}\n\nfunction encodeColumnDefault(\n defaultInput: ColumnDefault,\n codecId: string,\n codecLookup?: CodecLookup,\n): ColumnDefault {\n if (defaultInput.kind === 'function') {\n return { kind: 'function', expression: defaultInput.expression };\n }\n return {\n kind: 'literal',\n value: encodeDefaultLiteralValue(defaultInput.value, codecId, codecLookup),\n };\n}\n\nfunction assertStorageSemantics(storage: SqlStorage): void {\n const semanticErrors = validateStorageSemantics(storage);\n if (semanticErrors.length > 0) {\n throw new Error(`Contract semantic validation failed: ${semanticErrors.join('; ')}`);\n }\n}\n\nfunction assertKnownTargetModel(\n modelsByName: ReadonlyMap<string, ModelNode>,\n sourceModelName: string,\n targetModelName: string,\n context: string,\n): ModelNode {\n const targetModel = modelsByName.get(targetModelName);\n if (!targetModel) {\n throw new Error(\n `${context} on model \"${sourceModelName}\" references unknown model \"${targetModelName}\"`,\n );\n }\n return targetModel;\n}\n\nfunction assertTargetTableMatches(\n sourceModelName: string,\n targetModel: ModelNode,\n referencedTableName: string,\n context: string,\n): void {\n if (targetModel.tableName !== referencedTableName) {\n throw new Error(\n `${context} on model \"${sourceModelName}\" references table \"${referencedTableName}\" but model \"${targetModel.modelName}\" maps to \"${targetModel.tableName}\"`,\n );\n }\n}\n\nfunction isValueObjectField(\n field: FieldNode | ValueObjectFieldNode,\n): field is ValueObjectFieldNode {\n return 'valueObjectName' in field;\n}\n\nconst JSONB_CODEC_ID = 'pg/jsonb@1';\nconst JSONB_NATIVE_TYPE = 'jsonb';\n\nfunction buildStorageColumn(\n field: FieldNode | ValueObjectFieldNode,\n codecLookup?: CodecLookup,\n): StorageColumn {\n if (isValueObjectField(field)) {\n const encodedDefault =\n field.default !== undefined\n ? encodeColumnDefault(field.default, JSONB_CODEC_ID, codecLookup)\n : undefined;\n\n return {\n nativeType: JSONB_NATIVE_TYPE,\n codecId: JSONB_CODEC_ID,\n nullable: field.nullable,\n ...ifDefined('default', encodedDefault),\n };\n }\n\n if (field.many) {\n return {\n nativeType: JSONB_NATIVE_TYPE,\n codecId: JSONB_CODEC_ID,\n nullable: field.nullable,\n };\n }\n\n const codecId = field.descriptor.codecId;\n const encodedDefault =\n field.default !== undefined\n ? encodeColumnDefault(field.default, codecId, codecLookup)\n : undefined;\n\n return {\n nativeType: field.descriptor.nativeType,\n codecId,\n nullable: field.nullable,\n ...ifDefined('typeParams', field.descriptor.typeParams),\n ...ifDefined('default', encodedDefault),\n ...ifDefined('typeRef', field.descriptor.typeRef),\n };\n}\n\nfunction buildDomainField(\n field: FieldNode | ValueObjectFieldNode,\n column: StorageColumn,\n): ContractField {\n if (isValueObjectField(field)) {\n return {\n type: { kind: 'valueObject', name: field.valueObjectName },\n nullable: field.nullable,\n ...(field.many ? { many: true } : {}),\n };\n }\n\n return {\n type: {\n kind: 'scalar',\n codecId: column.codecId,\n ...ifDefined('typeParams', column.typeParams),\n },\n nullable: column.nullable,\n ...(field.many ? { many: true } : {}),\n };\n}\n\nexport function buildSqlContractFromDefinition(\n definition: ContractDefinition,\n codecLookup?: CodecLookup,\n): Contract<SqlStorage> {\n const target = definition.target.targetId;\n const targetFamily = 'sql';\n const modelsByName = new Map(definition.models.map((m) => [m.modelName, m]));\n\n const storageTables: Record<string, StorageTable> = {};\n const executionDefaults: ExecutionMutationDefault[] = [];\n const models: Record<string, ContractModel> = {};\n const roots: Record<string, string> = {};\n\n for (const semanticModel of definition.models) {\n const tableName = semanticModel.tableName;\n roots[tableName] = semanticModel.modelName;\n\n // --- Build storage table ---\n\n const columns: Record<string, StorageColumn> = {};\n const fieldToColumn: Record<string, string> = {};\n const domainFields: Record<string, ContractField> = {};\n const domainFieldRefs: Record<string, DomainFieldRef> = {};\n\n for (const field of semanticModel.fields) {\n if (field.executionDefault) {\n if (field.default !== undefined) {\n throw new Error(\n `Field \"${semanticModel.modelName}.${field.fieldName}\" cannot define both default and executionDefault.`,\n );\n }\n if (field.nullable) {\n throw new Error(\n `Field \"${semanticModel.modelName}.${field.fieldName}\" cannot be nullable when executionDefault is present.`,\n );\n }\n }\n\n const column = buildStorageColumn(field, codecLookup);\n columns[field.columnName] = column;\n fieldToColumn[field.fieldName] = field.columnName;\n\n domainFields[field.fieldName] = buildDomainField(field, column);\n\n if (isValueObjectField(field)) {\n domainFieldRefs[field.fieldName] = {\n kind: 'valueObject',\n name: field.valueObjectName,\n ...(field.many ? { many: true } : {}),\n };\n } else if (field.many) {\n domainFieldRefs[field.fieldName] = { kind: 'scalar', many: true };\n }\n\n if ('executionDefault' in field && field.executionDefault) {\n executionDefaults.push({\n ref: { table: tableName, column: field.columnName },\n onCreate: field.executionDefault as ExecutionMutationDefaultValue,\n });\n }\n }\n\n if (semanticModel.id) {\n const fieldsByColumnName = new Map(\n semanticModel.fields.map((field) => [field.columnName, field]),\n );\n for (const columnName of semanticModel.id.columns) {\n const field = fieldsByColumnName.get(columnName);\n if (field?.nullable) {\n throw new Error(\n `Model \"${semanticModel.modelName}\" uses nullable field \"${field.fieldName}\" in its identity.`,\n );\n }\n }\n }\n\n const foreignKeys = (semanticModel.foreignKeys ?? []).map((fk) => {\n const targetModel = assertKnownTargetModel(\n modelsByName,\n semanticModel.modelName,\n fk.references.model,\n 'Foreign key',\n );\n assertTargetTableMatches(\n semanticModel.modelName,\n targetModel,\n fk.references.table,\n 'Foreign key',\n );\n return {\n columns: fk.columns,\n references: { table: fk.references.table, columns: fk.references.columns },\n ...applyFkDefaults(\n {\n ...ifDefined('constraint', fk.constraint),\n ...ifDefined('index', fk.index),\n },\n definition.foreignKeyDefaults,\n ),\n ...ifDefined('name', fk.name),\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n };\n });\n\n storageTables[tableName] = {\n columns,\n uniques: (semanticModel.uniques ?? []).map((u) => ({\n columns: u.columns,\n ...ifDefined('name', u.name),\n })),\n indexes: (semanticModel.indexes ?? []).map((i) => ({\n columns: i.columns,\n ...ifDefined('name', i.name),\n ...ifDefined('using', i.using),\n ...ifDefined('config', i.config),\n })),\n foreignKeys,\n ...(semanticModel.id\n ? {\n primaryKey: {\n columns: semanticModel.id.columns,\n ...ifDefined('name', semanticModel.id.name),\n },\n }\n : {}),\n };\n\n // --- Build contract model ---\n\n const storageFields: Record<string, { readonly column: string }> = {};\n for (const [fieldName, columnName] of Object.entries(fieldToColumn)) {\n storageFields[fieldName] = { column: columnName };\n }\n\n const columnToField = new Map(\n Object.entries(fieldToColumn).map(([field, col]) => [col, field]),\n );\n const modelRelations: Record<string, ContractRelation> = {};\n for (const relation of semanticModel.relations ?? []) {\n const targetModel = assertKnownTargetModel(\n modelsByName,\n semanticModel.modelName,\n relation.toModel,\n 'Relation',\n );\n assertTargetTableMatches(semanticModel.modelName, targetModel, relation.toTable, 'Relation');\n\n if (relation.cardinality === 'N:M' && !relation.through) {\n throw new Error(\n `Relation \"${semanticModel.modelName}.${relation.fieldName}\" with cardinality \"N:M\" requires through metadata`,\n );\n }\n\n const targetColumnToField = new Map(\n targetModel.fields.map((f) => [f.columnName, f.fieldName]),\n );\n\n modelRelations[relation.fieldName] = {\n to: relation.toModel,\n // RelationDefinition.cardinality includes 'N:M' which isn't in\n // ContractReferenceRelation yet — cast is needed until the contract\n // type is extended to cover many-to-many.\n cardinality: relation.cardinality as ContractRelation['cardinality'],\n on: {\n localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),\n targetFields: relation.on.childColumns.map((col) => targetColumnToField.get(col) ?? col),\n },\n ...(relation.through\n ? {\n through: {\n table: relation.through.table,\n parentCols: relation.through.parentColumns,\n childCols: relation.through.childColumns,\n },\n }\n : undefined),\n };\n }\n\n models[semanticModel.modelName] = {\n storage: {\n table: tableName,\n fields: storageFields,\n },\n fields: domainFields,\n relations: modelRelations,\n };\n }\n\n // --- Assemble contract ---\n\n const storageTypes = (definition.storageTypes ?? {}) as Record<string, StorageTypeInstance>;\n const storageWithoutHash = {\n tables: storageTables,\n types: storageTypes,\n };\n const storageHash: StorageHashBase<string> = definition.storageHash\n ? coreHash(definition.storageHash)\n : computeStorageHash({ target, targetFamily, storage: storageWithoutHash });\n const storage: SqlStorage = { ...storageWithoutHash, storageHash };\n\n const executionSection =\n executionDefaults.length > 0\n ? {\n mutations: {\n defaults: executionDefaults.sort((a, b) => {\n const tableCompare = a.ref.table.localeCompare(b.ref.table);\n if (tableCompare !== 0) {\n return tableCompare;\n }\n return a.ref.column.localeCompare(b.ref.column);\n }),\n },\n }\n : undefined;\n\n const extensionNamespaces = definition.extensionPacks\n ? Object.values(definition.extensionPacks).map((pack) => pack.id)\n : undefined;\n\n const extensionPacks: Record<string, unknown> = { ...(definition.extensionPacks || {}) };\n if (extensionNamespaces) {\n for (const namespace of extensionNamespaces) {\n if (!Object.hasOwn(extensionPacks, namespace)) {\n extensionPacks[namespace] = {};\n }\n }\n }\n\n const capabilities: Record<string, Record<string, boolean>> = definition.capabilities || {};\n const profileHash = computeProfileHash({ target, targetFamily, capabilities });\n\n const executionWithHash = executionSection\n ? {\n ...executionSection,\n executionHash: computeExecutionHash({ target, targetFamily, execution: executionSection }),\n }\n : undefined;\n\n const valueObjects: Record<string, ContractValueObject> | undefined =\n definition.valueObjects && definition.valueObjects.length > 0\n ? Object.fromEntries(\n definition.valueObjects.map((vo) => [\n vo.name,\n {\n fields: Object.fromEntries(\n vo.fields.map((f) => [\n f.fieldName,\n isValueObjectField(f)\n ? {\n type: { kind: 'valueObject' as const, name: f.valueObjectName },\n nullable: f.nullable,\n ...(f.many ? { many: true } : {}),\n }\n : {\n type: {\n kind: 'scalar' as const,\n codecId: f.descriptor.codecId,\n ...ifDefined('typeParams', f.descriptor.typeParams),\n },\n nullable: f.nullable,\n },\n ]),\n ),\n },\n ]),\n )\n : undefined;\n\n const contract: Contract<SqlStorage> = {\n target,\n targetFamily,\n models,\n roots,\n storage,\n ...(executionWithHash ? { execution: executionWithHash } : {}),\n ...ifDefined('valueObjects', valueObjects),\n extensionPacks,\n capabilities,\n profileHash,\n meta: {},\n };\n\n assertStorageSemantics(contract.storage);\n\n return contract;\n}\n","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 } 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[]) => {\n validateAuthoringHelperArguments(helperPath, value.args, args);\n return instantiateAuthoringTypeConstructor(value, args) as StorageTypeInstance;\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 {\n ColumnDefault,\n ColumnDefaultLiteralInputValue,\n ExecutionMutationDefaultValue,\n} from '@prisma-next/contract/types';\nimport type {\n ColumnTypeDescriptor,\n ForeignKeyDefaultsState,\n} 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 } from '@prisma-next/framework-components/codec';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { NamedConstraintSpec } from './authoring-type-utils';\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;\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 executionDefault?: ExecutionMutationDefaultValue | 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 executionDefault?: ExecutionMutationDefaultValue | 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> = 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 isColumnDefault(value: unknown): value is ColumnDefault {\n if (typeof value !== 'object' || value === null) return false;\n const kind = (value as { kind?: unknown }).kind;\n return kind === 'literal' || kind === 'function';\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\n// narrow generic conditional return types through object spread. The runtime values\n// are correct — the casts bridge the gap between the spread result and the\n// 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 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 executionDefault: 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(\n typeRef: NamedStorageTypeRef,\n): ScalarFieldBuilder<ScalarFieldState<string, NamedStorageTypeRef, false, undefined>> {\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 as ColumnDefault | undefined),\n ...ifDefined(\n 'executionDefault',\n preset.executionDefault as ExecutionMutationDefaultValue | undefined,\n ),\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\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;\ntype AnyRelationBuilder = RelationBuilder<AnyRelationState>;\n\ntype ApplyBelongsToRelationSqlSpec<\n State extends RelationState,\n SqlSpec extends BelongsToRelationSqlSpec,\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\nexport type ColumnRef<FieldName extends string = string> = {\n readonly kind: 'columnRef';\n readonly fieldName: FieldName;\n};\n\nexport type TargetFieldRef<\n ModelName extends string = string,\n FieldName extends string = string,\n Source extends TargetFieldRefSource = TargetFieldRefSource,\n> = {\n readonly kind: 'targetFieldRef';\n readonly source: Source;\n readonly modelName: ModelName;\n readonly fieldName: FieldName;\n};\n\nexport type ModelTokenRefs<\n ModelName extends string,\n Fields extends Record<string, ScalarFieldBuilder>,\n> = {\n readonly [K in keyof Fields]: TargetFieldRef<ModelName, K & string>;\n};\n\ntype ConstraintOptions<Name extends string | undefined = string | undefined> = {\n readonly name?: Name;\n};\n\ntype IndexOptions<Name extends string | undefined = string | undefined> =\n ConstraintOptions<Name> & {\n readonly using?: string;\n readonly config?: Record<string, unknown>;\n };\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 using?: string;\n readonly config?: 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 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} {\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 return {\n modelName: first.modelName,\n fieldNames: refs.map((ref) => ref.fieldName),\n source: refs.some((ref) => ref.source === 'string') ? 'string' : 'token',\n };\n}\n\nfunction createConstraintsDsl() {\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<FieldName extends string, Name extends string | undefined = undefined>(\n field: ColumnRef<FieldName>,\n options?: IndexOptions<Name>,\n ): IndexConstraint<readonly [FieldName], Name>;\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?: IndexOptions<Name>,\n ): IndexConstraint<FieldNames, Name>;\n function index(\n fieldOrFields: ColumnRef | readonly ColumnRef[],\n options?: IndexOptions,\n ): IndexConstraint {\n return {\n kind: 'index',\n fields: normalizeFieldRefInput(fieldOrFields),\n ...(options?.name ? { name: options.name } : {}),\n ...(options?.using ? { using: options.using } : {}),\n ...(options?.config ? { config: options.config } : {}),\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 ...(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 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 SqlContext<Fields extends Record<string, ScalarFieldBuilder>> = {\n readonly cols: FieldRefs<Fields>;\n readonly constraints: Pick<ConstraintsDsl, 'index' | 'foreignKey' | 'ref'>;\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>(modelName: ModelName, fields: Fields): ModelTokenRefs<ModelName, Fields> {\n const refs = {} as Record<string, TargetFieldRef>;\n for (const fieldName of Object.keys(fields)) {\n refs[fieldName] = {\n kind: 'targetFieldRef',\n source: 'token',\n modelName,\n fieldName,\n };\n }\n return refs as ModelTokenRefs<ModelName, Fields>;\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(): SqlContext<Record<string, ScalarFieldBuilder>>['constraints'] {\n const constraints = createConstraintsDsl();\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> {\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 readonly refs: ModelName extends string ? ModelTokenRefs<ModelName, Fields> : never;\n\n constructor(\n readonly stageOne: {\n readonly modelName?: ModelName;\n readonly fields: Fields;\n readonly relations: Relations;\n },\n readonly attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec>,\n readonly sqlFactory?: StageInput<SqlContext<Fields>, SqlSpec>,\n ) {\n this.refs = (\n stageOne.modelName ? createModelTokenRefs(stageOne.modelName, stageOne.fields) : undefined\n ) as ModelName extends string ? ModelTokenRefs<ModelName, Fields> : never;\n }\n\n ref<FieldName extends keyof Fields & string>(\n this: ModelName extends string\n ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, SqlSpec>\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<ModelName, Fields, Relations & NextRelations, AttributesSpec, SqlSpec> {\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 );\n }\n\n attributes<const NextAttributesSpec extends ModelAttributesSpec>(\n specOrFactory: StageInput<\n AttributeContext<Fields>,\n ValidateAttributesStageSpec<Fields, SqlSpec, NextAttributesSpec>\n >,\n ): ContractModelBuilder<ModelName, Fields, Relations, NextAttributesSpec, SqlSpec> {\n return new ContractModelBuilder(this.stageOne, specOrFactory, this.sqlFactory);\n }\n\n sql<const NextSqlSpec extends SqlStageSpec>(\n specOrFactory: StageInput<SqlContext<Fields>, NextSqlSpec>,\n ): [ValidateSqlStageSpec<Fields, AttributesSpec, NextSqlSpec>] extends [never]\n ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, never>\n : ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, NextSqlSpec> {\n // Conditional return type cannot be verified by the implementation; the\n // runtime value is always a valid ContractModelBuilder regardless of the\n // validation outcome (validation is type-level only).\n return new ContractModelBuilder(this.stageOne, this.attributesFactory, specOrFactory) as never;\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() as SqlContext<Fields>['constraints'],\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 Capabilities extends Record<string, Record<string, boolean>> | 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 capabilities?: Capabilities;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\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 },\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}): 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 },\n maybeInput?: {\n readonly fields: Fields;\n readonly relations?: Relations;\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 fields: input.fields,\n relations: (input.relations ?? {}) as Relations,\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 return new RelationBuilder({\n kind: 'belongsTo',\n toModel: normalizeRelationModelSource(toModel),\n from: options.from,\n to: options.to,\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 type {\n AuthoringArgumentDescriptor,\n AuthoringFieldNamespace,\n AuthoringTypeConstructorDescriptor,\n AuthoringTypeNamespace,\n} from '@prisma-next/framework-components/authoring';\nimport {\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\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 UnionToIntersection,\n} from './authoring-type-utils';\nimport { buildFieldPreset, field, model, rel } from './contract-dsl';\n\ntype ExtractTypeNamespaceFromPack<Pack> = Pack extends {\n readonly authoring?: { readonly type?: infer Namespace extends AuthoringTypeNamespace };\n}\n ? Namespace\n : Record<never, never>;\n\ntype ExtractFieldNamespaceFromPack<Pack> = Pack extends {\n readonly authoring?: { readonly field?: infer Namespace extends AuthoringFieldNamespace };\n}\n ? Namespace\n : Record<never, never>;\n\ntype MergeExtensionTypeNamespaces<ExtensionPacks> =\n ExtensionPacks extends Record<string, unknown>\n ? keyof ExtensionPacks extends never\n ? Record<never, never>\n : UnionToIntersection<\n {\n [K in keyof ExtensionPacks]: ExtractTypeNamespaceFromPack<ExtensionPacks[K]>;\n }[keyof ExtensionPacks]\n >\n : Record<never, never>;\n\ntype MergeExtensionFieldNamespaces<ExtensionPacks> =\n ExtensionPacks extends Record<string, unknown>\n ? keyof ExtensionPacks extends never\n ? Record<never, never>\n : UnionToIntersection<\n {\n [K in keyof ExtensionPacks]: ExtractFieldNamespaceFromPack<ExtensionPacks[K]>;\n }[keyof ExtensionPacks]\n >\n : Record<never, never>;\n\ntype StorageTypeFromDescriptor<\n Descriptor extends AuthoringTypeConstructorDescriptor,\n Args extends readonly unknown[],\n> = {\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 : 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\nexport type ComposedAuthoringHelpers<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<'sql', string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined,\n> = {\n readonly field: CoreFieldHelpers &\n FieldHelpersFromNamespace<\n ExtractFieldNamespaceFromPack<Family> &\n ExtractFieldNamespaceFromPack<Target> &\n MergeExtensionFieldNamespaces<ExtensionPacks>\n >;\n readonly model: typeof model;\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 mergeHelperNamespaces(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n path: readonly string[],\n leafGuard: (value: unknown) => boolean,\n label: string,\n): void {\n const assertSafePath = (currentPath: readonly string[]) => {\n const blockedSegment = currentPath.find(\n (segment) => segment === '__proto__' || segment === 'constructor' || segment === 'prototype',\n );\n if (blockedSegment) {\n throw new Error(\n `Invalid authoring ${label} helper \"${currentPath.join('.')}\". Helper path segments must not use \"${blockedSegment}\".`,\n );\n }\n };\n\n for (const [key, sourceValue] of Object.entries(source)) {\n const currentPath = [...path, key];\n assertSafePath(currentPath);\n const hasExistingValue = Object.hasOwn(target, key);\n const existingValue = hasExistingValue ? target[key] : undefined;\n\n if (!hasExistingValue) {\n target[key] = sourceValue;\n continue;\n }\n\n const existingIsLeaf = leafGuard(existingValue);\n const sourceIsLeaf = leafGuard(sourceValue);\n\n if (existingIsLeaf || sourceIsLeaf) {\n throw new Error(\n `Duplicate authoring ${label} helper \"${currentPath.join('.')}\". Helper names must be unique across composed packs.`,\n );\n }\n\n mergeHelperNamespaces(\n existingValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n currentPath,\n leafGuard,\n label,\n );\n }\n}\n\ntype AuthoringComponent = {\n readonly authoring?: { readonly type?: unknown; readonly field?: unknown };\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 mergeHelperNamespaces(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 mergeHelperNamespaces(merged, ns, [], isAuthoringFieldPresetDescriptor, 'field');\n }\n }\n return merged as AuthoringFieldNamespace;\n}\n\nfunction createComposedFieldHelpers(\n components: readonly AuthoringComponent[],\n): CoreFieldHelpers & Record<string, unknown> {\n const helperNamespace = createFieldHelpersFromNamespace(\n composeFieldNamespace(components),\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 return {\n field: createComposedFieldHelpers(components),\n model,\n rel,\n type: createTypeHelpersFromNamespace(composeTypeNamespace(components)),\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/contract-authoring';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\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';\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 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 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 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): 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 fromFields = normalizeRelationFieldNames(relation.from);\n const toFields = normalizeRelationFieldNames(relation.to);\n assertRelationFieldArity({\n modelName: currentSpec.modelName,\n relationName,\n leftLabel: 'source',\n leftFields: fromFields,\n rightLabel: 'target',\n rightFields: toFields,\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): RelationNode {\n if (relation.kind === 'belongsTo') {\n return lowerBelongsToRelation(relationName, relation, currentSpec, allSpecs);\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 lowerForeignKeyNode(\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 resolveForeignKeyNodes(\n spec: RuntimeModelSpec,\n allSpecs: ReadonlyMap<string, RuntimeModelSpec>,\n): readonly ForeignKeyNode[] {\n const relationForeignKeys = resolveRelationForeignKeys(spec, allSpecs).map((foreignKey) => {\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 lowerForeignKeyNode(spec, targetSpec, foreignKey);\n });\n\n const sqlForeignKeys = (spec.sqlSpec?.foreignKeys ?? []).map((foreignKey) => {\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 lowerForeignKeyNode(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): 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 fields.push({\n fieldName,\n columnName,\n descriptor,\n nullable: fieldState.nullable,\n ...(fieldState.default ? { default: fieldState.default } : {}),\n ...(fieldState.executionDefault ? { executionDefault: fieldState.executionDefault } : {}),\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 ...(index.name ? { name: index.name } : {}),\n ...(index.using ? { using: index.using } : {}),\n ...(index.config ? { config: index.config } : {}),\n })) satisfies readonly IndexNode[];\n const foreignKeys = resolveForeignKeyNodes(spec, allSpecs);\n const relations = Object.entries(spec.relations).map(([relationName, relationBuilder]) =>\n resolveRelationNode(relationName, relationBuilder.build(), spec, allSpecs),\n );\n\n return {\n modelName: spec.modelName,\n tableName: spec.tableName,\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 };\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 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(collection: RuntimeCollection): 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 ),\n );\n}\n\nexport function buildContractDefinition(definition: ContractInput): ContractDefinition {\n const collection = collectRuntimeModelSpecs(definition);\n const models = lowerModels(collection);\n\n return {\n target: definition.target,\n ...(definition.extensionPacks ? { extensionPacks: definition.extensionPacks } : {}),\n ...(definition.capabilities ? { capabilities: definition.capabilities } : {}),\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 models,\n };\n}\n","import 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 { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport { buildSqlContractFromDefinition } from './build-contract';\nimport {\n type ComposedAuthoringHelpers,\n createComposedAuthoringHelpers,\n} from './composed-authoring-helpers';\nimport {\n type ContractInput,\n type ContractModelBuilder,\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';\n\nexport { buildSqlContractFromDefinition } from './build-contract';\n\ntype ModelLike = {\n readonly stageOne: {\n readonly modelName?: 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 Capabilities extends Record<string, Record<string, boolean>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | 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 capabilities?: Capabilities;\n readonly types?: Types;\n readonly models?: Models;\n readonly codecLookup?: CodecLookup;\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 Capabilities extends Record<string, Record<string, boolean>> | undefined,\n Naming extends ContractInput['naming'] | undefined,\n StorageHash extends string | undefined,\n ForeignKeyDefaults extends ForeignKeyDefaultsState | 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 capabilities?: Capabilities;\n readonly codecLookup?: CodecLookup;\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> = (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\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\nfunction buildContractFromDsl(\n definition: ContractInput,\n): ReturnType<typeof buildSqlContractFromDefinition> {\n validateTargetPackRef(definition.family, definition.target);\n validateExtensionPackRefs(definition.target, definition.extensionPacks);\n\n return buildSqlContractFromDefinition(\n buildContractDefinition(definition),\n definition.codecLookup,\n );\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 Capabilities extends Record<string, Record<string, boolean>> | 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>(\n definition: ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Capabilities,\n Naming,\n StorageHash,\n ForeignKeyDefaults\n >,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Capabilities,\n Naming,\n StorageHash,\n ForeignKeyDefaults\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 Capabilities extends Record<string, Record<string, boolean>> | 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>(\n definition: ContractScaffold<\n Family,\n Target,\n ExtensionPacks,\n Capabilities,\n Naming,\n StorageHash,\n ForeignKeyDefaults\n >,\n factory: ContractFactory<Family, Target, Types, Models, ExtensionPacks>,\n): SqlContractResult<\n ContractDefinition<\n Family,\n Target,\n Types,\n Models,\n ExtensionPacks,\n Capabilities,\n Naming,\n StorageHash,\n ForeignKeyDefaults\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) {\n return buildContractFromDsl(definition);\n }\n\n const builtDefinition = {\n ...definition,\n ...factory(\n createComposedAuthoringHelpers({\n family: definition.family,\n target: definition.target,\n extensionPacks: definition.extensionPacks,\n }),\n ),\n };\n\n return buildContractFromDsl(builtDefinition);\n}\n\nexport { field, model, rel };\nexport type { ComposedAuthoringHelpers, ContractInput, ContractModelBuilder, ScalarFieldBuilder };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,27 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-contract-ts",
3
- "version": "0.3.0-pr.99.6",
3
+ "version": "0.4.0-dev.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "SQL-specific TypeScript contract authoring surface for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.25",
9
9
  "ts-toolbelt": "^9.6.0",
10
- "@prisma-next/contract": "0.3.0-pr.99.6",
11
- "@prisma-next/contract-authoring": "0.3.0-pr.99.6",
12
- "@prisma-next/sql-contract": "0.3.0-pr.99.6"
10
+ "@prisma-next/contract": "0.4.0-dev.1",
11
+ "@prisma-next/config": "0.4.0-dev.1",
12
+ "@prisma-next/contract-authoring": "0.4.0-dev.1",
13
+ "@prisma-next/sql-contract": "0.4.0-dev.1",
14
+ "@prisma-next/framework-components": "0.4.0-dev.1",
15
+ "@prisma-next/utils": "0.4.0-dev.1"
13
16
  },
14
17
  "devDependencies": {
15
18
  "@types/pg": "8.16.0",
16
19
  "pg": "8.16.3",
17
- "tsup": "8.5.1",
20
+ "tsdown": "0.18.4",
18
21
  "typescript": "5.9.3",
19
- "vitest": "4.0.16",
22
+ "vitest": "4.0.17",
20
23
  "@prisma-next/test-utils": "0.0.1",
24
+ "@prisma-next/tsdown": "0.0.0",
21
25
  "@prisma-next/tsconfig": "0.0.0"
22
26
  },
23
27
  "files": [
@@ -26,18 +30,17 @@
26
30
  "schemas"
27
31
  ],
28
32
  "exports": {
29
- "./contract-builder": {
30
- "types": "./dist/exports/contract-builder.d.ts",
31
- "import": "./dist/exports/contract-builder.js"
32
- },
33
- "./contract": {
34
- "types": "./dist/exports/contract.d.ts",
35
- "import": "./dist/exports/contract.js"
36
- },
37
- "./schema-sql": "./schemas/data-contract-sql-v1.json"
33
+ "./config-types": "./dist/config-types.mjs",
34
+ "./contract-builder": "./dist/contract-builder.mjs",
35
+ "./package.json": "./package.json"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/prisma/prisma-next.git",
40
+ "directory": "packages/2-sql/2-authoring/contract-ts"
38
41
  },
39
42
  "scripts": {
40
- "build": "tsup --config tsup.config.ts && tsc --project tsconfig.build.json",
43
+ "build": "tsdown",
41
44
  "test": "vitest run",
42
45
  "test:coverage": "vitest run --coverage",
43
46
  "typecheck": "tsc --project tsconfig.json --noEmit",