@luzzle/core 0.0.57 → 0.0.58

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.
@@ -0,0 +1,13 @@
1
+ import { DatabaseIntrospector, Dialect, DialectAdapter, Driver, Kysely, QueryCompiler } from 'kysely';
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ export interface NodeSqliteDialectConfig {
4
+ database: DatabaseSync;
5
+ }
6
+ export declare class NodeSqliteDialect implements Dialect {
7
+ #private;
8
+ constructor(config: NodeSqliteDialectConfig);
9
+ createAdapter(): DialectAdapter;
10
+ createDriver(): Driver;
11
+ createIntrospector(db: Kysely<any>): DatabaseIntrospector;
12
+ createQueryCompiler(): QueryCompiler;
13
+ }
@@ -0,0 +1,73 @@
1
+ import { CompiledQuery, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, } from 'kysely';
2
+ class NodeSqliteConnection {
3
+ #db;
4
+ constructor(db) {
5
+ this.#db = db;
6
+ }
7
+ async executeQuery(compiledQuery) {
8
+ const stmt = this.#db.prepare(compiledQuery.sql);
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ const params = compiledQuery.parameters;
11
+ const isRead = /^\s*(?:select|pragma|explain)\b/i.test(compiledQuery.sql) ||
12
+ /\breturning\b/i.test(compiledQuery.sql);
13
+ if (isRead) {
14
+ const rows = stmt.all(...params);
15
+ return { rows };
16
+ }
17
+ else {
18
+ const result = stmt.run(...params);
19
+ return {
20
+ numAffectedRows: BigInt(result.changes),
21
+ insertId: BigInt(result.lastInsertRowid),
22
+ rows: [],
23
+ };
24
+ }
25
+ }
26
+ // eslint-disable-next-line require-yield
27
+ async *streamQuery() {
28
+ throw new Error('NodeSqliteDialect does not support streaming');
29
+ }
30
+ }
31
+ class NodeSqliteDriver {
32
+ #config;
33
+ constructor(config) {
34
+ this.#config = config;
35
+ }
36
+ async init() { }
37
+ async acquireConnection() {
38
+ return new NodeSqliteConnection(this.#config.database);
39
+ }
40
+ async beginTransaction(connection) {
41
+ await connection.executeQuery(CompiledQuery.raw('begin'));
42
+ }
43
+ async commitTransaction(connection) {
44
+ await connection.executeQuery(CompiledQuery.raw('commit'));
45
+ }
46
+ async rollbackTransaction(connection) {
47
+ await connection.executeQuery(CompiledQuery.raw('rollback'));
48
+ }
49
+ async releaseConnection() { }
50
+ async destroy() {
51
+ this.#config.database.close();
52
+ }
53
+ }
54
+ export class NodeSqliteDialect {
55
+ #config;
56
+ constructor(config) {
57
+ this.#config = config;
58
+ }
59
+ createAdapter() {
60
+ return new SqliteAdapter();
61
+ }
62
+ createDriver() {
63
+ return new NodeSqliteDriver(this.#config);
64
+ }
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
+ createIntrospector(db) {
67
+ return new SqliteIntrospector(db);
68
+ }
69
+ createQueryCompiler() {
70
+ return new SqliteQueryCompiler();
71
+ }
72
+ }
73
+ //# sourceMappingURL=NodeSqliteDialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSqliteDialect.js","sourceRoot":"","sources":["../../../src/database/NodeSqliteDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EASb,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,QAAQ,CAAA;AAOf,MAAM,oBAAoB;IAChB,GAAG,CAAc;IAE1B,YAAY,EAAgB;QAC3B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAI,aAA4B;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAChD,8DAA8D;QAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,UAAmB,CAAA;QAEhD,MAAM,MAAM,GACX,kCAAkC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAEzC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAQ,CAAA;YACvC,OAAO,EAAE,IAAI,EAAE,CAAA;QAChB,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YAClC,OAAO;gBACN,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBACxC,IAAI,EAAE,EAAE;aACR,CAAA;QACF,CAAC;IACF,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,CAAC,WAAW;QACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAChE,CAAC;CACD;AAED,MAAM,gBAAgB;IACZ,OAAO,CAAyB;IAEzC,YAAY,MAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,KAAK,CAAC,iBAAiB;QACtB,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAA8B;QACpD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAA8B;QACrD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,UAA8B;QACvD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,iBAAiB,KAAmB,CAAC;IAE3C,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;CACD;AAED,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAyB;IAEzC,YAAY,MAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,YAAY;QACX,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,8DAA8D;IAC9D,kBAAkB,CAAC,EAAe;QACjC,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,mBAAmB;QAClB,OAAO,IAAI,mBAAmB,EAAE,CAAA;IACjC,CAAC;CACD"}
@@ -1,10 +1,11 @@
1
- import { Kysely, SqliteDialect } from 'kysely';
2
- import SqliteDatabase from 'better-sqlite3';
1
+ import { Kysely } from 'kysely';
2
+ import { NodeSqliteDialect } from './NodeSqliteDialect.js';
3
+ import { DatabaseSync } from 'node:sqlite';
3
4
  function getDatabaseClient(pathToDb, debug = false) {
4
5
  return new Kysely({
5
6
  log: debug ? ['query', 'error'] : [],
6
- dialect: new SqliteDialect({
7
- database: new SqliteDatabase(pathToDb),
7
+ dialect: new NodeSqliteDialect({
8
+ database: new DatabaseSync(pathToDb),
8
9
  }),
9
10
  });
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,cAAc,MAAM,gBAAgB,CAAA;AAG3C,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAK,GAAG,KAAK;IACzD,OAAO,IAAI,MAAM,CAAe;QAC/B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACpC,OAAO,EAAE,IAAI,aAAa,CAAC;YAC1B,QAAQ,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAC;SACtC,CAAC;KACF,CAAC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAK,GAAG,KAAK;IACzD,OAAO,IAAI,MAAM,CAAe;QAC/B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACpC,OAAO,EAAE,IAAI,iBAAiB,CAAC;YAC9B,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC;SACpC,CAAC;KACF,CAAC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1,13 +1,15 @@
1
1
  import { describe, expect, test, vi, afterEach } from 'vitest';
2
- import SqliteDatabase from 'better-sqlite3';
3
- import { Kysely, SqliteDialect } from 'kysely';
2
+ import { DatabaseSync } from 'node:sqlite';
3
+ import { Kysely } from 'kysely';
4
+ import { NodeSqliteDialect } from './NodeSqliteDialect.js';
4
5
  import { getDatabaseClient } from './client.js';
5
- vi.mock('better-sqlite3');
6
+ vi.mock('node:sqlite');
6
7
  vi.mock('kysely');
8
+ vi.mock('./NodeSqliteDialect.js');
7
9
  const mocks = {
8
- SqliteDatabase: vi.mocked(SqliteDatabase),
10
+ DatabaseSync: vi.mocked(DatabaseSync),
9
11
  Kysely: vi.mocked(Kysely),
10
- SqliteDialect: vi.mocked(SqliteDialect),
12
+ NodeSqliteDialect: vi.mocked(NodeSqliteDialect),
11
13
  };
12
14
  describe('database', () => {
13
15
  afterEach(() => {
@@ -16,15 +18,15 @@ describe('database', () => {
16
18
  test('getDatabaseClient', async () => {
17
19
  const path = 'path/to/db.sqlite';
18
20
  getDatabaseClient(path);
19
- expect(mocks.SqliteDatabase).toHaveBeenCalledWith(path);
20
- expect(mocks.SqliteDialect).toHaveBeenCalledOnce();
21
+ expect(mocks.DatabaseSync).toHaveBeenCalledWith(path);
22
+ expect(mocks.NodeSqliteDialect).toHaveBeenCalledOnce();
21
23
  expect(mocks.Kysely).toHaveBeenCalledOnce();
22
24
  });
23
25
  test('getDatabaseClient debug', async () => {
24
26
  const path = 'path/to/db.sqlite';
25
27
  getDatabaseClient(path, true);
26
- expect(mocks.SqliteDatabase).toHaveBeenCalledWith(path);
27
- expect(mocks.SqliteDialect).toHaveBeenCalledOnce();
28
+ expect(mocks.DatabaseSync).toHaveBeenCalledWith(path);
29
+ expect(mocks.NodeSqliteDialect).toHaveBeenCalledOnce();
28
30
  expect(mocks.Kysely).toHaveBeenCalledWith({
29
31
  log: ['query', 'error'],
30
32
  dialect: expect.anything(),
@@ -1 +1 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/database/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,cAAc,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AACzB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAEjB,MAAM,KAAK,GAAG;IACb,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;IACzC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACzB,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;CACvC,CAAA;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAEvB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACzC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/database/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AACtB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACjB,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;AAEjC,MAAM,KAAK,GAAG;IACb,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;IACrC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACzB,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC;CAC/C,CAAA;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAEvB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACzC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}