@hedystia/db 2.0.5 → 2.0.7

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 (55) hide show
  1. package/dist/cache/index.mjs +12 -0
  2. package/dist/cache/index.mjs.map +1 -0
  3. package/dist/cache/manager.mjs +156 -153
  4. package/dist/cache/manager.mjs.map +1 -1
  5. package/dist/cache/memory-store.mjs +113 -111
  6. package/dist/cache/memory-store.mjs.map +1 -1
  7. package/dist/cli/commands/migrate.cjs +78 -0
  8. package/dist/cli/commands/migrate.cjs.map +1 -0
  9. package/dist/cli/commands/migrate.mjs +83 -0
  10. package/dist/cli/commands/migrate.mjs.map +1 -0
  11. package/dist/cli.cjs +36 -0
  12. package/dist/cli.cjs.map +1 -1
  13. package/dist/cli.mjs +37 -0
  14. package/dist/cli.mjs.map +1 -1
  15. package/dist/core/database.cjs +72 -29
  16. package/dist/core/database.cjs.map +1 -1
  17. package/dist/core/database.d.cts +65 -0
  18. package/dist/core/database.d.mts +65 -0
  19. package/dist/core/database.mjs +88 -34
  20. package/dist/core/database.mjs.map +1 -1
  21. package/dist/core/repository.mjs +414 -410
  22. package/dist/core/repository.mjs.map +1 -1
  23. package/dist/drivers/driver.mjs +9 -7
  24. package/dist/drivers/driver.mjs.map +1 -1
  25. package/dist/drivers/file.mjs +315 -312
  26. package/dist/drivers/file.mjs.map +1 -1
  27. package/dist/drivers/index.mjs +15 -6
  28. package/dist/drivers/index.mjs.map +1 -1
  29. package/dist/drivers/mysql.mjs +261 -256
  30. package/dist/drivers/mysql.mjs.map +1 -1
  31. package/dist/drivers/sql-compiler.mjs +4 -1
  32. package/dist/drivers/sql-compiler.mjs.map +1 -1
  33. package/dist/drivers/sqlite.cjs +12 -1
  34. package/dist/drivers/sqlite.cjs.map +1 -1
  35. package/dist/drivers/sqlite.mjs +258 -242
  36. package/dist/drivers/sqlite.mjs.map +1 -1
  37. package/dist/errors.mjs +48 -64
  38. package/dist/errors.mjs.map +1 -1
  39. package/dist/index.mjs +21 -9
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/schema/column.mjs +155 -157
  42. package/dist/schema/column.mjs.map +1 -1
  43. package/dist/schema/columns/index.mjs +103 -171
  44. package/dist/schema/columns/index.mjs.map +1 -1
  45. package/dist/schema/index.mjs +15 -0
  46. package/dist/schema/index.mjs.map +1 -0
  47. package/dist/schema/registry.mjs +122 -119
  48. package/dist/schema/registry.mjs.map +1 -1
  49. package/dist/schema/table.mjs +4 -1
  50. package/dist/schema/table.mjs.map +1 -1
  51. package/dist/sync/synchronizer.mjs +2 -1
  52. package/dist/sync/synchronizer.mjs.map +1 -1
  53. package/dist/types.d.cts +67 -6
  54. package/dist/types.d.mts +67 -6
  55. package/package.json +1 -1
@@ -0,0 +1,78 @@
1
+ require("../../constants.cjs");
2
+ const require_database = require("../../core/database.cjs");
3
+ let path = require("path");
4
+ let url = require("url");
5
+ //#region src/cli/commands/migrate.ts
6
+ async function loadModules(dir) {
7
+ const fs = await import("fs");
8
+ const path$1 = await import("path");
9
+ const absDir = (0, path.resolve)(dir);
10
+ if (!fs.existsSync(absDir)) return {};
11
+ const files = fs.readdirSync(absDir).filter((f) => /\.(ts|js|mjs|cjs)$/.test(f));
12
+ const modules = {};
13
+ for (const file of files) {
14
+ const mod = await import((0, url.pathToFileURL)(path$1.join(absDir, file)).href);
15
+ const key = path$1.basename(file, path$1.extname(file));
16
+ if (mod.default) modules[key] = mod.default;
17
+ for (const [k, v] of Object.entries(mod)) if (k !== "default") modules[k] = v;
18
+ }
19
+ return modules;
20
+ }
21
+ function parseConnection(connStr) {
22
+ if (connStr.endsWith(".db") || connStr.endsWith(".sqlite") || connStr.endsWith(".sqlite3")) return { filename: connStr };
23
+ try {
24
+ return JSON.parse(connStr);
25
+ } catch {
26
+ return { filename: connStr };
27
+ }
28
+ }
29
+ async function createDbInstance(options) {
30
+ const migrationsPath = options.migrationsPath ?? "src/database/migrations";
31
+ const schemasPath = options.schemasPath ?? "src/database/schemas";
32
+ const dbType = options.database ?? "sqlite";
33
+ const migrations = await loadModules(migrationsPath);
34
+ const db = require_database.database({
35
+ schemas: await loadModules(schemasPath),
36
+ migrations,
37
+ database: dbType,
38
+ connection: options.connection ? parseConnection(options.connection) : { filename: "./database.db" },
39
+ cache: false,
40
+ runMigrations: false
41
+ });
42
+ await db.initialize();
43
+ return db;
44
+ }
45
+ /**
46
+ * Run pending migrations
47
+ */
48
+ async function migrateUp(options) {
49
+ const db = await createDbInstance(options);
50
+ try {
51
+ await db.migrateUp();
52
+ console.log("Migrations applied successfully");
53
+ } finally {
54
+ await db.close();
55
+ }
56
+ }
57
+ /**
58
+ * Rollback migrations
59
+ */
60
+ async function migrateDown(options) {
61
+ const db = await createDbInstance(options);
62
+ try {
63
+ const steps = options.steps ?? 1;
64
+ const rolledBack = await db.migrateDown(steps);
65
+ if (rolledBack.length === 0) console.log("No migrations to rollback");
66
+ else {
67
+ for (const name of rolledBack) console.log(` Rolled back: ${name}`);
68
+ console.log(`Rolled back ${rolledBack.length} migration(s)`);
69
+ }
70
+ } finally {
71
+ await db.close();
72
+ }
73
+ }
74
+ //#endregion
75
+ exports.migrateDown = migrateDown;
76
+ exports.migrateUp = migrateUp;
77
+
78
+ //# sourceMappingURL=migrate.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.cjs","names":["path","database"],"sources":["../../../src/cli/commands/migrate.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { DEFAULT_MIGRATIONS_PATH, DEFAULT_SCHEMAS_PATH } from \"../../constants\";\nimport { database } from \"../../core/database\";\n\ninterface MigrateOptions {\n config?: string;\n migrationsPath?: string;\n schemasPath?: string;\n database?: string;\n connection?: string;\n steps?: number;\n}\n\nasync function loadModules(dir: string): Promise<Record<string, unknown>> {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const absDir = resolve(dir);\n if (!fs.existsSync(absDir)) {\n return {};\n }\n\n const files = fs.readdirSync(absDir).filter((f: string) => /\\.(ts|js|mjs|cjs)$/.test(f));\n const modules: Record<string, unknown> = {};\n\n for (const file of files) {\n const filePath = path.join(absDir, file);\n const fileUrl = pathToFileURL(filePath).href;\n const mod = await import(fileUrl);\n const key = path.basename(file, path.extname(file));\n if (mod.default) {\n modules[key] = mod.default;\n }\n for (const [k, v] of Object.entries(mod)) {\n if (k !== \"default\") {\n modules[k] = v;\n }\n }\n }\n\n return modules;\n}\n\nfunction parseConnection(connStr: string): Record<string, unknown> {\n if (connStr.endsWith(\".db\") || connStr.endsWith(\".sqlite\") || connStr.endsWith(\".sqlite3\")) {\n return { filename: connStr };\n }\n try {\n return JSON.parse(connStr);\n } catch {\n return { filename: connStr };\n }\n}\n\nasync function createDbInstance(options: MigrateOptions) {\n const migrationsPath = options.migrationsPath ?? DEFAULT_MIGRATIONS_PATH;\n const schemasPath = options.schemasPath ?? DEFAULT_SCHEMAS_PATH;\n const dbType = options.database ?? \"sqlite\";\n\n const migrations = await loadModules(migrationsPath);\n const schemas = await loadModules(schemasPath);\n\n const connection = options.connection\n ? parseConnection(options.connection)\n : { filename: \"./database.db\" };\n\n const db = database({\n schemas,\n migrations,\n database: dbType as any,\n connection: connection as any,\n cache: false,\n runMigrations: false,\n });\n\n await db.initialize();\n return db;\n}\n\n/**\n * Run pending migrations\n */\nexport async function migrateUp(options: MigrateOptions): Promise<void> {\n const db = await createDbInstance(options);\n try {\n await db.migrateUp();\n console.log(\"Migrations applied successfully\");\n } finally {\n await db.close();\n }\n}\n\n/**\n * Rollback migrations\n */\nexport async function migrateDown(options: MigrateOptions): Promise<void> {\n const db = await createDbInstance(options);\n try {\n const steps = options.steps ?? 1;\n const rolledBack = await db.migrateDown(steps);\n if (rolledBack.length === 0) {\n console.log(\"No migrations to rollback\");\n } else {\n for (const name of rolledBack) {\n console.log(` Rolled back: ${name}`);\n }\n console.log(`Rolled back ${rolledBack.length} migration(s)`);\n }\n } finally {\n await db.close();\n }\n}\n"],"mappings":";;;;;AAcA,eAAe,YAAY,KAA+C;CACxE,MAAM,KAAK,MAAM,OAAO;CACxB,MAAMA,SAAO,MAAM,OAAO;CAE1B,MAAM,UAAA,GAAA,KAAA,SAAiB,IAAI;AAC3B,KAAI,CAAC,GAAG,WAAW,OAAO,CACxB,QAAO,EAAE;CAGX,MAAM,QAAQ,GAAG,YAAY,OAAO,CAAC,QAAQ,MAAc,qBAAqB,KAAK,EAAE,CAAC;CACxF,MAAM,UAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,OAAO;EAGxB,MAAM,MAAM,MAAM,QAAA,GAAA,IAAA,eAFDA,OAAK,KAAK,QAAQ,KAAK,CACD,CAAC;EAExC,MAAM,MAAMA,OAAK,SAAS,MAAMA,OAAK,QAAQ,KAAK,CAAC;AACnD,MAAI,IAAI,QACN,SAAQ,OAAO,IAAI;AAErB,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,CACtC,KAAI,MAAM,UACR,SAAQ,KAAK;;AAKnB,QAAO;;AAGT,SAAS,gBAAgB,SAA0C;AACjE,KAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,SAAS,UAAU,IAAI,QAAQ,SAAS,WAAW,CACxF,QAAO,EAAE,UAAU,SAAS;AAE9B,KAAI;AACF,SAAO,KAAK,MAAM,QAAQ;SACpB;AACN,SAAO,EAAE,UAAU,SAAS;;;AAIhC,eAAe,iBAAiB,SAAyB;CACvD,MAAM,iBAAiB,QAAQ,kBAAA;CAC/B,MAAM,cAAc,QAAQ,eAAA;CAC5B,MAAM,SAAS,QAAQ,YAAY;CAEnC,MAAM,aAAa,MAAM,YAAY,eAAe;CAOpD,MAAM,KAAKC,iBAAAA,SAAS;EAClB,SAPc,MAAM,YAAY,YAAY;EAQ5C;EACA,UAAU;EACV,YARiB,QAAQ,aACvB,gBAAgB,QAAQ,WAAW,GACnC,EAAE,UAAU,iBAAiB;EAO/B,OAAO;EACP,eAAe;EAChB,CAAC;AAEF,OAAM,GAAG,YAAY;AACrB,QAAO;;;;;AAMT,eAAsB,UAAU,SAAwC;CACtE,MAAM,KAAK,MAAM,iBAAiB,QAAQ;AAC1C,KAAI;AACF,QAAM,GAAG,WAAW;AACpB,UAAQ,IAAI,kCAAkC;WACtC;AACR,QAAM,GAAG,OAAO;;;;;;AAOpB,eAAsB,YAAY,SAAwC;CACxE,MAAM,KAAK,MAAM,iBAAiB,QAAQ;AAC1C,KAAI;EACF,MAAM,QAAQ,QAAQ,SAAS;EAC/B,MAAM,aAAa,MAAM,GAAG,YAAY,MAAM;AAC9C,MAAI,WAAW,WAAW,EACxB,SAAQ,IAAI,4BAA4B;OACnC;AACL,QAAK,MAAM,QAAQ,WACjB,SAAQ,IAAI,kBAAkB,OAAO;AAEvC,WAAQ,IAAI,eAAe,WAAW,OAAO,eAAe;;WAEtD;AACR,QAAM,GAAG,OAAO"}
@@ -0,0 +1,83 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.mjs";
2
+ import { init_constants } from "../../constants.mjs";
3
+ import { database, init_database } from "../../core/database.mjs";
4
+ import { resolve } from "path";
5
+ import { pathToFileURL } from "url";
6
+ //#region src/cli/commands/migrate.ts
7
+ async function loadModules(dir) {
8
+ const fs = await import("fs");
9
+ const path = await import("path");
10
+ const absDir = resolve(dir);
11
+ if (!fs.existsSync(absDir)) return {};
12
+ const files = fs.readdirSync(absDir).filter((f) => /\.(ts|js|mjs|cjs)$/.test(f));
13
+ const modules = {};
14
+ for (const file of files) {
15
+ const mod = await import(pathToFileURL(path.join(absDir, file)).href);
16
+ const key = path.basename(file, path.extname(file));
17
+ if (mod.default) modules[key] = mod.default;
18
+ for (const [k, v] of Object.entries(mod)) if (k !== "default") modules[k] = v;
19
+ }
20
+ return modules;
21
+ }
22
+ function parseConnection(connStr) {
23
+ if (connStr.endsWith(".db") || connStr.endsWith(".sqlite") || connStr.endsWith(".sqlite3")) return { filename: connStr };
24
+ try {
25
+ return JSON.parse(connStr);
26
+ } catch {
27
+ return { filename: connStr };
28
+ }
29
+ }
30
+ async function createDbInstance(options) {
31
+ const migrationsPath = options.migrationsPath ?? "src/database/migrations";
32
+ const schemasPath = options.schemasPath ?? "src/database/schemas";
33
+ const dbType = options.database ?? "sqlite";
34
+ const migrations = await loadModules(migrationsPath);
35
+ const db = database({
36
+ schemas: await loadModules(schemasPath),
37
+ migrations,
38
+ database: dbType,
39
+ connection: options.connection ? parseConnection(options.connection) : { filename: "./database.db" },
40
+ cache: false,
41
+ runMigrations: false
42
+ });
43
+ await db.initialize();
44
+ return db;
45
+ }
46
+ /**
47
+ * Run pending migrations
48
+ */
49
+ async function migrateUp(options) {
50
+ const db = await createDbInstance(options);
51
+ try {
52
+ await db.migrateUp();
53
+ console.log("Migrations applied successfully");
54
+ } finally {
55
+ await db.close();
56
+ }
57
+ }
58
+ /**
59
+ * Rollback migrations
60
+ */
61
+ async function migrateDown(options) {
62
+ const db = await createDbInstance(options);
63
+ try {
64
+ const steps = options.steps ?? 1;
65
+ const rolledBack = await db.migrateDown(steps);
66
+ if (rolledBack.length === 0) console.log("No migrations to rollback");
67
+ else {
68
+ for (const name of rolledBack) console.log(` Rolled back: ${name}`);
69
+ console.log(`Rolled back ${rolledBack.length} migration(s)`);
70
+ }
71
+ } finally {
72
+ await db.close();
73
+ }
74
+ }
75
+ var init_migrate = __esmMin((() => {
76
+ init_constants();
77
+ init_database();
78
+ }));
79
+ //#endregion
80
+ init_migrate();
81
+ export { init_migrate, migrateDown, migrateUp };
82
+
83
+ //# sourceMappingURL=migrate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.mjs","names":[],"sources":["../../../src/cli/commands/migrate.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { DEFAULT_MIGRATIONS_PATH, DEFAULT_SCHEMAS_PATH } from \"../../constants\";\nimport { database } from \"../../core/database\";\n\ninterface MigrateOptions {\n config?: string;\n migrationsPath?: string;\n schemasPath?: string;\n database?: string;\n connection?: string;\n steps?: number;\n}\n\nasync function loadModules(dir: string): Promise<Record<string, unknown>> {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const absDir = resolve(dir);\n if (!fs.existsSync(absDir)) {\n return {};\n }\n\n const files = fs.readdirSync(absDir).filter((f: string) => /\\.(ts|js|mjs|cjs)$/.test(f));\n const modules: Record<string, unknown> = {};\n\n for (const file of files) {\n const filePath = path.join(absDir, file);\n const fileUrl = pathToFileURL(filePath).href;\n const mod = await import(fileUrl);\n const key = path.basename(file, path.extname(file));\n if (mod.default) {\n modules[key] = mod.default;\n }\n for (const [k, v] of Object.entries(mod)) {\n if (k !== \"default\") {\n modules[k] = v;\n }\n }\n }\n\n return modules;\n}\n\nfunction parseConnection(connStr: string): Record<string, unknown> {\n if (connStr.endsWith(\".db\") || connStr.endsWith(\".sqlite\") || connStr.endsWith(\".sqlite3\")) {\n return { filename: connStr };\n }\n try {\n return JSON.parse(connStr);\n } catch {\n return { filename: connStr };\n }\n}\n\nasync function createDbInstance(options: MigrateOptions) {\n const migrationsPath = options.migrationsPath ?? DEFAULT_MIGRATIONS_PATH;\n const schemasPath = options.schemasPath ?? DEFAULT_SCHEMAS_PATH;\n const dbType = options.database ?? \"sqlite\";\n\n const migrations = await loadModules(migrationsPath);\n const schemas = await loadModules(schemasPath);\n\n const connection = options.connection\n ? parseConnection(options.connection)\n : { filename: \"./database.db\" };\n\n const db = database({\n schemas,\n migrations,\n database: dbType as any,\n connection: connection as any,\n cache: false,\n runMigrations: false,\n });\n\n await db.initialize();\n return db;\n}\n\n/**\n * Run pending migrations\n */\nexport async function migrateUp(options: MigrateOptions): Promise<void> {\n const db = await createDbInstance(options);\n try {\n await db.migrateUp();\n console.log(\"Migrations applied successfully\");\n } finally {\n await db.close();\n }\n}\n\n/**\n * Rollback migrations\n */\nexport async function migrateDown(options: MigrateOptions): Promise<void> {\n const db = await createDbInstance(options);\n try {\n const steps = options.steps ?? 1;\n const rolledBack = await db.migrateDown(steps);\n if (rolledBack.length === 0) {\n console.log(\"No migrations to rollback\");\n } else {\n for (const name of rolledBack) {\n console.log(` Rolled back: ${name}`);\n }\n console.log(`Rolled back ${rolledBack.length} migration(s)`);\n }\n } finally {\n await db.close();\n }\n}\n"],"mappings":";;;;;;AAcA,eAAe,YAAY,KAA+C;CACxE,MAAM,KAAK,MAAM,OAAO;CACxB,MAAM,OAAO,MAAM,OAAO;CAE1B,MAAM,SAAS,QAAQ,IAAI;AAC3B,KAAI,CAAC,GAAG,WAAW,OAAO,CACxB,QAAO,EAAE;CAGX,MAAM,QAAQ,GAAG,YAAY,OAAO,CAAC,QAAQ,MAAc,qBAAqB,KAAK,EAAE,CAAC;CACxF,MAAM,UAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,OAAO;EAGxB,MAAM,MAAM,MAAM,OADF,cADC,KAAK,KAAK,QAAQ,KAAK,CACD,CAAC;EAExC,MAAM,MAAM,KAAK,SAAS,MAAM,KAAK,QAAQ,KAAK,CAAC;AACnD,MAAI,IAAI,QACN,SAAQ,OAAO,IAAI;AAErB,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,CACtC,KAAI,MAAM,UACR,SAAQ,KAAK;;AAKnB,QAAO;;AAGT,SAAS,gBAAgB,SAA0C;AACjE,KAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,SAAS,UAAU,IAAI,QAAQ,SAAS,WAAW,CACxF,QAAO,EAAE,UAAU,SAAS;AAE9B,KAAI;AACF,SAAO,KAAK,MAAM,QAAQ;SACpB;AACN,SAAO,EAAE,UAAU,SAAS;;;AAIhC,eAAe,iBAAiB,SAAyB;CACvD,MAAM,iBAAiB,QAAQ,kBAAA;CAC/B,MAAM,cAAc,QAAQ,eAAA;CAC5B,MAAM,SAAS,QAAQ,YAAY;CAEnC,MAAM,aAAa,MAAM,YAAY,eAAe;CAOpD,MAAM,KAAK,SAAS;EAClB,SAPc,MAAM,YAAY,YAAY;EAQ5C;EACA,UAAU;EACV,YARiB,QAAQ,aACvB,gBAAgB,QAAQ,WAAW,GACnC,EAAE,UAAU,iBAAiB;EAO/B,OAAO;EACP,eAAe;EAChB,CAAC;AAEF,OAAM,GAAG,YAAY;AACrB,QAAO;;;;;AAMT,eAAsB,UAAU,SAAwC;CACtE,MAAM,KAAK,MAAM,iBAAiB,QAAQ;AAC1C,KAAI;AACF,QAAM,GAAG,WAAW;AACpB,UAAQ,IAAI,kCAAkC;WACtC;AACR,QAAM,GAAG,OAAO;;;;;;AAOpB,eAAsB,YAAY,SAAwC;CACxE,MAAM,KAAK,MAAM,iBAAiB,QAAQ;AAC1C,KAAI;EACF,MAAM,QAAQ,QAAQ,SAAS;EAC/B,MAAM,aAAa,MAAM,GAAG,YAAY,MAAM;AAC9C,MAAI,WAAW,WAAW,EACxB,SAAQ,IAAI,4BAA4B;OACnC;AACL,QAAK,MAAM,QAAQ,WACjB,SAAQ,IAAI,kBAAkB,OAAO;AAEvC,WAAQ,IAAI,eAAe,WAAW,OAAO,eAAe;;WAEtD;AACR,QAAM,GAAG,OAAO;;;;iBA5G4D;gBACjC"}
package/dist/cli.cjs CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bun
2
+ const require_migrate = require("./cli/commands/migrate.cjs");
2
3
  const require_migration = require("./cli/commands/migration.cjs");
3
4
  const require_schema = require("./cli/commands/schema.cjs");
4
5
  //#region src/cli.ts
@@ -12,6 +13,15 @@ function getFlag(flag) {
12
13
  function getName() {
13
14
  return getFlag("--name") ?? args[2];
14
15
  }
16
+ function getMigrateOptions() {
17
+ return {
18
+ migrationsPath: getFlag("--migrations"),
19
+ schemasPath: getFlag("--schemas"),
20
+ database: getFlag("--database"),
21
+ connection: getFlag("--connection"),
22
+ steps: getFlag("--steps") ? Number(getFlag("--steps")) : void 0
23
+ };
24
+ }
15
25
  switch (command) {
16
26
  case "migration":
17
27
  if ((subCommand === "create" ? "create" : "create") === "create") {
@@ -35,6 +45,30 @@ switch (command) {
35
45
  require_schema.createSchema(name, getFlag("--path"));
36
46
  }
37
47
  break;
48
+ case "migrate": {
49
+ const options = getMigrateOptions();
50
+ if (subCommand === "up") require_migrate.migrateUp(options).catch((err) => {
51
+ console.error("Migration failed:", err.message);
52
+ process.exit(1);
53
+ });
54
+ else if (subCommand === "down") require_migrate.migrateDown(options).catch((err) => {
55
+ console.error("Rollback failed:", err.message);
56
+ process.exit(1);
57
+ });
58
+ else {
59
+ console.log("Usage: @hedystia/db migrate up [options]");
60
+ console.log(" @hedystia/db migrate down [options]");
61
+ console.log("");
62
+ console.log("Options:");
63
+ console.log(" --migrations <path> Path to migrations directory");
64
+ console.log(" --schemas <path> Path to schemas directory");
65
+ console.log(" --database <type> Database type (sqlite, mysql, mariadb)");
66
+ console.log(" --connection <config> Connection string or JSON config");
67
+ console.log(" --steps <n> Number of migrations to rollback (down only, default: 1)");
68
+ process.exit(1);
69
+ }
70
+ break;
71
+ }
38
72
  default:
39
73
  console.log("@hedystia/db CLI");
40
74
  console.log("");
@@ -43,6 +77,8 @@ switch (command) {
43
77
  console.log(" migration <name> [--path <path>] Create a new migration file (shorthand)");
44
78
  console.log(" schema create <name> [--path <path>] Create a new schema file");
45
79
  console.log(" schema <name> [--path <path>] Create a new schema file (shorthand)");
80
+ console.log(" migrate up [options] Run pending migrations");
81
+ console.log(" migrate down [options] Rollback migrations");
46
82
  break;
47
83
  }
48
84
  //#endregion
package/dist/cli.cjs.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { migrateDown, migrateUp } from \"./cli/commands/migrate\";\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\nfunction getMigrateOptions() {\n return {\n migrationsPath: getFlag(\"--migrations\"),\n schemasPath: getFlag(\"--schemas\"),\n database: getFlag(\"--database\"),\n connection: getFlag(\"--connection\"),\n steps: getFlag(\"--steps\") ? Number(getFlag(\"--steps\")) : undefined,\n };\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 case \"migrate\": {\n const options = getMigrateOptions();\n if (subCommand === \"up\") {\n migrateUp(options).catch((err) => {\n console.error(\"Migration failed:\", err.message);\n process.exit(1);\n });\n } else if (subCommand === \"down\") {\n migrateDown(options).catch((err) => {\n console.error(\"Rollback failed:\", err.message);\n process.exit(1);\n });\n } else {\n console.log(\"Usage: @hedystia/db migrate up [options]\");\n console.log(\" @hedystia/db migrate down [options]\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" --migrations <path> Path to migrations directory\");\n console.log(\" --schemas <path> Path to schemas directory\");\n console.log(\" --database <type> Database type (sqlite, mysql, mariadb)\");\n console.log(\" --connection <config> Connection string or JSON config\");\n console.log(\n \" --steps <n> Number of migrations to rollback (down only, default: 1)\",\n );\n process.exit(1);\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(\n \" migration <name> [--path <path>] Create a new migration file (shorthand)\",\n );\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 console.log(\" migrate up [options] Run pending migrations\");\n console.log(\" migrate down [options] Rollback migrations\");\n break;\n }\n}\n"],"mappings":";;;;;AAKA,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,SAAS,oBAAoB;AAC3B,QAAO;EACL,gBAAgB,QAAQ,eAAe;EACvC,aAAa,QAAQ,YAAY;EACjC,UAAU,QAAQ,aAAa;EAC/B,YAAY,QAAQ,eAAe;EACnC,OAAO,QAAQ,UAAU,GAAG,OAAO,QAAQ,UAAU,CAAC,GAAG,KAAA;EAC1D;;AAGH,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,KAAK,WAAW;EACd,MAAM,UAAU,mBAAmB;AACnC,MAAI,eAAe,KACjB,iBAAA,UAAU,QAAQ,CAAC,OAAO,QAAQ;AAChC,WAAQ,MAAM,qBAAqB,IAAI,QAAQ;AAC/C,WAAQ,KAAK,EAAE;IACf;WACO,eAAe,OACxB,iBAAA,YAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,WAAQ,MAAM,oBAAoB,IAAI,QAAQ;AAC9C,WAAQ,KAAK,EAAE;IACf;OACG;AACL,WAAQ,IAAI,2CAA2C;AACvD,WAAQ,IAAI,6CAA6C;AACzD,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,WAAW;AACvB,WAAQ,IAAI,wDAAwD;AACpE,WAAQ,IAAI,qDAAqD;AACjE,WAAQ,IAAI,kEAAkE;AAC9E,WAAQ,IAAI,4DAA4D;AACxE,WAAQ,IACN,oFACD;AACD,WAAQ,KAAK,EAAE;;AAEjB;;CAEF;AACE,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,yEAAyE;AACrF,UAAQ,IACN,qFACD;AACD,UAAQ,IAAI,sEAAsE;AAClF,UAAQ,IAAI,kFAAkF;AAC9F,UAAQ,IAAI,oEAAoE;AAChF,UAAQ,IAAI,iEAAiE;AAC7E"}
package/dist/cli.mjs CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env bun
2
2
  import { __commonJSMin } from "./_virtual/_rolldown/runtime.mjs";
3
+ import { init_migrate, migrateDown, migrateUp } from "./cli/commands/migrate.mjs";
3
4
  import { createMigration, init_migration } from "./cli/commands/migration.mjs";
4
5
  import { createSchema, init_schema } from "./cli/commands/schema.mjs";
5
6
  //#region src/cli.ts
6
7
  var require_cli = /* @__PURE__ */ __commonJSMin((() => {
8
+ init_migrate();
7
9
  init_migration();
8
10
  init_schema();
9
11
  const args = process.argv.slice(2);
@@ -16,6 +18,15 @@ var require_cli = /* @__PURE__ */ __commonJSMin((() => {
16
18
  function getName() {
17
19
  return getFlag("--name") ?? args[2];
18
20
  }
21
+ function getMigrateOptions() {
22
+ return {
23
+ migrationsPath: getFlag("--migrations"),
24
+ schemasPath: getFlag("--schemas"),
25
+ database: getFlag("--database"),
26
+ connection: getFlag("--connection"),
27
+ steps: getFlag("--steps") ? Number(getFlag("--steps")) : void 0
28
+ };
29
+ }
19
30
  switch (command) {
20
31
  case "migration":
21
32
  if ((subCommand === "create" ? "create" : "create") === "create") {
@@ -39,6 +50,30 @@ var require_cli = /* @__PURE__ */ __commonJSMin((() => {
39
50
  createSchema(name, getFlag("--path"));
40
51
  }
41
52
  break;
53
+ case "migrate": {
54
+ const options = getMigrateOptions();
55
+ if (subCommand === "up") migrateUp(options).catch((err) => {
56
+ console.error("Migration failed:", err.message);
57
+ process.exit(1);
58
+ });
59
+ else if (subCommand === "down") migrateDown(options).catch((err) => {
60
+ console.error("Rollback failed:", err.message);
61
+ process.exit(1);
62
+ });
63
+ else {
64
+ console.log("Usage: @hedystia/db migrate up [options]");
65
+ console.log(" @hedystia/db migrate down [options]");
66
+ console.log("");
67
+ console.log("Options:");
68
+ console.log(" --migrations <path> Path to migrations directory");
69
+ console.log(" --schemas <path> Path to schemas directory");
70
+ console.log(" --database <type> Database type (sqlite, mysql, mariadb)");
71
+ console.log(" --connection <config> Connection string or JSON config");
72
+ console.log(" --steps <n> Number of migrations to rollback (down only, default: 1)");
73
+ process.exit(1);
74
+ }
75
+ break;
76
+ }
42
77
  default:
43
78
  console.log("@hedystia/db CLI");
44
79
  console.log("");
@@ -47,6 +82,8 @@ var require_cli = /* @__PURE__ */ __commonJSMin((() => {
47
82
  console.log(" migration <name> [--path <path>] Create a new migration file (shorthand)");
48
83
  console.log(" schema create <name> [--path <path>] Create a new schema file");
49
84
  console.log(" schema <name> [--path <path>] Create a new schema file (shorthand)");
85
+ console.log(" migrate up [options] Run pending migrations");
86
+ console.log(" migrate down [options] Rollback migrations");
50
87
  break;
51
88
  }
52
89
  }));
package/dist/cli.mjs.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { migrateDown, migrateUp } from \"./cli/commands/migrate\";\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\nfunction getMigrateOptions() {\n return {\n migrationsPath: getFlag(\"--migrations\"),\n schemasPath: getFlag(\"--schemas\"),\n database: getFlag(\"--database\"),\n connection: getFlag(\"--connection\"),\n steps: getFlag(\"--steps\") ? Number(getFlag(\"--steps\")) : undefined,\n };\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 case \"migrate\": {\n const options = getMigrateOptions();\n if (subCommand === \"up\") {\n migrateUp(options).catch((err) => {\n console.error(\"Migration failed:\", err.message);\n process.exit(1);\n });\n } else if (subCommand === \"down\") {\n migrateDown(options).catch((err) => {\n console.error(\"Rollback failed:\", err.message);\n process.exit(1);\n });\n } else {\n console.log(\"Usage: @hedystia/db migrate up [options]\");\n console.log(\" @hedystia/db migrate down [options]\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" --migrations <path> Path to migrations directory\");\n console.log(\" --schemas <path> Path to schemas directory\");\n console.log(\" --database <type> Database type (sqlite, mysql, mariadb)\");\n console.log(\" --connection <config> Connection string or JSON config\");\n console.log(\n \" --steps <n> Number of migrations to rollback (down only, default: 1)\",\n );\n process.exit(1);\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(\n \" migration <name> [--path <path>] Create a new migration file (shorthand)\",\n );\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 console.log(\" migrate up [options] Run pending migrations\");\n console.log(\" migrate down [options] Rollback migrations\");\n break;\n }\n}\n"],"mappings":";;;;;;;eACgE;iBACL;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;;CAGnC,SAAS,oBAAoB;AAC3B,SAAO;GACL,gBAAgB,QAAQ,eAAe;GACvC,aAAa,QAAQ,YAAY;GACjC,UAAU,QAAQ,aAAa;GAC/B,YAAY,QAAQ,eAAe;GACnC,OAAO,QAAQ,UAAU,GAAG,OAAO,QAAQ,UAAU,CAAC,GAAG,KAAA;GAC1D;;AAGH,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,KAAK,WAAW;GACd,MAAM,UAAU,mBAAmB;AACnC,OAAI,eAAe,KACjB,WAAU,QAAQ,CAAC,OAAO,QAAQ;AAChC,YAAQ,MAAM,qBAAqB,IAAI,QAAQ;AAC/C,YAAQ,KAAK,EAAE;KACf;YACO,eAAe,OACxB,aAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,YAAQ,MAAM,oBAAoB,IAAI,QAAQ;AAC9C,YAAQ,KAAK,EAAE;KACf;QACG;AACL,YAAQ,IAAI,2CAA2C;AACvD,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,GAAG;AACf,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,qDAAqD;AACjE,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,IACN,oFACD;AACD,YAAQ,KAAK,EAAE;;AAEjB;;EAEF;AACE,WAAQ,IAAI,mBAAmB;AAC/B,WAAQ,IAAI,GAAG;AACf,WAAQ,IAAI,YAAY;AACxB,WAAQ,IAAI,yEAAyE;AACrF,WAAQ,IACN,qFACD;AACD,WAAQ,IAAI,sEAAsE;AAClF,WAAQ,IAAI,kFAAkF;AAC9F,WAAQ,IAAI,oEAAoE;AAChF,WAAQ,IAAI,iEAAiE;AAC7E"}
@@ -22,7 +22,13 @@ function database(config) {
22
22
  const schemas = normalizeSchemas(config.schemas);
23
23
  const registry = new require_registry.SchemaRegistry();
24
24
  registry.register(schemas);
25
- const connectionConfig = Array.isArray(config.connection) ? config.connection[0] : config.connection;
25
+ const dbName = typeof config.database === "string" ? config.database : config.database.name;
26
+ let connectionConfig;
27
+ if (Array.isArray(config.connection)) if (dbName === "sqlite") connectionConfig = config.connection.find((c) => "filename" in c) ?? config.connection[0];
28
+ else if (dbName === "mysql" || dbName === "mariadb") connectionConfig = config.connection.find((c) => "host" in c) ?? config.connection[0];
29
+ else if (dbName === "file") connectionConfig = config.connection.find((c) => "directory" in c) ?? config.connection[0];
30
+ else connectionConfig = config.connection[0];
31
+ else connectionConfig = config.connection;
26
32
  if (!connectionConfig) throw new require_errors.DatabaseError("Connection config is required");
27
33
  const driver = require_index.createDriver(config.database, connectionConfig);
28
34
  const cache = new require_manager.CacheManager(config.cache);
@@ -81,6 +87,18 @@ function database(config) {
81
87
  transaction: async (fn) => {
82
88
  await ensureInitialized();
83
89
  return driver.transaction(fn);
90
+ },
91
+ migrateUp: async () => {
92
+ await ensureInitialized();
93
+ if (config.migrations) {
94
+ const migrations = normalizeMigrations(config.migrations);
95
+ if (migrations.length > 0) await runMigrations(driver, registry, migrations);
96
+ }
97
+ },
98
+ migrateDown: async (steps = 1) => {
99
+ await ensureInitialized();
100
+ if (config.migrations) return rollbackMigrations(driver, registry, normalizeMigrations(config.migrations), steps);
101
+ return [];
84
102
  }
85
103
  };
86
104
  for (const schema of schemas) {
@@ -97,8 +115,8 @@ function database(config) {
97
115
  }
98
116
  return instance;
99
117
  }
100
- async function runMigrations(driver, registry, migrations) {
101
- const migrationsTableMeta = {
118
+ function getMigrationsTableMeta() {
119
+ return {
102
120
  name: require_constants.MIGRATIONS_TABLE,
103
121
  columns: [
104
122
  {
@@ -131,39 +149,64 @@ async function runMigrations(driver, registry, migrations) {
131
149
  }
132
150
  ]
133
151
  };
134
- if (!await driver.tableExists("__hedystia_migrations")) await driver.createTable(migrationsTableMeta);
152
+ }
153
+ function createMigrationContext(driver, registry) {
154
+ return {
155
+ schema: {
156
+ createTable: async (tableDef) => {
157
+ const meta = registry.getTable(tableDef.__name);
158
+ if (meta) await driver.createTable(meta);
159
+ },
160
+ dropTable: async (name) => {
161
+ await driver.dropTable(name);
162
+ },
163
+ addColumn: async (table, _name, column) => {
164
+ await driver.addColumn(table, column);
165
+ },
166
+ dropColumn: async (table, name) => {
167
+ await driver.dropColumn(table, name);
168
+ },
169
+ renameColumn: async (table, oldName, newName) => {
170
+ await driver.renameColumn(table, oldName, newName);
171
+ },
172
+ addIndex: async () => {},
173
+ dropIndex: async () => {}
174
+ },
175
+ sql: async (query, params) => {
176
+ return driver.execute(query, params);
177
+ }
178
+ };
179
+ }
180
+ async function ensureMigrationsTable(driver) {
181
+ if (!await driver.tableExists("__hedystia_migrations")) await driver.createTable(getMigrationsTableMeta());
182
+ }
183
+ async function runMigrations(driver, registry, migrations) {
184
+ await ensureMigrationsTable(driver);
135
185
  const executed = await driver.query(`SELECT name FROM \`${require_constants.MIGRATIONS_TABLE}\``);
136
186
  const executedNames = new Set(executed.map((r) => r.name));
187
+ const ctx = createMigrationContext(driver, registry);
137
188
  for (const migration of migrations) {
138
189
  if (executedNames.has(migration.name)) continue;
139
- await migration.up({
140
- schema: {
141
- createTable: async (tableDef) => {
142
- const meta = registry.getTable(tableDef.__name);
143
- if (meta) await driver.createTable(meta);
144
- },
145
- dropTable: async (name) => {
146
- await driver.dropTable(name);
147
- },
148
- addColumn: async (table, _name, column) => {
149
- await driver.addColumn(table, column);
150
- },
151
- dropColumn: async (table, name) => {
152
- await driver.dropColumn(table, name);
153
- },
154
- renameColumn: async (table, oldName, newName) => {
155
- await driver.renameColumn(table, oldName, newName);
156
- },
157
- addIndex: async () => {},
158
- dropIndex: async () => {}
159
- },
160
- sql: async (query, params) => {
161
- return driver.execute(query, params);
162
- }
163
- });
190
+ await migration.up(ctx);
164
191
  await driver.execute(`INSERT INTO \`${require_constants.MIGRATIONS_TABLE}\` (\`name\`, \`executed_at\`) VALUES (?, ?)`, [migration.name, /* @__PURE__ */ new Date()]);
165
192
  }
166
193
  }
194
+ async function rollbackMigrations(driver, registry, migrations, steps = 1) {
195
+ await ensureMigrationsTable(driver);
196
+ const executedNames = (await driver.query(`SELECT name FROM \`${require_constants.MIGRATIONS_TABLE}\` ORDER BY id DESC`)).map((r) => r.name);
197
+ const ctx = createMigrationContext(driver, registry);
198
+ const migrationMap = new Map(migrations.map((m) => [m.name, m]));
199
+ const rolledBack = [];
200
+ const toRollback = executedNames.slice(0, steps);
201
+ for (const name of toRollback) {
202
+ const migration = migrationMap.get(name);
203
+ if (!migration) continue;
204
+ await migration.down(ctx);
205
+ await driver.execute(`DELETE FROM \`${require_constants.MIGRATIONS_TABLE}\` WHERE \`name\` = ?`, [name]);
206
+ rolledBack.push(name);
207
+ }
208
+ return rolledBack;
209
+ }
167
210
  //#endregion
168
211
  exports.database = database;
169
212
 
@@ -1 +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 InferSchemas,\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> = S extends readonly AnyTableDef[]\n ? { [T in S[number] as T[\"__name\"]]: TypedTableRepository<S, T> }\n : S extends Record<string, any>\n ? {\n [K in keyof S as S[K] extends AnyTableDef ? K : never]: TypedTableRepository<\n InferSchemas<S>,\n Extract<S[K], AnyTableDef>\n >;\n }\n : never;\n\ntype DatabaseInstance<S> = 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 */\nfunction normalizeMigrations(\n migrations: MigrationDefinition[] | Record<string, unknown>,\n): MigrationDefinition[] {\n if (Array.isArray(migrations)) {\n return migrations;\n }\n return Object.values(migrations).filter(\n (v): v is MigrationDefinition =>\n v != null && typeof v === \"object\" && \"name\" in v && \"up\" in v && \"down\" in v,\n );\n}\n\nfunction normalizeSchemas<S extends readonly AnyTableDef[]>(schemas: any): S {\n if (Array.isArray(schemas)) {\n return schemas as any as S;\n }\n return Object.values(schemas).filter(\n (v): v is AnyTableDef => v != null && typeof v === \"object\" && (v as any).__table === true,\n ) as any;\n}\n\nexport function database<const S extends readonly AnyTableDef[] | Record<string, any>>(\n config: DatabaseConfig & { schemas: S },\n): DatabaseInstance<S> {\n const schemas = normalizeSchemas(config.schemas) as any;\n const registry = new SchemaRegistry();\n registry.register(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) {\n const migrations = normalizeMigrations(config.migrations);\n if (migrations.length > 0) {\n await runMigrations(driver, registry, migrations);\n }\n }\n };\n\n const repos = new Map<string, TableRepository<any>>();\n for (const schema of schemas) {\n const repo = new TableRepository(schema.__name, driver, cache, registry, schema.__cache);\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 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 any 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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"}
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 InferSchemas,\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 /**\n * Find all rows matching the given options\n * @param options - Filter, sort, paginate, and eagerly load relations\n * @returns Array of matching rows\n */\n find<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O>[]>;\n\n /**\n * Find all rows matching the given options (alias for {@link find})\n * @param options - Filter, sort, paginate, and eagerly load relations\n * @returns Array of matching rows\n */\n findMany<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O>[]>;\n\n /**\n * Find the first row matching the given options\n * @param options - Filter, sort, and eagerly load relations\n * @returns The first matching row, or `null` if none found\n */\n findFirst<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(\n options?: O,\n ): Promise<ResolveResult<S, T, O> | null>;\n\n /**\n * Insert one or more rows into the table\n * @param data - Row data (or array of row data) to insert\n * @returns The inserted row\n */\n insert(data: Partial<InferRow<T>> | Partial<InferRow<T>>[]): Promise<InferRow<T>>;\n\n /**\n * Insert multiple rows into the table\n * @param data - Array of row data to insert\n * @returns Array of inserted rows\n */\n insertMany(data: Partial<InferRow<T>>[]): Promise<InferRow<T>[]>;\n\n /**\n * Update rows matching the where clause\n * @param options - Where clause and partial data to apply\n * @returns Array of updated rows\n */\n update(options: UpdateOptions<InferRow<T>>): Promise<InferRow<T>[]>;\n\n /**\n * Delete rows matching the where clause\n * @param options - Where clause to select rows for deletion\n * @returns Number of deleted rows\n */\n delete(options: DeleteOptions<InferRow<T>>): Promise<number>;\n\n /**\n * Count rows matching the where clause\n * @param options - Optional where clause to filter rows\n * @returns Number of matching rows\n */\n count(options?: Pick<QueryOptions<InferRow<T>>, \"where\">): Promise<number>;\n\n /**\n * Check whether at least one row matches the where clause\n * @param options - Where clause to check\n * @returns `true` if a matching row exists, `false` otherwise\n */\n exists(options: Pick<QueryOptions<InferRow<T>>, \"where\">): Promise<boolean>;\n\n /**\n * Insert a row if it doesn't exist, or update it if it does\n * @param options - Where clause to check, data to create, and data to update\n * @returns The created or updated row\n */\n upsert(options: {\n where: WhereClause<InferRow<T>>;\n create: Partial<InferRow<T>>;\n update: Partial<InferRow<T>>;\n }): Promise<InferRow<T>>;\n\n /**\n * Remove all rows from the table\n * @returns Resolves when the table has been truncated\n */\n truncate(): Promise<void>;\n};\n\ntype ExtractRepos<S> = S extends readonly AnyTableDef[]\n ? { [T in S[number] as T[\"__name\"]]: TypedTableRepository<S, T> }\n : S extends Record<string, any>\n ? {\n [K in keyof S as S[K] extends AnyTableDef ? K : never]: TypedTableRepository<\n InferSchemas<S>,\n Extract<S[K], AnyTableDef>\n >;\n }\n : never;\n\ntype DatabaseInstance<S> = 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 * Run pending migrations manually\n * @returns {Promise<void>}\n */\n migrateUp(): Promise<void>;\n /**\n * Rollback migrations\n * @param {number} [steps=1] - Number of migrations to rollback\n * @returns {Promise<string[]>} Names of rolled back migrations\n */\n migrateDown(steps?: number): Promise<string[]>;\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 */\nfunction normalizeMigrations(\n migrations: MigrationDefinition[] | Record<string, unknown>,\n): MigrationDefinition[] {\n if (Array.isArray(migrations)) {\n return migrations;\n }\n return Object.values(migrations).filter(\n (v): v is MigrationDefinition =>\n v != null && typeof v === \"object\" && \"name\" in v && \"up\" in v && \"down\" in v,\n );\n}\n\nfunction normalizeSchemas<S extends readonly AnyTableDef[]>(schemas: any): S {\n if (Array.isArray(schemas)) {\n return schemas as any as S;\n }\n return Object.values(schemas).filter(\n (v): v is AnyTableDef => v != null && typeof v === \"object\" && (v as any).__table === true,\n ) as any;\n}\n\nexport function database<const S extends readonly AnyTableDef[] | Record<string, any>>(\n config: DatabaseConfig & { schemas: S },\n): DatabaseInstance<S> {\n const schemas = normalizeSchemas(config.schemas) as any;\n const registry = new SchemaRegistry();\n registry.register(schemas);\n\n const dbName = typeof config.database === \"string\" ? config.database : config.database.name;\n\n let connectionConfig: ConnectionConfig | undefined;\n if (Array.isArray(config.connection)) {\n if (dbName === \"sqlite\") {\n connectionConfig = config.connection.find((c) => \"filename\" in c) ?? config.connection[0];\n } else if (dbName === \"mysql\" || dbName === \"mariadb\") {\n connectionConfig = config.connection.find((c) => \"host\" in c) ?? config.connection[0];\n } else if (dbName === \"file\") {\n connectionConfig = config.connection.find((c) => \"directory\" in c) ?? config.connection[0];\n } else {\n connectionConfig = config.connection[0];\n }\n } else {\n connectionConfig = config.connection;\n }\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) {\n const migrations = normalizeMigrations(config.migrations);\n if (migrations.length > 0) {\n await runMigrations(driver, registry, migrations);\n }\n }\n };\n\n const repos = new Map<string, TableRepository<any>>();\n for (const schema of schemas) {\n const repo = new TableRepository(schema.__name, driver, cache, registry, schema.__cache);\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 migrateUp: async () => {\n await ensureInitialized();\n if (config.migrations) {\n const migrations = normalizeMigrations(config.migrations);\n if (migrations.length > 0) {\n await runMigrations(driver, registry, migrations);\n }\n }\n },\n migrateDown: async (steps = 1) => {\n await ensureInitialized();\n if (config.migrations) {\n const migrations = normalizeMigrations(config.migrations);\n return rollbackMigrations(driver, registry, migrations, steps);\n }\n return [];\n },\n };\n\n for (const schema of 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 any as DatabaseInstance<S>;\n}\n\nfunction getMigrationsTableMeta(): TableMetadata {\n return {\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\nfunction createMigrationContext(\n driver: DatabaseDriver,\n registry: SchemaRegistry,\n): MigrationDefinition[\"up\"] extends (ctx: infer C) => any ? C : never {\n return {\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\nasync function ensureMigrationsTable(driver: DatabaseDriver): Promise<void> {\n const exists = await driver.tableExists(MIGRATIONS_TABLE);\n if (!exists) {\n await driver.createTable(getMigrationsTableMeta());\n }\n}\n\nasync function runMigrations(\n driver: DatabaseDriver,\n registry: SchemaRegistry,\n migrations: MigrationDefinition[],\n): Promise<void> {\n await ensureMigrationsTable(driver);\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 const ctx = createMigrationContext(driver, registry);\n\n for (const migration of migrations) {\n if (executedNames.has(migration.name)) {\n continue;\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\nasync function rollbackMigrations(\n driver: DatabaseDriver,\n registry: SchemaRegistry,\n migrations: MigrationDefinition[],\n steps = 1,\n): Promise<string[]> {\n await ensureMigrationsTable(driver);\n\n const executed = await driver.query(`SELECT name FROM \\`${MIGRATIONS_TABLE}\\` ORDER BY id DESC`);\n const executedNames = executed.map((r: any) => r.name as string);\n\n const ctx = createMigrationContext(driver, registry);\n const migrationMap = new Map(migrations.map((m) => [m.name, m]));\n const rolledBack: string[] = [];\n\n const toRollback = executedNames.slice(0, steps);\n\n for (const name of toRollback) {\n const migration = migrationMap.get(name);\n if (!migration) {\n continue;\n }\n\n await migration.down(ctx);\n\n await driver.execute(`DELETE FROM \\`${MIGRATIONS_TABLE}\\` WHERE \\`name\\` = ?`, [name]);\n rolledBack.push(name);\n }\n\n return rolledBack;\n}\n"],"mappings":"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"}