@hedystia/db 2.0.1 → 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 (46) hide show
  1. package/dist/core/repository.cjs +75 -21
  2. package/dist/core/repository.cjs.map +1 -1
  3. package/dist/core/repository.d.cts +10 -0
  4. package/dist/core/repository.d.mts +10 -0
  5. package/dist/core/repository.mjs +75 -21
  6. package/dist/core/repository.mjs.map +1 -1
  7. package/dist/index.cjs +14 -0
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +2 -2
  10. package/dist/index.d.mts +2 -2
  11. package/dist/index.mjs +2 -2
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/migrations/templates.cjs +4 -4
  14. package/dist/migrations/templates.cjs.map +1 -1
  15. package/dist/migrations/templates.mjs +4 -4
  16. package/dist/migrations/templates.mjs.map +1 -1
  17. package/dist/schema/column.cjs +34 -2
  18. package/dist/schema/column.cjs.map +1 -1
  19. package/dist/schema/column.d.cts +24 -0
  20. package/dist/schema/column.d.mts +24 -0
  21. package/dist/schema/column.mjs +34 -2
  22. package/dist/schema/column.mjs.map +1 -1
  23. package/dist/schema/columns/index.cjs +93 -1
  24. package/dist/schema/columns/index.cjs.map +1 -1
  25. package/dist/schema/columns/index.d.cts +52 -2
  26. package/dist/schema/columns/index.d.mts +52 -2
  27. package/dist/schema/columns/index.mjs +80 -2
  28. package/dist/schema/columns/index.mjs.map +1 -1
  29. package/dist/schema/registry.cjs +28 -4
  30. package/dist/schema/registry.cjs.map +1 -1
  31. package/dist/schema/registry.d.cts +15 -1
  32. package/dist/schema/registry.d.mts +15 -1
  33. package/dist/schema/registry.mjs +28 -4
  34. package/dist/schema/registry.mjs.map +1 -1
  35. package/dist/schema/table.cjs +3 -0
  36. package/dist/schema/table.cjs.map +1 -1
  37. package/dist/schema/table.mjs +3 -0
  38. package/dist/schema/table.mjs.map +1 -1
  39. package/dist/sync/synchronizer.cjs +2 -2
  40. package/dist/sync/synchronizer.cjs.map +1 -1
  41. package/dist/sync/synchronizer.mjs +2 -2
  42. package/dist/sync/synchronizer.mjs.map +1 -1
  43. package/dist/types.d.cts +4 -2
  44. package/dist/types.d.mts +4 -2
  45. package/package.json +1 -1
  46. package/readme.md +11 -9
@@ -7,6 +7,8 @@ import { TableDefinition, TableMetadata } from "../types.mjs";
7
7
  declare class SchemaRegistry {
8
8
  private tables;
9
9
  private definitions;
10
+ private columnMaps;
11
+ private reverseColumnMaps;
10
12
  private relations;
11
13
  /**
12
14
  * Register table definitions and resolve all deferred references
@@ -41,11 +43,23 @@ declare class SchemaRegistry {
41
43
  relationName: string;
42
44
  }>;
43
45
  /**
44
- * Get the primary key column name for a table
46
+ * Get the primary key column name for a table (returns DB column name)
45
47
  * @param {string} tableName - Table name
46
48
  * @returns {string | null} The primary key column name or null
47
49
  */
48
50
  getPrimaryKey(tableName: string): string | null;
51
+ /**
52
+ * Get the column name map (code key -> DB column name) for a table
53
+ * @param {string} tableName - Table name
54
+ * @returns {Record<string, string>} Column name map
55
+ */
56
+ getColumnMap(tableName: string): Record<string, string>;
57
+ /**
58
+ * Get the reverse column name map (DB column name -> code key) for a table
59
+ * @param {string} tableName - Table name
60
+ * @returns {Record<string, string>} Reverse column name map
61
+ */
62
+ getReverseColumnMap(tableName: string): Record<string, string>;
49
63
  }
50
64
  //#endregion
51
65
  export { SchemaRegistry };
@@ -6,6 +6,8 @@ import { SchemaError } from "../errors.mjs";
6
6
  var SchemaRegistry = class {
7
7
  tables = /* @__PURE__ */ new Map();
8
8
  definitions = /* @__PURE__ */ new Map();
9
+ columnMaps = /* @__PURE__ */ new Map();
10
+ reverseColumnMaps = /* @__PURE__ */ new Map();
9
11
  relations = /* @__PURE__ */ new Map();
10
12
  /**
11
13
  * Register table definitions and resolve all deferred references
@@ -19,12 +21,18 @@ var SchemaRegistry = class {
19
21
  name: schema.__name,
20
22
  columns: [...schema.__columns]
21
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);
22
29
  }
23
30
  for (const schema of schemas) for (const ref of schema.__deferredRefs) {
24
31
  const resolved = ref.resolve();
25
32
  if (!resolved.table || !resolved.column) throw new SchemaError(`Failed to resolve reference for ${schema.__name}.${ref.columnName}`);
26
33
  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);
34
+ const dbColumnName = (this.columnMaps.get(schema.__name) ?? {})[ref.columnName] ?? ref.columnName;
35
+ const column = schema.__columns.find((c) => c.name === dbColumnName);
28
36
  if (column) column.references = {
29
37
  table: resolved.table,
30
38
  column: resolved.column,
@@ -37,7 +45,7 @@ var SchemaRegistry = class {
37
45
  this.relations.get(schema.__name).push({
38
46
  from: {
39
47
  table: schema.__name,
40
- column: ref.columnName
48
+ column: dbColumnName
41
49
  },
42
50
  to: {
43
51
  table: resolved.table,
@@ -54,7 +62,7 @@ var SchemaRegistry = class {
54
62
  },
55
63
  to: {
56
64
  table: schema.__name,
57
- column: ref.columnName
65
+ column: dbColumnName
58
66
  },
59
67
  relationName: reverseRelationName
60
68
  });
@@ -84,7 +92,7 @@ var SchemaRegistry = class {
84
92
  return this.relations.get(tableName) ?? [];
85
93
  }
86
94
  /**
87
- * Get the primary key column name for a table
95
+ * Get the primary key column name for a table (returns DB column name)
88
96
  * @param {string} tableName - Table name
89
97
  * @returns {string | null} The primary key column name or null
90
98
  */
@@ -94,6 +102,22 @@ var SchemaRegistry = class {
94
102
  for (const col of table.columns) if (col.primaryKey) return col.name;
95
103
  return null;
96
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
+ }
97
121
  };
98
122
  //#endregion
99
123
  export { SchemaRegistry };
@@ -1 +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"}
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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"}
@@ -8,9 +8,11 @@
8
8
  function table(name, columns) {
9
9
  const columnsArray = [];
10
10
  const deferredRefs = [];
11
+ const columnMap = {};
11
12
  for (const [key, builder] of Object.entries(columns)) {
12
13
  const meta = builder.__build(key);
13
14
  columnsArray.push(meta);
15
+ columnMap[key] = meta.name;
14
16
  const ref = builder.__getDeferredRef();
15
17
  if (ref) deferredRefs.push({
16
18
  columnName: key,
@@ -26,6 +28,7 @@ function table(name, columns) {
26
28
  __table: true,
27
29
  __name: name,
28
30
  __columns: columnsArray,
31
+ __columnMap: columnMap,
29
32
  __deferredRefs: deferredRefs,
30
33
  ...columns
31
34
  };
@@ -1 +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"}
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"}
@@ -8,9 +8,11 @@
8
8
  function table(name, columns) {
9
9
  const columnsArray = [];
10
10
  const deferredRefs = [];
11
+ const columnMap = {};
11
12
  for (const [key, builder] of Object.entries(columns)) {
12
13
  const meta = builder.__build(key);
13
14
  columnsArray.push(meta);
15
+ columnMap[key] = meta.name;
14
16
  const ref = builder.__getDeferredRef();
15
17
  if (ref) deferredRefs.push({
16
18
  columnName: key,
@@ -26,6 +28,7 @@ function table(name, columns) {
26
28
  __table: true,
27
29
  __name: name,
28
30
  __columns: columnsArray,
31
+ __columnMap: columnMap,
29
32
  __deferredRefs: deferredRefs,
30
33
  ...columns
31
34
  };
@@ -1 +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"}
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"}
@@ -26,8 +26,8 @@ var Synchronizer = class {
26
26
  }
27
27
  const existingCols = await this.driver.getTableColumns(meta.name);
28
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);
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
31
  if (force) {
32
32
  for (const existingName of existingNames) if (!schemaNames.has(existingName)) try {
33
33
  await this.driver.dropColumn(meta.name, existingName);
@@ -1 +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"}
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"}
@@ -26,8 +26,8 @@ var Synchronizer = class {
26
26
  }
27
27
  const existingCols = await this.driver.getTableColumns(meta.name);
28
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);
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
31
  if (force) {
32
32
  for (const existingName of existingNames) if (!schemaNames.has(existingName)) try {
33
33
  await this.driver.dropColumn(meta.name, existingName);
@@ -1 +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"}
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"}
package/dist/types.d.cts CHANGED
@@ -24,6 +24,7 @@ interface ColumnMetadata {
24
24
  length?: number;
25
25
  precision?: number;
26
26
  scale?: number;
27
+ columnAlias?: string;
27
28
  references?: {
28
29
  table: string;
29
30
  column: string;
@@ -51,6 +52,7 @@ type TableDefinition<T extends Record<string, any> = Record<string, any>, C exte
51
52
  __row: T;
52
53
  __refs: Refs;
53
54
  __columns: ColumnMetadata[];
55
+ __columnMap: Record<string, string>;
54
56
  __deferredRefs: Array<{
55
57
  columnName: string;
56
58
  resolve: () => {
@@ -88,8 +90,8 @@ type WhereClause<T = Record<string, any>> = { [K in keyof T]?: T[K] | WhereCondi
88
90
  };
89
91
  interface QueryOptions<T = Record<string, any>, Rel extends Record<string, any> = {}> {
90
92
  where?: WhereClause<T>;
91
- select?: (keyof T)[];
92
- orderBy?: Partial<Record<keyof T, "asc" | "desc">>;
93
+ select?: Extract<keyof T, string>[];
94
+ orderBy?: Partial<Record<Extract<keyof T, string>, "asc" | "desc">>;
93
95
  take?: number;
94
96
  skip?: number;
95
97
  with?: { [K in keyof Rel]?: boolean | QueryOptions<Rel[K] extends {
package/dist/types.d.mts CHANGED
@@ -24,6 +24,7 @@ interface ColumnMetadata {
24
24
  length?: number;
25
25
  precision?: number;
26
26
  scale?: number;
27
+ columnAlias?: string;
27
28
  references?: {
28
29
  table: string;
29
30
  column: string;
@@ -51,6 +52,7 @@ type TableDefinition<T extends Record<string, any> = Record<string, any>, C exte
51
52
  __row: T;
52
53
  __refs: Refs;
53
54
  __columns: ColumnMetadata[];
55
+ __columnMap: Record<string, string>;
54
56
  __deferredRefs: Array<{
55
57
  columnName: string;
56
58
  resolve: () => {
@@ -88,8 +90,8 @@ type WhereClause<T = Record<string, any>> = { [K in keyof T]?: T[K] | WhereCondi
88
90
  };
89
91
  interface QueryOptions<T = Record<string, any>, Rel extends Record<string, any> = {}> {
90
92
  where?: WhereClause<T>;
91
- select?: (keyof T)[];
92
- orderBy?: Partial<Record<keyof T, "asc" | "desc">>;
93
+ select?: Extract<keyof T, string>[];
94
+ orderBy?: Partial<Record<Extract<keyof T, string>, "asc" | "desc">>;
93
95
  take?: number;
94
96
  skip?: number;
95
97
  with?: { [K in keyof Rel]?: boolean | QueryOptions<Rel[K] extends {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hedystia/db",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Next-gen TypeScript ORM for building type-safe database layers at lightspeed",
5
5
  "homepage": "https://docs.hedystia.com",
6
6
  "devDependencies": {
package/readme.md CHANGED
@@ -47,23 +47,25 @@ bun add mysql
47
47
  ### Define your schema
48
48
 
49
49
  ```ts
50
- import { table, d } from "@hedystia/db";
50
+ import { table, integer, varchar, text } from "@hedystia/db";
51
51
 
52
52
  export const users = table("users", {
53
- id: d.integer().primaryKey().autoIncrement(),
54
- name: d.varchar(255).notNull(),
55
- email: d.varchar(255).unique(),
56
- age: d.integer().default(0),
53
+ id: integer().primaryKey().autoIncrement(),
54
+ name: varchar(255).notNull(),
55
+ email: varchar(255).unique(),
56
+ age: integer().default(0),
57
57
  });
58
58
 
59
59
  export const posts = table("posts", {
60
- id: d.integer().primaryKey().autoIncrement(),
61
- userId: d.integer().references(() => users.id, { onDelete: "CASCADE" }),
62
- title: d.varchar(255).notNull(),
63
- content: d.text(),
60
+ id: integer().primaryKey().autoIncrement(),
61
+ userId: integer().references(() => users.id, { onDelete: "CASCADE" }),
62
+ title: varchar(255).notNull(),
63
+ content: text(),
64
64
  });
65
65
  ```
66
66
 
67
+ > **Note:** The `d.xxx()` prefix style (e.g., `d.integer()`) is still supported for backward compatibility.
68
+
67
69
  ### Create the database
68
70
 
69
71
  ```ts