@vibeorm/dsl 4.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,24 +1,25 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/column.ts", "../src/enum.ts", "../src/generator/prisma.ts", "../src/predicate.ts", "../src/to-ir.ts", "../src/field-type.ts", "../src/relation-plan.ts", "../src/model.ts", "../src/naming.ts", "../src/relation.ts", "../src/relations.ts", "../src/schema.ts", "../src/templates.ts", "../src/validate.ts", "../src/index.ts"],
3
+ "sources": ["../src/column.ts", "../src/enum.ts", "../src/generator/prisma.ts", "../src/row-rules.ts", "../src/predicate.ts", "../src/to-ir.ts", "../src/field-type.ts", "../src/relation-plan.ts", "../src/model.ts", "../src/naming.ts", "../src/relation.ts", "../src/relations.ts", "../src/schema.ts", "../src/templates.ts", "../src/validate.ts", "../src/index.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Column builders. Chainable style is encouraged; the config-object form is\n * equivalent and fully supported.\n *\n * @example\n * dsl.string().optional()\n * dsl.string().unique().index()\n * dsl.int().default(42)\n * dsl.string({ optional: true })\n */\n\nimport { VibeError, assertJsonSchemaRef, encodePrismaString } from \"@vibeorm/schema\";\nimport type { EnumStorage, JsonSchemaRefIR } from \"@vibeorm/schema\";\nimport type {\n BaseColumnConfig,\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n ColumnDef,\n ColumnType,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n ExtensionTypeConfig,\n FloatColumnConfig,\n IdColumnConfig,\n IdGeneratorType,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n StringColumnConfig,\n UnsupportedColumnConfig,\n} from \"./types.ts\";\n\n// ─── Clone helper ─────────────────────────\n\n/**\n * Shallow-clones a column definition with a fresh `__config`, so columns\n * spread from a template are never shared between models.\n */\nexport function cloneColumnDef(params: { column: ColumnDef }): ColumnDef {\n const { column } = params;\n return {\n __type: \"column\",\n __columnType: column.__columnType,\n __name: column.__name,\n __config: { ...column.__config, ...(column.__config.jsonSchema === undefined ? {} : { jsonSchema: assertJsonSchemaRef({ value: column.__config.jsonSchema }) }) },\n __enumValues: column.__enumValues,\n __enumName: column.__enumName,\n __enumStorage: column.__enumStorage,\n };\n}\n\n// ─── Chainable columns ────────────────────\n\ntype ColumnDefaultValues = {\n string: string;\n int: number;\n bigint: bigint | number;\n float: number;\n decimal: string | number;\n boolean: boolean;\n datetime: string | Date;\n json: unknown;\n id: never;\n bytes: Uint8Array | string;\n enum: string;\n unsupported: unknown;\n};\n\n/** Chainable column builder shared by every column kind. */\nexport class ChainableColumn<T extends ColumnType = ColumnType> implements ColumnDef<T> {\n readonly __type: \"column\" = \"column\";\n readonly __columnType: T;\n __config: BaseColumnConfig;\n __name?: string;\n __enumValues?: readonly string[];\n __enumName?: string;\n __enumStorage?: EnumStorage;\n\n constructor(columnType: T, config: BaseColumnConfig = {}) {\n this.__columnType = columnType;\n this.__config = { ...config };\n }\n\n /** Marks the column nullable (`Type?`). */\n optional(): this {\n this.__config.optional = true;\n return this;\n }\n\n /** Adds a `@unique` constraint. */\n unique(): this {\n this.__config.unique = true;\n return this;\n }\n\n /** Adds a single-column index. */\n index(): this {\n this.__config.index = true;\n return this;\n }\n\n /** Marks the column as a list (`Type[]`). */\n array(): this {\n this.__config.array = true;\n return this;\n }\n\n /** Sets a literal default value. */\n default(value: ColumnDefaultValues[T] | readonly ColumnDefaultValues[T][]): this {\n this.__config.default = value;\n return this;\n }\n\n /** `@map(\"db_column\")` — database column name when it differs. */\n map(dbColumnName: string): this {\n this.__config.map = dbColumnName;\n return this;\n }\n\n /** `@default(dbgenerated(\"expression\"))` — database-native default. */\n dbgenerated(expression: string): this {\n this.__config.dbgenerated = expression;\n return this;\n }\n\n /** Emits a `///` doc comment above the column. */\n comment(text: string): this {\n this.__config.comment = text;\n return this;\n }\n}\n\n/** String column with database-level type annotations. */\nexport class ChainableStringColumn extends ChainableColumn<\"string\"> {\n constructor(config: StringColumnConfig = {}) {\n super(\"string\", config);\n }\n\n /** `@db.VarChar(n)` */\n maxLength(n: number): this {\n (this.__config as StringColumnConfig).maxLength = n;\n return this;\n }\n\n /** `@db.Text` */\n text(): this {\n (this.__config as StringColumnConfig).text = true;\n return this;\n }\n\n /**\n * `@db.Uuid` — PostgreSQL's native 128-bit uuid column; values stay strings.\n * SQLite stores the string as TEXT; MySQL has no uuid type and refuses it.\n */\n uuid(): this {\n (this.__config as StringColumnConfig).uuid = true;\n return this;\n }\n\n /** `@collation(\"...\")` — explicit column collation (mysql-rendered; inert on postgres/sqlite). */\n collation(name: string): this {\n (this.__config as StringColumnConfig).collation = name;\n return this;\n }\n}\n\n/** Decimal column carrying precision/scale. */\nexport class ChainableDecimalColumn extends ChainableColumn<\"decimal\"> {\n constructor(config: DecimalColumnConfig = {}) {\n super(\"decimal\", config);\n }\n\n /** `@db.Decimal(precision, scale)` */\n precision(p: number, s?: number): this {\n (this.__config as DecimalColumnConfig).precision = p;\n if (s !== undefined) {\n (this.__config as DecimalColumnConfig).scale = s;\n }\n return this;\n }\n}\n\n/** DateTime column with timestamp-specific helpers. */\nexport class ChainableDatetimeColumn extends ChainableColumn<\"datetime\"> {\n constructor(config: DatetimeColumnConfig = {}) {\n super(\"datetime\", config);\n }\n\n /**\n * `@db.Timestamptz` — timezone-aware timestamp; `{ precision: n }` declares\n * `@db.Timestamptz(n)` (0–6 fractional-seconds digits). Precision 3 stores\n * exactly what a JavaScript `Date` holds, so a database-written value reads\n * back unchanged and `findPage` may order by it without an assertion.\n */\n tz(options?: { readonly precision?: number }): this {\n (this.__config as DatetimeColumnConfig).tz = true;\n if (options?.precision !== undefined) {\n (this.__config as DatetimeColumnConfig).precision = options.precision;\n }\n return this;\n }\n\n /** `@updatedAt` — refreshed on every update. */\n updatedAt(): this {\n (this.__config as DatetimeColumnConfig).updatedAt = true;\n return this;\n }\n\n /** `@default(now())` */\n defaultNow(): this {\n (this.__config as DatetimeColumnConfig).default = \"now\";\n return this;\n }\n}\n\n/** Primary-key column with a generator strategy. */\nexport class ChainableIdColumn extends ChainableColumn<\"id\"> {\n constructor(config: IdColumnConfig = {}) {\n super(\"id\", { ...config, type: config.type ?? \"ulid\" });\n }\n\n /** Sets the id generator strategy (default `\"ulid\"`). */\n type(idType: IdGeneratorType): this {\n (this.__config as IdColumnConfig).type = idType;\n return this;\n }\n\n /**\n * `@db.Uuid` — store a String id in PostgreSQL's native uuid column. Pair it\n * with an app-side strategy (`type: \"uuid\"`), or with `type: \"none\"` and a\n * database default: `dsl.id({ type: \"none\" }).uuid().dbgenerated(\"uuidv7()\")`.\n */\n uuid(): this {\n (this.__config as IdColumnConfig).uuid = true;\n return this;\n }\n}\n\n/** Enum column whose `default()` is constrained to the declared options. */\nexport class ChainableEnumColumn<\n T extends readonly string[] = readonly string[],\n> extends ChainableColumn<\"enum\"> {\n constructor(params: {\n options: T;\n config?: BaseColumnConfig;\n enumName?: string;\n storage?: EnumStorage;\n }) {\n super(\"enum\", params.config ?? {});\n this.__enumValues = params.options;\n if (params.enumName !== undefined) {\n this.__enumName = params.enumName;\n }\n if (params.storage !== undefined) {\n this.__enumStorage = params.storage;\n }\n }\n\n /** Sets the default to one of the declared options. */\n default(value: T[number] | readonly T[number][]): this {\n this.__config.default = value;\n return this;\n }\n}\n\n// ─── Column factories ─────────────────────\n\n/**\n * String column.\n *\n * @example\n * dsl.string() // String\n * dsl.string().optional() // String?\n * dsl.string().unique().index() // String @unique + @@index\n */\nexport function string(config: StringColumnConfig = {}): ChainableStringColumn {\n return new ChainableStringColumn(config);\n}\n\n/** Integer column with database-generated values independent of primary-key membership. */\nexport class ChainableIntegerColumn<T extends \"int\" | \"bigint\"> extends ChainableColumn<T> {\n /** Assign values from the database sequence; does not imply a key or uniqueness. */\n autoincrement(): this {\n this.__config.autoincrement = true;\n return this;\n }\n}\n\n/** Int column. */\nexport function int(config: IntColumnConfig = {}): ChainableIntegerColumn<\"int\"> {\n return new ChainableIntegerColumn(\"int\", config);\n}\n\n/** Float column. */\nexport function float(config: FloatColumnConfig = {}): ChainableColumn<\"float\"> {\n return new ChainableColumn(\"float\", config);\n}\n\n/** Decimal column. */\nexport function decimal(config: DecimalColumnConfig = {}): ChainableDecimalColumn {\n return new ChainableDecimalColumn(config);\n}\n\n/** Boolean column. */\nexport function boolean(config: BooleanColumnConfig = {}): ChainableColumn<\"boolean\"> {\n return new ChainableColumn(\"boolean\", config);\n}\n\n/**\n * DateTime column.\n *\n * @example\n * dsl.datetime().defaultNow().updatedAt().tz()\n * dsl.datetime().defaultNow().tz({ precision: 3 })\n */\nexport function datetime(config: DatetimeColumnConfig = {}): ChainableDatetimeColumn {\n return new ChainableDatetimeColumn(config);\n}\n\n/** Json column with a consumer-declared payload type (typed JSON). */\nexport class ChainableJsonColumn extends ChainableColumn<\"json\"> {\n constructor(config: JsonColumnConfig = {}) {\n super(\"json\", { ...config, ...(config.jsonSchema === undefined ? {} : { jsonSchema: assertJsonSchemaRef({ value: config.jsonSchema }) }) });\n }\n\n /** Bind runtime write/read validation to a consumer-owned named export. */\n schema(reference: JsonSchemaRefIR): this {\n if (this.__config.jsonSchema !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field may declare only one JSON schema reference\", meta: { issues: [{ rule: \"duplicate-json-schema-ref\" }] } });\n this.__config.jsonSchema = assertJsonSchemaRef({ value: reference });\n return this;\n }\n\n /**\n * Declares the TS type of this column's payload. Written as a\n * `/// @type(Name from \"specifier\")` doc comment — the annotation rides the\n * existing comment plumbing into the IR, and the generator substitutes the\n * named type (with its import) for `JsonValue` in the emitted `.d.ts`.\n * A TYPE assertion, not a runtime guarantee — pair with `validate` on the\n * client and/or a named `@@check` for enforcement.\n */\n typed(config: { name: string; from: string }): this {\n const ref = assertJsonSchemaRef({ value: config });\n const annotation = `@type(${ref.name} from ${encodePrismaString({ value: ref.from })})`;\n this.__config.comment =\n this.__config.comment === undefined ? annotation : `${this.__config.comment} ${annotation}`;\n return this;\n }\n}\n\n/** Json column. */\nexport function json(config: JsonColumnConfig = {}): ChainableJsonColumn {\n return new ChainableJsonColumn(config);\n}\n\n/**\n * Primary-key column.\n *\n * @example\n * dsl.id() // String @id @default(ulid())\n * dsl.id({ type: \"uuid\" }) // String @id @default(uuid())\n * dsl.id().type(\"autoincrement\") // Int @id @default(autoincrement())\n * dsl.id({ type: \"none\" }).uuid().dbgenerated(\"uuidv7()\") // String @id @db.Uuid @default(dbgenerated(\"uuidv7()\"))\n */\nexport function id(config: IdColumnConfig = {}): ChainableIdColumn {\n return new ChainableIdColumn(config);\n}\n\n/** Bytes column. */\nexport function bytes(config: BytesColumnConfig = {}): ChainableColumn<\"bytes\"> {\n return new ChainableColumn(\"bytes\", config);\n}\n\n/** BigInt column, for values beyond 32-bit ints. */\nexport function bigint(config: BigIntColumnConfig = {}): ChainableIntegerColumn<\"bigint\"> {\n return new ChainableIntegerColumn(\"bigint\", config);\n}\n\n/**\n * Column with a database-native type Prisma cannot model.\n *\n * @example\n * dsl.unsupported(\"tsvector\")\n * dsl.unsupported(\"geometry(Point, 4326)\")\n */\nexport function unsupported(dbType: string): ChainableColumn<\"unsupported\"> {\n const config: UnsupportedColumnConfig = { dbType };\n return new ChainableColumn(\"unsupported\", config);\n}\n\n/**\n * Column typed by a registered extension — the DSL twin of writing\n * `embedding Vector(1536)` in .prisma. The extension registry lowers it to a\n * native database type at `toIR` time; like `Unsupported`, it stays out of the\n * core queryable surface (the extension's client plane covers it).\n *\n * @example\n * embedding: dsl.extensionType({ type: \"Vector\", args: [1536] })\n */\nexport function extensionType(config: ExtensionTypeConfig): ChainableColumn<\"unsupported\"> {\n const { type, args, ...rest } = config;\n return new ChainableColumn(\"unsupported\", {\n ...rest,\n dbType: \"\",\n extensionType: type,\n extensionArgs: [...(args ?? [])],\n });\n}\n\n/**\n * Inline (one-off) enum column. For a reusable enum use\n * `dsl.enum({ name, options })` and its `.field()`.\n *\n * @example\n * dsl.enum({ options: [\"low\", \"high\"] }).default(\"low\")\n */\nexport function enumCol<const T extends readonly string[]>(\n config: InlineEnumConfig<T>\n): ChainableEnumColumn<T> {\n const { options, storage, ...restConfig } = config;\n // No enum name: `dsl.schema()` derives `${Model}${Column}` for inline enums.\n return new ChainableEnumColumn<T>({\n options,\n config: restConfig,\n ...(storage === undefined ? {} : { storage }),\n });\n}\n",
5
+ "/**\n * Column builders. Chainable style is encouraged; the config-object form is\n * equivalent and fully supported.\n *\n * @example\n * dsl.string().optional()\n * dsl.string().unique().index()\n * dsl.int().default(42)\n * dsl.string({ optional: true })\n */\n\nimport { VibeError, assertJsonSchemaRef, assertValidatorRef, encodePrismaString, generatedColumnFromSql } from \"@vibeorm/schema\";\nimport type { EnumStorage, GeneratedColumnOptions, JsonSchemaRefIR, ValidatorRefIR } from \"@vibeorm/schema\";\nimport type {\n BaseColumnConfig,\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n CheckRuleOptions,\n ColumnCheckRule,\n ColumnCheckShape,\n ColumnDef,\n ColumnType,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n ExtensionTypeConfig,\n FloatColumnConfig,\n IdColumnConfig,\n IdGeneratorType,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n LocalDateColumnConfig,\n StringColumnConfig,\n UnsupportedColumnConfig,\n} from \"./types.ts\";\n\n// ─── Clone helper ─────────────────────────\n\n/**\n * Shallow-clones a column definition with a fresh `__config`, so columns\n * spread from a template are never shared between models.\n */\nexport function cloneColumnDef(params: { column: ColumnDef }): ColumnDef {\n const { column } = params;\n return {\n __type: \"column\",\n __columnType: column.__columnType,\n __name: column.__name,\n __config: { ...column.__config, ...(column.__config.jsonSchema === undefined ? {} : { jsonSchema: assertJsonSchemaRef({ value: column.__config.jsonSchema }) }), ...(column.__config.validator === undefined ? {} : { validator: assertValidatorRef({ value: column.__config.validator }) }), ...(\"generated\" in column.__config ? { generated: Object.freeze({ sql: generatedColumnFromSql({ value: column.__config.generated }).expression }) } : {}) },\n __enumValues: column.__enumValues,\n __enumName: column.__enumName,\n __enumStorage: column.__enumStorage,\n };\n}\n\n// ─── Chainable columns ────────────────────\n\ntype ColumnDefaultValues = {\n string: string;\n localDate: string;\n int: number;\n bigint: bigint | number;\n float: number;\n decimal: string | number;\n boolean: boolean;\n datetime: string | Date;\n json: unknown;\n id: never;\n bytes: Uint8Array | string;\n enum: string;\n unsupported: unknown;\n};\n\n/** Chainable column builder shared by every column kind. */\nexport class ChainableColumn<T extends ColumnType = ColumnType> implements ColumnDef<T> {\n readonly __type: \"column\" = \"column\";\n readonly __columnType: T;\n __config: BaseColumnConfig;\n __name?: string;\n __enumValues?: readonly string[];\n __enumName?: string;\n __enumStorage?: EnumStorage;\n\n constructor(columnType: T, config: BaseColumnConfig = {}) {\n this.__columnType = columnType;\n this.__config = { ...config, ...(config.validator === undefined ? {} : { validator: assertValidatorRef({ value: config.validator }) }), ...(\"generated\" in config ? { generated: Object.freeze({ sql: generatedColumnFromSql({ value: config.generated }).expression }) } : {}) };\n }\n\n /** Marks the column nullable (`Type?`). */\n optional(): this {\n this.__config.optional = true;\n return this;\n }\n\n /** Adds a `@unique` constraint. */\n unique(): this {\n this.__config.unique = true;\n return this;\n }\n\n /** Adds a single-column index. */\n index(): this {\n this.__config.index = true;\n return this;\n }\n\n /** Marks the column as a list (`Type[]`). */\n array(): this {\n this.__config.array = true;\n return this;\n }\n\n /** Sets a literal default value. */\n default(value: ColumnDefaultValues[T] | readonly ColumnDefaultValues[T][]): this {\n this.__config.default = value;\n return this;\n }\n\n /** `@map(\"db_column\")` — database column name when it differs. */\n map(dbColumnName: string): this {\n this.__config.map = dbColumnName;\n return this;\n }\n\n /** `@default(dbgenerated(\"expression\"))` — database-native default. */\n dbgenerated(expression: string): this {\n this.__config.dbgenerated = expression;\n return this;\n }\n\n /** Declare a stored database expression, distinct from a default and never client-writable. */\n generated(options: GeneratedColumnOptions): this {\n if (\"generated\" in this.__config) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field may declare generation only once\", meta: { issues: [{ rule: \"generated-column-duplicate\" }] } });\n const generated = generatedColumnFromSql({ value: options });\n this.__config.generated = Object.freeze({ sql: generated.expression });\n return this;\n }\n\n /** Bind synchronous write validation without changing the column's public scalar type. */\n validate(reference: T extends \"json\" | \"unsupported\" ? never : ValidatorRefIR): this {\n if (this.__columnType === \"json\" || this.__columnType === \"unsupported\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Validators are only valid on queryable non-JSON scalar or enum columns; use .schema() for Json\", meta: { issues: [{ rule: \"validator-non-scalar\" }] } });\n if (this.__config.jsonSchema !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field cannot combine a scalar validator with a JSON schema\", meta: { issues: [{ rule: \"conflicting-validator-ref\" }] } });\n if (this.__config.validator !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field may declare only one validator reference\", meta: { issues: [{ rule: \"duplicate-validator-ref\" }] } });\n this.__config.validator = assertValidatorRef({ value: reference });\n return this;\n }\n\n /** Emits a `///` doc comment above the column. */\n comment(text: string): this {\n this.__config.comment = text;\n return this;\n }\n\n /**\n * Record a one-column CHECK rule. Copy-on-write: `cloneColumnDef` copies the\n * config shallowly, so a pushed array would leak into every model built from\n * the same template column.\n */\n protected addCheckRule(params: { rule: string; check: ColumnCheckShape; options: CheckRuleOptions | undefined }): this {\n const { options } = params;\n const rule: ColumnCheckRule = Object.freeze({\n rule: options?.rule ?? params.rule,\n check: Object.freeze(params.check.kind === \"oneOf\" ? { ...params.check, values: Object.freeze([...params.check.values]) } : params.check),\n ...(options?.name === undefined ? {} : { name: options.name }),\n });\n this.__config.checks = Object.freeze([...(this.__config.checks ?? []), rule]);\n return this;\n }\n}\n\n// ─── Numeric columns ───────────────────\n\n/** Column kinds that take numeric check rules. */\nexport type NumericColumnType = \"int\" | \"bigint\" | \"float\" | \"decimal\";\n\n/**\n * The literal a numeric rule takes, per column kind. Decimal takes exact\n * decimal TEXT (`\"19.99\"`): a JavaScript number cannot carry an exact decimal.\n */\nexport type NumericRuleLiteral = {\n readonly int: number;\n readonly bigint: bigint | number;\n readonly float: number;\n readonly decimal: string;\n};\n\n/** A numeric literal in the exact carrier form a predicate takes (BigInt as decimal text). */\nfunction numericCarrier(value: string | number | bigint): string | number {\n return typeof value === \"bigint\" ? value.toString() : value;\n}\n\n/**\n * A numeric column with one-column CHECK rules. Each rule becomes a named CHECK\n * `<Table>_<column>_<rule>_check`; `{ name }` replaces the name. A comparison\n * passes on NULL, so on an optional column the rule holds the values that are set.\n */\nexport class ChainableNumericColumn<T extends NumericColumnType> extends ChainableColumn<T> {\n /** The zero literal of this column kind. */\n private zero(): string | number {\n return this.__columnType === \"decimal\" ? \"0\" : 0;\n }\n\n /** `CHECK (\"col\" >= 0)`, rule word `nonNegative`. */\n nonNegative(options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"nonNegative\", check: { kind: \"compare\", op: \"gte\", value: this.zero() }, options });\n }\n\n /** `CHECK (\"col\" > 0)`, rule word `positive`. */\n positive(options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"positive\", check: { kind: \"compare\", op: \"gt\", value: this.zero() }, options });\n }\n\n /** `CHECK (\"col\" >= value)`, rule word `atLeast`. */\n atLeast(value: NumericRuleLiteral[T], options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"atLeast\", check: { kind: \"compare\", op: \"gte\", value: numericCarrier(value) }, options });\n }\n\n /** `CHECK (\"col\" <= value)`, rule word `atMost`. */\n atMost(value: NumericRuleLiteral[T], options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"atMost\", check: { kind: \"compare\", op: \"lte\", value: numericCarrier(value) }, options });\n }\n\n /** `CHECK (\"col\" >= min AND \"col\" <= max)`, rule word `range`. Both bounds are included. */\n range(range: CheckRuleOptions & { readonly min: NumericRuleLiteral[T]; readonly max: NumericRuleLiteral[T] }): this {\n const { min, max, ...options } = range;\n return this.addCheckRule({ rule: \"range\", check: { kind: \"range\", min: numericCarrier(min), max: numericCarrier(max) }, options });\n }\n}\n\n/** String column with database-level type annotations. */\nexport class ChainableStringColumn extends ChainableColumn<\"string\"> {\n constructor(config: StringColumnConfig = {}) {\n super(\"string\", config);\n }\n\n /** `@db.VarChar(n)` */\n maxLength(n: number): this {\n (this.__config as StringColumnConfig).maxLength = n;\n return this;\n }\n\n /** `@db.Text` */\n text(): this {\n (this.__config as StringColumnConfig).text = true;\n return this;\n }\n\n /**\n * `@db.Uuid` — PostgreSQL's native 128-bit uuid column; values stay strings.\n * SQLite stores the string as TEXT; MySQL has no uuid type and refuses it.\n */\n uuid(): this {\n (this.__config as StringColumnConfig).uuid = true;\n return this;\n }\n\n /** `@collation(\"...\")` — explicit column collation (mysql-rendered; inert on postgres/sqlite). */\n collation(name: string): this {\n (this.__config as StringColumnConfig).collation = name;\n return this;\n }\n\n /** `CHECK (\"col\" IN (values))`, rule word `allowed`. */\n oneOf(values: readonly string[], options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"allowed\", check: { kind: \"oneOf\", values: [...values] }, options });\n }\n\n /**\n * `CHECK (length(\"col\") <= max)`, rule word `length` — a CHECK on any text\n * column, PostgreSQL/PGlite only. `.maxLength(n)` instead changes the column\n * TYPE to `VarChar(n)` and works on every dialect.\n */\n lengthAtMost(max: number, options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"length\", check: { kind: \"lengthAtMost\", max }, options });\n }\n}\n\n/** Decimal column carrying precision/scale. */\nexport class ChainableDecimalColumn extends ChainableNumericColumn<\"decimal\"> {\n constructor(config: DecimalColumnConfig = {}) {\n super(\"decimal\", config);\n }\n\n /** `@db.Decimal(precision, scale)` */\n precision(p: number, s?: number): this {\n (this.__config as DecimalColumnConfig).precision = p;\n if (s !== undefined) {\n (this.__config as DecimalColumnConfig).scale = s;\n }\n return this;\n }\n}\n\n/** DateTime column with timestamp-specific helpers. */\nexport class ChainableDatetimeColumn extends ChainableColumn<\"datetime\"> {\n constructor(config: DatetimeColumnConfig = {}) {\n super(\"datetime\", config);\n }\n\n /**\n * `@db.Timestamptz` — timezone-aware timestamp; `{ precision: n }` declares\n * `@db.Timestamptz(n)` (0–6 fractional-seconds digits). Precision 3 stores\n * exactly what a JavaScript `Date` holds, so a database-written value reads\n * back unchanged and `findPage` may order by it without an assertion.\n */\n tz(options?: { readonly precision?: number }): this {\n (this.__config as DatetimeColumnConfig).tz = true;\n if (options?.precision !== undefined) {\n (this.__config as DatetimeColumnConfig).precision = options.precision;\n }\n return this;\n }\n\n /** `@updatedAt` — refreshed on every update. */\n updatedAt(): this {\n (this.__config as DatetimeColumnConfig).updatedAt = true;\n return this;\n }\n\n /** `@default(now())` */\n defaultNow(): this {\n (this.__config as DatetimeColumnConfig).default = \"now\";\n return this;\n }\n}\n\n/** Primary-key column with a generator strategy. */\nexport class ChainableIdColumn extends ChainableColumn<\"id\"> {\n constructor(config: IdColumnConfig = {}) {\n super(\"id\", { ...config, type: config.type ?? \"ulid\" });\n }\n\n /** Sets the id generator strategy (default `\"ulid\"`). */\n type(idType: IdGeneratorType): this {\n (this.__config as IdColumnConfig).type = idType;\n return this;\n }\n\n /**\n * `@db.Uuid` — store a String id in PostgreSQL's native uuid column. Pair it\n * with an app-side strategy (`type: \"uuid\"`), or with `type: \"none\"` and a\n * database default: `dsl.id({ type: \"none\" }).uuid().dbgenerated(\"uuidv7()\")`.\n */\n uuid(): this {\n (this.__config as IdColumnConfig).uuid = true;\n return this;\n }\n}\n\n/** Enum column whose `default()` is constrained to the declared options. */\nexport class ChainableEnumColumn<\n T extends readonly string[] = readonly string[],\n> extends ChainableColumn<\"enum\"> {\n constructor(params: {\n options: T;\n config?: BaseColumnConfig;\n enumName?: string;\n storage?: EnumStorage;\n }) {\n super(\"enum\", params.config ?? {});\n this.__enumValues = params.options;\n if (params.enumName !== undefined) {\n this.__enumName = params.enumName;\n }\n if (params.storage !== undefined) {\n this.__enumStorage = params.storage;\n }\n }\n\n /** The declared members, typed as the option tuple (presence tables read it). */\n declare __enumValues?: T;\n\n /** Sets the default to one of the declared options. */\n default(value: T[number] | readonly T[number][]): this {\n this.__config.default = value;\n return this;\n }\n\n /** `CHECK (\"col\" IN (members))` — a subset of the enum's members, rule word `allowed`. */\n oneOf(values: readonly T[number][], options?: CheckRuleOptions): this {\n return this.addCheckRule({ rule: \"allowed\", check: { kind: \"oneOf\", values: [...values] }, options });\n }\n}\n\n// ─── Column factories ─────────────────────\n\n/**\n * String column.\n *\n * @example\n * dsl.string() // String\n * dsl.string().optional() // String?\n * dsl.string().unique().index() // String @unique + @@index\n */\nexport function string(config: StringColumnConfig = {}): ChainableStringColumn {\n return new ChainableStringColumn(config);\n}\n\n/** Integer column with database-generated values independent of primary-key membership. */\nexport class ChainableIntegerColumn<T extends \"int\" | \"bigint\"> extends ChainableNumericColumn<T> {\n /** Assign values from the database sequence; does not imply a key or uniqueness. */\n autoincrement(): this {\n this.__config.autoincrement = true;\n return this;\n }\n}\n\n/** A Gregorian calendar day as canonical YYYY-MM-DD text, not a JavaScript Date. */\nexport function localDate({ ...config }: LocalDateColumnConfig = {}): ChainableColumn<\"localDate\"> {\n return new ChainableColumn(\"localDate\", config);\n}\n\n/** Int column. */\nexport function int(config: IntColumnConfig = {}): ChainableIntegerColumn<\"int\"> {\n return new ChainableIntegerColumn(\"int\", config);\n}\n\n/** Float column with numeric check rules. */\nexport class ChainableFloatColumn extends ChainableNumericColumn<\"float\"> {\n constructor(config: FloatColumnConfig = {}) {\n super(\"float\", config);\n }\n}\n\n/** Float column. */\nexport function float(config: FloatColumnConfig = {}): ChainableFloatColumn {\n return new ChainableFloatColumn(config);\n}\n\n/** Decimal column. */\nexport function decimal(config: DecimalColumnConfig = {}): ChainableDecimalColumn {\n return new ChainableDecimalColumn(config);\n}\n\n/** Boolean column. */\nexport function boolean(config: BooleanColumnConfig = {}): ChainableColumn<\"boolean\"> {\n return new ChainableColumn(\"boolean\", config);\n}\n\n/**\n * DateTime column.\n *\n * @example\n * dsl.datetime().defaultNow().updatedAt().tz()\n * dsl.datetime().defaultNow().tz({ precision: 3 })\n */\nexport function datetime(config: DatetimeColumnConfig = {}): ChainableDatetimeColumn {\n return new ChainableDatetimeColumn(config);\n}\n\n/** Json column with a consumer-declared payload type (typed JSON). */\nexport class ChainableJsonColumn extends ChainableColumn<\"json\"> {\n constructor(config: JsonColumnConfig = {}) {\n super(\"json\", { ...config, ...(config.jsonSchema === undefined ? {} : { jsonSchema: assertJsonSchemaRef({ value: config.jsonSchema }) }) });\n }\n\n /** Bind runtime write/read validation to a consumer-owned named export. */\n schema(reference: JsonSchemaRefIR): this {\n if (this.__config.validator !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field cannot combine a scalar validator with a JSON schema\", meta: { issues: [{ rule: \"conflicting-validator-ref\" }] } });\n if (this.__config.jsonSchema !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A field may declare only one JSON schema reference\", meta: { issues: [{ rule: \"duplicate-json-schema-ref\" }] } });\n this.__config.jsonSchema = assertJsonSchemaRef({ value: reference });\n return this;\n }\n\n /**\n * Declares the TS type of this column's payload. Written as a\n * `/// @type(Name from \"specifier\")` doc comment — the annotation rides the\n * existing comment plumbing into the IR, and the generator substitutes the\n * named type (with its import) for `JsonValue` in the emitted `.d.ts`.\n * A TYPE assertion, not a runtime guarantee — pair with `validate` on the\n * client and/or a named `@@check` for enforcement.\n */\n typed(config: { name: string; from: string }): this {\n const ref = assertJsonSchemaRef({ value: config });\n const annotation = `@type(${ref.name} from ${encodePrismaString({ value: ref.from })})`;\n this.__config.comment =\n this.__config.comment === undefined ? annotation : `${this.__config.comment} ${annotation}`;\n return this;\n }\n}\n\n/** Json column. */\nexport function json(config: JsonColumnConfig = {}): ChainableJsonColumn {\n return new ChainableJsonColumn(config);\n}\n\n/**\n * Primary-key column.\n *\n * @example\n * dsl.id() // String @id @default(ulid())\n * dsl.id({ type: \"uuid\" }) // String @id @default(uuid())\n * dsl.id().type(\"autoincrement\") // Int @id @default(autoincrement())\n * dsl.id({ type: \"none\" }).uuid().dbgenerated(\"uuidv7()\") // String @id @db.Uuid @default(dbgenerated(\"uuidv7()\"))\n */\nexport function id(config: IdColumnConfig = {}): ChainableIdColumn {\n return new ChainableIdColumn(config);\n}\n\n/** Bytes column. */\nexport function bytes(config: BytesColumnConfig = {}): ChainableColumn<\"bytes\"> {\n return new ChainableColumn(\"bytes\", config);\n}\n\n/** BigInt column, for values beyond 32-bit ints. */\nexport function bigint(config: BigIntColumnConfig = {}): ChainableIntegerColumn<\"bigint\"> {\n return new ChainableIntegerColumn(\"bigint\", config);\n}\n\n/**\n * Column with a database-native type Prisma cannot model.\n *\n * @example\n * dsl.unsupported(\"tsvector\")\n * dsl.unsupported(\"geometry(Point, 4326)\")\n */\nexport function unsupported(dbType: string): ChainableColumn<\"unsupported\"> {\n const config: UnsupportedColumnConfig = { dbType };\n return new ChainableColumn(\"unsupported\", config);\n}\n\n/**\n * Column typed by a registered extension — the DSL twin of writing\n * `embedding Vector(1536)` in .prisma. The extension registry lowers it to a\n * native database type at `toIR` time; like `Unsupported`, it stays out of the\n * core queryable surface (the extension's client plane covers it).\n *\n * @example\n * embedding: dsl.extensionType({ type: \"Vector\", args: [1536] })\n */\nexport function extensionType(config: ExtensionTypeConfig): ChainableColumn<\"unsupported\"> {\n const { type, args, ...rest } = config;\n return new ChainableColumn(\"unsupported\", {\n ...rest,\n dbType: \"\",\n extensionType: type,\n extensionArgs: [...(args ?? [])],\n });\n}\n\n/**\n * Inline (one-off) enum column. For a reusable enum use\n * `dsl.enum({ name, options })` and its `.field()`.\n *\n * @example\n * dsl.enum({ options: [\"low\", \"high\"] }).default(\"low\")\n */\nexport function enumCol<const T extends readonly string[]>(\n config: InlineEnumConfig<T>\n): ChainableEnumColumn<T> {\n const { options, storage, ...restConfig } = config;\n // No enum name: `dsl.schema()` derives `${Model}${Column}` for inline enums.\n return new ChainableEnumColumn<T>({\n options,\n config: restConfig,\n ...(storage === undefined ? {} : { storage }),\n });\n}\n",
6
6
  "/**\n * Standalone (named, reusable) enums.\n *\n * @example\n * const Status = dsl.enum({ name: \"Status\", options: [\"active\", \"inactive\"] });\n *\n * const User = dsl.create({\n * name: \"User\",\n * schema: { id: dsl.id(), status: Status.field().default(\"active\") },\n * });\n */\n\nimport type { EnumStorage } from \"@vibeorm/schema\";\nimport { ChainableEnumColumn } from \"./column.ts\";\nimport type { EnumDef, EnumFieldConfig, EnumValues } from \"./types.ts\";\n\n// ─── Config ───────────────────────────────\n\n/** Config for a standalone enum — a `name` is what makes it standalone. */\nexport type StandaloneEnumConfig<T extends readonly string[] = readonly string[]> = {\n name: string;\n options: T;\n /**\n * Physical storage. `\"database\"` (default) keeps the native projection\n * (PostgreSQL enum type, MySQL ENUM, SQLite CHECK); `\"string\"` stores an\n * ordinary String column and lets VibeORM enforce membership.\n */\n storage?: EnumStorage;\n};\n\n/** Builds the frozen `{ DRAFT: \"DRAFT\", … }` authoring accessor. */\nfunction enumValuesOf<const T extends readonly string[]>(params: { options: T }): EnumValues<T> {\n const entries: Record<string, string> = Object.fromEntries(params.options.map((option) => [option, option]));\n return Object.freeze(entries) as EnumValues<T>;\n}\n\n// ─── Factory ──────────────────────────────\n\n/**\n * Creates a reusable enum. Its `field()` yields a chainable enum column that\n * references the enum by name, so every use shares one schema-level enum.\n *\n * @example\n * const Status = createEnum({ name: \"Status\", options: [\"active\", \"inactive\"] });\n * status: Status.field().optional().index()\n */\nexport function createEnum<const T extends readonly string[]>(\n config: StandaloneEnumConfig<T>\n): EnumDef<T> {\n const { name, options, storage = \"database\" } = config;\n return {\n __type: \"enum\",\n __name: name,\n __options: options,\n __storage: storage,\n values: enumValuesOf({ options }),\n field(fieldConfig: EnumFieldConfig<T> = {}): ChainableEnumColumn<T> {\n return new ChainableEnumColumn<T>({ options, config: fieldConfig, enumName: name, storage });\n },\n };\n}\n",
7
- "/**\n * Prisma schema text generator.\n *\n * Renders the schema plan (`relation-plan.ts`) — including the 1:1 merge pass —\n * as `.prisma` models and enums. Only models and enums are emitted: datasource\n * and generator blocks stay in the project's own base schema.\n *\n * The plan is shared with `toIR()`, so the text produced here parses back to\n * the same IR the DSL compiles to directly.\n */\n\nimport { VibeError, encodePrismaString, internalError, normalizeJsonSchemaRef, providerToDialect } from \"@vibeorm/schema\";\nimport type { EnumIR, FieldIR } from \"@vibeorm/schema\";\nimport { getSqlDialect } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport { compileExclusions, compileChecks, compileIndexPredicate } from \"../predicate.ts\";\nimport type {\n DecimalColumnConfig,\n IdColumnConfig,\n ModelDef,\n PrismaGeneratorConfig,\n SchemaDef,\n StringColumnConfig,\n} from \"../types.ts\";\nimport type { ColumnDef } from \"../types.ts\";\nimport { buildField, datetimeNativeType, fieldDefault, idNativeType, stringNativeType } from \"../to-ir.ts\";\nimport { planSchema } from \"../relation-plan.ts\";\n\n/**\n * The model as a predicate compiler sees it: logical names, physical `@map`\n * names and scalar types, read from the SAME `buildField` the IR path uses so\n * a printed CHECK cannot disagree with a compiled one.\n */\nfunction predicateModel(params: { model: ModelDef }): { name: string; fields: FieldIR[] } {\n return {\n name: params.model.__name,\n fields: Array.from(params.model.__columns, ([name, column]) => buildField({ name, column })),\n };\n}\nimport type { PlannedIndex, PlannedRelation, SchemaPlan } from \"../relation-plan.ts\";\n\n// ─── Column rendering ─────────────────────\n\n/** Prisma type for a column, including the `[]` list suffix. */\nfunction prismaType(params: { column: ColumnDef }): string {\n const { column } = params;\n const list = column.__config.array === true ? \"[]\" : \"\";\n\n switch (column.__columnType) {\n case \"string\":\n return `String${list}`;\n case \"int\":\n return `Int${list}`;\n case \"bigint\":\n return `BigInt${list}`;\n case \"float\":\n return `Float${list}`;\n case \"decimal\":\n return `Decimal${list}`;\n case \"boolean\":\n return `Boolean${list}`;\n case \"datetime\":\n return `DateTime${list}`;\n case \"json\":\n return `Json${list}`;\n case \"bytes\":\n return `Bytes${list}`;\n case \"id\":\n return (column.__config as IdColumnConfig).type === \"autoincrement\" ? \"Int\" : \"String\";\n case \"enum\":\n return column.__enumName === undefined ? `String${list}` : `${column.__enumName}${list}`;\n case \"unsupported\": {\n // Extension column types round-trip as `Vector(1536)`, not Unsupported.\n const extensionTypeName = column.__config[\"extensionType\"];\n if (typeof extensionTypeName === \"string\") {\n const rawArgs = column.__config[\"extensionArgs\"];\n const args = Array.isArray(rawArgs) ? rawArgs.map(String).join(\", \") : \"\";\n return `${extensionTypeName}${args.length > 0 ? `(${args})` : \"\"}${list}`;\n }\n return `Unsupported(${encodePrismaString({ value: String(column.__config.dbType) })})${list}`;\n }\n }\n}\n\n/** `@default(...)` for a non-id column, or undefined when it has none. */\nfunction defaultAttribute(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n const value = fieldDefault({ column });\n if (value === undefined) return undefined;\n if (value.kind === \"list\") {\n const values = value.values.map((entry) => column.__columnType === \"enum\" ? String(entry) :\n column.__columnType === \"bigint\" ? String(entry) : JSON.stringify(entry));\n return `@default([${values.join(\", \")}])`;\n }\n // Exact numeric digits carried as a string print as the NUMBER Prisma\n // expects on a numeric column (`@default(\"0\")` on Decimal is rejected).\n const numericColumn = column.__columnType === \"int\" || column.__columnType === \"bigint\" || column.__columnType === \"float\" || column.__columnType === \"decimal\";\n if (value.kind === \"literal\") return `@default(${typeof value.value === \"string\" && !(numericColumn && /^-?\\d+(\\.\\d+)?$/.test(value.value)) ? encodePrismaString({ value: value.value }) : String(value.value)})`;\n if (value.kind === \"enumValue\") return `@default(${value.value})`;\n if (value.kind === \"dbgenerated\") return `@default(dbgenerated(${encodePrismaString({ value: value.sql })}))`;\n return `@default(${value.kind}())`;\n}\n\n/** `@db.*` native type attribute, or undefined. */\nfunction nativeTypeAttribute(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n\n if (column.__columnType === \"string\" || column.__columnType === \"id\") {\n const native = column.__columnType === \"string\"\n ? stringNativeType({ config: column.__config as StringColumnConfig, column: column.__name })\n : idNativeType({ config: column.__config as IdColumnConfig, column: column.__name });\n return native === undefined ? undefined : `@db.${native}`;\n }\n\n if (column.__columnType === \"decimal\") {\n const { precision, scale } = column.__config as DecimalColumnConfig;\n if (typeof precision === \"number\") return `@db.Decimal(${precision}, ${scale ?? 0})`;\n return undefined;\n }\n\n if (column.__columnType === \"datetime\") {\n const native = datetimeNativeType({ config: column.__config, column: column.__name });\n return native === undefined ? undefined : `@db.${native}`;\n }\n\n return undefined;\n}\n\nfunction formatColumn(params: { name: string; column: ColumnDef }): string {\n const { name, column } = params;\n const parts: string[] = [` ${name} ${prismaType({ column })}${column.__config.optional === true ? \"?\" : \"\"}`];\n\n if (column.__columnType === \"id\") {\n parts.push(\"@id\");\n const idDefault = defaultAttribute({ column });\n if (idDefault !== undefined) parts.push(idDefault);\n } else {\n const columnDefault = defaultAttribute({ column });\n if (columnDefault !== undefined) parts.push(columnDefault);\n }\n\n if (column.__columnType === \"datetime\" && column.__config.updatedAt === true) {\n parts.push(\"@updatedAt\");\n }\n if (column.__config.unique === true) {\n parts.push(\"@unique\");\n }\n if (typeof column.__config.map === \"string\") {\n parts.push(`@map(${encodePrismaString({ value: column.__config.map })})`);\n }\n\n const nativeType = nativeTypeAttribute({ column });\n if (nativeType !== undefined) parts.push(nativeType);\n if (typeof column.__config.collation === \"string\") {\n parts.push(`@collation(${encodePrismaString({ value: column.__config.collation })})`);\n }\n\n const columnLine = parts.join(\" \");\n const metadata = normalizeJsonSchemaRef({ documentation: typeof column.__config.comment === \"string\" ? column.__config.comment : undefined, reference: column.__config.jsonSchema });\n if (metadata.jsonSchema !== undefined && column.__columnType !== \"json\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"JSON schemas are only valid on Json fields\", meta: { issues: [{ rule: \"json-schema-non-json\", field: name }] } });\n const comments = [\n ...(metadata.documentation === undefined ? [] : metadata.documentation.split(\"\\n\")),\n ...(metadata.jsonSchema === undefined ? [] : [`@schema(${metadata.jsonSchema.name} from ${encodePrismaString({ value: metadata.jsonSchema.from })})`]),\n ];\n return [...comments.map((line) => ` /// ${line}`), columnLine].join(\"\\n\");\n}\n\n// ─── Relation rendering ───────────────────\n\nfunction formatRelation(params: { relation: PlannedRelation }): string {\n const { relation } = params;\n const { name, targetModel, relationName } = relation;\n\n if (relation.kind === \"list\") {\n const attribute =\n relationName === undefined ? \"\" : ` @relation(${encodePrismaString({ value: relationName })})`;\n return ` ${name} ${targetModel}[]${attribute}`;\n }\n\n const optional = relation.isOptional ? \"?\" : \"\";\n\n if (relation.kind === \"backOne\") {\n const attribute =\n relationName === undefined ? \"\" : ` @relation(${encodePrismaString({ value: relationName })})`;\n return ` ${name} ${targetModel}${optional}${attribute}`;\n }\n\n const args: string[] = [];\n if (relationName !== undefined) args.push(encodePrismaString({ value: relationName }));\n if (relation.fields === undefined || relation.references === undefined) {\n throw internalError({\n message: `planned FK relation \"${relation.model}.${name}\" has no fields/references`,\n meta: { model: relation.model, relation: name },\n });\n }\n args.push(`fields: [${relation.fields.join(\", \")}]`);\n args.push(`references: [${relation.references.join(\", \")}]`);\n if (relation.onDelete !== undefined) args.push(`onDelete: ${relation.onDelete}`);\n if (relation.onUpdate !== undefined) args.push(`onUpdate: ${relation.onUpdate}`);\n // `map:` is the PHYSICAL constraint name; the positional argument above is\n // the relation alias. Prisma spells both on one attribute.\n if (relation.constraintName !== undefined) {\n args.push(`map: ${encodePrismaString({ value: relation.constraintName })}`);\n }\n\n return ` ${name} ${targetModel}${optional} @relation(${args.join(\", \")})`;\n}\n\n// ─── Index rendering ──────────────────────\n\nfunction formatIndex(params: {\n index: PlannedIndex;\n model: ModelDef;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): string {\n const { index } = params;\n if (index.ops !== undefined && Object.values(index.ops).some((operatorClass) => operatorClass !== undefined)) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Prisma output cannot preserve qualified index operator classes; keep the DSL source\", meta: { feature: \"prismaIndexOperatorClasses\", target: \"prisma\" } });\n const columns = index.columns.join(\", \");\n const predicate = compileIndexPredicate({\n where: index.where,\n wherePredicate: index.wherePredicate,\n columns: index.columns,\n model: predicateModel({ model: params.model }),\n dialect: params.dialect,\n enums: params.enums,\n });\n const whereArg = predicate === undefined ? \"\" : `, where: ${encodePrismaString({ value: predicate.where })}`;\n const mapArg = index.map === undefined ? \"\" : `, map: ${encodePrismaString({ value: index.map })}`;\n const nndArg = index.nullsNotDistinct === true ? \", nullsNotDistinct: true\" : \"\";\n const nameArg =\n index.clientName === undefined ? \"\" : `, name: ${encodePrismaString({ value: index.clientName })}`;\n if (index.isUnique) {\n return ` @@unique([${columns}]${nameArg}${mapArg}${nndArg}${whereArg})`;\n }\n const typeArg = index.indexType === undefined ? \"\" : `, type: ${index.indexType}`;\n return ` @@index([${columns}]${typeArg}${mapArg}${whereArg})`;\n}\n\n// ─── Extension attribute rendering ────────\n\n/** One named-argument value of an extension attribute, as .prisma text. */\nfunction formatExtensionValue(params: { value: unknown }): string {\n const { value } = params;\n if (typeof value === \"string\") return encodePrismaString({ value });\n if (Array.isArray(value)) {\n return `[${value.map((entry) => formatExtensionValue({ value: entry })).join(\", \")}]`;\n }\n return String(value);\n}\n\n// ─── Model rendering ──────────────────────\n\nfunction formatModel(params: {\n model: ModelDef;\n plan: SchemaPlan;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): string {\n const { model, plan } = params;\n const lines: string[] = [\n ...(model.__comment === undefined ? [] : model.__comment.split(\"\\n\").map((line) => `/// ${line}`)),\n `model ${model.__name} {`,\n ];\n\n lines.push(\" //> Columns\");\n for (const [name, column] of model.__columns) {\n lines.push(formatColumn({ name, column }));\n }\n\n lines.push(\"\");\n lines.push(\" //> Relations\");\n for (const relation of plan.relations.get(model.__name) ?? []) {\n lines.push(formatRelation({ relation }));\n }\n\n lines.push(\"\");\n lines.push(\" //> Indexes\");\n lines.push(\"\");\n for (const index of plan.indexes.get(model.__name) ?? []) {\n lines.push(formatIndex({ index, model: params.model, dialect: params.dialect, enums: params.enums }));\n }\n\n // A typed CHECK is compiled to SQL here, exactly as `toIR` compiles it, so\n // `parse(generate.prisma(s))` still reproduces `toIR(s)`. `.prisma` has no\n // syntax for a typed expression, so it lands as the raw `@@check` text it\n // renders to — the round trip preserves the CONSTRAINT, not the authoring form.\n for (const check of compileChecks({\n checks: model.__checks,\n model: predicateModel({ model: params.model }),\n dialect: params.dialect,\n enums: params.enums,\n })) {\n lines.push(\n ` @@check(${encodePrismaString({ value: check.expression })}, name: ${encodePrismaString({ value: check.name })})`,\n );\n }\n\n for (const use of model.__extensions ?? []) {\n const args: string[] = [];\n if (use.fields !== undefined) args.push(`[${use.fields.join(\", \")}]`);\n for (const [key, value] of Object.entries(use.args ?? {})) {\n args.push(`${key}: ${formatExtensionValue({ value })}`);\n }\n lines.push(` @@${use.attribute}(${args.join(\", \")})`);\n }\n\n if (model.__primaryKey !== undefined && model.__primaryKey.length > 0) {\n lines.push(` @@id([${model.__primaryKey.join(\", \")}])`);\n }\n if (model.__policy !== undefined) {\n // `context:` is omitted when it equals the field — the parser defaults it there.\n const { field, context } = model.__policy;\n const contextArg =\n context === undefined || context === field ? \"\" : `, context: ${encodePrismaString({ value: context })}`;\n lines.push(` @@policy([${field}]${contextArg})`);\n }\n if (typeof model.__map === \"string\") {\n lines.push(` @@map(${encodePrismaString({ value: model.__map })})`);\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\n// ─── Enum rendering ───────────────────────\n\nfunction formatEnum(params: { name: string; values: readonly string[] }): string {\n const { name, values } = params;\n return [`enum ${name} {`, ...values.map((value) => ` ${value}`), \"}\"].join(\"\\n\");\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Generates Prisma schema text (models + enums) for a composed schema.\n *\n * @example\n * const prisma = dsl.generate.prisma(dsl.schema({ User }, { relations }));\n */\nexport function generatePrisma(schema: SchemaDef, config: PrismaGeneratorConfig = {}): string {\n for (const model of schema.__models.values()) {\n const exclusions = compileExclusions({ exclusions: model.__exclusions, model: { name: model.__name, fields: Array.from(model.__columns, ([name, column]) => buildField({ name, column })) }, dialect: getSqlDialect({ dialect: providerToDialect({ provider: config.provider ?? \"postgresql\" }) }) });\n if (exclusions.length > 0) throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Prisma output cannot preserve exclusion constraints; keep the DSL source\", meta: { feature: \"exclusionConstraints\", target: \"prisma\" } });\n }\n const stringEnums = [...schema.__enumStorage].filter(([, storage]) => storage === \"string\").map(([name]) => name);\n if (stringEnums.length > 0) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `Cannot print to Prisma: enum(s) ${stringEnums.join(\", \")} use storage: \"string\", which .prisma cannot express losslessly. Keep the DSL as the source or switch the enum to database storage.`,\n meta: { enums: stringEnums, target: \"prisma\" },\n });\n }\n if (schema.__rls !== undefined) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: \"Cannot print to Prisma: this schema uses native RLS, which .prisma cannot express losslessly. Keep the DSL as the source.\",\n meta: { feature: \"nativeRowLevelSecurity\", target: \"prisma\" },\n });\n }\n const plan = planSchema({ schema });\n const sections: string[] = [];\n // Typed expressions need a dialect to become SQL text. Defaulting to\n // postgresql matches `toIR`'s own default, so one schema printed and one\n // schema compiled agree unless the caller says otherwise.\n const dialect = getSqlDialect({ dialect: providerToDialect({ provider: config.provider ?? \"postgresql\" }) });\n const enums: EnumIR[] = Array.from(schema.__enums, ([name, values]) => ({ name, values: [...values] }));\n\n if (schema.__enums.size > 0) {\n sections.push(\"// ============================================\");\n sections.push(\"// Enums\");\n sections.push(\"// ============================================\");\n sections.push(\"\");\n for (const [name, values] of schema.__enums) {\n sections.push(formatEnum({ name, values }));\n sections.push(\"\");\n }\n }\n\n sections.push(\"// ============================================\");\n sections.push(\"// Models\");\n sections.push(\"// ============================================\");\n sections.push(\"\");\n for (const model of schema.__models.values()) {\n sections.push(formatModel({ model, plan, dialect, enums }));\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\").trim();\n}\n",
8
- "/**\n * The typed predicate builder — the `c` handed to a model's `checks` callback\n * and to an index's `.where()`.\n *\n * Every combinator returns plain {@link PredicateIR}: serializable data, never\n * a JavaScript callback. Nothing downstream evaluates a function, and a\n * predicate survives JSON unchanged. The SQL text is produced exactly once, by\n * `renderPredicate` in @vibeorm/sql, when the schema is compiled and the\n * dialect is finally known.\n *\n * The builder is structural at RUNTIME — it only records names and values — so\n * one instance serves every model. The type parameters on\n * {@link PredicateBuilder} are what bind it to a particular model's columns.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { ExclusionIR, CheckIR, EnumIR, FieldIR, PredicateExpression, PredicateIR, PredicateOperand, PredicateValue } from \"@vibeorm/schema\";\nimport { compileExclusion, renderPredicate } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type {\n ModelDef,\n ChecksCallback,\n ModelCheckConfig,\n PredicateBuilder,\n PredicateFieldExpr,\n SchemaDefinition,\n} from \"./types.ts\";\n\n// ─── Operand normalization ────────────────────────────────────────\n\n/** Is this operand another field reference rather than a literal? */\nfunction isFieldExpr(operand: unknown): operand is PredicateFieldExpr {\n return (\n typeof operand === \"object\" &&\n operand !== null &&\n \"kind\" in operand &&\n (operand as { kind: unknown }).kind === \"field\"\n );\n}\n\n/**\n * Strip the pairing tag: the IR carries `{ kind: \"field\", name }` and nothing\n * else, so `__kind` never reaches a serialized schema.\n */\nfunction toRef(params: { expr: PredicateFieldExpr }): { readonly kind: \"field\"; readonly name: string } {\n return { kind: \"field\", name: params.expr.name };\n}\n\n/**\n * A literal in JSON-safe carrier form.\n *\n * A `bigint` becomes its EXACT decimal text: `Number(9007199254740993n)` is a\n * different number, the same trap column defaults already guard against, and\n * the rounding would happen before any SQL existed.\n */\nfunction toValue(params: { input: unknown; at: string }): PredicateValue {\n const { input, at } = params;\n if (typeof input === \"bigint\") return { kind: \"value\", value: input.toString() };\n if (typeof input === \"string\" || typeof input === \"number\" || typeof input === \"boolean\") {\n return { kind: \"value\", value: input };\n }\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: ${input === null ? \"null\" : typeof input} is not a comparable literal — use isNull()/isNotNull() for null, and a string, number, bigint or boolean otherwise`,\n meta: { rule: \"predicate-literal-invalid\", at },\n });\n}\n\nfunction toOperand(params: { operand: unknown; at: string }): PredicateOperand {\n const { operand, at } = params;\n return typeof operand === \"object\" && operand !== null\n ? toExpression({ value: operand, at }) : toValue({ input: operand, at });\n}\n\nfunction toExpression(params: { value: unknown; at: string }): PredicateExpression {\n const { value, at } = params;\n if (isFieldExpr(value)) return toRef({ expr: value });\n if (typeof value === \"object\" && value !== null && \"kind\" in value) {\n if (value.kind === \"jsonText\" && \"field\" in value && \"path\" in value && Array.isArray(value.path) &&\n Array.from(value.path).every((segment: unknown) => typeof segment === \"string\" && !segment.includes(\"\\u0000\"))) {\n return { kind: \"jsonText\", field: toRef({ expr: requireFieldExpr({ value: value.field, at }) }), path: [...value.path] };\n }\n if (value.kind === \"length\" && \"expression\" in value) {\n return { kind: \"length\", expression: toExpression({ value: value.expression, at }) };\n }\n }\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `${at}: expected a field, jsonText or length expression with a string-only JSON path`, meta: { rule: \"predicate-operand-invalid\", at } });\n}\n\nfunction requireFieldExpr(params: { value: unknown; at: string }): PredicateFieldExpr {\n const { value, at } = params;\n if (isFieldExpr(value)) return value;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: the left side of a comparison must be c.field(\"…\"), not a bare value`,\n meta: { rule: \"predicate-operand-invalid\", at },\n });\n}\n\nfunction requireOperands(params: { operands: readonly PredicateIR[]; at: string }): readonly PredicateIR[] {\n const { operands, at } = params;\n if (operands.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: an empty boolean group has no honest SQL spelling — pass at least one operand`,\n meta: { rule: \"predicate-empty\", at },\n });\n }\n return operands;\n}\n\n// ─── The builder ──────────────────────────────────────────────────\n\n/**\n * One predicate builder instance. Stateless and structural — the type\n * parameters, not the value, bind it to a model.\n */\nexport function createPredicateBuilder<\n TColumns extends string = string,\n TSchema extends SchemaDefinition = SchemaDefinition,\n>(): PredicateBuilder<TColumns, TSchema> {\n const compare = (op: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\") =>\n (left: unknown, right: unknown): PredicateIR => ({\n kind: \"compare\",\n op,\n left: toExpression({ value: left, at: `c.${op}()` }),\n right: toOperand({ operand: right, at: `c.${op}()` }),\n });\n\n const membership = (negate: boolean) =>\n (field: unknown, values: readonly unknown[]): PredicateIR => {\n const at = negate ? \"c.notInList()\" : \"c.inList()\";\n const ref = toRef({ expr: requireFieldExpr({ value: field, at }) });\n if (values.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: an empty IN list is UNKNOWN on every row and is never what an author means`,\n meta: { rule: \"predicate-empty\", at, field: ref.name },\n });\n }\n return {\n kind: \"inList\",\n field: ref,\n values: values.map((value) => toValue({ input: value, at })),\n ...(negate ? { negate: true as const } : {}),\n };\n };\n\n // The cast is the ONE place the structural runtime builder meets its\n // model-bound type: every method below matches its declared signature, but\n // the generic tag parameters exist only at the type level.\n return {\n field: (name) => ({ kind: \"field\", name, __kind: \"String\" }) as never,\n\n eq: compare(\"eq\"),\n ne: compare(\"ne\"),\n gt: compare(\"gt\"),\n gte: compare(\"gte\"),\n lt: compare(\"lt\"),\n lte: compare(\"lte\"),\n\n jsonText: ({ field, path }) => ({ ...toExpression({ value: { kind: \"jsonText\", field: { kind: \"field\", name: field }, path }, at: \"c.jsonText()\" }), __kind: \"String\" }) as never,\n length: (expression) => ({ kind: \"length\", expression: toExpression({ value: expression, at: \"c.length()\" }), __kind: \"Int\" }) as never,\n isTrue: (operand) => ({ kind: \"isTrue\", operand }),\n\n inList: membership(false),\n notInList: membership(true),\n\n isNull: (name) => ({ kind: \"isNull\", field: { kind: \"field\", name } }),\n isNotNull: (name) => ({ kind: \"isNull\", field: { kind: \"field\", name }, negate: true }),\n\n and: (...operands) => ({ kind: \"and\", operands: requireOperands({ operands, at: \"c.and()\" }) }),\n or: (...operands) => ({ kind: \"or\", operands: requireOperands({ operands, at: \"c.or()\" }) }),\n not: (operand) => ({ kind: \"not\", operand }),\n\n named: (name, predicate) => {\n if (name.trim() === \"\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: \"c.named(): a CHECK needs a non-empty name — the name is what keys the migration diff\",\n meta: { rule: \"predicate-unnamed-check\" },\n });\n }\n return { __type: \"check\", name, predicate };\n },\n } as PredicateBuilder<TColumns, TSchema>;\n}\n\n// ─── Evaluating a model's declarations ────────────────────────────\n\n/** A model's CHECKs, still un-rendered: raw text stays raw, typed stays typed. */\nexport type EvaluatedCheck =\n | { readonly kind: \"raw\"; readonly name: string; readonly expression: string }\n | { readonly kind: \"typed\"; readonly name: string; readonly predicate: PredicateIR };\n\n/**\n * Run a model's `checks` declaration, whichever form it took.\n *\n * The raw array form and the typed callback form produce the same shape of\n * answer, so every consumer downstream handles ONE list — and raw text is\n * carried through untouched rather than parsed into a predicate.\n */\nexport function evaluateChecks(params: {\n checks: readonly ModelCheckConfig[] | ChecksCallback | undefined;\n model: string;\n}): readonly EvaluatedCheck[] {\n const { checks, model } = params;\n if (checks === undefined) return [];\n\n if (typeof checks !== \"function\") {\n return checks.map((check) => ({ kind: \"raw\" as const, name: check.name, expression: check.expression }));\n }\n\n const declared = checks(createPredicateBuilder());\n return declared.map((entry, index): EvaluatedCheck => {\n if (entry !== null && typeof entry === \"object\" && !(\"__type\" in entry) && typeof entry.name === \"string\" && \"expression\" in entry && typeof entry.expression === \"string\") {\n return { kind: \"raw\", name: entry.name, expression: entry.expression };\n }\n if (entry === null || typeof entry !== \"object\" || !(\"__type\" in entry) || entry.__type !== \"check\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": checks[${index}] must be c.named(\"name\", predicate) or a raw { name, expression } CHECK`,\n meta: { rule: \"predicate-unnamed-check\", model, index },\n });\n }\n return { kind: \"typed\" as const, name: entry.name, predicate: entry.predicate };\n });\n}\n\n// ─── Compiling to IR ──────────────────────────────────────────────\n\n/** What a predicate needs to know about the model it belongs to. */\nexport type PredicateModel = {\n readonly name: string;\n readonly fields: readonly FieldIR[];\n};\n\n/**\n * A model's CHECKs as IR, with every typed expression compiled to SQL ONCE.\n *\n * `CheckIR.expression` always carries the AUTHORED text — what the schema says,\n * not what a database deparsed back — because that is the currency EPIC 1's\n * differ, desired-state records and DDL renderers all read. The predicate rides\n * alongside as the structured source, so editing a typed expression changes the\n * text and produces a real migration, while re-rendering an unchanged one\n * produces byte-identical text and cannot churn.\n */\n/** Compile exclusions beside CHECKs and index predicates at the schema boundary. */\nexport function compileExclusions(params: { exclusions: ModelDef[\"__exclusions\"]; model: PredicateModel; dialect: SqlDialect }): readonly ExclusionIR[] {\n const specs = typeof params.exclusions === \"function\" ? params.exclusions(createPredicateBuilder()) : params.exclusions ?? [];\n return specs.map((exclusion) => compileExclusion({ exclusion, model: params.model, dialect: params.dialect }));\n}\n\nexport function compileChecks(params: {\n checks: readonly ModelCheckConfig[] | ChecksCallback | undefined;\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): readonly CheckIR[] {\n const { checks, model, dialect, enums } = params;\n return evaluateChecks({ checks, model: model.name }).map((check) =>\n check.kind === \"raw\"\n ? { name: check.name, expression: check.expression }\n : {\n name: check.name,\n expression: renderPredicate({\n predicate: check.predicate,\n model,\n dialect,\n enums,\n usage: \"check\",\n site: `CHECK \"${check.name}\"`,\n }),\n predicate: check.predicate,\n },\n );\n}\n\n/**\n * An index's partial predicate as IR: the raw string verbatim, or a typed\n * expression compiled to SQL text plus its structured source.\n */\nexport function compileIndexPredicate(params: {\n where: string | undefined;\n wherePredicate: PredicateIR | undefined;\n columns: readonly string[];\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): { readonly where: string; readonly wherePredicate?: PredicateIR } | undefined {\n const { where, wherePredicate, columns, model, dialect, enums } = params;\n\n if (where !== undefined && wherePredicate !== undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Index on \"${model.name}\" [${columns.join(\", \")}] carries both a raw where: string and a typed .where() — an index has ONE predicate`,\n meta: { rule: \"predicate-duplicate-where\", model: model.name, columns: [...columns] },\n });\n }\n if (where !== undefined) return { where };\n if (wherePredicate === undefined) return undefined;\n\n return {\n where: renderPredicate({\n predicate: wherePredicate,\n model,\n dialect,\n enums,\n usage: \"indexPredicate\",\n site: `partial index on [${columns.join(\", \")}]`,\n }),\n wherePredicate,\n };\n}\n",
9
- "/**\n * DSL → canonical `SchemaIR`.\n *\n * The DSL compiles straight to IR (no `.prisma` round-trip). It reads the same\n * schema plan the Prisma generator renders, so one logical schema produces the\n * same IR whether it arrives as `.prisma` text or as TypeScript.\n *\n * Mapping decisions, all mirroring what parsing `generate.prisma(schema)` yields:\n * - `dsl.id()` → `isId` + a `DefaultValueIR` per strategy (`ulid` / `cuid` /\n * `uuid` / `nanoid` app-side, `autoincrement` for serial ints, which is the\n * only strategy typed `Int`; `\"none\"` emits no default).\n * - `dsl.datetime({ default: \"now\" })` → `{ kind: \"now\" }`; `.updatedAt()` →\n * `isUpdatedAt`; `.tz()` → native type `Timestamptz`, `.tz({ precision: n })`\n * → `Timestamptz(n)`.\n * - `.maxLength(n)` / `.text()` / `.precision(p, s)` → native types\n * `VarChar(n)` / `Text` / `Decimal(p, s)`.\n * - `.map()` / model `map` → `dbName`; `.comment()` / model `comment` →\n * `documentation`; `collation` → `FieldIR.collation`.\n * - model `policy: { field, context }` → `ModelIR.policy` with `context`\n * defaulting to the field name (parser parity).\n * - `dsl.unsupported(\"tsvector\")` → `isUnsupported: true` + native type\n * `\"tsvector\"` over a nominal `String` base. The flag is what keeps the column\n * OUT of the queryable surface — it is kept in the IR for schema fidelity\n * (convert, migrate DDL), never projected or written.\n * - inline enums become schema-level enums named `${Model}${Column}`;\n * `storage: \"string\"` rides onto `EnumIR.storage` (omitted for the default).\n * - `.collation()` / `{ collation }` → `FieldIR.collation`.\n * - relation types are derived structurally by `resolveRelationType`.\n */\n\nimport {\n EMPTY_EXTENSION_REGISTRY,\n VibeError,\n assertValidSchemaIR,\n exactIntegerLiteral,\n providerToDialect,\n scalarListDefault,\n serializeJsonDefault,\n mergeExtensionDeclarations,\n normalizeJsonSchemaRef,\n unsupportedCapability,\n} from \"@vibeorm/schema\";\nimport type {\n DefaultValueIR,\n EnumIR,\n ExtensionDeclIR,\n ExtensionRegistry,\n FieldIR,\n FieldType,\n IndexIR,\n IndexKind,\n ModelIR,\n Provider,\n RelationIR,\n SchemaIR,\n ValidationIssue,\n} from \"@vibeorm/schema\";\nimport { getSqlDialect } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport { columnFieldType } from \"./field-type.ts\";\nimport { compileExclusions, compileChecks, compileIndexPredicate } from \"./predicate.ts\";\nimport type { PredicateModel } from \"./predicate.ts\";\nimport { planSchema, resolveRelationType } from \"./relation-plan.ts\";\nimport type { PlannedIndex, PlannedRelation, SchemaPlan } from \"./relation-plan.ts\";\nimport type {\n ColumnDef,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n IdColumnConfig,\n IndexType,\n ModelDef,\n SchemaDef,\n StringColumnConfig,\n} from \"./types.ts\";\n\n// ─── Field type ───────────────────────────\n\n/**\n * The IR field type of a column — the same mapping relation planning pairs\n * foreign keys by (`./field-type.ts`), so the two can never drift apart.\n */\nconst fieldType = columnFieldType;\n\n// ─── Defaults ─────────────────────────────\n\nfunction idDefault(params: { column: ColumnDef }): DefaultValueIR | undefined {\n switch ((params.column.__config as IdColumnConfig).type) {\n case \"ulid\":\n return { kind: \"ulid\" };\n case \"cuid\":\n return { kind: \"cuid\" };\n case \"uuid\":\n return { kind: \"uuid\" };\n case \"nanoid\":\n return { kind: \"nanoid\" };\n case \"autoincrement\":\n return { kind: \"autoincrement\" };\n default:\n return undefined;\n }\n}\n\n/** Compile a column default once for both DSL output paths. */\nexport function fieldDefault(params: { column: ColumnDef }): DefaultValueIR | undefined {\n const { column } = params;\n if (column.__columnType === \"id\") {\n const strategy = (column.__config as IdColumnConfig).type;\n const dbgenerated = column.__config.dbgenerated;\n if (column.__config.default !== undefined || column.__config.autoincrement !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Use the id generator strategy instead of a conflicting id default\" });\n // A database default IS the id's generator, so it replaces the app-side one.\n if (dbgenerated !== undefined) {\n if (strategy !== \"none\" || typeof dbgenerated !== \"string\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `An id with a database default needs dsl.id({ type: \"none\" }); the \"${String(strategy)}\" generator strategy would conflict with it`, meta: { issues: [{ rule: \"id-dbgenerated-strategy\", column: column.__name, strategy }] } });\n return { kind: \"dbgenerated\", sql: dbgenerated };\n }\n return idDefault({ column });\n }\n\n const { dbgenerated, default: value, autoincrement } = column.__config;\n if ([dbgenerated !== undefined, value !== undefined, autoincrement === true].filter(Boolean).length > 1) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Column \"${column.__name ?? column.__columnType}\" has conflicting defaults` });\n }\n if (autoincrement === true) {\n if ((column.__columnType !== \"int\" && column.__columnType !== \"bigint\") || column.__config.array === true || column.__config.optional === true) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"autoincrement requires a required scalar Int or BigInt column\" });\n }\n return { kind: \"autoincrement\" };\n }\n if (typeof dbgenerated === \"string\") return { kind: \"dbgenerated\", sql: dbgenerated };\n if (value === undefined) return undefined;\n if (column.__config.array === true) {\n if (!Array.isArray(value)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A scalar-list default must be an array\" });\n return { kind: \"list\", values: scalarListDefault({ type: fieldType({ column }), values: column.__columnType === \"json\" ? value.map((entry) => typeof entry === \"string\" ? entry : serializeJsonDefault({ value: entry })) : value }) };\n }\n if (column.__columnType === \"json\" && typeof value !== \"string\") {\n return { kind: \"literal\", value: serializeJsonDefault({ value }) };\n }\n\n if (column.__columnType === \"datetime\" && value === \"now\") return { kind: \"now\" };\n if ((column.__columnType === \"datetime\" && value instanceof Date) || (column.__columnType === \"bytes\" && value instanceof Uint8Array)) {\n return { kind: \"literal\", value: scalarListDefault({ type: fieldType({ column }), values: [value] })[0]! };\n }\n if (column.__columnType === \"enum\" && typeof value === \"string\") {\n return { kind: \"enumValue\", value };\n }\n if (typeof value === \"number\" && (!Number.isFinite(value) || ((column.__columnType === \"int\" || column.__columnType === \"bigint\") && !Number.isSafeInteger(value)))) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Numeric defaults must be finite; integer defaults must be exact\" });\n }\n if (typeof value === \"string\" || typeof value === \"boolean\" || typeof value === \"number\") {\n return { kind: \"literal\", value };\n }\n // A bigint default keeps every digit: `Number(9007199254740993n)` is a\n // DIFFERENT number, and the rounding used to happen before any SQL existed.\n if (typeof value === \"bigint\") return { kind: \"literal\", value: exactIntegerLiteral({ text: value.toString() }) };\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Unsupported default for ${column.__columnType}` });\n}\n\n// ─── Native types ─────────────────────────\n\n/**\n * `Timestamptz` / `Timestamptz(n)` for a `.tz()` datetime column, or\n * `undefined`. Shared with the `.prisma` generator so both spell it alike.\n * Refuses a precision postgres would reject (outside 0–6, fractional) and a\n * precision without `tz`, which has no timestamptz to apply to.\n */\nexport function datetimeNativeType(params: { config: DatetimeColumnConfig; column: string | undefined }): string | undefined {\n const { tz, precision } = params.config;\n if (precision !== undefined && (tz !== true || !Number.isInteger(precision) || precision < 0 || precision > 6)) {\n const at = params.column === undefined ? \"A datetime column\" : `Column \"${params.column}\"`;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: a datetime precision must be an integer from 0 to 6 on a tz() column, as in dsl.datetime().tz({ precision: 3 })`,\n meta: { issues: [{ rule: \"datetime-precision\", column: params.column, precision, tz: tz === true }] },\n });\n }\n if (tz !== true) return undefined;\n return precision === undefined ? \"Timestamptz\" : `Timestamptz(${precision})`;\n}\n\n/**\n * `Uuid`, `VarChar(n)` or `Text` for a String column, or `undefined`. Shared\n * with the `.prisma` generator so both spell it alike. A column has one type,\n * so `uuid` refuses to combine with `maxLength` or `text`.\n */\nexport function stringNativeType(params: { config: StringColumnConfig; column: string | undefined }): string | undefined {\n const { maxLength, text, uuid } = params.config;\n if (uuid === true) {\n if (maxLength !== undefined || text === true) {\n const at = params.column === undefined ? \"A string column\" : `Column \"${params.column}\"`;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: uuid() is the column's type and cannot be combined with maxLength or text`,\n meta: { issues: [{ rule: \"string-native-type\", column: params.column }] },\n });\n }\n return \"Uuid\";\n }\n if (typeof maxLength === \"number\") return `VarChar(${maxLength})`;\n if (text === true) return \"Text\";\n return undefined;\n}\n\n/** `Uuid` for a `uuid()` String id, or `undefined`; an Int (autoincrement) id refuses it. */\nexport function idNativeType(params: { config: IdColumnConfig; column: string | undefined }): string | undefined {\n if (params.config.uuid !== true) return undefined;\n if (params.config.type === \"autoincrement\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${params.column === undefined ? \"An id\" : `Id \"${params.column}\"`}: uuid() needs a String id; an autoincrement id is an Int`,\n meta: { issues: [{ rule: \"id-native-type\", column: params.column }] },\n });\n }\n return \"Uuid\";\n}\n\nfunction nativeType(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n\n if (column.__columnType === \"string\") return stringNativeType({ config: column.__config as StringColumnConfig, column: column.__name });\n if (column.__columnType === \"id\") return idNativeType({ config: column.__config as IdColumnConfig, column: column.__name });\n\n if (column.__columnType === \"enum\") {\n const { maxLength, text } = column.__config;\n if (maxLength !== undefined || text !== undefined) {\n const invalid = column.__enumStorage !== \"string\" ||\n (maxLength !== undefined && (typeof maxLength !== \"number\" || !Number.isSafeInteger(maxLength) || maxLength <= 0)) ||\n (text !== undefined && typeof text !== \"boolean\") ||\n (text === true && maxLength !== undefined);\n if (invalid) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: \"Enum text/maxLength options require string storage and either a positive integer maxLength or text: true, not both\",\n meta: { issues: [{ rule: \"enum-string-storage-options\", enum: column.__enumName }] },\n });\n }\n }\n }\n if (column.__columnType === \"enum\" && column.__enumStorage === \"string\") {\n const { maxLength, text } = column.__config as StringColumnConfig;\n if (typeof maxLength === \"number\") return `VarChar(${maxLength})`;\n if (text === true) return \"Text\";\n return undefined;\n }\n if (column.__columnType === \"decimal\") {\n const { precision, scale } = column.__config as DecimalColumnConfig;\n if (typeof precision === \"number\") return `Decimal(${precision}, ${scale ?? 0})`;\n return undefined;\n }\n if (column.__columnType === \"datetime\") {\n return datetimeNativeType({ config: column.__config, column: column.__name });\n }\n if (column.__columnType === \"unsupported\") {\n return String(column.__config.dbType);\n }\n return undefined;\n}\n\n// ─── Fields ───────────────────────────────\n\n/**\n * One column as `FieldIR`.\n *\n * Exported so the `.prisma` printer compiles typed CHECK and partial-index\n * expressions against exactly the same physical names and scalar types the IR\n * path uses — a second mapping is how the two would drift apart.\n */\nexport function buildField(params: {\n name: string;\n column: ColumnDef;\n /** Native type resolved by an extension field-type lowering, when present. */\n extensionNativeType?: string;\n}): FieldIR {\n const { name, column, extensionNativeType } = params;\n const config = column.__config;\n\n // A primary key is never a list; every other kind honours `.array()`.\n const isList = column.__columnType !== \"id\" && config.array === true;\n\n const dbName = typeof config.map === \"string\" ? config.map : undefined;\n const documentation = typeof config.comment === \"string\" ? config.comment : undefined;\n // Read on every column kind; `assertValidSchemaIR` refuses it off String\n // fields (`collation-non-string`), so the rule lives in one place.\n const collation = typeof config.collation === \"string\" ? config.collation : undefined;\n const metadata = normalizeJsonSchemaRef({ documentation, reference: config.jsonSchema });\n const defaultValue = fieldDefault({ column });\n const native = extensionNativeType ?? nativeType({ column });\n\n return {\n name,\n type: fieldType({ column }),\n isList,\n isOptional: config.optional === true,\n isId: column.__columnType === \"id\",\n isUnique: config.unique === true,\n isUpdatedAt: column.__columnType === \"datetime\" && config.updatedAt === true,\n ...(collation === undefined ? {} : { collation }),\n ...(dbName === undefined ? {} : { dbName }),\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n ...(native === undefined ? {} : { nativeType: native }),\n ...(column.__columnType === \"unsupported\" ? { isUnsupported: true as const } : {}),\n ...metadata,\n };\n}\n\n// ─── Relations ────────────────────────────\n\nfunction buildRelation(params: { relation: PlannedRelation; plan: SchemaPlan }): RelationIR {\n const { relation, plan } = params;\n\n return {\n name: relation.name,\n model: relation.model,\n targetModel: relation.targetModel,\n type: resolveRelationType({ relation, plan }),\n isList: relation.isList,\n isOptional: relation.isOptional,\n ...(relation.relationName === undefined ? {} : { relationName: relation.relationName }),\n ...(relation.constraintName === undefined ? {} : { constraintName: relation.constraintName }),\n ...(relation.fields === undefined ? {} : { fields: [...relation.fields] }),\n ...(relation.references === undefined ? {} : { references: [...relation.references] }),\n ...(relation.onDelete === undefined ? {} : { onDelete: relation.onDelete }),\n ...(relation.onUpdate === undefined ? {} : { onUpdate: relation.onUpdate }),\n };\n}\n\n// ─── Indexes ──────────────────────────────\n\nconst INDEX_KINDS: Readonly<Record<IndexType, IndexKind>> = {\n BTree: \"btree\",\n Hash: \"hash\",\n Gin: \"gin\",\n Gist: \"gist\",\n SpGist: \"spgist\",\n Brin: \"brin\",\n};\n\nfunction buildIndex(params: {\n index: PlannedIndex;\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): IndexIR {\n const { index, model, dialect, enums } = params;\n if (index.ops !== undefined && Object.values(index.ops).some((operatorClass) => operatorClass !== undefined) && !dialect.capabilities.indexOperatorClasses) throw unsupportedCapability({ dialect: dialect.name, feature: \"indexOperatorClasses\" });\n const kind: IndexKind = index.isUnique\n ? \"unique\"\n : index.indexType === undefined\n ? \"btree\"\n : INDEX_KINDS[index.indexType];\n\n // A typed predicate becomes SQL text HERE, once, where the dialect is known;\n // a raw string is carried through verbatim.\n const predicate = compileIndexPredicate({\n where: index.where,\n wherePredicate: index.wherePredicate,\n columns: index.columns,\n model,\n dialect,\n enums,\n });\n\n return {\n kind,\n fields: index.columns.map((name) => ({ name, ...(index.ops?.[name] === undefined ? {} : { operatorClass: index.ops[name] }) })),\n ...(index.map === undefined ? {} : { name: index.map }),\n ...(predicate === undefined ? {} : { where: predicate.where }),\n ...(predicate?.wherePredicate === undefined ? {} : { wherePredicate: predicate.wherePredicate }),\n ...(index.nullsNotDistinct === true ? { nullsNotDistinct: true } : {}),\n ...(index.clientName === undefined ? {} : { clientName: index.clientName }),\n };\n}\n\n// ─── Models ───────────────────────────────\n\nfunction buildModel(params: {\n model: ModelDef;\n plan: SchemaPlan;\n extensions: ExtensionRegistry;\n declarations: ExtensionDeclarationCollector;\n issues: ValidationIssue[];\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): ModelIR {\n const { model, plan, extensions, declarations, issues, dialect, enums } = params;\n const primaryKey =\n model.__primaryKey !== undefined && model.__primaryKey.length > 0\n ? { fields: [...model.__primaryKey] }\n : undefined;\n const policy =\n model.__policy === undefined\n ? undefined\n : { field: model.__policy.field, context: model.__policy.context ?? model.__policy.field };\n\n const fields: FieldIR[] = [];\n for (const [name, column] of model.__columns) {\n const extensionTypeName = column.__config[\"extensionType\"];\n if (typeof extensionTypeName !== \"string\") {\n fields.push(buildField({ name, column }));\n continue;\n }\n // Extension column type — lowered by the same registry hook the parser uses.\n const registered = extensions.fieldTypes.get(extensionTypeName);\n if (registered === undefined) {\n issues.push({\n rule: \"extension-attribute\",\n message: `Field \"${model.__name}.${name}\" uses extension type \"${extensionTypeName}\" but no configured extension provides it`,\n model: model.__name,\n field: name,\n });\n continue;\n }\n const rawArgs = column.__config[\"extensionArgs\"];\n const lowered = registered.fieldType.lower({\n model: model.__name,\n field: name,\n args: Array.isArray(rawArgs)\n ? rawArgs.filter(\n (entry): entry is string | number =>\n typeof entry === \"string\" || typeof entry === \"number\",\n )\n : [],\n });\n if (\"error\" in lowered) {\n issues.push({\n rule: \"extension-attribute\",\n message: `Field \"${model.__name}.${name}\": ${lowered.error}`,\n model: model.__name,\n field: name,\n });\n continue;\n }\n fields.push(buildField({ name, column, extensionNativeType: lowered.nativeType }));\n if (lowered.declaration !== undefined) {\n declarations.add({\n extension: registered.extension.name,\n model: model.__name,\n declaration: lowered.declaration,\n });\n }\n }\n\n // Model-level extension attributes route through the same parse hook as @@attrs.\n for (const use of model.__extensions ?? []) {\n const registered = extensions.modelAttributes.get(use.attribute);\n if (registered === undefined) {\n issues.push({\n rule: \"unknown-attribute\",\n message: `Unknown block attribute \"@@${use.attribute}\" on model \"${model.__name}\" — no extension provides it`,\n model: model.__name,\n });\n continue;\n }\n const parsed = registered.attribute.parse({\n model: model.__name,\n args: {\n named: { ...(use.args ?? {}) },\n ...(use.fields === undefined ? {} : { fields: use.fields }),\n },\n fieldNames: fields.map((field) => field.name),\n });\n if (\"error\" in parsed) {\n issues.push({\n rule: \"extension-attribute\",\n message: `@@${use.attribute} on \"${model.__name}\": ${parsed.error}`,\n model: model.__name,\n });\n continue;\n }\n declarations.add({\n extension: registered.extension.name,\n model: model.__name,\n declaration: parsed.declaration,\n });\n }\n\n // Predicates read the built fields, so `@map`ped physical names and the exact\n // scalar types are the ones the rest of the IR carries.\n const predicateModel: PredicateModel = { name: model.__name, fields };\n const exclusions = compileExclusions({ exclusions: model.__exclusions, model: predicateModel, dialect });\n const checks = compileChecks({ checks: model.__checks, model: predicateModel, dialect, enums });\n\n return {\n name: model.__name,\n ...(model.__map === undefined ? {} : { dbName: model.__map }),\n fields,\n relations: (plan.relations.get(model.__name) ?? []).map((relation) =>\n buildRelation({ relation, plan })\n ),\n indexes: (plan.indexes.get(model.__name) ?? []).map((index) =>\n buildIndex({ index, model: predicateModel, dialect, enums }),\n ),\n ...(exclusions.length === 0 ? {} : { exclusions }),\n ...(checks.length === 0 ? {} : { checks }),\n ...(policy === undefined ? {} : { policy }),\n ...(primaryKey === undefined ? {} : { primaryKey }),\n isView: false,\n ...(model.__comment === undefined ? {} : { documentation: model.__comment }),\n };\n}\n\n// ─── Extension declarations ─────────────────────────────────\n\n/** extension → model → merged declaration; sorted output matches the parser. */\nclass ExtensionDeclarationCollector {\n private readonly byExtension = new Map<string, Map<string, Record<string, unknown>>>();\n\n add(params: {\n extension: string;\n model: string;\n declaration: Readonly<Record<string, unknown>>;\n }): void {\n const perModel =\n this.byExtension.get(params.extension) ?? new Map<string, Record<string, unknown>>();\n this.byExtension.set(params.extension, perModel);\n const existing = perModel.get(params.model) ?? {};\n perModel.set(\n params.model,\n mergeExtensionDeclarations({ base: existing, next: params.declaration, extension: params.extension }),\n );\n }\n\n toIR(): ExtensionDeclIR[] {\n return [...this.byExtension.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, perModel]) => ({\n name,\n options: {\n models: Object.fromEntries(\n [...perModel.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)),\n ),\n },\n }));\n }\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Compiles a composed DSL schema to the canonical `SchemaIR`, then validates it.\n *\n * @throws VibeError `VIBE_SCHEMA_INVALID` when the resulting IR fails\n * `assertValidSchemaIR` (unknown relation targets, missing primary keys, …).\n *\n * @example\n * const ir = dsl.toIR({ schema: dsl.schema({ User }, { relations }) });\n * const sqlite = dsl.toIR({ schema, provider: \"sqlite\" });\n */\nexport function toIR(params: {\n schema: SchemaDef;\n provider?: Provider;\n extensions?: ExtensionRegistry;\n}): SchemaIR {\n const { schema, provider = \"postgresql\" } = params;\n const extensions = params.extensions ?? EMPTY_EXTENSION_REGISTRY;\n const plan = planSchema({ schema });\n const declarations = new ExtensionDeclarationCollector();\n const issues: ValidationIssue[] = [];\n\n // `storage` is written only for string-backed enums: absent means\n // \"database\" (`enumStorageOf`), so IR for existing schemas is unchanged.\n // Built BEFORE the models because typed CHECK and partial-index expressions\n // are compiled to SQL while a model is built, and an enum operand is checked\n // for membership against the declaration.\n const enums: EnumIR[] = Array.from(schema.__enums, ([name, values]) => ({\n name,\n values: [...values],\n ...(schema.__enumStorage.get(name) === \"string\" ? { storage: \"string\" as const } : {}),\n }));\n const dialect = getSqlDialect({ dialect: providerToDialect({ provider }) });\n\n const models: ModelIR[] = Array.from(schema.__models.values(), (model) => {\n const built = buildModel({ model, plan, extensions, declarations, issues, dialect, enums });\n const rls = schema.__rls?.policies[model.__name];\n return rls === undefined ? built : { ...built, rls };\n });\n if (schema.__rls !== undefined) {\n for (const name of Object.keys(schema.__rls.policies)) {\n if (!schema.__models.has(name)) {\n issues.push({ rule: \"rls-unknown-model\", model: name, message: `RLS classification references model \"${name}\" absent from the composed schema` });\n }\n }\n }\n if (issues.length > 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Schema validation failed with ${issues.length} issue(s): ${issues\n .map((issue) => issue.message)\n .join(\"; \")}`,\n meta: { issues },\n });\n }\n\n const ir: SchemaIR = {\n datasource: { provider },\n models,\n enums,\n extensions: declarations.toIR(),\n ...(schema.__rls === undefined ? {} : { rls: { context: schema.__rls.context } }),\n };\n\n assertValidSchemaIR({ schema: ir });\n return ir;\n}\n",
10
- "/**\n * One column → `FieldType` mapping, shared by every DSL output path.\n *\n * `toIR` writes it into the IR and relation planning compares it on both sides\n * of a foreign key, so the scalar a column IS and the scalar a relation pairs\n * BY can never drift apart.\n */\n\nimport { fieldTypeIdentity } from \"@vibeorm/schema\";\nimport type { FieldType } from \"@vibeorm/schema\";\nimport type { ColumnDef, IdColumnConfig } from \"./types.ts\";\n\n/**\n * The IR field type of a column.\n *\n * `dsl.id()` is `Int` only for the `autoincrement` strategy — every other id\n * strategy is app-generated text. An inline enum resolves to its assigned name\n * (`dsl.schema()` assigns it); an unnamed one degrades to `String`, exactly as\n * an unnamed enum column does everywhere else. `dsl.unsupported()` keeps a\n * nominal `String` base and carries its real database type in `nativeType`.\n */\nexport function columnFieldType(params: { column: ColumnDef }): FieldType {\n const { column } = params;\n\n switch (column.__columnType) {\n case \"string\":\n return \"String\";\n case \"int\":\n return \"Int\";\n case \"bigint\":\n return \"BigInt\";\n case \"float\":\n return \"Float\";\n case \"decimal\":\n return \"Decimal\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"json\":\n return \"Json\";\n case \"bytes\":\n return \"Bytes\";\n case \"id\":\n return (column.__config as IdColumnConfig).type === \"autoincrement\" ? \"Int\" : \"String\";\n case \"enum\":\n return column.__enumName === undefined ? \"String\" : { enum: column.__enumName };\n case \"unsupported\":\n return \"String\";\n }\n}\n\n/**\n * A comparable spelling of a column's field type — `\"String\"`, `\"Int\"`,\n * `\"enum:Status\"`. Two columns can be the two ends of one foreign key only when\n * these agree exactly.\n */\nexport function fieldTypeKey(params: { column: ColumnDef }): string {\n return fieldTypeIdentity({ type: columnFieldType({ column: params.column }) });\n}\n",
11
- "/**\n * The schema plan: one resolution of a `SchemaDef` into the exact relation\n * fields and indexes a model exposes.\n *\n * Both output paths consume it — `generate.prisma()` renders it as text and\n * `toIR()` compiles it to `SchemaIR` — so a schema authored once produces the\n * same relations either way, and `parse(generate.prisma(s))` matches `toIR(s)`.\n *\n * It resolves, in order:\n * 1. explicit relations (with the 1:1 merge pass, see `detectOneToOnePairs`),\n * 2. reverse list relations Prisma requires but the author left implicit,\n * 3. inline children lists, and the child's FK back to its parent,\n * 4. indexes (column-level + composite, deduplicated).\n *\n * Naming policy — a relation field is named by whoever declared it:\n * - author-declared relation keys (`Post: { author: … }`) and inline-children\n * keys (`Items: s.children(…)`) pass through VERBATIM, so the name the user\n * wrote is the name in both the IR and the `.prisma` text;\n * - names the planner invents (reverse list sides, a child's FK back to its\n * parent) use the `@relation` alias when there is one, else the source model\n * name, suffixed on collision.\n */\n\nimport { VibeError, isSqlObjectIdentity, predicateKey } from \"@vibeorm/schema\";\nimport type { CascadeAction, PredicateIR, QualifiedSqlName, RelationType } from \"@vibeorm/schema\";\nimport { fieldTypeKey } from \"./field-type.ts\";\nimport { evaluateIndexes } from \"./model.ts\";\nimport { toFkColumnName } from \"./naming.ts\";\nimport type {\n IndexType,\n ModelDef,\n RelationsMap,\n SchemaDef,\n StoredRelationDef,\n} from \"./types.ts\";\n\n// ─── Plan shapes ──────────────────────────\n\n/**\n * Structural role of a planned relation field:\n * - `fkOwner` — holds the foreign key (`@relation(fields:…, references:…)`)\n * - `backOne` — singular back reference, no foreign key\n * - `list` — list side (`Model[]`)\n */\nexport type PlannedRelationKind = \"fkOwner\" | \"backOne\" | \"list\";\n\n/** One relation field, exactly as it will be emitted. */\nexport type PlannedRelation = {\n readonly model: string;\n /**\n * Field name on the owning model, as emitted — the author's declared key\n * verbatim, or a planner-generated name for a side the author left implicit.\n */\n readonly name: string;\n readonly targetModel: string;\n readonly kind: PlannedRelationKind;\n readonly isList: boolean;\n readonly isOptional: boolean;\n /** `@relation(\"Name\")` — the DSL's `alias`. */\n readonly relationName?: string;\n /** Physical FOREIGN KEY name — the DSL's `constraintName`, never the alias. */\n readonly constraintName?: string;\n /** FK columns on this model, in declared order; member `i` pairs with `references[i]`. */\n readonly fields?: readonly string[];\n /** Referenced columns on the target model, in declared order. */\n readonly references?: readonly string[];\n readonly onDelete?: CascadeAction;\n readonly onUpdate?: CascadeAction;\n};\n\n/** One index, after column-level and composite indexes are deduplicated. */\nexport type PlannedIndex = {\n readonly map?: string;\n readonly isUnique: boolean;\n readonly columns: readonly string[];\n readonly indexType?: IndexType;\n /** Qualified operator classes keyed by logical index column. */\n readonly ops?: Readonly<Partial<Record<string, QualifiedSqlName>>>;\n /** Partial-index predicate (raw SQL) — postgres/pglite/sqlite only. */\n readonly where?: string;\n /** Partial-index predicate as a typed expression, rendered when the dialect is known. */\n readonly wherePredicate?: PredicateIR;\n /** `UNIQUE NULLS NOT DISTINCT` — unique indexes on postgres/pglite (15+) only. */\n readonly nullsNotDistinct?: boolean;\n /** Client selector name for a compound unique (Prisma `@@unique(..., name:)`). */\n readonly clientName?: string;\n};\n\n/** Everything both output paths need, keyed by model name. */\nexport type SchemaPlan = {\n readonly relations: ReadonlyMap<string, readonly PlannedRelation[]>;\n readonly indexes: ReadonlyMap<string, readonly PlannedIndex[]>;\n};\n\n// ─── 1:1 merge detection ──────────────────\n\n/** How a relation participates in a merged one-to-one pair. */\nexport type MergedOneToOneSide = {\n readonly role: \"fkOwner\" | \"backRelation\";\n readonly pairedRelName: string;\n readonly pairedModelName: string;\n /** Merged referential actions — the FK owner's win. */\n readonly onDelete?: CascadeAction;\n readonly onUpdate?: CascadeAction;\n /** Merged physical FK name — the FK owner's wins; either side may declare it. */\n readonly constraintName?: string;\n};\n\ntype OneRelationEntry = {\n readonly modelName: string;\n readonly relName: string;\n readonly rel: StoredRelationDef;\n};\n\nfunction relationPairKey(params: { relation: StoredRelationDef; reverse?: boolean }): string {\n const { relation, reverse } = params;\n return JSON.stringify(reverse\n ? [relation.__toModel, relation.__toColumns, relation.__fromModel, relation.__fromColumns, relation.__alias ?? \"\"]\n : [relation.__fromModel, relation.__fromColumns, relation.__toModel, relation.__toColumns, relation.__alias ?? \"\"]);\n}\n\n/**\n * Finds pairs of `r.one` relations that describe the same 1:1 relationship\n * from both sides, and decides which side owns the foreign key.\n *\n * Two `one` relations pair when their column references cross-match:\n * `A.from === B.to` and `A.to === B.from`. The FK owner is the side whose\n * `from` column is NOT the primary key.\n *\n * Returns a map keyed by `\"Model:relationName\"`.\n */\nexport function detectOneToOnePairs(params: {\n relations: RelationsMap;\n models: ReadonlyMap<string, ModelDef>;\n}): Map<string, MergedOneToOneSide> {\n const { relations, models } = params;\n const mergeMap = new Map<string, MergedOneToOneSide>();\n\n const allOnes: OneRelationEntry[] = [];\n for (const [modelName, modelRelations] of Object.entries(relations)) {\n for (const [relName, rel] of Object.entries(modelRelations)) {\n if (rel.__ownsForeignKey !== undefined && (typeof rel.__ownsForeignKey !== \"boolean\" || rel.__relationType !== \"one\" || (rel.__ownsForeignKey && rel.__fromModel !== modelName))) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Invalid foreign-key ownership declaration on ${modelName}.${relName}` });\n }\n if (rel.__relationType === \"one\") {\n allOnes.push({ modelName, relName, rel });\n }\n }\n }\n\n const candidatesByKey = new Map<string, { readonly positions: number[]; start: number }>();\n for (const [position, entry] of allOnes.entries()) {\n const key = relationPairKey({ relation: entry.rel });\n const bucket = candidatesByKey.get(key);\n if (bucket === undefined) candidatesByKey.set(key, { positions: [position], start: 0 });\n else bucket.positions.push(position);\n }\n const paired = new Set<string>();\n\n for (let i = 0; i < allOnes.length; i++) {\n const a = allOnes[i];\n if (a === undefined) continue;\n const keyA = `${a.modelName}:${a.relName}`;\n if (paired.has(keyA)) continue;\n\n const bucket = candidatesByKey.get(relationPairKey({ relation: a.rel, reverse: true }));\n if (bucket === undefined) continue;\n for (let candidate = bucket.start; candidate < bucket.positions.length; candidate++) {\n const j = bucket.positions[candidate]!;\n const b = allOnes[j]!;\n const keyB = `${b.modelName}:${b.relName}`;\n if (j <= i || paired.has(keyB)) {\n bucket.start = candidate + 1;\n continue;\n }\n\n // Composite sides pair only when the WHOLE tuple crosses over, member by\n // member: two relations sharing their first column but disagreeing later\n // describe different foreign keys.\n const sameColumnPair =\n a.rel.__fromModel === b.rel.__toModel &&\n sameColumnTuple({ left: a.rel.__fromColumns, right: b.rel.__toColumns }) &&\n a.rel.__toModel === b.rel.__fromModel &&\n sameColumnTuple({ left: a.rel.__toColumns, right: b.rel.__fromColumns });\n if (!sameColumnPair || (a.rel.__alias ?? \"\") !== (b.rel.__alias ?? \"\")) continue;\n\n const { fkOwner, backRelation } = resolveFkOwner({ a, b, models });\n\n const onDelete = fkOwner.rel.__onDelete ?? backRelation.rel.__onDelete;\n const onUpdate = fkOwner.rel.__onUpdate ?? backRelation.rel.__onUpdate;\n const constraintName = fkOwner.rel.__constraintName ?? backRelation.rel.__constraintName;\n\n const fkKey = `${fkOwner.modelName}:${fkOwner.relName}`;\n const backKey = `${backRelation.modelName}:${backRelation.relName}`;\n\n mergeMap.set(fkKey, {\n role: \"fkOwner\",\n pairedRelName: backRelation.relName,\n pairedModelName: backRelation.modelName,\n onDelete,\n onUpdate,\n ...(constraintName === undefined ? {} : { constraintName }),\n });\n mergeMap.set(backKey, {\n role: \"backRelation\",\n pairedRelName: fkOwner.relName,\n pairedModelName: fkOwner.modelName,\n onDelete,\n onUpdate,\n ...(constraintName === undefined ? {} : { constraintName }),\n });\n\n paired.add(fkKey);\n paired.add(backKey);\n bucket.start = candidate + 1;\n break;\n }\n }\n\n return mergeMap;\n}\n\n/** Two relation ends name the same columns, in the same order. */\nfunction sameColumnTuple(params: { left: readonly string[]; right: readonly string[] }): boolean {\n const { left, right } = params;\n return left.length === right.length && left.every((name, index) => name === right[index]);\n}\n\nfunction resolveFkOwner(params: {\n a: OneRelationEntry;\n b: OneRelationEntry;\n models: ReadonlyMap<string, ModelDef>;\n}): { fkOwner: OneRelationEntry; backRelation: OneRelationEntry } {\n const { a, b, models } = params;\n\n const ownershipError = (): never => {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Ambiguous foreign-key ownership between ${a.modelName}.${a.relName} and ${b.modelName}.${b.relName}; set ownsForeignKey: true on the foreign-key side`, meta: { rule: \"ambiguous-foreign-key-owner\" } });\n };\n const aOwns = a.rel.__ownsForeignKey;\n const bOwns = b.rel.__ownsForeignKey;\n if (aOwns !== undefined || bOwns !== undefined) {\n if (aOwns === bOwns) return ownershipError();\n return aOwns === true || bOwns === false ? { fkOwner: a, backRelation: b } : { fkOwner: b, backRelation: a };\n }\n const aFromIsId = fromIsPrimaryKey({ model: models.get(a.modelName), columns: a.rel.__fromColumns });\n const bFromIsId = fromIsPrimaryKey({ model: models.get(b.modelName), columns: b.rel.__fromColumns });\n\n if (aFromIsId && !bFromIsId) return { fkOwner: b, backRelation: a };\n if (!aFromIsId && bFromIsId) return { fkOwner: a, backRelation: b };\n\n // Ambiguous (both or neither are primary keys): the side that declares\n // referential actions owns the FK, else the side whose column reads like one.\n const aActions = a.rel.__onDelete !== undefined || a.rel.__onUpdate !== undefined;\n const bActions = b.rel.__onDelete !== undefined || b.rel.__onUpdate !== undefined;\n if (aActions && !bActions) {\n return { fkOwner: a, backRelation: b };\n }\n if (bActions && !aActions) {\n return { fkOwner: b, backRelation: a };\n }\n\n const aLooksFk = a.rel.__fromColumns.some((column) => looksLikeForeignKey({ column }));\n const bLooksFk = b.rel.__fromColumns.some((column) => looksLikeForeignKey({ column }));\n if (aLooksFk === bLooksFk) return ownershipError();\n return aLooksFk ? { fkOwner: a, backRelation: b } : { fkOwner: b, backRelation: a };\n}\n\n/**\n * Does this relation end name the model's OWN primary key? A composite end must\n * be the whole compound key; a single column keeps the older, looser rule (an\n * `id()` column, or any member of a compound key) so single-column ownership\n * detection is unchanged.\n */\nfunction fromIsPrimaryKey(params: { model: ModelDef | undefined; columns: readonly string[] }): boolean {\n const { model, columns } = params;\n if (model === undefined) return false;\n if (columns.length > 1) {\n const primaryKey = model.__primaryKey;\n return (\n primaryKey !== undefined &&\n primaryKey.length === columns.length &&\n primaryKey.every((name) => columns.includes(name))\n );\n }\n const column = columns[0];\n if (column === undefined) return false;\n return model.__columns.get(column)?.__columnType === \"id\" || model.__primaryKey?.includes(column) === true;\n}\n\nfunction looksLikeForeignKey(params: { column: string }): boolean {\n const { column } = params;\n return column.toLowerCase().includes(\"id\") && column !== \"id\";\n}\n\n// ─── Relation planning ────────────────────\n\nfunction planExplicitRelations(params: {\n modelName: string;\n model: ModelDef;\n relations: RelationsMap;\n mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n}): PlannedRelation[] {\n const { modelName, model, relations, mergeMap } = params;\n const planned: PlannedRelation[] = [];\n\n for (const [relName, rel] of Object.entries(relations[modelName] ?? {})) {\n // The author's key IS the field name — never re-cased, so one logical\n // schema reads the same through the IR and through the .prisma text.\n const name = relName;\n const base = {\n model: modelName,\n name,\n targetModel: rel.__targetModel,\n relationName: rel.__alias,\n };\n\n if (rel.__relationType === \"many\") {\n planned.push({ ...base, kind: \"list\", isList: true, isOptional: false });\n continue;\n }\n\n const mergeInfo = mergeMap.get(`${modelName}:${relName}`);\n\n if (mergeInfo?.role === \"backRelation\") {\n // Parent side of a merged 1:1 — always an optional back reference.\n planned.push({ ...base, kind: \"backOne\", isList: false, isOptional: true });\n continue;\n }\n\n const ownsFk = mergeInfo?.role === \"fkOwner\" || (rel.__ownsForeignKey !== false && rel.__fromModel === modelName);\n if (!ownsFk) {\n planned.push({ ...base, kind: \"backOne\", isList: false, isOptional: rel.__optional });\n continue;\n }\n\n // MATCH SIMPLE: one NULL member and the database checks nothing, so the\n // parent is absent as soon as ANY member is nullable.\n const anyMemberOptional = rel.__fromColumns.some(\n (name) => model.__columns.get(name)?.__config.optional === true,\n );\n const constraintName = mergeInfo?.constraintName ?? rel.__constraintName;\n planned.push({\n ...base,\n kind: \"fkOwner\",\n isList: false,\n isOptional: anyMemberOptional || rel.__optional,\n fields: [...rel.__fromColumns],\n references: [...rel.__toColumns],\n ...(constraintName === undefined ? {} : { constraintName }),\n onDelete: mergeInfo?.onDelete ?? rel.__onDelete,\n onUpdate: mergeInfo?.onUpdate ?? rel.__onUpdate,\n });\n }\n\n return planned;\n}\n\n/**\n * Prisma requires both sides of a relation to exist. For every `one` relation\n * pointing at this model without a matching list on this side, plan the list.\n * Merged 1:1 pairs are complete already and are skipped.\n *\n * These names are generated, not declared: the `@relation` alias when the\n * source side has one, else the source model name, numerically suffixed if that\n * name is already taken on this model.\n */\nfunction planMissingReverseRelations(params: {\n modelName: string;\n relations: RelationsMap;\n incoming: readonly OneRelationEntry[];\n mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n existing: readonly PlannedRelation[];\n}): PlannedRelation[] {\n const { modelName, relations, incoming, mergeMap, existing } = params;\n const planned: PlannedRelation[] = [];\n\n const existingLists = new Set<string>();\n const existingNames = new Set<string>();\n for (const relation of existing) {\n existingNames.add(relation.name);\n if (relation.isList) {\n existingLists.add(`${relation.targetModel}:${relation.relationName ?? \"\"}`);\n }\n }\n\n for (const { modelName: sourceModelName, relName, rel } of incoming) {\n if (mergeMap.has(`${sourceModelName}:${relName}`)) continue;\n\n const reverseKey = `${sourceModelName}:${rel.__alias ?? \"\"}`;\n if (existingLists.has(reverseKey)) continue;\n\n // A self-relation may already declare its own list side explicitly.\n if (sourceModelName === modelName) {\n const hasExplicitReverse = Object.values(relations[sourceModelName] ?? {}).some(\n (other: StoredRelationDef) =>\n other.__relationType === \"many\" &&\n other.__targetModel === modelName &&\n other.__alias === rel.__alias\n );\n if (hasExplicitReverse) continue;\n }\n\n const baseName = rel.__alias ?? sourceModelName;\n let name = baseName;\n let counter = 1;\n while (existingNames.has(name)) {\n counter++;\n name = `${baseName}${counter}`;\n }\n\n planned.push({\n model: modelName,\n name,\n targetModel: sourceModelName,\n kind: \"list\",\n isList: true,\n isOptional: false,\n relationName: rel.__alias,\n });\n existingLists.add(reverseKey);\n existingNames.add(name);\n }\n\n return planned;\n}\n\n/** The parent's list of inline children, plus each child's FK back to it. */\nfunction planChildRelations(params: {\n modelName: string;\n model: ModelDef;\n parents: readonly (readonly [string, ModelDef])[];\n}): PlannedRelation[] {\n const { modelName, model, parents } = params;\n const planned: PlannedRelation[] = [];\n\n for (const [childKey, childModel] of model.__children) {\n planned.push({\n model: modelName,\n name: childKey,\n targetModel: childModel.__name,\n kind: \"list\",\n isList: true,\n isOptional: false,\n });\n }\n\n for (const [parentModelName, parentModel] of parents) {\n const parentPk =\n parentModel.__primaryKey?.[0] ??\n Array.from(parentModel.__columns.entries()).find(\n ([, column]) => column.__columnType === \"id\"\n )?.[0] ??\n \"id\";\n\n planned.push({\n model: modelName,\n name: parentModelName,\n targetModel: parentModelName,\n kind: \"fkOwner\",\n isList: false,\n isOptional: false,\n fields: [toFkColumnName({ modelName: parentModelName })],\n references: [parentPk],\n });\n }\n\n return planned;\n}\n\n// ─── Index planning ───────────────────────\n\nfunction planIndexes(params: { model: ModelDef }): PlannedIndex[] {\n const { model } = params;\n const byKey = new Map<string, PlannedIndex>();\n\n // Column-level `.index()` — id and unique columns are already indexed.\n for (const [columnName, column] of model.__columns) {\n if (column.__columnType === \"id\" || column.__config.unique === true) continue;\n if (column.__config.index === true) {\n byKey.set(columnName, { isUnique: false, columns: [columnName] });\n }\n }\n\n // Composite/typed indexes from the model's `indexes` callback. A partial\n // index (where) is a DIFFERENT database object from a total index over the\n // same columns, so the predicate joins the dedup key. A TYPED predicate joins\n // it through `predicateKey` — a structural, dialect-free identity — because\n // index planning runs before any provider is known and must not render SQL.\n for (const index of evaluateIndexes({ model })) {\n if (index.__ops !== undefined) {\n if (index.__ops === null || typeof index.__ops !== \"object\" || Array.isArray(index.__ops)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Index ops must be a field-keyed qualified-name map\", meta: { rule: \"index-operator-class-map\", model: model.__name } });\n if (index.__type === \"unique\") throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Custom unique operator classes can change client selector equality\", meta: { feature: \"uniqueIndexOperatorClasses\", model: model.__name } });\n for (const [field, operatorClass] of Object.entries(index.__ops)) {\n if (!index.__columns.includes(field)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Operator class names a field outside the index\", meta: { rule: \"index-operator-class-field\", model: model.__name, field } });\n if (operatorClass !== undefined && !isSqlObjectIdentity({ kind: \"table\", name: operatorClass })) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Index operator class must be a qualified SQL name { namespace, name }\", meta: { rule: \"index-operator-class-identity\", model: model.__name, field } });\n }\n }\n const operatorClasses = index.__columns.map((field) => index.__ops?.[field]);\n const operatorSuffix = operatorClasses.some((operatorClass) => operatorClass !== undefined)\n ? `|ops:${JSON.stringify([index.__indexType ?? \"BTree\", operatorClasses.map((operatorClass) => operatorClass === undefined ? null : [operatorClass.namespace, operatorClass.name])])}`\n : \"\";\n const predicateSuffix =\n index.__where !== undefined\n ? `|where:${index.__where}`\n : index.__wherePredicate === undefined\n ? \"\"\n : `|where:${predicateKey({ predicate: index.__wherePredicate })}`;\n const key = index.__columns.join(\",\") + predicateSuffix + operatorSuffix;\n const existing = byKey.get(key);\n const isUnique = index.__type === \"unique\";\n\n if (existing === undefined || isUnique) {\n byKey.set(key, {\n isUnique,\n columns: [...index.__columns],\n indexType: index.__indexType,\n ...(index.__ops === undefined ? {} : { ops: index.__ops }),\n ...(index.__map === undefined ? {} : { map: index.__map }),\n ...(index.__where === undefined ? {} : { where: index.__where }),\n ...(index.__wherePredicate === undefined ? {} : { wherePredicate: index.__wherePredicate }),\n ...(index.__nullsNotDistinct === true ? { nullsNotDistinct: true } : {}),\n ...(index.__clientName === undefined ? {} : { clientName: index.__clientName }),\n });\n } else if (index.__map !== undefined) {\n byKey.set(key, { ...existing, map: index.__map, indexType: index.__indexType ?? existing.indexType });\n } else if (index.__indexType !== undefined && existing.indexType === undefined) {\n byKey.set(key, { ...existing, indexType: index.__indexType });\n }\n }\n\n return Array.from(byKey.values());\n}\n\n// ─── Foreign-key integrity ────────────────\n\n/**\n * Every column set a foreign key may legally REFERENCE on a model: its `id()`\n * column, each `unique()` column, its compound primary key and each TOTAL\n * `@@unique` index. A partial unique is excluded — raw `where:` or typed\n * `.where()` alike, because no dialect here accepts one as a foreign-key\n * target, and which SPELLING made it partial changes nothing about that.\n */\nfunction referenceableKeys(params: { model: ModelDef }): readonly (readonly string[])[] {\n const { model } = params;\n const keys: (readonly string[])[] = [];\n\n for (const [name, column] of model.__columns) {\n if (column.__columnType === \"id\" || column.__config.unique === true) keys.push([name]);\n }\n if (model.__primaryKey !== undefined && model.__primaryKey.length > 0) keys.push([...model.__primaryKey]);\n for (const index of evaluateIndexes({ model })) {\n if (index.__type === \"unique\" && index.__where === undefined && index.__wherePredicate === undefined) {\n keys.push([...index.__columns]);\n }\n }\n\n return keys;\n}\n\n/**\n * Checks one FK-owning relation the way the database will: equal arity, the\n * same scalar type on both ends of every member, and a referenced column set\n * that is exactly some unique key of the target.\n *\n * Refusing here is the earliest knowable moment — the alternative is DDL the\n * server rejects with \"there is no unique constraint matching given keys\", or\n * a foreign key that compares two different scalar types.\n */\nfunction assertForeignKeyIntegrity(params: {\n relation: PlannedRelation;\n models: ReadonlyMap<string, ModelDef>;\n}): void {\n const { relation, models } = params;\n const fields = relation.fields ?? [];\n const references = relation.references ?? [];\n const at = `${relation.model}.${relation.name}`;\n\n const refuse = (message: string, rule: string, meta: Record<string, unknown> = {}): never => {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation ${at}: ${message}`,\n meta: { rule, model: relation.model, relation: relation.name, ...meta },\n });\n };\n\n if (fields.length !== references.length) {\n refuse(\n `pairs ${fields.length} foreign-key column(s) with ${references.length} referenced column(s)`,\n \"relation-tuple-arity\",\n { fields, references },\n );\n }\n if (new Set(fields).size !== fields.length) {\n refuse(`repeats a foreign-key column (${fields.join(\", \")})`, \"relation-duplicate-column\", { fields });\n }\n if (new Set(references).size !== references.length) {\n refuse(`repeats a referenced column (${references.join(\", \")})`, \"relation-duplicate-column\", { references });\n }\n\n const owner = models.get(relation.model);\n const target = models.get(relation.targetModel);\n // An unknown target is `unknown-relation-target`, reported by IR validation\n // against the whole schema; nothing here can add to it.\n if (owner === undefined || target === undefined) return;\n\n fields.forEach((name, index) => {\n const referenced = references[index]!;\n const column = owner.__columns.get(name);\n const refColumn = target.__columns.get(referenced);\n if (column === undefined) {\n refuse(`uses foreign-key column \"${name}\", which ${relation.model} does not declare`, \"unknown-relation-field\", { field: name });\n return;\n }\n if (refColumn === undefined) {\n refuse(`references \"${relation.targetModel}.${referenced}\", which does not exist`, \"unknown-relation-reference\", { reference: referenced });\n return;\n }\n if (column.__config.array === true || refColumn.__config.array === true) {\n refuse(`pairs a scalar list (${name} ↔ ${referenced}) — a foreign key compares single values`, \"relation-list-column\", { field: name, reference: referenced });\n }\n if (column.__columnType === \"json\" || refColumn.__columnType === \"json\" || column.__columnType === \"unsupported\" || refColumn.__columnType === \"unsupported\") {\n refuse(`pairs ${name} ↔ ${referenced}, and Json/unsupported columns cannot be a foreign key`, \"relation-unsupported-column\", { field: name, reference: referenced });\n }\n const ownType = fieldTypeKey({ column });\n const refType = fieldTypeKey({ column: refColumn });\n if (ownType !== refType) {\n refuse(\n `pairs ${relation.model}.${name} (${ownType}) with ${relation.targetModel}.${referenced} (${refType}) — both ends of a foreign key need the same scalar type`,\n \"relation-type-mismatch\",\n { field: name, reference: referenced, fieldType: ownType, referenceType: refType },\n );\n }\n });\n\n const keys = referenceableKeys({ model: target });\n const matched = keys.some(\n (key) => key.length === references.length && key.every((name) => references.includes(name)),\n );\n if (!matched) {\n refuse(\n `references ${relation.targetModel}.(${references.join(\", \")}), which is not a unique key there — declare those columns as the primary key, a unique column, or a total @@unique index`,\n \"relation-reference-not-unique\",\n { references, candidates: keys.map((key) => [...key]) },\n );\n }\n}\n\n// ─── Public API ────────────────────────\n\ntype RelationLookups = {\n readonly incoming: ReadonlyMap<string, readonly OneRelationEntry[]>;\n readonly parents: ReadonlyMap<string, readonly (readonly [string, ModelDef])[]>;\n};\n\nfunction relationLookups(params: { schema: SchemaDef }): RelationLookups {\n const incoming = new Map<string, OneRelationEntry[]>();\n for (const [modelName, relations] of Object.entries(params.schema.__relations)) {\n for (const [relName, rel] of Object.entries(relations)) {\n if (rel.__relationType !== \"one\") continue;\n const target = rel.__targetModel;\n const entries = incoming.get(target);\n const entry = { modelName, relName, rel };\n if (entries === undefined) incoming.set(target, [entry]);\n else entries.push(entry);\n }\n }\n const parents = new Map<string, (readonly [string, ModelDef])[]>();\n for (const [name, model] of params.schema.__models) {\n for (const child of model.__children.values()) {\n const entries = parents.get(child.__name);\n if (entries === undefined) parents.set(child.__name, [[name, model]]);\n else entries.push([name, model]);\n }\n }\n return { incoming, parents };\n}\n\n/** Resolves a composed schema into the relations and indexes it emits. */\nexport function planSchema(params: { schema: SchemaDef }): SchemaPlan {\n const { schema } = params;\n const mergeMap = detectOneToOnePairs({\n relations: schema.__relations,\n models: schema.__models,\n });\n\n const relations = new Map<string, readonly PlannedRelation[]>();\n const indexes = new Map<string, readonly PlannedIndex[]>();\n let lookups = relationLookups({ schema });\n let refreshLookups = false;\n\n for (const [modelName, model] of schema.__models) {\n if (refreshLookups) {\n lookups = relationLookups({ schema });\n refreshLookups = false;\n }\n const explicit = planExplicitRelations({\n modelName,\n model,\n relations: schema.__relations,\n mergeMap,\n });\n const reverses = planMissingReverseRelations({\n modelName,\n relations: schema.__relations,\n incoming: lookups.incoming.get(modelName) ?? [],\n mergeMap,\n existing: explicit,\n });\n const children = planChildRelations({ modelName, model, parents: lookups.parents.get(modelName) ?? [] });\n\n const planned = [...explicit, ...reverses, ...children];\n for (const relation of planned) {\n if (relation.kind === \"fkOwner\") {\n if (schema.__models.get(relation.targetModel)?.__indexes !== undefined) refreshLookups = true;\n assertForeignKeyIntegrity({ relation, models: schema.__models });\n }\n }\n relations.set(modelName, planned);\n // Callbacks may mutate authoring metadata as well as return fresh indexes.\n // Rebuild structural lookups before the next model, without caching results.\n if (model.__indexes !== undefined) refreshLookups = true;\n indexes.set(modelName, planIndexes({ model }));\n }\n\n return { relations, indexes };\n}\n\n/**\n * Classifies a planned relation the way a Prisma parser would classify the\n * field it renders to: by the shape of the pair, never by DSL intent.\n *\n * Counterparts are the target model's relation fields that point back with a\n * symmetric relation name (both unnamed, or the same name) — the one implicit\n * many-to-many rule, with self-exclusion (LEARNINGS.md).\n */\nexport function resolveRelationType(params: {\n relation: PlannedRelation;\n plan: SchemaPlan;\n}): RelationType {\n const { relation, plan } = params;\n const counterparts = findCounterparts({ relation, plan });\n\n if (relation.isList) {\n if (counterparts.some((candidate) => !candidate.isList)) return \"oneToMany\";\n return counterparts.some((candidate) => candidate.isList) ? \"manyToMany\" : \"oneToMany\";\n }\n\n if (relation.kind === \"fkOwner\") {\n const pairedWithSingular =\n counterparts.length > 0 && counterparts.every((candidate) => !candidate.isList);\n return pairedWithSingular ? \"oneToOne\" : \"manyToOne\";\n }\n\n return \"oneToOne\";\n}\n\nfunction findCounterparts(params: {\n relation: PlannedRelation;\n plan: SchemaPlan;\n}): PlannedRelation[] {\n const { relation, plan } = params;\n const nameKey = relation.relationName ?? \"\";\n\n return (plan.relations.get(relation.targetModel) ?? []).filter(\n (candidate) =>\n candidate !== relation &&\n candidate.targetModel === relation.model &&\n (candidate.relationName ?? \"\") === nameKey\n );\n}\n",
12
- "/**\n * Model builder — `dsl.create({ name, schema, indexes })`.\n *\n * Models hold columns (and optional inline children) only; relations are\n * declared separately via `dsl.defineRelations()`.\n *\n * @example\n * const User = dsl.create({\n * name: \"User\",\n * schema: {\n * ...dsl.templates.base,\n * email: dsl.string().unique(),\n * workspaceId: dsl.string().index(),\n * },\n * indexes: (i) => [i.unique(\"workspaceId\", \"email\")],\n * });\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { PredicateIR } from \"@vibeorm/schema\";\nimport { cloneColumnDef } from \"./column.ts\";\nimport { toFkColumnName } from \"./naming.ts\";\nimport { createPredicateBuilder } from \"./predicate.ts\";\nimport { createChildrenBuilder } from \"./relation.ts\";\nimport type {\n ChecksCallback,\n ChildrenDef,\n ChildrenSchemaCallback,\n ColumnDef,\n CreateModelConfig,\n ModelCheckConfig,\n IndexBuilder,\n IndexCallback,\n IndexDef,\n IndexOptions,\n IndexType,\n ModelDef,\n ModelPolicyConfig,\n PartialIndexDef,\n PredicateBuilder,\n SchemaDefinition,\n UniqueIndexOptions,\n} from \"./types.ts\";\n\n// ─── Type guards ──────────────────────────\n\nfunction isColumnDef(value: unknown): value is ColumnDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"column\"\n );\n}\n\nfunction isChildrenDef(value: unknown): value is ChildrenDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"children\"\n );\n}\n\n// ─── Index builder ────────────────────────\n\n/**\n * Creates the `i` handed to a model's `indexes` callback.\n *\n * @example\n * indexes: (i) => [\n * i.on(\"workspaceId\", \"name\"),\n * i.unique(\"workspaceId\", \"email\"),\n * i.gin(\"tags\"),\n * i.on([\"content\"], { type: \"Gist\" }),\n * ]\n */\nexport function createIndexBuilder<\n T extends string = string,\n TSchema extends SchemaDefinition = SchemaDefinition,\n>(): IndexBuilder<T, TSchema> {\n /**\n * Attach the terminal `.where()` so an index can still take a TYPED partial\n * predicate. It returns a plain `IndexDef`, so the chain cannot be reopened\n * and an index carries at most one predicate.\n */\n const partial = (index: IndexDef): PartialIndexDef<T, TSchema> => {\n const where = (predicate: (c: PredicateBuilder<T, TSchema>) => PredicateIR): IndexDef => {\n if (index.__where !== undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Index on [${index.__columns.join(\", \")}] already carries a raw where: predicate — an index has ONE predicate, so use either the raw string or .where(), not both`,\n meta: { rule: \"predicate-duplicate-where\", columns: [...index.__columns] },\n });\n }\n return { ...index, __wherePredicate: predicate(createPredicateBuilder<T, TSchema>()) };\n };\n // NON-enumerable on purpose: an IndexDef is DATA. An enumerable method\n // would be copied by every `{ ...index }` spread, serialized by\n // JSON.stringify, and compared by every structural assertion — so the\n // builder's own affordance would leak into the value it builds.\n return Object.defineProperty({ ...index }, \"where\", {\n value: where,\n enumerable: false,\n writable: false,\n configurable: true,\n }) as PartialIndexDef<T, TSchema>;\n };\n\n const createIndex = (params: { columns: readonly string[]; type?: IndexType; where?: string; map?: string; ops?: IndexOptions[\"ops\"] }): IndexDef => ({\n __type: \"index\",\n __columns: [...params.columns],\n __indexType: params.type,\n ...(params.map === undefined ? {} : { __map: params.map }),\n ...(params.where === undefined ? {} : { __where: params.where }),\n ...(params.ops === undefined ? {} : { __ops: params.ops }),\n });\n\n return {\n /** Composite (or single-column) index; the array form takes options. */\n on<C extends T>(...args: C[] | [C[], IndexOptions<NoInfer<C>>]): PartialIndexDef<T, TSchema> {\n const [first, second] = args;\n if (\n args.length === 2 &&\n Array.isArray(first) &&\n typeof second === \"object\" &&\n !Array.isArray(second)\n ) {\n return partial(createIndex({ columns: first, type: second.type, where: second.where, map: second.map, ops: second.ops }));\n }\n return partial(createIndex({ columns: args as string[] }));\n },\n\n /** Alias of `on(...)`. */\n index<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ columns }));\n },\n\n /** Unique constraint (`@@unique([...])`); the array form takes options (partial `where`). */\n unique<C extends T>(...args: C[] | [C[], UniqueIndexOptions]): PartialIndexDef<T, TSchema> {\n const [first, second] = args;\n if (\n args.length === 2 &&\n Array.isArray(first) &&\n typeof second === \"object\" &&\n !Array.isArray(second)\n ) {\n if (\"ops\" in second && second.ops !== undefined) {\n throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Custom unique operator classes can change client selector equality\", meta: { feature: \"uniqueIndexOperatorClasses\" } });\n }\n return partial({\n __type: \"unique\",\n __columns: [...first],\n ...(second.map === undefined ? {} : { __map: second.map }),\n ...(second.where === undefined ? {} : { __where: second.where }),\n ...(second.nullsNotDistinct === true ? { __nullsNotDistinct: true } : {}),\n ...(second.name === undefined ? {} : { __clientName: second.name }),\n });\n }\n return partial({ __type: \"unique\", __columns: [...(args as string[])] });\n },\n\n /** GIN index — JSON, arrays, full-text (PostgreSQL). */\n gin<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ columns, type: \"Gin\" }));\n },\n\n /** GiST index — geometric, range and full-text data (PostgreSQL). */\n gist<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ columns, type: \"Gist\" }));\n },\n\n /** Hash index — equality lookups (PostgreSQL). */\n hash<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ columns, type: \"Hash\" }));\n },\n\n /** BRIN index — large, naturally ordered tables (PostgreSQL). */\n brin<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ columns, type: \"Brin\" }));\n },\n };\n}\n\n// ─── Schema processing ────────────────────\n\nfunction processSchema(params: {\n modelName: string;\n schema: SchemaDefinition | ChildrenSchemaCallback;\n}): { columns: Map<string, ColumnDef>; children: Map<string, ModelDef> } {\n const { modelName, schema } = params;\n const resolvedSchema = typeof schema === \"function\" ? schema(createChildrenBuilder()) : schema;\n\n const columns = new Map<string, ColumnDef>();\n const children = new Map<string, ModelDef>();\n\n for (const [key, value] of Object.entries(resolvedSchema)) {\n if (isColumnDef(value)) {\n // Clone so template-provided columns are never shared between models.\n const cloned = cloneColumnDef({ column: value });\n cloned.__name = key;\n columns.set(key, cloned);\n } else if (isChildrenDef(value)) {\n const childModel = create({ name: value.__name, schema: value.__schema });\n\n // The child carries the FK back to its parent.\n const parentFkName = toFkColumnName({ modelName });\n childModel.__columns.set(parentFkName, {\n __type: \"column\",\n __columnType: \"string\",\n __name: parentFkName,\n __config: { index: true },\n });\n\n children.set(key, childModel);\n }\n }\n\n return { columns, children };\n}\n\n// ─── Model factory ────────────────────────\n\n/**\n * Creates a model definition. `indexes` and `primaryKey` are constrained to\n * the model's own column names.\n */\nexport function create<const TSchema extends SchemaDefinition>(\n config: CreateModelConfig<TSchema>\n): ModelDef<TSchema> {\n const { columns, children } = processSchema({\n modelName: config.name,\n schema: config.schema,\n });\n\n return {\n __type: \"model\",\n __name: config.name,\n __schema: config.schema,\n __indexes: config.indexes as IndexCallback | undefined,\n __columns: columns,\n __children: children,\n __map: config.map,\n __primaryKey: config.primaryKey as string[] | undefined,\n // Same widening as `indexes` above: the config's callback is bound to THIS\n // model's columns, and the stored form is the erased one every consumer\n // reads. The type parameters have done their work at the call site.\n __exclusions: config.exclusions as ModelDef[\"__exclusions\"],\n __checks: config.checks as readonly ModelCheckConfig[] | ChecksCallback | undefined,\n __extensions: config.extensions,\n __policy: config.policy as ModelPolicyConfig | undefined,\n __comment: config.comment,\n };\n}\n\n// ─── Model utilities ──────────────────────\n\n/** All column names of a model, in declaration order. */\nexport function getColumnNames(params: { model: ModelDef }): string[] {\n return Array.from(params.model.__columns.keys());\n}\n\n/** Runs a model's `indexes` callback, if it declared one. */\nexport function evaluateIndexes(params: { model: ModelDef }): IndexDef[] {\n const { model } = params;\n if (model.__indexes === undefined) {\n return [];\n }\n return model.__indexes(createIndexBuilder<string, SchemaDefinition>());\n}\n",
7
+ "/**\n * Prisma schema text generator.\n *\n * Renders the schema plan (`relation-plan.ts`) — including the 1:1 merge pass —\n * as `.prisma` models and enums. Only models and enums are emitted: datasource\n * and generator blocks stay in the project's own base schema.\n *\n * The plan is shared with `toIR()`, so the text produced here parses back to\n * the same IR the DSL compiles to directly.\n */\n\nimport { VibeError, assertGeneratedColumns, assertRowRuleReferentialActions, encodePrismaString, generatedColumnFromSql, internalError, normalizeJsonSchemaRef, normalizeValidatorRef, providerToDialect, rowRulePrismaAttribute, indexKeyPrisma, indexKeyTerms } from \"@vibeorm/schema\";\nimport type { EnumIR, FieldIR, ModelIR } from \"@vibeorm/schema\";\nimport { getSqlDialect } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport { compileRowRules } from \"../row-rules.ts\";\nimport { compileExclusions, compileIndexPredicate, compileModelChecks } from \"../predicate.ts\";\nimport type {\n DecimalColumnConfig,\n IdColumnConfig,\n ModelDef,\n PrismaGeneratorConfig,\n SchemaDef,\n StringColumnConfig,\n} from \"../types.ts\";\nimport type { ColumnDef } from \"../types.ts\";\nimport { buildField, buildIndex, datetimeNativeType, fieldDefault, idNativeType, stringNativeType } from \"../to-ir.ts\";\nimport { planSchema, resolveRelationType } from \"../relation-plan.ts\";\n\n/**\n * The model as a predicate compiler sees it: logical names, physical `@map`\n * names and scalar types, read from the SAME `buildField` the IR path uses so\n * a printed CHECK cannot disagree with a compiled one.\n */\nfunction predicateModel(params: { model: ModelDef }): { name: string; fields: FieldIR[] } {\n return {\n name: params.model.__name,\n fields: Array.from(params.model.__columns, ([name, column]) => buildField({ name, column })),\n };\n}\nimport type { PlannedIndex, PlannedRelation, SchemaPlan } from \"../relation-plan.ts\";\n\n/** Finalized model metadata for source admission, without lowering extension SQL. */\nfunction plannedAdmissionModel(params: { model: ModelDef; plan: SchemaPlan }): ModelIR {\n const { model, plan } = params;\n return {\n name: model.__name,\n ...(model.__map === undefined ? {} : { dbName: model.__map }),\n fields: [...model.__columns].map(([name, column]) => buildField({ name, column })),\n relations: (plan.relations.get(model.__name) ?? []).map((relation) => ({\n name: relation.name, model: relation.model, targetModel: relation.targetModel,\n type: resolveRelationType({ relation, plan }), isList: relation.isList, isOptional: relation.isOptional,\n ...(relation.fields === undefined ? {} : { fields: relation.fields }),\n ...(relation.references === undefined ? {} : { references: relation.references }),\n ...(relation.onDelete === undefined ? {} : { onDelete: relation.onDelete }),\n ...(relation.onUpdate === undefined ? {} : { onUpdate: relation.onUpdate }),\n })),\n ...(model.__primaryKey === undefined ? {} : { primaryKey: { fields: model.__primaryKey } }),\n ...(model.__policy === undefined ? {} : { policy: { field: model.__policy.field, context: model.__policy.context ?? model.__policy.field } }),\n indexes: [], isView: false,\n };\n}\n\n// ─── Column rendering ─────────────────────\n\n/** Prisma type for a column, including the `[]` list suffix. */\nfunction prismaType(params: { column: ColumnDef }): string {\n const { column } = params;\n const list = column.__config.array === true ? \"[]\" : \"\";\n\n switch (column.__columnType) {\n case \"string\":\n case \"localDate\":\n return `String${list}`;\n case \"int\":\n return `Int${list}`;\n case \"bigint\":\n return `BigInt${list}`;\n case \"float\":\n return `Float${list}`;\n case \"decimal\":\n return `Decimal${list}`;\n case \"boolean\":\n return `Boolean${list}`;\n case \"datetime\":\n return `DateTime${list}`;\n case \"json\":\n return `Json${list}`;\n case \"bytes\":\n return `Bytes${list}`;\n case \"id\":\n return (column.__config as IdColumnConfig).type === \"autoincrement\" ? \"Int\" : \"String\";\n case \"enum\":\n return column.__enumName === undefined ? `String${list}` : `${column.__enumName}${list}`;\n case \"unsupported\": {\n // Extension column types round-trip as `Vector(1536)`, not Unsupported.\n const extensionTypeName = column.__config[\"extensionType\"];\n if (typeof extensionTypeName === \"string\") {\n const rawArgs = column.__config[\"extensionArgs\"];\n const args = Array.isArray(rawArgs) ? rawArgs.map(String).join(\", \") : \"\";\n return `${extensionTypeName}${args.length > 0 ? `(${args})` : \"\"}${list}`;\n }\n return `Unsupported(${encodePrismaString({ value: String(column.__config.dbType) })})${list}`;\n }\n }\n}\n\n/** `@default(...)` for a non-id column, or undefined when it has none. */\nfunction defaultAttribute(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n const value = fieldDefault({ column });\n if (value === undefined) return undefined;\n if (value.kind === \"list\") {\n const values = value.values.map((entry) => column.__columnType === \"enum\" ? String(entry) :\n column.__columnType === \"bigint\" ? String(entry) : JSON.stringify(entry));\n return `@default([${values.join(\", \")}])`;\n }\n // Exact numeric digits carried as a string print as the NUMBER Prisma\n // expects on a numeric column (`@default(\"0\")` on Decimal is rejected).\n const numericColumn = column.__columnType === \"int\" || column.__columnType === \"bigint\" || column.__columnType === \"float\" || column.__columnType === \"decimal\";\n if (value.kind === \"literal\") return `@default(${typeof value.value === \"string\" && !(numericColumn && /^-?\\d+(\\.\\d+)?$/.test(value.value)) ? encodePrismaString({ value: value.value }) : String(value.value)})`;\n if (value.kind === \"enumValue\") return `@default(${value.value})`;\n if (value.kind === \"dbgenerated\") return `@default(dbgenerated(${encodePrismaString({ value: value.sql })}))`;\n return `@default(${value.kind}())`;\n}\n\n/** `@db.*` native type attribute, or undefined. */\nfunction nativeTypeAttribute(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n\n if (column.__columnType === \"localDate\") return \"@db.Date\";\n if (column.__columnType === \"string\" || column.__columnType === \"id\") {\n const native = column.__columnType === \"string\"\n ? stringNativeType({ config: column.__config as StringColumnConfig, column: column.__name })\n : idNativeType({ config: column.__config as IdColumnConfig, column: column.__name });\n return native === undefined ? undefined : `@db.${native}`;\n }\n\n if (column.__columnType === \"decimal\") {\n const { precision, scale } = column.__config as DecimalColumnConfig;\n if (typeof precision === \"number\") return `@db.Decimal(${precision}, ${scale ?? 0})`;\n return undefined;\n }\n\n if (column.__columnType === \"datetime\") {\n const native = datetimeNativeType({ config: column.__config, column: column.__name });\n return native === undefined ? undefined : `@db.${native}`;\n }\n\n return undefined;\n}\n\nfunction formatColumn(params: { name: string; column: ColumnDef }): string {\n const { name, column } = params;\n const parts: string[] = [` ${name} ${prismaType({ column })}${column.__config.optional === true ? \"?\" : \"\"}`];\n\n if (column.__columnType === \"id\") {\n parts.push(\"@id\");\n const idDefault = defaultAttribute({ column });\n if (idDefault !== undefined) parts.push(idDefault);\n } else {\n const columnDefault = defaultAttribute({ column });\n if (columnDefault !== undefined) parts.push(columnDefault);\n }\n\n if (\"generated\" in column.__config) {\n const generated = generatedColumnFromSql({ value: column.__config.generated });\n parts.push(`@generated(sql: ${encodePrismaString({ value: generated.expression })}, storage: \"stored\")`);\n }\n if (column.__columnType === \"datetime\" && column.__config.updatedAt === true) {\n parts.push(\"@updatedAt\");\n }\n if (column.__config.unique === true) {\n parts.push(\"@unique\");\n }\n if (typeof column.__config.map === \"string\") {\n parts.push(`@map(${encodePrismaString({ value: column.__config.map })})`);\n }\n\n const nativeType = nativeTypeAttribute({ column });\n if (nativeType !== undefined) parts.push(nativeType);\n if (typeof column.__config.collation === \"string\") {\n parts.push(`@collation(${encodePrismaString({ value: column.__config.collation })})`);\n }\n\n const columnLine = parts.join(\" \");\n const validatorMetadata = normalizeValidatorRef({ documentation: typeof column.__config.comment === \"string\" ? column.__config.comment : undefined, reference: column.__config.validator });\n const metadata = normalizeJsonSchemaRef({ documentation: validatorMetadata.documentation, reference: column.__config.jsonSchema });\n if (validatorMetadata.validator !== undefined && (column.__columnType === \"json\" || column.__columnType === \"unsupported\" || metadata.jsonSchema !== undefined)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Validators are only valid on queryable non-JSON scalar or enum columns; use .schema() for Json\", meta: { issues: [{ rule: \"validator-non-scalar\", field: name }] } });\n if (metadata.jsonSchema !== undefined && column.__columnType !== \"json\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"JSON schemas are only valid on Json fields\", meta: { issues: [{ rule: \"json-schema-non-json\", field: name }] } });\n const comments = [\n ...(metadata.documentation === undefined ? [] : metadata.documentation.split(\"\\n\")),\n ...(metadata.jsonSchema === undefined ? [] : [`@schema(${metadata.jsonSchema.name} from ${encodePrismaString({ value: metadata.jsonSchema.from })})`]),\n ...(validatorMetadata.validator === undefined ? [] : [`@validate(${validatorMetadata.validator.name} from ${encodePrismaString({ value: validatorMetadata.validator.from })})`]),\n ];\n return [...comments.map((line) => ` /// ${line}`), columnLine].join(\"\\n\");\n}\n\n// ─── Relation rendering ───────────────────\n\nfunction formatRelation(params: { relation: PlannedRelation }): string {\n const { relation } = params;\n const { name, targetModel, relationName } = relation;\n\n if (relation.kind === \"list\") {\n const attribute =\n relationName === undefined ? \"\" : ` @relation(${encodePrismaString({ value: relationName })})`;\n return ` ${name} ${targetModel}[]${attribute}`;\n }\n\n const optional = relation.isOptional ? \"?\" : \"\";\n\n if (relation.kind === \"backOne\") {\n const attribute =\n relationName === undefined ? \"\" : ` @relation(${encodePrismaString({ value: relationName })})`;\n return ` ${name} ${targetModel}${optional}${attribute}`;\n }\n\n const args: string[] = [];\n if (relationName !== undefined) args.push(encodePrismaString({ value: relationName }));\n if (relation.fields === undefined || relation.references === undefined) {\n throw internalError({\n message: `planned FK relation \"${relation.model}.${name}\" has no fields/references`,\n meta: { model: relation.model, relation: name },\n });\n }\n args.push(`fields: [${relation.fields.join(\", \")}]`);\n args.push(`references: [${relation.references.join(\", \")}]`);\n if (relation.onDelete !== undefined) args.push(`onDelete: ${relation.onDelete}`);\n if (relation.onUpdate !== undefined) args.push(`onUpdate: ${relation.onUpdate}`);\n // `map:` is the PHYSICAL constraint name; the positional argument above is\n // the relation alias. Prisma spells both on one attribute.\n if (relation.constraintName !== undefined) {\n args.push(`map: ${encodePrismaString({ value: relation.constraintName })}`);\n }\n\n return ` ${name} ${targetModel}${optional} @relation(${args.join(\", \")})`;\n}\n\n// ─── Index rendering ──────────────────────\n\nfunction formatIndex(params: {\n index: PlannedIndex;\n model: ModelDef;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): string {\n const { index } = params;\n if (index.ops !== undefined && Object.values(index.ops).some((operatorClass) => operatorClass !== undefined)) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Prisma output cannot preserve qualified index operator classes; keep the DSL source\", meta: { feature: \"prismaIndexOperatorClasses\", target: \"prisma\" } });\n const columns = index.keys === undefined ? index.columns.join(\", \") : indexKeyTerms({ index: buildIndex({ index, model: predicateModel({ model: params.model }), dialect: params.dialect, enums: params.enums }) }).map((term) => indexKeyPrisma({ term })).join(\", \");\n const predicate = compileIndexPredicate({\n where: index.where,\n wherePredicate: index.wherePredicate,\n columns: index.columns,\n model: predicateModel({ model: params.model }),\n dialect: params.dialect,\n enums: params.enums,\n });\n const whereArg = predicate === undefined ? \"\" : `, where: ${encodePrismaString({ value: predicate.where })}`;\n const mapArg = index.map === undefined ? \"\" : `, map: ${encodePrismaString({ value: index.map })}`;\n const nndArg = index.nullsNotDistinct === true ? \", nullsNotDistinct: true\" : \"\";\n const nameArg =\n index.clientName === undefined ? \"\" : `, name: ${encodePrismaString({ value: index.clientName })}`;\n if (index.isUnique) {\n return ` @@unique([${columns}]${nameArg}${mapArg}${nndArg}${whereArg})`;\n }\n const typeArg = index.indexType === undefined ? \"\" : `, type: ${index.indexType}`;\n return ` @@index([${columns}]${typeArg}${mapArg}${whereArg})`;\n}\n\n// ─── Extension attribute rendering ────────\n\n/** One named-argument value of an extension attribute, as .prisma text. */\nfunction formatExtensionValue(params: { value: unknown }): string {\n const { value } = params;\n if (typeof value === \"string\") return encodePrismaString({ value });\n if (Array.isArray(value)) {\n return `[${value.map((entry) => formatExtensionValue({ value: entry })).join(\", \")}]`;\n }\n return String(value);\n}\n\n// ─── Model rendering ──────────────────────\n\nfunction formatModel(params: {\n model: ModelDef;\n plan: SchemaPlan;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): string {\n const { model, plan } = params;\n const lines: string[] = [\n ...(model.__comment === undefined ? [] : model.__comment.split(\"\\n\").map((line) => `/// ${line}`)),\n `model ${model.__name} {`,\n ];\n\n lines.push(\" //> Columns\");\n for (const [name, column] of model.__columns) {\n lines.push(formatColumn({ name, column }));\n }\n\n lines.push(\"\");\n lines.push(\" //> Relations\");\n for (const relation of plan.relations.get(model.__name) ?? []) {\n lines.push(formatRelation({ relation }));\n }\n\n lines.push(\"\");\n lines.push(\" //> Indexes\");\n lines.push(\"\");\n for (const index of plan.indexes.get(model.__name) ?? []) {\n lines.push(formatIndex({ index, model: params.model, dialect: params.dialect, enums: params.enums }));\n }\n\n // A typed CHECK is compiled to SQL here, exactly as `toIR` compiles it, so\n // `parse(generate.prisma(s))` still reproduces `toIR(s)`. `.prisma` has no\n // syntax for a typed expression, so it lands as the raw `@@check` text it\n // renders to — the round trip preserves the CONSTRAINT, not the authoring form.\n for (const check of compileModelChecks({\n model: params.model,\n predicateModel: predicateModel({ model: params.model }),\n dialect: params.dialect,\n enums: params.enums,\n })) {\n lines.push(\n ` @@check(${encodePrismaString({ value: check.expression })}, name: ${encodePrismaString({ value: check.name })})`,\n );\n }\n\n const irModel = plannedAdmissionModel({ model, plan });\n const rowRules = compileRowRules({ model, irModel, dialect: params.dialect.name });\n assertRowRuleReferentialActions({ schema: {\n datasource: { provider: params.dialect.name === \"postgres\" ? \"postgresql\" : params.dialect.name },\n enums: params.enums, extensions: [], models: [{ ...irModel, rowRules }],\n }, dialect: params.dialect.name });\n for (const rule of rowRules) lines.push(` ${rowRulePrismaAttribute({ rule })}`);\n\n for (const use of model.__extensions ?? []) {\n const args: string[] = [];\n if (use.fields !== undefined) args.push(`[${use.fields.join(\", \")}]`);\n for (const [key, value] of Object.entries(use.args ?? {})) {\n args.push(`${key}: ${formatExtensionValue({ value })}`);\n }\n lines.push(` @@${use.attribute}(${args.join(\", \")})`);\n }\n\n if (model.__primaryKey !== undefined && model.__primaryKey.length > 0) {\n lines.push(` @@id([${model.__primaryKey.join(\", \")}])`);\n }\n if (model.__policy !== undefined) {\n // `context:` is omitted when it equals the field — the parser defaults it there.\n const { field, context } = model.__policy;\n const contextArg =\n context === undefined || context === field ? \"\" : `, context: ${encodePrismaString({ value: context })}`;\n lines.push(` @@policy([${field}]${contextArg})`);\n }\n if (typeof model.__map === \"string\") {\n lines.push(` @@map(${encodePrismaString({ value: model.__map })})`);\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\n// ─── Enum rendering ───────────────────────\n\nfunction formatEnum(params: { name: string; values: readonly string[] }): string {\n const { name, values } = params;\n return [`enum ${name} {`, ...values.map((value) => ` ${value}`), \"}\"].join(\"\\n\");\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Generates Prisma schema text (models + enums) for a composed schema.\n *\n * @example\n * const prisma = dsl.generate.prisma(dsl.schema({ User }, { relations }));\n */\nexport function generatePrisma(schema: SchemaDef, config: PrismaGeneratorConfig = {}): string {\n for (const model of schema.__models.values()) {\n const exclusions = compileExclusions({ exclusions: model.__exclusions, model: { name: model.__name, fields: Array.from(model.__columns, ([name, column]) => buildField({ name, column })) }, dialect: getSqlDialect({ dialect: providerToDialect({ provider: config.provider ?? \"postgresql\" }) }) });\n if (exclusions.length > 0) throw new VibeError({ code: \"VIBE_CONFIG\", message: \"Prisma output cannot preserve exclusion constraints; keep the DSL source\", meta: { feature: \"exclusionConstraints\", target: \"prisma\" } });\n }\n const stringEnums = [...schema.__enumStorage].filter(([, storage]) => storage === \"string\").map(([name]) => name);\n if (stringEnums.length > 0) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `Cannot print to Prisma: enum(s) ${stringEnums.join(\", \")} use storage: \"string\", which .prisma cannot express losslessly. Keep the DSL as the source or switch the enum to database storage.`,\n meta: { enums: stringEnums, target: \"prisma\" },\n });\n }\n if (schema.__rls !== undefined) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: \"Cannot print to Prisma: this schema uses native RLS, which .prisma cannot express losslessly. Keep the DSL as the source.\",\n meta: { feature: \"nativeRowLevelSecurity\", target: \"prisma\" },\n });\n }\n const plan = planSchema({ schema });\n // Admission reads finalized relation ownership without lowering unrelated extension SQL.\n if ([...schema.__models.values()].some((model) => [...model.__columns.values()].some((column) => \"generated\" in column.__config))) assertGeneratedColumns({ schema: {\n datasource: { provider: config.provider ?? \"postgresql\" },\n enums: [], extensions: [],\n models: [...schema.__models.values()].map((model) => plannedAdmissionModel({ model, plan })),\n } });\n const sections: string[] = [];\n // Typed expressions need a dialect to become SQL text. Defaulting to\n // postgresql matches `toIR`'s own default, so one schema printed and one\n // schema compiled agree unless the caller says otherwise.\n const dialect = getSqlDialect({ dialect: providerToDialect({ provider: config.provider ?? \"postgresql\" }) });\n const enums: EnumIR[] = Array.from(schema.__enums, ([name, values]) => ({ name, values: [...values] }));\n\n if (schema.__enums.size > 0) {\n sections.push(\"// ============================================\");\n sections.push(\"// Enums\");\n sections.push(\"// ============================================\");\n sections.push(\"\");\n for (const [name, values] of schema.__enums) {\n sections.push(formatEnum({ name, values }));\n sections.push(\"\");\n }\n }\n\n sections.push(\"// ============================================\");\n sections.push(\"// Models\");\n sections.push(\"// ============================================\");\n sections.push(\"\");\n for (const model of schema.__models.values()) {\n sections.push(formatModel({ model, plan, dialect, enums }));\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\").trim();\n}\n",
8
+ "import { VibeError, normalizeRowRules } from \"@vibeorm/schema\";\nimport type { Dialect, ModelIR, RowRuleIR, RowRuleSpec, SchemaIR } from \"@vibeorm/schema\";\nimport type { ModelDef } from \"./types.ts\";\n\n/** Model-bound authoring declarations; only frozen uses the short creation gate spelling. */\nexport type RowRuleDeclaration<TColumn extends string = string> =\n | { readonly kind: \"appendOnly\"; readonly name?: string }\n | { readonly kind: \"fixed\"; readonly name?: string; readonly columns: readonly TColumn[]; readonly when: { readonly fromCreation: true; readonly onceSet?: never } | { readonly onceSet: TColumn; readonly fromCreation?: never } }\n | { readonly kind: \"rowFixed\"; readonly name?: string; readonly except: readonly TColumn[] }\n | { readonly kind: \"frozen\"; readonly name?: string; readonly from: \"create\" | TColumn; readonly mutable: readonly TColumn[] };\n\n/** Immutable row-rule data builder, without client-side row-state inference. */\nexport type RowRuleBuilder<TColumn extends string = string> = {\n appendOnly(options?: { readonly name?: string }): RowRuleDeclaration<TColumn>;\n fixed(options: { readonly columns: readonly TColumn[]; readonly when: { readonly fromCreation: true; readonly onceSet?: never } | { readonly onceSet: TColumn; readonly fromCreation?: never }; readonly name?: string }): RowRuleDeclaration<TColumn>;\n rowFixed(options: { readonly except: readonly TColumn[]; readonly name?: string }): RowRuleDeclaration<TColumn>;\n frozen(options: { readonly from: \"create\" | TColumn; readonly mutable: readonly TColumn[]; readonly name?: string }): RowRuleDeclaration<TColumn>;\n};\n\nfunction assertOptions(params: { value: unknown; allowed: readonly string[] }): void {\n const { value } = params;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)\n || Reflect.ownKeys(value).some((key) => typeof key !== \"string\" || !params.allowed.includes(key))) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row-rule options accept only ${params.allowed.join(\", \")}` });\n }\n}\n\nfunction fieldArray(params: { value: unknown }): readonly string[] {\n if (!Array.isArray(params.value) || params.value.some((entry: unknown) => typeof entry !== \"string\")) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Row-rule fields must be an array of logical names\" });\n return Object.freeze([...params.value] as string[]);\n}\n\n/** Build model-bound row-rule declarations and copy every retained list and gate. */\nexport function createRowRuleBuilder<TColumn extends string = string>(): RowRuleBuilder<TColumn> {\n return Object.freeze({\n appendOnly(options: { readonly name?: string } = {}): RowRuleDeclaration<TColumn> {\n assertOptions({ value: options, allowed: [\"name\"] });\n return Object.freeze({ kind: \"appendOnly\", ...options });\n },\n fixed(options: { readonly columns: readonly TColumn[]; readonly when: { readonly fromCreation: true; readonly onceSet?: never } | { readonly onceSet: TColumn; readonly fromCreation?: never }; readonly name?: string }): RowRuleDeclaration<TColumn> {\n assertOptions({ value: options, allowed: [\"columns\", \"when\", \"name\"] });\n assertOptions({ value: options.when, allowed: [\"fromCreation\", \"onceSet\"] });\n return Object.freeze({ kind: \"fixed\", ...options, columns: fieldArray({ value: options.columns }) as readonly TColumn[], when: Object.freeze({ ...options.when }) });\n },\n rowFixed(options: { readonly except: readonly TColumn[]; readonly name?: string }): RowRuleDeclaration<TColumn> {\n assertOptions({ value: options, allowed: [\"except\", \"name\"] });\n return Object.freeze({ kind: \"rowFixed\", ...options, except: fieldArray({ value: options.except }) as readonly TColumn[] });\n },\n frozen(options: { readonly from: \"create\" | TColumn; readonly mutable: readonly TColumn[]; readonly name?: string }): RowRuleDeclaration<TColumn> {\n assertOptions({ value: options, allowed: [\"from\", \"mutable\", \"name\"] });\n return Object.freeze({ kind: \"frozen\", ...options, mutable: fieldArray({ value: options.mutable }) as readonly TColumn[] });\n },\n });\n}\n\n/** Evaluate the callback against finalized fields and lower short frozen gates without guessing. */\nexport function compileRowRules(params: { model: ModelDef; irModel: ModelIR; dialect: Dialect; schema?: SchemaIR }): readonly RowRuleIR[] {\n if (params.model.__rowRules === undefined) return [];\n if (typeof params.model.__rowRules !== \"function\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"rowRules must be a model-bound callback\" });\n const declarations: unknown = params.model.__rowRules(createRowRuleBuilder());\n if (!Array.isArray(declarations)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"rowRules must return an array of declarations\" });\n const rules: RowRuleSpec[] = declarations.map((declaration: unknown) => {\n if (declaration === null || typeof declaration !== \"object\" || Array.isArray(declaration)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Row-rule declarations must be data objects\" });\n const candidate = declaration as Record<string, unknown>;\n if (candidate.kind !== \"frozen\") return declaration as RowRuleSpec;\n if (typeof candidate.from !== \"string\" || candidate.from.length === 0) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Frozen from must be create or a logical field name\" });\n return { ...candidate, kind: \"frozen\", from: candidate.from === \"create\" ? { create: true } : { field: candidate.from }, mutable: candidate.mutable as readonly string[] } as RowRuleSpec;\n });\n return normalizeRowRules({ model: params.irModel, rules, dialect: params.dialect, schema: params.schema });\n}\n",
9
+ "/**\n * The typed predicate builder — the `c` handed to a model's `checks` callback\n * and to an index's `.where()`.\n *\n * Every combinator returns plain {@link PredicateIR}: serializable data, never\n * a JavaScript callback. Nothing downstream evaluates a function, and a\n * predicate survives JSON unchanged. The SQL text is produced exactly once, by\n * `renderPredicate` in @vibeorm/sql, when the schema is compiled and the\n * dialect is finally known.\n *\n * The builder is structural at RUNTIME — it only records names and values — so\n * one instance serves every model. The type parameters on\n * {@link PredicateBuilder} are what bind it to a particular model's columns.\n */\n\nimport { IDENTIFIER_LIMITS, VibeError, checkRulePredicate, identifierLength, isEnumType } from \"@vibeorm/schema\";\nimport type { CheckRule, CheckRuleGroupKind, ExclusionIR, CheckIR, EnumIR, FieldIR, PredicateExpression, PredicateIR, PredicateOperand, PredicateValue } from \"@vibeorm/schema\";\nimport { compileExclusion, renderPredicate } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport type {\n ModelDef,\n CheckRuleOptions,\n ChecksBuilder,\n ChecksCallback,\n ColumnCheckRule,\n ModelCheckConfig,\n NamedCheckDef,\n OrderCheckOptions,\n PredicateBuilder,\n PredicateFieldExpr,\n PresenceCheckConfig,\n PresenceState,\n SchemaDefinition,\n} from \"./types.ts\";\n\n// ─── Operand normalization ────────────────────────────────────────\n\n/** Is this operand another field reference rather than a literal? */\nfunction isFieldExpr(operand: unknown): operand is PredicateFieldExpr {\n return (\n typeof operand === \"object\" &&\n operand !== null &&\n \"kind\" in operand &&\n (operand as { kind: unknown }).kind === \"field\"\n );\n}\n\n/**\n * Strip the pairing tag: the IR carries `{ kind: \"field\", name }` and nothing\n * else, so `__kind` never reaches a serialized schema.\n */\nfunction toRef(params: { expr: PredicateFieldExpr }): { readonly kind: \"field\"; readonly name: string } {\n return { kind: \"field\", name: params.expr.name };\n}\n\n/**\n * A literal in JSON-safe carrier form.\n *\n * A `bigint` becomes its EXACT decimal text: `Number(9007199254740993n)` is a\n * different number, the same trap column defaults already guard against, and\n * the rounding would happen before any SQL existed.\n */\nfunction toValue(params: { input: unknown; at: string }): PredicateValue {\n const { input, at } = params;\n if (typeof input === \"bigint\") return { kind: \"value\", value: input.toString() };\n if (typeof input === \"string\" || typeof input === \"number\" || typeof input === \"boolean\") {\n return { kind: \"value\", value: input };\n }\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: ${input === null ? \"null\" : typeof input} is not a comparable literal — use isNull()/isNotNull() for null, and a string, number, bigint or boolean otherwise`,\n meta: { rule: \"predicate-literal-invalid\", at },\n });\n}\n\nfunction toOperand(params: { operand: unknown; at: string }): PredicateOperand {\n const { operand, at } = params;\n return typeof operand === \"object\" && operand !== null\n ? toExpression({ value: operand, at }) : toValue({ input: operand, at });\n}\n\nfunction toExpression(params: { value: unknown; at: string }): PredicateExpression {\n const { value, at } = params;\n if (isFieldExpr(value)) return toRef({ expr: value });\n if (typeof value === \"object\" && value !== null && \"kind\" in value) {\n if (value.kind === \"jsonText\" && \"field\" in value && \"path\" in value && Array.isArray(value.path) &&\n Array.from(value.path).every((segment: unknown) => typeof segment === \"string\" && !segment.includes(\"\\u0000\"))) {\n return { kind: \"jsonText\", field: toRef({ expr: requireFieldExpr({ value: value.field, at }) }), path: [...value.path] };\n }\n if ((value.kind === \"length\" || value.kind === \"lower\" || value.kind === \"upper\") && \"expression\" in value) {\n return { kind: value.kind, expression: toExpression({ value: value.expression, at }) };\n }\n if ((value.kind === \"add\" || value.kind === \"sub\" || value.kind === \"mul\") && \"left\" in value && \"right\" in value) {\n const right = value.right;\n return {\n kind: value.kind,\n left: toExpression({ value: value.left, at }),\n right: typeof right === \"object\" && right !== null && \"kind\" in right && right.kind === \"value\" && \"value\" in right\n ? toValue({ input: right.value, at })\n : toOperand({ operand: right, at }),\n };\n }\n }\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `${at}: expected a field, jsonText, length, add, sub, mul, lower or upper expression; JSON paths must contain only strings`, meta: { rule: \"predicate-operand-invalid\", at } });\n}\n\n/** Internal shared scalar lowering for index keys; preserves B's exact literal carriers. */\nexport function toPredicateExpression(params: { readonly value: unknown; readonly at: string }): PredicateExpression {\n return toExpression(params);\n}\n\nfunction requireFieldExpr(params: { value: unknown; at: string }): PredicateFieldExpr {\n const { value, at } = params;\n if (isFieldExpr(value)) return value;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: the left side of a comparison must be c.field(\"…\"), not a bare value`,\n meta: { rule: \"predicate-operand-invalid\", at },\n });\n}\n\nfunction requireOperands(params: { operands: readonly PredicateIR[]; at: string }): readonly PredicateIR[] {\n const { operands, at } = params;\n if (operands.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: an empty boolean group has no honest SQL spelling — pass at least one operand`,\n meta: { rule: \"predicate-empty\", at },\n });\n }\n return operands;\n}\n\n// ─── The builder ──────────────────────────────────────────────────\n\n/**\n * One predicate builder instance. Stateless and structural — the type\n * parameters, not the value, bind it to a model.\n */\nexport function createPredicateBuilder<\n TColumns extends string = string,\n TSchema extends SchemaDefinition = SchemaDefinition,\n>(): PredicateBuilder<TColumns, TSchema> {\n const compare = (op: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\") =>\n (left: unknown, right: unknown): PredicateIR => ({\n kind: \"compare\",\n op,\n left: toExpression({ value: left, at: `c.${op}()` }),\n right: toOperand({ operand: right, at: `c.${op}()` }),\n });\n\n const membership = (negate: boolean) =>\n (field: unknown, values: readonly unknown[]): PredicateIR => {\n const at = negate ? \"c.notInList()\" : \"c.inList()\";\n const ref = toRef({ expr: requireFieldExpr({ value: field, at }) });\n if (values.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: an empty IN list is UNKNOWN on every row and is never what an author means`,\n meta: { rule: \"predicate-empty\", at, field: ref.name },\n });\n }\n return {\n kind: \"inList\",\n field: ref,\n values: values.map((value) => toValue({ input: value, at })),\n ...(negate ? { negate: true as const } : {}),\n };\n };\n\n // The cast is the ONE place the structural runtime builder meets its\n // model-bound type: every method below matches its declared signature, but\n // the generic tag parameters exist only at the type level.\n return {\n field: (name) => ({ kind: \"field\", name, __kind: \"String\" }) as never,\n\n eq: compare(\"eq\"),\n ne: compare(\"ne\"),\n gt: compare(\"gt\"),\n gte: compare(\"gte\"),\n lt: compare(\"lt\"),\n lte: compare(\"lte\"),\n\n add: ({ left, right }) => ({ ...toExpression({ value: { kind: \"add\", left, right }, at: \"c.add()\" }), __kind: \"Int\" }) as never,\n sub: ({ left, right }) => ({ ...toExpression({ value: { kind: \"sub\", left, right }, at: \"c.sub()\" }), __kind: \"Int\" }) as never,\n mul: ({ left, right }) => ({ ...toExpression({ value: { kind: \"mul\", left, right }, at: \"c.mul()\" }), __kind: \"Int\" }) as never,\n lower: (expression) => ({ kind: \"lower\", expression: toExpression({ value: expression, at: \"c.lower()\" }), __kind: \"String\" }) as never,\n upper: (expression) => ({ kind: \"upper\", expression: toExpression({ value: expression, at: \"c.upper()\" }), __kind: \"String\" }) as never,\n\n jsonText: ({ field, path }) => ({ ...toExpression({ value: { kind: \"jsonText\", field: { kind: \"field\", name: field }, path }, at: \"c.jsonText()\" }), __kind: \"String\" }) as never,\n length: (expression) => ({ kind: \"length\", expression: toExpression({ value: expression, at: \"c.length()\" }), __kind: \"Int\" }) as never,\n isTrue: (operand) => ({ kind: \"isTrue\", operand }),\n\n inList: membership(false),\n notInList: membership(true),\n\n isNull: (name) => ({ kind: \"isNull\", field: { kind: \"field\", name } }),\n isNotNull: (name) => ({ kind: \"isNull\", field: { kind: \"field\", name }, negate: true }),\n\n and: (...operands) => ({ kind: \"and\", operands: requireOperands({ operands, at: \"c.and()\" }) }),\n or: (...operands) => ({ kind: \"or\", operands: requireOperands({ operands, at: \"c.or()\" }) }),\n not: (operand) => ({ kind: \"not\", operand }),\n\n named: (name, predicate) => {\n if (name.trim() === \"\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: \"c.named(): a CHECK needs a non-empty name — the name is what keys the migration diff\",\n meta: { rule: \"predicate-unnamed-check\" },\n });\n }\n return { __type: \"check\", name, predicate };\n },\n } as PredicateBuilder<TColumns, TSchema>;\n}\n\n// ─── Check rules ─────────────────────────────────────────────────────────────────\n\n/** What the check rules need to know about the model they belong to. */\nexport type CheckModelContext = {\n /** Logical model name, for messages. */\n readonly model: string;\n /** PHYSICAL table name: generated CHECK names start with it. */\n readonly table: string;\n /** The model's built fields: logical name, `@map`ped name, scalar type, optional, list. */\n readonly fields: readonly FieldIR[];\n /** Schema enums, for a presence table's members. */\n readonly enums: readonly EnumIR[];\n};\n\nconst MAX_LIST_PREVIEW = 6;\n\nfunction preview(params: { values: readonly string[] }): string {\n const { values } = params;\n return values.length <= MAX_LIST_PREVIEW ? values.join(\", \") : `${values.slice(0, MAX_LIST_PREVIEW).join(\", \")}, …`;\n}\n\nfunction ruleError(params: { site: string; rule: string; message: string; meta?: Record<string, unknown> }): VibeError {\n return new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${params.site}: ${params.message}`,\n meta: { rule: params.rule, site: params.site, ...(params.meta ?? {}) },\n });\n}\n\n/** The physical column name a generated CHECK name is built from. */\nfunction physicalColumn(params: { field: FieldIR }): string {\n return params.field.dbName ?? params.field.name;\n}\n\nfunction mintedName(params: { context: CheckModelContext; field: FieldIR; rule: string }): string {\n return `${params.context.table}_${physicalColumn({ field: params.field })}_${params.rule}_check`;\n}\n\nfunction assertRuleWord(params: { site: string; options: CheckRuleOptions | undefined }): void {\n const { site, options } = params;\n if (options?.name !== undefined && (typeof options.name !== \"string\" || options.name.trim() === \"\")) {\n throw ruleError({ site, rule: \"predicate-unnamed-check\", message: \"{ name } must be a non-empty CHECK name\" });\n }\n if (options?.rule !== undefined && (typeof options.rule !== \"string\" || options.rule.trim() === \"\")) {\n throw ruleError({ site, rule: \"check-rule-invalid\", message: \"{ rule } must be a non-empty rule word\" });\n }\n}\n\n/** A field a rule names: declared, and scalar. */\nfunction ruleField(params: { context: CheckModelContext; name: unknown; site: string }): FieldIR {\n const { context, name, site } = params;\n const found = typeof name === \"string\" ? context.fields.find((field) => field.name === name) : undefined;\n if (found === undefined) {\n throw ruleError({ site, rule: \"check-rule-unknown-field\", message: `names ${JSON.stringify(name)}, which model \"${context.model}\" does not declare`, meta: { model: context.model, field: name } });\n }\n if (found.isList) {\n throw ruleError({ site, rule: \"check-rule-list-field\", message: `\"${found.name}\" is a list column — a check rule compares scalar values`, meta: { model: context.model, field: found.name } });\n }\n return found;\n}\n\nfunction ruleCheck(params: { name: string; predicate: PredicateIR; origin: string; minted: boolean }): NamedCheckDef {\n return { __type: \"check\", name: params.name, predicate: params.predicate, __origin: params.origin, __minted: params.minted };\n}\n\n/**\n * The `c` a model's `checks` callback receives: the predicate builder plus the\n * named check rules, each validated against `context` and returned as a named\n * CHECK.\n */\nexport function createChecksBuilder<\n TColumns extends string = string,\n TSchema extends SchemaDefinition = SchemaDefinition,\n>(params: { context: CheckModelContext }): ChecksBuilder<TColumns, TSchema> {\n const { context } = params;\n\n const group = (kind: CheckRuleGroupKind) => (...args: unknown[]): NamedCheckDef => {\n const arrayForm = Array.isArray(args[0]);\n const names: readonly unknown[] = arrayForm ? [...(args[0] as readonly unknown[])] : args;\n const options = arrayForm ? (args[1] as CheckRuleOptions | undefined) : undefined;\n const site = `c.${kind}(${names.map((name) => JSON.stringify(name)).join(\", \")}) on \"${context.model}\"`;\n assertRuleWord({ site, options });\n const fields = names.map((name) => ruleField({ context, name, site }));\n if (fields.length < 2 || fields.length > 8) {\n throw ruleError({ site, rule: \"check-rule-group-arity\", message: `takes 2 to 8 columns, not ${fields.length}` });\n }\n if (new Set(fields.map((field) => field.name)).size !== fields.length) {\n throw ruleError({ site, rule: \"check-rule-duplicate-field\", message: \"names a column twice — the expansion would contradict itself\" });\n }\n const predicate = checkRulePredicate({ rule: { kind, fields: fields.map((field) => field.name) } });\n const name = options?.name ?? mintedName({ context, field: fields[0]!, rule: options?.rule ?? kind });\n return ruleCheck({ name, predicate, origin: site, minted: options?.name === undefined });\n };\n\n const order = (earlier: string, later: string, options?: OrderCheckOptions): NamedCheckDef => {\n const site = `c.order(${JSON.stringify(earlier)}, ${JSON.stringify(later)}) on \"${context.model}\"`;\n assertRuleWord({ site, options });\n const first = ruleField({ context, name: earlier, site });\n const second = ruleField({ context, name: later, site });\n if (first.name === second.name) {\n throw ruleError({ site, rule: \"check-rule-duplicate-field\", message: \"orders a column against itself\" });\n }\n const nameColumn = options?.nameColumn ?? later;\n if (nameColumn !== earlier && nameColumn !== later) {\n throw ruleError({ site, rule: \"check-rule-invalid\", message: `nameColumn ${JSON.stringify(nameColumn)} must be one of the two ordered columns` });\n }\n const strict = options?.strict !== false;\n // The named column is read first, so a hand-written `\"endAt\" > \"startAt\"`\n // and `\"cancelledAt\" < \"startAt\"` keep their exact text.\n const rule: CheckRule = nameColumn === later\n ? { kind: \"order\", left: second.name, op: strict ? \"gt\" : \"gte\", right: first.name }\n : { kind: \"order\", left: first.name, op: strict ? \"lt\" : \"lte\", right: second.name };\n const name = options?.name ?? mintedName({ context, field: nameColumn === later ? second : first, rule: options?.rule ?? \"order\" });\n return ruleCheck({ name, predicate: checkRulePredicate({ rule }), origin: site, minted: options?.name === undefined });\n };\n\n const presence = (config: PresenceCheckConfig): NamedCheckDef[] => {\n const site = `c.presence({ by: ${JSON.stringify(config?.by)} }) on \"${context.model}\"`;\n if (config === null || typeof config !== \"object\") throw ruleError({ site, rule: \"presence-invalid\", message: \"takes { by, states }\" });\n assertRuleWord({ site, options: { ...(config.rule === undefined ? {} : { rule: config.rule }) } });\n const by = ruleField({ context, name: config.by, site });\n const byType = by.type;\n if (!isEnumType(byType) || by.isOptional) {\n throw ruleError({ site, rule: \"presence-by-invalid\", message: `\"${by.name}\" must be a REQUIRED enum column — a NULL state makes every IN unknown, and a CHECK passes on unknown`, meta: { model: context.model, field: by.name } });\n }\n const members = context.enums.find((entry) => entry.name === byType.enum)?.values;\n if (members === undefined) {\n throw ruleError({ site, rule: \"presence-by-invalid\", message: `enum \"${byType.enum}\" of \"${by.name}\" is not declared in the schema` });\n }\n const states: Readonly<Record<string, PresenceState | undefined>> | undefined = config.states;\n if (states === null || typeof states !== \"object\") throw ruleError({ site, rule: \"presence-invalid\", message: \"states must map every enum member to { set, unset }\" });\n const missing = members.filter((member) => !Object.hasOwn(states, member));\n const extra = Object.keys(states).filter((key) => !members.includes(key));\n if (missing.length > 0 || extra.length > 0) {\n throw ruleError({\n site,\n rule: \"presence-states-mismatch\",\n message: `states must list every member of enum \"${byType.enum}\" exactly once${missing.length === 0 ? \"\" : `; missing: ${preview({ values: missing })}`}${extra.length === 0 ? \"\" : `; not members: ${preview({ values: extra })}`}`,\n meta: { missing, extra },\n });\n }\n\n const setIn = new Map<string, string[]>();\n const unsetIn = new Map<string, string[]>();\n for (const member of members) {\n const state = states[member];\n if (state === null || typeof state !== \"object\") throw ruleError({ site, rule: \"presence-invalid\", message: `state \"${member}\" must be { set?, unset? }` });\n const lists = { set: state.set ?? [], unset: state.unset ?? [] };\n for (const [kind, list] of Object.entries(lists)) {\n if (!Array.isArray(list)) throw ruleError({ site, rule: \"presence-invalid\", message: `state \"${member}\".${kind} must be a list of columns` });\n if (new Set(list).size !== list.length) throw ruleError({ site, rule: \"check-rule-duplicate-field\", message: `state \"${member}\".${kind} names a column twice` });\n for (const name of list) {\n const field = ruleField({ context, name, site });\n if (field.name === by.name) throw ruleError({ site, rule: \"presence-invalid\", message: `state \"${member}\" lists the state column \"${by.name}\" itself` });\n if (!field.isOptional) {\n throw ruleError({ site, rule: \"presence-required-column\", message: `\"${field.name}\" is required, so it is set in every state — a presence table lists optional columns only`, meta: { model: context.model, field: field.name } });\n }\n const target = kind === \"set\" ? setIn : unsetIn;\n target.set(field.name, [...(target.get(field.name) ?? []), member]);\n }\n }\n const both = lists.set.filter((name) => lists.unset.includes(name));\n if (both.length > 0) throw ruleError({ site, rule: \"presence-conflict\", message: `state \"${member}\" lists ${preview({ values: both })} as both set and unset` });\n }\n\n const columns = context.fields.filter((field) => setIn.has(field.name) || unsetIn.has(field.name));\n if (columns.length === 0) throw ruleError({ site, rule: \"presence-empty\", message: \"names no column — it would hold nothing\" });\n const names: Readonly<Record<string, string | undefined>> = config.names ?? {};\n for (const [column, name] of Object.entries(names)) {\n if (!columns.some((field) => field.name === column)) throw ruleError({ site, rule: \"presence-invalid\", message: `names.${column} is not a column this presence table constrains` });\n assertRuleWord({ site, options: { ...(name === undefined ? {} : { name }) } });\n }\n return columns.map((field) => {\n const set = setIn.get(field.name) ?? [];\n const unset = unsetIn.get(field.name) ?? [];\n if (set.length === members.length) {\n throw ruleError({ site, rule: \"presence-constant-column\", message: `\"${field.name}\" is set in every state — declare it required instead`, meta: { model: context.model, field: field.name } });\n }\n if (unset.length === members.length) {\n throw ruleError({ site, rule: \"presence-constant-column\", message: `\"${field.name}\" is empty in every state — it can never hold a value`, meta: { model: context.model, field: field.name } });\n }\n const explicit = names[field.name];\n return ruleCheck({\n name: explicit ?? mintedName({ context, field, rule: config.rule ?? physicalColumn({ field: by }) }),\n predicate: checkRulePredicate({ rule: { kind: \"presence\", by: by.name, field: field.name, set, unset } }),\n origin: `presence table on \"${context.model}.${by.name}\" for column \"${field.name}\"`,\n minted: explicit === undefined,\n });\n });\n };\n\n // The cast meets the overloaded, model-bound method types with one\n // structural implementation each, exactly as `createPredicateBuilder` does.\n return {\n ...createPredicateBuilder<TColumns, TSchema>(),\n order,\n allOrNone: group(\"allOrNone\"),\n exactlyOne: group(\"exactlyOne\"),\n atMostOne: group(\"atMostOne\"),\n anySet: group(\"anySet\"),\n presence,\n } as unknown as ChecksBuilder<TColumns, TSchema>;\n}\n\n// ─── Column rules ────────────────────────────────────────────────────────────────\n\nconst EXACT_NUMBER: RegExp = /^(-?)(\\d+)(?:\\.(\\d+))?$/;\n\n/**\n * Order two numeric bounds exactly: JS numbers directly, decimal text digit by\n * digit (a Decimal bound is text so no digit is rounded away). `undefined`\n * when either is not a plain number; the renderer refuses those itself.\n */\nfunction compareBounds(params: { left: string | number; right: string | number }): number | undefined {\n const { left, right } = params;\n if (typeof left === \"number\" && typeof right === \"number\") return Number.isNaN(left - right) ? undefined : Math.sign(left - right);\n const parse = (value: string | number): { negative: boolean; whole: string; fraction: string } | undefined => {\n const match = EXACT_NUMBER.exec(String(value));\n if (match === null) return undefined;\n const whole = match[2]!.replace(/^0+(?=\\d)/, \"\");\n const fraction = (match[3] ?? \"\").replace(/0+$/, \"\");\n return { negative: match[1] === \"-\" && !(whole === \"0\" && fraction === \"\"), whole, fraction };\n };\n const a = parse(left);\n const b = parse(right);\n if (a === undefined || b === undefined) return undefined;\n if (a.negative !== b.negative) return a.negative ? -1 : 1;\n let magnitude = a.whole.length - b.whole.length;\n if (magnitude === 0 && a.whole !== b.whole) magnitude = a.whole < b.whole ? -1 : 1;\n if (magnitude === 0) {\n const width = Math.max(a.fraction.length, b.fraction.length);\n const x = a.fraction.padEnd(width, \"0\");\n const y = b.fraction.padEnd(width, \"0\");\n magnitude = x === y ? 0 : x < y ? -1 : 1;\n }\n return a.negative ? -Math.sign(magnitude) : Math.sign(magnitude);\n}\n\n/** The model's one-column rules (`.nonNegative()`, …) as named CHECKs, in column order then rule order. */\nfunction columnRuleChecks(params: { model: ModelDef; context: CheckModelContext }): readonly NamedCheckDef[] {\n const { model, context } = params;\n const checks: NamedCheckDef[] = [];\n for (const [name, column] of model.__columns) {\n const rules: readonly ColumnCheckRule[] = column.__config.checks ?? [];\n if (rules.length === 0) continue;\n for (const entry of rules) {\n const site = `rule \"${entry.rule}\" on \"${context.model}.${name}\"`;\n assertRuleWord({ site, options: { rule: entry.rule, ...(entry.name === undefined ? {} : { name: entry.name }) } });\n const field = ruleField({ context, name, site });\n const shape = entry.check;\n let rule: CheckRule;\n switch (shape.kind) {\n case \"compare\":\n rule = { kind: \"compare\", field: field.name, op: shape.op, value: shape.value };\n break;\n case \"range\":\n if ((compareBounds({ left: shape.min, right: shape.max }) ?? 0) > 0) {\n throw ruleError({ site, rule: \"check-rule-range-bounds\", message: `min ${String(shape.min)} is above max ${String(shape.max)} — no value could pass`, meta: { min: shape.min, max: shape.max } });\n }\n rule = { kind: \"range\", field: field.name, min: shape.min, max: shape.max };\n break;\n case \"oneOf\":\n if (shape.values.length === 0) throw ruleError({ site, rule: \"check-rule-empty\", message: \"oneOf() has no values — an empty IN list is never what an author means\" });\n rule = { kind: \"oneOf\", field: field.name, values: shape.values };\n break;\n case \"lengthAtMost\":\n if (!Number.isSafeInteger(shape.max) || shape.max < 0) {\n throw ruleError({ site, rule: \"check-rule-length-bound\", message: `lengthAtMost(${String(shape.max)}) needs a non-negative whole number` });\n }\n rule = { kind: \"lengthAtMost\", field: field.name, max: shape.max };\n break;\n }\n checks.push(ruleCheck({\n name: entry.name ?? mintedName({ context, field, rule: entry.rule }),\n predicate: checkRulePredicate({ rule }),\n origin: site,\n minted: entry.name === undefined,\n }));\n }\n }\n return checks;\n}\n\n// ─── Evaluating a model's declarations ────────────────────────────\n\n/** A model's CHECKs, still un-rendered: raw text stays raw, typed stays typed. */\nexport type EvaluatedCheck =\n | { readonly kind: \"raw\"; readonly name: string; readonly expression: string }\n | {\n readonly kind: \"typed\";\n readonly name: string;\n readonly predicate: PredicateIR;\n /** The check rule that produced it, when one did. */\n readonly origin?: string;\n /** True when the name was generated by the rule. */\n readonly minted?: boolean;\n };\n\nfunction isRuleCheck(entry: unknown): entry is NamedCheckDef {\n return entry !== null && typeof entry === \"object\" && \"__type\" in entry && entry.__type === \"check\";\n}\n\nfunction typedCheck(params: { entry: NamedCheckDef }): EvaluatedCheck {\n const { entry } = params;\n return {\n kind: \"typed\",\n name: entry.name,\n predicate: entry.predicate,\n ...(entry.__origin === undefined ? {} : { origin: entry.__origin }),\n ...(entry.__minted === true ? { minted: true } : {}),\n };\n}\n\n/**\n * Run a model's `checks` declaration, whichever form it took.\n *\n * The raw array form and the typed callback form produce the same shape of\n * answer, so every consumer downstream handles ONE list — and raw text is\n * carried through untouched rather than parsed into a predicate.\n *\n * The check rules (`c.order`, `c.allOrNone`, `c.presence`, …) need the model's\n * fields: pass `context`. Without it they refuse with `check-rule-context`.\n */\nexport function evaluateChecks(params: {\n checks: readonly ModelCheckConfig[] | ChecksCallback | undefined;\n model: string;\n context?: CheckModelContext;\n}): readonly EvaluatedCheck[] {\n const { checks, model } = params;\n if (checks === undefined) return [];\n\n if (typeof checks !== \"function\") {\n return checks.map((check) => ({ kind: \"raw\" as const, name: check.name, expression: check.expression }));\n }\n\n const builder: ChecksBuilder = params.context === undefined\n ? contextlessChecksBuilder({ model })\n : createChecksBuilder({ context: params.context });\n const declared: readonly unknown[] = checks(builder);\n return declared.map((entry, index): EvaluatedCheck => {\n if (entry !== null && typeof entry === \"object\" && !(\"__type\" in entry) && \"name\" in entry && typeof entry.name === \"string\" && \"expression\" in entry && typeof entry.expression === \"string\") {\n return { kind: \"raw\", name: entry.name, expression: entry.expression };\n }\n if (Array.isArray(entry)) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": checks[${index}] is a list — spread c.presence(...) into the checks: [...c.presence({ … })]`,\n meta: { rule: \"predicate-unnamed-check\", model, index },\n });\n }\n if (!isRuleCheck(entry)) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": checks[${index}] must be c.named(\"name\", predicate), a check rule (c.order, c.allOrNone, …) or a raw { name, expression } CHECK`,\n meta: { rule: \"predicate-unnamed-check\", model, index },\n });\n }\n return typedCheck({ entry });\n });\n}\n\n/** A checks builder whose rules refuse: no model context was passed to `evaluateChecks`. */\nfunction contextlessChecksBuilder(params: { model: string }): ChecksBuilder {\n const refuse = (name: string) => (): never => {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${params.model}\": c.${name}() needs the model's fields — compile the schema with toIR (or compileModelChecks)`,\n meta: { rule: \"check-rule-context\", model: params.model },\n });\n };\n return {\n ...createPredicateBuilder(),\n order: refuse(\"order\"),\n allOrNone: refuse(\"allOrNone\"),\n exactlyOne: refuse(\"exactlyOne\"),\n atMostOne: refuse(\"atMostOne\"),\n anySet: refuse(\"anySet\"),\n presence: refuse(\"presence\"),\n } as unknown as ChecksBuilder;\n}\n\n// ─── Compiling to IR ──────────────────────────────────────────────\n\n/** What a predicate needs to know about the model it belongs to. */\nexport type PredicateModel = {\n readonly name: string;\n readonly fields: readonly FieldIR[];\n};\n\n/**\n * A model's CHECKs as IR, with every typed expression compiled to SQL ONCE.\n *\n * `CheckIR.expression` always carries the AUTHORED text — what the schema says,\n * not what a database deparsed back — because that is the currency EPIC 1's\n * differ, desired-state records and DDL renderers all read. The predicate rides\n * alongside as the structured source, so editing a typed expression changes the\n * text and produces a real migration, while re-rendering an unchanged one\n * produces byte-identical text and cannot churn.\n */\n/** Compile exclusions beside CHECKs and index predicates at the schema boundary. */\nexport function compileExclusions(params: { exclusions: ModelDef[\"__exclusions\"]; model: PredicateModel; dialect: SqlDialect }): readonly ExclusionIR[] {\n const specs = typeof params.exclusions === \"function\" ? params.exclusions(createPredicateBuilder()) : params.exclusions ?? [];\n return specs.map((exclusion) => compileExclusion({ exclusion, model: params.model, dialect: params.dialect }));\n}\n\n/**\n * A `checks` declaration as IR, for a caller that holds the built fields but\n * not the model definition. Check rules generate their names from `table`;\n * pass it when the model is `@@map`ped, because `PredicateModel` does not\n * carry the table name. Without it the model name is the table name, as for\n * an unmapped model. A generated name that collides or is too long for the\n * dialect is refused, exactly as `compileModelChecks` refuses it.\n */\nexport function compileChecks(params: {\n checks: readonly ModelCheckConfig[] | ChecksCallback | undefined;\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n /** PHYSICAL table name generated CHECK names start with; defaults to `model.name`. */\n table?: string;\n}): readonly CheckIR[] {\n const { checks, model, dialect, enums } = params;\n const context: CheckModelContext = { model: model.name, table: params.table ?? model.name, fields: model.fields, enums };\n const evaluated = evaluateChecks({ checks, model: model.name, context });\n assertRuleNames({ checks: evaluated, model: model.name, dialect });\n return renderChecks({ checks: evaluated, model, dialect, enums });\n}\n\nfunction renderChecks(params: { checks: readonly EvaluatedCheck[]; model: PredicateModel; dialect: SqlDialect; enums: readonly EnumIR[] }): readonly CheckIR[] {\n const { model, dialect, enums } = params;\n return params.checks.map((check) =>\n check.kind === \"raw\"\n ? { name: check.name, expression: check.expression }\n : {\n name: check.name,\n expression: renderPredicate({\n predicate: check.predicate,\n model,\n dialect,\n enums,\n usage: \"check\",\n site: check.origin === undefined ? `CHECK \"${check.name}\"` : `CHECK \"${check.name}\" (${check.origin})`,\n }),\n predicate: check.predicate,\n },\n );\n}\n\n/**\n * Refuse a generated CHECK name that collides with another CHECK of the model,\n * or that the dialect would truncate, naming the rule that produced it and the\n * `{ name }` override. Two hand-written names keep the schema validator's\n * `duplicate-check` report.\n */\nfunction assertRuleNames(params: { checks: readonly EvaluatedCheck[]; model: string; dialect: SqlDialect }): void {\n const { checks, model, dialect } = params;\n const seen = new Map<string, EvaluatedCheck>();\n const limit = IDENTIFIER_LIMITS[dialect.name];\n for (const check of checks) {\n const origin = check.kind === \"typed\" ? check.origin : undefined;\n const previous = seen.get(check.name);\n const previousOrigin = previous?.kind === \"typed\" ? previous.origin : undefined;\n if (previous !== undefined && (origin !== undefined || previousOrigin !== undefined)) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": CHECK name \"${check.name}\" is produced twice (${previousOrigin ?? \"a hand-written CHECK\"}; ${origin ?? \"a hand-written CHECK\"}) — names key the migration diff. Pass { name: \"…\" } to one of the rules`,\n meta: { rule: \"duplicate-check\", model, name: check.name },\n });\n }\n seen.set(check.name, check);\n if (check.kind === \"typed\" && check.minted === true && limit !== undefined && identifierLength({ name: check.name, dialect: dialect.name }) > limit.max) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": generated CHECK name \"${check.name}\" (${origin ?? \"check rule\"}) is longer than ${dialect.name}'s ${limit.max}-${limit.unit} identifier limit — pass a shorter { name: \"…\" } to the rule`,\n meta: { rule: \"identifier-too-long\", model, name: check.name },\n });\n }\n }\n}\n\n/**\n * A model's CHECKs as IR: the `checks` declaration (hand-written and check\n * rules) first, in declaration order, then the column rules (`.nonNegative()`,\n * …) in column order. Generated names use the PHYSICAL table and column names.\n *\n * The one compiler both `toIR` and the `.prisma` generator call, so a printed\n * schema and a compiled one hold the same CHECKs.\n */\nexport function compileModelChecks(params: {\n model: ModelDef;\n /** The model's built fields, from the same `buildField` the IR uses. */\n predicateModel: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): readonly CheckIR[] {\n const { model, predicateModel, dialect, enums } = params;\n const context: CheckModelContext = { model: model.__name, table: model.__map ?? model.__name, fields: predicateModel.fields, enums };\n const checks = [\n ...evaluateChecks({ checks: model.__checks, model: model.__name, context }),\n ...columnRuleChecks({ model, context }).map((entry) => typedCheck({ entry })),\n ];\n assertRuleNames({ checks, model: model.__name, dialect });\n return renderChecks({ checks, model: predicateModel, dialect, enums });\n}\n\n/**\n * An index's partial predicate as IR: the raw string verbatim, or a typed\n * expression compiled to SQL text plus its structured source.\n */\nexport function compileIndexPredicate(params: {\n where: string | undefined;\n wherePredicate: PredicateIR | undefined;\n columns: readonly string[];\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): { readonly where: string; readonly wherePredicate?: PredicateIR } | undefined {\n const { where, wherePredicate, columns, model, dialect, enums } = params;\n\n if (where !== undefined && wherePredicate !== undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Index on \"${model.name}\" [${columns.join(\", \")}] carries both a raw where: string and a typed .where() — an index has ONE predicate`,\n meta: { rule: \"predicate-duplicate-where\", model: model.name, columns: [...columns] },\n });\n }\n if (where !== undefined) return { where };\n if (wherePredicate === undefined) return undefined;\n\n return {\n where: renderPredicate({\n predicate: wherePredicate,\n model,\n dialect,\n enums,\n usage: \"indexPredicate\",\n site: `partial index on [${columns.join(\", \")}]`,\n }),\n wherePredicate,\n };\n}\n",
10
+ "/**\n * DSL → canonical `SchemaIR`.\n *\n * The DSL compiles straight to IR (no `.prisma` round-trip). It reads the same\n * schema plan the Prisma generator renders, so one logical schema produces the\n * same IR whether it arrives as `.prisma` text or as TypeScript.\n *\n * Mapping decisions, all mirroring what parsing `generate.prisma(schema)` yields:\n * - `dsl.id()` → `isId` + a `DefaultValueIR` per strategy (`ulid` / `cuid` /\n * `uuid` / `nanoid` app-side, `autoincrement` for serial ints, which is the\n * only strategy typed `Int`; `\"none\"` emits no default).\n * - `dsl.datetime({ default: \"now\" })` → `{ kind: \"now\" }`; `.updatedAt()` →\n * `isUpdatedAt`; `.tz()` → native type `Timestamptz`, `.tz({ precision: n })`\n * → `Timestamptz(n)`.\n * - `.maxLength(n)` / `.text()` / `.precision(p, s)` → native types\n * `VarChar(n)` / `Text` / `Decimal(p, s)`.\n * - `.map()` / model `map` → `dbName`; `.comment()` / model `comment` →\n * `documentation`; `collation` → `FieldIR.collation`.\n * - model `policy: { field, context }` → `ModelIR.policy` with `context`\n * defaulting to the field name (parser parity).\n * - `dsl.unsupported(\"tsvector\")` → `isUnsupported: true` + native type\n * `\"tsvector\"` over a nominal `String` base. The flag is what keeps the column\n * OUT of the queryable surface — it is kept in the IR for schema fidelity\n * (convert, migrate DDL), never projected or written.\n * - inline enums become schema-level enums named `${Model}${Column}`;\n * `storage: \"string\"` rides onto `EnumIR.storage` (omitted for the default).\n * - `.collation()` / `{ collation }` → `FieldIR.collation`.\n * - relation types are derived structurally by `resolveRelationType`.\n */\n\nimport {\n EMPTY_EXTENSION_REGISTRY,\n VibeError,\n assertValidSchemaIR,\n assertIndexExpressions,\n indexKeyFieldNames,\n exactIntegerLiteral,\n generatedColumnFromSql,\n isCanonicalLocalDate,\n providerToDialect,\n scalarListDefault,\n serializeJsonDefault,\n mergeExtensionDeclarations,\n normalizeJsonSchemaRef,\n normalizeValidatorRef,\n unsupportedCapability,\n} from \"@vibeorm/schema\";\nimport type {\n DefaultValueIR,\n EnumIR,\n ExtensionDeclIR,\n ExtensionRegistry,\n FieldIR,\n FieldType,\n IndexIR,\n IndexKind,\n ModelIR,\n Provider,\n RelationIR,\n SchemaIR,\n ValidationIssue,\n} from \"@vibeorm/schema\";\nimport { getSqlDialect, renderSchemaExpression } from \"@vibeorm/sql\";\nimport type { SqlDialect } from \"@vibeorm/sql\";\nimport { compileRowRules } from \"./row-rules.ts\";\nimport { columnFieldType } from \"./field-type.ts\";\nimport { compileExclusions, compileIndexPredicate, compileModelChecks } from \"./predicate.ts\";\nimport type { PredicateModel } from \"./predicate.ts\";\nimport { planSchema, resolveRelationType } from \"./relation-plan.ts\";\nimport type { PlannedIndex, PlannedRelation, SchemaPlan } from \"./relation-plan.ts\";\nimport type {\n ColumnDef,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n IdColumnConfig,\n IndexType,\n ModelDef,\n SchemaDef,\n StringColumnConfig,\n} from \"./types.ts\";\n\n// ─── Field type ───────────────────────────\n\n/**\n * The IR field type of a column — the same mapping relation planning pairs\n * foreign keys by (`./field-type.ts`), so the two can never drift apart.\n */\nconst fieldType = columnFieldType;\n\n// ─── Defaults ─────────────────────────────\n\nfunction idDefault(params: { column: ColumnDef }): DefaultValueIR | undefined {\n switch ((params.column.__config as IdColumnConfig).type) {\n case \"ulid\":\n return { kind: \"ulid\" };\n case \"cuid\":\n return { kind: \"cuid\" };\n case \"uuid\":\n return { kind: \"uuid\" };\n case \"nanoid\":\n return { kind: \"nanoid\" };\n case \"autoincrement\":\n return { kind: \"autoincrement\" };\n default:\n return undefined;\n }\n}\n\n/** Compile a column default once for both DSL output paths. */\nexport function fieldDefault(params: { column: ColumnDef }): DefaultValueIR | undefined {\n const { column } = params;\n if (column.__columnType === \"localDate\") {\n const { default: value, dbgenerated, autoincrement, updatedAt, array, collation } = column.__config;\n if (array === true || updatedAt === true || autoincrement === true || dbgenerated !== undefined || collation !== undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Local-date column \"${column.__name ?? \"localDate\"}\" requires a scalar calendar day and an optional canonical YYYY-MM-DD literal default; lists, collation, updatedAt and generated defaults are not supported`,\n meta: { issues: [{ rule: \"local-date-declaration\", field: column.__name }] },\n });\n }\n if (value === undefined) return undefined;\n const candidate = { value };\n if (!isCanonicalLocalDate(candidate)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Local-date default on \"${column.__name ?? \"localDate\"}\" must be a canonical YYYY-MM-DD calendar-day literal in years 0001–9999` });\n return { kind: \"literal\", value: candidate.value };\n }\n if (column.__columnType === \"id\") {\n const strategy = (column.__config as IdColumnConfig).type;\n const dbgenerated = column.__config.dbgenerated;\n if (column.__config.default !== undefined || column.__config.autoincrement !== undefined) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Use the id generator strategy instead of a conflicting id default\" });\n // A database default IS the id's generator, so it replaces the app-side one.\n if (dbgenerated !== undefined) {\n if (strategy !== \"none\" || typeof dbgenerated !== \"string\") throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `An id with a database default needs dsl.id({ type: \"none\" }); the \"${String(strategy)}\" generator strategy would conflict with it`, meta: { issues: [{ rule: \"id-dbgenerated-strategy\", column: column.__name, strategy }] } });\n return { kind: \"dbgenerated\", sql: dbgenerated };\n }\n return idDefault({ column });\n }\n\n const { dbgenerated, default: value, autoincrement } = column.__config;\n if ([dbgenerated !== undefined, value !== undefined, autoincrement === true].filter(Boolean).length > 1) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Column \"${column.__name ?? column.__columnType}\" has conflicting defaults` });\n }\n if (autoincrement === true) {\n if ((column.__columnType !== \"int\" && column.__columnType !== \"bigint\") || column.__config.array === true || column.__config.optional === true) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"autoincrement requires a required scalar Int or BigInt column\" });\n }\n return { kind: \"autoincrement\" };\n }\n if (typeof dbgenerated === \"string\") return { kind: \"dbgenerated\", sql: dbgenerated };\n if (value === undefined) return undefined;\n if (column.__config.array === true) {\n if (!Array.isArray(value)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A scalar-list default must be an array\" });\n return { kind: \"list\", values: scalarListDefault({ type: fieldType({ column }), values: column.__columnType === \"json\" ? value.map((entry) => typeof entry === \"string\" ? entry : serializeJsonDefault({ value: entry })) : value }) };\n }\n if (column.__columnType === \"json\" && typeof value !== \"string\") {\n return { kind: \"literal\", value: serializeJsonDefault({ value }) };\n }\n\n if (column.__columnType === \"datetime\" && value === \"now\") return { kind: \"now\" };\n if ((column.__columnType === \"datetime\" && value instanceof Date) || (column.__columnType === \"bytes\" && value instanceof Uint8Array)) {\n return { kind: \"literal\", value: scalarListDefault({ type: fieldType({ column }), values: [value] })[0]! };\n }\n if (column.__columnType === \"enum\" && typeof value === \"string\") {\n return { kind: \"enumValue\", value };\n }\n if (typeof value === \"number\" && (!Number.isFinite(value) || ((column.__columnType === \"int\" || column.__columnType === \"bigint\") && !Number.isSafeInteger(value)))) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Numeric defaults must be finite; integer defaults must be exact\" });\n }\n if (typeof value === \"string\" || typeof value === \"boolean\" || typeof value === \"number\") {\n return { kind: \"literal\", value };\n }\n // A bigint default keeps every digit: `Number(9007199254740993n)` is a\n // DIFFERENT number, and the rounding used to happen before any SQL existed.\n if (typeof value === \"bigint\") return { kind: \"literal\", value: exactIntegerLiteral({ text: value.toString() }) };\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Unsupported default for ${column.__columnType}` });\n}\n\n// ─── Native types ─────────────────────────\n\n/**\n * `Timestamptz` / `Timestamptz(n)` for a `.tz()` datetime column, or\n * `undefined`. Shared with the `.prisma` generator so both spell it alike.\n * Refuses a precision postgres would reject (outside 0–6, fractional) and a\n * precision without `tz`, which has no timestamptz to apply to.\n */\nexport function datetimeNativeType(params: { config: DatetimeColumnConfig; column: string | undefined }): string | undefined {\n const { tz, precision } = params.config;\n if (precision !== undefined && (tz !== true || !Number.isInteger(precision) || precision < 0 || precision > 6)) {\n const at = params.column === undefined ? \"A datetime column\" : `Column \"${params.column}\"`;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: a datetime precision must be an integer from 0 to 6 on a tz() column, as in dsl.datetime().tz({ precision: 3 })`,\n meta: { issues: [{ rule: \"datetime-precision\", column: params.column, precision, tz: tz === true }] },\n });\n }\n if (tz !== true) return undefined;\n return precision === undefined ? \"Timestamptz\" : `Timestamptz(${precision})`;\n}\n\n/**\n * `Uuid`, `VarChar(n)` or `Text` for a String column, or `undefined`. Shared\n * with the `.prisma` generator so both spell it alike. A column has one type,\n * so `uuid` refuses to combine with `maxLength` or `text`.\n */\nexport function stringNativeType(params: { config: StringColumnConfig; column: string | undefined }): string | undefined {\n const { maxLength, text, uuid } = params.config;\n if (uuid === true) {\n if (maxLength !== undefined || text === true) {\n const at = params.column === undefined ? \"A string column\" : `Column \"${params.column}\"`;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${at}: uuid() is the column's type and cannot be combined with maxLength or text`,\n meta: { issues: [{ rule: \"string-native-type\", column: params.column }] },\n });\n }\n return \"Uuid\";\n }\n if (typeof maxLength === \"number\") return `VarChar(${maxLength})`;\n if (text === true) return \"Text\";\n return undefined;\n}\n\n/** `Uuid` for a `uuid()` String id, or `undefined`; an Int (autoincrement) id refuses it. */\nexport function idNativeType(params: { config: IdColumnConfig; column: string | undefined }): string | undefined {\n if (params.config.uuid !== true) return undefined;\n if (params.config.type === \"autoincrement\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${params.column === undefined ? \"An id\" : `Id \"${params.column}\"`}: uuid() needs a String id; an autoincrement id is an Int`,\n meta: { issues: [{ rule: \"id-native-type\", column: params.column }] },\n });\n }\n return \"Uuid\";\n}\n\nfunction nativeType(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\n\n if (column.__columnType === \"localDate\") return \"Date\";\n if (column.__columnType === \"string\") return stringNativeType({ config: column.__config as StringColumnConfig, column: column.__name });\n if (column.__columnType === \"id\") return idNativeType({ config: column.__config as IdColumnConfig, column: column.__name });\n\n if (column.__columnType === \"enum\") {\n const { maxLength, text } = column.__config;\n if (maxLength !== undefined || text !== undefined) {\n const invalid = column.__enumStorage !== \"string\" ||\n (maxLength !== undefined && (typeof maxLength !== \"number\" || !Number.isSafeInteger(maxLength) || maxLength <= 0)) ||\n (text !== undefined && typeof text !== \"boolean\") ||\n (text === true && maxLength !== undefined);\n if (invalid) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: \"Enum text/maxLength options require string storage and either a positive integer maxLength or text: true, not both\",\n meta: { issues: [{ rule: \"enum-string-storage-options\", enum: column.__enumName }] },\n });\n }\n }\n }\n if (column.__columnType === \"enum\" && column.__enumStorage === \"string\") {\n const { maxLength, text } = column.__config as StringColumnConfig;\n if (typeof maxLength === \"number\") return `VarChar(${maxLength})`;\n if (text === true) return \"Text\";\n return undefined;\n }\n if (column.__columnType === \"decimal\") {\n const { precision, scale } = column.__config as DecimalColumnConfig;\n if (typeof precision === \"number\") return `Decimal(${precision}, ${scale ?? 0})`;\n return undefined;\n }\n if (column.__columnType === \"datetime\") {\n return datetimeNativeType({ config: column.__config, column: column.__name });\n }\n if (column.__columnType === \"unsupported\") {\n return String(column.__config.dbType);\n }\n return undefined;\n}\n\n// ─── Fields ───────────────────────────────\n\n/**\n * One column as `FieldIR`.\n *\n * Exported so the `.prisma` printer compiles typed CHECK and partial-index\n * expressions against exactly the same physical names and scalar types the IR\n * path uses — a second mapping is how the two would drift apart.\n */\nexport function buildField(params: {\n name: string;\n column: ColumnDef;\n /** Native type resolved by an extension field-type lowering, when present. */\n extensionNativeType?: string;\n}): FieldIR {\n const { name, column, extensionNativeType } = params;\n const config = column.__config;\n\n // A primary key is never a list; every other kind honours `.array()`.\n const isList = column.__columnType !== \"id\" && config.array === true;\n\n const dbName = typeof config.map === \"string\" ? config.map : undefined;\n const documentation = typeof config.comment === \"string\" ? config.comment : undefined;\n // Read on every column kind; `assertValidSchemaIR` refuses it off String\n // fields (`collation-non-string`), so the rule lives in one place.\n const collation = typeof config.collation === \"string\" ? config.collation : undefined;\n const validatorMetadata = normalizeValidatorRef({ documentation, reference: config.validator });\n const metadata = normalizeJsonSchemaRef({ documentation: validatorMetadata.documentation, reference: config.jsonSchema });\n const defaultValue = fieldDefault({ column });\n const native = extensionNativeType ?? nativeType({ column });\n\n return {\n name,\n type: fieldType({ column }),\n isList,\n isOptional: config.optional === true,\n isId: column.__columnType === \"id\",\n isUnique: config.unique === true,\n isUpdatedAt: column.__columnType === \"datetime\" && config.updatedAt === true,\n ...(collation === undefined ? {} : { collation }),\n ...(dbName === undefined ? {} : { dbName }),\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n ...(\"generated\" in config ? { generated: generatedColumnFromSql({ value: config.generated }) } : {}),\n ...(native === undefined ? {} : { nativeType: native }),\n ...(column.__columnType === \"unsupported\" ? { isUnsupported: true as const } : {}),\n ...(validatorMetadata.validator === undefined ? {} : { validator: validatorMetadata.validator }),\n ...metadata,\n };\n}\n\n// ─── Relations ────────────────────────────\n\nfunction buildRelation(params: { relation: PlannedRelation; plan: SchemaPlan }): RelationIR {\n const { relation, plan } = params;\n\n return {\n name: relation.name,\n model: relation.model,\n targetModel: relation.targetModel,\n type: resolveRelationType({ relation, plan }),\n isList: relation.isList,\n isOptional: relation.isOptional,\n ...(relation.relationName === undefined ? {} : { relationName: relation.relationName }),\n ...(relation.constraintName === undefined ? {} : { constraintName: relation.constraintName }),\n ...(relation.fields === undefined ? {} : { fields: [...relation.fields] }),\n ...(relation.references === undefined ? {} : { references: [...relation.references] }),\n ...(relation.onDelete === undefined ? {} : { onDelete: relation.onDelete }),\n ...(relation.onUpdate === undefined ? {} : { onUpdate: relation.onUpdate }),\n };\n}\n\n// ─── Indexes ──────────────────────────────\n\nconst INDEX_KINDS: Readonly<Record<IndexType, IndexKind>> = {\n BTree: \"btree\",\n Hash: \"hash\",\n Gin: \"gin\",\n Gist: \"gist\",\n SpGist: \"spgist\",\n Brin: \"brin\",\n};\n\n/** Shared planned-index lowering for IR and source spelling; not a package-root authoring API. */\nexport function buildIndex(params: {\n index: PlannedIndex;\n model: PredicateModel;\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): IndexIR {\n const { index, model, dialect, enums } = params;\n if (index.ops !== undefined && Object.values(index.ops).some((operatorClass) => operatorClass !== undefined) && !dialect.capabilities.indexOperatorClasses) throw unsupportedCapability({ dialect: dialect.name, feature: \"indexOperatorClasses\" });\n const kind: IndexKind = index.isUnique\n ? \"unique\"\n : index.indexType === undefined\n ? \"btree\"\n : INDEX_KINDS[index.indexType];\n\n const computed = index.keys?.some((term) => term.kind !== \"field\") === true;\n const keys: Pick<IndexIR, \"fields\" | \"expressions\"> = computed ? { fields: [], expressions: index.keys! } : { fields: index.keys === undefined ? index.columns.map((name) => ({ name, ...(index.ops?.[name] === undefined ? {} : { operatorClass: index.ops[name] }) })) : index.keys.flatMap((term) => term.kind === \"field\" ? [{ ...term.field, ...(index.ops?.[term.field.name] === undefined ? {} : { operatorClass: index.ops[term.field.name] }) }] : []) };\n if (computed) {\n const declaration: IndexIR = { kind, ...keys, ...(index.map === undefined ? {} : { name: index.map }), ...(index.clientName === undefined ? {} : { clientName: index.clientName }), ...(index.nullsNotDistinct === undefined ? {} : { nullsNotDistinct: index.nullsNotDistinct }) };\n assertIndexExpressions({ schema: { datasource: { provider: dialect.name === \"postgres\" ? \"postgresql\" : dialect.name }, enums, extensions: [], models: [{ ...model, indexes: [declaration], relations: [], isView: false }] }, dialect: dialect.name });\n for (const term of index.keys!) if (term.kind === \"expression\") renderSchemaExpression({ expression: term.expression, model, dialect, enums, usage: \"indexExpression\", site: `expression index on ${model.name}` });\n }\n\n // A typed predicate becomes SQL text HERE, once, where the dialect is known;\n // a raw string is carried through verbatim.\n const predicate = compileIndexPredicate({\n where: index.where,\n wherePredicate: index.wherePredicate,\n columns: computed ? indexKeyFieldNames({ index: keys }) ?? [] : index.columns,\n model,\n dialect,\n enums,\n });\n\n return {\n kind,\n ...keys,\n ...(index.map === undefined ? {} : { name: index.map }),\n ...(predicate === undefined ? {} : { where: predicate.where }),\n ...(predicate?.wherePredicate === undefined ? {} : { wherePredicate: predicate.wherePredicate }),\n ...(index.nullsNotDistinct === true ? { nullsNotDistinct: true } : {}),\n ...(index.clientName === undefined ? {} : { clientName: index.clientName }),\n };\n}\n\n// ─── Models ───────────────────────────────\n\nfunction buildModel(params: {\n model: ModelDef;\n plan: SchemaPlan;\n extensions: ExtensionRegistry;\n declarations: ExtensionDeclarationCollector;\n issues: ValidationIssue[];\n dialect: SqlDialect;\n enums: readonly EnumIR[];\n}): ModelIR {\n const { model, plan, extensions, declarations, issues, dialect, enums } = params;\n const primaryKey =\n model.__primaryKey !== undefined && model.__primaryKey.length > 0\n ? { fields: [...model.__primaryKey] }\n : undefined;\n const policy =\n model.__policy === undefined\n ? undefined\n : { field: model.__policy.field, context: model.__policy.context ?? model.__policy.field };\n\n const fields: FieldIR[] = [];\n for (const [name, column] of model.__columns) {\n const extensionTypeName = column.__config[\"extensionType\"];\n if (typeof extensionTypeName !== \"string\") {\n fields.push(buildField({ name, column }));\n continue;\n }\n // Extension column type — lowered by the same registry hook the parser uses.\n const registered = extensions.fieldTypes.get(extensionTypeName);\n if (registered === undefined) {\n issues.push({\n rule: \"extension-attribute\",\n message: `Field \"${model.__name}.${name}\" uses extension type \"${extensionTypeName}\" but no configured extension provides it`,\n model: model.__name,\n field: name,\n });\n continue;\n }\n const rawArgs = column.__config[\"extensionArgs\"];\n const lowered = registered.fieldType.lower({\n model: model.__name,\n field: name,\n args: Array.isArray(rawArgs)\n ? rawArgs.filter(\n (entry): entry is string | number =>\n typeof entry === \"string\" || typeof entry === \"number\",\n )\n : [],\n });\n if (\"error\" in lowered) {\n issues.push({\n rule: \"extension-attribute\",\n message: `Field \"${model.__name}.${name}\": ${lowered.error}`,\n model: model.__name,\n field: name,\n });\n continue;\n }\n fields.push(buildField({ name, column, extensionNativeType: lowered.nativeType }));\n if (lowered.declaration !== undefined) {\n declarations.add({\n extension: registered.extension.name,\n model: model.__name,\n declaration: lowered.declaration,\n });\n }\n }\n\n // Model-level extension attributes route through the same parse hook as @@attrs.\n for (const use of model.__extensions ?? []) {\n const registered = extensions.modelAttributes.get(use.attribute);\n if (registered === undefined) {\n issues.push({\n rule: \"unknown-attribute\",\n message: `Unknown block attribute \"@@${use.attribute}\" on model \"${model.__name}\" — no extension provides it`,\n model: model.__name,\n });\n continue;\n }\n const parsed = registered.attribute.parse({\n model: model.__name,\n args: {\n named: { ...(use.args ?? {}) },\n ...(use.fields === undefined ? {} : { fields: use.fields }),\n },\n fieldNames: fields.map((field) => field.name),\n });\n if (\"error\" in parsed) {\n issues.push({\n rule: \"extension-attribute\",\n message: `@@${use.attribute} on \"${model.__name}\": ${parsed.error}`,\n model: model.__name,\n });\n continue;\n }\n declarations.add({\n extension: registered.extension.name,\n model: model.__name,\n declaration: parsed.declaration,\n });\n }\n\n // Predicates read the built fields, so `@map`ped physical names and the exact\n // scalar types are the ones the rest of the IR carries.\n const predicateModel: PredicateModel = { name: model.__name, fields };\n const exclusions = compileExclusions({ exclusions: model.__exclusions, model: predicateModel, dialect });\n const checks = compileModelChecks({ model, predicateModel, dialect, enums });\n\n const irModel: ModelIR = {\n name: model.__name,\n ...(model.__map === undefined ? {} : { dbName: model.__map }),\n fields,\n relations: (plan.relations.get(model.__name) ?? []).map((relation) =>\n buildRelation({ relation, plan })\n ),\n indexes: (plan.indexes.get(model.__name) ?? []).map((index) =>\n buildIndex({ index, model: predicateModel, dialect, enums }),\n ),\n ...(exclusions.length === 0 ? {} : { exclusions }),\n ...(checks.length === 0 ? {} : { checks }),\n ...(policy === undefined ? {} : { policy }),\n ...(primaryKey === undefined ? {} : { primaryKey }),\n isView: false,\n ...(model.__comment === undefined ? {} : { documentation: model.__comment }),\n };\n const rowRules = compileRowRules({ model, irModel, dialect: dialect.name });\n return rowRules.length === 0 ? irModel : { ...irModel, rowRules };\n}\n\n// ─── Extension declarations ─────────────────────────────────\n\n/** extension → model → merged declaration; sorted output matches the parser. */\nclass ExtensionDeclarationCollector {\n private readonly byExtension = new Map<string, Map<string, Record<string, unknown>>>();\n\n add(params: {\n extension: string;\n model: string;\n declaration: Readonly<Record<string, unknown>>;\n }): void {\n const perModel =\n this.byExtension.get(params.extension) ?? new Map<string, Record<string, unknown>>();\n this.byExtension.set(params.extension, perModel);\n const existing = perModel.get(params.model) ?? {};\n perModel.set(\n params.model,\n mergeExtensionDeclarations({ base: existing, next: params.declaration, extension: params.extension }),\n );\n }\n\n toIR(): ExtensionDeclIR[] {\n return [...this.byExtension.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, perModel]) => ({\n name,\n options: {\n models: Object.fromEntries(\n [...perModel.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)),\n ),\n },\n }));\n }\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Compiles a composed DSL schema to the canonical `SchemaIR`, then validates it.\n *\n * @throws VibeError `VIBE_SCHEMA_INVALID` when the resulting IR fails\n * `assertValidSchemaIR` (unknown relation targets, missing primary keys, …).\n *\n * @example\n * const ir = dsl.toIR({ schema: dsl.schema({ User }, { relations }) });\n * const sqlite = dsl.toIR({ schema, provider: \"sqlite\" });\n */\nexport function toIR(params: {\n schema: SchemaDef;\n provider?: Provider;\n extensions?: ExtensionRegistry;\n}): SchemaIR {\n const { schema, provider = \"postgresql\" } = params;\n const extensions = params.extensions ?? EMPTY_EXTENSION_REGISTRY;\n const plan = planSchema({ schema });\n const declarations = new ExtensionDeclarationCollector();\n const issues: ValidationIssue[] = [];\n\n // `storage` is written only for string-backed enums: absent means\n // \"database\" (`enumStorageOf`), so IR for existing schemas is unchanged.\n // Built BEFORE the models because typed CHECK and partial-index expressions\n // are compiled to SQL while a model is built, and an enum operand is checked\n // for membership against the declaration.\n const enums: EnumIR[] = Array.from(schema.__enums, ([name, values]) => ({\n name,\n values: [...values],\n ...(schema.__enumStorage.get(name) === \"string\" ? { storage: \"string\" as const } : {}),\n }));\n const dialect = getSqlDialect({ dialect: providerToDialect({ provider }) });\n\n const models: ModelIR[] = Array.from(schema.__models.values(), (model) => {\n const built = buildModel({ model, plan, extensions, declarations, issues, dialect, enums });\n const rls = schema.__rls?.policies[model.__name];\n return rls === undefined ? built : { ...built, rls };\n });\n if (schema.__rls !== undefined) {\n for (const name of Object.keys(schema.__rls.policies)) {\n if (!schema.__models.has(name)) {\n issues.push({ rule: \"rls-unknown-model\", model: name, message: `RLS classification references model \"${name}\" absent from the composed schema` });\n }\n }\n }\n if (issues.length > 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Schema validation failed with ${issues.length} issue(s): ${issues\n .map((issue) => issue.message)\n .join(\"; \")}`,\n meta: { issues },\n });\n }\n\n const ir: SchemaIR = {\n datasource: { provider },\n models,\n enums,\n extensions: declarations.toIR(),\n ...(schema.__rls === undefined ? {} : { rls: { context: schema.__rls.context } }),\n };\n\n assertValidSchemaIR({ schema: ir });\n return ir;\n}\n",
11
+ "/**\n * One column → `FieldType` mapping, shared by every DSL output path.\n *\n * `toIR` writes it into the IR and relation planning compares it on both sides\n * of a foreign key, so the scalar a column IS and the scalar a relation pairs\n * BY can never drift apart.\n */\n\nimport { fieldTypeIdentity } from \"@vibeorm/schema\";\nimport type { FieldType } from \"@vibeorm/schema\";\nimport type { ColumnDef, IdColumnConfig } from \"./types.ts\";\n\n/**\n * The IR field type of a column.\n *\n * `dsl.id()` is `Int` only for the `autoincrement` strategy — every other id\n * strategy is app-generated text. An inline enum resolves to its assigned name\n * (`dsl.schema()` assigns it); an unnamed one degrades to `String`, exactly as\n * an unnamed enum column does everywhere else. `dsl.unsupported()` keeps a\n * nominal `String` base and carries its real database type in `nativeType`.\n */\nexport function columnFieldType(params: { column: ColumnDef }): FieldType {\n const { column } = params;\n\n switch (column.__columnType) {\n case \"string\":\n case \"localDate\":\n return \"String\";\n case \"int\":\n return \"Int\";\n case \"bigint\":\n return \"BigInt\";\n case \"float\":\n return \"Float\";\n case \"decimal\":\n return \"Decimal\";\n case \"boolean\":\n return \"Boolean\";\n case \"datetime\":\n return \"DateTime\";\n case \"json\":\n return \"Json\";\n case \"bytes\":\n return \"Bytes\";\n case \"id\":\n return (column.__config as IdColumnConfig).type === \"autoincrement\" ? \"Int\" : \"String\";\n case \"enum\":\n return column.__enumName === undefined ? \"String\" : { enum: column.__enumName };\n case \"unsupported\":\n return \"String\";\n }\n}\n\n/**\n * A comparable spelling of a column's field type — `\"String\"`, `\"Int\"`,\n * `\"enum:Status\"`. Two columns can be the two ends of one foreign key only when\n * these agree exactly.\n */\nexport function fieldTypeKey(params: { column: ColumnDef }): string {\n return fieldTypeIdentity({\n type: columnFieldType({ column: params.column }),\n ...(params.column.__columnType === \"localDate\" ? { nativeType: \"Date\" } : {}),\n });\n}\n",
12
+ "/**\n * The schema plan: one resolution of a `SchemaDef` into the exact relation\n * fields and indexes a model exposes.\n *\n * Both output paths consume it — `generate.prisma()` renders it as text and\n * `toIR()` compiles it to `SchemaIR` — so a schema authored once produces the\n * same relations either way, and `parse(generate.prisma(s))` matches `toIR(s)`.\n *\n * It resolves, in order:\n * 1. explicit relations (with the 1:1 merge pass, see `detectOneToOnePairs`),\n * 2. reverse list relations Prisma requires but the author left implicit,\n * 3. inline children lists, and the child's FK back to its parent,\n * 4. indexes (column-level + composite, deduplicated).\n *\n * Naming policy — a relation field is named by whoever declared it:\n * - author-declared relation keys (`Post: { author: … }`) and inline-children\n * keys (`Items: s.children(…)`) pass through VERBATIM, so the name the user\n * wrote is the name in both the IR and the `.prisma` text;\n * - names the planner invents (reverse list sides, a child's FK back to its\n * parent) use the `@relation` alias when there is one, else the source model\n * name, suffixed on collision.\n */\n\nimport { VibeError, indexKeyDefinitionKey, isSqlObjectIdentity, predicateKey } from \"@vibeorm/schema\";\nimport type { CascadeAction, IndexKeyTermIR, PredicateIR, QualifiedSqlName, RelationType } from \"@vibeorm/schema\";\nimport { fieldTypeKey } from \"./field-type.ts\";\nimport { evaluateIndexes } from \"./model.ts\";\nimport { toFkColumnName } from \"./naming.ts\";\nimport type {\n IndexType,\n ModelDef,\n RelationsMap,\n SchemaDef,\n StoredRelationDef,\n} from \"./types.ts\";\n\n// ─── Plan shapes ──────────────────────────\n\n/**\n * Structural role of a planned relation field:\n * - `fkOwner` — holds the foreign key (`@relation(fields:…, references:…)`)\n * - `backOne` — singular back reference, no foreign key\n * - `list` — list side (`Model[]`)\n */\nexport type PlannedRelationKind = \"fkOwner\" | \"backOne\" | \"list\";\n\n/** One relation field, exactly as it will be emitted. */\nexport type PlannedRelation = {\n readonly model: string;\n /**\n * Field name on the owning model, as emitted — the author's declared key\n * verbatim, or a planner-generated name for a side the author left implicit.\n */\n readonly name: string;\n readonly targetModel: string;\n readonly kind: PlannedRelationKind;\n readonly isList: boolean;\n readonly isOptional: boolean;\n /** `@relation(\"Name\")` — the DSL's `alias`. */\n readonly relationName?: string;\n /** Physical FOREIGN KEY name — the DSL's `constraintName`, never the alias. */\n readonly constraintName?: string;\n /** FK columns on this model, in declared order; member `i` pairs with `references[i]`. */\n readonly fields?: readonly string[];\n /** Referenced columns on the target model, in declared order. */\n readonly references?: readonly string[];\n readonly onDelete?: CascadeAction;\n readonly onUpdate?: CascadeAction;\n};\n\n/** One index, after column-level and composite indexes are deduplicated. */\nexport type PlannedIndex = {\n readonly map?: string;\n readonly isUnique: boolean;\n readonly columns: readonly string[];\n /** Whole ordered key, lowered once by the index builder. */\n readonly keys?: readonly IndexKeyTermIR[];\n readonly indexType?: IndexType;\n /** Qualified operator classes keyed by logical index column. */\n readonly ops?: Readonly<Partial<Record<string, QualifiedSqlName>>>;\n /** Partial-index predicate (raw SQL) — postgres/pglite/sqlite only. */\n readonly where?: string;\n /** Partial-index predicate as a typed expression, rendered when the dialect is known. */\n readonly wherePredicate?: PredicateIR;\n /** `UNIQUE NULLS NOT DISTINCT` — unique indexes on postgres/pglite (15+) only. */\n readonly nullsNotDistinct?: boolean;\n /** Client selector name for a compound unique (Prisma `@@unique(..., name:)`). */\n readonly clientName?: string;\n};\n\n/** Everything both output paths need, keyed by model name. */\nexport type SchemaPlan = {\n readonly relations: ReadonlyMap<string, readonly PlannedRelation[]>;\n readonly indexes: ReadonlyMap<string, readonly PlannedIndex[]>;\n};\n\n// ─── 1:1 merge detection ──────────────────\n\n/** How a relation participates in a merged one-to-one pair. */\nexport type MergedOneToOneSide = {\n readonly role: \"fkOwner\" | \"backRelation\";\n readonly pairedRelName: string;\n readonly pairedModelName: string;\n /** Merged referential actions — the FK owner's win. */\n readonly onDelete?: CascadeAction;\n readonly onUpdate?: CascadeAction;\n /** Merged physical FK name — the FK owner's wins; either side may declare it. */\n readonly constraintName?: string;\n};\n\ntype OneRelationEntry = {\n readonly modelName: string;\n readonly relName: string;\n readonly rel: StoredRelationDef;\n};\n\nfunction relationPairKey(params: { relation: StoredRelationDef; reverse?: boolean }): string {\n const { relation, reverse } = params;\n return JSON.stringify(reverse\n ? [relation.__toModel, relation.__toColumns, relation.__fromModel, relation.__fromColumns, relation.__alias ?? \"\"]\n : [relation.__fromModel, relation.__fromColumns, relation.__toModel, relation.__toColumns, relation.__alias ?? \"\"]);\n}\n\n/**\n * Finds pairs of `r.one` relations that describe the same 1:1 relationship\n * from both sides, and decides which side owns the foreign key.\n *\n * Two `one` relations pair when their column references cross-match:\n * `A.from === B.to` and `A.to === B.from`. The FK owner is the side whose\n * `from` column is NOT the primary key.\n *\n * Returns a map keyed by `\"Model:relationName\"`.\n */\nexport function detectOneToOnePairs(params: {\n relations: RelationsMap;\n models: ReadonlyMap<string, ModelDef>;\n}): Map<string, MergedOneToOneSide> {\n const { relations, models } = params;\n const mergeMap = new Map<string, MergedOneToOneSide>();\n\n const allOnes: OneRelationEntry[] = [];\n for (const [modelName, modelRelations] of Object.entries(relations)) {\n for (const [relName, rel] of Object.entries(modelRelations)) {\n if (rel.__ownsForeignKey !== undefined && (typeof rel.__ownsForeignKey !== \"boolean\" || rel.__relationType !== \"one\" || (rel.__ownsForeignKey && rel.__fromModel !== modelName))) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Invalid foreign-key ownership declaration on ${modelName}.${relName}` });\n }\n if (rel.__relationType === \"one\") {\n allOnes.push({ modelName, relName, rel });\n }\n }\n }\n\n const candidatesByKey = new Map<string, { readonly positions: number[]; start: number }>();\n for (const [position, entry] of allOnes.entries()) {\n const key = relationPairKey({ relation: entry.rel });\n const bucket = candidatesByKey.get(key);\n if (bucket === undefined) candidatesByKey.set(key, { positions: [position], start: 0 });\n else bucket.positions.push(position);\n }\n const paired = new Set<string>();\n\n for (let i = 0; i < allOnes.length; i++) {\n const a = allOnes[i];\n if (a === undefined) continue;\n const keyA = `${a.modelName}:${a.relName}`;\n if (paired.has(keyA)) continue;\n\n const bucket = candidatesByKey.get(relationPairKey({ relation: a.rel, reverse: true }));\n if (bucket === undefined) continue;\n for (let candidate = bucket.start; candidate < bucket.positions.length; candidate++) {\n const j = bucket.positions[candidate]!;\n const b = allOnes[j]!;\n const keyB = `${b.modelName}:${b.relName}`;\n if (j <= i || paired.has(keyB)) {\n bucket.start = candidate + 1;\n continue;\n }\n\n // Composite sides pair only when the WHOLE tuple crosses over, member by\n // member: two relations sharing their first column but disagreeing later\n // describe different foreign keys.\n const sameColumnPair =\n a.rel.__fromModel === b.rel.__toModel &&\n sameColumnTuple({ left: a.rel.__fromColumns, right: b.rel.__toColumns }) &&\n a.rel.__toModel === b.rel.__fromModel &&\n sameColumnTuple({ left: a.rel.__toColumns, right: b.rel.__fromColumns });\n if (!sameColumnPair || (a.rel.__alias ?? \"\") !== (b.rel.__alias ?? \"\")) continue;\n\n const { fkOwner, backRelation } = resolveFkOwner({ a, b, models });\n\n const onDelete = fkOwner.rel.__onDelete ?? backRelation.rel.__onDelete;\n const onUpdate = fkOwner.rel.__onUpdate ?? backRelation.rel.__onUpdate;\n const constraintName = fkOwner.rel.__constraintName ?? backRelation.rel.__constraintName;\n\n const fkKey = `${fkOwner.modelName}:${fkOwner.relName}`;\n const backKey = `${backRelation.modelName}:${backRelation.relName}`;\n\n mergeMap.set(fkKey, {\n role: \"fkOwner\",\n pairedRelName: backRelation.relName,\n pairedModelName: backRelation.modelName,\n onDelete,\n onUpdate,\n ...(constraintName === undefined ? {} : { constraintName }),\n });\n mergeMap.set(backKey, {\n role: \"backRelation\",\n pairedRelName: fkOwner.relName,\n pairedModelName: fkOwner.modelName,\n onDelete,\n onUpdate,\n ...(constraintName === undefined ? {} : { constraintName }),\n });\n\n paired.add(fkKey);\n paired.add(backKey);\n bucket.start = candidate + 1;\n break;\n }\n }\n\n return mergeMap;\n}\n\n/** Two relation ends name the same columns, in the same order. */\nfunction sameColumnTuple(params: { left: readonly string[]; right: readonly string[] }): boolean {\n const { left, right } = params;\n return left.length === right.length && left.every((name, index) => name === right[index]);\n}\n\nfunction resolveFkOwner(params: {\n a: OneRelationEntry;\n b: OneRelationEntry;\n models: ReadonlyMap<string, ModelDef>;\n}): { fkOwner: OneRelationEntry; backRelation: OneRelationEntry } {\n const { a, b, models } = params;\n\n const ownershipError = (): never => {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Ambiguous foreign-key ownership between ${a.modelName}.${a.relName} and ${b.modelName}.${b.relName}; set ownsForeignKey: true on the foreign-key side`, meta: { rule: \"ambiguous-foreign-key-owner\" } });\n };\n const aOwns = a.rel.__ownsForeignKey;\n const bOwns = b.rel.__ownsForeignKey;\n if (aOwns !== undefined || bOwns !== undefined) {\n if (aOwns === bOwns) return ownershipError();\n return aOwns === true || bOwns === false ? { fkOwner: a, backRelation: b } : { fkOwner: b, backRelation: a };\n }\n const aFromIsId = fromIsPrimaryKey({ model: models.get(a.modelName), columns: a.rel.__fromColumns });\n const bFromIsId = fromIsPrimaryKey({ model: models.get(b.modelName), columns: b.rel.__fromColumns });\n\n if (aFromIsId && !bFromIsId) return { fkOwner: b, backRelation: a };\n if (!aFromIsId && bFromIsId) return { fkOwner: a, backRelation: b };\n\n // Ambiguous (both or neither are primary keys): the side that declares\n // referential actions owns the FK, else the side whose column reads like one.\n const aActions = a.rel.__onDelete !== undefined || a.rel.__onUpdate !== undefined;\n const bActions = b.rel.__onDelete !== undefined || b.rel.__onUpdate !== undefined;\n if (aActions && !bActions) {\n return { fkOwner: a, backRelation: b };\n }\n if (bActions && !aActions) {\n return { fkOwner: b, backRelation: a };\n }\n\n const aLooksFk = a.rel.__fromColumns.some((column) => looksLikeForeignKey({ column }));\n const bLooksFk = b.rel.__fromColumns.some((column) => looksLikeForeignKey({ column }));\n if (aLooksFk === bLooksFk) return ownershipError();\n return aLooksFk ? { fkOwner: a, backRelation: b } : { fkOwner: b, backRelation: a };\n}\n\n/**\n * Does this relation end name the model's OWN primary key? A composite end must\n * be the whole compound key; a single column keeps the older, looser rule (an\n * `id()` column, or any member of a compound key) so single-column ownership\n * detection is unchanged.\n */\nfunction fromIsPrimaryKey(params: { model: ModelDef | undefined; columns: readonly string[] }): boolean {\n const { model, columns } = params;\n if (model === undefined) return false;\n if (columns.length > 1) {\n const primaryKey = model.__primaryKey;\n return (\n primaryKey !== undefined &&\n primaryKey.length === columns.length &&\n primaryKey.every((name) => columns.includes(name))\n );\n }\n const column = columns[0];\n if (column === undefined) return false;\n return model.__columns.get(column)?.__columnType === \"id\" || model.__primaryKey?.includes(column) === true;\n}\n\nfunction looksLikeForeignKey(params: { column: string }): boolean {\n const { column } = params;\n return column.toLowerCase().includes(\"id\") && column !== \"id\";\n}\n\n// ─── Relation planning ────────────────────\n\nfunction planExplicitRelations(params: {\n modelName: string;\n model: ModelDef;\n relations: RelationsMap;\n mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n}): PlannedRelation[] {\n const { modelName, model, relations, mergeMap } = params;\n const planned: PlannedRelation[] = [];\n\n for (const [relName, rel] of Object.entries(relations[modelName] ?? {})) {\n // The author's key IS the field name — never re-cased, so one logical\n // schema reads the same through the IR and through the .prisma text.\n const name = relName;\n const base = {\n model: modelName,\n name,\n targetModel: rel.__targetModel,\n relationName: rel.__alias,\n };\n\n if (rel.__relationType === \"many\") {\n planned.push({ ...base, kind: \"list\", isList: true, isOptional: false });\n continue;\n }\n\n const mergeInfo = mergeMap.get(`${modelName}:${relName}`);\n\n if (mergeInfo?.role === \"backRelation\") {\n // Parent side of a merged 1:1 — always an optional back reference.\n planned.push({ ...base, kind: \"backOne\", isList: false, isOptional: true });\n continue;\n }\n\n const ownsFk = mergeInfo?.role === \"fkOwner\" || (rel.__ownsForeignKey !== false && rel.__fromModel === modelName);\n if (!ownsFk) {\n planned.push({ ...base, kind: \"backOne\", isList: false, isOptional: rel.__optional });\n continue;\n }\n\n // MATCH SIMPLE: one NULL member and the database checks nothing, so the\n // parent is absent as soon as ANY member is nullable.\n const anyMemberOptional = rel.__fromColumns.some(\n (name) => model.__columns.get(name)?.__config.optional === true,\n );\n const constraintName = mergeInfo?.constraintName ?? rel.__constraintName;\n planned.push({\n ...base,\n kind: \"fkOwner\",\n isList: false,\n isOptional: anyMemberOptional || rel.__optional,\n fields: [...rel.__fromColumns],\n references: [...rel.__toColumns],\n ...(constraintName === undefined ? {} : { constraintName }),\n onDelete: mergeInfo?.onDelete ?? rel.__onDelete,\n onUpdate: mergeInfo?.onUpdate ?? rel.__onUpdate,\n });\n }\n\n return planned;\n}\n\n/**\n * Prisma requires both sides of a relation to exist. For every `one` relation\n * pointing at this model without a matching list on this side, plan the list.\n * Merged 1:1 pairs are complete already and are skipped.\n *\n * These names are generated, not declared: the `@relation` alias when the\n * source side has one, else the source model name, numerically suffixed if that\n * name is already taken on this model.\n */\nfunction planMissingReverseRelations(params: {\n modelName: string;\n relations: RelationsMap;\n incoming: readonly OneRelationEntry[];\n mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n existing: readonly PlannedRelation[];\n}): PlannedRelation[] {\n const { modelName, relations, incoming, mergeMap, existing } = params;\n const planned: PlannedRelation[] = [];\n\n const existingLists = new Set<string>();\n const existingNames = new Set<string>();\n for (const relation of existing) {\n existingNames.add(relation.name);\n if (relation.isList) {\n existingLists.add(`${relation.targetModel}:${relation.relationName ?? \"\"}`);\n }\n }\n\n for (const { modelName: sourceModelName, relName, rel } of incoming) {\n if (mergeMap.has(`${sourceModelName}:${relName}`)) continue;\n\n const reverseKey = `${sourceModelName}:${rel.__alias ?? \"\"}`;\n if (existingLists.has(reverseKey)) continue;\n\n // A self-relation may already declare its own list side explicitly.\n if (sourceModelName === modelName) {\n const hasExplicitReverse = Object.values(relations[sourceModelName] ?? {}).some(\n (other: StoredRelationDef) =>\n other.__relationType === \"many\" &&\n other.__targetModel === modelName &&\n other.__alias === rel.__alias\n );\n if (hasExplicitReverse) continue;\n }\n\n const baseName = rel.__alias ?? sourceModelName;\n let name = baseName;\n let counter = 1;\n while (existingNames.has(name)) {\n counter++;\n name = `${baseName}${counter}`;\n }\n\n planned.push({\n model: modelName,\n name,\n targetModel: sourceModelName,\n kind: \"list\",\n isList: true,\n isOptional: false,\n relationName: rel.__alias,\n });\n existingLists.add(reverseKey);\n existingNames.add(name);\n }\n\n return planned;\n}\n\n/** The parent's list of inline children, plus each child's FK back to it. */\nfunction planChildRelations(params: {\n modelName: string;\n model: ModelDef;\n parents: readonly (readonly [string, ModelDef])[];\n}): PlannedRelation[] {\n const { modelName, model, parents } = params;\n const planned: PlannedRelation[] = [];\n\n for (const [childKey, childModel] of model.__children) {\n planned.push({\n model: modelName,\n name: childKey,\n targetModel: childModel.__name,\n kind: \"list\",\n isList: true,\n isOptional: false,\n });\n }\n\n for (const [parentModelName, parentModel] of parents) {\n const parentPk =\n parentModel.__primaryKey?.[0] ??\n Array.from(parentModel.__columns.entries()).find(\n ([, column]) => column.__columnType === \"id\"\n )?.[0] ??\n \"id\";\n\n planned.push({\n model: modelName,\n name: parentModelName,\n targetModel: parentModelName,\n kind: \"fkOwner\",\n isList: false,\n isOptional: false,\n fields: [toFkColumnName({ modelName: parentModelName })],\n references: [parentPk],\n });\n }\n\n return planned;\n}\n\n// ─── Index planning ───────────────────────\n\nfunction planIndexes(params: { model: ModelDef }): PlannedIndex[] {\n const { model } = params;\n const byKey = new Map<string, PlannedIndex>();\n\n // Column-level `.index()` — id and unique columns are already indexed.\n for (const [columnName, column] of model.__columns) {\n if (column.__columnType === \"id\" || column.__config.unique === true) continue;\n if (column.__config.index === true) {\n byKey.set(columnName, { isUnique: false, columns: [columnName] });\n }\n }\n\n // Composite/typed indexes from the model's `indexes` callback. A partial\n // index (where) is a DIFFERENT database object from a total index over the\n // same columns, so the predicate joins the dedup key. A TYPED predicate joins\n // it through `predicateKey` — a structural, dialect-free identity — because\n // index planning runs before any provider is known and must not render SQL.\n for (const index of evaluateIndexes({ model })) {\n if (index.__keys?.some((term) => term.kind !== \"field\") && index.__ops !== undefined) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Custom operator classes are not admitted on expression-bearing keys\", meta: { feature: \"expressionIndexOperatorClasses\", rule: \"expression-index-operator-classes\", model: model.__name } });\n if (index.__ops !== undefined) {\n if (index.__ops === null || typeof index.__ops !== \"object\" || Array.isArray(index.__ops)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Index ops must be a field-keyed qualified-name map\", meta: { rule: \"index-operator-class-map\", model: model.__name } });\n if (index.__type === \"unique\") throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Custom unique operator classes can change client selector equality\", meta: { feature: \"uniqueIndexOperatorClasses\", model: model.__name } });\n for (const [field, operatorClass] of Object.entries(index.__ops)) {\n if (!index.__columns.includes(field)) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Operator class names a field outside the index\", meta: { rule: \"index-operator-class-field\", model: model.__name, field } });\n if (operatorClass !== undefined && !isSqlObjectIdentity({ kind: \"table\", name: operatorClass })) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Index operator class must be a qualified SQL name { namespace, name }\", meta: { rule: \"index-operator-class-identity\", model: model.__name, field } });\n }\n }\n const operatorClasses = index.__columns.map((field) => index.__ops?.[field]);\n const operatorSuffix = operatorClasses.some((operatorClass) => operatorClass !== undefined)\n ? `|ops:${JSON.stringify([index.__indexType ?? \"BTree\", operatorClasses.map((operatorClass) => operatorClass === undefined ? null : [operatorClass.namespace, operatorClass.name])])}`\n : \"\";\n const predicateSuffix =\n index.__where !== undefined\n ? `|where:${index.__where}`\n : index.__wherePredicate === undefined\n ? \"\"\n : `|where:${predicateKey({ predicate: index.__wherePredicate })}`;\n const key = index.__keys === undefined ? index.__columns.join(\",\") + predicateSuffix + operatorSuffix : index.__keys.some((term) => term.kind !== \"field\")\n ? indexKeyDefinitionKey({ index: { kind: index.__type === \"unique\" ? \"unique\" : (index.__indexType ?? \"BTree\").toLowerCase(), fields: [], expressions: index.__keys, ...(index.__map === undefined ? {} : { name: index.__map }), ...(index.__where === undefined ? {} : { where: index.__where }), ...(index.__wherePredicate === undefined ? {} : { wherePredicate: index.__wherePredicate }), ...(index.__nullsNotDistinct === undefined ? {} : { nullsNotDistinct: index.__nullsNotDistinct }) } })\n : `${index.__columns.join(\",\")}${predicateSuffix}${operatorSuffix}|sort:${JSON.stringify(index.__keys)}`;\n const existing = byKey.get(key);\n const isUnique = index.__type === \"unique\";\n\n if (existing === undefined || isUnique) {\n byKey.set(key, {\n isUnique,\n columns: [...index.__columns],\n ...(index.__keys === undefined ? {} : { keys: index.__keys }),\n indexType: index.__indexType,\n ...(index.__ops === undefined ? {} : { ops: index.__ops }),\n ...(index.__map === undefined ? {} : { map: index.__map }),\n ...(index.__where === undefined ? {} : { where: index.__where }),\n ...(index.__wherePredicate === undefined ? {} : { wherePredicate: index.__wherePredicate }),\n ...(index.__nullsNotDistinct === true ? { nullsNotDistinct: true } : {}),\n ...(index.__clientName === undefined ? {} : { clientName: index.__clientName }),\n });\n } else if (index.__map !== undefined) {\n byKey.set(key, { ...existing, map: index.__map, indexType: index.__indexType ?? existing.indexType });\n } else if (index.__indexType !== undefined && existing.indexType === undefined) {\n byKey.set(key, { ...existing, indexType: index.__indexType });\n }\n }\n\n return Array.from(byKey.values());\n}\n\n// ─── Foreign-key integrity ────────────────\n\n/**\n * Every column set a foreign key may legally REFERENCE on a model: its `id()`\n * column, each `unique()` column, its compound primary key and each TOTAL\n * `@@unique` index. A partial unique is excluded — raw `where:` or typed\n * `.where()` alike, because no dialect here accepts one as a foreign-key\n * target, and which SPELLING made it partial changes nothing about that.\n */\nfunction referenceableKeys(params: { model: ModelDef }): readonly (readonly string[])[] {\n const { model } = params;\n const keys: (readonly string[])[] = [];\n\n for (const [name, column] of model.__columns) {\n if (column.__columnType === \"id\" || column.__config.unique === true) keys.push([name]);\n }\n if (model.__primaryKey !== undefined && model.__primaryKey.length > 0) keys.push([...model.__primaryKey]);\n for (const index of evaluateIndexes({ model })) {\n if (index.__type === \"unique\" && !index.__keys?.some((term) => term.kind !== \"field\") && index.__where === undefined && index.__wherePredicate === undefined) {\n keys.push([...index.__columns]);\n }\n }\n\n return keys;\n}\n\n/**\n * Checks one FK-owning relation the way the database will: equal arity, the\n * same scalar type on both ends of every member, and a referenced column set\n * that is exactly some unique key of the target.\n *\n * Refusing here is the earliest knowable moment — the alternative is DDL the\n * server rejects with \"there is no unique constraint matching given keys\", or\n * a foreign key that compares two different scalar types.\n */\nfunction assertForeignKeyIntegrity(params: {\n relation: PlannedRelation;\n models: ReadonlyMap<string, ModelDef>;\n}): void {\n const { relation, models } = params;\n const fields = relation.fields ?? [];\n const references = relation.references ?? [];\n const at = `${relation.model}.${relation.name}`;\n\n const refuse = (message: string, rule: string, meta: Record<string, unknown> = {}): never => {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation ${at}: ${message}`,\n meta: { rule, model: relation.model, relation: relation.name, ...meta },\n });\n };\n\n if (fields.length !== references.length) {\n refuse(\n `pairs ${fields.length} foreign-key column(s) with ${references.length} referenced column(s)`,\n \"relation-tuple-arity\",\n { fields, references },\n );\n }\n if (new Set(fields).size !== fields.length) {\n refuse(`repeats a foreign-key column (${fields.join(\", \")})`, \"relation-duplicate-column\", { fields });\n }\n if (new Set(references).size !== references.length) {\n refuse(`repeats a referenced column (${references.join(\", \")})`, \"relation-duplicate-column\", { references });\n }\n\n const owner = models.get(relation.model);\n const target = models.get(relation.targetModel);\n // An unknown target is `unknown-relation-target`, reported by IR validation\n // against the whole schema; nothing here can add to it.\n if (owner === undefined || target === undefined) return;\n\n fields.forEach((name, index) => {\n const referenced = references[index]!;\n const column = owner.__columns.get(name);\n const refColumn = target.__columns.get(referenced);\n if (column === undefined) {\n refuse(`uses foreign-key column \"${name}\", which ${relation.model} does not declare`, \"unknown-relation-field\", { field: name });\n return;\n }\n if (refColumn === undefined) {\n refuse(`references \"${relation.targetModel}.${referenced}\", which does not exist`, \"unknown-relation-reference\", { reference: referenced });\n return;\n }\n if (column.__config.array === true || refColumn.__config.array === true) {\n refuse(`pairs a scalar list (${name} ↔ ${referenced}) — a foreign key compares single values`, \"relation-list-column\", { field: name, reference: referenced });\n }\n if (column.__columnType === \"json\" || refColumn.__columnType === \"json\" || column.__columnType === \"unsupported\" || refColumn.__columnType === \"unsupported\") {\n refuse(`pairs ${name} ↔ ${referenced}, and Json/unsupported columns cannot be a foreign key`, \"relation-unsupported-column\", { field: name, reference: referenced });\n }\n const ownType = fieldTypeKey({ column });\n const refType = fieldTypeKey({ column: refColumn });\n if (ownType !== refType) {\n refuse(\n `pairs ${relation.model}.${name} (${ownType}) with ${relation.targetModel}.${referenced} (${refType}) — both ends of a foreign key need the same scalar type`,\n \"relation-type-mismatch\",\n { field: name, reference: referenced, fieldType: ownType, referenceType: refType },\n );\n }\n });\n\n const keys = referenceableKeys({ model: target });\n const matched = keys.some(\n (key) => key.length === references.length && key.every((name) => references.includes(name)),\n );\n if (!matched) {\n refuse(\n `references ${relation.targetModel}.(${references.join(\", \")}), which is not a unique key there — declare those columns as the primary key, a unique column, or a total @@unique index`,\n \"relation-reference-not-unique\",\n { references, candidates: keys.map((key) => [...key]) },\n );\n }\n}\n\n// ─── Public API ────────────────────────\n\ntype RelationLookups = {\n readonly incoming: ReadonlyMap<string, readonly OneRelationEntry[]>;\n readonly parents: ReadonlyMap<string, readonly (readonly [string, ModelDef])[]>;\n /**\n * Every value the two lookups were built from, in build order: per \"one\"\n * relation its model, name, object and target; per inline child its name,\n * parent name and parent object. The lookups are a pure function of it.\n */\n readonly inputs: readonly unknown[];\n};\n\nfunction relationLookups(params: { schema: SchemaDef }): RelationLookups {\n const inputs: unknown[] = [];\n const incoming = new Map<string, OneRelationEntry[]>();\n for (const [modelName, relations] of Object.entries(params.schema.__relations)) {\n for (const [relName, rel] of Object.entries(relations)) {\n if (rel.__relationType !== \"one\") continue;\n const target = rel.__targetModel;\n inputs.push(modelName, relName, rel, target);\n const entries = incoming.get(target);\n const entry = { modelName, relName, rel };\n if (entries === undefined) incoming.set(target, [entry]);\n else entries.push(entry);\n }\n }\n const parents = new Map<string, (readonly [string, ModelDef])[]>();\n for (const [name, model] of params.schema.__models) {\n for (const child of model.__children.values()) {\n inputs.push(child.__name, name, model);\n const entries = parents.get(child.__name);\n if (entries === undefined) parents.set(child.__name, [[name, model]]);\n else entries.push([name, model]);\n }\n }\n return { incoming, parents, inputs };\n}\n\n/**\n * Whether `relationLookups` would rebuild exactly these lookups now: it walks\n * the same relations and children in the same order and compares each value it\n * would read with the recorded one (performance round 3, CS-07). An index\n * callback that mutated relation or child metadata makes it false; a callback\n * that only returned indexes — almost all of them — leaves it true, and the\n * O(relations) rebuild before the next model is skipped. Allocation-light: one\n * key list per relations object, no entry arrays or maps.\n */\nfunction lookupsCurrent(params: { schema: SchemaDef; inputs: readonly unknown[] }): boolean {\n const { schema, inputs } = params;\n let at = 0;\n const byModel = schema.__relations;\n for (const modelName in byModel) {\n if (!Object.hasOwn(byModel, modelName)) continue;\n const relations = byModel[modelName]!;\n for (const relName in relations) {\n if (!Object.hasOwn(relations, relName)) continue;\n const rel = relations[relName]!;\n if (rel.__relationType !== \"one\") continue;\n if (inputs[at] !== modelName || inputs[at + 1] !== relName || inputs[at + 2] !== rel || inputs[at + 3] !== rel.__targetModel) return false;\n at += 4;\n }\n }\n for (const [name, model] of schema.__models) {\n for (const child of model.__children.values()) {\n if (inputs[at] !== child.__name || inputs[at + 1] !== name || inputs[at + 2] !== model) return false;\n at += 3;\n }\n }\n return at === inputs.length;\n}\n\n/** Resolves a composed schema into the relations and indexes it emits. */\nexport function planSchema(params: { schema: SchemaDef }): SchemaPlan {\n const { schema } = params;\n const mergeMap = detectOneToOnePairs({\n relations: schema.__relations,\n models: schema.__models,\n });\n\n const relations = new Map<string, readonly PlannedRelation[]>();\n const indexes = new Map<string, readonly PlannedIndex[]>();\n let lookups = relationLookups({ schema });\n let refreshLookups = false;\n\n for (const [modelName, model] of schema.__models) {\n if (refreshLookups) {\n if (!lookupsCurrent({ schema, inputs: lookups.inputs })) lookups = relationLookups({ schema });\n refreshLookups = false;\n }\n const explicit = planExplicitRelations({\n modelName,\n model,\n relations: schema.__relations,\n mergeMap,\n });\n const reverses = planMissingReverseRelations({\n modelName,\n relations: schema.__relations,\n incoming: lookups.incoming.get(modelName) ?? [],\n mergeMap,\n existing: explicit,\n });\n const children = planChildRelations({ modelName, model, parents: lookups.parents.get(modelName) ?? [] });\n\n const planned = [...explicit, ...reverses, ...children];\n for (const relation of planned) {\n if (relation.kind === \"fkOwner\") {\n if (schema.__models.get(relation.targetModel)?.__indexes !== undefined) refreshLookups = true;\n assertForeignKeyIntegrity({ relation, models: schema.__models });\n }\n }\n relations.set(modelName, planned);\n // Callbacks may mutate authoring metadata as well as return fresh indexes.\n // Recheck structural lookups before the next model (rebuilt only when what\n // they read changed), without caching results.\n if (model.__indexes !== undefined) refreshLookups = true;\n indexes.set(modelName, planIndexes({ model }));\n }\n\n return { relations, indexes };\n}\n\n/**\n * Classifies a planned relation the way a Prisma parser would classify the\n * field it renders to: by the shape of the pair, never by DSL intent.\n *\n * Counterparts are the target model's relation fields that point back with a\n * symmetric relation name (both unnamed, or the same name) — the one implicit\n * many-to-many rule, with self-exclusion (LEARNINGS.md).\n */\nexport function resolveRelationType(params: {\n relation: PlannedRelation;\n plan: SchemaPlan;\n}): RelationType {\n const { relation, plan } = params;\n const counterparts = findCounterparts({ relation, plan });\n\n if (relation.isList) {\n if (counterparts.some((candidate) => !candidate.isList)) return \"oneToMany\";\n return counterparts.some((candidate) => candidate.isList) ? \"manyToMany\" : \"oneToMany\";\n }\n\n if (relation.kind === \"fkOwner\") {\n const pairedWithSingular =\n counterparts.length > 0 && counterparts.every((candidate) => !candidate.isList);\n return pairedWithSingular ? \"oneToOne\" : \"manyToOne\";\n }\n\n return \"oneToOne\";\n}\n\nfunction findCounterparts(params: {\n relation: PlannedRelation;\n plan: SchemaPlan;\n}): PlannedRelation[] {\n const { relation, plan } = params;\n const nameKey = relation.relationName ?? \"\";\n\n return (plan.relations.get(relation.targetModel) ?? []).filter(\n (candidate) =>\n candidate !== relation &&\n candidate.targetModel === relation.model &&\n (candidate.relationName ?? \"\") === nameKey\n );\n}\n",
13
+ "/**\n * Model builder — `dsl.create({ name, schema, indexes })`.\n *\n * Models hold columns (and optional inline children) only; relations are\n * declared separately via `dsl.defineRelations()`.\n *\n * @example\n * const User = dsl.create({\n * name: \"User\",\n * schema: {\n * ...dsl.templates.base,\n * email: dsl.string().unique(),\n * workspaceId: dsl.string().index(),\n * },\n * indexes: (i) => [i.unique(\"workspaceId\", \"email\")],\n * });\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type { IndexKeyTermIR, PredicateIR } from \"@vibeorm/schema\";\nimport { cloneColumnDef } from \"./column.ts\";\nimport { toFkColumnName } from \"./naming.ts\";\nimport { createPredicateBuilder, toPredicateExpression } from \"./predicate.ts\";\nimport { createChildrenBuilder } from \"./relation.ts\";\nimport type {\n ChecksCallback,\n ChildrenDef,\n ChildrenSchemaCallback,\n ColumnDef,\n CreateModelConfig,\n ModelCheckConfig,\n IndexBuilder,\n IndexCallback,\n IndexDef,\n IndexKey,\n UnsortedIndexKey,\n IndexOptions,\n IndexType,\n ModelDef,\n ModelPolicyConfig,\n PartialIndexDef,\n PredicateBuilder,\n SchemaDefinition,\n UniqueIndexOptions,\n} from \"./types.ts\";\n\n// ─── Type guards ──────────────────────────\n\nfunction isColumnDef(value: unknown): value is ColumnDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"column\"\n );\n}\n\nfunction isChildrenDef(value: unknown): value is ChildrenDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"children\"\n );\n}\n\n// ─── Index builder ────────────────────────\n\n/**\n * Creates the `i` handed to a model's `indexes` callback.\n *\n * @example\n * indexes: (i) => [\n * i.on(\"workspaceId\", \"name\"),\n * i.unique(\"workspaceId\", \"email\"),\n * i.gin(\"tags\"),\n * i.on([\"content\"], { type: \"Gist\" }),\n * ]\n */\nexport function createIndexBuilder<\n T extends string = string,\n TSchema extends SchemaDefinition = SchemaDefinition,\n>(): IndexBuilder<T, TSchema> {\n /**\n * Attach the terminal `.where()` so an index can still take a TYPED partial\n * predicate. It returns a plain `IndexDef`, so the chain cannot be reopened\n * and an index carries at most one predicate.\n */\n const partial = (index: IndexDef): PartialIndexDef<T, TSchema> => {\n const where = (predicate: (c: PredicateBuilder<T, TSchema>) => PredicateIR): IndexDef => {\n if (index.__where !== undefined) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Index on [${index.__columns.join(\", \")}] already carries a raw where: predicate — an index has ONE predicate, so use either the raw string or .where(), not both`,\n meta: { rule: \"predicate-duplicate-where\", columns: [...index.__columns] },\n });\n }\n return { ...index, __wherePredicate: predicate(createPredicateBuilder<T, TSchema>()) };\n };\n // NON-enumerable on purpose: an IndexDef is DATA. An enumerable method\n // would be copied by every `{ ...index }` spread, serialized by\n // JSON.stringify, and compared by every structural assertion — so the\n // builder's own affordance would leak into the value it builds.\n return Object.defineProperty({ ...index }, \"where\", {\n value: where,\n enumerable: false,\n writable: false,\n configurable: true,\n }) as PartialIndexDef<T, TSchema>;\n };\n\n const freeze = <TValue>(value: TValue): TValue => {\n if (value !== null && typeof value === \"object\") { for (const child of Object.values(value)) freeze(child); Object.freeze(value); }\n return value;\n };\n const keyTerms = (params: { readonly keys: readonly IndexKey[] }): Pick<IndexDef, \"__columns\" | \"__keys\"> => {\n if (params.keys.every((key) => typeof key === \"string\")) return { __columns: [...params.keys] as string[] };\n const terms: IndexKeyTermIR[] = params.keys.map((entry) => {\n const sorted = typeof entry === \"object\" && entry !== null && \"__type\" in entry && entry.__type === \"sortedIndexKey\";\n const key = sorted ? entry.key : entry;\n const direction = sorted ? { sort: entry.sort } : {};\n if (typeof key === \"string\") return { kind: \"field\", field: { name: key, ...direction } };\n if (typeof key === \"object\" && key !== null && \"__type\" in key && key.__type === \"rawIndexExpression\") {\n if (typeof key.text !== \"string\" || key.text.trim() === \"\" || key.text.includes(\"\\0\")) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"i.sql requires nonempty NUL-free scalar SQL\", meta: { rule: \"expression-index-raw-sql\" } });\n return { kind: \"raw\", sql: key.text, ...direction };\n }\n return { kind: \"expression\", expression: toPredicateExpression({ value: key, at: \"index key\" }), ...direction };\n });\n const computed = terms.some((term) => term.kind !== \"field\");\n return { __columns: computed ? [] : terms.flatMap((term) => term.kind === \"field\" ? [term.field.name] : []), __keys: freeze(terms) };\n };\n const scalar = createPredicateBuilder<T, TSchema>();\n const createIndex = (params: { keys: readonly IndexKey[]; type?: IndexType; where?: string; map?: string; ops?: IndexOptions[\"ops\"] }): IndexDef => ({\n __type: \"index\",\n ...keyTerms({ keys: params.keys }),\n __indexType: params.type,\n ...(params.map === undefined ? {} : { __map: params.map }),\n ...(params.where === undefined ? {} : { __where: params.where }),\n ...(params.ops === undefined ? {} : { __ops: params.ops }),\n });\n\n return {\n field: scalar.field,\n add: scalar.add,\n sub: scalar.sub,\n mul: scalar.mul,\n lower: ((value: unknown) => scalar.lower((typeof value === \"string\" ? scalar.field(value as T) : value) as Parameters<typeof scalar.lower>[0])) as IndexBuilder<T, TSchema>[\"lower\"],\n upper: ((value: unknown) => scalar.upper((typeof value === \"string\" ? scalar.field(value as T) : value) as Parameters<typeof scalar.upper>[0])) as IndexBuilder<T, TSchema>[\"upper\"],\n asc: (key: UnsortedIndexKey<T>) => ({ __type: \"sortedIndexKey\", key, sort: \"asc\" }),\n desc: (key: UnsortedIndexKey<T>) => ({ __type: \"sortedIndexKey\", key, sort: \"desc\" }),\n sql: ({ text }) => ({ __type: \"rawIndexExpression\", text }),\n /** Composite (or single-column) index; the array form takes options. */\n on(...args: IndexKey<T>[] | [IndexKey<T>[], IndexOptions<T>]): PartialIndexDef<T, TSchema> {\n const [first, second] = args;\n if (\n args.length === 2 &&\n Array.isArray(first) &&\n typeof second === \"object\" &&\n !Array.isArray(second)\n ) {\n const options = second as IndexOptions<T>;\n return partial(createIndex({ keys: first, type: options.type, where: options.where, map: options.map, ops: options.ops }));\n }\n return partial(createIndex({ keys: args as IndexKey[] }));\n },\n\n /** Alias of `on(...)`. */\n index(...keys: IndexKey<T>[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ keys }));\n },\n\n /** Unique constraint (`@@unique([...])`); the array form takes options (partial `where`). */\n unique(...args: IndexKey<T>[] | [IndexKey<T>[], UniqueIndexOptions]): PartialIndexDef<T, TSchema> {\n const [first, second] = args;\n if (\n args.length === 2 &&\n Array.isArray(first) &&\n typeof second === \"object\" &&\n !Array.isArray(second)\n ) {\n if (\"ops\" in second && second.ops !== undefined) {\n throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Custom unique operator classes can change client selector equality\", meta: { feature: \"uniqueIndexOperatorClasses\" } });\n }\n const options = second as UniqueIndexOptions;\n return partial({\n __type: \"unique\",\n ...keyTerms({ keys: first }),\n ...(options.map === undefined ? {} : { __map: options.map }),\n ...(options.where === undefined ? {} : { __where: options.where }),\n ...(options.nullsNotDistinct === true ? { __nullsNotDistinct: true } : {}),\n ...(options.name === undefined ? {} : { __clientName: options.name }),\n });\n }\n return partial({ __type: \"unique\", ...keyTerms({ keys: args as IndexKey[] }) });\n },\n\n /** GIN index — JSON, arrays, full-text (PostgreSQL). */\n gin<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ keys: columns, type: \"Gin\" }));\n },\n\n /** GiST index — geometric, range and full-text data (PostgreSQL). */\n gist<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ keys: columns, type: \"Gist\" }));\n },\n\n /** Hash index — equality lookups (PostgreSQL). */\n hash<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ keys: columns, type: \"Hash\" }));\n },\n\n /** BRIN index — large, naturally ordered tables (PostgreSQL). */\n brin<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex({ keys: columns, type: \"Brin\" }));\n },\n };\n}\n\n// ─── Schema processing ────────────────────\n\nfunction processSchema(params: {\n modelName: string;\n schema: SchemaDefinition | ChildrenSchemaCallback;\n}): { columns: Map<string, ColumnDef>; children: Map<string, ModelDef> } {\n const { modelName, schema } = params;\n const resolvedSchema = typeof schema === \"function\" ? schema(createChildrenBuilder()) : schema;\n\n const columns = new Map<string, ColumnDef>();\n const children = new Map<string, ModelDef>();\n\n for (const [key, value] of Object.entries(resolvedSchema)) {\n if (isColumnDef(value)) {\n // Clone so template-provided columns are never shared between models.\n const cloned = cloneColumnDef({ column: value });\n cloned.__name = key;\n columns.set(key, cloned);\n } else if (isChildrenDef(value)) {\n const childModel = create({ name: value.__name, schema: value.__schema });\n\n // The child carries the FK back to its parent.\n const parentFkName = toFkColumnName({ modelName });\n childModel.__columns.set(parentFkName, {\n __type: \"column\",\n __columnType: \"string\",\n __name: parentFkName,\n __config: { index: true },\n });\n\n children.set(key, childModel);\n }\n }\n\n return { columns, children };\n}\n\n// ─── Model factory ────────────────────────\n\n/**\n * Creates a model definition. `indexes` and `primaryKey` are constrained to\n * the model's own column names.\n */\nexport function create<const TSchema extends SchemaDefinition>(\n config: CreateModelConfig<TSchema>\n): ModelDef<TSchema> {\n const { columns, children } = processSchema({\n modelName: config.name,\n schema: config.schema,\n });\n\n return {\n __type: \"model\",\n __name: config.name,\n __schema: config.schema,\n __indexes: config.indexes as IndexCallback | undefined,\n __columns: columns,\n __children: children,\n __map: config.map,\n __primaryKey: config.primaryKey as string[] | undefined,\n // Same widening as `indexes` above: the config's callback is bound to THIS\n // model's columns, and the stored form is the erased one every consumer\n // reads. The type parameters have done their work at the call site.\n __exclusions: config.exclusions as ModelDef[\"__exclusions\"],\n __checks: config.checks as readonly ModelCheckConfig[] | ChecksCallback | undefined,\n __rowRules: config.rowRules as ModelDef[\"__rowRules\"],\n __extensions: config.extensions,\n __policy: config.policy as ModelPolicyConfig | undefined,\n __comment: config.comment,\n };\n}\n\n// ─── Model utilities ──────────────────────\n\n/** All column names of a model, in declaration order. */\nexport function getColumnNames(params: { model: ModelDef }): string[] {\n return Array.from(params.model.__columns.keys());\n}\n\n/** Runs a model's `indexes` callback, if it declared one. */\nexport function evaluateIndexes(params: { model: ModelDef }): IndexDef[] {\n const { model } = params;\n if (model.__indexes === undefined) {\n return [];\n }\n return model.__indexes(createIndexBuilder<string, SchemaDefinition>());\n}\n",
13
14
  "/**\n * Naming helpers shared by the model builder, the Prisma generator and the\n * IR compiler. Both output paths must agree on every derived name, so they\n * live here rather than being re-derived per consumer.\n */\n\n// ─── Case helpers ─────────────────────────\n\n/** `\"status\"` → `\"Status\"` — used to build derived type names, never field names. */\nexport function capitalize(params: { value: string }): string {\n const { value } = params;\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\n/** `\"Order\"` → `\"order\"`. */\nexport function uncapitalize(params: { value: string }): string {\n const { value } = params;\n return value.charAt(0).toLowerCase() + value.slice(1);\n}\n\n// ─── Derived names ────────────────────────\n\n/** Foreign-key column a child model gets for its parent: `\"Order\"` → `\"orderId\"`. */\nexport function toFkColumnName(params: { modelName: string }): string {\n return `${uncapitalize({ value: params.modelName })}Id`;\n}\n\n/** Name generated for an inline enum: model `User` + column `status` → `UserStatus`. */\nexport function inlineEnumName(params: { modelName: string; columnName: string }): string {\n const { modelName, columnName } = params;\n return `${modelName}${capitalize({ value: columnName })}`;\n}\n",
14
15
  "/**\n * Children builder for inline nested models. Relations proper are declared\n * separately through `defineRelations`; `children()` only exists so a model\n * can spawn an owned child model (with an automatic FK back to the parent).\n *\n * @example\n * const Order = dsl.create({\n * name: \"Order\",\n * schema: (s) => ({\n * id: dsl.id(),\n * Items: s.children({\n * name: \"OrderItem\",\n * schema: { id: dsl.id(), quantity: dsl.int() },\n * }),\n * }),\n * });\n */\n\nimport type { ChildrenBuilder, ChildrenDef, ChildrenRelationConfig } from \"./types.ts\";\n\n// ─── Children builder ─────────────────────\n\n/** Declares an inline child model owned by the enclosing model. */\nexport function children(config: ChildrenRelationConfig): ChildrenDef {\n return {\n __type: \"children\",\n __name: config.name,\n __schema: config.schema,\n };\n}\n\n/** Creates the `s` handed to a model's schema callback. */\nexport function createChildrenBuilder(): ChildrenBuilder {\n return { children };\n}\n",
15
- "/**\n * Centralized relation declarations (Drizzle-style): every relation lives in\n * one place and points at real columns, so a rename is a type error.\n *\n * @example\n * const relations = dsl.defineRelations({ User, Post }, (r) => ({\n * User: { posts: r.many.Post({ from: r.User.id, to: r.Post.authorId }) },\n * Post: { author: r.one.User({ from: r.Post.authorId, to: r.User.id }) },\n * }));\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type {\n ColumnRef,\n ColumnRefKind,\n ColumnType,\n ManyRelationDefConfig,\n ModelDef,\n MergedRelations,\n OneRelationDefConfig,\n RelationRefInput,\n RelationsBuilder,\n RelationsMap,\n RelationsOutput,\n StoredRelationDef,\n ThroughRef,\n} from \"./types.ts\";\n\n/** The value twin of the type-level `ColumnRefKindOf` table. */\nconst REF_KIND_BY_COLUMN_TYPE: Readonly<Record<ColumnType, ColumnRefKind>> = {\n string: \"String\",\n int: \"Int\",\n bigint: \"BigInt\",\n float: \"Float\",\n decimal: \"Decimal\",\n boolean: \"Boolean\",\n datetime: \"DateTime\",\n json: \"Json\",\n bytes: \"Bytes\",\n id: \"Id\",\n enum: \"Enum\",\n unsupported: \"Unsupported\",\n};\n\n// ─── Column references ────────────────────\n\nfunction createColumnRef<TModel extends string, TColumn extends string>(params: {\n model: TModel;\n column: TColumn;\n kind: ColumnRefKind;\n}): ColumnRef<TModel, TColumn> {\n const { model, column, kind } = params;\n return {\n __type: \"columnRef\",\n __model: model,\n __column: column,\n __kind: kind,\n through<TJunction extends string, TJunctionCol extends string>(\n junction: ColumnRef<TJunction, TJunctionCol>\n ): ThroughRef<TModel, TColumn, TJunction, TJunctionCol> {\n return {\n __type: \"throughRef\",\n __model: model,\n __column: column,\n __junction: junction.__model,\n __junctionColumn: junction.__column,\n };\n },\n };\n}\n\n/**\n * One relation end, flattened. A single reference and a one-member tuple are\n * the same relation — `columns` is authoritative and `model` is the ONE model\n * every member sits on. A tuple straddling two models is refused here, at the\n * earliest point where the mistake is visible.\n */\nfunction extractRefInfo(params: { ref: RelationRefInput; side: \"from\" | \"to\"; target: string }): {\n model: string;\n columns: readonly string[];\n} {\n const { ref, side, target } = params;\n if (!Array.isArray(ref)) {\n const single = ref as ColumnRef | ThroughRef;\n return { model: single.__model, columns: [single.__column] };\n }\n const members: readonly ColumnRef[] = ref;\n if (members.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" is an empty tuple — name at least one column`,\n meta: { rule: \"relation-empty-tuple\", side, targetModel: target },\n });\n }\n const models = [...new Set(members.map((member) => member.__model))].sort();\n if (models.length > 1) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" mixes models ${models.join(\", \")} — every member of a composite key must sit on one model`,\n meta: { rule: \"relation-mixed-models\", side, targetModel: target, models },\n });\n }\n if (members.some((member) => member.__type !== \"columnRef\")) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" routes through a junction inside a tuple — implicit many-to-many is single-key; model the join with an explicit junction model`,\n meta: { rule: \"relation-through-in-tuple\", side, targetModel: target },\n });\n }\n return { model: members[0]!.__model, columns: members.map((member) => member.__column) };\n}\n\n// ─── Relation factory ─────────────────────\n\nfunction createRelationFactory(params: {\n relationType: \"one\" | \"many\";\n targetModelName: string;\n}): (config: OneRelationDefConfig | ManyRelationDefConfig) => StoredRelationDef {\n const { relationType, targetModelName } = params;\n\n return (config) => {\n const from = extractRefInfo({ ref: config.from, side: \"from\", target: targetModelName });\n const to = extractRefInfo({ ref: config.to, side: \"to\", target: targetModelName });\n if (from.columns.length !== to.columns.length) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${targetModelName}: \"from\" names ${from.columns.length} column(s) but \"to\" names ${to.columns.length} — a composite key pairs member by member`,\n meta: { rule: \"relation-tuple-arity\", targetModel: targetModelName, from: from.columns, to: to.columns },\n });\n }\n\n let throughJunction: string | undefined;\n let throughFromCol: string | undefined;\n let throughToCol: string | undefined;\n\n const fromRef = Array.isArray(config.from) ? undefined : (config.from as ColumnRef | ThroughRef);\n const toRef = Array.isArray(config.to) ? undefined : (config.to as ColumnRef | ThroughRef);\n if (fromRef?.__type === \"throughRef\") {\n throughJunction = fromRef.__junction;\n throughFromCol = fromRef.__junctionColumn;\n }\n if (toRef?.__type === \"throughRef\") {\n throughJunction = throughJunction ?? toRef.__junction;\n throughToCol = toRef.__junctionColumn;\n }\n\n return {\n __type: \"storedRelation\",\n __relationType: relationType,\n __targetModel: targetModelName,\n __fromModel: from.model,\n __fromColumn: from.columns[0]!,\n __fromColumns: from.columns,\n __toModel: to.model,\n __toColumn: to.columns[0]!,\n __toColumns: to.columns,\n __throughJunction: throughJunction,\n __throughFromCol: throughFromCol,\n __throughToCol: throughToCol,\n __optional: config.optional ?? relationType === \"many\",\n __alias: config.alias,\n ...(config.constraintName === undefined ? {} : { __constraintName: config.constraintName }),\n ...(\"ownsForeignKey\" in config ? { __ownsForeignKey: config.ownsForeignKey } : {}),\n __onDelete: config.onDelete,\n __onUpdate: config.onUpdate,\n };\n };\n}\n\n// ─── Builder ──────────────────────────────\n\nfunction createRelationsBuilder<TSchema extends Record<string, ModelDef>>(params: {\n models: TSchema;\n}): RelationsBuilder<TSchema> {\n const { models } = params;\n const builder: Record<string, unknown> = {};\n\n const oneObj: Record<string, (config: OneRelationDefConfig) => StoredRelationDef> = {};\n const manyObj: Record<string, (config: ManyRelationDefConfig) => StoredRelationDef> = {};\n\n for (const modelName of Object.keys(models)) {\n oneObj[modelName] = createRelationFactory({ relationType: \"one\", targetModelName: modelName });\n manyObj[modelName] = createRelationFactory({\n relationType: \"many\",\n targetModelName: modelName,\n });\n\n const model = models[modelName];\n if (model === undefined) continue;\n\n const columnRefs: Record<string, ColumnRef> = {};\n for (const [columnName, column] of model.__columns) {\n columnRefs[columnName] = createColumnRef({\n model: modelName,\n column: columnName,\n kind: REF_KIND_BY_COLUMN_TYPE[column.__columnType],\n });\n }\n builder[modelName] = columnRefs;\n }\n\n builder.one = oneObj;\n builder.many = manyObj;\n\n return builder as RelationsBuilder<TSchema>;\n}\n\nfunction processRelationsOutput<TSchema extends Record<string, ModelDef>>(params: {\n output: RelationsOutput<TSchema>;\n}): RelationsMap {\n const result: RelationsMap = {};\n for (const [modelName, relations] of Object.entries(params.output)) {\n if (relations) {\n result[modelName] = relations;\n }\n }\n return result;\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Declares every relation of a schema in one place.\n *\n * @example\n * const relations = dsl.defineRelations({ User, Post }, (r) => ({\n * User: { posts: r.many.Post({ from: r.User.id, to: r.Post.authorId }) },\n * Post: { author: r.one.User({ from: r.Post.authorId, to: r.User.id }) },\n * }));\n */\nexport function defineRelations<TSchema extends Record<string, ModelDef>, const TOutput extends RelationsMap>(\n models: TSchema,\n callback: (r: RelationsBuilder<TSchema>) => TOutput & RelationsOutput<TSchema>\n): TOutput {\n const builder = createRelationsBuilder({ models });\n return processRelationsOutput({ output: callback(builder) }) as TOutput;\n}\n\n/**\n * Declares part of a schema's relations, so large schemas can split them\n * across files and combine them with `mergeRelations`.\n */\nexport function defineRelationsPart<TSchema extends Record<string, ModelDef>, const TOutput extends RelationsMap>(\n models: TSchema,\n callback: (r: RelationsBuilder<TSchema>) => TOutput & Partial<RelationsOutput<TSchema>>\n): TOutput {\n const builder = createRelationsBuilder({ models });\n return processRelationsOutput({ output: callback(builder) }) as TOutput;\n}\n\n/** Merges relation parts; later parts win on a per-relation basis. */\nexport function mergeRelations<const TParts extends readonly RelationsMap[]>(...parts: TParts): MergedRelations<TParts> {\n const result: RelationsMap = {};\n\n for (const part of parts) {\n for (const [modelName, relations] of Object.entries(part)) {\n const existing = result[modelName] ?? {};\n result[modelName] = { ...existing, ...relations };\n }\n }\n\n return result as MergedRelations<TParts>;\n}\n",
16
+ "/**\n * Centralized relation declarations (Drizzle-style): every relation lives in\n * one place and points at real columns, so a rename is a type error.\n *\n * @example\n * const relations = dsl.defineRelations({ User, Post }, (r) => ({\n * User: { posts: r.many.Post({ from: r.User.id, to: r.Post.authorId }) },\n * Post: { author: r.one.User({ from: r.Post.authorId, to: r.User.id }) },\n * }));\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\nimport type {\n ColumnRef,\n ColumnRefKind,\n ColumnType,\n ManyRelationDefConfig,\n ModelDef,\n MergedRelations,\n OneRelationDefConfig,\n RelationRefInput,\n RelationsBuilder,\n RelationsMap,\n RelationsOutput,\n StoredRelationDef,\n ThroughRef,\n} from \"./types.ts\";\n\n/** The value twin of the type-level `ColumnRefKindOf` table. */\nconst REF_KIND_BY_COLUMN_TYPE: Readonly<Record<ColumnType, ColumnRefKind>> = {\n string: \"String\",\n localDate: \"String\",\n int: \"Int\",\n bigint: \"BigInt\",\n float: \"Float\",\n decimal: \"Decimal\",\n boolean: \"Boolean\",\n datetime: \"DateTime\",\n json: \"Json\",\n bytes: \"Bytes\",\n id: \"Id\",\n enum: \"Enum\",\n unsupported: \"Unsupported\",\n};\n\n// ─── Column references ────────────────────\n\nfunction createColumnRef<TModel extends string, TColumn extends string>(params: {\n model: TModel;\n column: TColumn;\n kind: ColumnRefKind;\n}): ColumnRef<TModel, TColumn> {\n const { model, column, kind } = params;\n return {\n __type: \"columnRef\",\n __model: model,\n __column: column,\n __kind: kind,\n through<TJunction extends string, TJunctionCol extends string>(\n junction: ColumnRef<TJunction, TJunctionCol>\n ): ThroughRef<TModel, TColumn, TJunction, TJunctionCol> {\n return {\n __type: \"throughRef\",\n __model: model,\n __column: column,\n __junction: junction.__model,\n __junctionColumn: junction.__column,\n };\n },\n };\n}\n\n/**\n * One relation end, flattened. A single reference and a one-member tuple are\n * the same relation — `columns` is authoritative and `model` is the ONE model\n * every member sits on. A tuple straddling two models is refused here, at the\n * earliest point where the mistake is visible.\n */\nfunction extractRefInfo(params: { ref: RelationRefInput; side: \"from\" | \"to\"; target: string }): {\n model: string;\n columns: readonly string[];\n} {\n const { ref, side, target } = params;\n if (!Array.isArray(ref)) {\n const single = ref as ColumnRef | ThroughRef;\n return { model: single.__model, columns: [single.__column] };\n }\n const members: readonly ColumnRef[] = ref;\n if (members.length === 0) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" is an empty tuple — name at least one column`,\n meta: { rule: \"relation-empty-tuple\", side, targetModel: target },\n });\n }\n const models = [...new Set(members.map((member) => member.__model))].sort();\n if (models.length > 1) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" mixes models ${models.join(\", \")} — every member of a composite key must sit on one model`,\n meta: { rule: \"relation-mixed-models\", side, targetModel: target, models },\n });\n }\n if (members.some((member) => member.__type !== \"columnRef\")) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${target}: \"${side}\" routes through a junction inside a tuple — implicit many-to-many is single-key; model the join with an explicit junction model`,\n meta: { rule: \"relation-through-in-tuple\", side, targetModel: target },\n });\n }\n return { model: members[0]!.__model, columns: members.map((member) => member.__column) };\n}\n\n// ─── Relation factory ─────────────────────\n\nfunction createRelationFactory(params: {\n relationType: \"one\" | \"many\";\n targetModelName: string;\n}): (config: OneRelationDefConfig | ManyRelationDefConfig) => StoredRelationDef {\n const { relationType, targetModelName } = params;\n\n return (config) => {\n const from = extractRefInfo({ ref: config.from, side: \"from\", target: targetModelName });\n const to = extractRefInfo({ ref: config.to, side: \"to\", target: targetModelName });\n if (from.columns.length !== to.columns.length) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Relation to ${targetModelName}: \"from\" names ${from.columns.length} column(s) but \"to\" names ${to.columns.length} — a composite key pairs member by member`,\n meta: { rule: \"relation-tuple-arity\", targetModel: targetModelName, from: from.columns, to: to.columns },\n });\n }\n\n let throughJunction: string | undefined;\n let throughFromCol: string | undefined;\n let throughToCol: string | undefined;\n\n const fromRef = Array.isArray(config.from) ? undefined : (config.from as ColumnRef | ThroughRef);\n const toRef = Array.isArray(config.to) ? undefined : (config.to as ColumnRef | ThroughRef);\n if (fromRef?.__type === \"throughRef\") {\n throughJunction = fromRef.__junction;\n throughFromCol = fromRef.__junctionColumn;\n }\n if (toRef?.__type === \"throughRef\") {\n throughJunction = throughJunction ?? toRef.__junction;\n throughToCol = toRef.__junctionColumn;\n }\n\n return {\n __type: \"storedRelation\",\n __relationType: relationType,\n __targetModel: targetModelName,\n __fromModel: from.model,\n __fromColumn: from.columns[0]!,\n __fromColumns: from.columns,\n __toModel: to.model,\n __toColumn: to.columns[0]!,\n __toColumns: to.columns,\n __throughJunction: throughJunction,\n __throughFromCol: throughFromCol,\n __throughToCol: throughToCol,\n __optional: config.optional ?? relationType === \"many\",\n __alias: config.alias,\n ...(config.constraintName === undefined ? {} : { __constraintName: config.constraintName }),\n ...(\"ownsForeignKey\" in config ? { __ownsForeignKey: config.ownsForeignKey } : {}),\n __onDelete: config.onDelete,\n __onUpdate: config.onUpdate,\n };\n };\n}\n\n// ─── Builder ──────────────────────────────\n\nfunction createRelationsBuilder<TSchema extends Record<string, ModelDef>>(params: {\n models: TSchema;\n}): RelationsBuilder<TSchema> {\n const { models } = params;\n const builder: Record<string, unknown> = {};\n\n const oneObj: Record<string, (config: OneRelationDefConfig) => StoredRelationDef> = {};\n const manyObj: Record<string, (config: ManyRelationDefConfig) => StoredRelationDef> = {};\n\n for (const modelName of Object.keys(models)) {\n oneObj[modelName] = createRelationFactory({ relationType: \"one\", targetModelName: modelName });\n manyObj[modelName] = createRelationFactory({\n relationType: \"many\",\n targetModelName: modelName,\n });\n\n const model = models[modelName];\n if (model === undefined) continue;\n\n const columnRefs: Record<string, ColumnRef> = {};\n for (const [columnName, column] of model.__columns) {\n columnRefs[columnName] = createColumnRef({\n model: modelName,\n column: columnName,\n kind: REF_KIND_BY_COLUMN_TYPE[column.__columnType],\n });\n }\n builder[modelName] = columnRefs;\n }\n\n builder.one = oneObj;\n builder.many = manyObj;\n\n return builder as RelationsBuilder<TSchema>;\n}\n\nfunction processRelationsOutput<TSchema extends Record<string, ModelDef>>(params: {\n output: RelationsOutput<TSchema>;\n}): RelationsMap {\n const result: RelationsMap = {};\n for (const [modelName, relations] of Object.entries(params.output)) {\n if (relations) {\n result[modelName] = relations;\n }\n }\n return result;\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Declares every relation of a schema in one place.\n *\n * @example\n * const relations = dsl.defineRelations({ User, Post }, (r) => ({\n * User: { posts: r.many.Post({ from: r.User.id, to: r.Post.authorId }) },\n * Post: { author: r.one.User({ from: r.Post.authorId, to: r.User.id }) },\n * }));\n */\nexport function defineRelations<TSchema extends Record<string, ModelDef>, const TOutput extends RelationsMap>(\n models: TSchema,\n callback: (r: RelationsBuilder<TSchema>) => TOutput & RelationsOutput<TSchema>\n): TOutput {\n const builder = createRelationsBuilder({ models });\n return processRelationsOutput({ output: callback(builder) }) as TOutput;\n}\n\n/**\n * Declares part of a schema's relations, so large schemas can split them\n * across files and combine them with `mergeRelations`.\n */\nexport function defineRelationsPart<TSchema extends Record<string, ModelDef>, const TOutput extends RelationsMap>(\n models: TSchema,\n callback: (r: RelationsBuilder<TSchema>) => TOutput & Partial<RelationsOutput<TSchema>>\n): TOutput {\n const builder = createRelationsBuilder({ models });\n return processRelationsOutput({ output: callback(builder) }) as TOutput;\n}\n\n/** Merges relation parts; later parts win on a per-relation basis. */\nexport function mergeRelations<const TParts extends readonly RelationsMap[]>(...parts: TParts): MergedRelations<TParts> {\n const result: RelationsMap = {};\n\n for (const part of parts) {\n for (const [modelName, relations] of Object.entries(part)) {\n const existing = result[modelName] ?? {};\n result[modelName] = { ...existing, ...relations };\n }\n }\n\n return result as MergedRelations<TParts>;\n}\n",
16
17
  "/**\n * Schema composer — combines models, standalone enums and relations into the\n * `SchemaDef` that `toIR()` and `generate.prisma()` both consume.\n *\n * @example\n * const schema = dsl.schema({ User, Workspace }, { relations });\n *\n * @example\n * // grouped by domain, plus a standalone enum\n * const schema = dsl.schema({\n * Status,\n * shipping: { Carrier, CarrierService },\n * }, { relations });\n */\n\nimport { VibeError, validateRlsContextIR } from \"@vibeorm/schema\";\nimport type { EnumStorage, RlsContextFieldIR, RlsContextRefIR, RlsPolicyIR, RlsContextScalar } from \"@vibeorm/schema\";\nimport { inlineEnumName } from \"./naming.ts\";\nimport type { ColumnDef, DefineRlsOptions, EnumDef, ModelDef, RelationsMap, RlsColumnKind, RlsContextRefs, RlsDef, SchemaDef, SchemaInput } from \"./types.ts\";\n\n// ─── Enum registry ────────────────────────\n\n/** One logical enum as the composer sees it: members plus physical storage. */\ntype EnumEntry = {\n readonly values: readonly string[];\n readonly storage: EnumStorage;\n};\n\nfunction sameValues(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\n/**\n * Registers an enum under its name. Reusing a name is fine when the\n * definitions AGREE (same members in the same order, same storage) — that is\n * how one enum object shared across modules, or an identical re-declaration,\n * composes. Conflicting members or storage is a HARD failure: silently\n * keeping one of the two definitions would change what a column accepts (or\n * how it is stored) depending on module load order.\n */\nfunction registerEnum(params: {\n registry: Map<string, EnumEntry>;\n name: string;\n entry: EnumEntry;\n /** Where this definition came from, for the error message. */\n origin: string;\n}): void {\n const { registry, name, entry, origin } = params;\n const existing = registry.get(name);\n if (existing === undefined) {\n registry.set(name, entry);\n return;\n }\n const valuesDiffer = !sameValues(existing.values, entry.values);\n const storageDiffers = existing.storage !== entry.storage;\n if (!valuesDiffer && !storageDiffers) return;\n\n const detail = [\n ...(valuesDiffer\n ? [`values [${existing.values.join(\", \")}] vs [${entry.values.join(\", \")}]`]\n : []),\n ...(storageDiffers ? [`storage \"${existing.storage}\" vs \"${entry.storage}\"`] : []),\n ].join(\"; \");\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Enum \"${name}\" is defined more than once with conflicting definitions (${origin}): ${detail} — share one enum object across modules, or give the definitions different names`,\n meta: {\n issues: [\n {\n rule: \"enum-conflict\",\n message: `Enum \"${name}\" reused with conflicting ${valuesDiffer ? \"values\" : \"storage\"} (${origin})`,\n },\n ],\n enum: name,\n existing,\n incoming: entry,\n },\n });\n}\n\n// ─── Options ──────────────────────────────\n\nexport type SchemaOptions = {\n /** Relations produced by `defineRelations()` / `mergeRelations()`. */\n relations?: RelationsMap;\n /** Native RLS metadata from `defineRls()`. */\n rls?: RlsDef;\n};\n\n// ─── Type guards ──────────────────────────\n\nfunction isModelDef(value: unknown): value is ModelDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"model\"\n );\n}\n\nfunction isEnumDef(value: unknown): value is EnumDef {\n return (\n typeof value === \"object\" && value !== null && \"__type\" in value && value.__type === \"enum\"\n );\n}\n\n// ─── Extraction ───────────────────────────\n\n/**\n * Registers a model and, recursively, every inline child model it owns.\n *\n * Registration is keyed by logical model name, so two DIFFERENT definitions\n * under one name used to overwrite each other silently — whichever module was\n * listed last won, and the columns of the other simply vanished before\n * `assertValidSchemaIR` (which only ever saw one of them) could object.\n * Reusing the SAME object stays legal: that is how one model shared across\n * modules, or listed twice in a grouped input, composes.\n */\nfunction addModelTree(params: { model: ModelDef; models: Map<string, ModelDef>; origin: string }): void {\n const { model, models, origin } = params;\n const existing = models.get(model.__name);\n if (existing !== undefined && existing !== model) {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message:\n `Model \"${model.__name}\" is defined more than once with different definitions (${origin}) — ` +\n `share one model object across modules, or give the definitions different names`,\n meta: {\n issues: [\n {\n rule: \"model-conflict\",\n message: `Model \"${model.__name}\" reused with a different definition (${origin})`,\n model: model.__name,\n },\n ],\n model: model.__name,\n },\n });\n }\n models.set(model.__name, model);\n for (const childModel of model.__children.values()) {\n addModelTree({ model: childModel, models, origin: `inline child of ${model.__name}` });\n }\n}\n\nfunction extractModelsAndEnums(params: {\n input: SchemaInput;\n models: Map<string, ModelDef>;\n enums: Map<string, EnumEntry>;\n}): void {\n const { input, models, enums } = params;\n\n for (const value of Object.values(input)) {\n if (isModelDef(value)) {\n addModelTree({ model: value, models, origin: \"listed in dsl.schema()\" });\n } else if (isEnumDef(value)) {\n registerEnum({\n registry: enums,\n name: value.__name,\n entry: { values: value.__options, storage: value.__storage },\n origin: \"standalone enum listed in dsl.schema()\",\n });\n } else if (typeof value === \"object\" && value !== null) {\n extractModelsAndEnums({ input: value as SchemaInput, models, enums });\n }\n }\n}\n\n/**\n * Collects every enum the schema needs: the standalone ones plus one per\n * inline enum column, named `${Model}${Column}`. The resolved name is written\n * back onto the column so both output paths reference the same enum. Every\n * registration goes through `registerEnum`, so a name reused with different\n * members or storage — across modules, or an inline enum whose derived name\n * lands on a standalone one — fails instead of silently picking one.\n */\nfunction resolveEnums(params: { models: Map<string, ModelDef>; enums: Map<string, EnumEntry> }): void {\n const { models, enums } = params;\n\n for (const [modelName, model] of models) {\n for (const [columnName, column] of model.__columns) {\n if (column.__columnType !== \"enum\" || column.__enumValues === undefined) continue;\n const entry: EnumEntry = {\n values: column.__enumValues,\n storage: column.__enumStorage ?? \"database\",\n };\n\n if (column.__enumName !== undefined) {\n registerEnum({\n registry: enums,\n name: column.__enumName,\n entry,\n origin: `standalone enum used by ${modelName}.${columnName}`,\n });\n continue;\n }\n\n const name = inlineEnumName({ modelName, columnName });\n registerEnum({\n registry: enums,\n name,\n entry,\n origin: `inline enum on ${modelName}.${columnName}, named ${name}`,\n });\n column.__enumName = name;\n }\n }\n}\n\n// ─── Native RLS declaration ────────────────\n\nconst RLS_CONTEXT_TYPES: Readonly<Record<RlsColumnKind, RlsContextScalar>> = {\n string: \"String\", boolean: \"Boolean\", int: \"Int\", bigint: \"BigInt\",\n float: \"Float\", decimal: \"Decimal\", datetime: \"DateTime\",\n};\n\n/** Builds metadata at schema-load time, never a per-row JavaScript predicate. */\nexport function defineRls<\n TModels extends Record<string, ModelDef>,\n const TRelations extends RelationsMap,\n const TContext extends Record<string, ColumnDef<RlsColumnKind>>,\n>(params: DefineRlsOptions<TModels, TRelations, TContext>): RlsDef {\n if (typeof params.context !== \"object\" || params.context === null || Array.isArray(params.context)) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"RLS context must be a record of scalar declarations\", meta: { issues: [{ rule: \"rls-invalid-context\" }] } });\n }\n const entries: [string, RlsContextFieldIR][] = [];\n const refs: [string, RlsContextRefIR][] = [];\n for (const key of Reflect.ownKeys(params.context)) {\n const descriptor = Object.getOwnPropertyDescriptor(params.context, key);\n const column: unknown = descriptor?.value;\n if (typeof key !== \"string\" || descriptor?.enumerable !== true ||\n typeof column !== \"object\" || column === null || !(\"__columnType\" in column) ||\n !(\"__config\" in column) || typeof column.__config !== \"object\" || column.__config === null ||\n typeof column.__columnType !== \"string\" || !Object.hasOwn(RLS_CONTEXT_TYPES, column.__columnType) ||\n (\"array\" in column.__config && column.__config.array === true)) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"RLS context slots must be named scalar column declarations\", meta: { issues: [{ rule: \"rls-invalid-context\" }] } });\n }\n entries.push([key, { type: RLS_CONTEXT_TYPES[column.__columnType as RlsColumnKind], nullable: \"optional\" in column.__config && column.__config.optional === true }]);\n refs.push([key, Object.freeze({ context: key })]);\n }\n const context = Object.freeze(Object.fromEntries(entries));\n const issues = validateRlsContextIR({ context });\n if (issues.length > 0) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Invalid RLS context declaration\", meta: { issues } });\n }\n const policies = params.policies({ context: Object.freeze(Object.fromEntries(refs)) as RlsContextRefs<TContext> });\n if (typeof policies !== \"object\" || policies === null || Array.isArray(policies)) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"RLS policies must be a record of model classifications\", meta: { issues: [{ rule: \"rls-invalid-rule\" }] } });\n }\n // Preserve raw policy shapes for the shared IR validator, but never drop a\n // classification while translating model-map keys to logical model names.\n const named: [string, RlsPolicyIR][] = [];\n const classified = new Set<string>();\n for (const key of Reflect.ownKeys(policies)) {\n const descriptor = Object.getOwnPropertyDescriptor(policies, key);\n if (typeof key !== \"string\" || descriptor?.enumerable !== true || !(\"value\" in descriptor)) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"RLS policies must be named data properties\", meta: { issues: [{ rule: \"rls-invalid-rule\" }] } });\n }\n const name = params.models[key]?.__name ?? key;\n if (classified.has(name)) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `RLS classifies model \"${name}\" more than once`, meta: { issues: [{ rule: \"rls-duplicate-classification\", model: name }] } });\n }\n classified.add(name);\n named.push([name, descriptor.value as RlsPolicyIR]);\n }\n return { context, policies: Object.fromEntries(named) };\n}\n\n// ─── Public API ───────────────────────────\n\n/**\n * Composes a schema from models (optionally grouped), standalone enums and\n * the relations declared by `defineRelations()`.\n */\nexport function schema(input: SchemaInput, options?: SchemaOptions): SchemaDef {\n const models = new Map<string, ModelDef>();\n const enums = new Map<string, EnumEntry>();\n\n extractModelsAndEnums({ input, models, enums });\n resolveEnums({ models, enums });\n\n return {\n __type: \"schema\",\n __models: models,\n __enums: new Map(Array.from(enums, ([name, entry]) => [name, entry.values])),\n __enumStorage: new Map(Array.from(enums, ([name, entry]) => [name, entry.storage])),\n __relations: options?.relations ?? {},\n ...(options?.rls === undefined ? {} : { __rls: options.rls }),\n };\n}\n\n/**\n * Groups models under a domain name, for organising large schemas.\n *\n * @example\n * const shipping = dsl.domain({ name: \"Shipping\", models: { Carrier } });\n */\nexport function domain(params: { name: string; models: Record<string, ModelDef> }): {\n name: string;\n models: Record<string, ModelDef>;\n} {\n const { name, models } = params;\n return { name, models };\n}\n",
17
18
  "/**\n * Built-in column templates for common model shapes.\n *\n * Every member is a getter, so each spread produces fresh column instances and\n * two models never share mutable column state.\n *\n * @example\n * const User = dsl.create({\n * name: \"User\",\n * schema: { ...dsl.templates.base, email: dsl.string().unique() },\n * });\n */\n\nimport { boolean, datetime, id, json, string } from \"./column.ts\";\nimport type {\n ChainableColumn,\n ChainableDatetimeColumn,\n ChainableIdColumn,\n ChainableStringColumn,\n} from \"./column.ts\";\n\n// ─── Template shapes ──────────────────────\n\nexport type BaseTemplate = {\n readonly id: ChainableIdColumn;\n readonly createdAt: ChainableDatetimeColumn;\n readonly updatedAt: ChainableDatetimeColumn;\n readonly deletedAt: ChainableDatetimeColumn;\n};\n\nexport type BaseWithWorkspaceTemplate = BaseTemplate & {\n readonly workspaceId: ChainableStringColumn;\n};\n\nexport type MetadataTemplate = {\n readonly metadata: ChainableColumn<\"json\">;\n readonly settings: ChainableColumn<\"json\">;\n};\n\nexport type ActiveTemplate = {\n readonly isActive: ChainableColumn<\"boolean\">;\n};\n\nexport type AuditTemplate = {\n readonly createdById: ChainableStringColumn;\n readonly updatedById: ChainableStringColumn;\n};\n\nexport type ExternalIdTemplate = {\n readonly externalId: ChainableStringColumn;\n};\n\nexport type NameDescriptionTemplate = {\n readonly name: ChainableStringColumn;\n readonly description: ChainableStringColumn;\n};\n\nexport type FieldsTemplate = {\n readonly datetime: ChainableDatetimeColumn;\n readonly id: ChainableIdColumn;\n readonly title: ChainableStringColumn;\n readonly description: ChainableStringColumn;\n readonly externalId: ChainableStringColumn;\n readonly metadata: ChainableColumn<\"json\">;\n readonly settings: ChainableColumn<\"json\">;\n readonly isActive: ChainableColumn<\"boolean\">;\n};\n\nexport type TemplatesApi = {\n readonly base: BaseTemplate;\n readonly baseWithWorkspace: BaseWithWorkspaceTemplate;\n readonly withMetadata: MetadataTemplate;\n readonly withActive: ActiveTemplate;\n readonly withAudit: AuditTemplate;\n readonly withExternalId: ExternalIdTemplate;\n readonly withNameDescription: NameDescriptionTemplate;\n readonly fields: FieldsTemplate;\n};\n\n// ─── Base templates ───────────────────────\n\n/** `id` (ULID), `createdAt`, `updatedAt`, `deletedAt`. */\nexport const base: BaseTemplate = {\n get id() {\n return id({ type: \"ulid\" });\n },\n get createdAt() {\n return datetime({ default: \"now\", tz: true, index: true });\n },\n get updatedAt() {\n return datetime({ default: \"now\", updatedAt: true, tz: true, index: true });\n },\n get deletedAt() {\n return datetime({ optional: true, index: true });\n },\n};\n\n/** `base` plus an indexed `workspaceId`. */\nexport const baseWithWorkspace: BaseWithWorkspaceTemplate = {\n get id() {\n return id({ type: \"ulid\" });\n },\n get createdAt() {\n return datetime({ default: \"now\", tz: true, index: true });\n },\n get updatedAt() {\n return datetime({ default: \"now\", updatedAt: true, tz: true, index: true });\n },\n get deletedAt() {\n return datetime({ optional: true, index: true });\n },\n get workspaceId() {\n return string({ index: true });\n },\n};\n\n// ─── Mixins ───────────────────────────────\n\n/** Optional `metadata` / `settings` JSON columns. */\nexport const withMetadata: MetadataTemplate = {\n get metadata() {\n return json({ optional: true });\n },\n get settings() {\n return json({ optional: true });\n },\n};\n\n/** `isActive` boolean defaulting to true. */\nexport const withActive: ActiveTemplate = {\n get isActive() {\n return boolean({ default: true });\n },\n};\n\n/** Optional, indexed `createdById` / `updatedById`. */\nexport const withAudit: AuditTemplate = {\n get createdById() {\n return string({ optional: true, index: true });\n },\n get updatedById() {\n return string({ optional: true, index: true });\n },\n};\n\n/** Indexed `externalId` for integrations. */\nexport const withExternalId: ExternalIdTemplate = {\n get externalId() {\n return string({ index: true });\n },\n};\n\n/** `name` plus optional `description`. */\nexport const withNameDescription: NameDescriptionTemplate = {\n get name() {\n return string();\n },\n get description() {\n return string({ optional: true });\n },\n};\n\n// ─── Individual fields ────────────────────\n\n/** Pre-configured single columns, for cherry-picking. */\nexport const fields: FieldsTemplate = {\n get datetime() {\n return datetime({ default: \"now\", updatedAt: true, tz: true, index: true });\n },\n get id() {\n return id({ type: \"ulid\" });\n },\n get title() {\n return string();\n },\n get description() {\n return string({ optional: true });\n },\n get externalId() {\n return string({ index: true });\n },\n get metadata() {\n return json({ optional: true });\n },\n get settings() {\n return json({ optional: true });\n },\n get isActive() {\n return boolean({ default: true });\n },\n};\n\n// ─── Namespace ────────────────────────────\n\n/** Every template, as exposed on `dsl.templates`. */\nexport const templates: TemplatesApi = {\n base,\n baseWithWorkspace,\n withMetadata,\n withActive,\n withAudit,\n withExternalId,\n withNameDescription,\n fields,\n};\n",
18
19
  "/**\n * DSL-level schema checks, run before compiling to IR.\n *\n * These catch authoring mistakes in DSL terms (a relation pointing at a column\n * that does not exist, an ambiguous self-relation) and return them as a list —\n * structural IR rules live in `@vibeorm/schema`'s `validateSchemaIR`, which\n * `toIR()` always enforces.\n *\n * @example\n * const issues = dsl.validateSchema(schema);\n * if (issues.some((i) => i.type === \"error\")) throw new Error(\"bad schema\");\n */\n\nimport type { SchemaDef, StoredRelationDef } from \"./types.ts\";\n\n// ─── Issue shape ──────────────────────────\n\nexport type ValidationError = {\n type: \"error\" | \"warning\";\n message: string;\n model?: string;\n relation?: string;\n};\n\n// ─── Validation ───────────────────────────\n\n/** Validates a composed schema; an empty array means no issues were found. */\nexport function validateSchema(schema: SchemaDef): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // 1. Name collisions across models and enums.\n const allNames = new Set<string>();\n for (const name of schema.__models.keys()) {\n if (allNames.has(name)) {\n errors.push({\n type: \"error\",\n message: `Duplicate name \"${name}\" — used by more than one model`,\n model: name,\n });\n }\n allNames.add(name);\n }\n for (const name of schema.__enums.keys()) {\n if (allNames.has(name)) {\n errors.push({\n type: \"error\",\n message: `Duplicate name \"${name}\" — used by both a model and an enum`,\n });\n }\n allNames.add(name);\n }\n\n // 2. Relations resolve to real models and columns.\n for (const [modelName, modelRelations] of Object.entries(schema.__relations)) {\n const model = schema.__models.get(modelName);\n if (model === undefined) {\n errors.push({\n type: \"error\",\n message: `Relations defined for unknown model \"${modelName}\"`,\n model: modelName,\n });\n continue;\n }\n\n for (const [relationName, relation] of Object.entries(modelRelations)) {\n const targetModel = schema.__models.get(relation.__targetModel);\n if (targetModel === undefined) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" references unknown model \"${relation.__targetModel}\"`,\n model: modelName,\n relation: relationName,\n });\n continue;\n }\n\n if (relation.__relationType === \"one\" && relation.__fromModel === modelName) {\n // Every member of a composite key is checked, not only the first.\n for (const column of relation.__fromColumns) {\n if (!model.__columns.has(column)) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" references FK column \"${column}\" which doesn't exist on model \"${modelName}\"`,\n model: modelName,\n relation: relationName,\n });\n }\n }\n for (const column of relation.__toColumns) {\n if (!targetModel.__columns.has(column)) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" references column \"${column}\" which doesn't exist on target model \"${relation.__targetModel}\"`,\n model: modelName,\n relation: relationName,\n });\n }\n }\n if (relation.__fromColumns.length !== relation.__toColumns.length) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" pairs ${relation.__fromColumns.length} FK column(s) with ${relation.__toColumns.length} referenced column(s)`,\n model: modelName,\n relation: relationName,\n });\n }\n }\n\n // Self-relations need an alias once there is more than one of them.\n if (relation.__targetModel === modelName && relation.__alias === undefined) {\n const otherSelfRelations = Object.values(modelRelations).filter(\n (other: StoredRelationDef) => other.__targetModel === modelName && other !== relation\n );\n if (otherSelfRelations.length > 0) {\n errors.push({\n type: \"warning\",\n message: `Self-referential relation \"${relationName}\" on \"${modelName}\" has no alias — this may cause Prisma ambiguity`,\n model: modelName,\n relation: relationName,\n });\n }\n }\n }\n }\n\n // 3. Every model needs a primary key.\n for (const [modelName, model] of schema.__models) {\n const hasIdColumn = Array.from(model.__columns.values()).some(\n (column) => column.__columnType === \"id\"\n );\n const hasPrimaryKey = model.__primaryKey !== undefined && model.__primaryKey.length > 0;\n if (!hasIdColumn && !hasPrimaryKey) {\n errors.push({\n type: \"warning\",\n message: `Model \"${modelName}\" has no id column and no compound primaryKey defined`,\n model: modelName,\n });\n }\n }\n\n return errors;\n}\n",
19
- "/**\n * @vibeorm/dsl — the TypeScript schema DSL.\n *\n * Models and relations are written in TypeScript and compiled straight to the\n * canonical `SchemaIR` (`dsl.toIR`). `.prisma` text generation is kept for\n * interop and `vibeorm convert`.\n *\n * @example\n * import { dsl } from \"@vibeorm/dsl\";\n *\n * const Workspace = dsl.create({\n * name: \"Workspace\",\n * schema: { ...dsl.templates.base, name: dsl.string() },\n * });\n *\n * const User = dsl.create({\n * name: \"User\",\n * schema: {\n * ...dsl.templates.base,\n * email: dsl.string().unique(),\n * workspaceId: dsl.string().index(),\n * },\n * indexes: (i) => [i.unique(\"workspaceId\", \"email\")],\n * });\n *\n * const relations = dsl.defineRelations({ Workspace, User }, (r) => ({\n * Workspace: { users: r.many.User({ from: r.Workspace.id, to: r.User.workspaceId }) },\n * User: { workspace: r.one.Workspace({ from: r.User.workspaceId, to: r.Workspace.id }) },\n * }));\n *\n * const schema = dsl.schema({ Workspace, User }, { relations });\n * const ir = dsl.toIR({ schema }); // canonical IR\n * const prisma = dsl.generate.prisma(schema); // .prisma text\n */\n\nimport type { ExtensionRegistry, Provider, SchemaIR } from \"@vibeorm/schema\";\n\nimport {\n bigint,\n boolean,\n bytes,\n datetime,\n decimal,\n enumCol,\n extensionType,\n float,\n id,\n int,\n json,\n string,\n unsupported,\n} from \"./column.ts\";\nimport type {\n ChainableColumn,\n ChainableDatetimeColumn,\n ChainableDecimalColumn,\n ChainableEnumColumn,\n ChainableIdColumn,\n ChainableIntegerColumn,\n ChainableJsonColumn,\n ChainableStringColumn,\n} from \"./column.ts\";\nimport { createEnum } from \"./enum.ts\";\nimport type { StandaloneEnumConfig } from \"./enum.ts\";\nimport { generatePrisma } from \"./generator/prisma.ts\";\nimport { create } from \"./model.ts\";\nimport { defineRelations, defineRelationsPart, mergeRelations } from \"./relations.ts\";\nimport { defineRls, domain, schema } from \"./schema.ts\";\nimport type { SchemaOptions } from \"./schema.ts\";\nimport { templates } from \"./templates.ts\";\nimport type { TemplatesApi } from \"./templates.ts\";\nimport { toIR } from \"./to-ir.ts\";\nimport { validateSchema } from \"./validate.ts\";\nimport type { ValidationError } from \"./validate.ts\";\nimport type {\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n CreateModelConfig,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n EnumDef,\n ExtensionTypeConfig,\n FloatColumnConfig,\n GeneratorOutput,\n IdColumnConfig,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n ModelDef,\n PrismaGeneratorConfig,\n SchemaDef,\n SchemaDefinition,\n SchemaInput,\n StringColumnConfig,\n} from \"./types.ts\";\n\n// ─── Value exports ────────────────────────\n\nexport {\n ChainableColumn,\n ChainableDatetimeColumn,\n ChainableDecimalColumn,\n ChainableEnumColumn,\n ChainableIdColumn,\n ChainableIntegerColumn,\n ChainableJsonColumn,\n ChainableStringColumn,\n cloneColumnDef,\n} from \"./column.ts\";\nexport { createEnum } from \"./enum.ts\";\nexport { generatePrisma } from \"./generator/prisma.ts\";\nexport { create, createIndexBuilder, evaluateIndexes, getColumnNames } from \"./model.ts\";\nexport { compileChecks, compileIndexPredicate, createPredicateBuilder, evaluateChecks } from \"./predicate.ts\";\nexport { children, createChildrenBuilder } from \"./relation.ts\";\nexport { detectOneToOnePairs, planSchema, resolveRelationType } from \"./relation-plan.ts\";\nexport { defineRelations, defineRelationsPart, mergeRelations } from \"./relations.ts\";\nexport { defineRls, domain, schema } from \"./schema.ts\";\nexport {\n base,\n baseWithWorkspace,\n fields,\n templates,\n withActive,\n withAudit,\n withExternalId,\n withMetadata,\n withNameDescription,\n} from \"./templates.ts\";\nexport { toIR } from \"./to-ir.ts\";\nexport { validateSchema } from \"./validate.ts\";\n\n// ─── Type exports ─────────────────────────\n\nexport type { StandaloneEnumConfig } from \"./enum.ts\";\nexport type { EvaluatedCheck, PredicateModel } from \"./predicate.ts\";\nexport type {\n MergedOneToOneSide,\n PlannedIndex,\n PlannedRelation,\n PlannedRelationKind,\n SchemaPlan,\n} from \"./relation-plan.ts\";\nexport type { SchemaOptions } from \"./schema.ts\";\nexport type {\n ActiveTemplate,\n AuditTemplate,\n BaseTemplate,\n BaseWithWorkspaceTemplate,\n ExternalIdTemplate,\n FieldsTemplate,\n MetadataTemplate,\n NameDescriptionTemplate,\n TemplatesApi,\n} from \"./templates.ts\";\nexport type { ValidationError } from \"./validate.ts\";\nexport type {\n DefineRlsOptions,\n MergedRelations,\n RlsColumnKind,\n RlsContextRef,\n RlsContextRefs,\n RlsDef,\n RlsPolicies,\n BaseColumnConfig,\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n CascadeAction,\n ChildrenBuilder,\n ChildrenDef,\n ChildrenRelationConfig,\n ChildrenSchemaCallback,\n ColumnDef,\n ColumnKeys,\n ColumnRef,\n ColumnRefKind,\n ColumnRefKindOf,\n ColumnType,\n CreateModelConfig,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n EnumDef,\n EnumFieldConfig,\n EnumStorage,\n EnumValues,\n ExtensionAttributeUse,\n ExtensionTypeConfig,\n FloatColumnConfig,\n GeneratorOutput,\n IdColumnConfig,\n IdGeneratorType,\n IndexBuilder,\n IndexCallback,\n IndexDef,\n IndexOptions,\n ChecksCallback,\n ModelCheckConfig,\n ModelPolicyConfig,\n NamedCheckDef,\n PartialIndexDef,\n PredicateBuilder,\n PredicateExpr,\n PredicateFieldExpr,\n UniqueIndexOptions,\n IndexType,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n ManyRelationDefConfig,\n ModelColumnRefs,\n ModelDef,\n OneRelationDefConfig,\n PrismaGeneratorConfig,\n RelationRefInput,\n RelationTarget,\n RelationsBuilder,\n RelationsMap,\n RelationsOutput,\n SchemaColumnNames,\n SchemaDef,\n SchemaDefinition,\n SchemaInput,\n StoredRelationDef,\n StringColumnConfig,\n ThroughRef,\n UnsupportedColumnConfig,\n} from \"./types.ts\";\n\n// ─── Enum factory ─────────────────────────\n\n/**\n * Creates an enum: standalone (reusable, has a `name`) or inline (one-off).\n *\n * @example\n * const Status = dsl.enum({ name: \"Status\", options: [\"active\", \"inactive\"] });\n * priority: dsl.enum({ options: [\"low\", \"high\"], default: \"low\" })\n */\nexport type EnumFactory = {\n <const T extends readonly string[]>(config: StandaloneEnumConfig<T>): EnumDef<T>;\n <const T extends readonly string[]>(config: InlineEnumConfig<T>): ChainableEnumColumn<T>;\n};\n\nfunction isStandaloneEnumConfig<T extends readonly string[]>(\n config: StandaloneEnumConfig<T> | InlineEnumConfig<T>\n): config is StandaloneEnumConfig<T> {\n return \"name\" in config && typeof config.name === \"string\";\n}\n\nfunction enumFactory<const T extends readonly string[]>(\n config: StandaloneEnumConfig<T>\n): EnumDef<T>;\nfunction enumFactory<const T extends readonly string[]>(\n config: InlineEnumConfig<T>\n): ChainableEnumColumn<T>;\nfunction enumFactory<const T extends readonly string[]>(\n config: StandaloneEnumConfig<T> | InlineEnumConfig<T>\n): EnumDef<T> | ChainableEnumColumn<T> {\n if (isStandaloneEnumConfig(config)) {\n return createEnum(config);\n }\n return enumCol(config);\n}\n\n// ─── Generator namespace ──────────────────\n\n/** `dsl.generate(schema)` plus the per-format generators. */\nexport type GenerateApi = {\n (schema: SchemaDef): GeneratorOutput;\n prisma: (schema: SchemaDef, config?: PrismaGeneratorConfig) => string;\n};\n\nconst generate: GenerateApi = Object.assign(\n (schemaDef: SchemaDef): GeneratorOutput => ({ prisma: generatePrisma(schemaDef) }),\n { prisma: generatePrisma }\n);\n\n// ─── DSL namespace ────────────────────────\n\n/**\n * The `dsl` namespace surface. Every member carries an explicit signature —\n * the package is built under `isolatedDeclarations`.\n */\nexport type DslApi = {\n readonly string: (config?: StringColumnConfig) => ChainableStringColumn;\n readonly int: (config?: IntColumnConfig) => ChainableIntegerColumn<\"int\">;\n readonly bigint: (config?: BigIntColumnConfig) => ChainableIntegerColumn<\"bigint\">;\n readonly float: (config?: FloatColumnConfig) => ChainableColumn<\"float\">;\n readonly decimal: (config?: DecimalColumnConfig) => ChainableDecimalColumn;\n readonly boolean: (config?: BooleanColumnConfig) => ChainableColumn<\"boolean\">;\n readonly datetime: (config?: DatetimeColumnConfig) => ChainableDatetimeColumn;\n readonly json: (config?: JsonColumnConfig) => ChainableJsonColumn;\n readonly id: (config?: IdColumnConfig) => ChainableIdColumn;\n readonly bytes: (config?: BytesColumnConfig) => ChainableColumn<\"bytes\">;\n readonly unsupported: (dbType: string) => ChainableColumn<\"unsupported\">;\n readonly extensionType: (config: ExtensionTypeConfig) => ChainableColumn<\"unsupported\">;\n readonly enum: EnumFactory;\n\n readonly create: <const TSchema extends SchemaDefinition>(\n config: CreateModelConfig<TSchema>\n ) => ModelDef<TSchema>;\n\n readonly defineRelations: typeof defineRelations;\n readonly defineRelationsPart: typeof defineRelationsPart;\n readonly mergeRelations: typeof mergeRelations;\n readonly defineRls: typeof defineRls;\n\n readonly schema: (input: SchemaInput, options?: SchemaOptions) => SchemaDef;\n readonly domain: (params: { name: string; models: Record<string, ModelDef> }) => {\n name: string;\n models: Record<string, ModelDef>;\n };\n\n readonly toIR: (params: {\n schema: SchemaDef;\n provider?: Provider;\n extensions?: ExtensionRegistry;\n }) => SchemaIR;\n readonly validateSchema: (schema: SchemaDef) => ValidationError[];\n readonly generate: GenerateApi;\n readonly templates: TemplatesApi;\n};\n\n/** The DSL namespace: columns, models, relations, schemas and output. */\nexport const dsl: DslApi = {\n // Columns\n string,\n int,\n bigint,\n float,\n decimal,\n boolean,\n datetime,\n json,\n id,\n bytes,\n unsupported,\n extensionType,\n enum: enumFactory,\n\n // Models\n create,\n\n // Relations\n defineRelations,\n defineRelationsPart,\n mergeRelations,\n\n // Schema composition\n defineRls,\n schema,\n domain,\n\n // Output\n toIR,\n validateSchema,\n generate,\n\n // Templates\n templates,\n};\n"
20
+ "/**\n * @vibeorm/dsl — the TypeScript schema DSL.\n *\n * Models and relations are written in TypeScript and compiled straight to the\n * canonical `SchemaIR` (`dsl.toIR`). `.prisma` text generation is kept for\n * interop and `vibeorm convert`.\n *\n * @example\n * import { dsl } from \"@vibeorm/dsl\";\n *\n * const Workspace = dsl.create({\n * name: \"Workspace\",\n * schema: { ...dsl.templates.base, name: dsl.string() },\n * });\n *\n * const User = dsl.create({\n * name: \"User\",\n * schema: {\n * ...dsl.templates.base,\n * email: dsl.string().unique(),\n * workspaceId: dsl.string().index(),\n * },\n * indexes: (i) => [i.unique(\"workspaceId\", \"email\")],\n * });\n *\n * const relations = dsl.defineRelations({ Workspace, User }, (r) => ({\n * Workspace: { users: r.many.User({ from: r.Workspace.id, to: r.User.workspaceId }) },\n * User: { workspace: r.one.Workspace({ from: r.User.workspaceId, to: r.Workspace.id }) },\n * }));\n *\n * const schema = dsl.schema({ Workspace, User }, { relations });\n * const ir = dsl.toIR({ schema }); // canonical IR\n * const prisma = dsl.generate.prisma(schema); // .prisma text\n */\n\nimport type { ExtensionRegistry, Provider, SchemaIR } from \"@vibeorm/schema\";\n\nimport {\n bigint,\n boolean,\n bytes,\n datetime,\n decimal,\n enumCol,\n extensionType,\n float,\n id,\n int,\n json,\n localDate,\n string,\n unsupported,\n} from \"./column.ts\";\nimport type {\n ChainableColumn,\n ChainableDatetimeColumn,\n ChainableDecimalColumn,\n ChainableEnumColumn,\n ChainableFloatColumn,\n ChainableIdColumn,\n ChainableIntegerColumn,\n ChainableJsonColumn,\n ChainableStringColumn,\n} from \"./column.ts\";\nimport { createEnum } from \"./enum.ts\";\nimport type { StandaloneEnumConfig } from \"./enum.ts\";\nimport { generatePrisma } from \"./generator/prisma.ts\";\nimport { create } from \"./model.ts\";\nimport { defineRelations, defineRelationsPart, mergeRelations } from \"./relations.ts\";\nimport { defineRls, domain, schema } from \"./schema.ts\";\nimport type { SchemaOptions } from \"./schema.ts\";\nimport { templates } from \"./templates.ts\";\nimport type { TemplatesApi } from \"./templates.ts\";\nimport { toIR } from \"./to-ir.ts\";\nimport { validateSchema } from \"./validate.ts\";\nimport type { ValidationError } from \"./validate.ts\";\nimport type {\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n CreateModelConfig,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n EnumDef,\n ExtensionTypeConfig,\n FloatColumnConfig,\n GeneratorOutput,\n IdColumnConfig,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n LocalDateColumnConfig,\n ModelDef,\n PrismaGeneratorConfig,\n SchemaDef,\n SchemaDefinition,\n SchemaInput,\n StringColumnConfig,\n} from \"./types.ts\";\n\n// ─── Value exports ────────────────────────\n\nexport {\n ChainableColumn,\n ChainableDatetimeColumn,\n ChainableDecimalColumn,\n ChainableEnumColumn,\n ChainableFloatColumn,\n ChainableIdColumn,\n ChainableIntegerColumn,\n ChainableJsonColumn,\n ChainableNumericColumn,\n ChainableStringColumn,\n cloneColumnDef,\n} from \"./column.ts\";\nexport type { NumericColumnType, NumericRuleLiteral } from \"./column.ts\";\nexport { localDate } from \"./column.ts\";\nexport { createEnum } from \"./enum.ts\";\nexport { generatePrisma } from \"./generator/prisma.ts\";\nexport { create, createIndexBuilder, evaluateIndexes, getColumnNames } from \"./model.ts\";\nexport { createRowRuleBuilder, compileRowRules } from \"./row-rules.ts\";\nexport type { RowRuleBuilder, RowRuleDeclaration } from \"./row-rules.ts\";\nexport { compileChecks, compileIndexPredicate, compileModelChecks, createChecksBuilder, createPredicateBuilder, evaluateChecks } from \"./predicate.ts\";\nexport { children, createChildrenBuilder } from \"./relation.ts\";\nexport { detectOneToOnePairs, planSchema, resolveRelationType } from \"./relation-plan.ts\";\nexport { defineRelations, defineRelationsPart, mergeRelations } from \"./relations.ts\";\nexport { defineRls, domain, schema } from \"./schema.ts\";\nexport {\n base,\n baseWithWorkspace,\n fields,\n templates,\n withActive,\n withAudit,\n withExternalId,\n withMetadata,\n withNameDescription,\n} from \"./templates.ts\";\nexport { toIR } from \"./to-ir.ts\";\nexport { validateSchema } from \"./validate.ts\";\n\n// ─── Type exports ─────────────────────────\n\nexport type { GeneratedColumnOptions, ValidatorRefIR } from \"@vibeorm/schema\";\nexport type { StandaloneEnumConfig } from \"./enum.ts\";\nexport type { CheckModelContext, EvaluatedCheck, PredicateModel } from \"./predicate.ts\";\nexport type {\n MergedOneToOneSide,\n PlannedIndex,\n PlannedRelation,\n PlannedRelationKind,\n SchemaPlan,\n} from \"./relation-plan.ts\";\nexport type { SchemaOptions } from \"./schema.ts\";\nexport type {\n ActiveTemplate,\n AuditTemplate,\n BaseTemplate,\n BaseWithWorkspaceTemplate,\n ExternalIdTemplate,\n FieldsTemplate,\n MetadataTemplate,\n NameDescriptionTemplate,\n TemplatesApi,\n} from \"./templates.ts\";\nexport type { ValidationError } from \"./validate.ts\";\nexport type {\n DefineRlsOptions,\n MergedRelations,\n RlsColumnKind,\n RlsContextRef,\n RlsContextRefs,\n RlsDef,\n RlsPolicies,\n BaseColumnConfig,\n BigIntColumnConfig,\n BooleanColumnConfig,\n BytesColumnConfig,\n CascadeAction,\n ChildrenBuilder,\n ChildrenDef,\n ChildrenRelationConfig,\n ChildrenSchemaCallback,\n ColumnDef,\n ColumnKeys,\n ColumnRef,\n ColumnRefKind,\n ColumnRefKindOf,\n ColumnType,\n CreateModelConfig,\n DatetimeColumnConfig,\n DecimalColumnConfig,\n EnumDef,\n EnumFieldConfig,\n EnumStorage,\n EnumValues,\n ExtensionAttributeUse,\n ExtensionTypeConfig,\n FloatColumnConfig,\n GeneratorOutput,\n IdColumnConfig,\n IdGeneratorType,\n IndexBuilder,\n IndexCallback,\n IndexDef,\n IndexKey,\n UnsortedIndexKey,\n SortedIndexKey,\n RawIndexExpression,\n IndexOptions,\n ChecksBuilder,\n ChecksCallback,\n CheckRuleOptions,\n ColumnCheckRule,\n ColumnCheckShape,\n OrderCheckOptions,\n PresenceCheckConfig,\n PresenceState,\n ModelCheckConfig,\n ModelPolicyConfig,\n NamedCheckDef,\n PartialIndexDef,\n PredicateBuilder,\n PredicateExpr,\n PredicateFieldExpr,\n PredicateNumericKind,\n PredicateNumericLiteral,\n PredicateNumericOperand,\n UniqueIndexOptions,\n IndexType,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n LocalDateColumnConfig,\n ManyRelationDefConfig,\n ModelColumnRefs,\n ModelDef,\n OneRelationDefConfig,\n PrismaGeneratorConfig,\n RelationRefInput,\n RelationTarget,\n RelationsBuilder,\n RelationsMap,\n RelationsOutput,\n SchemaColumnNames,\n SchemaDef,\n SchemaDefinition,\n SchemaInput,\n StoredRelationDef,\n StringColumnConfig,\n ThroughRef,\n UnsupportedColumnConfig,\n} from \"./types.ts\";\n\n// ─── Enum factory ─────────────────────────\n\n/**\n * Creates an enum: standalone (reusable, has a `name`) or inline (one-off).\n *\n * @example\n * const Status = dsl.enum({ name: \"Status\", options: [\"active\", \"inactive\"] });\n * priority: dsl.enum({ options: [\"low\", \"high\"], default: \"low\" })\n */\nexport type EnumFactory = {\n <const T extends readonly string[]>(config: StandaloneEnumConfig<T>): EnumDef<T>;\n <const T extends readonly string[]>(config: InlineEnumConfig<T>): ChainableEnumColumn<T>;\n};\n\nfunction isStandaloneEnumConfig<T extends readonly string[]>(\n config: StandaloneEnumConfig<T> | InlineEnumConfig<T>\n): config is StandaloneEnumConfig<T> {\n return \"name\" in config && typeof config.name === \"string\";\n}\n\nfunction enumFactory<const T extends readonly string[]>(\n config: StandaloneEnumConfig<T>\n): EnumDef<T>;\nfunction enumFactory<const T extends readonly string[]>(\n config: InlineEnumConfig<T>\n): ChainableEnumColumn<T>;\nfunction enumFactory<const T extends readonly string[]>(\n config: StandaloneEnumConfig<T> | InlineEnumConfig<T>\n): EnumDef<T> | ChainableEnumColumn<T> {\n if (isStandaloneEnumConfig(config)) {\n return createEnum(config);\n }\n return enumCol(config);\n}\n\n// ─── Generator namespace ──────────────────\n\n/** `dsl.generate(schema)` plus the per-format generators. */\nexport type GenerateApi = {\n (schema: SchemaDef): GeneratorOutput;\n prisma: (schema: SchemaDef, config?: PrismaGeneratorConfig) => string;\n};\n\nconst generate: GenerateApi = Object.assign(\n (schemaDef: SchemaDef): GeneratorOutput => ({ prisma: generatePrisma(schemaDef) }),\n { prisma: generatePrisma }\n);\n\n// ─── DSL namespace ────────────────────────\n\n/**\n * The `dsl` namespace surface. Every member carries an explicit signature —\n * the package is built under `isolatedDeclarations`.\n */\nexport type DslApi = {\n readonly string: (config?: StringColumnConfig) => ChainableStringColumn;\n readonly localDate: (config?: LocalDateColumnConfig) => ChainableColumn<\"localDate\">;\n readonly int: (config?: IntColumnConfig) => ChainableIntegerColumn<\"int\">;\n readonly bigint: (config?: BigIntColumnConfig) => ChainableIntegerColumn<\"bigint\">;\n readonly float: (config?: FloatColumnConfig) => ChainableFloatColumn;\n readonly decimal: (config?: DecimalColumnConfig) => ChainableDecimalColumn;\n readonly boolean: (config?: BooleanColumnConfig) => ChainableColumn<\"boolean\">;\n readonly datetime: (config?: DatetimeColumnConfig) => ChainableDatetimeColumn;\n readonly json: (config?: JsonColumnConfig) => ChainableJsonColumn;\n readonly id: (config?: IdColumnConfig) => ChainableIdColumn;\n readonly bytes: (config?: BytesColumnConfig) => ChainableColumn<\"bytes\">;\n readonly unsupported: (dbType: string) => ChainableColumn<\"unsupported\">;\n readonly extensionType: (config: ExtensionTypeConfig) => ChainableColumn<\"unsupported\">;\n readonly enum: EnumFactory;\n\n readonly create: <const TSchema extends SchemaDefinition>(\n config: CreateModelConfig<TSchema>\n ) => ModelDef<TSchema>;\n\n readonly defineRelations: typeof defineRelations;\n readonly defineRelationsPart: typeof defineRelationsPart;\n readonly mergeRelations: typeof mergeRelations;\n readonly defineRls: typeof defineRls;\n\n readonly schema: (input: SchemaInput, options?: SchemaOptions) => SchemaDef;\n readonly domain: (params: { name: string; models: Record<string, ModelDef> }) => {\n name: string;\n models: Record<string, ModelDef>;\n };\n\n readonly toIR: (params: {\n schema: SchemaDef;\n provider?: Provider;\n extensions?: ExtensionRegistry;\n }) => SchemaIR;\n readonly validateSchema: (schema: SchemaDef) => ValidationError[];\n readonly generate: GenerateApi;\n readonly templates: TemplatesApi;\n};\n\n/** The DSL namespace: columns, models, relations, schemas and output. */\nexport const dsl: DslApi = {\n // Columns\n string,\n localDate,\n int,\n bigint,\n float,\n decimal,\n boolean,\n datetime,\n json,\n id,\n bytes,\n unsupported,\n extensionType,\n enum: enumFactory,\n\n // Models\n create,\n\n // Relations\n defineRelations,\n defineRelationsPart,\n mergeRelations,\n\n // Schema composition\n defineRls,\n schema,\n domain,\n\n // Output\n toIR,\n validateSchema,\n generate,\n\n // Templates\n templates,\n};\n"
20
21
  ],
21
- "mappings": "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",
22
- "debugId": "24494B6B129BF22A64756E2164756E21",
22
+ "mappings": "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",
23
+ "debugId": "7EE10300C00F60DE64756E2164756E21",
23
24
  "names": []
24
25
  }