tempest-db-js 0.7.0 → 0.8.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.
package/dist/index.cjs CHANGED
@@ -2047,6 +2047,68 @@ var NodeSqliteDriver = class _NodeSqliteDriver {
2047
2047
  this.db.close();
2048
2048
  }
2049
2049
  };
2050
+ var BetterSqliteDriver = class _BetterSqliteDriver {
2051
+ // biome-ignore lint/suspicious/noExplicitAny: the peer dep's types are optional here.
2052
+ db;
2053
+ /** Prepared-statement cache keyed by SQL text — see {@link NodeSqliteDriver}. */
2054
+ // biome-ignore lint/suspicious/noExplicitAny: see above.
2055
+ statements = /* @__PURE__ */ new Map();
2056
+ // biome-ignore lint/suspicious/noExplicitAny: accept an already-open Database handle.
2057
+ constructor(database) {
2058
+ this.db = database;
2059
+ }
2060
+ /**
2061
+ * Open a `better-sqlite3` database at the given path (or `":memory:"`).
2062
+ *
2063
+ * @param path The database file, or `":memory:"`.
2064
+ * @param options Passed straight to `new Database()` (`readonly`, `timeout`, …).
2065
+ * @returns A driver over the open handle.
2066
+ * @throws If `better-sqlite3` is not installed — it is an optional peer
2067
+ * dependency, so the error names the package to install.
2068
+ */
2069
+ static open(path, options) {
2070
+ let Database;
2071
+ try {
2072
+ const mod = nodeRequire("better-sqlite3");
2073
+ Database = mod.default ?? mod;
2074
+ } catch (cause) {
2075
+ throw new Error(
2076
+ 'The "better-sqlite3" driver requires the better-sqlite3 package: npm install better-sqlite3',
2077
+ { cause }
2078
+ );
2079
+ }
2080
+ return new _BetterSqliteDriver(
2081
+ options ? new Database(path, { ...options }) : new Database(path)
2082
+ );
2083
+ }
2084
+ /** Return the cached prepared statement for `sql`, preparing it on first use. */
2085
+ // biome-ignore lint/suspicious/noExplicitAny: statement type is optional here.
2086
+ prepare(sql2) {
2087
+ const cached = this.statements.get(sql2);
2088
+ if (cached) return cached;
2089
+ const stmt = this.db.prepare(sql2);
2090
+ this.statements.set(sql2, stmt);
2091
+ return stmt;
2092
+ }
2093
+ execute(sql2, params) {
2094
+ const stmt = this.prepare(sql2);
2095
+ const bound = params.map(encodeSqliteParam);
2096
+ if (stmt.reader) {
2097
+ return { rows: stmt.all(...bound), changes: 0 };
2098
+ }
2099
+ const info = stmt.run(...bound);
2100
+ return { rows: [], changes: Number(info.changes ?? 0) };
2101
+ }
2102
+ *iterate(sql2, params) {
2103
+ const stmt = this.prepare(sql2);
2104
+ const bound = params.map(encodeSqliteParam);
2105
+ yield* stmt.iterate(...bound);
2106
+ }
2107
+ close() {
2108
+ this.statements.clear();
2109
+ this.db.close();
2110
+ }
2111
+ };
2050
2112
  function returnsRows(sql2) {
2051
2113
  return /^\s*(select|pragma)/i.test(sql2) || /\breturning\b/i.test(sql2);
2052
2114
  }
@@ -2570,8 +2632,43 @@ function asAsync(driver) {
2570
2632
  } : {}
2571
2633
  };
2572
2634
  }
2573
- function openSqliteDriver(path, options) {
2574
- return NodeSqliteDriver.open(path, options?.driverOptions);
2635
+ var SQLITE_DRIVER_ALIASES = {
2636
+ "node:sqlite": "node:sqlite",
2637
+ "node-sqlite": "node:sqlite",
2638
+ node: "node:sqlite",
2639
+ "better-sqlite3": "better-sqlite3",
2640
+ better_sqlite3: "better-sqlite3",
2641
+ bettersqlite3: "better-sqlite3"
2642
+ };
2643
+ var SERVER_DRIVER_ALIASES = {
2644
+ postgresql: ["postgres", "postgres.js", "postgresjs", "pg"],
2645
+ mysql: ["mysql", "mysql2"]
2646
+ };
2647
+ function checkServerDriver(dialect, driver) {
2648
+ if (!driver) return;
2649
+ const accepted = SERVER_DRIVER_ALIASES[dialect] ?? [];
2650
+ if (accepted.includes(driver.toLowerCase())) return;
2651
+ throw new Error(
2652
+ `Unknown ${dialect} driver ${JSON.stringify(driver)}; tempest-db-js runs ${dialect} on ${JSON.stringify(accepted[0])}.`
2653
+ );
2654
+ }
2655
+ function resolveSqliteDriver(parsed, options) {
2656
+ const explicit = options?.driver;
2657
+ if (explicit) {
2658
+ const resolved = SQLITE_DRIVER_ALIASES[explicit.toLowerCase()];
2659
+ if (!resolved) {
2660
+ throw new Error(
2661
+ `Unknown SQLite driver ${JSON.stringify(explicit)}; supported: "node:sqlite" (built-in, default) and "better-sqlite3".`
2662
+ );
2663
+ }
2664
+ return resolved;
2665
+ }
2666
+ const fromUrl = parsed.driver ? SQLITE_DRIVER_ALIASES[parsed.driver.toLowerCase()] : void 0;
2667
+ return fromUrl ?? "node:sqlite";
2668
+ }
2669
+ function openSqliteDriver(parsed, options) {
2670
+ const path = parsed.database ?? ":memory:";
2671
+ return resolveSqliteDriver(parsed, options) === "better-sqlite3" ? BetterSqliteDriver.open(path, options?.driverOptions) : NodeSqliteDriver.open(path, options?.driverOptions);
2575
2672
  }
2576
2673
  function createSyncEngine(url, options) {
2577
2674
  const parsed = parseDatabaseUrl(url);
@@ -2580,27 +2677,26 @@ function createSyncEngine(url, options) {
2580
2677
  `createSyncEngine supports only SQLite; ${parsed.dialect} is async-only \u2014 use createEngine.`
2581
2678
  );
2582
2679
  }
2583
- return new SyncEngine(
2584
- openSqliteDriver(parsed.database ?? ":memory:", options),
2585
- options?.onQuery
2586
- );
2680
+ return new SyncEngine(openSqliteDriver(parsed, options), options?.onQuery);
2587
2681
  }
2588
2682
  function createEngine(url, options) {
2589
2683
  const parsed = parseDatabaseUrl(url);
2590
2684
  if (parsed.dialect === "sqlite") {
2591
2685
  return new AsyncEngine(
2592
- asAsync(openSqliteDriver(parsed.database ?? ":memory:", options)),
2686
+ asAsync(openSqliteDriver(parsed, options)),
2593
2687
  "sqlite",
2594
2688
  options?.onQuery
2595
2689
  );
2596
2690
  }
2597
2691
  if (parsed.dialect === "mysql") {
2692
+ checkServerDriver("mysql", options?.driver);
2598
2693
  return new AsyncEngine(
2599
2694
  createMysqlDriver(parsed.raw, options),
2600
2695
  "mysql",
2601
2696
  options?.onQuery
2602
2697
  );
2603
2698
  }
2699
+ checkServerDriver("postgresql", options?.driver);
2604
2700
  return new AsyncEngine(
2605
2701
  createPostgresDriver(parsed.raw, options),
2606
2702
  "postgresql",
@@ -3081,6 +3177,7 @@ exports.AsyncResult = AsyncResult;
3081
3177
  exports.AsyncSession = AsyncSession;
3082
3178
  exports.BaseDialect = BaseDialect;
3083
3179
  exports.BaseRepository = BaseRepository;
3180
+ exports.BetterSqliteDriver = BetterSqliteDriver;
3084
3181
  exports.Column = Column;
3085
3182
  exports.DeleteBuilder = DeleteBuilder;
3086
3183
  exports.Expression = Expression;