@hedystia/db 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +13 -0
  2. package/dist/_virtual/_rolldown/runtime.mjs +17 -0
  3. package/dist/cache/manager.cjs +137 -0
  4. package/dist/cache/manager.cjs.map +1 -0
  5. package/dist/cache/manager.d.cts +72 -0
  6. package/dist/cache/manager.d.mts +72 -0
  7. package/dist/cache/manager.mjs +140 -0
  8. package/dist/cache/manager.mjs.map +1 -0
  9. package/dist/cache/memory-store.cjs +122 -0
  10. package/dist/cache/memory-store.cjs.map +1 -0
  11. package/dist/cache/memory-store.mjs +122 -0
  12. package/dist/cache/memory-store.mjs.map +1 -0
  13. package/dist/cli/commands/migration.cjs +22 -0
  14. package/dist/cli/commands/migration.cjs.map +1 -0
  15. package/dist/cli/commands/migration.mjs +32 -0
  16. package/dist/cli/commands/migration.mjs.map +1 -0
  17. package/dist/cli/commands/schema.cjs +21 -0
  18. package/dist/cli/commands/schema.cjs.map +1 -0
  19. package/dist/cli/commands/schema.mjs +30 -0
  20. package/dist/cli/commands/schema.mjs.map +1 -0
  21. package/dist/cli.cjs +50 -0
  22. package/dist/cli.cjs.map +1 -0
  23. package/dist/cli.d.cts +1 -0
  24. package/dist/cli.d.mts +1 -0
  25. package/dist/cli.mjs +57 -0
  26. package/dist/cli.mjs.map +1 -0
  27. package/dist/constants.cjs +16 -0
  28. package/dist/constants.cjs.map +1 -0
  29. package/dist/constants.mjs +16 -0
  30. package/dist/constants.mjs.map +1 -0
  31. package/dist/core/database.cjs +158 -0
  32. package/dist/core/database.cjs.map +1 -0
  33. package/dist/core/database.d.cts +74 -0
  34. package/dist/core/database.d.mts +74 -0
  35. package/dist/core/database.mjs +159 -0
  36. package/dist/core/database.mjs.map +1 -0
  37. package/dist/core/repository.cjs +416 -0
  38. package/dist/core/repository.cjs.map +1 -0
  39. package/dist/core/repository.d.cts +110 -0
  40. package/dist/core/repository.d.mts +110 -0
  41. package/dist/core/repository.mjs +416 -0
  42. package/dist/core/repository.mjs.map +1 -0
  43. package/dist/drivers/driver.cjs +11 -0
  44. package/dist/drivers/driver.cjs.map +1 -0
  45. package/dist/drivers/driver.mjs +11 -0
  46. package/dist/drivers/driver.mjs.map +1 -0
  47. package/dist/drivers/file.cjs +336 -0
  48. package/dist/drivers/file.cjs.map +1 -0
  49. package/dist/drivers/file.mjs +337 -0
  50. package/dist/drivers/file.mjs.map +1 -0
  51. package/dist/drivers/index.cjs +28 -0
  52. package/dist/drivers/index.cjs.map +1 -0
  53. package/dist/drivers/index.d.cts +14 -0
  54. package/dist/drivers/index.d.mts +14 -0
  55. package/dist/drivers/index.mjs +28 -0
  56. package/dist/drivers/index.mjs.map +1 -0
  57. package/dist/drivers/mysql.cjs +272 -0
  58. package/dist/drivers/mysql.cjs.map +1 -0
  59. package/dist/drivers/mysql.mjs +272 -0
  60. package/dist/drivers/mysql.mjs.map +1 -0
  61. package/dist/drivers/sql-compiler.cjs +284 -0
  62. package/dist/drivers/sql-compiler.cjs.map +1 -0
  63. package/dist/drivers/sql-compiler.d.cts +66 -0
  64. package/dist/drivers/sql-compiler.d.mts +66 -0
  65. package/dist/drivers/sql-compiler.mjs +276 -0
  66. package/dist/drivers/sql-compiler.mjs.map +1 -0
  67. package/dist/drivers/sqlite.cjs +262 -0
  68. package/dist/drivers/sqlite.cjs.map +1 -0
  69. package/dist/drivers/sqlite.mjs +262 -0
  70. package/dist/drivers/sqlite.mjs.map +1 -0
  71. package/dist/errors.cjs +74 -0
  72. package/dist/errors.cjs.map +1 -0
  73. package/dist/errors.d.cts +46 -0
  74. package/dist/errors.d.mts +46 -0
  75. package/dist/errors.mjs +68 -0
  76. package/dist/errors.mjs.map +1 -0
  77. package/dist/index.cjs +69 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.cts +15 -0
  80. package/dist/index.d.mts +15 -0
  81. package/dist/index.mjs +21 -0
  82. package/dist/index.mjs.map +1 -0
  83. package/dist/migrations/definition.cjs +20 -0
  84. package/dist/migrations/definition.cjs.map +1 -0
  85. package/dist/migrations/definition.d.cts +18 -0
  86. package/dist/migrations/definition.d.mts +18 -0
  87. package/dist/migrations/definition.mjs +23 -0
  88. package/dist/migrations/definition.mjs.map +1 -0
  89. package/dist/migrations/index.mjs +12 -0
  90. package/dist/migrations/index.mjs.map +1 -0
  91. package/dist/migrations/templates.cjs +39 -0
  92. package/dist/migrations/templates.cjs.map +1 -0
  93. package/dist/migrations/templates.d.cts +16 -0
  94. package/dist/migrations/templates.d.mts +16 -0
  95. package/dist/migrations/templates.mjs +41 -0
  96. package/dist/migrations/templates.mjs.map +1 -0
  97. package/dist/schema/column.cjs +161 -0
  98. package/dist/schema/column.cjs.map +1 -0
  99. package/dist/schema/column.d.cts +120 -0
  100. package/dist/schema/column.d.mts +120 -0
  101. package/dist/schema/column.mjs +161 -0
  102. package/dist/schema/column.mjs.map +1 -0
  103. package/dist/schema/columns/index.cjs +202 -0
  104. package/dist/schema/columns/index.cjs.map +1 -0
  105. package/dist/schema/columns/index.d.cts +141 -0
  106. package/dist/schema/columns/index.d.mts +141 -0
  107. package/dist/schema/columns/index.mjs +182 -0
  108. package/dist/schema/columns/index.mjs.map +1 -0
  109. package/dist/schema/registry.cjs +125 -0
  110. package/dist/schema/registry.cjs.map +1 -0
  111. package/dist/schema/registry.d.cts +66 -0
  112. package/dist/schema/registry.d.mts +66 -0
  113. package/dist/schema/registry.mjs +125 -0
  114. package/dist/schema/registry.mjs.map +1 -0
  115. package/dist/schema/table.cjs +39 -0
  116. package/dist/schema/table.cjs.map +1 -0
  117. package/dist/schema/table.d.cts +17 -0
  118. package/dist/schema/table.d.mts +17 -0
  119. package/dist/schema/table.mjs +39 -0
  120. package/dist/schema/table.mjs.map +1 -0
  121. package/dist/sync/synchronizer.cjs +43 -0
  122. package/dist/sync/synchronizer.cjs.map +1 -0
  123. package/dist/sync/synchronizer.d.cts +22 -0
  124. package/dist/sync/synchronizer.d.mts +22 -0
  125. package/dist/sync/synchronizer.mjs +43 -0
  126. package/dist/sync/synchronizer.mjs.map +1 -0
  127. package/dist/types.d.cts +229 -0
  128. package/dist/types.d.mts +229 -0
  129. package/dist/utils/fs.cjs +24 -0
  130. package/dist/utils/fs.cjs.map +1 -0
  131. package/dist/utils/fs.mjs +26 -0
  132. package/dist/utils/fs.mjs.map +1 -0
  133. package/dist/utils/index.mjs +14 -0
  134. package/dist/utils/index.mjs.map +1 -0
  135. package/dist/utils/naming.cjs +13 -0
  136. package/dist/utils/naming.cjs.map +1 -0
  137. package/dist/utils/naming.mjs +16 -0
  138. package/dist/utils/naming.mjs.map +1 -0
  139. package/dist/utils/stable-stringify.cjs +19 -0
  140. package/dist/utils/stable-stringify.cjs.map +1 -0
  141. package/dist/utils/stable-stringify.mjs +22 -0
  142. package/dist/utils/stable-stringify.mjs.map +1 -0
  143. package/package.json +64 -27
  144. package/readme.md +87 -105
  145. package/index.d.ts +0 -65
  146. package/index.js +0 -1
@@ -0,0 +1,125 @@
1
+ import { SchemaError } from "../errors.mjs";
2
+ //#region src/schema/registry.ts
3
+ /**
4
+ * Schema registry that manages table definitions and resolves references
5
+ */
6
+ var SchemaRegistry = class {
7
+ tables = /* @__PURE__ */ new Map();
8
+ definitions = /* @__PURE__ */ new Map();
9
+ columnMaps = /* @__PURE__ */ new Map();
10
+ reverseColumnMaps = /* @__PURE__ */ new Map();
11
+ relations = /* @__PURE__ */ new Map();
12
+ /**
13
+ * Register table definitions and resolve all deferred references
14
+ * @param {readonly TableDefinition[]} schemas - Table definitions to register
15
+ */
16
+ register(schemas) {
17
+ for (const schema of schemas) {
18
+ if (!schema.__table || !schema.__name) throw new SchemaError("Invalid table definition");
19
+ this.definitions.set(schema.__name, schema);
20
+ this.tables.set(schema.__name, {
21
+ name: schema.__name,
22
+ columns: [...schema.__columns]
23
+ });
24
+ const colMap = schema.__columnMap ?? {};
25
+ this.columnMaps.set(schema.__name, colMap);
26
+ const reverseMap = {};
27
+ for (const [codeKey, dbName] of Object.entries(colMap)) reverseMap[dbName] = codeKey;
28
+ this.reverseColumnMaps.set(schema.__name, reverseMap);
29
+ }
30
+ for (const schema of schemas) for (const ref of schema.__deferredRefs) {
31
+ const resolved = ref.resolve();
32
+ if (!resolved.table || !resolved.column) throw new SchemaError(`Failed to resolve reference for ${schema.__name}.${ref.columnName}`);
33
+ if (!this.tables.has(resolved.table)) throw new SchemaError(`Referenced table "${resolved.table}" does not exist in schema registry`);
34
+ const dbColumnName = (this.columnMaps.get(schema.__name) ?? {})[ref.columnName] ?? ref.columnName;
35
+ const column = schema.__columns.find((c) => c.name === dbColumnName);
36
+ if (column) column.references = {
37
+ table: resolved.table,
38
+ column: resolved.column,
39
+ onDelete: ref.onDelete,
40
+ onUpdate: ref.onUpdate,
41
+ relationName: ref.relationName
42
+ };
43
+ const relationName = ref.relationName || ref.columnName.replace(/Id$/, "").replace(/_id$/, "");
44
+ if (!this.relations.has(schema.__name)) this.relations.set(schema.__name, []);
45
+ this.relations.get(schema.__name).push({
46
+ from: {
47
+ table: schema.__name,
48
+ column: dbColumnName
49
+ },
50
+ to: {
51
+ table: resolved.table,
52
+ column: resolved.column
53
+ },
54
+ relationName
55
+ });
56
+ if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
57
+ const reverseRelationName = schema.__name;
58
+ this.relations.get(resolved.table).push({
59
+ from: {
60
+ table: resolved.table,
61
+ column: resolved.column
62
+ },
63
+ to: {
64
+ table: schema.__name,
65
+ column: dbColumnName
66
+ },
67
+ relationName: reverseRelationName
68
+ });
69
+ }
70
+ }
71
+ /**
72
+ * Get table metadata by name
73
+ * @param {string} name - Table name
74
+ * @returns {TableMetadata | undefined} The table metadata
75
+ */
76
+ getTable(name) {
77
+ return this.tables.get(name);
78
+ }
79
+ /**
80
+ * Get all registered table metadata
81
+ * @returns {Map<string, TableMetadata>} All registered tables
82
+ */
83
+ getAllTables() {
84
+ return this.tables;
85
+ }
86
+ /**
87
+ * Get relations for a table
88
+ * @param {string} tableName - Table name
89
+ * @returns {Array<object>} Relations for the table
90
+ */
91
+ getRelations(tableName) {
92
+ return this.relations.get(tableName) ?? [];
93
+ }
94
+ /**
95
+ * Get the primary key column name for a table (returns DB column name)
96
+ * @param {string} tableName - Table name
97
+ * @returns {string | null} The primary key column name or null
98
+ */
99
+ getPrimaryKey(tableName) {
100
+ const table = this.tables.get(tableName);
101
+ if (!table) return null;
102
+ for (const col of table.columns) if (col.primaryKey) return col.name;
103
+ return null;
104
+ }
105
+ /**
106
+ * Get the column name map (code key -> DB column name) for a table
107
+ * @param {string} tableName - Table name
108
+ * @returns {Record<string, string>} Column name map
109
+ */
110
+ getColumnMap(tableName) {
111
+ return this.columnMaps.get(tableName) ?? {};
112
+ }
113
+ /**
114
+ * Get the reverse column name map (DB column name -> code key) for a table
115
+ * @param {string} tableName - Table name
116
+ * @returns {Record<string, string>} Reverse column name map
117
+ */
118
+ getReverseColumnMap(tableName) {
119
+ return this.reverseColumnMaps.get(tableName) ?? {};
120
+ }
121
+ };
122
+ //#endregion
123
+ export { SchemaRegistry };
124
+
125
+ //# sourceMappingURL=registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mjs","names":[],"sources":["../../src/schema/registry.ts"],"sourcesContent":["import { SchemaError } from \"../errors\";\nimport type { TableDefinition, TableMetadata } from \"../types\";\n\n/**\n * Schema registry that manages table definitions and resolves references\n */\nexport class SchemaRegistry {\n private tables = new Map<string, TableMetadata>();\n private definitions = new Map<string, TableDefinition>();\n private columnMaps = new Map<string, Record<string, string>>();\n private reverseColumnMaps = new Map<string, Record<string, string>>();\n private relations = new Map<\n string,\n Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }>\n >();\n\n /**\n * Register table definitions and resolve all deferred references\n * @param {readonly TableDefinition[]} schemas - Table definitions to register\n */\n register(schemas: readonly TableDefinition<any, any, any, any>[]): void {\n for (const schema of schemas) {\n if (!schema.__table || !schema.__name) {\n throw new SchemaError(\"Invalid table definition\");\n }\n\n this.definitions.set(schema.__name, schema);\n this.tables.set(schema.__name, {\n name: schema.__name,\n columns: [...schema.__columns],\n });\n\n const colMap: Record<string, string> = schema.__columnMap ?? {};\n this.columnMaps.set(schema.__name, colMap);\n const reverseMap: Record<string, string> = {};\n for (const [codeKey, dbName] of Object.entries(colMap)) {\n reverseMap[dbName] = codeKey;\n }\n this.reverseColumnMaps.set(schema.__name, reverseMap);\n }\n\n for (const schema of schemas) {\n for (const ref of schema.__deferredRefs) {\n const resolved = ref.resolve();\n if (!resolved.table || !resolved.column) {\n throw new SchemaError(\n `Failed to resolve reference for ${schema.__name}.${ref.columnName}`,\n );\n }\n\n if (!this.tables.has(resolved.table)) {\n throw new SchemaError(\n `Referenced table \"${resolved.table}\" does not exist in schema registry`,\n );\n }\n\n const colMap = this.columnMaps.get(schema.__name) ?? {};\n const dbColumnName = colMap[ref.columnName] ?? ref.columnName;\n const column = schema.__columns.find((c: any) => c.name === dbColumnName);\n if (column) {\n column.references = {\n table: resolved.table,\n column: resolved.column,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n relationName: ref.relationName,\n };\n }\n\n const relationName =\n ref.relationName || ref.columnName.replace(/Id$/, \"\").replace(/_id$/, \"\");\n\n if (!this.relations.has(schema.__name)) {\n this.relations.set(schema.__name, []);\n }\n this.relations.get(schema.__name)!.push({\n from: { table: schema.__name, column: dbColumnName },\n to: { table: resolved.table, column: resolved.column },\n relationName,\n });\n\n if (!this.relations.has(resolved.table)) {\n this.relations.set(resolved.table, []);\n }\n const reverseRelationName = schema.__name;\n this.relations.get(resolved.table)!.push({\n from: { table: resolved.table, column: resolved.column },\n to: { table: schema.__name, column: dbColumnName },\n relationName: reverseRelationName,\n });\n }\n }\n }\n\n /**\n * Get table metadata by name\n * @param {string} name - Table name\n * @returns {TableMetadata | undefined} The table metadata\n */\n getTable(name: string): TableMetadata | undefined {\n return this.tables.get(name);\n }\n\n /**\n * Get all registered table metadata\n * @returns {Map<string, TableMetadata>} All registered tables\n */\n getAllTables(): Map<string, TableMetadata> {\n return this.tables;\n }\n\n /**\n * Get relations for a table\n * @param {string} tableName - Table name\n * @returns {Array<object>} Relations for the table\n */\n getRelations(tableName: string): Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }> {\n return this.relations.get(tableName) ?? [];\n }\n\n /**\n * Get the primary key column name for a table (returns DB column name)\n * @param {string} tableName - Table name\n * @returns {string | null} The primary key column name or null\n */\n getPrimaryKey(tableName: string): string | null {\n const table = this.tables.get(tableName);\n if (!table) {\n return null;\n }\n for (const col of table.columns) {\n if (col.primaryKey) {\n return col.name;\n }\n }\n return null;\n }\n\n /**\n * Get the column name map (code key -> DB column name) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Column name map\n */\n getColumnMap(tableName: string): Record<string, string> {\n return this.columnMaps.get(tableName) ?? {};\n }\n\n /**\n * Get the reverse column name map (DB column name -> code key) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Reverse column name map\n */\n getReverseColumnMap(tableName: string): Record<string, string> {\n return this.reverseColumnMaps.get(tableName) ?? {};\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ //#region src/schema/table.ts
2
+ /**
3
+ * Define a database table with its columns
4
+ * @param {string} name - The table name
5
+ * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions
6
+ * @returns {TableDefinition<T, C>} The table definition object with column accessors
7
+ */
8
+ function table(name, columns) {
9
+ const columnsArray = [];
10
+ const deferredRefs = [];
11
+ const columnMap = {};
12
+ for (const [key, builder] of Object.entries(columns)) {
13
+ const meta = builder.__build(key);
14
+ columnsArray.push(meta);
15
+ columnMap[key] = meta.name;
16
+ const ref = builder.__getDeferredRef();
17
+ if (ref) deferredRefs.push({
18
+ columnName: key,
19
+ resolve: ref.resolve,
20
+ onDelete: ref.onDelete,
21
+ onUpdate: ref.onUpdate,
22
+ relationName: ref.relationName
23
+ });
24
+ builder.__tableName = name;
25
+ builder.__columnName = key;
26
+ }
27
+ return {
28
+ __table: true,
29
+ __name: name,
30
+ __columns: columnsArray,
31
+ __columnMap: columnMap,
32
+ __deferredRefs: deferredRefs,
33
+ ...columns
34
+ };
35
+ }
36
+ //#endregion
37
+ exports.table = table;
38
+
39
+ //# sourceMappingURL=table.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.cjs","names":[],"sources":["../../src/schema/table.ts"],"sourcesContent":["import type { ColumnMetadata, DeferredRefMeta, TableDefinition } from \"../types\";\nimport type { ColumnBuilder } from \"./column\";\n\ntype BindColumn<C, TableName extends string, ColName extends string> =\n C extends ColumnBuilder<infer T, any, any, infer Ref>\n ? ColumnBuilder<\n T,\n TableName,\n ColName,\n Ref extends DeferredRefMeta<any, infer ToTable, infer ToColumn, infer RelName>\n ? DeferredRefMeta<ColName, ToTable, ToColumn, RelName>\n : never\n >\n : never;\n\ntype BoundColumns<C extends Record<string, ColumnBuilder<any, any, any, any>>, N extends string> = {\n [K in keyof C]: BindColumn<C[K], N, Extract<K, string>>;\n};\n\ntype ExtractDeferredRefs<C extends Record<string, ColumnBuilder<any, any, any, any>>> = {\n [K in keyof C]: C[K] extends ColumnBuilder<any, any, any, infer Ref> ? Ref : never;\n}[keyof C];\n\n/**\n * Define a database table with its columns\n * @param {string} name - The table name\n * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions\n * @returns {TableDefinition<T, C>} The table definition object with column accessors\n */\nexport function table<\n N extends string,\n C extends Record<string, ColumnBuilder<any, any, any, any>>,\n>(\n name: N,\n columns: C,\n): TableDefinition<\n { [K in keyof C]: C[K][\"__type\"] },\n BoundColumns<C, N>,\n N,\n ExtractDeferredRefs<BoundColumns<C, N>>\n> {\n const columnsArray: ColumnMetadata[] = [];\n const deferredRefs: TableDefinition[\"__deferredRefs\"] = [];\n const columnMap: Record<string, string> = {};\n\n for (const [key, builder] of Object.entries(columns)) {\n const meta = builder.__build(key);\n columnsArray.push(meta);\n columnMap[key] = meta.name;\n\n const ref = builder.__getDeferredRef();\n if (ref) {\n deferredRefs.push({\n columnName: key,\n resolve: ref.resolve,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n relationName: ref.relationName,\n });\n }\n\n (builder as any).__tableName = name;\n (builder as any).__columnName = key;\n }\n\n const def = {\n __table: true,\n __name: name,\n __columns: columnsArray,\n __columnMap: columnMap,\n __deferredRefs: deferredRefs,\n ...columns,\n };\n\n return def as any;\n}\n"],"mappings":";;;;;;;AA6BA,SAAgB,MAId,MACA,SAMA;CACA,MAAM,eAAiC,EAAE;CACzC,MAAM,eAAkD,EAAE;CAC1D,MAAM,YAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,OAAO,QAAQ,QAAQ,IAAI;AACjC,eAAa,KAAK,KAAK;AACvB,YAAU,OAAO,KAAK;EAEtB,MAAM,MAAM,QAAQ,kBAAkB;AACtC,MAAI,IACF,cAAa,KAAK;GAChB,YAAY;GACZ,SAAS,IAAI;GACb,UAAU,IAAI;GACd,UAAU,IAAI;GACd,cAAc,IAAI;GACnB,CAAC;AAGH,UAAgB,cAAc;AAC9B,UAAgB,eAAe;;AAYlC,QATY;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,aAAa;EACb,gBAAgB;EAChB,GAAG;EACJ"}
@@ -0,0 +1,17 @@
1
+ import { DeferredRefMeta, TableDefinition } from "../types.cjs";
2
+ import { ColumnBuilder } from "./column.cjs";
3
+
4
+ //#region src/schema/table.d.ts
5
+ type BindColumn<C, TableName extends string, ColName extends string> = C extends ColumnBuilder<infer T, any, any, infer Ref> ? ColumnBuilder<T, TableName, ColName, Ref extends DeferredRefMeta<any, infer ToTable, infer ToColumn, infer RelName> ? DeferredRefMeta<ColName, ToTable, ToColumn, RelName> : never> : never;
6
+ type BoundColumns<C extends Record<string, ColumnBuilder<any, any, any, any>>, N extends string> = { [K in keyof C]: BindColumn<C[K], N, Extract<K, string>> };
7
+ type ExtractDeferredRefs<C extends Record<string, ColumnBuilder<any, any, any, any>>> = { [K in keyof C]: C[K] extends ColumnBuilder<any, any, any, infer Ref> ? Ref : never }[keyof C];
8
+ /**
9
+ * Define a database table with its columns
10
+ * @param {string} name - The table name
11
+ * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions
12
+ * @returns {TableDefinition<T, C>} The table definition object with column accessors
13
+ */
14
+ declare function table<N extends string, C extends Record<string, ColumnBuilder<any, any, any, any>>>(name: N, columns: C): TableDefinition<{ [K in keyof C]: C[K]["__type"] }, BoundColumns<C, N>, N, ExtractDeferredRefs<BoundColumns<C, N>>>;
15
+ //#endregion
16
+ export { table };
17
+ //# sourceMappingURL=table.d.cts.map
@@ -0,0 +1,17 @@
1
+ import { DeferredRefMeta, TableDefinition } from "../types.mjs";
2
+ import { ColumnBuilder } from "./column.mjs";
3
+
4
+ //#region src/schema/table.d.ts
5
+ type BindColumn<C, TableName extends string, ColName extends string> = C extends ColumnBuilder<infer T, any, any, infer Ref> ? ColumnBuilder<T, TableName, ColName, Ref extends DeferredRefMeta<any, infer ToTable, infer ToColumn, infer RelName> ? DeferredRefMeta<ColName, ToTable, ToColumn, RelName> : never> : never;
6
+ type BoundColumns<C extends Record<string, ColumnBuilder<any, any, any, any>>, N extends string> = { [K in keyof C]: BindColumn<C[K], N, Extract<K, string>> };
7
+ type ExtractDeferredRefs<C extends Record<string, ColumnBuilder<any, any, any, any>>> = { [K in keyof C]: C[K] extends ColumnBuilder<any, any, any, infer Ref> ? Ref : never }[keyof C];
8
+ /**
9
+ * Define a database table with its columns
10
+ * @param {string} name - The table name
11
+ * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions
12
+ * @returns {TableDefinition<T, C>} The table definition object with column accessors
13
+ */
14
+ declare function table<N extends string, C extends Record<string, ColumnBuilder<any, any, any, any>>>(name: N, columns: C): TableDefinition<{ [K in keyof C]: C[K]["__type"] }, BoundColumns<C, N>, N, ExtractDeferredRefs<BoundColumns<C, N>>>;
15
+ //#endregion
16
+ export { table };
17
+ //# sourceMappingURL=table.d.mts.map
@@ -0,0 +1,39 @@
1
+ //#region src/schema/table.ts
2
+ /**
3
+ * Define a database table with its columns
4
+ * @param {string} name - The table name
5
+ * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions
6
+ * @returns {TableDefinition<T, C>} The table definition object with column accessors
7
+ */
8
+ function table(name, columns) {
9
+ const columnsArray = [];
10
+ const deferredRefs = [];
11
+ const columnMap = {};
12
+ for (const [key, builder] of Object.entries(columns)) {
13
+ const meta = builder.__build(key);
14
+ columnsArray.push(meta);
15
+ columnMap[key] = meta.name;
16
+ const ref = builder.__getDeferredRef();
17
+ if (ref) deferredRefs.push({
18
+ columnName: key,
19
+ resolve: ref.resolve,
20
+ onDelete: ref.onDelete,
21
+ onUpdate: ref.onUpdate,
22
+ relationName: ref.relationName
23
+ });
24
+ builder.__tableName = name;
25
+ builder.__columnName = key;
26
+ }
27
+ return {
28
+ __table: true,
29
+ __name: name,
30
+ __columns: columnsArray,
31
+ __columnMap: columnMap,
32
+ __deferredRefs: deferredRefs,
33
+ ...columns
34
+ };
35
+ }
36
+ //#endregion
37
+ export { table };
38
+
39
+ //# sourceMappingURL=table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.mjs","names":[],"sources":["../../src/schema/table.ts"],"sourcesContent":["import type { ColumnMetadata, DeferredRefMeta, TableDefinition } from \"../types\";\nimport type { ColumnBuilder } from \"./column\";\n\ntype BindColumn<C, TableName extends string, ColName extends string> =\n C extends ColumnBuilder<infer T, any, any, infer Ref>\n ? ColumnBuilder<\n T,\n TableName,\n ColName,\n Ref extends DeferredRefMeta<any, infer ToTable, infer ToColumn, infer RelName>\n ? DeferredRefMeta<ColName, ToTable, ToColumn, RelName>\n : never\n >\n : never;\n\ntype BoundColumns<C extends Record<string, ColumnBuilder<any, any, any, any>>, N extends string> = {\n [K in keyof C]: BindColumn<C[K], N, Extract<K, string>>;\n};\n\ntype ExtractDeferredRefs<C extends Record<string, ColumnBuilder<any, any, any, any>>> = {\n [K in keyof C]: C[K] extends ColumnBuilder<any, any, any, infer Ref> ? Ref : never;\n}[keyof C];\n\n/**\n * Define a database table with its columns\n * @param {string} name - The table name\n * @param {Record<string, ColumnBuilder<any>>} columns - Column definitions\n * @returns {TableDefinition<T, C>} The table definition object with column accessors\n */\nexport function table<\n N extends string,\n C extends Record<string, ColumnBuilder<any, any, any, any>>,\n>(\n name: N,\n columns: C,\n): TableDefinition<\n { [K in keyof C]: C[K][\"__type\"] },\n BoundColumns<C, N>,\n N,\n ExtractDeferredRefs<BoundColumns<C, N>>\n> {\n const columnsArray: ColumnMetadata[] = [];\n const deferredRefs: TableDefinition[\"__deferredRefs\"] = [];\n const columnMap: Record<string, string> = {};\n\n for (const [key, builder] of Object.entries(columns)) {\n const meta = builder.__build(key);\n columnsArray.push(meta);\n columnMap[key] = meta.name;\n\n const ref = builder.__getDeferredRef();\n if (ref) {\n deferredRefs.push({\n columnName: key,\n resolve: ref.resolve,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n relationName: ref.relationName,\n });\n }\n\n (builder as any).__tableName = name;\n (builder as any).__columnName = key;\n }\n\n const def = {\n __table: true,\n __name: name,\n __columns: columnsArray,\n __columnMap: columnMap,\n __deferredRefs: deferredRefs,\n ...columns,\n };\n\n return def as any;\n}\n"],"mappings":";;;;;;;AA6BA,SAAgB,MAId,MACA,SAMA;CACA,MAAM,eAAiC,EAAE;CACzC,MAAM,eAAkD,EAAE;CAC1D,MAAM,YAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,OAAO,QAAQ,QAAQ,IAAI;AACjC,eAAa,KAAK,KAAK;AACvB,YAAU,OAAO,KAAK;EAEtB,MAAM,MAAM,QAAQ,kBAAkB;AACtC,MAAI,IACF,cAAa,KAAK;GAChB,YAAY;GACZ,SAAS,IAAI;GACb,UAAU,IAAI;GACd,UAAU,IAAI;GACd,cAAc,IAAI;GACnB,CAAC;AAGH,UAAgB,cAAc;AAC9B,UAAgB,eAAe;;AAYlC,QATY;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,aAAa;EACb,gBAAgB;EAChB,GAAG;EACJ"}
@@ -0,0 +1,43 @@
1
+ const require_errors = require("../errors.cjs");
2
+ //#region src/sync/synchronizer.ts
3
+ /**
4
+ * Schema synchronizer that compares the database state with the schema registry
5
+ * and applies non-destructive changes
6
+ */
7
+ var Synchronizer = class {
8
+ driver;
9
+ registry;
10
+ constructor(driver, registry) {
11
+ this.driver = driver;
12
+ this.registry = registry;
13
+ }
14
+ /**
15
+ * Synchronize database schema with registry definitions
16
+ * @param {boolean} [force=false] - Allow destructive operations (drop columns)
17
+ */
18
+ async sync(force = false) {
19
+ const tables = this.registry.getAllTables();
20
+ for (const [, tableMeta] of tables) await this.syncTable(tableMeta, force);
21
+ }
22
+ async syncTable(meta, force) {
23
+ if (!await this.driver.tableExists(meta.name)) {
24
+ await this.driver.createTable(meta);
25
+ return;
26
+ }
27
+ const existingCols = await this.driver.getTableColumns(meta.name);
28
+ const existingNames = new Set(existingCols.map((c) => c.name));
29
+ const schemaNames = new Set(meta.columns.map((c) => c.name));
30
+ for (const colMeta of meta.columns) if (!existingNames.has(colMeta.name)) await this.driver.addColumn(meta.name, colMeta);
31
+ if (force) {
32
+ for (const existingName of existingNames) if (!schemaNames.has(existingName)) try {
33
+ await this.driver.dropColumn(meta.name, existingName);
34
+ } catch (err) {
35
+ throw new require_errors.SyncError(`Failed to drop column ${existingName}: ${err.message}`);
36
+ }
37
+ }
38
+ }
39
+ };
40
+ //#endregion
41
+ exports.Synchronizer = Synchronizer;
42
+
43
+ //# sourceMappingURL=synchronizer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronizer.cjs","names":["SyncError"],"sources":["../../src/sync/synchronizer.ts"],"sourcesContent":["import { SyncError } from \"../errors\";\nimport type { SchemaRegistry } from \"../schema\";\nimport type { DatabaseDriver, TableMetadata } from \"../types\";\n\n/**\n * Schema synchronizer that compares the database state with the schema registry\n * and applies non-destructive changes\n */\nexport class Synchronizer {\n private driver: DatabaseDriver;\n private registry: SchemaRegistry;\n\n constructor(driver: DatabaseDriver, registry: SchemaRegistry) {\n this.driver = driver;\n this.registry = registry;\n }\n\n /**\n * Synchronize database schema with registry definitions\n * @param {boolean} [force=false] - Allow destructive operations (drop columns)\n */\n async sync(force = false): Promise<void> {\n const tables = this.registry.getAllTables();\n\n for (const [, tableMeta] of tables) {\n await this.syncTable(tableMeta, force);\n }\n }\n\n private async syncTable(meta: TableMetadata, force: boolean): Promise<void> {\n const exists = await this.driver.tableExists(meta.name);\n if (!exists) {\n await this.driver.createTable(meta);\n return;\n }\n\n const existingCols = await this.driver.getTableColumns(meta.name);\n const existingNames = new Set(existingCols.map((c) => c.name));\n const schemaNames = new Set(meta.columns.map((c) => c.name));\n\n for (const colMeta of meta.columns) {\n if (!existingNames.has(colMeta.name)) {\n await this.driver.addColumn(meta.name, colMeta);\n }\n }\n\n if (force) {\n for (const existingName of existingNames) {\n if (!schemaNames.has(existingName)) {\n try {\n await this.driver.dropColumn(meta.name, existingName);\n } catch (err: any) {\n throw new SyncError(`Failed to drop column ${existingName}: ${err.message}`);\n }\n }\n }\n }\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,eAAb,MAA0B;CACxB;CACA;CAEA,YAAY,QAAwB,UAA0B;AAC5D,OAAK,SAAS;AACd,OAAK,WAAW;;;;;;CAOlB,MAAM,KAAK,QAAQ,OAAsB;EACvC,MAAM,SAAS,KAAK,SAAS,cAAc;AAE3C,OAAK,MAAM,GAAG,cAAc,OAC1B,OAAM,KAAK,UAAU,WAAW,MAAM;;CAI1C,MAAc,UAAU,MAAqB,OAA+B;AAE1E,MAAI,CADW,MAAM,KAAK,OAAO,YAAY,KAAK,KAAK,EAC1C;AACX,SAAM,KAAK,OAAO,YAAY,KAAK;AACnC;;EAGF,MAAM,eAAe,MAAM,KAAK,OAAO,gBAAgB,KAAK,KAAK;EACjE,MAAM,gBAAgB,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE,KAAK,CAAC;EAC9D,MAAM,cAAc,IAAI,IAAI,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,CAAC;AAE5D,OAAK,MAAM,WAAW,KAAK,QACzB,KAAI,CAAC,cAAc,IAAI,QAAQ,KAAK,CAClC,OAAM,KAAK,OAAO,UAAU,KAAK,MAAM,QAAQ;AAInD,MAAI;QACG,MAAM,gBAAgB,cACzB,KAAI,CAAC,YAAY,IAAI,aAAa,CAChC,KAAI;AACF,UAAM,KAAK,OAAO,WAAW,KAAK,MAAM,aAAa;YAC9C,KAAU;AACjB,UAAM,IAAIA,eAAAA,UAAU,yBAAyB,aAAa,IAAI,IAAI,UAAU"}
@@ -0,0 +1,22 @@
1
+ import { DatabaseDriver } from "../types.cjs";
2
+ import { SchemaRegistry } from "../schema/registry.cjs";
3
+
4
+ //#region src/sync/synchronizer.d.ts
5
+ /**
6
+ * Schema synchronizer that compares the database state with the schema registry
7
+ * and applies non-destructive changes
8
+ */
9
+ declare class Synchronizer {
10
+ private driver;
11
+ private registry;
12
+ constructor(driver: DatabaseDriver, registry: SchemaRegistry);
13
+ /**
14
+ * Synchronize database schema with registry definitions
15
+ * @param {boolean} [force=false] - Allow destructive operations (drop columns)
16
+ */
17
+ sync(force?: boolean): Promise<void>;
18
+ private syncTable;
19
+ }
20
+ //#endregion
21
+ export { Synchronizer };
22
+ //# sourceMappingURL=synchronizer.d.cts.map
@@ -0,0 +1,22 @@
1
+ import { DatabaseDriver } from "../types.mjs";
2
+ import { SchemaRegistry } from "../schema/registry.mjs";
3
+
4
+ //#region src/sync/synchronizer.d.ts
5
+ /**
6
+ * Schema synchronizer that compares the database state with the schema registry
7
+ * and applies non-destructive changes
8
+ */
9
+ declare class Synchronizer {
10
+ private driver;
11
+ private registry;
12
+ constructor(driver: DatabaseDriver, registry: SchemaRegistry);
13
+ /**
14
+ * Synchronize database schema with registry definitions
15
+ * @param {boolean} [force=false] - Allow destructive operations (drop columns)
16
+ */
17
+ sync(force?: boolean): Promise<void>;
18
+ private syncTable;
19
+ }
20
+ //#endregion
21
+ export { Synchronizer };
22
+ //# sourceMappingURL=synchronizer.d.mts.map
@@ -0,0 +1,43 @@
1
+ import { SyncError } from "../errors.mjs";
2
+ //#region src/sync/synchronizer.ts
3
+ /**
4
+ * Schema synchronizer that compares the database state with the schema registry
5
+ * and applies non-destructive changes
6
+ */
7
+ var Synchronizer = class {
8
+ driver;
9
+ registry;
10
+ constructor(driver, registry) {
11
+ this.driver = driver;
12
+ this.registry = registry;
13
+ }
14
+ /**
15
+ * Synchronize database schema with registry definitions
16
+ * @param {boolean} [force=false] - Allow destructive operations (drop columns)
17
+ */
18
+ async sync(force = false) {
19
+ const tables = this.registry.getAllTables();
20
+ for (const [, tableMeta] of tables) await this.syncTable(tableMeta, force);
21
+ }
22
+ async syncTable(meta, force) {
23
+ if (!await this.driver.tableExists(meta.name)) {
24
+ await this.driver.createTable(meta);
25
+ return;
26
+ }
27
+ const existingCols = await this.driver.getTableColumns(meta.name);
28
+ const existingNames = new Set(existingCols.map((c) => c.name));
29
+ const schemaNames = new Set(meta.columns.map((c) => c.name));
30
+ for (const colMeta of meta.columns) if (!existingNames.has(colMeta.name)) await this.driver.addColumn(meta.name, colMeta);
31
+ if (force) {
32
+ for (const existingName of existingNames) if (!schemaNames.has(existingName)) try {
33
+ await this.driver.dropColumn(meta.name, existingName);
34
+ } catch (err) {
35
+ throw new SyncError(`Failed to drop column ${existingName}: ${err.message}`);
36
+ }
37
+ }
38
+ }
39
+ };
40
+ //#endregion
41
+ export { Synchronizer };
42
+
43
+ //# sourceMappingURL=synchronizer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronizer.mjs","names":[],"sources":["../../src/sync/synchronizer.ts"],"sourcesContent":["import { SyncError } from \"../errors\";\nimport type { SchemaRegistry } from \"../schema\";\nimport type { DatabaseDriver, TableMetadata } from \"../types\";\n\n/**\n * Schema synchronizer that compares the database state with the schema registry\n * and applies non-destructive changes\n */\nexport class Synchronizer {\n private driver: DatabaseDriver;\n private registry: SchemaRegistry;\n\n constructor(driver: DatabaseDriver, registry: SchemaRegistry) {\n this.driver = driver;\n this.registry = registry;\n }\n\n /**\n * Synchronize database schema with registry definitions\n * @param {boolean} [force=false] - Allow destructive operations (drop columns)\n */\n async sync(force = false): Promise<void> {\n const tables = this.registry.getAllTables();\n\n for (const [, tableMeta] of tables) {\n await this.syncTable(tableMeta, force);\n }\n }\n\n private async syncTable(meta: TableMetadata, force: boolean): Promise<void> {\n const exists = await this.driver.tableExists(meta.name);\n if (!exists) {\n await this.driver.createTable(meta);\n return;\n }\n\n const existingCols = await this.driver.getTableColumns(meta.name);\n const existingNames = new Set(existingCols.map((c) => c.name));\n const schemaNames = new Set(meta.columns.map((c) => c.name));\n\n for (const colMeta of meta.columns) {\n if (!existingNames.has(colMeta.name)) {\n await this.driver.addColumn(meta.name, colMeta);\n }\n }\n\n if (force) {\n for (const existingName of existingNames) {\n if (!schemaNames.has(existingName)) {\n try {\n await this.driver.dropColumn(meta.name, existingName);\n } catch (err: any) {\n throw new SyncError(`Failed to drop column ${existingName}: ${err.message}`);\n }\n }\n }\n }\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,eAAb,MAA0B;CACxB;CACA;CAEA,YAAY,QAAwB,UAA0B;AAC5D,OAAK,SAAS;AACd,OAAK,WAAW;;;;;;CAOlB,MAAM,KAAK,QAAQ,OAAsB;EACvC,MAAM,SAAS,KAAK,SAAS,cAAc;AAE3C,OAAK,MAAM,GAAG,cAAc,OAC1B,OAAM,KAAK,UAAU,WAAW,MAAM;;CAI1C,MAAc,UAAU,MAAqB,OAA+B;AAE1E,MAAI,CADW,MAAM,KAAK,OAAO,YAAY,KAAK,KAAK,EAC1C;AACX,SAAM,KAAK,OAAO,YAAY,KAAK;AACnC;;EAGF,MAAM,eAAe,MAAM,KAAK,OAAO,gBAAgB,KAAK,KAAK;EACjE,MAAM,gBAAgB,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE,KAAK,CAAC;EAC9D,MAAM,cAAc,IAAI,IAAI,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,CAAC;AAE5D,OAAK,MAAM,WAAW,KAAK,QACzB,KAAI,CAAC,cAAc,IAAI,QAAQ,KAAK,CAClC,OAAM,KAAK,OAAO,UAAU,KAAK,MAAM,QAAQ;AAInD,MAAI;QACG,MAAM,gBAAgB,cACzB,KAAI,CAAC,YAAY,IAAI,aAAa,CAChC,KAAI;AACF,UAAM,KAAK,OAAO,WAAW,KAAK,MAAM,aAAa;YAC9C,KAAU;AACjB,UAAM,IAAI,UAAU,yBAAyB,aAAa,IAAI,IAAI,UAAU"}
@@ -0,0 +1,229 @@
1
+ //#region src/types.d.ts
2
+ type ColumnDataType = "integer" | "varchar" | "text" | "boolean" | "json" | "datetime" | "decimal" | "float" | "char" | "timestamp" | "bigint" | "blob";
3
+ type DatabaseType = "mysql" | "mariadb" | "sqlite" | "file" | {
4
+ name: "mysql";
5
+ provider: "mysql" | "mysql2";
6
+ } | {
7
+ name: "mariadb";
8
+ provider: "mysql" | "mysql2";
9
+ } | {
10
+ name: "sqlite";
11
+ provider: "better-sqlite3" | "sqlite3" | "sql.js" | "bun:sqlite";
12
+ } | {
13
+ name: "file";
14
+ provider: string;
15
+ };
16
+ interface ColumnMetadata {
17
+ name: string;
18
+ type: ColumnDataType;
19
+ primaryKey: boolean;
20
+ autoIncrement: boolean;
21
+ notNull: boolean;
22
+ unique: boolean;
23
+ defaultValue: unknown;
24
+ length?: number;
25
+ precision?: number;
26
+ scale?: number;
27
+ columnAlias?: string;
28
+ references?: {
29
+ table: string;
30
+ column: string;
31
+ onDelete?: ReferenceAction;
32
+ onUpdate?: ReferenceAction;
33
+ relationName?: string;
34
+ };
35
+ }
36
+ type ReferenceAction = "CASCADE" | "SET NULL" | "RESTRICT" | "NO ACTION";
37
+ interface TableMetadata {
38
+ name: string;
39
+ columns: ColumnMetadata[];
40
+ }
41
+ type DeferredRefMeta<ColumnName extends string = string, TargetTable extends string = string, TargetColumn extends string = string, RelationName extends string | undefined = string | undefined> = {
42
+ columnName: ColumnName;
43
+ targetTable: TargetTable;
44
+ targetColumn: TargetColumn;
45
+ relationName?: RelationName;
46
+ onDelete?: ReferenceAction;
47
+ onUpdate?: ReferenceAction;
48
+ };
49
+ type TableDefinition<T extends Record<string, any> = Record<string, any>, C extends Record<string, any> = {}, N extends string = string, Refs extends DeferredRefMeta = any> = {
50
+ __table: true;
51
+ __name: N;
52
+ __row: T;
53
+ __refs: Refs;
54
+ __columns: ColumnMetadata[];
55
+ __columnMap: Record<string, string>;
56
+ __deferredRefs: Array<{
57
+ columnName: string;
58
+ resolve: () => {
59
+ table: string;
60
+ column: string;
61
+ };
62
+ onDelete?: ReferenceAction;
63
+ onUpdate?: ReferenceAction;
64
+ relationName?: string;
65
+ }>;
66
+ } & C;
67
+ type InferRow<T> = T extends {
68
+ __row: infer R;
69
+ } ? R : never;
70
+ type InferInsert<T> = T extends TableDefinition<infer R, any, any> ? { [K in keyof R as K extends AutoIncrementKeys<T> ? never : K]: R[K] } & { [K in AutoIncrementKeys<T>]?: R[K] } : never;
71
+ type AutoIncrementKeys<T> = T extends TableDefinition<infer R, any, any> ? keyof R : never;
72
+ type InferUpdate<T> = T extends TableDefinition<infer R, any, any> ? Partial<R> : never;
73
+ interface WhereCondition {
74
+ eq?: unknown;
75
+ neq?: unknown;
76
+ gt?: unknown;
77
+ gte?: unknown;
78
+ lt?: unknown;
79
+ lte?: unknown;
80
+ like?: string;
81
+ notLike?: string;
82
+ in?: unknown[];
83
+ notIn?: unknown[];
84
+ isNull?: boolean;
85
+ between?: [unknown, unknown];
86
+ }
87
+ type WhereClause<T = Record<string, any>> = { [K in keyof T]?: T[K] | WhereCondition } & {
88
+ OR?: WhereClause<T>[];
89
+ AND?: WhereClause<T>[];
90
+ };
91
+ interface QueryOptions<T = Record<string, any>, Rel extends Record<string, any> = {}> {
92
+ where?: WhereClause<T>;
93
+ select?: Extract<keyof T, string>[];
94
+ orderBy?: Partial<Record<Extract<keyof T, string>, "asc" | "desc">>;
95
+ take?: number;
96
+ skip?: number;
97
+ with?: { [K in keyof Rel]?: boolean | QueryOptions<Rel[K] extends {
98
+ row: infer R;
99
+ } ? R : Rel[K]> };
100
+ }
101
+ interface UpdateOptions<T = Record<string, any>> {
102
+ where: WhereClause<T>;
103
+ data: Partial<T>;
104
+ }
105
+ interface DeleteOptions<T = Record<string, any>> {
106
+ where: WhereClause<T>;
107
+ }
108
+ interface MySQLConnectionConfig {
109
+ host: string;
110
+ port?: number;
111
+ user: string;
112
+ password: string;
113
+ database: string;
114
+ }
115
+ interface SQLiteConnectionConfig {
116
+ filename: string;
117
+ }
118
+ interface FileConnectionConfig {
119
+ directory: string;
120
+ }
121
+ type ConnectionConfig = MySQLConnectionConfig | SQLiteConnectionConfig | FileConnectionConfig;
122
+ interface CacheConfig {
123
+ enabled: boolean;
124
+ ttl?: number;
125
+ maxTtl?: number;
126
+ maxEntries?: number;
127
+ }
128
+ interface DatabaseConfig {
129
+ schemas: readonly TableDefinition<any, any, any>[];
130
+ migrations?: any[];
131
+ database: DatabaseType;
132
+ connection: ConnectionConfig | ConnectionConfig[];
133
+ runMigrations?: boolean;
134
+ syncSchemas?: boolean;
135
+ cache?: boolean | CacheConfig;
136
+ }
137
+ interface MigrationContext {
138
+ schema: {
139
+ createTable: (table: TableDefinition) => Promise<void>;
140
+ dropTable: (name: string) => Promise<void>;
141
+ addColumn: (table: string, name: string, column: ColumnMetadata) => Promise<void>;
142
+ dropColumn: (table: string, name: string) => Promise<void>;
143
+ renameColumn: (table: string, oldName: string, newName: string) => Promise<void>;
144
+ addIndex: (table: string, columns: string[], unique?: boolean) => Promise<void>;
145
+ dropIndex: (table: string, indexName: string) => Promise<void>;
146
+ };
147
+ sql: (query: string, params?: unknown[]) => Promise<unknown>;
148
+ }
149
+ interface MigrationDefinition {
150
+ name: string;
151
+ up: (ctx: MigrationContext) => Promise<void>;
152
+ down: (ctx: MigrationContext) => Promise<void>;
153
+ }
154
+ interface DatabaseDriver {
155
+ connect(): Promise<void>;
156
+ disconnect(): Promise<void>;
157
+ execute(sql: string, params?: unknown[]): Promise<any>;
158
+ query(sql: string, params?: unknown[]): Promise<any[]>;
159
+ tableExists(name: string): Promise<boolean>;
160
+ getTableColumns(name: string): Promise<ColumnMetadata[]>;
161
+ createTable(meta: TableMetadata): Promise<void>;
162
+ dropTable(name: string): Promise<void>;
163
+ addColumn(table: string, column: ColumnMetadata): Promise<void>;
164
+ dropColumn(table: string, name: string): Promise<void>;
165
+ renameColumn(table: string, oldName: string, newName: string): Promise<void>;
166
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
167
+ getAllTableColumns?(): Promise<Record<string, ColumnMetadata[]>>;
168
+ }
169
+ interface Repository<T extends Record<string, any>> {
170
+ find(options?: QueryOptions<T>): Promise<T[]>;
171
+ findMany(options?: QueryOptions<T>): Promise<T[]>;
172
+ findFirst(options?: QueryOptions<T>): Promise<T | null>;
173
+ insert(data: Partial<T> | Partial<T>[]): Promise<T>;
174
+ insertMany(data: Partial<T>[]): Promise<T[]>;
175
+ update(options: UpdateOptions<T>): Promise<T[]>;
176
+ delete(options: DeleteOptions<T>): Promise<number>;
177
+ count(options?: Pick<QueryOptions<T>, "where">): Promise<number>;
178
+ exists(options: Pick<QueryOptions<T>, "where">): Promise<boolean>;
179
+ upsert(options: {
180
+ where: WhereClause<T>;
181
+ create: Partial<T>;
182
+ update: Partial<T>;
183
+ }): Promise<T>;
184
+ truncate(): Promise<void>;
185
+ }
186
+ type AnyTableDef = TableDefinition<any, any, any, any>;
187
+ type TableRefs<T> = T extends {
188
+ __refs: infer R;
189
+ } ? R : never;
190
+ type TableName<T> = T extends {
191
+ __name: infer N extends string;
192
+ } ? N : never;
193
+ type SchemaByName<S extends readonly AnyTableDef[], N extends string> = Extract<S[number], {
194
+ __name: N;
195
+ }>;
196
+ type StripIdSuffix<S extends string> = S extends `${infer Base}Id` ? Base : S extends `${infer Base}_id` ? Base : S;
197
+ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
198
+ type Simplify<T> = { [K in keyof T]: T[K] } & {};
199
+ type ForwardRelationEntries<S extends readonly AnyTableDef[], T extends AnyTableDef> = TableRefs<T> extends infer R ? R extends DeferredRefMeta<infer Col, infer ToTable, any, infer Name> ? { [K in Name extends string ? Name : StripIdSuffix<Col>]: {
200
+ table: SchemaByName<S, ToTable>;
201
+ many: false;
202
+ } } : never : never;
203
+ type ReverseRelationEntry<U extends AnyTableDef, TargetName extends string> = TableRefs<U> extends infer R ? R extends DeferredRefMeta<any, TargetName, any, any> ? { [K in TableName<U>]: {
204
+ table: U;
205
+ many: true;
206
+ } } : never : never;
207
+ type ReverseRelationEntries<S extends readonly AnyTableDef[], T extends AnyTableDef> = ReverseRelationEntry<S[number], TableName<T>>;
208
+ type RelationsFor<S extends readonly AnyTableDef[], T extends AnyTableDef> = Simplify<UnionToIntersection<ForwardRelationEntries<S, T> | ReverseRelationEntries<S, T>>>;
209
+ type DepthPrev = [never, 0, 1, 2, 3];
210
+ type ExtractRelationRow<Rel> = Rel extends {
211
+ table: infer R;
212
+ } ? InferRow<R> : never;
213
+ type ExtractRelationMany<Rel> = Rel extends {
214
+ many: true;
215
+ } ? true : false;
216
+ type RelationQueryMap<S extends readonly AnyTableDef[], T extends AnyTableDef, D extends number = 3> = [D] extends [never] ? {} : { [K in keyof RelationsFor<S, T>]: {
217
+ row: ExtractRelationRow<RelationsFor<S, T>[K]>;
218
+ many: ExtractRelationMany<RelationsFor<S, T>[K]>;
219
+ relations: RelationsFor<S, T>[K] extends {
220
+ table: infer R extends AnyTableDef;
221
+ } ? RelationQueryMap<S, R, DepthPrev[D]> : {};
222
+ } };
223
+ type ResolveWith<S extends readonly AnyTableDef[], T extends AnyTableDef, W> = [W] extends [undefined] ? {} : W extends Record<string, any> ? { [K in keyof W & keyof RelationsFor<S, T>]: ExtractRelationMany<RelationsFor<S, T>[K]> extends true ? ExtractRelationRow<RelationsFor<S, T>[K]>[] : ExtractRelationRow<RelationsFor<S, T>[K]> | null } : {};
224
+ type ResolveResult<S extends readonly AnyTableDef[], T extends AnyTableDef, O> = InferRow<T> & ResolveWith<S, T, O extends {
225
+ with: infer W;
226
+ } ? W : undefined>;
227
+ //#endregion
228
+ export { AnyTableDef, CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, SQLiteConnectionConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition };
229
+ //# sourceMappingURL=types.d.cts.map