@duckcodeailabs/dql-connectors 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 (58) hide show
  1. package/LICENSE +123 -0
  2. package/dist/connection-pool.d.ts +11 -0
  3. package/dist/connection-pool.d.ts.map +1 -0
  4. package/dist/connection-pool.js +99 -0
  5. package/dist/connection-pool.js.map +1 -0
  6. package/dist/connector.d.ts +26 -0
  7. package/dist/connector.d.ts.map +1 -0
  8. package/dist/connector.js +2 -0
  9. package/dist/connector.js.map +1 -0
  10. package/dist/drivers/bigquery.d.ts +11 -0
  11. package/dist/drivers/bigquery.d.ts.map +1 -0
  12. package/dist/drivers/bigquery.js +166 -0
  13. package/dist/drivers/bigquery.js.map +1 -0
  14. package/dist/drivers/duckdb.d.ts +12 -0
  15. package/dist/drivers/duckdb.d.ts.map +1 -0
  16. package/dist/drivers/duckdb.js +103 -0
  17. package/dist/drivers/duckdb.js.map +1 -0
  18. package/dist/drivers/file.d.ts +24 -0
  19. package/dist/drivers/file.d.ts.map +1 -0
  20. package/dist/drivers/file.js +38 -0
  21. package/dist/drivers/file.js.map +1 -0
  22. package/dist/drivers/mssql.d.ts +12 -0
  23. package/dist/drivers/mssql.d.ts.map +1 -0
  24. package/dist/drivers/mssql.js +132 -0
  25. package/dist/drivers/mssql.js.map +1 -0
  26. package/dist/drivers/mysql.d.ts +11 -0
  27. package/dist/drivers/mysql.d.ts.map +1 -0
  28. package/dist/drivers/mysql.js +102 -0
  29. package/dist/drivers/mysql.js.map +1 -0
  30. package/dist/drivers/postgresql.d.ts +11 -0
  31. package/dist/drivers/postgresql.d.ts.map +1 -0
  32. package/dist/drivers/postgresql.js +83 -0
  33. package/dist/drivers/postgresql.js.map +1 -0
  34. package/dist/drivers/snowflake.d.ts +14 -0
  35. package/dist/drivers/snowflake.d.ts.map +1 -0
  36. package/dist/drivers/snowflake.js +154 -0
  37. package/dist/drivers/snowflake.js.map +1 -0
  38. package/dist/drivers/sqlite.d.ts +11 -0
  39. package/dist/drivers/sqlite.d.ts.map +1 -0
  40. package/dist/drivers/sqlite.js +71 -0
  41. package/dist/drivers/sqlite.js.map +1 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +5 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/query-executor.d.ts +13 -0
  47. package/dist/query-executor.d.ts.map +1 -0
  48. package/dist/query-executor.js +24 -0
  49. package/dist/query-executor.js.map +1 -0
  50. package/dist/result-types.d.ts +14 -0
  51. package/dist/result-types.d.ts.map +1 -0
  52. package/dist/result-types.js +2 -0
  53. package/dist/result-types.js.map +1 -0
  54. package/dist/sql-params.d.ts +17 -0
  55. package/dist/sql-params.d.ts.map +1 -0
  56. package/dist/sql-params.js +89 -0
  57. package/dist/sql-params.js.map +1 -0
  58. package/package.json +48 -0
@@ -0,0 +1,71 @@
1
+ import Database from 'better-sqlite3';
2
+ export class SQLiteConnector {
3
+ driverName = 'sqlite';
4
+ db = null;
5
+ async connect(config) {
6
+ const filepath = config.filepath ?? config.database ?? ':memory:';
7
+ this.db = new Database(filepath);
8
+ this.db.pragma('journal_mode = WAL');
9
+ }
10
+ async execute(sql, params) {
11
+ if (!this.db) {
12
+ throw new Error('SQLite connector not connected. Call connect() first.');
13
+ }
14
+ const startTime = performance.now();
15
+ const stmt = this.db.prepare(sql);
16
+ if (stmt.reader) {
17
+ const rows = (params ? stmt.all(...params) : stmt.all());
18
+ const executionTimeMs = performance.now() - startTime;
19
+ const columns = rows.length > 0
20
+ ? Object.keys(rows[0]).map((name) => ({
21
+ name,
22
+ type: inferType(rows[0][name]),
23
+ driverType: 'unknown',
24
+ }))
25
+ : [];
26
+ return {
27
+ columns,
28
+ rows,
29
+ rowCount: rows.length,
30
+ executionTimeMs,
31
+ };
32
+ }
33
+ const result = params ? stmt.run(...params) : stmt.run();
34
+ const executionTimeMs = performance.now() - startTime;
35
+ return {
36
+ columns: [],
37
+ rows: [],
38
+ rowCount: result.changes,
39
+ executionTimeMs,
40
+ };
41
+ }
42
+ async disconnect() {
43
+ if (this.db) {
44
+ this.db.close();
45
+ this.db = null;
46
+ }
47
+ }
48
+ async ping() {
49
+ if (!this.db)
50
+ return false;
51
+ try {
52
+ this.db.prepare('SELECT 1').get();
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ }
60
+ function inferType(value) {
61
+ if (value === null)
62
+ return 'null';
63
+ if (typeof value === 'number')
64
+ return 'number';
65
+ if (typeof value === 'boolean')
66
+ return 'boolean';
67
+ if (typeof value === 'string')
68
+ return 'string';
69
+ return 'unknown';
70
+ }
71
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/drivers/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { DatabaseConnector, ConnectionConfig } from './connector.js';
2
+ export type { QueryResult, ColumnMeta, ColumnType, Row } from './result-types.js';
3
+ export { ConnectionPoolManager } from './connection-pool.js';
4
+ export { QueryExecutor } from './query-executor.js';
5
+ export type { SQLParamSpec } from './sql-params.js';
6
+ export { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // @dql/connectors - DQL Database Connectors
2
+ export { ConnectionPoolManager } from './connection-pool.js';
3
+ export { QueryExecutor } from './query-executor.js';
4
+ export { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAI5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { DatabaseConnector, ConnectionConfig } from './connector.js';
2
+ import type { QueryResult } from './result-types.js';
3
+ import { ConnectionPoolManager } from './connection-pool.js';
4
+ import { type SQLParamSpec } from './sql-params.js';
5
+ export declare class QueryExecutor {
6
+ private pool;
7
+ constructor(pool?: ConnectionPoolManager);
8
+ getConnector(config: ConnectionConfig): Promise<DatabaseConnector>;
9
+ executeQuery(sql: string, params: SQLParamSpec[], variables: Record<string, unknown>, config: ConnectionConfig): Promise<QueryResult>;
10
+ executePositional(sql: string, paramValues: unknown[], config: ConnectionConfig): Promise<QueryResult>;
11
+ disconnect(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=query-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-executor.d.ts","sourceRoot":"","sources":["../src/query-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhG,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAwB;gBAExB,IAAI,CAAC,EAAE,qBAAqB;IAIlC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIlE,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EAAE,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,WAAW,CAAC;IAKjB,iBAAiB,CACrB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,OAAO,EAAE,EACtB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,WAAW,CAAC;IASjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -0,0 +1,24 @@
1
+ import { ConnectionPoolManager } from './connection-pool.js';
2
+ import { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
3
+ export class QueryExecutor {
4
+ pool;
5
+ constructor(pool) {
6
+ this.pool = pool ?? new ConnectionPoolManager();
7
+ }
8
+ async getConnector(config) {
9
+ return this.pool.getConnector(config);
10
+ }
11
+ async executeQuery(sql, params, variables, config) {
12
+ const paramValues = buildParamValues(params ?? [], variables ?? {});
13
+ return this.executePositional(sql, paramValues, config);
14
+ }
15
+ async executePositional(sql, paramValues, config) {
16
+ const connector = await this.pool.getConnector(config);
17
+ const normalizedSQL = normalizeSQLPlaceholders(sql, config.driver);
18
+ return connector.execute(normalizedSQL, paramValues && paramValues.length > 0 ? paramValues : undefined);
19
+ }
20
+ async disconnect() {
21
+ await this.pool.disconnectAll();
22
+ }
23
+ }
24
+ //# sourceMappingURL=query-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-executor.js","sourceRoot":"","sources":["../src/query-executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAqB,MAAM,iBAAiB,CAAC;AAEhG,MAAM,OAAO,aAAa;IAChB,IAAI,CAAwB;IAEpC,YAAY,IAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,qBAAqB,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAwB;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAAW,EACX,MAAsB,EACtB,SAAkC,EAClC,MAAwB;QAExB,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAW,EACX,WAAsB,EACtB,MAAwB;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC,OAAO,CACtB,aAAa,EACb,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'null' | 'unknown';
2
+ export interface ColumnMeta {
3
+ name: string;
4
+ type: ColumnType;
5
+ driverType: string;
6
+ }
7
+ export type Row = Record<string, unknown>;
8
+ export interface QueryResult {
9
+ columns: ColumnMeta[];
10
+ rows: Row[];
11
+ rowCount: number;
12
+ executionTimeMs: number;
13
+ }
14
+ //# sourceMappingURL=result-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-types.d.ts","sourceRoot":"","sources":["../src/result-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=result-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-types.js","sourceRoot":"","sources":["../src/result-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { ConnectionConfig } from './connector.js';
2
+ export type SQLParamSpec = {
3
+ name: string;
4
+ position: number;
5
+ literalValue?: unknown;
6
+ };
7
+ export declare function buildParamValues(params: SQLParamSpec[], variables: Record<string, unknown>): unknown[];
8
+ /**
9
+ * Normalize "$N" placeholders emitted by the compiler to the placeholder syntax
10
+ * expected by each driver.
11
+ *
12
+ * - PostgreSQL: "$1" (no change)
13
+ * - MSSQL: keep "$N" (driver rewrites to "@pN" while binding)
14
+ * - Others (Snowflake/BigQuery/MySQL/SQLite/DuckDB): "?" positional
15
+ */
16
+ export declare function normalizeSQLPlaceholders(sql: string, driver: ConnectionConfig['driver']): string;
17
+ //# sourceMappingURL=sql-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-params.d.ts","sourceRoot":"","sources":["../src/sql-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EAAE,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,EAAE,CAaX;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,MAAM,CAqER"}
@@ -0,0 +1,89 @@
1
+ export function buildParamValues(params, variables) {
2
+ if (!params || params.length === 0)
3
+ return [];
4
+ return [...params]
5
+ .sort((a, b) => a.position - b.position)
6
+ .map((p) => {
7
+ if (Object.prototype.hasOwnProperty.call(variables, p.name)) {
8
+ return variables[p.name];
9
+ }
10
+ if (Object.prototype.hasOwnProperty.call(p, 'literalValue')) {
11
+ return p.literalValue;
12
+ }
13
+ return undefined;
14
+ });
15
+ }
16
+ /**
17
+ * Normalize "$N" placeholders emitted by the compiler to the placeholder syntax
18
+ * expected by each driver.
19
+ *
20
+ * - PostgreSQL: "$1" (no change)
21
+ * - MSSQL: keep "$N" (driver rewrites to "@pN" while binding)
22
+ * - Others (Snowflake/BigQuery/MySQL/SQLite/DuckDB): "?" positional
23
+ */
24
+ export function normalizeSQLPlaceholders(sql, driver) {
25
+ if (!sql)
26
+ return sql;
27
+ if (driver === 'postgresql' || driver === 'mssql')
28
+ return sql;
29
+ // Replace $N -> ? outside quoted regions.
30
+ let out = '';
31
+ let i = 0;
32
+ let inSingle = false;
33
+ let inDouble = false;
34
+ let inBacktick = false;
35
+ while (i < sql.length) {
36
+ const ch = sql[i];
37
+ // Handle quote toggles with basic SQL escaping.
38
+ if (ch === "'" && !inDouble && !inBacktick) {
39
+ out += ch;
40
+ // SQL single-quote escape: '' inside string literal.
41
+ if (inSingle && sql[i + 1] === "'") {
42
+ out += "'";
43
+ i += 2;
44
+ continue;
45
+ }
46
+ inSingle = !inSingle;
47
+ i += 1;
48
+ continue;
49
+ }
50
+ if (ch === '"' && !inSingle && !inBacktick) {
51
+ out += ch;
52
+ // Identifier escape: "" inside quoted identifier.
53
+ if (inDouble && sql[i + 1] === '"') {
54
+ out += '"';
55
+ i += 2;
56
+ continue;
57
+ }
58
+ inDouble = !inDouble;
59
+ i += 1;
60
+ continue;
61
+ }
62
+ if (ch === '`' && !inSingle && !inDouble) {
63
+ out += ch;
64
+ // BigQuery identifier escape: `` inside backticks.
65
+ if (inBacktick && sql[i + 1] === '`') {
66
+ out += '`';
67
+ i += 2;
68
+ continue;
69
+ }
70
+ inBacktick = !inBacktick;
71
+ i += 1;
72
+ continue;
73
+ }
74
+ if (!inSingle && !inDouble && !inBacktick && ch === '$') {
75
+ let j = i + 1;
76
+ if (j < sql.length && sql[j] >= '0' && sql[j] <= '9') {
77
+ while (j < sql.length && sql[j] >= '0' && sql[j] <= '9')
78
+ j++;
79
+ out += '?';
80
+ i = j;
81
+ continue;
82
+ }
83
+ }
84
+ out += ch;
85
+ i += 1;
86
+ }
87
+ return out;
88
+ }
89
+ //# sourceMappingURL=sql-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-params.js","sourceRoot":"","sources":["../src/sql-params.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@duckcodeailabs/dql-connectors",
3
+ "version": "0.1.0",
4
+ "description": "DQL database connectors: PostgreSQL, SQLite, MySQL, BigQuery, Snowflake",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/duckcode-ai/dql.git",
21
+ "directory": "packages/dql-connectors"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "@google-cloud/bigquery": "^7.5.0",
28
+ "better-sqlite3": "^11.7.0",
29
+ "duckdb": "^1.1.0",
30
+ "mssql": "^11.0.0",
31
+ "mysql2": "^3.9.0",
32
+ "pg": "^8.13.0",
33
+ "snowflake-sdk": "^1.12.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/better-sqlite3": "^7.6.0",
37
+ "@types/mssql": "^9.1.9",
38
+ "@types/node": "^22.0.0",
39
+ "@types/pg": "^8.11.0",
40
+ "typescript": "^5.7.0",
41
+ "vitest": "^3.0.0"
42
+ },
43
+ "scripts": {
44
+ "build": "rm -rf dist tsconfig.tsbuildinfo && tsc",
45
+ "test": "vitest run --passWithNoTests",
46
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
47
+ }
48
+ }