@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,122 @@
1
+ //#region src/cache/memory-store.ts
2
+ /**
3
+ * In-memory cache store with TTL and hit-count tracking
4
+ */
5
+ var MemoryStore = class {
6
+ store = /* @__PURE__ */ new Map();
7
+ maxEntries;
8
+ constructor(maxEntries = 1e4) {
9
+ this.maxEntries = maxEntries;
10
+ }
11
+ /**
12
+ * Get a value from cache
13
+ * @param {string} key - Cache key
14
+ * @returns {unknown | undefined} Cached value or undefined
15
+ */
16
+ get(key) {
17
+ const entry = this.store.get(key);
18
+ if (!entry) return;
19
+ if (Date.now() > entry.expiresAt) {
20
+ this.store.delete(key);
21
+ return;
22
+ }
23
+ entry.hitCount++;
24
+ entry.lastAccess = Date.now();
25
+ return entry.value;
26
+ }
27
+ /**
28
+ * Set a value in cache with TTL
29
+ * @param {string} key - Cache key
30
+ * @param {unknown} value - Value to cache
31
+ * @param {number} ttl - Time to live in milliseconds
32
+ */
33
+ set(key, value, ttl) {
34
+ if (this.store.size >= this.maxEntries) this.evict();
35
+ this.store.set(key, {
36
+ value,
37
+ expiresAt: Date.now() + ttl,
38
+ hitCount: 1,
39
+ lastAccess: Date.now()
40
+ });
41
+ }
42
+ /**
43
+ * Check if a key exists in cache and is not expired
44
+ * @param {string} key - Cache key
45
+ * @returns {boolean} Whether the key exists
46
+ */
47
+ has(key) {
48
+ const entry = this.store.get(key);
49
+ if (!entry) return false;
50
+ if (Date.now() > entry.expiresAt) {
51
+ this.store.delete(key);
52
+ return false;
53
+ }
54
+ return true;
55
+ }
56
+ /**
57
+ * Delete a key from cache
58
+ * @param {string} key - Cache key
59
+ */
60
+ delete(key) {
61
+ this.store.delete(key);
62
+ }
63
+ /**
64
+ * Invalidate all cache entries matching a prefix
65
+ * @param {string} prefix - Key prefix
66
+ */
67
+ invalidateByPrefix(prefix) {
68
+ for (const key of this.store.keys()) if (key.startsWith(prefix)) this.store.delete(key);
69
+ }
70
+ /**
71
+ * Clear all cached entries
72
+ */
73
+ clear() {
74
+ this.store.clear();
75
+ }
76
+ /**
77
+ * Get the number of cached entries
78
+ * @returns {number} Number of entries
79
+ */
80
+ get size() {
81
+ return this.store.size;
82
+ }
83
+ /**
84
+ * Get hit count for a cache key
85
+ * @param {string} key - Cache key
86
+ * @returns {number} Number of hits
87
+ */
88
+ getHitCount(key) {
89
+ return this.store.get(key)?.hitCount ?? 0;
90
+ }
91
+ /**
92
+ * Extend the TTL of a cache entry based on hit count
93
+ * @param {string} key - Cache key
94
+ * @param {number} baseTtl - Base TTL in milliseconds
95
+ * @param {number} maxTtl - Maximum TTL in milliseconds
96
+ */
97
+ extendTtl(key, baseTtl, maxTtl) {
98
+ const entry = this.store.get(key);
99
+ if (!entry) return;
100
+ const adaptiveTtl = Math.min(maxTtl, baseTtl * (1 + Math.log2(entry.hitCount + 1)));
101
+ entry.expiresAt = Date.now() + adaptiveTtl;
102
+ }
103
+ evict() {
104
+ let oldestKey = null;
105
+ let oldestAccess = Number.POSITIVE_INFINITY;
106
+ for (const [key, entry] of this.store) {
107
+ if (Date.now() > entry.expiresAt) {
108
+ this.store.delete(key);
109
+ return;
110
+ }
111
+ if (entry.lastAccess < oldestAccess) {
112
+ oldestAccess = entry.lastAccess;
113
+ oldestKey = key;
114
+ }
115
+ }
116
+ if (oldestKey) this.store.delete(oldestKey);
117
+ }
118
+ };
119
+ //#endregion
120
+ export { MemoryStore };
121
+
122
+ //# sourceMappingURL=memory-store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.mjs","names":[],"sources":["../../src/cache/memory-store.ts"],"sourcesContent":["interface CacheEntry {\n value: unknown;\n expiresAt: number;\n hitCount: number;\n lastAccess: number;\n}\n\n/**\n * In-memory cache store with TTL and hit-count tracking\n */\nexport class MemoryStore {\n private store = new Map<string, CacheEntry>();\n private maxEntries: number;\n\n constructor(maxEntries = 10_000) {\n this.maxEntries = maxEntries;\n }\n\n /**\n * Get a value from cache\n * @param {string} key - Cache key\n * @returns {unknown | undefined} Cached value or undefined\n */\n get(key: string): unknown | undefined {\n const entry = this.store.get(key);\n if (!entry) {\n return undefined;\n }\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n entry.hitCount++;\n entry.lastAccess = Date.now();\n return entry.value;\n }\n\n /**\n * Set a value in cache with TTL\n * @param {string} key - Cache key\n * @param {unknown} value - Value to cache\n * @param {number} ttl - Time to live in milliseconds\n */\n set(key: string, value: unknown, ttl: number): void {\n if (this.store.size >= this.maxEntries) {\n this.evict();\n }\n this.store.set(key, {\n value,\n expiresAt: Date.now() + ttl,\n hitCount: 1,\n lastAccess: Date.now(),\n });\n }\n\n /**\n * Check if a key exists in cache and is not expired\n * @param {string} key - Cache key\n * @returns {boolean} Whether the key exists\n */\n has(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) {\n return false;\n }\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n /**\n * Delete a key from cache\n * @param {string} key - Cache key\n */\n delete(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Invalidate all cache entries matching a prefix\n * @param {string} prefix - Key prefix\n */\n invalidateByPrefix(prefix: string): void {\n for (const key of this.store.keys()) {\n if (key.startsWith(prefix)) {\n this.store.delete(key);\n }\n }\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Get the number of cached entries\n * @returns {number} Number of entries\n */\n get size(): number {\n return this.store.size;\n }\n\n /**\n * Get hit count for a cache key\n * @param {string} key - Cache key\n * @returns {number} Number of hits\n */\n getHitCount(key: string): number {\n return this.store.get(key)?.hitCount ?? 0;\n }\n\n /**\n * Extend the TTL of a cache entry based on hit count\n * @param {string} key - Cache key\n * @param {number} baseTtl - Base TTL in milliseconds\n * @param {number} maxTtl - Maximum TTL in milliseconds\n */\n extendTtl(key: string, baseTtl: number, maxTtl: number): void {\n const entry = this.store.get(key);\n if (!entry) {\n return;\n }\n const adaptiveTtl = Math.min(maxTtl, baseTtl * (1 + Math.log2(entry.hitCount + 1)));\n entry.expiresAt = Date.now() + adaptiveTtl;\n }\n\n private evict(): void {\n let oldestKey: string | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n for (const [key, entry] of this.store) {\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return;\n }\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess;\n oldestKey = key;\n }\n }\n if (oldestKey) {\n this.store.delete(oldestKey);\n }\n }\n}\n"],"mappings":";;;;AAUA,IAAa,cAAb,MAAyB;CACvB,wBAAgB,IAAI,KAAyB;CAC7C;CAEA,YAAY,aAAa,KAAQ;AAC/B,OAAK,aAAa;;;;;;;CAQpB,IAAI,KAAkC;EACpC,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,MAAI,CAAC,MACH;AAEF,MAAI,KAAK,KAAK,GAAG,MAAM,WAAW;AAChC,QAAK,MAAM,OAAO,IAAI;AACtB;;AAEF,QAAM;AACN,QAAM,aAAa,KAAK,KAAK;AAC7B,SAAO,MAAM;;;;;;;;CASf,IAAI,KAAa,OAAgB,KAAmB;AAClD,MAAI,KAAK,MAAM,QAAQ,KAAK,WAC1B,MAAK,OAAO;AAEd,OAAK,MAAM,IAAI,KAAK;GAClB;GACA,WAAW,KAAK,KAAK,GAAG;GACxB,UAAU;GACV,YAAY,KAAK,KAAK;GACvB,CAAC;;;;;;;CAQJ,IAAI,KAAsB;EACxB,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,MAAI,CAAC,MACH,QAAO;AAET,MAAI,KAAK,KAAK,GAAG,MAAM,WAAW;AAChC,QAAK,MAAM,OAAO,IAAI;AACtB,UAAO;;AAET,SAAO;;;;;;CAOT,OAAO,KAAmB;AACxB,OAAK,MAAM,OAAO,IAAI;;;;;;CAOxB,mBAAmB,QAAsB;AACvC,OAAK,MAAM,OAAO,KAAK,MAAM,MAAM,CACjC,KAAI,IAAI,WAAW,OAAO,CACxB,MAAK,MAAM,OAAO,IAAI;;;;;CAQ5B,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;;CAOpB,IAAI,OAAe;AACjB,SAAO,KAAK,MAAM;;;;;;;CAQpB,YAAY,KAAqB;AAC/B,SAAO,KAAK,MAAM,IAAI,IAAI,EAAE,YAAY;;;;;;;;CAS1C,UAAU,KAAa,SAAiB,QAAsB;EAC5D,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,MAAI,CAAC,MACH;EAEF,MAAM,cAAc,KAAK,IAAI,QAAQ,WAAW,IAAI,KAAK,KAAK,MAAM,WAAW,EAAE,EAAE;AACnF,QAAM,YAAY,KAAK,KAAK,GAAG;;CAGjC,QAAsB;EACpB,IAAI,YAA2B;EAC/B,IAAI,eAAe,OAAO;AAC1B,OAAK,MAAM,CAAC,KAAK,UAAU,KAAK,OAAO;AACrC,OAAI,KAAK,KAAK,GAAG,MAAM,WAAW;AAChC,SAAK,MAAM,OAAO,IAAI;AACtB;;AAEF,OAAI,MAAM,aAAa,cAAc;AACnC,mBAAe,MAAM;AACrB,gBAAY;;;AAGhB,MAAI,UACF,MAAK,MAAM,OAAO,UAAU"}
@@ -0,0 +1,22 @@
1
+ require("../../constants.cjs");
2
+ const require_fs = require("../../utils/fs.cjs");
3
+ const require_naming = require("../../utils/naming.cjs");
4
+ const require_templates = require("../../migrations/templates.cjs");
5
+ let path = require("path");
6
+ //#region src/cli/commands/migration.ts
7
+ /**
8
+ * Create a new migration file
9
+ * @param {string} name - Migration name
10
+ * @param {string} [path] - Output directory
11
+ */
12
+ function createMigration(name, path$1) {
13
+ const dir = path$1 ?? "src/database/migrations";
14
+ require_fs.ensureDir(dir);
15
+ const filePath = (0, path.join)(dir, `${require_naming.generateTimestamp()}_${name}.ts`);
16
+ require_fs.writeFileSafe(filePath, require_templates.generateMigrationTemplate(name));
17
+ console.log(`Created migration: ${filePath}`);
18
+ }
19
+ //#endregion
20
+ exports.createMigration = createMigration;
21
+
22
+ //# sourceMappingURL=migration.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.cjs","names":["path","generateTimestamp","generateMigrationTemplate"],"sources":["../../../src/cli/commands/migration.ts"],"sourcesContent":["import { join } from \"path\";\nimport { DEFAULT_MIGRATIONS_PATH } from \"../../constants\";\nimport { generateMigrationTemplate } from \"../../migrations\";\nimport { ensureDir, writeFileSafe } from \"../../utils\";\nimport { generateTimestamp } from \"../../utils/naming\";\n\n/**\n * Create a new migration file\n * @param {string} name - Migration name\n * @param {string} [path] - Output directory\n */\nexport function createMigration(name: string, path?: string): void {\n const dir = path ?? DEFAULT_MIGRATIONS_PATH;\n ensureDir(dir);\n\n const timestamp = generateTimestamp();\n const fileName = `${timestamp}_${name}.ts`;\n const filePath = join(dir, fileName);\n const content = generateMigrationTemplate(name);\n\n writeFileSafe(filePath, content);\n console.log(`Created migration: ${filePath}`);\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,gBAAgB,MAAc,QAAqB;CACjE,MAAM,MAAMA,UAAAA;AACZ,YAAA,UAAU,IAAI;CAId,MAAM,YAAA,GAAA,KAAA,MAAgB,KADL,GADCC,eAAAA,mBAAmB,CACP,GAAG,KAAK,KACF;AAGpC,YAAA,cAAc,UAFEC,kBAAAA,0BAA0B,KAAK,CAEf;AAChC,SAAQ,IAAI,sBAAsB,WAAW"}
@@ -0,0 +1,32 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.mjs";
2
+ import { init_constants } from "../../constants.mjs";
3
+ import { ensureDir, writeFileSafe } from "../../utils/fs.mjs";
4
+ import { generateTimestamp, init_naming } from "../../utils/naming.mjs";
5
+ import { init_utils } from "../../utils/index.mjs";
6
+ import { generateMigrationTemplate } from "../../migrations/templates.mjs";
7
+ import { init_migrations } from "../../migrations/index.mjs";
8
+ import { join } from "path";
9
+ //#region src/cli/commands/migration.ts
10
+ /**
11
+ * Create a new migration file
12
+ * @param {string} name - Migration name
13
+ * @param {string} [path] - Output directory
14
+ */
15
+ function createMigration(name, path) {
16
+ const dir = path ?? "src/database/migrations";
17
+ ensureDir(dir);
18
+ const filePath = join(dir, `${generateTimestamp()}_${name}.ts`);
19
+ writeFileSafe(filePath, generateMigrationTemplate(name));
20
+ console.log(`Created migration: ${filePath}`);
21
+ }
22
+ var init_migration = __esmMin((() => {
23
+ init_constants();
24
+ init_migrations();
25
+ init_utils();
26
+ init_naming();
27
+ }));
28
+ //#endregion
29
+ init_migration();
30
+ export { createMigration, init_migration };
31
+
32
+ //# sourceMappingURL=migration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.mjs","names":[],"sources":["../../../src/cli/commands/migration.ts"],"sourcesContent":["import { join } from \"path\";\nimport { DEFAULT_MIGRATIONS_PATH } from \"../../constants\";\nimport { generateMigrationTemplate } from \"../../migrations\";\nimport { ensureDir, writeFileSafe } from \"../../utils\";\nimport { generateTimestamp } from \"../../utils/naming\";\n\n/**\n * Create a new migration file\n * @param {string} name - Migration name\n * @param {string} [path] - Output directory\n */\nexport function createMigration(name: string, path?: string): void {\n const dir = path ?? DEFAULT_MIGRATIONS_PATH;\n ensureDir(dir);\n\n const timestamp = generateTimestamp();\n const fileName = `${timestamp}_${name}.ts`;\n const filePath = join(dir, fileName);\n const content = generateMigrationTemplate(name);\n\n writeFileSafe(filePath, content);\n console.log(`Created migration: ${filePath}`);\n}\n"],"mappings":";;;;;;;;;;;;;;AAWA,SAAgB,gBAAgB,MAAc,MAAqB;CACjE,MAAM,MAAM,QAAA;AACZ,WAAU,IAAI;CAId,MAAM,WAAW,KAAK,KADL,GADC,mBAAmB,CACP,GAAG,KAAK,KACF;AAGpC,eAAc,UAFE,0BAA0B,KAAK,CAEf;AAChC,SAAQ,IAAI,sBAAsB,WAAW;;;iBApBW;kBACG;aACN;cACA"}
@@ -0,0 +1,21 @@
1
+ require("../../constants.cjs");
2
+ const require_fs = require("../../utils/fs.cjs");
3
+ const require_templates = require("../../migrations/templates.cjs");
4
+ let path = require("path");
5
+ //#region src/cli/commands/schema.ts
6
+ /**
7
+ * Create a new schema file
8
+ * @param {string} name - Table name
9
+ * @param {string} [path] - Output directory
10
+ */
11
+ function createSchema(name, path$1) {
12
+ const dir = path$1 ?? "src/database/schemas";
13
+ require_fs.ensureDir(dir);
14
+ const filePath = (0, path.join)(dir, `${name}.ts`);
15
+ require_fs.writeFileSafe(filePath, require_templates.generateSchemaTemplate(name));
16
+ console.log(`Created schema: ${filePath}`);
17
+ }
18
+ //#endregion
19
+ exports.createSchema = createSchema;
20
+
21
+ //# sourceMappingURL=schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.cjs","names":["path","generateSchemaTemplate"],"sources":["../../../src/cli/commands/schema.ts"],"sourcesContent":["import { join } from \"path\";\nimport { DEFAULT_SCHEMAS_PATH } from \"../../constants\";\nimport { generateSchemaTemplate } from \"../../migrations\";\nimport { ensureDir, writeFileSafe } from \"../../utils\";\n\n/**\n * Create a new schema file\n * @param {string} name - Table name\n * @param {string} [path] - Output directory\n */\nexport function createSchema(name: string, path?: string): void {\n const dir = path ?? DEFAULT_SCHEMAS_PATH;\n ensureDir(dir);\n\n const fileName = `${name}.ts`;\n const filePath = join(dir, fileName);\n const content = generateSchemaTemplate(name);\n\n writeFileSafe(filePath, content);\n console.log(`Created schema: ${filePath}`);\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,aAAa,MAAc,QAAqB;CAC9D,MAAM,MAAMA,UAAAA;AACZ,YAAA,UAAU,IAAI;CAGd,MAAM,YAAA,GAAA,KAAA,MAAgB,KADL,GAAG,KAAK,KACW;AAGpC,YAAA,cAAc,UAFEC,kBAAAA,uBAAuB,KAAK,CAEZ;AAChC,SAAQ,IAAI,mBAAmB,WAAW"}
@@ -0,0 +1,30 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.mjs";
2
+ import { init_constants } from "../../constants.mjs";
3
+ import { ensureDir, writeFileSafe } from "../../utils/fs.mjs";
4
+ import { init_utils } from "../../utils/index.mjs";
5
+ import { generateSchemaTemplate } from "../../migrations/templates.mjs";
6
+ import { init_migrations } from "../../migrations/index.mjs";
7
+ import { join } from "path";
8
+ //#region src/cli/commands/schema.ts
9
+ /**
10
+ * Create a new schema file
11
+ * @param {string} name - Table name
12
+ * @param {string} [path] - Output directory
13
+ */
14
+ function createSchema(name, path) {
15
+ const dir = path ?? "src/database/schemas";
16
+ ensureDir(dir);
17
+ const filePath = join(dir, `${name}.ts`);
18
+ writeFileSafe(filePath, generateSchemaTemplate(name));
19
+ console.log(`Created schema: ${filePath}`);
20
+ }
21
+ var init_schema = __esmMin((() => {
22
+ init_constants();
23
+ init_migrations();
24
+ init_utils();
25
+ }));
26
+ //#endregion
27
+ init_schema();
28
+ export { createSchema, init_schema };
29
+
30
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../../../src/cli/commands/schema.ts"],"sourcesContent":["import { join } from \"path\";\nimport { DEFAULT_SCHEMAS_PATH } from \"../../constants\";\nimport { generateSchemaTemplate } from \"../../migrations\";\nimport { ensureDir, writeFileSafe } from \"../../utils\";\n\n/**\n * Create a new schema file\n * @param {string} name - Table name\n * @param {string} [path] - Output directory\n */\nexport function createSchema(name: string, path?: string): void {\n const dir = path ?? DEFAULT_SCHEMAS_PATH;\n ensureDir(dir);\n\n const fileName = `${name}.ts`;\n const filePath = join(dir, fileName);\n const content = generateSchemaTemplate(name);\n\n writeFileSafe(filePath, content);\n console.log(`Created schema: ${filePath}`);\n}\n"],"mappings":";;;;;;;;;;;;;AAUA,SAAgB,aAAa,MAAc,MAAqB;CAC9D,MAAM,MAAM,QAAA;AACZ,WAAU,IAAI;CAGd,MAAM,WAAW,KAAK,KADL,GAAG,KAAK,KACW;AAGpC,eAAc,UAFE,uBAAuB,KAAK,CAEZ;AAChC,SAAQ,IAAI,mBAAmB,WAAW;;;iBAlBW;kBACG;aACH"}
package/dist/cli.cjs ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env bun
2
+ const require_migration = require("./cli/commands/migration.cjs");
3
+ const require_schema = require("./cli/commands/schema.cjs");
4
+ //#region src/cli.ts
5
+ const args = process.argv.slice(2);
6
+ const command = args[0];
7
+ const subCommand = args[1];
8
+ function getFlag(flag) {
9
+ const index = args.indexOf(flag);
10
+ if (index !== -1 && args[index + 1]) return args[index + 1];
11
+ }
12
+ function getName() {
13
+ return getFlag("--name") ?? args[2];
14
+ }
15
+ switch (command) {
16
+ case "migration":
17
+ if ((subCommand === "create" ? "create" : "create") === "create") {
18
+ const name = subCommand === "create" ? getName() : subCommand;
19
+ if (!name) {
20
+ console.log("Usage: @hedystia/db migration create <name> [--path <path>]");
21
+ console.log(" @hedystia/db migration <name> [--path <path>]");
22
+ process.exit(1);
23
+ }
24
+ require_migration.createMigration(name, getFlag("--path"));
25
+ }
26
+ break;
27
+ case "schema":
28
+ if ((subCommand === "create" ? "create" : "create") === "create") {
29
+ const name = subCommand === "create" ? getName() : subCommand;
30
+ if (!name) {
31
+ console.log("Usage: @hedystia/db schema create <name> [--path <path>]");
32
+ console.log(" @hedystia/db schema <name> [--path <path>]");
33
+ process.exit(1);
34
+ }
35
+ require_schema.createSchema(name, getFlag("--path"));
36
+ }
37
+ break;
38
+ default:
39
+ console.log("@hedystia/db CLI");
40
+ console.log("");
41
+ console.log("Commands:");
42
+ console.log(" migration create <name> [--path <path>] Create a new migration file");
43
+ console.log(" migration <name> [--path <path>] Create a new migration file (shorthand)");
44
+ console.log(" schema create <name> [--path <path>] Create a new schema file");
45
+ console.log(" schema <name> [--path <path>] Create a new schema file (shorthand)");
46
+ break;
47
+ }
48
+ //#endregion
49
+
50
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { createMigration } from \"./cli/commands/migration\";\nimport { createSchema } from \"./cli/commands/schema\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\nconst subCommand = args[1];\n\nfunction getFlag(flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index !== -1 && args[index + 1]) {\n return args[index + 1];\n }\n return undefined;\n}\n\nfunction getName(): string | undefined {\n return getFlag(\"--name\") ?? args[2];\n}\n\nswitch (command) {\n case \"migration\": {\n const action = subCommand === \"create\" ? \"create\" : \"create\";\n if (action === \"create\") {\n const name = subCommand === \"create\" ? getName() : subCommand;\n if (!name) {\n console.log(\"Usage: @hedystia/db migration create <name> [--path <path>]\");\n console.log(\" @hedystia/db migration <name> [--path <path>]\");\n process.exit(1);\n }\n createMigration(name, getFlag(\"--path\"));\n }\n break;\n }\n case \"schema\": {\n const action = subCommand === \"create\" ? \"create\" : \"create\";\n if (action === \"create\") {\n const name = subCommand === \"create\" ? getName() : subCommand;\n if (!name) {\n console.log(\"Usage: @hedystia/db schema create <name> [--path <path>]\");\n console.log(\" @hedystia/db schema <name> [--path <path>]\");\n process.exit(1);\n }\n createSchema(name, getFlag(\"--path\"));\n }\n break;\n }\n default: {\n console.log(\"@hedystia/db CLI\");\n console.log(\"\");\n console.log(\"Commands:\");\n console.log(\" migration create <name> [--path <path>] Create a new migration file\");\n console.log(\" migration <name> [--path <path>] Create a new migration file (shorthand)\");\n console.log(\" schema create <name> [--path <path>] Create a new schema file\");\n console.log(\" schema <name> [--path <path>] Create a new schema file (shorthand)\");\n break;\n }\n}\n"],"mappings":";;;;AAIA,MAAM,OAAO,QAAQ,KAAK,MAAM,EAAE;AAClC,MAAM,UAAU,KAAK;AACrB,MAAM,aAAa,KAAK;AAExB,SAAS,QAAQ,MAAkC;CACjD,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,KAAI,UAAU,MAAM,KAAK,QAAQ,GAC/B,QAAO,KAAK,QAAQ;;AAKxB,SAAS,UAA8B;AACrC,QAAO,QAAQ,SAAS,IAAI,KAAK;;AAGnC,QAAQ,SAAR;CACE,KAAK;AAEH,OADe,eAAe,WAAW,WAAW,cACrC,UAAU;GACvB,MAAM,OAAO,eAAe,WAAW,SAAS,GAAG;AACnD,OAAI,CAAC,MAAM;AACT,YAAQ,IAAI,8DAA8D;AAC1E,YAAQ,IAAI,uDAAuD;AACnE,YAAQ,KAAK,EAAE;;AAEjB,qBAAA,gBAAgB,MAAM,QAAQ,SAAS,CAAC;;AAE1C;CAEF,KAAK;AAEH,OADe,eAAe,WAAW,WAAW,cACrC,UAAU;GACvB,MAAM,OAAO,eAAe,WAAW,SAAS,GAAG;AACnD,OAAI,CAAC,MAAM;AACT,YAAQ,IAAI,2DAA2D;AACvE,YAAQ,IAAI,oDAAoD;AAChE,YAAQ,KAAK,EAAE;;AAEjB,kBAAA,aAAa,MAAM,QAAQ,SAAS,CAAC;;AAEvC;CAEF;AACE,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,yEAAyE;AACrF,UAAQ,IAAI,qFAAqF;AACjG,UAAQ,IAAI,sEAAsE;AAClF,UAAQ,IAAI,kFAAkF;AAC9F"}
package/dist/cli.d.cts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.mjs ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bun
2
+ import { __commonJSMin } from "./_virtual/_rolldown/runtime.mjs";
3
+ import { createMigration, init_migration } from "./cli/commands/migration.mjs";
4
+ import { createSchema, init_schema } from "./cli/commands/schema.mjs";
5
+ //#region src/cli.ts
6
+ var require_cli = /* @__PURE__ */ __commonJSMin((() => {
7
+ init_migration();
8
+ init_schema();
9
+ const args = process.argv.slice(2);
10
+ const command = args[0];
11
+ const subCommand = args[1];
12
+ function getFlag(flag) {
13
+ const index = args.indexOf(flag);
14
+ if (index !== -1 && args[index + 1]) return args[index + 1];
15
+ }
16
+ function getName() {
17
+ return getFlag("--name") ?? args[2];
18
+ }
19
+ switch (command) {
20
+ case "migration":
21
+ if ((subCommand === "create" ? "create" : "create") === "create") {
22
+ const name = subCommand === "create" ? getName() : subCommand;
23
+ if (!name) {
24
+ console.log("Usage: @hedystia/db migration create <name> [--path <path>]");
25
+ console.log(" @hedystia/db migration <name> [--path <path>]");
26
+ process.exit(1);
27
+ }
28
+ createMigration(name, getFlag("--path"));
29
+ }
30
+ break;
31
+ case "schema":
32
+ if ((subCommand === "create" ? "create" : "create") === "create") {
33
+ const name = subCommand === "create" ? getName() : subCommand;
34
+ if (!name) {
35
+ console.log("Usage: @hedystia/db schema create <name> [--path <path>]");
36
+ console.log(" @hedystia/db schema <name> [--path <path>]");
37
+ process.exit(1);
38
+ }
39
+ createSchema(name, getFlag("--path"));
40
+ }
41
+ break;
42
+ default:
43
+ console.log("@hedystia/db CLI");
44
+ console.log("");
45
+ console.log("Commands:");
46
+ console.log(" migration create <name> [--path <path>] Create a new migration file");
47
+ console.log(" migration <name> [--path <path>] Create a new migration file (shorthand)");
48
+ console.log(" schema create <name> [--path <path>] Create a new schema file");
49
+ console.log(" schema <name> [--path <path>] Create a new schema file (shorthand)");
50
+ break;
51
+ }
52
+ }));
53
+ //#endregion
54
+ export default require_cli();
55
+ export {};
56
+
57
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { createMigration } from \"./cli/commands/migration\";\nimport { createSchema } from \"./cli/commands/schema\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\nconst subCommand = args[1];\n\nfunction getFlag(flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index !== -1 && args[index + 1]) {\n return args[index + 1];\n }\n return undefined;\n}\n\nfunction getName(): string | undefined {\n return getFlag(\"--name\") ?? args[2];\n}\n\nswitch (command) {\n case \"migration\": {\n const action = subCommand === \"create\" ? \"create\" : \"create\";\n if (action === \"create\") {\n const name = subCommand === \"create\" ? getName() : subCommand;\n if (!name) {\n console.log(\"Usage: @hedystia/db migration create <name> [--path <path>]\");\n console.log(\" @hedystia/db migration <name> [--path <path>]\");\n process.exit(1);\n }\n createMigration(name, getFlag(\"--path\"));\n }\n break;\n }\n case \"schema\": {\n const action = subCommand === \"create\" ? \"create\" : \"create\";\n if (action === \"create\") {\n const name = subCommand === \"create\" ? getName() : subCommand;\n if (!name) {\n console.log(\"Usage: @hedystia/db schema create <name> [--path <path>]\");\n console.log(\" @hedystia/db schema <name> [--path <path>]\");\n process.exit(1);\n }\n createSchema(name, getFlag(\"--path\"));\n }\n break;\n }\n default: {\n console.log(\"@hedystia/db CLI\");\n console.log(\"\");\n console.log(\"Commands:\");\n console.log(\" migration create <name> [--path <path>] Create a new migration file\");\n console.log(\" migration <name> [--path <path>] Create a new migration file (shorthand)\");\n console.log(\" schema create <name> [--path <path>] Create a new schema file\");\n console.log(\" schema <name> [--path <path>] Create a new schema file (shorthand)\");\n break;\n }\n}\n"],"mappings":";;;;;;iBAC2D;cACN;CAErD,MAAM,OAAO,QAAQ,KAAK,MAAM,EAAE;CAClC,MAAM,UAAU,KAAK;CACrB,MAAM,aAAa,KAAK;CAExB,SAAS,QAAQ,MAAkC;EACjD,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,MAAI,UAAU,MAAM,KAAK,QAAQ,GAC/B,QAAO,KAAK,QAAQ;;CAKxB,SAAS,UAA8B;AACrC,SAAO,QAAQ,SAAS,IAAI,KAAK;;AAGnC,SAAQ,SAAR;EACE,KAAK;AAEH,QADe,eAAe,WAAW,WAAW,cACrC,UAAU;IACvB,MAAM,OAAO,eAAe,WAAW,SAAS,GAAG;AACnD,QAAI,CAAC,MAAM;AACT,aAAQ,IAAI,8DAA8D;AAC1E,aAAQ,IAAI,uDAAuD;AACnE,aAAQ,KAAK,EAAE;;AAEjB,oBAAgB,MAAM,QAAQ,SAAS,CAAC;;AAE1C;EAEF,KAAK;AAEH,QADe,eAAe,WAAW,WAAW,cACrC,UAAU;IACvB,MAAM,OAAO,eAAe,WAAW,SAAS,GAAG;AACnD,QAAI,CAAC,MAAM;AACT,aAAQ,IAAI,2DAA2D;AACvE,aAAQ,IAAI,oDAAoD;AAChE,aAAQ,KAAK,EAAE;;AAEjB,iBAAa,MAAM,QAAQ,SAAS,CAAC;;AAEvC;EAEF;AACE,WAAQ,IAAI,mBAAmB;AAC/B,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,YAAY;AACxB,WAAQ,IAAI,yEAAyE;AACrF,WAAQ,IAAI,qFAAqF;AACjG,WAAQ,IAAI,sEAAsE;AAClF,WAAQ,IAAI,kFAAkF;AAC9F"}
@@ -0,0 +1,16 @@
1
+ //#region src/constants.ts
2
+ const MIGRATIONS_TABLE = "__hedystia_migrations";
3
+ const DEFAULT_CACHE_TTL = 6e4;
4
+ const DEFAULT_CACHE_MAX_TTL = 3e5;
5
+ const DEFAULT_CACHE_MAX_ENTRIES = 1e4;
6
+ const DEFAULT_MIGRATIONS_PATH = "src/database/migrations";
7
+ const DEFAULT_SCHEMAS_PATH = "src/database/schemas";
8
+ //#endregion
9
+ exports.DEFAULT_CACHE_MAX_ENTRIES = DEFAULT_CACHE_MAX_ENTRIES;
10
+ exports.DEFAULT_CACHE_MAX_TTL = DEFAULT_CACHE_MAX_TTL;
11
+ exports.DEFAULT_CACHE_TTL = DEFAULT_CACHE_TTL;
12
+ exports.DEFAULT_MIGRATIONS_PATH = DEFAULT_MIGRATIONS_PATH;
13
+ exports.DEFAULT_SCHEMAS_PATH = DEFAULT_SCHEMAS_PATH;
14
+ exports.MIGRATIONS_TABLE = MIGRATIONS_TABLE;
15
+
16
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["export const MIGRATIONS_TABLE = \"__hedystia_migrations\";\n\nexport const DEFAULT_CACHE_TTL = 60_000;\nexport const DEFAULT_CACHE_MAX_TTL = 300_000;\nexport const DEFAULT_CACHE_MAX_ENTRIES = 10_000;\n\nexport const DEFAULT_SCHEMA_PATH = \"src/database\";\nexport const DEFAULT_MIGRATIONS_PATH = \"src/database/migrations\";\nexport const DEFAULT_SCHEMAS_PATH = \"src/database/schemas\";\n"],"mappings":";AAAA,MAAa,mBAAmB;AAEhC,MAAa,oBAAoB;AACjC,MAAa,wBAAwB;AACrC,MAAa,4BAA4B;AAGzC,MAAa,0BAA0B;AACvC,MAAa,uBAAuB"}
@@ -0,0 +1,16 @@
1
+ import { __esmMin } from "./_virtual/_rolldown/runtime.mjs";
2
+ //#region src/constants.ts
3
+ var MIGRATIONS_TABLE, DEFAULT_CACHE_TTL, DEFAULT_CACHE_MAX_TTL, DEFAULT_CACHE_MAX_ENTRIES, DEFAULT_MIGRATIONS_PATH, DEFAULT_SCHEMAS_PATH;
4
+ var init_constants = __esmMin((() => {
5
+ MIGRATIONS_TABLE = "__hedystia_migrations";
6
+ DEFAULT_CACHE_TTL = 6e4;
7
+ DEFAULT_CACHE_MAX_TTL = 3e5;
8
+ DEFAULT_CACHE_MAX_ENTRIES = 1e4;
9
+ DEFAULT_MIGRATIONS_PATH = "src/database/migrations";
10
+ DEFAULT_SCHEMAS_PATH = "src/database/schemas";
11
+ }));
12
+ //#endregion
13
+ init_constants();
14
+ export { DEFAULT_CACHE_MAX_ENTRIES, DEFAULT_CACHE_MAX_TTL, DEFAULT_CACHE_TTL, DEFAULT_MIGRATIONS_PATH, DEFAULT_SCHEMAS_PATH, MIGRATIONS_TABLE, init_constants };
15
+
16
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["export const MIGRATIONS_TABLE = \"__hedystia_migrations\";\n\nexport const DEFAULT_CACHE_TTL = 60_000;\nexport const DEFAULT_CACHE_MAX_TTL = 300_000;\nexport const DEFAULT_CACHE_MAX_ENTRIES = 10_000;\n\nexport const DEFAULT_SCHEMA_PATH = \"src/database\";\nexport const DEFAULT_MIGRATIONS_PATH = \"src/database/migrations\";\nexport const DEFAULT_SCHEMAS_PATH = \"src/database/schemas\";\n"],"mappings":";;;;AAAa,oBAAmB;AAEnB,qBAAoB;AACpB,yBAAwB;AACxB,6BAA4B;AAG5B,2BAA0B;AAC1B,wBAAuB"}
@@ -0,0 +1,158 @@
1
+ const require_constants = require("../constants.cjs");
2
+ const require_manager = require("../cache/manager.cjs");
3
+ const require_errors = require("../errors.cjs");
4
+ const require_index = require("../drivers/index.cjs");
5
+ const require_registry = require("../schema/registry.cjs");
6
+ const require_repository = require("./repository.cjs");
7
+ //#region src/core/database.ts
8
+ /**
9
+ * Create a database instance with typed repositories for each schema
10
+ * @param {DatabaseConfig} config - Database configuration
11
+ * @returns {DatabaseInstance<S>} Database instance with table repositories
12
+ */
13
+ function database(config) {
14
+ const registry = new require_registry.SchemaRegistry();
15
+ registry.register(config.schemas);
16
+ const connectionConfig = Array.isArray(config.connection) ? config.connection[0] : config.connection;
17
+ if (!connectionConfig) throw new require_errors.DatabaseError("Connection config is required");
18
+ const driver = require_index.createDriver(config.database, connectionConfig);
19
+ const cache = new require_manager.CacheManager(config.cache);
20
+ let initialized = false;
21
+ let initPromise = null;
22
+ const ensureInitialized = async () => {
23
+ if (initialized) return;
24
+ if (initPromise) return initPromise;
25
+ initPromise = doInit();
26
+ await initPromise;
27
+ initialized = true;
28
+ };
29
+ const doInit = async () => {
30
+ await driver.connect();
31
+ if (config.syncSchemas) {
32
+ const allMetadata = driver.getAllTableColumns ? await driver.getAllTableColumns() : null;
33
+ const syncPromises = Array.from(registry.getAllTables()).map(async ([, tableMeta]) => {
34
+ const existingCols = allMetadata ? allMetadata[tableMeta.name] : null;
35
+ if (!(allMetadata ? !!existingCols : await driver.tableExists(tableMeta.name))) await driver.createTable(tableMeta);
36
+ else {
37
+ const cols = existingCols || await driver.getTableColumns(tableMeta.name);
38
+ const existingNames = new Set(cols.map((c) => c.name));
39
+ const addColumnPromises = tableMeta.columns.filter((colMeta) => !existingNames.has(colMeta.name)).map((colMeta) => driver.addColumn(tableMeta.name, colMeta));
40
+ await Promise.all(addColumnPromises);
41
+ }
42
+ });
43
+ await Promise.all(syncPromises);
44
+ }
45
+ if (config.runMigrations && config.migrations && config.migrations.length > 0) await runMigrations(driver, registry, config.migrations);
46
+ };
47
+ const repos = /* @__PURE__ */ new Map();
48
+ for (const schema of config.schemas) {
49
+ const repo = new require_repository.TableRepository(schema.__name, driver, cache, registry);
50
+ repos.set(schema.__name, repo);
51
+ }
52
+ const instance = {
53
+ initialize: async () => {
54
+ await ensureInitialized();
55
+ },
56
+ close: async () => {
57
+ await driver.disconnect();
58
+ cache.clear();
59
+ initialized = false;
60
+ initPromise = null;
61
+ },
62
+ getDriver: () => driver,
63
+ getRegistry: () => registry,
64
+ getCache: () => cache,
65
+ raw: async (sql, params) => {
66
+ await ensureInitialized();
67
+ return driver.query(sql, params);
68
+ },
69
+ transaction: async (fn) => {
70
+ await ensureInitialized();
71
+ return driver.transaction(fn);
72
+ }
73
+ };
74
+ for (const schema of config.schemas) {
75
+ const repo = repos.get(schema.__name);
76
+ const proxy = new Proxy(repo, { get(target, prop, receiver) {
77
+ const original = Reflect.get(target, prop, receiver);
78
+ if (typeof original === "function") return async (...args) => {
79
+ await ensureInitialized();
80
+ return original.apply(target, args);
81
+ };
82
+ return original;
83
+ } });
84
+ instance[schema.__name] = proxy;
85
+ }
86
+ return instance;
87
+ }
88
+ async function runMigrations(driver, registry, migrations) {
89
+ const migrationsTableMeta = {
90
+ name: require_constants.MIGRATIONS_TABLE,
91
+ columns: [
92
+ {
93
+ name: "id",
94
+ type: "integer",
95
+ primaryKey: true,
96
+ autoIncrement: true,
97
+ notNull: true,
98
+ unique: true,
99
+ defaultValue: void 0
100
+ },
101
+ {
102
+ name: "name",
103
+ type: "varchar",
104
+ primaryKey: false,
105
+ autoIncrement: false,
106
+ notNull: true,
107
+ unique: true,
108
+ defaultValue: void 0,
109
+ length: 255
110
+ },
111
+ {
112
+ name: "executed_at",
113
+ type: "datetime",
114
+ primaryKey: false,
115
+ autoIncrement: false,
116
+ notNull: true,
117
+ unique: false,
118
+ defaultValue: void 0
119
+ }
120
+ ]
121
+ };
122
+ if (!await driver.tableExists("__hedystia_migrations")) await driver.createTable(migrationsTableMeta);
123
+ const executed = await driver.query(`SELECT name FROM \`${require_constants.MIGRATIONS_TABLE}\``);
124
+ const executedNames = new Set(executed.map((r) => r.name));
125
+ for (const migration of migrations) {
126
+ if (executedNames.has(migration.name)) continue;
127
+ await migration.up({
128
+ schema: {
129
+ createTable: async (tableDef) => {
130
+ const meta = registry.getTable(tableDef.__name);
131
+ if (meta) await driver.createTable(meta);
132
+ },
133
+ dropTable: async (name) => {
134
+ await driver.dropTable(name);
135
+ },
136
+ addColumn: async (table, _name, column) => {
137
+ await driver.addColumn(table, column);
138
+ },
139
+ dropColumn: async (table, name) => {
140
+ await driver.dropColumn(table, name);
141
+ },
142
+ renameColumn: async (table, oldName, newName) => {
143
+ await driver.renameColumn(table, oldName, newName);
144
+ },
145
+ addIndex: async () => {},
146
+ dropIndex: async () => {}
147
+ },
148
+ sql: async (query, params) => {
149
+ return driver.execute(query, params);
150
+ }
151
+ });
152
+ await driver.execute(`INSERT INTO \`${require_constants.MIGRATIONS_TABLE}\` (\`name\`, \`executed_at\`) VALUES (?, ?)`, [migration.name, /* @__PURE__ */ new Date()]);
153
+ }
154
+ }
155
+ //#endregion
156
+ exports.database = database;
157
+
158
+ //# sourceMappingURL=database.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.cjs","names":["SchemaRegistry","DatabaseError","createDriver","CacheManager","TableRepository","MIGRATIONS_TABLE"],"sources":["../../src/core/database.ts"],"sourcesContent":["import { CacheManager } from \"../cache\";\nimport { MIGRATIONS_TABLE } from \"../constants\";\nimport { createDriver } from \"../drivers\";\nimport { DatabaseError } from \"../errors\";\nimport { SchemaRegistry } from \"../schema\";\nimport type {\n AnyTableDef,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DeleteOptions,\n InferRow,\n MigrationDefinition,\n QueryOptions,\n RelationQueryMap,\n ResolveResult,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n} from \"../types\";\nimport { TableRepository } from \"./repository\";\n\ntype TypedTableRepository<S extends readonly AnyTableDef[], T extends AnyTableDef> = {\n find<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O>[]>;\n\n findMany<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O>[]>;\n\n findFirst<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O> | null>;\n\n insert(data: Partial<InferRow<T>> | Partial<InferRow<T>>[]): Promise<InferRow<T>>;\n insertMany(data: Partial<InferRow<T>>[]): Promise<InferRow<T>[]>;\n update(options: UpdateOptions<InferRow<T>>): Promise<InferRow<T>[]>;\n delete(options: DeleteOptions<InferRow<T>>): Promise<number>;\n count(options?: Pick<QueryOptions<InferRow<T>>, \"where\">): Promise<number>;\n exists(options: Pick<QueryOptions<InferRow<T>>, \"where\">): Promise<boolean>;\n upsert(options: {\n where: WhereClause<InferRow<T>>;\n create: Partial<InferRow<T>>;\n update: Partial<InferRow<T>>;\n }): Promise<InferRow<T>>;\n truncate(): Promise<void>;\n};\n\ntype ExtractRepos<S extends readonly AnyTableDef[]> = {\n [T in S[number] as T[\"__name\"]]: TypedTableRepository<S, T>;\n};\n\ntype DatabaseInstance<S extends readonly AnyTableDef[]> = ExtractRepos<S> & {\n /**\n * Initialize the database connection, create tables and run migrations\n * @returns {Promise<void>}\n */\n initialize(): Promise<void>;\n /**\n * Close the database connection\n * @returns {Promise<void>}\n */\n close(): Promise<void>;\n /**\n * Get the underlying database driver\n * @returns {DatabaseDriver} The database driver\n */\n getDriver(): DatabaseDriver;\n /**\n * Get the schema registry\n * @returns {SchemaRegistry} The schema registry\n */\n getRegistry(): SchemaRegistry;\n /**\n * Get the cache manager\n * @returns {CacheManager} The cache manager\n */\n getCache(): CacheManager;\n /**\n * Execute a raw SQL query\n * @param {string} sql - SQL query\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any[]>} Query results\n */\n raw(sql: string, params?: unknown[]): Promise<any[]>;\n /**\n * Execute within a transaction\n * @param {() => Promise<T>} fn - Function to execute\n * @returns {Promise<T>} Result\n */\n transaction<T>(fn: () => Promise<T>): Promise<T>;\n};\n\n/**\n * Create a database instance with typed repositories for each schema\n * @param {DatabaseConfig} config - Database configuration\n * @returns {DatabaseInstance<S>} Database instance with table repositories\n */\nexport function database<S extends readonly AnyTableDef[]>(\n config: DatabaseConfig & { schemas: S },\n): DatabaseInstance<S> {\n const registry = new SchemaRegistry();\n registry.register(config.schemas);\n\n const connectionConfig = Array.isArray(config.connection)\n ? config.connection[0]\n : config.connection;\n\n if (!connectionConfig) {\n throw new DatabaseError(\"Connection config is required\");\n }\n\n const driver = createDriver(config.database, connectionConfig as ConnectionConfig);\n const cache = new CacheManager(config.cache);\n\n let initialized = false;\n let initPromise: Promise<void> | null = null;\n\n const ensureInitialized = async () => {\n if (initialized) {\n return;\n }\n if (initPromise) {\n return initPromise;\n }\n initPromise = doInit();\n await initPromise;\n initialized = true;\n };\n\n const doInit = async () => {\n await driver.connect();\n\n if (config.syncSchemas) {\n const allMetadata = driver.getAllTableColumns ? await driver.getAllTableColumns() : null;\n\n const syncPromises = Array.from(registry.getAllTables()).map(async ([, tableMeta]) => {\n const existingCols = allMetadata ? allMetadata[tableMeta.name] : null;\n const exists = allMetadata ? !!existingCols : await driver.tableExists(tableMeta.name);\n\n if (!exists) {\n await driver.createTable(tableMeta);\n } else {\n const cols = existingCols || (await driver.getTableColumns(tableMeta.name));\n const existingNames = new Set(cols.map((c) => c.name));\n const addColumnPromises = tableMeta.columns\n .filter((colMeta) => !existingNames.has(colMeta.name))\n .map((colMeta) => driver.addColumn(tableMeta.name, colMeta));\n await Promise.all(addColumnPromises);\n }\n });\n await Promise.all(syncPromises);\n }\n\n if (config.runMigrations && config.migrations && config.migrations.length > 0) {\n await runMigrations(driver, registry, config.migrations);\n }\n };\n\n const repos = new Map<string, TableRepository<any>>();\n for (const schema of config.schemas) {\n const repo = new TableRepository(schema.__name, driver, cache, registry);\n repos.set(schema.__name, repo);\n }\n\n const instance: any = {\n initialize: async () => {\n await ensureInitialized();\n },\n close: async () => {\n await driver.disconnect();\n cache.clear();\n initialized = false;\n initPromise = null;\n },\n getDriver: () => driver,\n getRegistry: () => registry,\n getCache: () => cache,\n raw: async (sql: string, params?: unknown[]) => {\n await ensureInitialized();\n return driver.query(sql, params);\n },\n transaction: async <T>(fn: () => Promise<T>) => {\n await ensureInitialized();\n return driver.transaction(fn);\n },\n };\n\n for (const schema of config.schemas) {\n const repo = repos.get(schema.__name)!;\n const proxy = new Proxy(repo, {\n get(target, prop, receiver) {\n const original = Reflect.get(target, prop, receiver);\n if (typeof original === \"function\") {\n return async (...args: any[]) => {\n await ensureInitialized();\n return original.apply(target, args);\n };\n }\n return original;\n },\n });\n instance[schema.__name] = proxy;\n }\n\n return instance as DatabaseInstance<S>;\n}\n\nasync function runMigrations(\n driver: DatabaseDriver,\n registry: SchemaRegistry,\n migrations: MigrationDefinition[],\n): Promise<void> {\n const migrationsTableMeta: TableMetadata = {\n name: MIGRATIONS_TABLE,\n columns: [\n {\n name: \"id\",\n type: \"integer\",\n primaryKey: true,\n autoIncrement: true,\n notNull: true,\n unique: true,\n defaultValue: undefined,\n },\n {\n name: \"name\",\n type: \"varchar\",\n primaryKey: false,\n autoIncrement: false,\n notNull: true,\n unique: true,\n defaultValue: undefined,\n length: 255,\n },\n {\n name: \"executed_at\",\n type: \"datetime\",\n primaryKey: false,\n autoIncrement: false,\n notNull: true,\n unique: false,\n defaultValue: undefined,\n },\n ],\n };\n\n const exists = await driver.tableExists(MIGRATIONS_TABLE);\n if (!exists) {\n await driver.createTable(migrationsTableMeta);\n }\n\n const executed = await driver.query(`SELECT name FROM \\`${MIGRATIONS_TABLE}\\``);\n const executedNames = new Set(executed.map((r: any) => r.name));\n\n for (const migration of migrations) {\n if (executedNames.has(migration.name)) {\n continue;\n }\n\n const ctx = {\n schema: {\n createTable: async (tableDef: AnyTableDef) => {\n const meta = registry.getTable(tableDef.__name);\n if (meta) {\n await driver.createTable(meta);\n }\n },\n dropTable: async (name: string) => {\n await driver.dropTable(name);\n },\n addColumn: async (table: string, _name: string, column: any) => {\n await driver.addColumn(table, column);\n },\n dropColumn: async (table: string, name: string) => {\n await driver.dropColumn(table, name);\n },\n renameColumn: async (table: string, oldName: string, newName: string) => {\n await driver.renameColumn(table, oldName, newName);\n },\n addIndex: async () => {},\n dropIndex: async () => {},\n },\n sql: async (query: string, params?: unknown[]) => {\n return driver.execute(query, params);\n },\n };\n\n await migration.up(ctx);\n\n await driver.execute(\n `INSERT INTO \\`${MIGRATIONS_TABLE}\\` (\\`name\\`, \\`executed_at\\`) VALUES (?, ?)`,\n [migration.name, new Date()],\n );\n }\n}\n"],"mappings":"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"}