@hedystia/db 2.0.0 → 2.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.
- package/dist/_virtual/_rolldown/runtime.cjs +13 -0
- package/dist/_virtual/_rolldown/runtime.mjs +17 -0
- package/dist/cache/manager.cjs +137 -0
- package/dist/cache/manager.cjs.map +1 -0
- package/dist/cache/manager.d.cts +72 -0
- package/dist/cache/manager.d.mts +72 -0
- package/dist/cache/manager.mjs +140 -0
- package/dist/cache/manager.mjs.map +1 -0
- package/dist/cache/memory-store.cjs +122 -0
- package/dist/cache/memory-store.cjs.map +1 -0
- package/dist/cache/memory-store.mjs +122 -0
- package/dist/cache/memory-store.mjs.map +1 -0
- package/dist/cli/commands/migration.cjs +22 -0
- package/dist/cli/commands/migration.cjs.map +1 -0
- package/dist/cli/commands/migration.mjs +32 -0
- package/dist/cli/commands/migration.mjs.map +1 -0
- package/dist/cli/commands/schema.cjs +21 -0
- package/dist/cli/commands/schema.cjs.map +1 -0
- package/dist/cli/commands/schema.mjs +30 -0
- package/dist/cli/commands/schema.mjs.map +1 -0
- package/dist/cli.cjs +50 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +57 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/constants.cjs +16 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.mjs +16 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/core/database.cjs +158 -0
- package/dist/core/database.cjs.map +1 -0
- package/dist/core/database.d.cts +74 -0
- package/dist/core/database.d.mts +74 -0
- package/dist/core/database.mjs +159 -0
- package/dist/core/database.mjs.map +1 -0
- package/dist/core/repository.cjs +362 -0
- package/dist/core/repository.cjs.map +1 -0
- package/dist/core/repository.d.cts +100 -0
- package/dist/core/repository.d.mts +100 -0
- package/dist/core/repository.mjs +362 -0
- package/dist/core/repository.mjs.map +1 -0
- package/dist/drivers/driver.cjs +11 -0
- package/dist/drivers/driver.cjs.map +1 -0
- package/dist/drivers/driver.mjs +11 -0
- package/dist/drivers/driver.mjs.map +1 -0
- package/dist/drivers/file.cjs +336 -0
- package/dist/drivers/file.cjs.map +1 -0
- package/dist/drivers/file.mjs +337 -0
- package/dist/drivers/file.mjs.map +1 -0
- package/dist/drivers/index.cjs +28 -0
- package/dist/drivers/index.cjs.map +1 -0
- package/dist/drivers/index.d.cts +14 -0
- package/dist/drivers/index.d.mts +14 -0
- package/dist/drivers/index.mjs +28 -0
- package/dist/drivers/index.mjs.map +1 -0
- package/dist/drivers/mysql.cjs +272 -0
- package/dist/drivers/mysql.cjs.map +1 -0
- package/dist/drivers/mysql.mjs +272 -0
- package/dist/drivers/mysql.mjs.map +1 -0
- package/dist/drivers/sql-compiler.cjs +284 -0
- package/dist/drivers/sql-compiler.cjs.map +1 -0
- package/dist/drivers/sql-compiler.d.cts +66 -0
- package/dist/drivers/sql-compiler.d.mts +66 -0
- package/dist/drivers/sql-compiler.mjs +276 -0
- package/dist/drivers/sql-compiler.mjs.map +1 -0
- package/dist/drivers/sqlite.cjs +262 -0
- package/dist/drivers/sqlite.cjs.map +1 -0
- package/dist/drivers/sqlite.mjs +262 -0
- package/dist/drivers/sqlite.mjs.map +1 -0
- package/dist/errors.cjs +74 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +46 -0
- package/dist/errors.d.mts +46 -0
- package/dist/errors.mjs +68 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.cjs +55 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.mjs +21 -0
- package/dist/index.mjs.map +1 -0
- package/dist/migrations/definition.cjs +20 -0
- package/dist/migrations/definition.cjs.map +1 -0
- package/dist/migrations/definition.d.cts +18 -0
- package/dist/migrations/definition.d.mts +18 -0
- package/dist/migrations/definition.mjs +23 -0
- package/dist/migrations/definition.mjs.map +1 -0
- package/dist/migrations/index.mjs +12 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/templates.cjs +39 -0
- package/dist/migrations/templates.cjs.map +1 -0
- package/dist/migrations/templates.d.cts +16 -0
- package/dist/migrations/templates.d.mts +16 -0
- package/dist/migrations/templates.mjs +41 -0
- package/dist/migrations/templates.mjs.map +1 -0
- package/dist/schema/column.cjs +129 -0
- package/dist/schema/column.cjs.map +1 -0
- package/dist/schema/column.d.cts +96 -0
- package/dist/schema/column.d.mts +96 -0
- package/dist/schema/column.mjs +129 -0
- package/dist/schema/column.mjs.map +1 -0
- package/dist/schema/columns/index.cjs +110 -0
- package/dist/schema/columns/index.cjs.map +1 -0
- package/dist/schema/columns/index.d.cts +91 -0
- package/dist/schema/columns/index.d.mts +91 -0
- package/dist/schema/columns/index.mjs +104 -0
- package/dist/schema/columns/index.mjs.map +1 -0
- package/dist/schema/registry.cjs +101 -0
- package/dist/schema/registry.cjs.map +1 -0
- package/dist/schema/registry.d.cts +52 -0
- package/dist/schema/registry.d.mts +52 -0
- package/dist/schema/registry.mjs +101 -0
- package/dist/schema/registry.mjs.map +1 -0
- package/dist/schema/table.cjs +36 -0
- package/dist/schema/table.cjs.map +1 -0
- package/dist/schema/table.d.cts +17 -0
- package/dist/schema/table.d.mts +17 -0
- package/dist/schema/table.mjs +36 -0
- package/dist/schema/table.mjs.map +1 -0
- package/dist/sync/synchronizer.cjs +43 -0
- package/dist/sync/synchronizer.cjs.map +1 -0
- package/dist/sync/synchronizer.d.cts +22 -0
- package/dist/sync/synchronizer.d.mts +22 -0
- package/dist/sync/synchronizer.mjs +43 -0
- package/dist/sync/synchronizer.mjs.map +1 -0
- package/dist/types.d.cts +227 -0
- package/dist/types.d.mts +227 -0
- package/dist/utils/fs.cjs +24 -0
- package/dist/utils/fs.cjs.map +1 -0
- package/dist/utils/fs.mjs +26 -0
- package/dist/utils/fs.mjs.map +1 -0
- package/dist/utils/index.mjs +14 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/naming.cjs +13 -0
- package/dist/utils/naming.cjs.map +1 -0
- package/dist/utils/naming.mjs +16 -0
- package/dist/utils/naming.mjs.map +1 -0
- package/dist/utils/stable-stringify.cjs +19 -0
- package/dist/utils/stable-stringify.cjs.map +1 -0
- package/dist/utils/stable-stringify.mjs +22 -0
- package/dist/utils/stable-stringify.mjs.map +1 -0
- package/package.json +64 -27
- package/readme.md +86 -106
- package/index.d.ts +0 -65
- package/index.js +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { TableDefinition, TableMetadata } from "../types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/schema/registry.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Schema registry that manages table definitions and resolves references
|
|
6
|
+
*/
|
|
7
|
+
declare class SchemaRegistry {
|
|
8
|
+
private tables;
|
|
9
|
+
private definitions;
|
|
10
|
+
private relations;
|
|
11
|
+
/**
|
|
12
|
+
* Register table definitions and resolve all deferred references
|
|
13
|
+
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
14
|
+
*/
|
|
15
|
+
register(schemas: readonly TableDefinition<any, any, any, any>[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get table metadata by name
|
|
18
|
+
* @param {string} name - Table name
|
|
19
|
+
* @returns {TableMetadata | undefined} The table metadata
|
|
20
|
+
*/
|
|
21
|
+
getTable(name: string): TableMetadata | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Get all registered table metadata
|
|
24
|
+
* @returns {Map<string, TableMetadata>} All registered tables
|
|
25
|
+
*/
|
|
26
|
+
getAllTables(): Map<string, TableMetadata>;
|
|
27
|
+
/**
|
|
28
|
+
* Get relations for a table
|
|
29
|
+
* @param {string} tableName - Table name
|
|
30
|
+
* @returns {Array<object>} Relations for the table
|
|
31
|
+
*/
|
|
32
|
+
getRelations(tableName: string): Array<{
|
|
33
|
+
from: {
|
|
34
|
+
table: string;
|
|
35
|
+
column: string;
|
|
36
|
+
};
|
|
37
|
+
to: {
|
|
38
|
+
table: string;
|
|
39
|
+
column: string;
|
|
40
|
+
};
|
|
41
|
+
relationName: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Get the primary key column name for a table
|
|
45
|
+
* @param {string} tableName - Table name
|
|
46
|
+
* @returns {string | null} The primary key column name or null
|
|
47
|
+
*/
|
|
48
|
+
getPrimaryKey(tableName: string): string | null;
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { SchemaRegistry };
|
|
52
|
+
//# sourceMappingURL=registry.d.cts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { TableDefinition, TableMetadata } from "../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/schema/registry.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Schema registry that manages table definitions and resolves references
|
|
6
|
+
*/
|
|
7
|
+
declare class SchemaRegistry {
|
|
8
|
+
private tables;
|
|
9
|
+
private definitions;
|
|
10
|
+
private relations;
|
|
11
|
+
/**
|
|
12
|
+
* Register table definitions and resolve all deferred references
|
|
13
|
+
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
14
|
+
*/
|
|
15
|
+
register(schemas: readonly TableDefinition<any, any, any, any>[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get table metadata by name
|
|
18
|
+
* @param {string} name - Table name
|
|
19
|
+
* @returns {TableMetadata | undefined} The table metadata
|
|
20
|
+
*/
|
|
21
|
+
getTable(name: string): TableMetadata | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Get all registered table metadata
|
|
24
|
+
* @returns {Map<string, TableMetadata>} All registered tables
|
|
25
|
+
*/
|
|
26
|
+
getAllTables(): Map<string, TableMetadata>;
|
|
27
|
+
/**
|
|
28
|
+
* Get relations for a table
|
|
29
|
+
* @param {string} tableName - Table name
|
|
30
|
+
* @returns {Array<object>} Relations for the table
|
|
31
|
+
*/
|
|
32
|
+
getRelations(tableName: string): Array<{
|
|
33
|
+
from: {
|
|
34
|
+
table: string;
|
|
35
|
+
column: string;
|
|
36
|
+
};
|
|
37
|
+
to: {
|
|
38
|
+
table: string;
|
|
39
|
+
column: string;
|
|
40
|
+
};
|
|
41
|
+
relationName: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Get the primary key column name for a table
|
|
45
|
+
* @param {string} tableName - Table name
|
|
46
|
+
* @returns {string | null} The primary key column name or null
|
|
47
|
+
*/
|
|
48
|
+
getPrimaryKey(tableName: string): string | null;
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { SchemaRegistry };
|
|
52
|
+
//# sourceMappingURL=registry.d.mts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
relations = /* @__PURE__ */ new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Register table definitions and resolve all deferred references
|
|
12
|
+
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
13
|
+
*/
|
|
14
|
+
register(schemas) {
|
|
15
|
+
for (const schema of schemas) {
|
|
16
|
+
if (!schema.__table || !schema.__name) throw new SchemaError("Invalid table definition");
|
|
17
|
+
this.definitions.set(schema.__name, schema);
|
|
18
|
+
this.tables.set(schema.__name, {
|
|
19
|
+
name: schema.__name,
|
|
20
|
+
columns: [...schema.__columns]
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
for (const schema of schemas) for (const ref of schema.__deferredRefs) {
|
|
24
|
+
const resolved = ref.resolve();
|
|
25
|
+
if (!resolved.table || !resolved.column) throw new SchemaError(`Failed to resolve reference for ${schema.__name}.${ref.columnName}`);
|
|
26
|
+
if (!this.tables.has(resolved.table)) throw new SchemaError(`Referenced table "${resolved.table}" does not exist in schema registry`);
|
|
27
|
+
const column = schema.__columns.find((c) => c.name === ref.columnName);
|
|
28
|
+
if (column) column.references = {
|
|
29
|
+
table: resolved.table,
|
|
30
|
+
column: resolved.column,
|
|
31
|
+
onDelete: ref.onDelete,
|
|
32
|
+
onUpdate: ref.onUpdate,
|
|
33
|
+
relationName: ref.relationName
|
|
34
|
+
};
|
|
35
|
+
const relationName = ref.relationName || ref.columnName.replace(/Id$/, "").replace(/_id$/, "");
|
|
36
|
+
if (!this.relations.has(schema.__name)) this.relations.set(schema.__name, []);
|
|
37
|
+
this.relations.get(schema.__name).push({
|
|
38
|
+
from: {
|
|
39
|
+
table: schema.__name,
|
|
40
|
+
column: ref.columnName
|
|
41
|
+
},
|
|
42
|
+
to: {
|
|
43
|
+
table: resolved.table,
|
|
44
|
+
column: resolved.column
|
|
45
|
+
},
|
|
46
|
+
relationName
|
|
47
|
+
});
|
|
48
|
+
if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
|
|
49
|
+
const reverseRelationName = schema.__name;
|
|
50
|
+
this.relations.get(resolved.table).push({
|
|
51
|
+
from: {
|
|
52
|
+
table: resolved.table,
|
|
53
|
+
column: resolved.column
|
|
54
|
+
},
|
|
55
|
+
to: {
|
|
56
|
+
table: schema.__name,
|
|
57
|
+
column: ref.columnName
|
|
58
|
+
},
|
|
59
|
+
relationName: reverseRelationName
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get table metadata by name
|
|
65
|
+
* @param {string} name - Table name
|
|
66
|
+
* @returns {TableMetadata | undefined} The table metadata
|
|
67
|
+
*/
|
|
68
|
+
getTable(name) {
|
|
69
|
+
return this.tables.get(name);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get all registered table metadata
|
|
73
|
+
* @returns {Map<string, TableMetadata>} All registered tables
|
|
74
|
+
*/
|
|
75
|
+
getAllTables() {
|
|
76
|
+
return this.tables;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get relations for a table
|
|
80
|
+
* @param {string} tableName - Table name
|
|
81
|
+
* @returns {Array<object>} Relations for the table
|
|
82
|
+
*/
|
|
83
|
+
getRelations(tableName) {
|
|
84
|
+
return this.relations.get(tableName) ?? [];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the primary key column name for a table
|
|
88
|
+
* @param {string} tableName - Table name
|
|
89
|
+
* @returns {string | null} The primary key column name or null
|
|
90
|
+
*/
|
|
91
|
+
getPrimaryKey(tableName) {
|
|
92
|
+
const table = this.tables.get(tableName);
|
|
93
|
+
if (!table) return null;
|
|
94
|
+
for (const col of table.columns) if (col.primaryKey) return col.name;
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
export { SchemaRegistry };
|
|
100
|
+
|
|
101
|
+
//# 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 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\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 column = schema.__columns.find((c) => c.name === ref.columnName);\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: ref.columnName },\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: ref.columnName },\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\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"],"mappings":";;;;;AAMA,IAAa,iBAAb,MAA4B;CAC1B,yBAAiB,IAAI,KAA4B;CACjD,8BAAsB,IAAI,KAA8B;CACxD,4BAAoB,IAAI,KAOrB;;;;;CAMH,SAAS,SAA+D;AACtE,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAC7B,OAAM,IAAI,YAAY,2BAA2B;AAGnD,QAAK,YAAY,IAAI,OAAO,QAAQ,OAAO;AAC3C,QAAK,OAAO,IAAI,OAAO,QAAQ;IAC7B,MAAM,OAAO;IACb,SAAS,CAAC,GAAG,OAAO,UAAU;IAC/B,CAAC;;AAGJ,OAAK,MAAM,UAAU,QACnB,MAAK,MAAM,OAAO,OAAO,gBAAgB;GACvC,MAAM,WAAW,IAAI,SAAS;AAC9B,OAAI,CAAC,SAAS,SAAS,CAAC,SAAS,OAC/B,OAAM,IAAI,YACR,mCAAmC,OAAO,OAAO,GAAG,IAAI,aACzD;AAGH,OAAI,CAAC,KAAK,OAAO,IAAI,SAAS,MAAM,CAClC,OAAM,IAAI,YACR,qBAAqB,SAAS,MAAM,qCACrC;GAGH,MAAM,SAAS,OAAO,UAAU,MAAM,MAAM,EAAE,SAAS,IAAI,WAAW;AACtE,OAAI,OACF,QAAO,aAAa;IAClB,OAAO,SAAS;IAChB,QAAQ,SAAS;IACjB,UAAU,IAAI;IACd,UAAU,IAAI;IACd,cAAc,IAAI;IACnB;GAGH,MAAM,eACJ,IAAI,gBAAgB,IAAI,WAAW,QAAQ,OAAO,GAAG,CAAC,QAAQ,QAAQ,GAAG;AAE3E,OAAI,CAAC,KAAK,UAAU,IAAI,OAAO,OAAO,CACpC,MAAK,UAAU,IAAI,OAAO,QAAQ,EAAE,CAAC;AAEvC,QAAK,UAAU,IAAI,OAAO,OAAO,CAAE,KAAK;IACtC,MAAM;KAAE,OAAO,OAAO;KAAQ,QAAQ,IAAI;KAAY;IACtD,IAAI;KAAE,OAAO,SAAS;KAAO,QAAQ,SAAS;KAAQ;IACtD;IACD,CAAC;AAEF,OAAI,CAAC,KAAK,UAAU,IAAI,SAAS,MAAM,CACrC,MAAK,UAAU,IAAI,SAAS,OAAO,EAAE,CAAC;GAExC,MAAM,sBAAsB,OAAO;AACnC,QAAK,UAAU,IAAI,SAAS,MAAM,CAAE,KAAK;IACvC,MAAM;KAAE,OAAO,SAAS;KAAO,QAAQ,SAAS;KAAQ;IACxD,IAAI;KAAE,OAAO,OAAO;KAAQ,QAAQ,IAAI;KAAY;IACpD,cAAc;IACf,CAAC;;;;;;;;CAUR,SAAS,MAAyC;AAChD,SAAO,KAAK,OAAO,IAAI,KAAK;;;;;;CAO9B,eAA2C;AACzC,SAAO,KAAK;;;;;;;CAQd,aAAa,WAIV;AACD,SAAO,KAAK,UAAU,IAAI,UAAU,IAAI,EAAE;;;;;;;CAQ5C,cAAc,WAAkC;EAC9C,MAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AACxC,MAAI,CAAC,MACH,QAAO;AAET,OAAK,MAAM,OAAO,MAAM,QACtB,KAAI,IAAI,WACN,QAAO,IAAI;AAGf,SAAO"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
for (const [key, builder] of Object.entries(columns)) {
|
|
12
|
+
const meta = builder.__build(key);
|
|
13
|
+
columnsArray.push(meta);
|
|
14
|
+
const ref = builder.__getDeferredRef();
|
|
15
|
+
if (ref) deferredRefs.push({
|
|
16
|
+
columnName: key,
|
|
17
|
+
resolve: ref.resolve,
|
|
18
|
+
onDelete: ref.onDelete,
|
|
19
|
+
onUpdate: ref.onUpdate,
|
|
20
|
+
relationName: ref.relationName
|
|
21
|
+
});
|
|
22
|
+
builder.__tableName = name;
|
|
23
|
+
builder.__columnName = key;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
__table: true,
|
|
27
|
+
__name: name,
|
|
28
|
+
__columns: columnsArray,
|
|
29
|
+
__deferredRefs: deferredRefs,
|
|
30
|
+
...columns
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
exports.table = table;
|
|
35
|
+
|
|
36
|
+
//# 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\n for (const [key, builder] of Object.entries(columns)) {\n const meta = builder.__build(key);\n columnsArray.push(meta);\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 __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;AAE1D,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,OAAO,QAAQ,QAAQ,IAAI;AACjC,eAAa,KAAK,KAAK;EAEvB,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;;AAWlC,QARY;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,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,36 @@
|
|
|
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
|
+
for (const [key, builder] of Object.entries(columns)) {
|
|
12
|
+
const meta = builder.__build(key);
|
|
13
|
+
columnsArray.push(meta);
|
|
14
|
+
const ref = builder.__getDeferredRef();
|
|
15
|
+
if (ref) deferredRefs.push({
|
|
16
|
+
columnName: key,
|
|
17
|
+
resolve: ref.resolve,
|
|
18
|
+
onDelete: ref.onDelete,
|
|
19
|
+
onUpdate: ref.onUpdate,
|
|
20
|
+
relationName: ref.relationName
|
|
21
|
+
});
|
|
22
|
+
builder.__tableName = name;
|
|
23
|
+
builder.__columnName = key;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
__table: true,
|
|
27
|
+
__name: name,
|
|
28
|
+
__columns: columnsArray,
|
|
29
|
+
__deferredRefs: deferredRefs,
|
|
30
|
+
...columns
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { table };
|
|
35
|
+
|
|
36
|
+
//# 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\n for (const [key, builder] of Object.entries(columns)) {\n const meta = builder.__build(key);\n columnsArray.push(meta);\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 __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;AAE1D,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,OAAO,QAAQ,QAAQ,IAAI;AACjC,eAAa,KAAK,KAAK;EAEvB,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;;AAWlC,QARY;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,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.keys());
|
|
30
|
+
for (const [colName, colMeta] of meta.columns) if (!existingNames.has(colName)) 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.keys());\n\n for (const [colName, colMeta] of meta.columns) {\n if (!existingNames.has(colName)) {\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,MAAM,CAAC;AAEhD,OAAK,MAAM,CAAC,SAAS,YAAY,KAAK,QACpC,KAAI,CAAC,cAAc,IAAI,QAAQ,CAC7B,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.keys());
|
|
30
|
+
for (const [colName, colMeta] of meta.columns) if (!existingNames.has(colName)) 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.keys());\n\n for (const [colName, colMeta] of meta.columns) {\n if (!existingNames.has(colName)) {\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,MAAM,CAAC;AAEhD,OAAK,MAAM,CAAC,SAAS,YAAY,KAAK,QACpC,KAAI,CAAC,cAAc,IAAI,QAAQ,CAC7B,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"}
|