@vibeorm/dsl 2.0.0-alpha.8 → 2.1.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/README.md +23 -3
- package/dist/column.d.ts +8 -3
- package/dist/column.d.ts.map +1 -1
- package/dist/field-type.d.ts +30 -0
- package/dist/field-type.d.ts.map +1 -0
- package/dist/generator/prisma.d.ts +1 -1
- package/dist/generator/prisma.d.ts.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1281 -823
- package/dist/index.js.map +13 -11
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/predicate.d.ts +86 -0
- package/dist/predicate.d.ts.map +1 -0
- package/dist/relation-plan.d.ts +10 -1
- package/dist/relation-plan.d.ts.map +1 -1
- package/dist/relations.d.ts.map +1 -1
- package/dist/to-ir.d.ts +19 -2
- package/dist/to-ir.d.ts.map +1 -1
- package/dist/types.d.ts +307 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/column.ts", "../src/enum.ts", "../src/generator/prisma.ts", "../src/
|
|
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"],
|
|
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 type { EnumStorage } 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 },\n __enumValues: column.__enumValues,\n __enumName: column.__enumName,\n __enumStorage: column.__enumStorage,\n };\n}\n\n// ─── Chainable columns ────────────────────\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: unknown): 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 /** `@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 /** `@db.Timestamptz` — timezone-aware timestamp. */\n tz(): this {\n (this.__config as DatetimeColumnConfig).tz = true;\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/** 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]): 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/** Int column. */\nexport function int(config: IntColumnConfig = {}): ChainableColumn<\"int\"> {\n return new ChainableColumn(\"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 */\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);\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 annotation = `@type(${config.name} from \"${config.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 */\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 = {}): ChainableColumn<\"bigint\"> {\n return new ChainableColumn(\"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 type { EnumStorage } 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 },\n __enumValues: column.__enumValues,\n __enumName: column.__enumName,\n __enumStorage: column.__enumStorage,\n };\n}\n\n// ─── Chainable columns ────────────────────\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: unknown): 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 /** `@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 /** `@db.Timestamptz` — timezone-aware timestamp. */\n tz(): this {\n (this.__config as DatetimeColumnConfig).tz = true;\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/** 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 */\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);\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 annotation = `@type(${config.name} from \"${config.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 */\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 } from \"@vibeorm/schema\";\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 { planSchema } from \"../relation-plan.ts\";\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 an id column, per generator strategy. */\nfunction idDefaultAttribute(params: { column: ColumnDef }): string | undefined {\n const idType = (params.column.__config as IdColumnConfig).type;\n switch (idType) {\n case \"ulid\":\n case \"cuid\":\n case \"uuid\":\n case \"nanoid\":\n case \"autoincrement\":\n return `@default(${idType}())`;\n default:\n return undefined;\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 { dbgenerated, default: value } = column.__config;\n\n if (typeof dbgenerated === \"string\") {\n return `@default(dbgenerated(${encodePrismaString({ value: dbgenerated })}))`;\n }\n if (value === undefined) return undefined;\n\n if (column.__columnType === \"datetime\" && value === \"now\") {\n return \"@default(now())\";\n }\n if (column.__columnType === \"enum\" && typeof value === \"string\") {\n return `@default(${value})`;\n }\n if (typeof value === \"string\") return `@default(${encodePrismaString({ value })})`;\n if (typeof value === \"boolean\" || typeof value === \"number\") return `@default(${value})`;\n if (typeof value === \"bigint\") return `@default(${value.toString()})`;\n return undefined;\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\") {\n const { maxLength, text } = column.__config as StringColumnConfig;\n if (typeof maxLength === \"number\") return `@db.VarChar(${maxLength})`;\n if (text === true) return \"@db.Text\";\n return undefined;\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\" && column.__config.tz === true) {\n return \"@db.Timestamptz\";\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 = idDefaultAttribute({ 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 comment = column.__config.comment;\n if (typeof comment === \"string\") {\n const commentLines = comment.split(\"\\n\").map((line) => ` /// ${line}`);\n return [...commentLines, columnLine].join(\"\\n\");\n }\n return columnLine;\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\n return ` ${name} ${targetModel}${optional} @relation(${args.join(\", \")})`;\n}\n\n// ─── Index rendering ──────────────────────\n\nfunction formatIndex(params: { index: PlannedIndex }): string {\n const { index } = params;\n const columns = index.columns.join(\", \");\n const whereArg = index.where === undefined ? \"\" : `, where: ${encodePrismaString({ value: index.where })}`;\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}${nndArg}${whereArg})`;\n }\n const typeArg = index.indexType === undefined ? \"\" : `, type: ${index.indexType}`;\n return ` @@index([${columns}]${typeArg}${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: { model: ModelDef; plan: SchemaPlan }): 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 }));\n }\n\n for (const check of model.__checks ?? []) {\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 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\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 }));\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\").trim();\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, 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, fieldDefault } 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 if (value.kind === \"literal\") return `@default(${typeof value.value === \"string\" ? 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\") {\n const { maxLength, text } = column.__config as StringColumnConfig;\n if (typeof maxLength === \"number\") return `@db.VarChar(${maxLength})`;\n if (text === true) return \"@db.Text\";\n return undefined;\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\" && column.__config.tz === true) {\n return \"@db.Timestamptz\";\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 comment = column.__config.comment;\n if (typeof comment === \"string\") {\n const commentLines = comment.split(\"\\n\").map((line) => ` /// ${line}`);\n return [...commentLines, columnLine].join(\"\\n\");\n }\n return columnLine;\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 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, PredicateIR, 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 NamedCheckDef,\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 }):\n | { readonly kind: \"field\"; readonly name: string }\n | PredicateValue {\n const { operand, at } = params;\n return isFieldExpr(operand) ? toRef({ expr: operand }) : toValue({ input: operand, 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: toRef({ expr: requireFieldExpr({ 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 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: NamedCheckDef[] = checks(createPredicateBuilder());\n return declared.map((entry, index) => {\n if (entry === null || typeof entry !== \"object\" || entry.__type !== \"check\") {\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `Model \"${model}\": checks[${index}] is not a named CHECK — wrap the expression in c.named(\"name\", …)`,\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`.\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} 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 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 if (column.__config.default !== undefined || column.__config.dbgenerated !== 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 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 === \"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\nfunction nativeType(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\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 === \"string\" || (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\" && column.__config.tz === true) {\n return \"Timestamptz\";\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 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 ...(documentation === undefined ? {} : { documentation }),\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 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 })),\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 }),\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, predicateKey } from \"@vibeorm/schema\";\nimport type { CascadeAction, PredicateIR, 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 /** 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\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 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 for (let j = i + 1; j < allOnes.length; j++) {\n const b = allOnes[j];\n if (b === undefined) continue;\n const keyB = `${b.modelName}:${b.relName}`;\n if (paired.has(keyB)) continue;\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 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 mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n existing: readonly PlannedRelation[];\n}): PlannedRelation[] {\n const { modelName, relations, 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 [sourceModelName, sourceRelations] of Object.entries(relations)) {\n for (const [relName, rel] of Object.entries(sourceRelations)) {\n if (rel.__targetModel !== modelName || rel.__relationType !== \"one\") continue;\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(sourceRelations).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\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 models: ReadonlyMap<string, ModelDef>;\n}): PlannedRelation[] {\n const { modelName, model, models } = 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 models) {\n for (const childModel of parentModel.__children.values()) {\n if (childModel.__name !== modelName) continue;\n\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\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 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;\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.__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\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\n for (const [modelName, model] of schema.__models) {\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 mergeMap,\n existing: explicit,\n });\n const children = planChildRelations({ modelName, model, models: schema.__models });\n\n const planned = [...explicit, ...reverses, ...children];\n for (const relation of planned) {\n if (relation.kind === \"fkOwner\") assertForeignKeyIntegrity({ relation, models: schema.__models });\n }\n relations.set(modelName, planned);\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 = (columns: readonly string[], type?: IndexType, where?: string, map?: string): IndexDef => ({\n __type: \"index\",\n __columns: [...columns],\n __indexType: type,\n ...(map === undefined ? {} : { __map: map }),\n ...(where === undefined ? {} : { __where: where }),\n });\n\n return {\n /** Composite (or single-column) index; the array form takes options. */\n on<C extends T>(...args: C[] | [C[], IndexOptions]): 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(first, second.type, second.where, second.map));\n }\n return partial(createIndex(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 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, \"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, \"Gist\"));\n },\n\n /** Hash index — equality lookups (PostgreSQL). */\n hash<C extends T>(...columns: C[]): PartialIndexDef<T, TSchema> {\n return partial(createIndex(columns, \"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, \"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",
|
|
8
13
|
"/**\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",
|
|
9
14
|
"/**\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",
|
|
10
|
-
"/**\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 type { CascadeAction, RelationType } from \"@vibeorm/schema\";\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 readonly fields?: readonly string[];\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 isUnique: boolean;\n readonly columns: readonly string[];\n readonly indexType?: IndexType;\n /** Partial-index predicate (raw SQL) — postgres/pglite/sqlite only. */\n readonly where?: string;\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};\n\ntype OneRelationEntry = {\n readonly modelName: string;\n readonly relName: string;\n readonly rel: StoredRelationDef;\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.__relationType === \"one\") {\n allOnes.push({ modelName, relName, rel });\n }\n }\n }\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 for (let j = i + 1; j < allOnes.length; j++) {\n const b = allOnes[j];\n if (b === undefined) continue;\n const keyB = `${b.modelName}:${b.relName}`;\n if (paired.has(keyB)) continue;\n\n const sameColumnPair =\n a.rel.__fromModel === b.rel.__toModel &&\n a.rel.__fromColumn === b.rel.__toColumn &&\n a.rel.__toModel === b.rel.__fromModel &&\n a.rel.__toColumn === b.rel.__fromColumn;\n if (!sameColumnPair) 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\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 });\n mergeMap.set(backKey, {\n role: \"backRelation\",\n pairedRelName: fkOwner.relName,\n pairedModelName: fkOwner.modelName,\n onDelete,\n onUpdate,\n });\n\n paired.add(fkKey);\n paired.add(backKey);\n break;\n }\n }\n\n return mergeMap;\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 aFromIsId =\n models.get(a.modelName)?.__columns.get(a.rel.__fromColumn)?.__columnType === \"id\";\n const bFromIsId =\n models.get(b.modelName)?.__columns.get(b.rel.__fromColumn)?.__columnType === \"id\";\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 if (a.rel.__onDelete !== undefined || a.rel.__onUpdate !== undefined) {\n return { fkOwner: a, backRelation: b };\n }\n if (b.rel.__onDelete !== undefined || b.rel.__onUpdate !== undefined) {\n return { fkOwner: b, backRelation: a };\n }\n\n const aLooksFk = looksLikeForeignKey({ column: a.rel.__fromColumn });\n const bLooksFk = looksLikeForeignKey({ column: b.rel.__fromColumn });\n return aLooksFk && !bLooksFk ? { fkOwner: a, backRelation: b } : { fkOwner: b, backRelation: a };\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.__fromModel === modelName;\n if (!ownsFk) {\n planned.push({ ...base, kind: \"backOne\", isList: false, isOptional: rel.__optional });\n continue;\n }\n\n const fkColumn = model.__columns.get(rel.__fromColumn);\n planned.push({\n ...base,\n kind: \"fkOwner\",\n isList: false,\n isOptional: fkColumn?.__config.optional === true || rel.__optional,\n fields: [rel.__fromColumn],\n references: [rel.__toColumn],\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 mergeMap: ReadonlyMap<string, MergedOneToOneSide>;\n existing: readonly PlannedRelation[];\n}): PlannedRelation[] {\n const { modelName, relations, 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 [sourceModelName, sourceRelations] of Object.entries(relations)) {\n for (const [relName, rel] of Object.entries(sourceRelations)) {\n if (rel.__targetModel !== modelName || rel.__relationType !== \"one\") continue;\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(sourceRelations).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\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 models: ReadonlyMap<string, ModelDef>;\n}): PlannedRelation[] {\n const { modelName, model, models } = 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 models) {\n for (const childModel of parentModel.__children.values()) {\n if (childModel.__name !== modelName) continue;\n\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\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.\n for (const index of evaluateIndexes({ model })) {\n const key =\n index.__columns.join(\",\") + (index.__where === undefined ? \"\" : `|where:${index.__where}`);\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.__where === undefined ? {} : { where: index.__where }),\n ...(index.__nullsNotDistinct === true ? { nullsNotDistinct: true } : {}),\n ...(index.__clientName === undefined ? {} : { clientName: index.__clientName }),\n });\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// ─── Public API ───────────────────────────\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\n for (const [modelName, model] of schema.__models) {\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 mergeMap,\n existing: explicit,\n });\n const children = planChildRelations({ modelName, model, models: schema.__models });\n\n relations.set(modelName, [...explicit, ...reverses, ...children]);\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 * 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 type {\n ColumnRef,\n ManyRelationDefConfig,\n ModelDef,\n MergedRelations,\n OneRelationDefConfig,\n RelationsBuilder,\n RelationsMap,\n RelationsOutput,\n StoredRelationDef,\n ThroughRef,\n} from \"./types.ts\";\n\n// ─── Column references ────────────────────\n\nfunction createColumnRef<TModel extends string, TColumn extends string>(params: {\n model: TModel;\n column: TColumn;\n}): ColumnRef<TModel, TColumn> {\n const { model, column } = params;\n return {\n __type: \"columnRef\",\n __model: model,\n __column: column,\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\nfunction extractRefInfo(params: { ref: ColumnRef | ThroughRef }): {\n model: string;\n column: string;\n} {\n const { ref } = params;\n return { model: ref.__model, column: ref.__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 });\n const to = extractRefInfo({ ref: config.to });\n\n let throughJunction: string | undefined;\n let throughFromCol: string | undefined;\n let throughToCol: string | undefined;\n\n if (config.from.__type === \"throughRef\") {\n throughJunction = config.from.__junction;\n throughFromCol = config.from.__junctionColumn;\n }\n if (config.to.__type === \"throughRef\") {\n throughJunction = throughJunction ?? config.to.__junction;\n throughToCol = config.to.__junctionColumn;\n }\n\n return {\n __type: \"storedRelation\",\n __relationType: relationType,\n __targetModel: targetModelName,\n __fromModel: from.model,\n __fromColumn: from.column,\n __toModel: to.model,\n __toColumn: to.column,\n __throughJunction: throughJunction,\n __throughFromCol: throughFromCol,\n __throughToCol: throughToCol,\n __optional: config.optional ?? relationType === \"many\",\n __alias: config.alias,\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 of model.__columns.keys()) {\n columnRefs[columnName] = createColumnRef({ model: modelName, column: columnName });\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",
|
|
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",
|
|
13
16
|
"/**\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",
|
|
14
17
|
"/**\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",
|
|
15
|
-
"/**\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`.\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 mergeExtensionDeclarations,\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 { planSchema, resolveRelationType } from \"./relation-plan.ts\";\nimport type { PlannedIndex, PlannedRelation, SchemaPlan } from \"./relation-plan.ts\";\nimport type {\n ColumnDef,\n DecimalColumnConfig,\n IdColumnConfig,\n IndexType,\n ModelDef,\n SchemaDef,\n StringColumnConfig,\n} from \"./types.ts\";\n\n// ─── Field type ───────────────────────────\n\nfunction fieldType(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 // Nominal base only: `isUnsupported` marks the column unqueryable and\n // `nativeType` carries the real database type.\n return \"String\";\n }\n}\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\nfunction fieldDefault(params: { column: ColumnDef }): DefaultValueIR | undefined {\n const { column } = params;\n if (column.__columnType === \"id\") return idDefault({ column });\n\n const { dbgenerated, default: value } = column.__config;\n if (typeof dbgenerated === \"string\") return { kind: \"dbgenerated\", sql: dbgenerated };\n if (value === undefined) return undefined;\n\n if (column.__columnType === \"datetime\" && value === \"now\") return { kind: \"now\" };\n if (column.__columnType === \"enum\" && typeof value === \"string\") {\n return { kind: \"enumValue\", value };\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 return undefined;\n}\n\n// ─── Native types ─────────────────────────\n\nfunction nativeType(params: { column: ColumnDef }): string | undefined {\n const { column } = params;\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 === \"string\" || (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\" && column.__config.tz === true) {\n return \"Timestamptz\";\n }\n if (column.__columnType === \"unsupported\") {\n return String(column.__config.dbType);\n }\n return undefined;\n}\n\n// ─── Fields ───────────────────────────────\n\nfunction 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 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 ...(documentation === undefined ? {} : { documentation }),\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.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: { index: PlannedIndex }): IndexIR {\n const { index } = params;\n const kind: IndexKind = index.isUnique\n ? \"unique\"\n : index.indexType === undefined\n ? \"btree\"\n : INDEX_KINDS[index.indexType];\n\n return {\n kind,\n fields: index.columns.map((name) => ({ name })),\n ...(index.where === undefined ? {} : { where: index.where }),\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}): ModelIR {\n const { model, plan, extensions, declarations, issues } = 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 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) => buildIndex({ index })),\n ...(model.__checks === undefined || model.__checks.length === 0\n ? {}\n : { checks: model.__checks.map((check) => ({ name: check.name, expression: check.expression })) }),\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 }),\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 const models: ModelIR[] = Array.from(schema.__models.values(), (model) => {\n const built = buildModel({ model, plan, extensions, declarations, issues });\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 // `storage` is written only for string-backed enums: absent means\n // \"database\" (`enumStorageOf`), so IR for existing schemas is unchanged.\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\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",
|
|
16
|
-
"/**\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 if (!model.__columns.has(relation.__fromColumn)) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" references FK column \"${relation.__fromColumn}\" which doesn't exist on model \"${modelName}\"`,\n model: modelName,\n relation: relationName,\n });\n }\n if (!targetModel.__columns.has(relation.__toColumn)) {\n errors.push({\n type: \"error\",\n message: `Relation \"${relationName}\" references column \"${relation.__toColumn}\" which doesn't exist on target model \"${relation.__targetModel}\"`,\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",
|
|
17
|
-
"/**\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 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 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 { 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 {\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 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 ModelCheckConfig,\n ModelPolicyConfig,\n UniqueIndexOptions,\n IndexType,\n InlineEnumConfig,\n IntColumnConfig,\n JsonColumnConfig,\n ManyRelationDefConfig,\n ModelColumnRefs,\n ModelDef,\n OneRelationDefConfig,\n PrismaGeneratorConfig,\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) => ChainableColumn<\"int\">;\n readonly bigint: (config?: BigIntColumnConfig) => ChainableColumn<\"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) => ChainableColumn<\"json\">;\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"
|
|
18
|
+
"/**\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 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 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 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) => ChainableColumn<\"json\">;\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"
|
|
18
20
|
],
|
|
19
|
-
"mappings": "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",
|
|
20
|
-
"debugId": "
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "13292A89548F16A064756E2164756E21",
|
|
21
23
|
"names": []
|
|
22
24
|
}
|