@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,74 @@
1
+ import { AnyTableDef, DatabaseConfig, DatabaseDriver, DeleteOptions, InferRow, QueryOptions, RelationQueryMap, ResolveResult, UpdateOptions, WhereClause } from "../types.cjs";
2
+ import { CacheManager } from "../cache/manager.cjs";
3
+ import { SchemaRegistry } from "../schema/registry.cjs";
4
+
5
+ //#region src/core/database.d.ts
6
+ type TypedTableRepository<S extends readonly AnyTableDef[], T extends AnyTableDef> = {
7
+ find<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O>[]>;
8
+ findMany<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O>[]>;
9
+ findFirst<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O> | null>;
10
+ insert(data: Partial<InferRow<T>> | Partial<InferRow<T>>[]): Promise<InferRow<T>>;
11
+ insertMany(data: Partial<InferRow<T>>[]): Promise<InferRow<T>[]>;
12
+ update(options: UpdateOptions<InferRow<T>>): Promise<InferRow<T>[]>;
13
+ delete(options: DeleteOptions<InferRow<T>>): Promise<number>;
14
+ count(options?: Pick<QueryOptions<InferRow<T>>, "where">): Promise<number>;
15
+ exists(options: Pick<QueryOptions<InferRow<T>>, "where">): Promise<boolean>;
16
+ upsert(options: {
17
+ where: WhereClause<InferRow<T>>;
18
+ create: Partial<InferRow<T>>;
19
+ update: Partial<InferRow<T>>;
20
+ }): Promise<InferRow<T>>;
21
+ truncate(): Promise<void>;
22
+ };
23
+ type ExtractRepos<S extends readonly AnyTableDef[]> = { [T in S[number] as T["__name"]]: TypedTableRepository<S, T> };
24
+ type DatabaseInstance<S extends readonly AnyTableDef[]> = ExtractRepos<S> & {
25
+ /**
26
+ * Initialize the database connection, create tables and run migrations
27
+ * @returns {Promise<void>}
28
+ */
29
+ initialize(): Promise<void>;
30
+ /**
31
+ * Close the database connection
32
+ * @returns {Promise<void>}
33
+ */
34
+ close(): Promise<void>;
35
+ /**
36
+ * Get the underlying database driver
37
+ * @returns {DatabaseDriver} The database driver
38
+ */
39
+ getDriver(): DatabaseDriver;
40
+ /**
41
+ * Get the schema registry
42
+ * @returns {SchemaRegistry} The schema registry
43
+ */
44
+ getRegistry(): SchemaRegistry;
45
+ /**
46
+ * Get the cache manager
47
+ * @returns {CacheManager} The cache manager
48
+ */
49
+ getCache(): CacheManager;
50
+ /**
51
+ * Execute a raw SQL query
52
+ * @param {string} sql - SQL query
53
+ * @param {unknown[]} [params] - Query parameters
54
+ * @returns {Promise<any[]>} Query results
55
+ */
56
+ raw(sql: string, params?: unknown[]): Promise<any[]>;
57
+ /**
58
+ * Execute within a transaction
59
+ * @param {() => Promise<T>} fn - Function to execute
60
+ * @returns {Promise<T>} Result
61
+ */
62
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
63
+ };
64
+ /**
65
+ * Create a database instance with typed repositories for each schema
66
+ * @param {DatabaseConfig} config - Database configuration
67
+ * @returns {DatabaseInstance<S>} Database instance with table repositories
68
+ */
69
+ declare function database<S extends readonly AnyTableDef[]>(config: DatabaseConfig & {
70
+ schemas: S;
71
+ }): DatabaseInstance<S>;
72
+ //#endregion
73
+ export { database };
74
+ //# sourceMappingURL=database.d.cts.map
@@ -0,0 +1,74 @@
1
+ import { AnyTableDef, DatabaseConfig, DatabaseDriver, DeleteOptions, InferRow, QueryOptions, RelationQueryMap, ResolveResult, UpdateOptions, WhereClause } from "../types.mjs";
2
+ import { CacheManager } from "../cache/manager.mjs";
3
+ import { SchemaRegistry } from "../schema/registry.mjs";
4
+
5
+ //#region src/core/database.d.ts
6
+ type TypedTableRepository<S extends readonly AnyTableDef[], T extends AnyTableDef> = {
7
+ find<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O>[]>;
8
+ findMany<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O>[]>;
9
+ findFirst<O extends QueryOptions<InferRow<T>, RelationQueryMap<S, T>> = {}>(options?: O): Promise<ResolveResult<S, T, O> | null>;
10
+ insert(data: Partial<InferRow<T>> | Partial<InferRow<T>>[]): Promise<InferRow<T>>;
11
+ insertMany(data: Partial<InferRow<T>>[]): Promise<InferRow<T>[]>;
12
+ update(options: UpdateOptions<InferRow<T>>): Promise<InferRow<T>[]>;
13
+ delete(options: DeleteOptions<InferRow<T>>): Promise<number>;
14
+ count(options?: Pick<QueryOptions<InferRow<T>>, "where">): Promise<number>;
15
+ exists(options: Pick<QueryOptions<InferRow<T>>, "where">): Promise<boolean>;
16
+ upsert(options: {
17
+ where: WhereClause<InferRow<T>>;
18
+ create: Partial<InferRow<T>>;
19
+ update: Partial<InferRow<T>>;
20
+ }): Promise<InferRow<T>>;
21
+ truncate(): Promise<void>;
22
+ };
23
+ type ExtractRepos<S extends readonly AnyTableDef[]> = { [T in S[number] as T["__name"]]: TypedTableRepository<S, T> };
24
+ type DatabaseInstance<S extends readonly AnyTableDef[]> = ExtractRepos<S> & {
25
+ /**
26
+ * Initialize the database connection, create tables and run migrations
27
+ * @returns {Promise<void>}
28
+ */
29
+ initialize(): Promise<void>;
30
+ /**
31
+ * Close the database connection
32
+ * @returns {Promise<void>}
33
+ */
34
+ close(): Promise<void>;
35
+ /**
36
+ * Get the underlying database driver
37
+ * @returns {DatabaseDriver} The database driver
38
+ */
39
+ getDriver(): DatabaseDriver;
40
+ /**
41
+ * Get the schema registry
42
+ * @returns {SchemaRegistry} The schema registry
43
+ */
44
+ getRegistry(): SchemaRegistry;
45
+ /**
46
+ * Get the cache manager
47
+ * @returns {CacheManager} The cache manager
48
+ */
49
+ getCache(): CacheManager;
50
+ /**
51
+ * Execute a raw SQL query
52
+ * @param {string} sql - SQL query
53
+ * @param {unknown[]} [params] - Query parameters
54
+ * @returns {Promise<any[]>} Query results
55
+ */
56
+ raw(sql: string, params?: unknown[]): Promise<any[]>;
57
+ /**
58
+ * Execute within a transaction
59
+ * @param {() => Promise<T>} fn - Function to execute
60
+ * @returns {Promise<T>} Result
61
+ */
62
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
63
+ };
64
+ /**
65
+ * Create a database instance with typed repositories for each schema
66
+ * @param {DatabaseConfig} config - Database configuration
67
+ * @returns {DatabaseInstance<S>} Database instance with table repositories
68
+ */
69
+ declare function database<S extends readonly AnyTableDef[]>(config: DatabaseConfig & {
70
+ schemas: S;
71
+ }): DatabaseInstance<S>;
72
+ //#endregion
73
+ export { database };
74
+ //# sourceMappingURL=database.d.mts.map
@@ -0,0 +1,159 @@
1
+ import { MIGRATIONS_TABLE, init_constants } from "../constants.mjs";
2
+ import { CacheManager } from "../cache/manager.mjs";
3
+ import { DatabaseError } from "../errors.mjs";
4
+ import { createDriver } from "../drivers/index.mjs";
5
+ import { SchemaRegistry } from "../schema/registry.mjs";
6
+ import { TableRepository } from "./repository.mjs";
7
+ //#region src/core/database.ts
8
+ init_constants();
9
+ /**
10
+ * Create a database instance with typed repositories for each schema
11
+ * @param {DatabaseConfig} config - Database configuration
12
+ * @returns {DatabaseInstance<S>} Database instance with table repositories
13
+ */
14
+ function database(config) {
15
+ const registry = new SchemaRegistry();
16
+ registry.register(config.schemas);
17
+ const connectionConfig = Array.isArray(config.connection) ? config.connection[0] : config.connection;
18
+ if (!connectionConfig) throw new DatabaseError("Connection config is required");
19
+ const driver = createDriver(config.database, connectionConfig);
20
+ const cache = new CacheManager(config.cache);
21
+ let initialized = false;
22
+ let initPromise = null;
23
+ const ensureInitialized = async () => {
24
+ if (initialized) return;
25
+ if (initPromise) return initPromise;
26
+ initPromise = doInit();
27
+ await initPromise;
28
+ initialized = true;
29
+ };
30
+ const doInit = async () => {
31
+ await driver.connect();
32
+ if (config.syncSchemas) {
33
+ const allMetadata = driver.getAllTableColumns ? await driver.getAllTableColumns() : null;
34
+ const syncPromises = Array.from(registry.getAllTables()).map(async ([, tableMeta]) => {
35
+ const existingCols = allMetadata ? allMetadata[tableMeta.name] : null;
36
+ if (!(allMetadata ? !!existingCols : await driver.tableExists(tableMeta.name))) await driver.createTable(tableMeta);
37
+ else {
38
+ const cols = existingCols || await driver.getTableColumns(tableMeta.name);
39
+ const existingNames = new Set(cols.map((c) => c.name));
40
+ const addColumnPromises = tableMeta.columns.filter((colMeta) => !existingNames.has(colMeta.name)).map((colMeta) => driver.addColumn(tableMeta.name, colMeta));
41
+ await Promise.all(addColumnPromises);
42
+ }
43
+ });
44
+ await Promise.all(syncPromises);
45
+ }
46
+ if (config.runMigrations && config.migrations && config.migrations.length > 0) await runMigrations(driver, registry, config.migrations);
47
+ };
48
+ const repos = /* @__PURE__ */ new Map();
49
+ for (const schema of config.schemas) {
50
+ const repo = new TableRepository(schema.__name, driver, cache, registry);
51
+ repos.set(schema.__name, repo);
52
+ }
53
+ const instance = {
54
+ initialize: async () => {
55
+ await ensureInitialized();
56
+ },
57
+ close: async () => {
58
+ await driver.disconnect();
59
+ cache.clear();
60
+ initialized = false;
61
+ initPromise = null;
62
+ },
63
+ getDriver: () => driver,
64
+ getRegistry: () => registry,
65
+ getCache: () => cache,
66
+ raw: async (sql, params) => {
67
+ await ensureInitialized();
68
+ return driver.query(sql, params);
69
+ },
70
+ transaction: async (fn) => {
71
+ await ensureInitialized();
72
+ return driver.transaction(fn);
73
+ }
74
+ };
75
+ for (const schema of config.schemas) {
76
+ const repo = repos.get(schema.__name);
77
+ const proxy = new Proxy(repo, { get(target, prop, receiver) {
78
+ const original = Reflect.get(target, prop, receiver);
79
+ if (typeof original === "function") return async (...args) => {
80
+ await ensureInitialized();
81
+ return original.apply(target, args);
82
+ };
83
+ return original;
84
+ } });
85
+ instance[schema.__name] = proxy;
86
+ }
87
+ return instance;
88
+ }
89
+ async function runMigrations(driver, registry, migrations) {
90
+ const migrationsTableMeta = {
91
+ name: MIGRATIONS_TABLE,
92
+ columns: [
93
+ {
94
+ name: "id",
95
+ type: "integer",
96
+ primaryKey: true,
97
+ autoIncrement: true,
98
+ notNull: true,
99
+ unique: true,
100
+ defaultValue: void 0
101
+ },
102
+ {
103
+ name: "name",
104
+ type: "varchar",
105
+ primaryKey: false,
106
+ autoIncrement: false,
107
+ notNull: true,
108
+ unique: true,
109
+ defaultValue: void 0,
110
+ length: 255
111
+ },
112
+ {
113
+ name: "executed_at",
114
+ type: "datetime",
115
+ primaryKey: false,
116
+ autoIncrement: false,
117
+ notNull: true,
118
+ unique: false,
119
+ defaultValue: void 0
120
+ }
121
+ ]
122
+ };
123
+ if (!await driver.tableExists("__hedystia_migrations")) await driver.createTable(migrationsTableMeta);
124
+ const executed = await driver.query(`SELECT name FROM \`${MIGRATIONS_TABLE}\``);
125
+ const executedNames = new Set(executed.map((r) => r.name));
126
+ for (const migration of migrations) {
127
+ if (executedNames.has(migration.name)) continue;
128
+ await migration.up({
129
+ schema: {
130
+ createTable: async (tableDef) => {
131
+ const meta = registry.getTable(tableDef.__name);
132
+ if (meta) await driver.createTable(meta);
133
+ },
134
+ dropTable: async (name) => {
135
+ await driver.dropTable(name);
136
+ },
137
+ addColumn: async (table, _name, column) => {
138
+ await driver.addColumn(table, column);
139
+ },
140
+ dropColumn: async (table, name) => {
141
+ await driver.dropColumn(table, name);
142
+ },
143
+ renameColumn: async (table, oldName, newName) => {
144
+ await driver.renameColumn(table, oldName, newName);
145
+ },
146
+ addIndex: async () => {},
147
+ dropIndex: async () => {}
148
+ },
149
+ sql: async (query, params) => {
150
+ return driver.execute(query, params);
151
+ }
152
+ });
153
+ await driver.execute(`INSERT INTO \`${MIGRATIONS_TABLE}\` (\`name\`, \`executed_at\`) VALUES (?, ?)`, [migration.name, /* @__PURE__ */ new Date()]);
154
+ }
155
+ }
156
+ //#endregion
157
+ export { database };
158
+
159
+ //# sourceMappingURL=database.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.mjs","names":[],"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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"}