@korajs/store 0.1.0

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 (43) hide show
  1. package/dist/adapters/better-sqlite3.cjs +166 -0
  2. package/dist/adapters/better-sqlite3.cjs.map +1 -0
  3. package/dist/adapters/better-sqlite3.d.cts +31 -0
  4. package/dist/adapters/better-sqlite3.d.ts +31 -0
  5. package/dist/adapters/better-sqlite3.js +117 -0
  6. package/dist/adapters/better-sqlite3.js.map +1 -0
  7. package/dist/adapters/indexeddb.cjs +550 -0
  8. package/dist/adapters/indexeddb.cjs.map +1 -0
  9. package/dist/adapters/indexeddb.d.cts +52 -0
  10. package/dist/adapters/indexeddb.d.ts +52 -0
  11. package/dist/adapters/indexeddb.js +205 -0
  12. package/dist/adapters/indexeddb.js.map +1 -0
  13. package/dist/adapters/sqlite-wasm-worker.cjs +215 -0
  14. package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -0
  15. package/dist/adapters/sqlite-wasm-worker.d.cts +2 -0
  16. package/dist/adapters/sqlite-wasm-worker.d.ts +2 -0
  17. package/dist/adapters/sqlite-wasm-worker.js +191 -0
  18. package/dist/adapters/sqlite-wasm-worker.js.map +1 -0
  19. package/dist/adapters/sqlite-wasm.cjs +354 -0
  20. package/dist/adapters/sqlite-wasm.cjs.map +1 -0
  21. package/dist/adapters/sqlite-wasm.d.cts +68 -0
  22. package/dist/adapters/sqlite-wasm.d.ts +68 -0
  23. package/dist/adapters/sqlite-wasm.js +14 -0
  24. package/dist/adapters/sqlite-wasm.js.map +1 -0
  25. package/dist/chunk-DXKLAQ6P.js +111 -0
  26. package/dist/chunk-DXKLAQ6P.js.map +1 -0
  27. package/dist/chunk-LAWV6CFH.js +62 -0
  28. package/dist/chunk-LAWV6CFH.js.map +1 -0
  29. package/dist/chunk-ZP5AXQ3Z.js +179 -0
  30. package/dist/chunk-ZP5AXQ3Z.js.map +1 -0
  31. package/dist/index.cjs +1288 -0
  32. package/dist/index.cjs.map +1 -0
  33. package/dist/index.d.cts +376 -0
  34. package/dist/index.d.ts +376 -0
  35. package/dist/index.js +1194 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/sqlite-wasm-channel-46AOWNPM.js +10 -0
  38. package/dist/sqlite-wasm-channel-46AOWNPM.js.map +1 -0
  39. package/dist/sqlite-wasm-channel-Lakjuk2E.d.cts +104 -0
  40. package/dist/sqlite-wasm-channel-Lakjuk2E.d.ts +104 -0
  41. package/dist/types-DF-KDSK1.d.cts +106 -0
  42. package/dist/types-DF-KDSK1.d.ts +106 -0
  43. package/package.json +95 -0
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/adapters/better-sqlite3.ts
31
+ var better_sqlite3_exports = {};
32
+ __export(better_sqlite3_exports, {
33
+ BetterSqlite3Adapter: () => BetterSqlite3Adapter
34
+ });
35
+ module.exports = __toCommonJS(better_sqlite3_exports);
36
+
37
+ // src/adapters/better-sqlite3-adapter.ts
38
+ var import_core2 = require("@korajs/core");
39
+
40
+ // src/errors.ts
41
+ var import_core = require("@korajs/core");
42
+ var AdapterError = class extends import_core.KoraError {
43
+ constructor(message, context) {
44
+ super(message, "ADAPTER_ERROR", context);
45
+ this.name = "AdapterError";
46
+ }
47
+ };
48
+ var StoreNotOpenError = class extends import_core.KoraError {
49
+ constructor() {
50
+ super("Store is not open. Call store.open() before performing operations.", "STORE_NOT_OPEN");
51
+ this.name = "StoreNotOpenError";
52
+ }
53
+ };
54
+
55
+ // src/adapters/better-sqlite3-adapter.ts
56
+ var BetterSqlite3Adapter = class {
57
+ /**
58
+ * @param path - Database file path, or ':memory:' for in-memory database
59
+ */
60
+ constructor(path = ":memory:") {
61
+ this.path = path;
62
+ }
63
+ path;
64
+ db = null;
65
+ async open(schema) {
66
+ const BetterSqlite3 = (await import("better-sqlite3")).default;
67
+ this.db = new BetterSqlite3(this.path);
68
+ this.db.pragma("journal_mode = WAL");
69
+ this.db.pragma("foreign_keys = ON");
70
+ const statements = (0, import_core2.generateFullDDL)(schema);
71
+ for (const sql of statements) {
72
+ this.db.exec(sql);
73
+ }
74
+ }
75
+ async close() {
76
+ if (this.db) {
77
+ this.db.close();
78
+ this.db = null;
79
+ }
80
+ }
81
+ async execute(sql, params) {
82
+ const db = this.getDb();
83
+ try {
84
+ db.prepare(sql).run(...params ?? []);
85
+ } catch (error) {
86
+ throw new AdapterError(`Execute failed: ${error.message}`, {
87
+ sql,
88
+ params
89
+ });
90
+ }
91
+ }
92
+ async query(sql, params) {
93
+ const db = this.getDb();
94
+ try {
95
+ return db.prepare(sql).all(...params ?? []);
96
+ } catch (error) {
97
+ throw new AdapterError(`Query failed: ${error.message}`, {
98
+ sql,
99
+ params
100
+ });
101
+ }
102
+ }
103
+ async transaction(fn) {
104
+ const db = this.getDb();
105
+ db.exec("BEGIN");
106
+ try {
107
+ const tx = {
108
+ execute: async (sql, params) => {
109
+ try {
110
+ db.prepare(sql).run(...params ?? []);
111
+ } catch (error) {
112
+ throw new AdapterError(`Transaction execute failed: ${error.message}`, {
113
+ sql,
114
+ params
115
+ });
116
+ }
117
+ },
118
+ query: async (sql, params) => {
119
+ try {
120
+ return db.prepare(sql).all(...params ?? []);
121
+ } catch (error) {
122
+ throw new AdapterError(`Transaction query failed: ${error.message}`, {
123
+ sql,
124
+ params
125
+ });
126
+ }
127
+ }
128
+ };
129
+ await fn(tx);
130
+ db.exec("COMMIT");
131
+ } catch (error) {
132
+ db.exec("ROLLBACK");
133
+ throw error;
134
+ }
135
+ }
136
+ async migrate(from, to, migration) {
137
+ const db = this.getDb();
138
+ db.exec("BEGIN");
139
+ try {
140
+ for (const sql of migration.statements) {
141
+ db.exec(sql);
142
+ }
143
+ db.exec("COMMIT");
144
+ } catch (error) {
145
+ db.exec("ROLLBACK");
146
+ throw new AdapterError(
147
+ `Migration from v${from} to v${to} failed: ${error.message}`,
148
+ {
149
+ from,
150
+ to
151
+ }
152
+ );
153
+ }
154
+ }
155
+ getDb() {
156
+ if (!this.db) {
157
+ throw new StoreNotOpenError();
158
+ }
159
+ return this.db;
160
+ }
161
+ };
162
+ // Annotate the CommonJS export names for ESM import in node:
163
+ 0 && (module.exports = {
164
+ BetterSqlite3Adapter
165
+ });
166
+ //# sourceMappingURL=better-sqlite3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/better-sqlite3.ts","../../src/adapters/better-sqlite3-adapter.ts","../../src/errors.ts"],"sourcesContent":["// Entry point for @korajs/store/better-sqlite3\nexport { BetterSqlite3Adapter } from './better-sqlite3-adapter'\n","import { generateFullDDL } from '@korajs/core'\nimport type { SchemaDefinition } from '@korajs/core'\nimport type Database from 'better-sqlite3'\nimport { AdapterError, StoreNotOpenError } from '../errors'\nimport type { MigrationPlan, StorageAdapter, Transaction } from '../types'\n\n/**\n * Storage adapter backed by better-sqlite3 for Node.js environments.\n * Used for testing and server-side usage.\n *\n * @example\n * ```typescript\n * import { BetterSqlite3Adapter } from '@korajs/store/better-sqlite3'\n *\n * const adapter = new BetterSqlite3Adapter(':memory:')\n * ```\n */\nexport class BetterSqlite3Adapter implements StorageAdapter {\n\tprivate db: Database.Database | null = null\n\n\t/**\n\t * @param path - Database file path, or ':memory:' for in-memory database\n\t */\n\tconstructor(private readonly path: string = ':memory:') {}\n\n\tasync open(schema: SchemaDefinition): Promise<void> {\n\t\t// Dynamic import so better-sqlite3 is only loaded when this adapter is used\n\t\tconst BetterSqlite3 = (await import('better-sqlite3')).default\n\t\tthis.db = new BetterSqlite3(this.path)\n\n\t\t// WAL mode for better concurrent read/write performance\n\t\tthis.db.pragma('journal_mode = WAL')\n\t\t// Enable foreign keys\n\t\tthis.db.pragma('foreign_keys = ON')\n\n\t\tconst statements = generateFullDDL(schema)\n\t\tfor (const sql of statements) {\n\t\t\tthis.db.exec(sql)\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.db) {\n\t\t\tthis.db.close()\n\t\t\tthis.db = null\n\t\t}\n\t}\n\n\tasync execute(sql: string, params?: unknown[]): Promise<void> {\n\t\tconst db = this.getDb()\n\t\ttry {\n\t\t\tdb.prepare(sql).run(...(params ?? []))\n\t\t} catch (error) {\n\t\t\tthrow new AdapterError(`Execute failed: ${(error as Error).message}`, {\n\t\t\t\tsql,\n\t\t\t\tparams,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync query<T>(sql: string, params?: unknown[]): Promise<T[]> {\n\t\tconst db = this.getDb()\n\t\ttry {\n\t\t\treturn db.prepare(sql).all(...(params ?? [])) as T[]\n\t\t} catch (error) {\n\t\t\tthrow new AdapterError(`Query failed: ${(error as Error).message}`, {\n\t\t\t\tsql,\n\t\t\t\tparams,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync transaction(fn: (tx: Transaction) => Promise<void>): Promise<void> {\n\t\tconst db = this.getDb()\n\n\t\t// better-sqlite3's transaction() is synchronous, but our interface is async.\n\t\t// We use BEGIN/COMMIT/ROLLBACK manually for the async callback.\n\t\tdb.exec('BEGIN')\n\t\ttry {\n\t\t\tconst tx: Transaction = {\n\t\t\t\texecute: async (sql: string, params?: unknown[]): Promise<void> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdb.prepare(sql).run(...(params ?? []))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new AdapterError(`Transaction execute failed: ${(error as Error).message}`, {\n\t\t\t\t\t\t\tsql,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tquery: async <T>(sql: string, params?: unknown[]): Promise<T[]> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn db.prepare(sql).all(...(params ?? [])) as T[]\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new AdapterError(`Transaction query failed: ${(error as Error).message}`, {\n\t\t\t\t\t\t\tsql,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tawait fn(tx)\n\t\t\tdb.exec('COMMIT')\n\t\t} catch (error) {\n\t\t\tdb.exec('ROLLBACK')\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync migrate(from: number, to: number, migration: MigrationPlan): Promise<void> {\n\t\tconst db = this.getDb()\n\t\tdb.exec('BEGIN')\n\t\ttry {\n\t\t\tfor (const sql of migration.statements) {\n\t\t\t\tdb.exec(sql)\n\t\t\t}\n\t\t\tdb.exec('COMMIT')\n\t\t} catch (error) {\n\t\t\tdb.exec('ROLLBACK')\n\t\t\tthrow new AdapterError(\n\t\t\t\t`Migration from v${from} to v${to} failed: ${(error as Error).message}`,\n\t\t\t\t{\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate getDb(): Database.Database {\n\t\tif (!this.db) {\n\t\t\tthrow new StoreNotOpenError()\n\t\t}\n\t\treturn this.db\n\t}\n}\n","import { KoraError } from '@korajs/core'\n\n/**\n * Thrown when a query is invalid (bad field names, invalid operators, etc.).\n */\nexport class QueryError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'QUERY_ERROR', context)\n\t\tthis.name = 'QueryError'\n\t}\n}\n\n/**\n * Thrown when a record is not found by ID (findById, update, delete on missing record).\n */\nexport class RecordNotFoundError extends KoraError {\n\tconstructor(collection: string, recordId: string) {\n\t\tsuper(`Record \"${recordId}\" not found in collection \"${collection}\"`, 'RECORD_NOT_FOUND', {\n\t\t\tcollection,\n\t\t\trecordId,\n\t\t})\n\t\tthis.name = 'RecordNotFoundError'\n\t}\n}\n\n/**\n * Thrown when a storage adapter operation fails.\n */\nexport class AdapterError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, 'ADAPTER_ERROR', context)\n\t\tthis.name = 'AdapterError'\n\t}\n}\n\n/**\n * Thrown when an operation is attempted on a store that has not been opened.\n */\nexport class StoreNotOpenError extends KoraError {\n\tconstructor() {\n\t\tsuper('Store is not open. Call store.open() before performing operations.', 'STORE_NOT_OPEN')\n\t\tthis.name = 'StoreNotOpenError'\n\t}\n}\n\n/**\n * Thrown when the Web Worker fails to initialize (WASM load failure, OPFS unavailable, etc.).\n */\nexport class WorkerInitError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(`Worker initialization failed: ${message}`, 'WORKER_INIT_ERROR', context)\n\t\tthis.name = 'WorkerInitError'\n\t}\n}\n\n/**\n * Thrown when the Web Worker does not respond within the configured timeout.\n */\nexport class WorkerTimeoutError extends KoraError {\n\tconstructor(operation: string, timeoutMs: number) {\n\t\tsuper(\n\t\t\t`Worker did not respond within ${timeoutMs}ms for operation \"${operation}\"`,\n\t\t\t'WORKER_TIMEOUT',\n\t\t\t{ operation, timeoutMs },\n\t\t)\n\t\tthis.name = 'WorkerTimeoutError'\n\t}\n}\n\n/**\n * Thrown when IndexedDB persistence operations fail (serialize/deserialize).\n */\nexport class PersistenceError extends KoraError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(`Persistence error: ${message}`, 'PERSISTENCE_ERROR', context)\n\t\tthis.name = 'PersistenceError'\n\t}\n}\n"],"mappings":"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","names":["import_core"]}
@@ -0,0 +1,31 @@
1
+ import { SchemaDefinition } from '@korajs/core';
2
+ import { S as StorageAdapter, T as Transaction, M as MigrationPlan } from '../types-DF-KDSK1.cjs';
3
+
4
+ /**
5
+ * Storage adapter backed by better-sqlite3 for Node.js environments.
6
+ * Used for testing and server-side usage.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { BetterSqlite3Adapter } from '@korajs/store/better-sqlite3'
11
+ *
12
+ * const adapter = new BetterSqlite3Adapter(':memory:')
13
+ * ```
14
+ */
15
+ declare class BetterSqlite3Adapter implements StorageAdapter {
16
+ private readonly path;
17
+ private db;
18
+ /**
19
+ * @param path - Database file path, or ':memory:' for in-memory database
20
+ */
21
+ constructor(path?: string);
22
+ open(schema: SchemaDefinition): Promise<void>;
23
+ close(): Promise<void>;
24
+ execute(sql: string, params?: unknown[]): Promise<void>;
25
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
26
+ transaction(fn: (tx: Transaction) => Promise<void>): Promise<void>;
27
+ migrate(from: number, to: number, migration: MigrationPlan): Promise<void>;
28
+ private getDb;
29
+ }
30
+
31
+ export { BetterSqlite3Adapter };
@@ -0,0 +1,31 @@
1
+ import { SchemaDefinition } from '@korajs/core';
2
+ import { S as StorageAdapter, T as Transaction, M as MigrationPlan } from '../types-DF-KDSK1.js';
3
+
4
+ /**
5
+ * Storage adapter backed by better-sqlite3 for Node.js environments.
6
+ * Used for testing and server-side usage.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { BetterSqlite3Adapter } from '@korajs/store/better-sqlite3'
11
+ *
12
+ * const adapter = new BetterSqlite3Adapter(':memory:')
13
+ * ```
14
+ */
15
+ declare class BetterSqlite3Adapter implements StorageAdapter {
16
+ private readonly path;
17
+ private db;
18
+ /**
19
+ * @param path - Database file path, or ':memory:' for in-memory database
20
+ */
21
+ constructor(path?: string);
22
+ open(schema: SchemaDefinition): Promise<void>;
23
+ close(): Promise<void>;
24
+ execute(sql: string, params?: unknown[]): Promise<void>;
25
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
26
+ transaction(fn: (tx: Transaction) => Promise<void>): Promise<void>;
27
+ migrate(from: number, to: number, migration: MigrationPlan): Promise<void>;
28
+ private getDb;
29
+ }
30
+
31
+ export { BetterSqlite3Adapter };
@@ -0,0 +1,117 @@
1
+ import {
2
+ AdapterError,
3
+ StoreNotOpenError
4
+ } from "../chunk-LAWV6CFH.js";
5
+
6
+ // src/adapters/better-sqlite3-adapter.ts
7
+ import { generateFullDDL } from "@korajs/core";
8
+ var BetterSqlite3Adapter = class {
9
+ /**
10
+ * @param path - Database file path, or ':memory:' for in-memory database
11
+ */
12
+ constructor(path = ":memory:") {
13
+ this.path = path;
14
+ }
15
+ path;
16
+ db = null;
17
+ async open(schema) {
18
+ const BetterSqlite3 = (await import("better-sqlite3")).default;
19
+ this.db = new BetterSqlite3(this.path);
20
+ this.db.pragma("journal_mode = WAL");
21
+ this.db.pragma("foreign_keys = ON");
22
+ const statements = generateFullDDL(schema);
23
+ for (const sql of statements) {
24
+ this.db.exec(sql);
25
+ }
26
+ }
27
+ async close() {
28
+ if (this.db) {
29
+ this.db.close();
30
+ this.db = null;
31
+ }
32
+ }
33
+ async execute(sql, params) {
34
+ const db = this.getDb();
35
+ try {
36
+ db.prepare(sql).run(...params ?? []);
37
+ } catch (error) {
38
+ throw new AdapterError(`Execute failed: ${error.message}`, {
39
+ sql,
40
+ params
41
+ });
42
+ }
43
+ }
44
+ async query(sql, params) {
45
+ const db = this.getDb();
46
+ try {
47
+ return db.prepare(sql).all(...params ?? []);
48
+ } catch (error) {
49
+ throw new AdapterError(`Query failed: ${error.message}`, {
50
+ sql,
51
+ params
52
+ });
53
+ }
54
+ }
55
+ async transaction(fn) {
56
+ const db = this.getDb();
57
+ db.exec("BEGIN");
58
+ try {
59
+ const tx = {
60
+ execute: async (sql, params) => {
61
+ try {
62
+ db.prepare(sql).run(...params ?? []);
63
+ } catch (error) {
64
+ throw new AdapterError(`Transaction execute failed: ${error.message}`, {
65
+ sql,
66
+ params
67
+ });
68
+ }
69
+ },
70
+ query: async (sql, params) => {
71
+ try {
72
+ return db.prepare(sql).all(...params ?? []);
73
+ } catch (error) {
74
+ throw new AdapterError(`Transaction query failed: ${error.message}`, {
75
+ sql,
76
+ params
77
+ });
78
+ }
79
+ }
80
+ };
81
+ await fn(tx);
82
+ db.exec("COMMIT");
83
+ } catch (error) {
84
+ db.exec("ROLLBACK");
85
+ throw error;
86
+ }
87
+ }
88
+ async migrate(from, to, migration) {
89
+ const db = this.getDb();
90
+ db.exec("BEGIN");
91
+ try {
92
+ for (const sql of migration.statements) {
93
+ db.exec(sql);
94
+ }
95
+ db.exec("COMMIT");
96
+ } catch (error) {
97
+ db.exec("ROLLBACK");
98
+ throw new AdapterError(
99
+ `Migration from v${from} to v${to} failed: ${error.message}`,
100
+ {
101
+ from,
102
+ to
103
+ }
104
+ );
105
+ }
106
+ }
107
+ getDb() {
108
+ if (!this.db) {
109
+ throw new StoreNotOpenError();
110
+ }
111
+ return this.db;
112
+ }
113
+ };
114
+ export {
115
+ BetterSqlite3Adapter
116
+ };
117
+ //# sourceMappingURL=better-sqlite3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/better-sqlite3-adapter.ts"],"sourcesContent":["import { generateFullDDL } from '@korajs/core'\nimport type { SchemaDefinition } from '@korajs/core'\nimport type Database from 'better-sqlite3'\nimport { AdapterError, StoreNotOpenError } from '../errors'\nimport type { MigrationPlan, StorageAdapter, Transaction } from '../types'\n\n/**\n * Storage adapter backed by better-sqlite3 for Node.js environments.\n * Used for testing and server-side usage.\n *\n * @example\n * ```typescript\n * import { BetterSqlite3Adapter } from '@korajs/store/better-sqlite3'\n *\n * const adapter = new BetterSqlite3Adapter(':memory:')\n * ```\n */\nexport class BetterSqlite3Adapter implements StorageAdapter {\n\tprivate db: Database.Database | null = null\n\n\t/**\n\t * @param path - Database file path, or ':memory:' for in-memory database\n\t */\n\tconstructor(private readonly path: string = ':memory:') {}\n\n\tasync open(schema: SchemaDefinition): Promise<void> {\n\t\t// Dynamic import so better-sqlite3 is only loaded when this adapter is used\n\t\tconst BetterSqlite3 = (await import('better-sqlite3')).default\n\t\tthis.db = new BetterSqlite3(this.path)\n\n\t\t// WAL mode for better concurrent read/write performance\n\t\tthis.db.pragma('journal_mode = WAL')\n\t\t// Enable foreign keys\n\t\tthis.db.pragma('foreign_keys = ON')\n\n\t\tconst statements = generateFullDDL(schema)\n\t\tfor (const sql of statements) {\n\t\t\tthis.db.exec(sql)\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.db) {\n\t\t\tthis.db.close()\n\t\t\tthis.db = null\n\t\t}\n\t}\n\n\tasync execute(sql: string, params?: unknown[]): Promise<void> {\n\t\tconst db = this.getDb()\n\t\ttry {\n\t\t\tdb.prepare(sql).run(...(params ?? []))\n\t\t} catch (error) {\n\t\t\tthrow new AdapterError(`Execute failed: ${(error as Error).message}`, {\n\t\t\t\tsql,\n\t\t\t\tparams,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync query<T>(sql: string, params?: unknown[]): Promise<T[]> {\n\t\tconst db = this.getDb()\n\t\ttry {\n\t\t\treturn db.prepare(sql).all(...(params ?? [])) as T[]\n\t\t} catch (error) {\n\t\t\tthrow new AdapterError(`Query failed: ${(error as Error).message}`, {\n\t\t\t\tsql,\n\t\t\t\tparams,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync transaction(fn: (tx: Transaction) => Promise<void>): Promise<void> {\n\t\tconst db = this.getDb()\n\n\t\t// better-sqlite3's transaction() is synchronous, but our interface is async.\n\t\t// We use BEGIN/COMMIT/ROLLBACK manually for the async callback.\n\t\tdb.exec('BEGIN')\n\t\ttry {\n\t\t\tconst tx: Transaction = {\n\t\t\t\texecute: async (sql: string, params?: unknown[]): Promise<void> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdb.prepare(sql).run(...(params ?? []))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new AdapterError(`Transaction execute failed: ${(error as Error).message}`, {\n\t\t\t\t\t\t\tsql,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tquery: async <T>(sql: string, params?: unknown[]): Promise<T[]> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn db.prepare(sql).all(...(params ?? [])) as T[]\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new AdapterError(`Transaction query failed: ${(error as Error).message}`, {\n\t\t\t\t\t\t\tsql,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tawait fn(tx)\n\t\t\tdb.exec('COMMIT')\n\t\t} catch (error) {\n\t\t\tdb.exec('ROLLBACK')\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync migrate(from: number, to: number, migration: MigrationPlan): Promise<void> {\n\t\tconst db = this.getDb()\n\t\tdb.exec('BEGIN')\n\t\ttry {\n\t\t\tfor (const sql of migration.statements) {\n\t\t\t\tdb.exec(sql)\n\t\t\t}\n\t\t\tdb.exec('COMMIT')\n\t\t} catch (error) {\n\t\t\tdb.exec('ROLLBACK')\n\t\t\tthrow new AdapterError(\n\t\t\t\t`Migration from v${from} to v${to} failed: ${(error as Error).message}`,\n\t\t\t\t{\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate getDb(): Database.Database {\n\t\tif (!this.db) {\n\t\t\tthrow new StoreNotOpenError()\n\t\t}\n\t\treturn this.db\n\t}\n}\n"],"mappings":"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","names":[]}