@holo-js/db-sqlite 0.1.4 → 0.1.5

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.
package/dist/index.d.ts CHANGED
@@ -1,24 +1,6 @@
1
- interface DriverQueryResult<TRow extends Record<string, unknown> = Record<string, unknown>> {
2
- rows: TRow[];
3
- rowCount: number;
4
- }
5
- interface DriverExecutionResult {
6
- affectedRows?: number;
7
- lastInsertId?: number | string;
8
- }
9
- interface DriverAdapter {
10
- initialize(): Promise<void>;
11
- disconnect(): Promise<void>;
12
- isConnected(): boolean;
13
- query<TRow extends Record<string, unknown> = Record<string, unknown>>(sql: string, bindings?: readonly unknown[]): Promise<DriverQueryResult<TRow>>;
14
- execute(sql: string, bindings?: readonly unknown[]): Promise<DriverExecutionResult>;
15
- beginTransaction(): Promise<void>;
16
- commit(): Promise<void>;
17
- rollback(): Promise<void>;
18
- createSavepoint?(name: string): Promise<void>;
19
- rollbackToSavepoint?(name: string): Promise<void>;
20
- releaseSavepoint?(name: string): Promise<void>;
21
- }
1
+ import { DriverAdapter, DriverQueryResult, DriverExecutionResult } from '@holo-js/db';
2
+ export { DriverAdapter, DriverExecutionResult, DriverQueryResult } from '@holo-js/db';
3
+
22
4
  interface SQLiteStatementLike {
23
5
  all(...params: readonly unknown[]): Record<string, unknown>[];
24
6
  run(...params: readonly unknown[]): {
@@ -39,12 +21,14 @@ interface SQLiteAdapterOptions {
39
21
  declare class SQLiteAdapter implements DriverAdapter {
40
22
  private database?;
41
23
  private connected;
24
+ private transactionTail;
42
25
  private readonly filename;
43
26
  private readonly createDatabaseInstance;
44
27
  constructor(options?: SQLiteAdapterOptions);
45
28
  initialize(): Promise<void>;
46
29
  disconnect(): Promise<void>;
47
30
  isConnected(): boolean;
31
+ runWithTransactionScope<T>(callback: () => Promise<T>): Promise<T>;
48
32
  query<TRow extends Record<string, unknown> = Record<string, unknown>>(sql: string, bindings?: readonly unknown[]): Promise<DriverQueryResult<TRow>>;
49
33
  introspect<TRow extends Record<string, unknown> = Record<string, unknown>>(sql: string, bindings?: readonly unknown[]): Promise<DriverQueryResult<TRow>>;
50
34
  execute(sql: string, bindings?: readonly unknown[]): Promise<DriverExecutionResult>;
@@ -56,9 +40,7 @@ declare class SQLiteAdapter implements DriverAdapter {
56
40
  releaseSavepoint(name: string): Promise<void>;
57
41
  private getDatabase;
58
42
  private normalizeSavepointName;
59
- private invokeStatement;
60
- private isBindingArityError;
61
43
  }
62
44
  declare function createSQLiteAdapter(options?: SQLiteAdapterOptions): SQLiteAdapter;
63
45
 
64
- export { type DriverAdapter, type DriverExecutionResult, type DriverQueryResult, SQLiteAdapter, type SQLiteAdapterOptions, type SQLiteDatabaseLike, type SQLiteStatementLike, createSQLiteAdapter };
46
+ export { SQLiteAdapter, type SQLiteAdapterOptions, type SQLiteDatabaseLike, type SQLiteStatementLike, createSQLiteAdapter };
package/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ var TransactionError = class extends Error {
5
5
  var SQLiteAdapter = class {
6
6
  database;
7
7
  connected;
8
+ transactionTail = Promise.resolve();
8
9
  filename;
9
10
  createDatabaseInstance;
10
11
  constructor(options = {}) {
@@ -31,9 +32,26 @@ var SQLiteAdapter = class {
31
32
  isConnected() {
32
33
  return this.connected;
33
34
  }
35
+ async runWithTransactionScope(callback) {
36
+ const previous = this.transactionTail;
37
+ let release;
38
+ const current = previous.then(() => new Promise((resolve) => {
39
+ release = resolve;
40
+ }));
41
+ this.transactionTail = current;
42
+ await previous;
43
+ try {
44
+ return await callback();
45
+ } finally {
46
+ release();
47
+ if (this.transactionTail === current) {
48
+ this.transactionTail = Promise.resolve();
49
+ }
50
+ }
51
+ }
34
52
  async query(sql, bindings = []) {
35
53
  const statement = this.getDatabase().prepare(sql);
36
- const rows = this.invokeStatement(statement, "all", bindings);
54
+ const rows = statement.all(...bindings);
37
55
  return {
38
56
  rows,
39
57
  rowCount: rows.length
@@ -44,7 +62,7 @@ var SQLiteAdapter = class {
44
62
  }
45
63
  async execute(sql, bindings = []) {
46
64
  const statement = this.getDatabase().prepare(sql);
47
- const result = this.invokeStatement(statement, "run", bindings);
65
+ const result = statement.run(...bindings);
48
66
  return {
49
67
  affectedRows: result.changes,
50
68
  lastInsertId: typeof result.lastInsertRowid === "bigint" ? Number(result.lastInsertRowid) : result.lastInsertRowid
@@ -81,19 +99,6 @@ var SQLiteAdapter = class {
81
99
  }
82
100
  return name;
83
101
  }
84
- invokeStatement(statement, method, bindings) {
85
- try {
86
- return statement[method](...bindings);
87
- } catch (error) {
88
- if (bindings.length > 0 && this.isBindingArityError(error)) {
89
- return statement[method](bindings);
90
- }
91
- throw error;
92
- }
93
- }
94
- isBindingArityError(error) {
95
- return error instanceof RangeError && (error.message.includes("Too many parameter values were provided") || error.message.includes("Too few parameter values were provided"));
96
- }
97
102
  };
98
103
  function createSQLiteAdapter(options = {}) {
99
104
  return new SQLiteAdapter(options);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holo-js/db-sqlite",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Holo-JS Framework - SQLite database adapter",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,16 +23,16 @@
23
23
  "test": "vitest --run"
24
24
  },
25
25
  "peerDependencies": {
26
- "@holo-js/db": "^0.1.4"
26
+ "@holo-js/db": "^0.1.5"
27
27
  },
28
28
  "dependencies": {
29
29
  "better-sqlite3": "^11.7.0"
30
30
  },
31
31
  "devDependencies": {
32
- "@holo-js/db": "workspace:*",
32
+ "@holo-js/db": "^0.1.5",
33
33
  "@types/better-sqlite3": "^7.6.12",
34
34
  "tsup": "^8.3.5",
35
35
  "typescript": "^5.7.2",
36
- "vitest": "^2.1.8"
36
+ "vitest": "^4.1.5"
37
37
  }
38
38
  }