@uql/core 3.3.0 → 3.4.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 (41) hide show
  1. package/CHANGELOG.md +5 -2
  2. package/README.md +14 -12
  3. package/dist/browser/uql-browser.min.js +83 -94
  4. package/dist/browser/uql-browser.min.js.map +1 -1
  5. package/dist/d1/d1Querier.d.ts +49 -0
  6. package/dist/d1/d1Querier.d.ts.map +1 -0
  7. package/dist/d1/d1Querier.js +40 -0
  8. package/dist/d1/d1Querier.js.map +1 -0
  9. package/dist/d1/d1QuerierPool.d.ts +10 -0
  10. package/dist/d1/d1QuerierPool.d.ts.map +1 -0
  11. package/dist/d1/d1QuerierPool.js +16 -0
  12. package/dist/d1/d1QuerierPool.js.map +1 -0
  13. package/dist/d1/index.d.ts +3 -0
  14. package/dist/d1/index.d.ts.map +1 -0
  15. package/dist/d1/index.js +3 -0
  16. package/dist/d1/index.js.map +1 -0
  17. package/dist/libsql/index.d.ts +3 -0
  18. package/dist/libsql/index.d.ts.map +1 -0
  19. package/dist/libsql/index.js +3 -0
  20. package/dist/libsql/index.js.map +1 -0
  21. package/dist/libsql/libsqlQuerier.d.ts +21 -0
  22. package/dist/libsql/libsqlQuerier.d.ts.map +1 -0
  23. package/dist/libsql/libsqlQuerier.js +81 -0
  24. package/dist/libsql/libsqlQuerier.js.map +1 -0
  25. package/dist/libsql/libsqlQuerierPool.d.ts +12 -0
  26. package/dist/libsql/libsqlQuerierPool.d.ts.map +1 -0
  27. package/dist/libsql/libsqlQuerierPool.js +19 -0
  28. package/dist/libsql/libsqlQuerierPool.js.map +1 -0
  29. package/dist/neon/index.d.ts +3 -0
  30. package/dist/neon/index.d.ts.map +1 -0
  31. package/dist/neon/index.js +3 -0
  32. package/dist/neon/index.js.map +1 -0
  33. package/dist/neon/neonQuerier.d.ts +18 -0
  34. package/dist/neon/neonQuerier.d.ts.map +1 -0
  35. package/dist/neon/neonQuerier.js +40 -0
  36. package/dist/neon/neonQuerier.js.map +1 -0
  37. package/dist/neon/neonQuerierPool.d.ts +11 -0
  38. package/dist/neon/neonQuerierPool.d.ts.map +1 -0
  39. package/dist/neon/neonQuerierPool.js +17 -0
  40. package/dist/neon/neonQuerierPool.js.map +1 -0
  41. package/package.json +16 -3
@@ -0,0 +1,49 @@
1
+ import { AbstractSqlQuerier } from '../querier/index.js';
2
+ import type { ExtraOptions } from '../type/index.js';
3
+ export interface D1Meta {
4
+ duration?: number;
5
+ size_after?: number;
6
+ rows_read?: number;
7
+ rows_written?: number;
8
+ last_row_id?: number;
9
+ changed_db?: boolean;
10
+ changes?: number;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface D1Result<T = unknown> {
14
+ results: T[];
15
+ success: boolean;
16
+ meta: D1Meta;
17
+ error?: string;
18
+ }
19
+ export interface D1ExecResult {
20
+ count: number;
21
+ duration: number;
22
+ meta?: D1Meta;
23
+ }
24
+ export interface D1PreparedStatement {
25
+ bind(...values: any[]): D1PreparedStatement;
26
+ first<T = unknown>(colName?: string): Promise<T | null>;
27
+ run(): Promise<D1ExecResult>;
28
+ all<T = unknown>(): Promise<D1Result<T>>;
29
+ raw<T = unknown>(): Promise<T[]>;
30
+ }
31
+ export interface D1Database {
32
+ prepare(query: string): D1PreparedStatement;
33
+ dump(): Promise<ArrayBuffer>;
34
+ batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;
35
+ exec(query: string): Promise<D1ExecResult>;
36
+ }
37
+ export declare class D1Querier extends AbstractSqlQuerier {
38
+ readonly db: D1Database;
39
+ readonly extra?: ExtraOptions;
40
+ constructor(db: D1Database, extra?: ExtraOptions);
41
+ internalAll<T>(query: string, values?: unknown[]): Promise<T[]>;
42
+ internalRun(query: string, values?: unknown[]): Promise<{
43
+ changes: number;
44
+ ids: number[];
45
+ firstId: number;
46
+ }>;
47
+ internalRelease(): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=d1Querier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1Querier.d.ts","sourceRoot":"","sources":["../../src/d1/d1Querier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAExE,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC;IAC5C,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,GAAG,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,GAAG,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC5C,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5C;AAED,qBAAa,SAAU,SAAQ,kBAAkB;IAE7C,QAAQ,CAAC,EAAE,EAAE,UAAU;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY;gBADpB,EAAE,EAAE,UAAU,EACd,KAAK,CAAC,EAAE,YAAY;IAKhB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;IAQhD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;;;;;IAqB7C,eAAe;CAG/B"}
@@ -0,0 +1,40 @@
1
+ import { AbstractSqlQuerier } from '../querier/index.js';
2
+ import { SqliteDialect } from '../sqlite/index.js';
3
+ export class D1Querier extends AbstractSqlQuerier {
4
+ db;
5
+ extra;
6
+ constructor(db, extra) {
7
+ super(new SqliteDialect(extra?.namingStrategy));
8
+ this.db = db;
9
+ this.extra = extra;
10
+ }
11
+ async internalAll(query, values) {
12
+ this.extra?.logger?.(query, values);
13
+ const stmt = this.db.prepare(query);
14
+ const bound = values?.length ? stmt.bind(...values) : stmt;
15
+ const res = await bound.all();
16
+ return res.results;
17
+ }
18
+ async internalRun(query, values) {
19
+ this.extra?.logger?.(query, values);
20
+ const stmt = this.db.prepare(query);
21
+ const bound = values?.length ? stmt.bind(...values) : stmt;
22
+ const res = await bound.run();
23
+ // D1ExecResult doesn't reliably return lastRowId in the type definition,
24
+ // though the runtime meta often has it.
25
+ // For now, we return 0 for firstId if not explicitly available, relying on UUIDs or RETURNING in future.
26
+ const changes = res.meta?.changes ?? res.count ?? 0;
27
+ const lastId = res.meta?.last_row_id;
28
+ let firstId;
29
+ let ids = [];
30
+ if (lastId && changes > 0) {
31
+ firstId = lastId - (changes - 1);
32
+ ids = Array.from({ length: changes }, (_, i) => firstId + i);
33
+ }
34
+ return { changes, ids, firstId };
35
+ }
36
+ async internalRelease() {
37
+ // no-op
38
+ }
39
+ }
40
+ //# sourceMappingURL=d1Querier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1Querier.js","sourceRoot":"","sources":["../../src/d1/d1Querier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA0CnD,MAAM,OAAO,SAAU,SAAQ,kBAAkB;IAEpC;IACA;IAFX,YACW,EAAc,EACd,KAAoB;QAE7B,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;QAHvC,OAAE,GAAF,EAAE,CAAY;QACd,UAAK,GAAL,KAAK,CAAe;IAG/B,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAI,KAAa,EAAE,MAAkB;QAC7D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAK,CAAC;QACjC,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,MAAkB;QAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,yEAAyE;QACzE,wCAAwC;QACxC,yGAAyG;QACzG,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;QACrC,IAAI,OAA2B,CAAC;QAChC,IAAI,GAAG,GAAa,EAAE,CAAC;QAEvB,IAAI,MAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACjC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,OAAkB,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAA8B,CAAC;IAC/D,CAAC;IAEQ,KAAK,CAAC,eAAe;QAC5B,QAAQ;IACV,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { AbstractQuerierPool } from '../querier/index.js';
2
+ import type { ExtraOptions } from '../type/index.js';
3
+ import { type D1Database, D1Querier } from './d1Querier.js';
4
+ export declare class D1QuerierPool extends AbstractQuerierPool<D1Querier> {
5
+ readonly db: D1Database;
6
+ constructor(db: D1Database, extra?: ExtraOptions);
7
+ getQuerier(): Promise<D1Querier>;
8
+ end(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=d1QuerierPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1QuerierPool.d.ts","sourceRoot":"","sources":["../../src/d1/d1QuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,qBAAa,aAAc,SAAQ,mBAAmB,CAAC,SAAS,CAAC;IAE7D,QAAQ,CAAC,EAAE,EAAE,UAAU;gBAAd,EAAE,EAAE,UAAU,EACvB,KAAK,CAAC,EAAE,YAAY;IAKhB,UAAU;IAIV,GAAG;CAGV"}
@@ -0,0 +1,16 @@
1
+ import { AbstractQuerierPool } from '../querier/index.js';
2
+ import { D1Querier } from './d1Querier.js';
3
+ export class D1QuerierPool extends AbstractQuerierPool {
4
+ db;
5
+ constructor(db, extra) {
6
+ super('sqlite', extra);
7
+ this.db = db;
8
+ }
9
+ async getQuerier() {
10
+ return new D1Querier(this.db, this.extra);
11
+ }
12
+ async end() {
13
+ // no-op for D1 bindings
14
+ }
15
+ }
16
+ //# sourceMappingURL=d1QuerierPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1QuerierPool.js","sourceRoot":"","sources":["../../src/d1/d1QuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAmB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,OAAO,aAAc,SAAQ,mBAA8B;IAEpD;IADX,YACW,EAAc,EACvB,KAAoB;QAEpB,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAHd,OAAE,GAAF,EAAE,CAAY;IAIzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,wBAAwB;IAC1B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from './d1Querier.js';
2
+ export * from './d1QuerierPool.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/d1/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './d1Querier.js';
2
+ export * from './d1QuerierPool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/d1/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './libsqlQuerier.js';
2
+ export * from './libsqlQuerierPool.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/libsql/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './libsqlQuerier.js';
2
+ export * from './libsqlQuerierPool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/libsql/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Client } from '@libsql/client';
2
+ import { AbstractSqlQuerier } from '../querier/index.js';
3
+ import type { ExtraOptions } from '../type/index.js';
4
+ export declare class LibsqlQuerier extends AbstractSqlQuerier {
5
+ readonly client: Client;
6
+ readonly extra?: ExtraOptions;
7
+ private tx?;
8
+ constructor(client: Client, extra?: ExtraOptions);
9
+ internalAll<T>(query: string, values?: unknown[]): Promise<T[]>;
10
+ internalRun(query: string, values?: unknown[]): Promise<{
11
+ changes: number;
12
+ ids: any[];
13
+ firstId: number;
14
+ }>;
15
+ get hasOpenTransaction(): boolean;
16
+ beginTransaction(): Promise<void>;
17
+ commitTransaction(): Promise<void>;
18
+ rollbackTransaction(): Promise<void>;
19
+ internalRelease(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=libsqlQuerier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libsqlQuerier.d.ts","sourceRoot":"","sources":["../../src/libsql/libsqlQuerier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAwB,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAExE,qBAAa,aAAc,SAAQ,kBAAkB;IAIjD,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY;IAJ/B,OAAO,CAAC,EAAE,CAAC,CAAc;gBAGd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,YAAY;IAKhB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;IAOhD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;;;;;IAe5D,IAAa,kBAAkB,YAE9B;IAGc,gBAAgB;IAQhB,iBAAiB;IASjB,mBAAmB;IAQnB,eAAe;CAK/B"}
@@ -0,0 +1,81 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { Serialized } from '../querier/decorator/index.js';
3
+ import { AbstractSqlQuerier } from '../querier/index.js';
4
+ import { SqliteDialect } from '../sqlite/index.js';
5
+ export class LibsqlQuerier extends AbstractSqlQuerier {
6
+ client;
7
+ extra;
8
+ tx;
9
+ constructor(client, extra) {
10
+ super(new SqliteDialect(extra?.namingStrategy));
11
+ this.client = client;
12
+ this.extra = extra;
13
+ }
14
+ async internalAll(query, values) {
15
+ this.extra?.logger?.(query, values);
16
+ const target = this.tx || this.client;
17
+ const res = await target.execute({ sql: query, args: values });
18
+ return res.rows;
19
+ }
20
+ async internalRun(query, values) {
21
+ this.extra?.logger?.(query, values);
22
+ const target = this.tx || this.client;
23
+ const res = await target.execute({ sql: query, args: values });
24
+ const changes = res.rowsAffected;
25
+ const lastInsertRowid = res.lastInsertRowid;
26
+ const firstId = lastInsertRowid ? Number(lastInsertRowid) - (changes - 1) : undefined;
27
+ const ids = firstId
28
+ ? Array(changes)
29
+ .fill(firstId)
30
+ .map((i, index) => i + index)
31
+ : [];
32
+ return { changes, ids, firstId };
33
+ }
34
+ get hasOpenTransaction() {
35
+ return !!this.tx;
36
+ }
37
+ async beginTransaction() {
38
+ if (this.tx) {
39
+ throw TypeError('pending transaction');
40
+ }
41
+ this.tx = await this.client.transaction('write');
42
+ }
43
+ async commitTransaction() {
44
+ if (!this.tx) {
45
+ throw TypeError('not a pending transaction');
46
+ }
47
+ await this.tx.commit();
48
+ this.tx = undefined;
49
+ }
50
+ async rollbackTransaction() {
51
+ if (!this.tx) {
52
+ throw TypeError('not a pending transaction');
53
+ }
54
+ await this.tx.rollback();
55
+ this.tx = undefined;
56
+ }
57
+ async internalRelease() {
58
+ if (this.tx) {
59
+ this.tx.close();
60
+ }
61
+ }
62
+ }
63
+ __decorate([
64
+ Serialized(),
65
+ __metadata("design:type", Function),
66
+ __metadata("design:paramtypes", []),
67
+ __metadata("design:returntype", Promise)
68
+ ], LibsqlQuerier.prototype, "beginTransaction", null);
69
+ __decorate([
70
+ Serialized(),
71
+ __metadata("design:type", Function),
72
+ __metadata("design:paramtypes", []),
73
+ __metadata("design:returntype", Promise)
74
+ ], LibsqlQuerier.prototype, "commitTransaction", null);
75
+ __decorate([
76
+ Serialized(),
77
+ __metadata("design:type", Function),
78
+ __metadata("design:paramtypes", []),
79
+ __metadata("design:returntype", Promise)
80
+ ], LibsqlQuerier.prototype, "rollbackTransaction", null);
81
+ //# sourceMappingURL=libsqlQuerier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libsqlQuerier.js","sourceRoot":"","sources":["../../src/libsql/libsqlQuerier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Client, type Config } from '@libsql/client';
2
+ import { AbstractQuerierPool } from '../querier/index.js';
3
+ import type { ExtraOptions } from '../type/index.js';
4
+ import { LibsqlQuerier } from './libsqlQuerier.js';
5
+ export declare class LibsqlQuerierPool extends AbstractQuerierPool<LibsqlQuerier> {
6
+ readonly config: Config;
7
+ readonly client: Client;
8
+ constructor(config: Config, extra?: ExtraOptions);
9
+ getQuerier(): Promise<LibsqlQuerier>;
10
+ end(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=libsqlQuerierPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libsqlQuerierPool.d.ts","sourceRoot":"","sources":["../../src/libsql/libsqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAIrE,QAAQ,CAAC,MAAM,EAAE,MAAM;IAHzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGb,MAAM,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,YAAY;IAMhB,UAAU;IAIV,GAAG;CAGV"}
@@ -0,0 +1,19 @@
1
+ import { createClient } from '@libsql/client';
2
+ import { AbstractQuerierPool } from '../querier/index.js';
3
+ import { LibsqlQuerier } from './libsqlQuerier.js';
4
+ export class LibsqlQuerierPool extends AbstractQuerierPool {
5
+ config;
6
+ client;
7
+ constructor(config, extra) {
8
+ super('sqlite', extra);
9
+ this.config = config;
10
+ this.client = createClient(config);
11
+ }
12
+ async getQuerier() {
13
+ return new LibsqlQuerier(this.client, this.extra);
14
+ }
15
+ async end() {
16
+ this.client.close();
17
+ }
18
+ }
19
+ //# sourceMappingURL=libsqlQuerierPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libsqlQuerierPool.js","sourceRoot":"","sources":["../../src/libsql/libsqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,OAAO,iBAAkB,SAAQ,mBAAkC;IAI5D;IAHF,MAAM,CAAS;IAExB,YACW,MAAc,EACvB,KAAoB;QAEpB,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAHd,WAAM,GAAN,MAAM,CAAQ;QAIvB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from './neonQuerier.js';
2
+ export * from './neonQuerierPool.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/neon/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './neonQuerier.js';
2
+ export * from './neonQuerierPool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/neon/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { PoolClient } from '@neondatabase/serverless';
2
+ import { AbstractSqlQuerier } from '../querier/index.js';
3
+ import type { ExtraOptions } from '../type/index.js';
4
+ export declare class NeonQuerier extends AbstractSqlQuerier {
5
+ readonly connect: () => Promise<PoolClient>;
6
+ readonly extra?: ExtraOptions;
7
+ conn: PoolClient;
8
+ constructor(connect: () => Promise<PoolClient>, extra?: ExtraOptions);
9
+ internalAll<T>(query: string, values?: unknown[]): Promise<T[]>;
10
+ internalRun(query: string, values?: unknown[]): Promise<{
11
+ changes: number;
12
+ ids: any[];
13
+ firstId: any;
14
+ }>;
15
+ lazyConnect(): Promise<void>;
16
+ internalRelease(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=neonQuerier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neonQuerier.d.ts","sourceRoot":"","sources":["../../src/neon/neonQuerier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAExE,qBAAa,WAAY,SAAQ,kBAAkB;IAI/C,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY;IAJ/B,IAAI,EAAE,UAAU,CAAC;gBAGN,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,EAClC,KAAK,CAAC,EAAE,YAAY;IAKhB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;IAOhD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;;;;;IAStD,WAAW;IAIF,eAAe;CAU/B"}
@@ -0,0 +1,40 @@
1
+ import { PostgresDialect } from '../postgres/index.js';
2
+ import { AbstractSqlQuerier } from '../querier/index.js';
3
+ export class NeonQuerier extends AbstractSqlQuerier {
4
+ connect;
5
+ extra;
6
+ conn;
7
+ constructor(connect, extra) {
8
+ super(new PostgresDialect(extra?.namingStrategy));
9
+ this.connect = connect;
10
+ this.extra = extra;
11
+ }
12
+ async internalAll(query, values) {
13
+ this.extra?.logger?.(query, values);
14
+ await this.lazyConnect();
15
+ const res = await this.conn.query(query, values);
16
+ return res.rows;
17
+ }
18
+ async internalRun(query, values) {
19
+ this.extra?.logger?.(query, values);
20
+ await this.lazyConnect();
21
+ const res = await this.conn.query(query, values);
22
+ const changes = res.rowCount ?? 0;
23
+ const ids = res.rows.map((r) => r.id);
24
+ return { changes, ids, firstId: ids[0] };
25
+ }
26
+ async lazyConnect() {
27
+ this.conn ??= await this.connect();
28
+ }
29
+ async internalRelease() {
30
+ if (this.hasOpenTransaction) {
31
+ throw TypeError('pending transaction');
32
+ }
33
+ if (!this.conn) {
34
+ return;
35
+ }
36
+ await this.conn.release();
37
+ this.conn = undefined;
38
+ }
39
+ }
40
+ //# sourceMappingURL=neonQuerier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neonQuerier.js","sourceRoot":"","sources":["../../src/neon/neonQuerier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,OAAO,WAAY,SAAQ,kBAAkB;IAItC;IACA;IAJX,IAAI,CAAa;IAEjB,YACW,OAAkC,EAClC,KAAoB;QAE7B,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;QAHzC,YAAO,GAAP,OAAO,CAA2B;QAClC,UAAK,GAAL,KAAK,CAAe;IAG/B,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAI,KAAa,EAAE,MAAkB;QAC7D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC,IAAW,CAAC;IACzB,CAAC;IAEQ,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,MAAkB;QAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAA8B,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAEQ,KAAK,CAAC,eAAe;QAC5B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { Pool, type PoolConfig } from '@neondatabase/serverless';
2
+ import { AbstractQuerierPool } from '../querier/index.js';
3
+ import type { ExtraOptions } from '../type/index.js';
4
+ import { NeonQuerier } from './neonQuerier.js';
5
+ export declare class NeonQuerierPool extends AbstractQuerierPool<NeonQuerier> {
6
+ readonly pool: Pool;
7
+ constructor(opts: PoolConfig, extra?: ExtraOptions);
8
+ getQuerier(): Promise<NeonQuerier>;
9
+ end(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=neonQuerierPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neonQuerierPool.d.ts","sourceRoot":"","sources":["../../src/neon/neonQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,eAAgB,SAAQ,mBAAmB,CAAC,WAAW,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAER,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,YAAY;IAK5C,UAAU;IAIV,GAAG;CAGV"}
@@ -0,0 +1,17 @@
1
+ import { Pool } from '@neondatabase/serverless';
2
+ import { AbstractQuerierPool } from '../querier/index.js';
3
+ import { NeonQuerier } from './neonQuerier.js';
4
+ export class NeonQuerierPool extends AbstractQuerierPool {
5
+ pool;
6
+ constructor(opts, extra) {
7
+ super('postgres', extra);
8
+ this.pool = new Pool(opts);
9
+ }
10
+ async getQuerier() {
11
+ return new NeonQuerier(() => this.pool.connect(), this.extra);
12
+ }
13
+ async end() {
14
+ await this.pool.end();
15
+ }
16
+ }
17
+ //# sourceMappingURL=neonQuerierPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neonQuerierPool.js","sourceRoot":"","sources":["../../src/neon/neonQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,eAAgB,SAAQ,mBAAgC;IAC1D,IAAI,CAAO;IAEpB,YAAY,IAAgB,EAAE,KAAoB;QAChD,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC;CACF"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "homepage": "https://uql.app",
4
4
  "description": "One Language. Frontend to Backend.",
5
5
  "license": "MIT",
6
- "version": "3.3.0",
6
+ "version": "3.4.0",
7
7
  "type": "module",
8
8
  "main": "./dist/index.js",
9
9
  "types": "./dist/index.d.ts",
@@ -32,7 +32,10 @@
32
32
  "types": "./dist/browser/index.d.ts",
33
33
  "import": "./dist/browser/index.js",
34
34
  "default": "./dist/browser/uql-browser.min.js"
35
- }
35
+ },
36
+ "./libsql": "./dist/libsql/index.js",
37
+ "./neon": "./dist/neon/index.js",
38
+ "./d1": "./dist/d1/index.js"
36
39
  },
37
40
  "files": [
38
41
  "dist",
@@ -54,6 +57,8 @@
54
57
  "tslib": "^2.8.1"
55
58
  },
56
59
  "peerDependencies": {
60
+ "@libsql/client": ">=0.6.0",
61
+ "@neondatabase/serverless": ">=0.9.0",
57
62
  "better-sqlite3": ">=9.0.0",
58
63
  "express": ">=5.0.0",
59
64
  "mariadb": ">=3.0.0",
@@ -79,9 +84,17 @@
79
84
  },
80
85
  "better-sqlite3": {
81
86
  "optional": true
87
+ },
88
+ "@libsql/client": {
89
+ "optional": true
90
+ },
91
+ "@neondatabase/serverless": {
92
+ "optional": true
82
93
  }
83
94
  },
84
95
  "devDependencies": {
96
+ "@libsql/client": "latest",
97
+ "@neondatabase/serverless": "latest",
85
98
  "@swc/helpers": "^0.5.18",
86
99
  "@types/better-sqlite3": "^7.6.13",
87
100
  "@types/express": "^5.0.6",
@@ -133,5 +146,5 @@
133
146
  "publishConfig": {
134
147
  "access": "public"
135
148
  },
136
- "gitHead": "6264ff559ef5ed7797bfd565f1699cdf96a379bc"
149
+ "gitHead": "54b9d31df520a8647dd1d7df366a4fc58a9637d1"
137
150
  }