@fragno-dev/db 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,437 @@
1
+ import { createId } from "../cuid.js";
2
+
3
+ //#region src/schema/create.ts
4
+ var RelationInit = class {
5
+ type;
6
+ referencedTable;
7
+ referencer;
8
+ on = [];
9
+ constructor(type, referencedTable, referencer) {
10
+ this.type = type;
11
+ this.referencedTable = referencedTable;
12
+ this.referencer = referencer;
13
+ }
14
+ };
15
+ /**
16
+ * Helper function to add an index to a table's index array
17
+ */
18
+ function addIndexToTable(indexes, name, columns, unique) {
19
+ indexes.push({
20
+ name,
21
+ columns,
22
+ unique
23
+ });
24
+ }
25
+ var ExplicitRelationInit = class extends RelationInit {
26
+ foreignKeyName;
27
+ initForeignKey(ormName) {
28
+ const columns = [];
29
+ const referencedColumns = [];
30
+ for (const [left, right] of this.on) {
31
+ columns.push(this.referencer.columns[left]);
32
+ referencedColumns.push(this.referencedTable.columns[right]);
33
+ }
34
+ return {
35
+ columns,
36
+ referencedColumns,
37
+ referencedTable: this.referencedTable,
38
+ table: this.referencer,
39
+ name: this.foreignKeyName ?? `${this.referencer.ormName}_${this.referencedTable.ormName}_${ormName}_fk`
40
+ };
41
+ }
42
+ init(ormName) {
43
+ return {
44
+ id: `${this.referencer.ormName}_${this.referencedTable.ormName}`,
45
+ foreignKey: this.initForeignKey(ormName),
46
+ on: this.on,
47
+ name: ormName,
48
+ referencer: this.referencer,
49
+ table: this.referencedTable,
50
+ type: this.type
51
+ };
52
+ }
53
+ /**
54
+ * Define custom foreign key name.
55
+ */
56
+ foreignKey(name) {
57
+ this.foreignKeyName = name;
58
+ return this;
59
+ }
60
+ };
61
+ var Column = class Column {
62
+ type;
63
+ name = "";
64
+ ormName = "";
65
+ isNullable = false;
66
+ isUnique = false;
67
+ isReference = false;
68
+ default;
69
+ table = void 0;
70
+ constructor(type) {
71
+ this.type = type;
72
+ }
73
+ nullable(nullable) {
74
+ this.isNullable = nullable ?? true;
75
+ return this;
76
+ }
77
+ /**
78
+ * Generate default value on runtime
79
+ */
80
+ defaultTo$(fn) {
81
+ this.default = { runtime: fn };
82
+ return this;
83
+ }
84
+ /**
85
+ * Set a database-level default value
86
+ *
87
+ * For schemaless database, it's still generated on runtime
88
+ */
89
+ defaultTo(value) {
90
+ this.default = { value };
91
+ return this;
92
+ }
93
+ clone() {
94
+ const clone = new Column(this.type);
95
+ clone.name = this.name;
96
+ clone.ormName = this.ormName;
97
+ clone.isNullable = this.isNullable;
98
+ clone.isUnique = this.isUnique;
99
+ clone.isReference = this.isReference;
100
+ clone.default = this.default;
101
+ clone.table = this.table;
102
+ return clone;
103
+ }
104
+ getUniqueConstraintName() {
105
+ return `unique_c_${this.table.ormName}_${this.ormName}`;
106
+ }
107
+ /**
108
+ * Generate default value for the column on runtime.
109
+ */
110
+ generateDefaultValue() {
111
+ if (!this.default) return;
112
+ if ("value" in this.default) return this.default.value;
113
+ if (this.default.runtime === "auto") return createId();
114
+ if (this.default.runtime === "now") return new Date(Date.now());
115
+ return this.default.runtime();
116
+ }
117
+ get $in() {
118
+ throw new Error("Type inference only");
119
+ }
120
+ get $out() {
121
+ throw new Error("Type inference only");
122
+ }
123
+ };
124
+ var IdColumn = class IdColumn extends Column {
125
+ id = true;
126
+ clone() {
127
+ const clone = new IdColumn(this.type);
128
+ clone.name = this.name;
129
+ clone.ormName = this.ormName;
130
+ clone.isNullable = this.isNullable;
131
+ clone.isUnique = this.isUnique;
132
+ clone.isReference = this.isReference;
133
+ clone.default = this.default;
134
+ clone.table = this.table;
135
+ return clone;
136
+ }
137
+ defaultTo$(fn) {
138
+ return super.defaultTo$(fn);
139
+ }
140
+ defaultTo(value) {
141
+ return super.defaultTo(value);
142
+ }
143
+ };
144
+ function column(type) {
145
+ return new Column(type);
146
+ }
147
+ /**
148
+ * Create a reference column that points to another table.
149
+ * This is used for foreign key relationships.
150
+ */
151
+ function referenceColumn(type) {
152
+ const col = new Column(type ?? "varchar(30)");
153
+ col.isReference = true;
154
+ return col;
155
+ }
156
+ function idColumn() {
157
+ const col = new IdColumn("varchar(30)");
158
+ col.defaultTo$("auto");
159
+ return col;
160
+ }
161
+ var TableBuilder = class TableBuilder {
162
+ #name;
163
+ #columns;
164
+ #relations;
165
+ #foreignKeys = [];
166
+ #indexes = [];
167
+ #version = 0;
168
+ #ormName = "";
169
+ #operations = [];
170
+ constructor(name) {
171
+ this.#name = name;
172
+ this.#columns = {};
173
+ this.#relations = {};
174
+ }
175
+ addColumn(ormName, colOrType) {
176
+ this.#version++;
177
+ const col = typeof colOrType === "string" ? column(colOrType) : colOrType;
178
+ const builder = new TableBuilder(this.#name);
179
+ builder.#columns = {
180
+ ...this.#columns,
181
+ [ormName]: col
182
+ };
183
+ builder.#relations = this.#relations;
184
+ builder.#foreignKeys = this.#foreignKeys;
185
+ builder.#indexes = this.#indexes;
186
+ builder.#version = this.#version;
187
+ builder.#ormName = this.#ormName;
188
+ builder.#operations = this.#operations;
189
+ col.ormName = ormName;
190
+ col.name = ormName;
191
+ return builder;
192
+ }
193
+ /**
194
+ * Create an index on the specified columns. Increments the version counter.
195
+ */
196
+ createIndex(name, columns, options) {
197
+ this.#version++;
198
+ const cols = columns.map((name$1) => {
199
+ const column$1 = this.#columns[name$1];
200
+ if (!column$1) throw new Error(`Unknown column name ${name$1}`);
201
+ return column$1;
202
+ });
203
+ const unique = options?.unique ?? false;
204
+ addIndexToTable(this.#indexes, name, cols, unique);
205
+ this.#operations.push({
206
+ type: "add-index",
207
+ name,
208
+ columns,
209
+ unique
210
+ });
211
+ return this;
212
+ }
213
+ /**
214
+ * Build the final table. This should be called after all columns are added.
215
+ */
216
+ build() {
217
+ let idCol;
218
+ const ormName = this.#ormName || this.#name;
219
+ const table$1 = {
220
+ name: this.#name,
221
+ ormName,
222
+ columns: this.#columns,
223
+ relations: this.#relations,
224
+ foreignKeys: this.#foreignKeys,
225
+ indexes: this.#indexes,
226
+ getColumnByName: (name) => {
227
+ return Object.values(this.#columns).find((c) => c.name === name);
228
+ },
229
+ getIdColumn: () => {
230
+ return idCol;
231
+ },
232
+ clone: () => {
233
+ const cloneColumns = {};
234
+ for (const [k, v] of Object.entries(this.#columns)) cloneColumns[k] = v.clone();
235
+ const builder = new TableBuilder(this.#name);
236
+ builder.#columns = cloneColumns;
237
+ builder.#relations = this.#relations;
238
+ builder.#foreignKeys = [...this.#foreignKeys];
239
+ builder.#indexes = [...this.#indexes];
240
+ builder.#version = this.#version;
241
+ builder.#ormName = this.#ormName;
242
+ builder.#operations = [...this.#operations];
243
+ return builder.build();
244
+ }
245
+ };
246
+ for (const k in this.#columns) {
247
+ const column$1 = this.#columns[k];
248
+ if (!column$1) continue;
249
+ column$1.table = table$1;
250
+ if (column$1 instanceof IdColumn) idCol = column$1;
251
+ }
252
+ if (idCol === void 0) throw new Error(`there's no id column in your table ${this.#name}`);
253
+ return table$1;
254
+ }
255
+ /**
256
+ * Get the current version of the table builder.
257
+ */
258
+ getVersion() {
259
+ return this.#version;
260
+ }
261
+ /**
262
+ * Get the operations performed on this table.
263
+ */
264
+ getOperations() {
265
+ return this.#operations;
266
+ }
267
+ };
268
+ /**
269
+ * Create a new table with callback pattern.
270
+ */
271
+ function table(name, callback) {
272
+ const builder = new TableBuilder(name);
273
+ return callback(builder).build();
274
+ }
275
+ var SchemaBuilder = class SchemaBuilder {
276
+ #tables;
277
+ #version = 0;
278
+ #operations = [];
279
+ constructor() {
280
+ this.#tables = {};
281
+ }
282
+ /**
283
+ * Add a table to the schema. Increments the version counter.
284
+ */
285
+ addTable(ormName, callback) {
286
+ this.#version++;
287
+ const tableBuilder = new TableBuilder(ormName);
288
+ const result = callback(tableBuilder);
289
+ const builtTable = result.build();
290
+ builtTable.ormName = ormName;
291
+ const builder = new SchemaBuilder();
292
+ builder.#tables = {
293
+ ...this.#tables,
294
+ [ormName]: builtTable
295
+ };
296
+ const newOperations = [...this.#operations, {
297
+ type: "add-table",
298
+ tableName: ormName,
299
+ table: builtTable
300
+ }];
301
+ const tableOps = result.getOperations();
302
+ for (const tableOp of tableOps) if (tableOp.type === "add-index") {
303
+ this.#version++;
304
+ newOperations.push({
305
+ type: "add-index",
306
+ tableName: ormName,
307
+ name: tableOp.name,
308
+ columns: tableOp.columns,
309
+ unique: tableOp.unique
310
+ });
311
+ }
312
+ builder.#version = this.#version;
313
+ builder.#operations = newOperations;
314
+ return builder;
315
+ }
316
+ /**
317
+ * Add a foreign key reference from this table to another table.
318
+ *
319
+ * @param tableName - The table that has the foreign key column
320
+ * @param referenceName - A name for this reference (e.g., "author", "category")
321
+ * @param config - Configuration specifying the foreign key mapping
322
+ *
323
+ * @example
324
+ * ```ts
325
+ * // Basic foreign key: post -> user
326
+ * schema(s => s
327
+ * .addTable("users", t => t.addColumn("id", idColumn()))
328
+ * .addTable("posts", t => t
329
+ * .addColumn("id", idColumn())
330
+ * .addColumn("authorId", referenceColumn()))
331
+ * .addReference("posts", "author", {
332
+ * columns: ["authorId"],
333
+ * targetTable: "users",
334
+ * targetColumns: ["id"],
335
+ * })
336
+ * )
337
+ *
338
+ * // Self-referencing foreign key
339
+ * .addReference("users", "inviter", {
340
+ * columns: ["invitedBy"],
341
+ * targetTable: "users",
342
+ * targetColumns: ["id"],
343
+ * })
344
+ *
345
+ * // Multiple foreign keys - call addReference multiple times
346
+ * .addReference("posts", "author", {
347
+ * columns: ["authorId"],
348
+ * targetTable: "users",
349
+ * targetColumns: ["id"],
350
+ * })
351
+ * .addReference("posts", "category", {
352
+ * columns: ["categoryId"],
353
+ * targetTable: "categories",
354
+ * targetColumns: ["id"],
355
+ * })
356
+ * ```
357
+ */
358
+ addReference(tableName, referenceName, config) {
359
+ this.#version++;
360
+ const table$1 = this.#tables[tableName];
361
+ const referencedTable = this.#tables[config.targetTable];
362
+ if (!table$1) throw new Error(`Table ${tableName} not found in schema`);
363
+ if (!referencedTable) throw new Error(`Referenced table ${config.targetTable} not found in schema`);
364
+ const { columns, targetColumns } = config;
365
+ if (columns.length !== targetColumns.length) throw new Error(`Reference ${referenceName}: columns and targetColumns must have the same length`);
366
+ if (columns.length !== 1) throw new Error(`Reference ${referenceName}: currently only single column foreign keys are supported`);
367
+ const columnName = columns[0];
368
+ const targetColumnName = targetColumns[0];
369
+ const column$1 = table$1.columns[columnName];
370
+ const referencedColumn = referencedTable.columns[targetColumnName];
371
+ if (!column$1) throw new Error(`Column ${columnName} not found in table ${tableName}`);
372
+ if (!referencedColumn) throw new Error(`Column ${targetColumnName} not found in table ${config.targetTable}`);
373
+ const init = new ExplicitRelationInit("one", referencedTable, table$1);
374
+ init.on.push([columnName, targetColumnName]);
375
+ const relation = init.init(referenceName);
376
+ table$1.relations[referenceName] = relation;
377
+ table$1.foreignKeys.push(relation.foreignKey);
378
+ this.#operations.push({
379
+ type: "add-reference",
380
+ tableName,
381
+ referenceName,
382
+ config: {
383
+ columns,
384
+ targetTable: config.targetTable,
385
+ targetColumns
386
+ }
387
+ });
388
+ return this;
389
+ }
390
+ /**
391
+ * Build the final schema. This should be called after all tables are added.
392
+ */
393
+ build() {
394
+ const operations = this.#operations;
395
+ const version = this.#version;
396
+ const tables = this.#tables;
397
+ return {
398
+ version,
399
+ tables,
400
+ operations,
401
+ clone: () => {
402
+ const cloneTables = {};
403
+ for (const [k, v] of Object.entries(tables)) cloneTables[k] = v.clone();
404
+ const builder = new SchemaBuilder();
405
+ builder.#tables = cloneTables;
406
+ builder.#version = version;
407
+ builder.#operations = [...operations];
408
+ return builder.build();
409
+ }
410
+ };
411
+ }
412
+ /**
413
+ * Get the current version of the schema builder.
414
+ */
415
+ getVersion() {
416
+ return this.#version;
417
+ }
418
+ };
419
+ /**
420
+ * Create a new schema with callback pattern.
421
+ */
422
+ function schema(callback) {
423
+ return callback(new SchemaBuilder()).build();
424
+ }
425
+ function compileForeignKey(key) {
426
+ return {
427
+ name: key.name,
428
+ table: key.table.name,
429
+ referencedTable: key.referencedTable.name,
430
+ referencedColumns: key.referencedColumns.map((col) => col.name),
431
+ columns: key.columns.map((col) => col.name)
432
+ };
433
+ }
434
+
435
+ //#endregion
436
+ export { Column, ExplicitRelationInit, IdColumn, SchemaBuilder, TableBuilder, column, compileForeignKey, idColumn, referenceColumn, schema, table };
437
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","names":["columns: AnyColumn[]","referencedColumns: AnyColumn[]","#name","#columns","#relations","#version","#foreignKeys","#indexes","#ormName","#operations","column","name","idCol: AnyColumn | undefined","table: Table<TColumns, TRelations>","cloneColumns: Record<string, AnyColumn>","table","#tables","newOperations: SchemaOperation[]","cloneTables: Record<string, AnyTable>"],"sources":["../../src/schema/create.ts"],"sourcesContent":["import { createId } from \"../cuid\";\n\nexport type AnySchema = Schema<Record<string, AnyTable>>;\n\nexport type AnyRelation = Relation;\n\nexport type AnyTable = Table;\n\nexport type AnyColumn =\n | Column<keyof TypeMap, unknown, unknown>\n | IdColumn<IdColumnType, unknown, unknown>;\n\n/**\n * Operations that can be performed on a table during its definition.\n */\nexport type TableOperation = {\n type: \"add-index\";\n name: string;\n columns: string[];\n unique: boolean;\n};\n\n/**\n * Operations that can be performed on a schema during its definition.\n * These are tracked so we can generate migrations for specific version ranges.\n */\nexport type SchemaOperation =\n | {\n type: \"add-table\";\n tableName: string;\n table: AnyTable;\n }\n | {\n type: \"add-reference\";\n tableName: string;\n referenceName: string;\n config: {\n columns: string[];\n targetTable: string;\n targetColumns: string[];\n };\n }\n | {\n type: \"add-index\";\n tableName: string;\n name: string;\n columns: string[];\n unique: boolean;\n };\n\nexport interface ForeignKey {\n name: string;\n table: AnyTable;\n columns: AnyColumn[];\n\n referencedTable: AnyTable;\n referencedColumns: AnyColumn[];\n}\n\nclass RelationInit<\n TRelationType extends RelationType,\n TTables extends Record<string, AnyTable>,\n TTableName extends keyof TTables,\n> {\n type: TRelationType;\n referencedTable: TTables[TTableName];\n referencer: AnyTable;\n on: [string, string][] = [];\n\n constructor(type: TRelationType, referencedTable: TTables[TTableName], referencer: AnyTable) {\n this.type = type;\n this.referencedTable = referencedTable;\n this.referencer = referencer;\n }\n}\n\nexport interface Index {\n name: string;\n columns: AnyColumn[];\n unique: boolean;\n}\n\n/**\n * Helper function to add an index to a table's index array\n */\nfunction addIndexToTable(\n indexes: Index[],\n name: string,\n columns: AnyColumn[],\n unique: boolean,\n): void {\n indexes.push({\n name,\n columns,\n unique,\n });\n}\n\nexport class ExplicitRelationInit<\n TRelationType extends RelationType,\n TTables extends Record<string, AnyTable>,\n TTableName extends keyof TTables,\n> extends RelationInit<TRelationType, TTables, TTableName> {\n private foreignKeyName?: string;\n\n private initForeignKey(ormName: string): ForeignKey {\n const columns: AnyColumn[] = [];\n const referencedColumns: AnyColumn[] = [];\n\n for (const [left, right] of this.on) {\n columns.push(this.referencer.columns[left]);\n referencedColumns.push(this.referencedTable.columns[right]);\n }\n\n return {\n columns,\n referencedColumns,\n referencedTable: this.referencedTable,\n table: this.referencer,\n name:\n this.foreignKeyName ??\n `${this.referencer.ormName}_${this.referencedTable.ormName}_${ormName}_fk`,\n };\n }\n\n init(ormName: string): Relation<TRelationType, TTables[TTableName]> {\n const id = `${this.referencer.ormName}_${this.referencedTable.ormName}`;\n\n return {\n id,\n foreignKey: this.initForeignKey(ormName),\n on: this.on,\n name: ormName,\n referencer: this.referencer,\n table: this.referencedTable,\n type: this.type,\n };\n }\n\n /**\n * Define custom foreign key name.\n */\n foreignKey(name: string) {\n this.foreignKeyName = name;\n return this;\n }\n}\n\nexport interface Relation<\n TRelationType extends RelationType = RelationType,\n TTable extends AnyTable = AnyTable,\n> {\n id: string;\n name: string;\n type: TRelationType;\n\n table: TTable;\n referencer: AnyTable;\n\n on: [string, string][];\n foreignKey: ForeignKey;\n}\n\nexport interface Table<\n TColumns extends Record<string, AnyColumn> = Record<string, AnyColumn>,\n TRelations extends Record<string, AnyRelation> = Record<string, AnyRelation>,\n> {\n name: string;\n ormName: string;\n\n columns: TColumns;\n relations: TRelations;\n foreignKeys: ForeignKey[];\n indexes: Index[];\n\n /**\n * Get column by name\n */\n getColumnByName: (name: string) => AnyColumn | undefined;\n getIdColumn: () => AnyColumn;\n\n clone: () => Table<TColumns, TRelations>;\n}\n\ntype DefaultFunctionMap = {\n date: \"now\";\n timestamp: \"now\";\n string: \"auto\";\n} & Record<`varchar(${number})`, \"auto\">;\n\ntype DefaultFunction<TType extends keyof TypeMap> =\n | (TType extends keyof DefaultFunctionMap ? DefaultFunctionMap[TType] : never)\n | (() => TypeMap[TType]);\n\ntype IdColumnType = `varchar(${number})`;\n\nexport type TypeMap = {\n string: string;\n bigint: bigint;\n integer: number;\n decimal: number;\n bool: boolean;\n json: unknown;\n /**\n * this follows the same specs as Prisma `Bytes` for consistency.\n */\n binary: Uint8Array;\n date: Date;\n timestamp: Date;\n} & Record<`varchar(${number})`, string>;\n\nexport class Column<TType extends keyof TypeMap, TIn = unknown, TOut = unknown> {\n type: TType;\n name: string = \"\";\n ormName: string = \"\";\n isNullable: boolean = false;\n isUnique: boolean = false;\n isReference: boolean = false;\n default?:\n | { value: TypeMap[TType] }\n | {\n runtime: DefaultFunction<TType>;\n };\n\n table: AnyTable = undefined as unknown as AnyTable;\n\n constructor(type: TType) {\n this.type = type;\n }\n\n nullable<TNullable extends boolean = true>(nullable?: TNullable) {\n this.isNullable = nullable ?? true;\n\n return this as Column<\n TType,\n TNullable extends true ? TIn | null : Exclude<TIn, null>,\n TNullable extends true ? TOut | null : Exclude<TOut, null>\n >;\n }\n\n /**\n * Generate default value on runtime\n */\n defaultTo$(fn: DefaultFunction<TType>): Column<TType, TIn | null, TOut> {\n this.default = { runtime: fn };\n return this;\n }\n\n /**\n * Set a database-level default value\n *\n * For schemaless database, it's still generated on runtime\n */\n defaultTo(value: TypeMap[TType]): Column<TType, TIn | null, TOut> {\n this.default = { value };\n return this;\n }\n\n clone() {\n const clone = new Column(this.type);\n clone.name = this.name;\n clone.ormName = this.ormName;\n clone.isNullable = this.isNullable;\n clone.isUnique = this.isUnique;\n clone.isReference = this.isReference;\n clone.default = this.default;\n clone.table = this.table;\n return clone;\n }\n\n getUniqueConstraintName(): string {\n return `unique_c_${this.table.ormName}_${this.ormName}`;\n }\n\n /**\n * Generate default value for the column on runtime.\n */\n generateDefaultValue(): TypeMap[TType] | undefined {\n if (!this.default) {\n return;\n }\n\n if (\"value\" in this.default) {\n return this.default.value;\n }\n if (this.default.runtime === \"auto\") {\n return createId() as TypeMap[TType];\n }\n if (this.default.runtime === \"now\") {\n return new Date(Date.now()) as TypeMap[TType];\n }\n\n return this.default.runtime();\n }\n\n get $in(): TIn {\n throw new Error(\"Type inference only\");\n }\n get $out(): TOut {\n throw new Error(\"Type inference only\");\n }\n}\n\nexport class IdColumn<\n TType extends IdColumnType = IdColumnType,\n TIn = unknown,\n TOut = unknown,\n> extends Column<TType, TIn, TOut> {\n id = true;\n\n clone() {\n const clone = new IdColumn(this.type);\n clone.name = this.name;\n clone.ormName = this.ormName;\n clone.isNullable = this.isNullable;\n clone.isUnique = this.isUnique;\n clone.isReference = this.isReference;\n clone.default = this.default;\n clone.table = this.table;\n return clone;\n }\n\n override defaultTo$(fn: DefaultFunction<TType>) {\n return super.defaultTo$(fn) as IdColumn<TType, TIn | null, TOut>;\n }\n\n override defaultTo(value: TypeMap[TType]) {\n return super.defaultTo(value) as IdColumn<TType, TIn | null, TOut>;\n }\n}\n\nexport function column<TType extends keyof TypeMap>(\n type: TType,\n): Column<TType, TypeMap[TType], TypeMap[TType]> {\n return new Column(type);\n}\n\n/**\n * Create a reference column that points to another table.\n * This is used for foreign key relationships.\n */\nexport function referenceColumn<TType extends keyof TypeMap = \"varchar(30)\">(\n type?: TType,\n): Column<TType, TypeMap[TType], TypeMap[TType]> {\n const actualType = (type ?? \"varchar(30)\") as TType;\n const col = new Column<TType, TypeMap[TType], TypeMap[TType]>(actualType);\n col.isReference = true;\n return col as Column<TType, TypeMap[TType], TypeMap[TType]>;\n}\n\nexport function idColumn(): IdColumn<\"varchar(30)\", string, string> {\n const col = new IdColumn<\"varchar(30)\", string, string>(\"varchar(30)\");\n col.defaultTo$(\"auto\");\n return col as IdColumn<\"varchar(30)\", string, string>;\n}\n\ntype RelationType = \"one\";\n\nexport class TableBuilder<\n TColumns extends Record<string, AnyColumn> = Record<string, AnyColumn>,\n TRelations extends Record<string, AnyRelation> = Record<string, AnyRelation>,\n> {\n #name: string;\n #columns: TColumns;\n #relations: TRelations;\n #foreignKeys: ForeignKey[] = [];\n #indexes: Index[] = [];\n #version: number = 0;\n #ormName: string = \"\";\n #operations: TableOperation[] = [];\n\n constructor(name: string) {\n this.#name = name;\n this.#columns = {} as TColumns;\n this.#relations = {} as TRelations;\n }\n\n /**\n * Add a column to the table. Increments the version counter.\n */\n addColumn<TColumnName extends string, TColumn extends AnyColumn>(\n ormName: TColumnName,\n col: TColumn,\n ): TableBuilder<TColumns & Record<TColumnName, TColumn>, TRelations>;\n\n /**\n * Add a column to the table with simplified syntax. Increments the version counter.\n */\n addColumn<TColumnName extends string, TType extends keyof TypeMap>(\n ormName: TColumnName,\n type: TType,\n ): TableBuilder<\n TColumns & Record<TColumnName, Column<TType, TypeMap[TType], TypeMap[TType]>>,\n TRelations\n >;\n\n addColumn<TColumnName extends string, TColumn extends AnyColumn, TType extends keyof TypeMap>(\n ormName: TColumnName,\n colOrType: TColumn | TType,\n ): TableBuilder<TColumns & Record<TColumnName, TColumn>, TRelations> {\n this.#version++;\n\n // Create the column if a type string was provided\n const col = typeof colOrType === \"string\" ? column(colOrType) : colOrType;\n\n // Create a new instance to ensure immutability semantics\n const builder = new TableBuilder<TColumns & Record<TColumnName, TColumn>, TRelations>(\n this.#name,\n );\n builder.#columns = { ...this.#columns, [ormName]: col } as TColumns &\n Record<TColumnName, TColumn>;\n builder.#relations = this.#relations;\n builder.#foreignKeys = this.#foreignKeys;\n builder.#indexes = this.#indexes;\n builder.#version = this.#version;\n builder.#ormName = this.#ormName;\n builder.#operations = this.#operations;\n\n // Set column metadata\n col.ormName = ormName;\n col.name = ormName;\n\n return builder;\n }\n\n /**\n * Create an index on the specified columns. Increments the version counter.\n */\n createIndex<TColumnName extends string & keyof TColumns>(\n name: string,\n columns: TColumnName[],\n options?: { unique?: boolean },\n ): TableBuilder<TColumns, TRelations> {\n this.#version++;\n\n const cols = columns.map((name) => {\n const column = this.#columns[name];\n if (!column) {\n throw new Error(`Unknown column name ${name}`);\n }\n return column;\n });\n\n const unique = options?.unique ?? false;\n addIndexToTable(this.#indexes, name, cols, unique);\n\n // Record the operation\n this.#operations.push({\n type: \"add-index\",\n name,\n columns: columns as string[],\n unique,\n });\n\n return this;\n }\n\n /**\n * Build the final table. This should be called after all columns are added.\n */\n build(): Table<TColumns, TRelations> {\n let idCol: AnyColumn | undefined;\n\n // Use name as ormName if ormName is not set\n const ormName = this.#ormName || this.#name;\n\n const table: Table<TColumns, TRelations> = {\n name: this.#name,\n ormName,\n columns: this.#columns,\n relations: this.#relations,\n foreignKeys: this.#foreignKeys,\n indexes: this.#indexes,\n getColumnByName: (name) => {\n return Object.values(this.#columns).find((c) => c.name === name);\n },\n getIdColumn: () => {\n return idCol!;\n },\n clone: () => {\n const cloneColumns: Record<string, AnyColumn> = {};\n\n for (const [k, v] of Object.entries(this.#columns)) {\n cloneColumns[k] = v.clone();\n }\n\n const builder = new TableBuilder<TColumns, TRelations>(this.#name);\n builder.#columns = cloneColumns as TColumns;\n builder.#relations = this.#relations;\n builder.#foreignKeys = [...this.#foreignKeys];\n builder.#indexes = [...this.#indexes];\n builder.#version = this.#version;\n builder.#ormName = this.#ormName;\n builder.#operations = [...this.#operations];\n\n const cloned = builder.build();\n\n return cloned;\n },\n };\n\n // Set table reference and find id column\n for (const k in this.#columns) {\n const column = this.#columns[k];\n if (!column) {\n continue;\n }\n\n column.table = table;\n if (column instanceof IdColumn) {\n idCol = column;\n }\n }\n\n if (idCol === undefined) {\n throw new Error(`there's no id column in your table ${this.#name}`);\n }\n\n return table;\n }\n\n /**\n * Get the current version of the table builder.\n */\n getVersion(): number {\n return this.#version;\n }\n\n /**\n * Get the operations performed on this table.\n */\n getOperations(): TableOperation[] {\n return this.#operations;\n }\n}\n\n/**\n * Create a new table with callback pattern.\n */\nexport function table<\n TColumns extends Record<string, AnyColumn> = Record<string, AnyColumn>,\n TRelations extends Record<string, AnyRelation> = Record<string, AnyRelation>,\n>(\n name: string,\n callback: (\n builder: TableBuilder<Record<string, AnyColumn>, Record<string, AnyRelation>>,\n ) => TableBuilder<TColumns, TRelations>,\n): Table<TColumns, TRelations> {\n const builder = new TableBuilder(name);\n const result = callback(builder);\n return result.build();\n}\n\nexport interface Schema<TTables extends Record<string, AnyTable> = Record<string, AnyTable>> {\n /**\n * @description The version of the schema, automatically incremented on each change.\n */\n version: number;\n tables: TTables;\n /**\n * @description Operations performed on this schema, in order.\n * Used to generate migrations for specific version ranges.\n */\n operations: SchemaOperation[];\n\n clone: () => Schema<TTables>;\n}\n\nexport class SchemaBuilder<TTables extends Record<string, AnyTable> = Record<string, never>> {\n #tables: TTables;\n #version: number = 0;\n #operations: SchemaOperation[] = [];\n\n constructor() {\n this.#tables = {} as TTables;\n }\n\n /**\n * Add a table to the schema. Increments the version counter.\n */\n addTable<\n TTableName extends string,\n TColumns extends Record<string, AnyColumn>,\n TRelations extends Record<string, AnyRelation>,\n >(\n ormName: TTableName,\n callback: (\n builder: TableBuilder<Record<string, AnyColumn>, Record<string, AnyRelation>>,\n ) => TableBuilder<TColumns, TRelations>,\n ): SchemaBuilder<TTables & Record<TTableName, Table<TColumns, TRelations>>> {\n this.#version++;\n\n const tableBuilder = new TableBuilder(ormName);\n const result = callback(tableBuilder);\n const builtTable = result.build();\n\n // Set table metadata\n builtTable.ormName = ormName;\n\n const builder = new SchemaBuilder<TTables & Record<TTableName, Table<TColumns, TRelations>>>();\n builder.#tables = { ...this.#tables, [ormName]: builtTable } as TTables &\n Record<TTableName, Table<TColumns, TRelations>>;\n\n // Start with existing operations plus the add-table operation\n const newOperations: SchemaOperation[] = [\n ...this.#operations,\n {\n type: \"add-table\",\n tableName: ormName,\n table: builtTable,\n },\n ];\n\n // Promote table operations to schema operations and increment version for each\n const tableOps = result.getOperations();\n for (const tableOp of tableOps) {\n if (tableOp.type === \"add-index\") {\n this.#version++;\n newOperations.push({\n type: \"add-index\",\n tableName: ormName,\n name: tableOp.name,\n columns: tableOp.columns,\n unique: tableOp.unique,\n });\n }\n }\n\n builder.#version = this.#version;\n builder.#operations = newOperations;\n\n return builder;\n }\n\n /**\n * Add a foreign key reference from this table to another table.\n *\n * @param tableName - The table that has the foreign key column\n * @param referenceName - A name for this reference (e.g., \"author\", \"category\")\n * @param config - Configuration specifying the foreign key mapping\n *\n * @example\n * ```ts\n * // Basic foreign key: post -> user\n * schema(s => s\n * .addTable(\"users\", t => t.addColumn(\"id\", idColumn()))\n * .addTable(\"posts\", t => t\n * .addColumn(\"id\", idColumn())\n * .addColumn(\"authorId\", referenceColumn()))\n * .addReference(\"posts\", \"author\", {\n * columns: [\"authorId\"],\n * targetTable: \"users\",\n * targetColumns: [\"id\"],\n * })\n * )\n *\n * // Self-referencing foreign key\n * .addReference(\"users\", \"inviter\", {\n * columns: [\"invitedBy\"],\n * targetTable: \"users\",\n * targetColumns: [\"id\"],\n * })\n *\n * // Multiple foreign keys - call addReference multiple times\n * .addReference(\"posts\", \"author\", {\n * columns: [\"authorId\"],\n * targetTable: \"users\",\n * targetColumns: [\"id\"],\n * })\n * .addReference(\"posts\", \"category\", {\n * columns: [\"categoryId\"],\n * targetTable: \"categories\",\n * targetColumns: [\"id\"],\n * })\n * ```\n */\n addReference<\n TTableName extends string & keyof TTables,\n TReferencedTableName extends string & keyof TTables,\n >(\n tableName: TTableName,\n referenceName: string,\n config: {\n columns: (keyof TTables[TTableName][\"columns\"])[];\n targetTable: TReferencedTableName;\n targetColumns: (keyof TTables[TReferencedTableName][\"columns\"])[];\n },\n ): SchemaBuilder<TTables> {\n this.#version++;\n\n const table = this.#tables[tableName];\n const referencedTable = this.#tables[config.targetTable];\n\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n if (!referencedTable) {\n throw new Error(`Referenced table ${config.targetTable} not found in schema`);\n }\n\n const { columns, targetColumns } = config;\n\n if (columns.length !== targetColumns.length) {\n throw new Error(\n `Reference ${referenceName}: columns and targetColumns must have the same length`,\n );\n }\n\n // For now, only support single column foreign keys\n if (columns.length !== 1) {\n throw new Error(\n `Reference ${referenceName}: currently only single column foreign keys are supported`,\n );\n }\n\n const columnName = columns[0] as string;\n const targetColumnName = targetColumns[0] as string;\n\n const column = table.columns[columnName];\n const referencedColumn = referencedTable.columns[targetColumnName];\n\n if (!column) {\n throw new Error(`Column ${columnName} not found in table ${tableName}`);\n }\n if (!referencedColumn) {\n throw new Error(`Column ${targetColumnName} not found in table ${config.targetTable}`);\n }\n\n // Create the relation\n const init = new ExplicitRelationInit(\"one\", referencedTable, table);\n init.on.push([columnName, targetColumnName]);\n const relation = init.init(referenceName);\n\n // Add relation and foreign key to the table\n table.relations[referenceName] = relation;\n table.foreignKeys.push(relation.foreignKey);\n\n // Record the operation\n this.#operations.push({\n type: \"add-reference\",\n tableName: tableName as string,\n referenceName,\n config: {\n columns: columns as string[],\n targetTable: config.targetTable as string,\n targetColumns: targetColumns as string[],\n },\n });\n\n return this;\n }\n\n /**\n * Build the final schema. This should be called after all tables are added.\n */\n build(): Schema<TTables> {\n const operations = this.#operations;\n const version = this.#version;\n const tables = this.#tables;\n\n const schema: Schema<TTables> = {\n version,\n tables,\n operations,\n clone: () => {\n const cloneTables: Record<string, AnyTable> = {};\n\n for (const [k, v] of Object.entries(tables)) {\n cloneTables[k] = v.clone();\n }\n\n const builder = new SchemaBuilder<TTables>();\n builder.#tables = cloneTables as TTables;\n builder.#version = version;\n builder.#operations = [...operations];\n\n return builder.build();\n },\n };\n\n return schema;\n }\n\n /**\n * Get the current version of the schema builder.\n */\n getVersion(): number {\n return this.#version;\n }\n}\n\n/**\n * Create a new schema with callback pattern.\n */\nexport function schema<TTables extends Record<string, AnyTable> = Record<string, never>>(\n callback: (builder: SchemaBuilder<Record<string, never>>) => SchemaBuilder<TTables>,\n): Schema<TTables> {\n return callback(new SchemaBuilder()).build();\n}\n\nexport function compileForeignKey(key: ForeignKey) {\n return {\n name: key.name,\n table: key.table.name,\n referencedTable: key.referencedTable.name,\n referencedColumns: key.referencedColumns.map((col) => col.name),\n columns: key.columns.map((col) => col.name),\n };\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@fragno-dev/db",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ "./schema": {
7
+ "bun": "./src/schema/create.ts",
8
+ "development": "./src/schema/create.ts",
9
+ "types": "./dist/schema/create.d.ts",
10
+ "default": "./dist/schema/create.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsdown",
15
+ "build:watch": "tsdown --watch",
16
+ "types:check": "tsc --noEmit"
17
+ },
18
+ "devDependencies": {
19
+ "@fragno-private/typescript-config": "0.0.1",
20
+ "@types/node": "^22",
21
+ "vitest": "^3.2.4"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/rejot-dev/fragno.git",
26
+ "directory": "packages/fragno-db"
27
+ },
28
+ "homepage": "https://fragno.dev",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "@paralleldrive/cuid2": "^2.2.2",
32
+ "kysely": "^0.28.7"
33
+ }
34
+ }
package/src/cuid.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { createId } from "@paralleldrive/cuid2";
2
+
3
+ export { createId };