hazo_connect 1.0.0 → 2.0.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/adapters/sqlite-adapter.d.ts +34 -38
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +286 -44
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/sqlite/query-translator.d.ts +37 -0
- package/dist/sqlite/query-translator.d.ts.map +1 -0
- package/dist/sqlite/query-translator.js +426 -0
- package/dist/sqlite/query-translator.js.map +1 -0
- package/package.json +5 -2
|
@@ -1,49 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Purpose: SQLite adapter
|
|
2
|
+
* Purpose: SQLite adapter powered by sql.js for parity with the PostgREST adapter.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Expected config structure:
|
|
8
|
-
* {
|
|
9
|
-
* sqlite: {
|
|
10
|
-
* database_path: string, // Path to SQLite database file
|
|
11
|
-
* read_only?: boolean // Optional read-only mode
|
|
12
|
-
* }
|
|
13
|
-
* }
|
|
4
|
+
* The adapter supports in-memory and file-backed databases, translating QueryBuilder
|
|
5
|
+
* instructions into parameterised SQL statements and persisting results when required.
|
|
14
6
|
*/
|
|
15
7
|
import type { HazoConnectAdapter, Logger } from '../types';
|
|
16
8
|
import { BaseAdapter } from './base-adapter';
|
|
17
9
|
import { QueryBuilder } from '../query-builder';
|
|
18
|
-
/**
|
|
19
|
-
* SQLite adapter implementation (stub)
|
|
20
|
-
*/
|
|
21
10
|
export declare class SqliteAdapter extends BaseAdapter implements HazoConnectAdapter {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
11
|
+
private readonly sqliteConfig;
|
|
12
|
+
private readonly isReadOnlyMode;
|
|
13
|
+
private readonly wasmDirectory;
|
|
14
|
+
private readonly sqlJsPromise;
|
|
15
|
+
private readonly databasePromise;
|
|
16
|
+
private dbInstance?;
|
|
17
|
+
private readonly databasePath?;
|
|
27
18
|
constructor(config: any, logger?: Logger);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* @param body - Request body
|
|
33
|
-
* @returns Promise with query results
|
|
34
|
-
*/
|
|
35
|
-
query(builder: QueryBuilder, method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any): Promise<any>;
|
|
36
|
-
/**
|
|
37
|
-
* Execute a raw query
|
|
38
|
-
* @param endpoint - Raw endpoint string (not applicable for SQLite)
|
|
39
|
-
* @param options - Request options
|
|
40
|
-
* @returns Promise with query results
|
|
41
|
-
*/
|
|
42
|
-
rawQuery(endpoint: string, options?: RequestInit): Promise<any>;
|
|
43
|
-
/**
|
|
44
|
-
* Get the adapter's configuration
|
|
45
|
-
* @returns Promise with adapter-specific config
|
|
46
|
-
*/
|
|
19
|
+
query(builder: QueryBuilder, method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: unknown): Promise<any>;
|
|
20
|
+
rawQuery(sql: string, options?: RequestInit & {
|
|
21
|
+
params?: unknown[];
|
|
22
|
+
}): Promise<any>;
|
|
47
23
|
getConfig(): Promise<any>;
|
|
24
|
+
private executeSelect;
|
|
25
|
+
private executeInsert;
|
|
26
|
+
private executeUpdate;
|
|
27
|
+
private executeDelete;
|
|
28
|
+
private normalizeConfig;
|
|
29
|
+
private resolveWasmDirectory;
|
|
30
|
+
private loadSqlJs;
|
|
31
|
+
private initializeDatabase;
|
|
32
|
+
private getDatabase;
|
|
33
|
+
private executeStatements;
|
|
34
|
+
private executeStatement;
|
|
35
|
+
private persistDatabase;
|
|
36
|
+
private ensureWritable;
|
|
37
|
+
private normalizeInsertBody;
|
|
38
|
+
private normalizeUpdateBody;
|
|
39
|
+
private normalizeRawParams;
|
|
40
|
+
private isMutatingSql;
|
|
41
|
+
private translateWithHandling;
|
|
42
|
+
private handleSqliteError;
|
|
43
|
+
private isPlainObject;
|
|
48
44
|
}
|
|
49
45
|
//# sourceMappingURL=sqlite-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/sqlite-adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAoB/C,qBAAa,aAAc,SAAQ,WAAY,YAAW,kBAAkB;IAC1E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IACxD,OAAO,CAAC,UAAU,CAAC,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAQ;gBAE1B,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAmBlC,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,GAAG,CAAC;IA4BT,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAW,GAAG;QAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAO,GACjD,OAAO,CAAC,GAAG,CAAC;IA4BT,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;YAMjB,aAAa;YAcb,aAAa;YAmBb,aAAa;YAoBb,aAAa;IAiB3B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,SAAS;YAMH,kBAAkB;YAmClB,WAAW;IAWzB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,gBAAgB;YAsBV,eAAe;IAU7B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -1,60 +1,302 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Purpose: SQLite adapter
|
|
3
|
+
* Purpose: SQLite adapter powered by sql.js for parity with the PostgREST adapter.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Expected config structure:
|
|
9
|
-
* {
|
|
10
|
-
* sqlite: {
|
|
11
|
-
* database_path: string, // Path to SQLite database file
|
|
12
|
-
* read_only?: boolean // Optional read-only mode
|
|
13
|
-
* }
|
|
14
|
-
* }
|
|
5
|
+
* The adapter supports in-memory and file-backed databases, translating QueryBuilder
|
|
6
|
+
* instructions into parameterised SQL statements and persisting results when required.
|
|
15
7
|
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
16
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
12
|
exports.SqliteAdapter = void 0;
|
|
13
|
+
const fs_1 = __importDefault(require("fs"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const module_1 = require("module");
|
|
16
|
+
const sql_js_1 = __importDefault(require("sql.js"));
|
|
18
17
|
const base_adapter_1 = require("./base-adapter");
|
|
19
18
|
const types_1 = require("../types");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*/
|
|
19
|
+
const query_translator_1 = require("../sqlite/query-translator");
|
|
20
|
+
const nodeRequire = (0, module_1.createRequire)(__filename);
|
|
23
21
|
class SqliteAdapter extends base_adapter_1.BaseAdapter {
|
|
24
|
-
/**
|
|
25
|
-
* Constructor
|
|
26
|
-
* @param config - SQLite configuration
|
|
27
|
-
* @param logger - Optional logger instance
|
|
28
|
-
*/
|
|
29
22
|
constructor(config, logger) {
|
|
30
23
|
super(config, logger);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
this.sqliteConfig = this.normalizeConfig(config);
|
|
25
|
+
this.isReadOnlyMode = Boolean(this.sqliteConfig.read_only);
|
|
26
|
+
this.databasePath = this.sqliteConfig.database_path;
|
|
27
|
+
this.wasmDirectory = this.resolveWasmDirectory();
|
|
28
|
+
if (this.isReadOnlyMode && !this.databasePath) {
|
|
29
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, "SQLite adapter requires 'database_path' when read_only is enabled");
|
|
30
|
+
}
|
|
31
|
+
this.sqlJsPromise = this.loadSqlJs();
|
|
32
|
+
this.databasePromise = this.initializeDatabase();
|
|
33
|
+
}
|
|
40
34
|
async query(builder, method = 'GET', body) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
35
|
+
const normalizedMethod = method.toUpperCase();
|
|
36
|
+
try {
|
|
37
|
+
switch (normalizedMethod) {
|
|
38
|
+
case 'GET':
|
|
39
|
+
return await this.executeSelect(builder);
|
|
40
|
+
case 'POST':
|
|
41
|
+
this.ensureWritable();
|
|
42
|
+
return await this.executeInsert(builder, body);
|
|
43
|
+
case 'PUT':
|
|
44
|
+
case 'PATCH':
|
|
45
|
+
this.ensureWritable();
|
|
46
|
+
return await this.executeUpdate(builder, body);
|
|
47
|
+
case 'DELETE':
|
|
48
|
+
this.ensureWritable();
|
|
49
|
+
return await this.executeDelete(builder);
|
|
50
|
+
default:
|
|
51
|
+
this.throwError(types_1.ErrorCode.VALIDATION_ERROR, `Unsupported method '${method}' for SQLite adapter`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return this.handleSqliteError(error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async rawQuery(sql, options = {}) {
|
|
59
|
+
try {
|
|
60
|
+
const params = this.normalizeRawParams(options?.params);
|
|
61
|
+
const mutating = this.isMutatingSql(sql);
|
|
62
|
+
if (mutating) {
|
|
63
|
+
this.ensureWritable();
|
|
64
|
+
}
|
|
65
|
+
const database = await this.getDatabase();
|
|
66
|
+
const rows = this.executeStatement(database, sql, params);
|
|
67
|
+
if (mutating) {
|
|
68
|
+
await this.persistDatabase(database);
|
|
69
|
+
}
|
|
70
|
+
this.logQuery('SQLite raw query', {
|
|
71
|
+
sql,
|
|
72
|
+
params,
|
|
73
|
+
row_count: rows.length
|
|
74
|
+
});
|
|
75
|
+
return rows;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return this.handleSqliteError(error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
56
81
|
async getConfig() {
|
|
57
|
-
return
|
|
82
|
+
return { ...this.sqliteConfig };
|
|
83
|
+
}
|
|
84
|
+
// Query execution ---------------------------------------------------------------------------
|
|
85
|
+
async executeSelect(builder) {
|
|
86
|
+
const translation = this.translateWithHandling(() => (0, query_translator_1.translateSelect)(builder));
|
|
87
|
+
const database = await this.getDatabase();
|
|
88
|
+
const rows = this.executeStatements(database, [translation]);
|
|
89
|
+
this.logQuery('SQLite select', {
|
|
90
|
+
sql: translation.sql,
|
|
91
|
+
params: translation.params,
|
|
92
|
+
row_count: rows.length
|
|
93
|
+
});
|
|
94
|
+
return rows;
|
|
95
|
+
}
|
|
96
|
+
async executeInsert(builder, body) {
|
|
97
|
+
const payload = this.normalizeInsertBody(body);
|
|
98
|
+
const translation = this.translateWithHandling(() => (0, query_translator_1.translateInsert)(builder, payload));
|
|
99
|
+
const database = await this.getDatabase();
|
|
100
|
+
const rows = this.executeStatements(database, translation.statements);
|
|
101
|
+
await this.persistDatabase(database);
|
|
102
|
+
this.logQuery('SQLite insert', {
|
|
103
|
+
statements_executed: translation.statements.length,
|
|
104
|
+
row_count: rows.length
|
|
105
|
+
});
|
|
106
|
+
return rows;
|
|
107
|
+
}
|
|
108
|
+
async executeUpdate(builder, body) {
|
|
109
|
+
const updates = this.normalizeUpdateBody(body);
|
|
110
|
+
const translation = this.translateWithHandling(() => (0, query_translator_1.translateUpdate)(builder, updates));
|
|
111
|
+
const database = await this.getDatabase();
|
|
112
|
+
const rows = this.executeStatements(database, [translation]);
|
|
113
|
+
await this.persistDatabase(database);
|
|
114
|
+
this.logQuery('SQLite update', {
|
|
115
|
+
sql: translation.sql,
|
|
116
|
+
params: translation.params,
|
|
117
|
+
row_count: rows.length
|
|
118
|
+
});
|
|
119
|
+
return rows;
|
|
120
|
+
}
|
|
121
|
+
async executeDelete(builder) {
|
|
122
|
+
const translation = this.translateWithHandling(() => (0, query_translator_1.translateDelete)(builder));
|
|
123
|
+
const database = await this.getDatabase();
|
|
124
|
+
const rows = this.executeStatements(database, [translation]);
|
|
125
|
+
await this.persistDatabase(database);
|
|
126
|
+
this.logQuery('SQLite delete', {
|
|
127
|
+
sql: translation.sql,
|
|
128
|
+
row_count: rows.length
|
|
129
|
+
});
|
|
130
|
+
return rows;
|
|
131
|
+
}
|
|
132
|
+
// Database lifecycle -----------------------------------------------------------------------
|
|
133
|
+
normalizeConfig(config) {
|
|
134
|
+
const raw = config?.sqlite ? config.sqlite : config;
|
|
135
|
+
const initialSqlInput = raw?.initial_sql;
|
|
136
|
+
const initialSqlArray = Array.isArray(initialSqlInput)
|
|
137
|
+
? initialSqlInput
|
|
138
|
+
: initialSqlInput
|
|
139
|
+
? [initialSqlInput]
|
|
140
|
+
: [];
|
|
141
|
+
return {
|
|
142
|
+
database_path: raw?.database_path ? path_1.default.resolve(String(raw.database_path)) : undefined,
|
|
143
|
+
read_only: raw?.read_only === true,
|
|
144
|
+
initial_sql: initialSqlArray.map((statement) => String(statement)).filter(Boolean),
|
|
145
|
+
wasm_directory: raw?.wasm_directory ? path_1.default.resolve(String(raw.wasm_directory)) : undefined
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
resolveWasmDirectory() {
|
|
149
|
+
if (this.sqliteConfig.wasm_directory) {
|
|
150
|
+
return this.sqliteConfig.wasm_directory;
|
|
151
|
+
}
|
|
152
|
+
const resolved = nodeRequire.resolve('sql.js/dist/sql-wasm.wasm');
|
|
153
|
+
return path_1.default.dirname(resolved);
|
|
154
|
+
}
|
|
155
|
+
loadSqlJs() {
|
|
156
|
+
return (0, sql_js_1.default)({
|
|
157
|
+
locateFile: (file) => path_1.default.join(this.wasmDirectory, file)
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async initializeDatabase() {
|
|
161
|
+
const SQL = await this.sqlJsPromise;
|
|
162
|
+
const databasePath = this.databasePath;
|
|
163
|
+
let database;
|
|
164
|
+
const fileExists = Boolean(databasePath && fs_1.default.existsSync(databasePath));
|
|
165
|
+
if (fileExists && databasePath) {
|
|
166
|
+
const buffer = await fs_1.default.promises.readFile(databasePath);
|
|
167
|
+
database = new SQL.Database(new Uint8Array(buffer));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
if (this.isReadOnlyMode && databasePath) {
|
|
171
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, `SQLite database not found at '${databasePath}' while read_only is enabled`);
|
|
172
|
+
}
|
|
173
|
+
database = new SQL.Database();
|
|
174
|
+
if (this.sqliteConfig.initial_sql?.length) {
|
|
175
|
+
for (const statement of this.sqliteConfig.initial_sql) {
|
|
176
|
+
database.exec(statement);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (databasePath && !this.isReadOnlyMode) {
|
|
180
|
+
await this.persistDatabase(database);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
this.dbInstance = database;
|
|
184
|
+
return database;
|
|
185
|
+
}
|
|
186
|
+
async getDatabase() {
|
|
187
|
+
if (this.dbInstance) {
|
|
188
|
+
return this.dbInstance;
|
|
189
|
+
}
|
|
190
|
+
this.dbInstance = await this.databasePromise;
|
|
191
|
+
return this.dbInstance;
|
|
192
|
+
}
|
|
193
|
+
// Statement execution ----------------------------------------------------------------------
|
|
194
|
+
executeStatements(database, statements) {
|
|
195
|
+
const results = [];
|
|
196
|
+
for (const statement of statements) {
|
|
197
|
+
results.push(...this.executeStatement(database, statement.sql, statement.params));
|
|
198
|
+
}
|
|
199
|
+
return results;
|
|
200
|
+
}
|
|
201
|
+
executeStatement(database, sql, params) {
|
|
202
|
+
let statement;
|
|
203
|
+
try {
|
|
204
|
+
statement = database.prepare(sql);
|
|
205
|
+
if (params && params.length) {
|
|
206
|
+
statement.bind(params);
|
|
207
|
+
}
|
|
208
|
+
const rows = [];
|
|
209
|
+
while (statement.step()) {
|
|
210
|
+
rows.push(statement.getAsObject());
|
|
211
|
+
}
|
|
212
|
+
return rows;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
if (statement) {
|
|
219
|
+
statement.free();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async persistDatabase(database) {
|
|
224
|
+
if (!this.databasePath || this.isReadOnlyMode) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const data = database.export();
|
|
228
|
+
await fs_1.default.promises.mkdir(path_1.default.dirname(this.databasePath), { recursive: true });
|
|
229
|
+
await fs_1.default.promises.writeFile(this.databasePath, Buffer.from(data));
|
|
230
|
+
}
|
|
231
|
+
ensureWritable() {
|
|
232
|
+
if (this.isReadOnlyMode) {
|
|
233
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'SQLite database is configured as read-only and cannot accept write operations');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Payload helpers --------------------------------------------------------------------------
|
|
237
|
+
normalizeInsertBody(body) {
|
|
238
|
+
if (Array.isArray(body)) {
|
|
239
|
+
if (!body.length) {
|
|
240
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Insert payload array cannot be empty');
|
|
241
|
+
}
|
|
242
|
+
return body.map(row => {
|
|
243
|
+
if (!this.isPlainObject(row)) {
|
|
244
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Insert payload array items must be plain objects');
|
|
245
|
+
}
|
|
246
|
+
return row;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (this.isPlainObject(body)) {
|
|
250
|
+
return body;
|
|
251
|
+
}
|
|
252
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Insert payload must be an object or array of objects');
|
|
253
|
+
}
|
|
254
|
+
normalizeUpdateBody(body) {
|
|
255
|
+
if (!this.isPlainObject(body)) {
|
|
256
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Update payload must be an object');
|
|
257
|
+
}
|
|
258
|
+
const updates = body;
|
|
259
|
+
if (Object.keys(updates).length === 0) {
|
|
260
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'Update payload must include at least one column');
|
|
261
|
+
}
|
|
262
|
+
return updates;
|
|
263
|
+
}
|
|
264
|
+
normalizeRawParams(params) {
|
|
265
|
+
if (params === undefined || params === null) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
if (!Array.isArray(params)) {
|
|
269
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, 'SQLite rawQuery params must be an array');
|
|
270
|
+
}
|
|
271
|
+
return params;
|
|
272
|
+
}
|
|
273
|
+
isMutatingSql(sql) {
|
|
274
|
+
const keyword = sql.trim().split(/\s+/)[0]?.toUpperCase() ?? '';
|
|
275
|
+
return ['INSERT', 'UPDATE', 'DELETE', 'REPLACE', 'CREATE', 'DROP', 'ALTER'].includes(keyword);
|
|
276
|
+
}
|
|
277
|
+
translateWithHandling(translate) {
|
|
278
|
+
try {
|
|
279
|
+
return translate();
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (error instanceof query_translator_1.SqliteTranslationError) {
|
|
283
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, error.message);
|
|
284
|
+
}
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
handleSqliteError(error) {
|
|
289
|
+
if (error instanceof query_translator_1.SqliteTranslationError) {
|
|
290
|
+
this.throwError(types_1.ErrorCode.CONFIG_ERROR, error.message);
|
|
291
|
+
}
|
|
292
|
+
if (error?.code) {
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
296
|
+
this.throwError(types_1.ErrorCode.QUERY_ERROR, `SQLite request failed: ${message}`, undefined, error);
|
|
297
|
+
}
|
|
298
|
+
isPlainObject(value) {
|
|
299
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
58
300
|
}
|
|
59
301
|
}
|
|
60
302
|
exports.SqliteAdapter = SqliteAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/sqlite-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAGH,iDAA4C;AAE5C,oCAAoC;AAEpC;;GAEG;AACH,MAAa,aAAc,SAAQ,0BAAW;IAC5C;;;;OAIG;IACH,YAAY,MAAW,EAAE,MAAe;QACtC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACrB,gDAAgD;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CACT,OAAqB,EACrB,SAAsD,KAAK,EAC3D,IAAU;QAEV,IAAI,CAAC,UAAU,CACb,iBAAS,CAAC,eAAe,EACzB,8EAA8E,CAC/E,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAuB,EAAE;QACxD,IAAI,CAAC,UAAU,CACb,iBAAS,CAAC,eAAe,EACzB,8EAA8E,CAC/E,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3D,CAAC;CACF;AAjDD,sCAiDC"}
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { QueryBuilder } from "../query-builder";
|
|
2
|
+
/**
|
|
3
|
+
* Error raised when translation from QueryBuilder to SQL fails due to invalid configuration.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SqliteTranslationError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Represents a single SQL statement with bound parameters.
|
|
10
|
+
*/
|
|
11
|
+
export interface TranslatedQuery {
|
|
12
|
+
sql: string;
|
|
13
|
+
params: unknown[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Represents one or more INSERT statements generated from a payload.
|
|
17
|
+
*/
|
|
18
|
+
export interface InsertTranslation {
|
|
19
|
+
statements: TranslatedQuery[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Translate a QueryBuilder instance into a SELECT statement.
|
|
23
|
+
*/
|
|
24
|
+
export declare function translateSelect(builder: QueryBuilder): TranslatedQuery;
|
|
25
|
+
/**
|
|
26
|
+
* Translate an insert payload into one or more INSERT statements.
|
|
27
|
+
*/
|
|
28
|
+
export declare function translateInsert(builder: QueryBuilder, rowsInput: Record<string, unknown> | Array<Record<string, unknown>>): InsertTranslation;
|
|
29
|
+
/**
|
|
30
|
+
* Translate an update payload into an UPDATE statement.
|
|
31
|
+
*/
|
|
32
|
+
export declare function translateUpdate(builder: QueryBuilder, updates: Record<string, unknown>): TranslatedQuery;
|
|
33
|
+
/**
|
|
34
|
+
* Translate delete instructions into a DELETE statement.
|
|
35
|
+
*/
|
|
36
|
+
export declare function translateDelete(builder: QueryBuilder): TranslatedQuery;
|
|
37
|
+
//# sourceMappingURL=query-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-translator.d.ts","sourceRoot":"","sources":["../../src/lib/sqlite/query-translator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,OAAO,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAsBtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClE,iBAAiB,CAoCnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,eAAe,CAkBjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAUtE"}
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteTranslationError = void 0;
|
|
4
|
+
exports.translateSelect = translateSelect;
|
|
5
|
+
exports.translateInsert = translateInsert;
|
|
6
|
+
exports.translateUpdate = translateUpdate;
|
|
7
|
+
exports.translateDelete = translateDelete;
|
|
8
|
+
/**
|
|
9
|
+
* Error raised when translation from QueryBuilder to SQL fails due to invalid configuration.
|
|
10
|
+
*/
|
|
11
|
+
class SqliteTranslationError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "SqliteTranslationError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.SqliteTranslationError = SqliteTranslationError;
|
|
18
|
+
/**
|
|
19
|
+
* Translate a QueryBuilder instance into a SELECT statement.
|
|
20
|
+
*/
|
|
21
|
+
function translateSelect(builder) {
|
|
22
|
+
validateNestedSelects(builder);
|
|
23
|
+
const tableName = resolveTableName(builder);
|
|
24
|
+
const selectClause = buildSelectClause(builder.getSelectFields());
|
|
25
|
+
const joinClause = buildJoinClauses(builder.getJoins());
|
|
26
|
+
const whereClause = buildWhereClause(builder);
|
|
27
|
+
const orderClause = buildOrderClause(builder.getOrderBy());
|
|
28
|
+
const limitOffsetClause = buildLimitOffsetClause(builder.getLimit(), builder.getOffset());
|
|
29
|
+
const sqlParts = [
|
|
30
|
+
`SELECT ${selectClause}`,
|
|
31
|
+
`FROM ${quoteIdentifier(tableName)}`,
|
|
32
|
+
joinClause,
|
|
33
|
+
whereClause.clause,
|
|
34
|
+
orderClause,
|
|
35
|
+
limitOffsetClause
|
|
36
|
+
].filter(Boolean);
|
|
37
|
+
return {
|
|
38
|
+
sql: sqlParts.join(" ").trim(),
|
|
39
|
+
params: whereClause.params
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Translate an insert payload into one or more INSERT statements.
|
|
44
|
+
*/
|
|
45
|
+
function translateInsert(builder, rowsInput) {
|
|
46
|
+
const tableName = resolveTableName(builder);
|
|
47
|
+
const rows = Array.isArray(rowsInput) ? rowsInput : [rowsInput];
|
|
48
|
+
if (rows.length === 0) {
|
|
49
|
+
throw new SqliteTranslationError("Insert payload must contain at least one row");
|
|
50
|
+
}
|
|
51
|
+
const columns = Object.keys(rows[0]);
|
|
52
|
+
if (columns.length === 0) {
|
|
53
|
+
throw new SqliteTranslationError("Insert payload must include at least one column");
|
|
54
|
+
}
|
|
55
|
+
const quotedColumns = columns.map(quoteColumnName);
|
|
56
|
+
for (const row of rows) {
|
|
57
|
+
const rowColumnNames = Object.keys(row);
|
|
58
|
+
const allColumnsPresent = rowColumnNames.length === columns.length &&
|
|
59
|
+
rowColumnNames.every(columnName => columns.includes(columnName));
|
|
60
|
+
if (!allColumnsPresent) {
|
|
61
|
+
throw new SqliteTranslationError("All inserted rows must share the same set of columns");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const baseSql = `INSERT INTO ${quoteIdentifier(tableName)} (${quotedColumns.join(", ")}) VALUES (${columns
|
|
65
|
+
.map(() => "?")
|
|
66
|
+
.join(", ")}) RETURNING *`;
|
|
67
|
+
const statements = rows.map(row => ({
|
|
68
|
+
sql: baseSql,
|
|
69
|
+
params: columns.map(column => normalizeValue(row[column]))
|
|
70
|
+
}));
|
|
71
|
+
return { statements };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Translate an update payload into an UPDATE statement.
|
|
75
|
+
*/
|
|
76
|
+
function translateUpdate(builder, updates) {
|
|
77
|
+
const tableName = resolveTableName(builder);
|
|
78
|
+
const updateColumns = Object.keys(updates);
|
|
79
|
+
if (updateColumns.length === 0) {
|
|
80
|
+
throw new SqliteTranslationError("Update payload must include at least one column");
|
|
81
|
+
}
|
|
82
|
+
const setFragments = updateColumns.map(column => `${quoteColumnName(column)} = ?`);
|
|
83
|
+
const setParams = updateColumns.map(column => normalizeValue(updates[column]));
|
|
84
|
+
const whereClause = buildWhereClause(builder);
|
|
85
|
+
const sql = `UPDATE ${quoteIdentifier(tableName)} SET ${setFragments.join(", ")}${whereClause.clause} RETURNING *`;
|
|
86
|
+
return {
|
|
87
|
+
sql,
|
|
88
|
+
params: [...setParams, ...whereClause.params]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Translate delete instructions into a DELETE statement.
|
|
93
|
+
*/
|
|
94
|
+
function translateDelete(builder) {
|
|
95
|
+
const tableName = resolveTableName(builder);
|
|
96
|
+
const whereClause = buildWhereClause(builder);
|
|
97
|
+
const sql = `DELETE FROM ${quoteIdentifier(tableName)}${whereClause.clause} RETURNING *`;
|
|
98
|
+
return {
|
|
99
|
+
sql,
|
|
100
|
+
params: [...whereClause.params]
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Helper functions ---------------------------------------------------------------------------
|
|
104
|
+
function resolveTableName(builder) {
|
|
105
|
+
const table = builder.getTable();
|
|
106
|
+
if (!table) {
|
|
107
|
+
throw new SqliteTranslationError("A table name must be specified before executing a query");
|
|
108
|
+
}
|
|
109
|
+
return table;
|
|
110
|
+
}
|
|
111
|
+
function validateNestedSelects(builder) {
|
|
112
|
+
if (builder.getNestedSelects().length > 0) {
|
|
113
|
+
throw new SqliteTranslationError("Nested selects are not supported by the SQLite adapter yet");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function buildSelectClause(selectFields) {
|
|
117
|
+
if (!selectFields.length) {
|
|
118
|
+
return "*";
|
|
119
|
+
}
|
|
120
|
+
return selectFields.map(quoteSelectField).join(", ");
|
|
121
|
+
}
|
|
122
|
+
function buildJoinClauses(joins) {
|
|
123
|
+
if (!joins || joins.length === 0) {
|
|
124
|
+
return "";
|
|
125
|
+
}
|
|
126
|
+
const clauses = joins.map(join => {
|
|
127
|
+
const joinType = normalizeJoinType(join.type);
|
|
128
|
+
const tableSql = quoteJoinTarget(join.table);
|
|
129
|
+
const conditionSql = sanitizeJoinCondition(join.on);
|
|
130
|
+
return `${joinType} ${tableSql} ON ${conditionSql}`;
|
|
131
|
+
});
|
|
132
|
+
return ` ${clauses.join(" ")}`;
|
|
133
|
+
}
|
|
134
|
+
function buildWhereClause(builder) {
|
|
135
|
+
const params = [];
|
|
136
|
+
const clauses = [];
|
|
137
|
+
for (const condition of builder.getWhereConditions()) {
|
|
138
|
+
const { clause, params: conditionParams } = translateCondition(condition);
|
|
139
|
+
if (clause) {
|
|
140
|
+
clauses.push(clause);
|
|
141
|
+
params.push(...conditionParams);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const group of builder.getWhereOrConditions()) {
|
|
145
|
+
if (!group || group.length === 0) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const groupClauses = [];
|
|
149
|
+
const groupParams = [];
|
|
150
|
+
for (const condition of group) {
|
|
151
|
+
const { clause, params: conditionParams } = translateCondition(condition);
|
|
152
|
+
if (clause) {
|
|
153
|
+
groupClauses.push(clause);
|
|
154
|
+
groupParams.push(...conditionParams);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (groupClauses.length === 0) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const joinedGroup = groupClauses.length === 1 ? groupClauses[0] : groupClauses.map(c => `(${c})`).join(" OR ");
|
|
161
|
+
clauses.push(`(${joinedGroup})`);
|
|
162
|
+
params.push(...groupParams);
|
|
163
|
+
}
|
|
164
|
+
if (!clauses.length) {
|
|
165
|
+
return { clause: "", params };
|
|
166
|
+
}
|
|
167
|
+
return { clause: ` WHERE ${clauses.join(" AND ")}`, params };
|
|
168
|
+
}
|
|
169
|
+
function buildOrderClause(orderBy) {
|
|
170
|
+
if (!orderBy || orderBy.length === 0) {
|
|
171
|
+
return "";
|
|
172
|
+
}
|
|
173
|
+
const parts = orderBy.map(order => {
|
|
174
|
+
const direction = normalizeOrderDirection(order.direction);
|
|
175
|
+
return `${quoteQualifiedIdentifier(order.field)} ${direction}`;
|
|
176
|
+
});
|
|
177
|
+
return ` ORDER BY ${parts.join(", ")}`;
|
|
178
|
+
}
|
|
179
|
+
function buildLimitOffsetClause(limit, offset) {
|
|
180
|
+
const parts = [];
|
|
181
|
+
if (limit !== null && limit !== undefined) {
|
|
182
|
+
if (!Number.isInteger(limit) || limit < 0) {
|
|
183
|
+
throw new SqliteTranslationError("Limit must be a non-negative integer");
|
|
184
|
+
}
|
|
185
|
+
parts.push(`LIMIT ${limit}`);
|
|
186
|
+
}
|
|
187
|
+
if (offset !== null && offset !== undefined) {
|
|
188
|
+
if (!Number.isInteger(offset) || offset < 0) {
|
|
189
|
+
throw new SqliteTranslationError("Offset must be a non-negative integer");
|
|
190
|
+
}
|
|
191
|
+
parts.push(`OFFSET ${offset}`);
|
|
192
|
+
}
|
|
193
|
+
if (!parts.length) {
|
|
194
|
+
return "";
|
|
195
|
+
}
|
|
196
|
+
return ` ${parts.join(" ")}`;
|
|
197
|
+
}
|
|
198
|
+
function translateCondition(condition) {
|
|
199
|
+
const operator = condition.operator;
|
|
200
|
+
const field = quoteQualifiedIdentifier(condition.field);
|
|
201
|
+
const params = [];
|
|
202
|
+
const normalizedValue = normalizeValue(condition.value);
|
|
203
|
+
switch (operator) {
|
|
204
|
+
case "eq": {
|
|
205
|
+
if (condition.value === null || condition.value === undefined) {
|
|
206
|
+
return { clause: `${field} IS NULL`, params };
|
|
207
|
+
}
|
|
208
|
+
return { clause: `${field} = ?`, params: [normalizedValue] };
|
|
209
|
+
}
|
|
210
|
+
case "neq": {
|
|
211
|
+
if (condition.value === null || condition.value === undefined) {
|
|
212
|
+
return { clause: `${field} IS NOT NULL`, params };
|
|
213
|
+
}
|
|
214
|
+
return { clause: `${field} != ?`, params: [normalizedValue] };
|
|
215
|
+
}
|
|
216
|
+
case "gt":
|
|
217
|
+
return { clause: `${field} > ?`, params: [normalizedValue] };
|
|
218
|
+
case "gte":
|
|
219
|
+
return { clause: `${field} >= ?`, params: [normalizedValue] };
|
|
220
|
+
case "lt":
|
|
221
|
+
return { clause: `${field} < ?`, params: [normalizedValue] };
|
|
222
|
+
case "lte":
|
|
223
|
+
return { clause: `${field} <= ?`, params: [normalizedValue] };
|
|
224
|
+
case "like":
|
|
225
|
+
return { clause: `${field} LIKE ?`, params: [String(normalizedValue)] };
|
|
226
|
+
case "ilike":
|
|
227
|
+
return { clause: `LOWER(${field}) LIKE LOWER(?)`, params: [String(normalizedValue)] };
|
|
228
|
+
case "in": {
|
|
229
|
+
const values = Array.isArray(condition.value) ? condition.value : [condition.value];
|
|
230
|
+
if (!values.length) {
|
|
231
|
+
return { clause: "1=0", params: [] };
|
|
232
|
+
}
|
|
233
|
+
const placeholders = values.map(() => "?").join(", ");
|
|
234
|
+
return {
|
|
235
|
+
clause: `${field} IN (${placeholders})`,
|
|
236
|
+
params: values.map(normalizeValue)
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
case "is": {
|
|
240
|
+
const valueString = condition.value === null || condition.value === undefined
|
|
241
|
+
? "null"
|
|
242
|
+
: String(condition.value).toLowerCase();
|
|
243
|
+
if (valueString === "null") {
|
|
244
|
+
return { clause: `${field} IS NULL`, params };
|
|
245
|
+
}
|
|
246
|
+
if (valueString === "not.null" || valueString === "not null") {
|
|
247
|
+
return { clause: `${field} IS NOT NULL`, params };
|
|
248
|
+
}
|
|
249
|
+
throw new SqliteTranslationError(`Unsupported IS comparison value '${condition.value}'. Use 'null' or 'not.null'.`);
|
|
250
|
+
}
|
|
251
|
+
default:
|
|
252
|
+
throw new SqliteTranslationError(`Unsupported operator '${operator}' in WHERE clause. Use whereOr() for OR groupings.`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function normalizeOrderDirection(direction) {
|
|
256
|
+
const normalized = direction?.toString().toLowerCase();
|
|
257
|
+
if (normalized === "asc" || normalized === "desc") {
|
|
258
|
+
return normalized.toUpperCase();
|
|
259
|
+
}
|
|
260
|
+
throw new SqliteTranslationError(`Unsupported ORDER BY direction '${direction}'`);
|
|
261
|
+
}
|
|
262
|
+
function normalizeJoinType(type) {
|
|
263
|
+
const normalized = type?.toString().toLowerCase() ?? "inner";
|
|
264
|
+
if (normalized === "inner") {
|
|
265
|
+
return "INNER JOIN";
|
|
266
|
+
}
|
|
267
|
+
if (normalized === "left") {
|
|
268
|
+
return "LEFT JOIN";
|
|
269
|
+
}
|
|
270
|
+
if (normalized === "right") {
|
|
271
|
+
throw new SqliteTranslationError("SQLite does not support RIGHT JOIN operations");
|
|
272
|
+
}
|
|
273
|
+
throw new SqliteTranslationError(`Unsupported join type '${type}' for SQLite adapter`);
|
|
274
|
+
}
|
|
275
|
+
function quoteJoinTarget(target) {
|
|
276
|
+
const trimmed = target.trim();
|
|
277
|
+
const parts = trimmed.split(/\s+/);
|
|
278
|
+
if (parts.length === 1) {
|
|
279
|
+
return quoteIdentifier(parts[0]);
|
|
280
|
+
}
|
|
281
|
+
if (parts.length === 2) {
|
|
282
|
+
return `${quoteIdentifier(parts[0])} AS ${quoteIdentifier(parts[1])}`;
|
|
283
|
+
}
|
|
284
|
+
if (parts.length === 3 && parts[1].toLowerCase() === "as") {
|
|
285
|
+
return `${quoteIdentifier(parts[0])} AS ${quoteIdentifier(parts[2])}`;
|
|
286
|
+
}
|
|
287
|
+
throw new SqliteTranslationError(`Unsupported join table format '${target}'. Use 'table', 'table alias', or 'table AS alias'.`);
|
|
288
|
+
}
|
|
289
|
+
function sanitizeJoinCondition(condition) {
|
|
290
|
+
const parts = condition.split("=").map(part => part.trim());
|
|
291
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
292
|
+
throw new SqliteTranslationError(`Join conditions must be expressed as single-column equality (e.g. table_a.id = table_b.id). Received '${condition}'.`);
|
|
293
|
+
}
|
|
294
|
+
return `${quoteQualifiedIdentifier(parts[0])} = ${quoteQualifiedIdentifier(parts[1])}`;
|
|
295
|
+
}
|
|
296
|
+
function quoteSelectField(field) {
|
|
297
|
+
const trimmed = field.trim();
|
|
298
|
+
const { expression, alias } = extractSelectAlias(trimmed);
|
|
299
|
+
const formattedExpression = formatSelectExpression(expression);
|
|
300
|
+
if (!alias) {
|
|
301
|
+
return formattedExpression;
|
|
302
|
+
}
|
|
303
|
+
return `${formattedExpression} AS ${quoteIdentifier(alias)}`;
|
|
304
|
+
}
|
|
305
|
+
function quoteColumnName(column) {
|
|
306
|
+
if (column.includes(".")) {
|
|
307
|
+
throw new SqliteTranslationError(`Column names in insert/update payloads must not be qualified. Received '${column}'.`);
|
|
308
|
+
}
|
|
309
|
+
return quoteIdentifier(column);
|
|
310
|
+
}
|
|
311
|
+
const identifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
312
|
+
function quoteIdentifier(identifier) {
|
|
313
|
+
if (!identifierPattern.test(identifier)) {
|
|
314
|
+
throw new SqliteTranslationError(`Identifier '${identifier}' contains unsupported characters`);
|
|
315
|
+
}
|
|
316
|
+
return `"${identifier}"`;
|
|
317
|
+
}
|
|
318
|
+
function quoteQualifiedIdentifier(identifier) {
|
|
319
|
+
const parts = identifier.split(".");
|
|
320
|
+
if (parts.some(part => part === "*")) {
|
|
321
|
+
throw new SqliteTranslationError(`Wildcard selectors are only supported via 'table.*' syntax`);
|
|
322
|
+
}
|
|
323
|
+
return parts.map(quoteIdentifier).join(".");
|
|
324
|
+
}
|
|
325
|
+
function extractSelectAlias(field) {
|
|
326
|
+
const match = field.match(/^(.*)\s+as\s+([A-Za-z_][A-Za-z0-9_]*)$/i);
|
|
327
|
+
if (!match) {
|
|
328
|
+
return { expression: field };
|
|
329
|
+
}
|
|
330
|
+
const alias = match[2].trim();
|
|
331
|
+
if (!identifierPattern.test(alias)) {
|
|
332
|
+
throw new SqliteTranslationError(`Alias '${alias}' contains unsupported characters`);
|
|
333
|
+
}
|
|
334
|
+
return { expression: match[1].trim(), alias };
|
|
335
|
+
}
|
|
336
|
+
function formatSelectExpression(expression) {
|
|
337
|
+
const trimmed = expression.trim();
|
|
338
|
+
if (trimmed === "*") {
|
|
339
|
+
return "*";
|
|
340
|
+
}
|
|
341
|
+
const wildcardMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\.\*$/);
|
|
342
|
+
if (wildcardMatch) {
|
|
343
|
+
return `${quoteIdentifier(wildcardMatch[1])}.*`;
|
|
344
|
+
}
|
|
345
|
+
const functionMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\((.*)\)$/);
|
|
346
|
+
if (functionMatch) {
|
|
347
|
+
return formatFunctionCall(functionMatch[1], functionMatch[2]);
|
|
348
|
+
}
|
|
349
|
+
return quoteQualifiedIdentifier(trimmed);
|
|
350
|
+
}
|
|
351
|
+
function formatFunctionCall(functionName, rawArguments) {
|
|
352
|
+
if (!identifierPattern.test(functionName)) {
|
|
353
|
+
throw new SqliteTranslationError(`Function name '${functionName}' contains unsupported characters`);
|
|
354
|
+
}
|
|
355
|
+
const argumentText = rawArguments.trim();
|
|
356
|
+
if (!argumentText.length) {
|
|
357
|
+
throw new SqliteTranslationError(`Function '${functionName}' requires at least one argument`);
|
|
358
|
+
}
|
|
359
|
+
const args = splitFunctionArgs(argumentText).map(formatFunctionArgument);
|
|
360
|
+
return `${functionName}(${args.join(", ")})`;
|
|
361
|
+
}
|
|
362
|
+
function splitFunctionArgs(argumentText) {
|
|
363
|
+
const args = [];
|
|
364
|
+
let depth = 0;
|
|
365
|
+
let current = "";
|
|
366
|
+
for (const char of argumentText) {
|
|
367
|
+
if (char === "(") {
|
|
368
|
+
depth += 1;
|
|
369
|
+
current += char;
|
|
370
|
+
}
|
|
371
|
+
else if (char === ")") {
|
|
372
|
+
depth -= 1;
|
|
373
|
+
current += char;
|
|
374
|
+
}
|
|
375
|
+
else if (char === "," && depth === 0) {
|
|
376
|
+
if (current.trim().length > 0) {
|
|
377
|
+
args.push(current.trim());
|
|
378
|
+
}
|
|
379
|
+
current = "";
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
current += char;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (current.trim().length > 0) {
|
|
386
|
+
args.push(current.trim());
|
|
387
|
+
}
|
|
388
|
+
return args.length ? args : [argumentText.trim()];
|
|
389
|
+
}
|
|
390
|
+
function formatFunctionArgument(argument) {
|
|
391
|
+
const trimmed = argument.trim();
|
|
392
|
+
if (!trimmed.length) {
|
|
393
|
+
throw new SqliteTranslationError("Function arguments cannot be empty");
|
|
394
|
+
}
|
|
395
|
+
if (trimmed === "*") {
|
|
396
|
+
return "*";
|
|
397
|
+
}
|
|
398
|
+
if (/^[0-9]+(\.[0-9]+)?$/.test(trimmed)) {
|
|
399
|
+
return trimmed;
|
|
400
|
+
}
|
|
401
|
+
if (/^'.*'$/.test(trimmed) || /^".*"$/.test(trimmed)) {
|
|
402
|
+
return trimmed;
|
|
403
|
+
}
|
|
404
|
+
if (trimmed.toUpperCase().startsWith("DISTINCT ")) {
|
|
405
|
+
const remainder = trimmed.slice(8).trim();
|
|
406
|
+
return `DISTINCT ${formatFunctionArgument(remainder)}`;
|
|
407
|
+
}
|
|
408
|
+
const nestedFunction = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\((.*)\)$/);
|
|
409
|
+
if (nestedFunction) {
|
|
410
|
+
return formatFunctionCall(nestedFunction[1], nestedFunction[2]);
|
|
411
|
+
}
|
|
412
|
+
return quoteQualifiedIdentifier(trimmed);
|
|
413
|
+
}
|
|
414
|
+
function normalizeValue(value) {
|
|
415
|
+
if (value === undefined) {
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
if (value instanceof Date) {
|
|
419
|
+
return value.toISOString();
|
|
420
|
+
}
|
|
421
|
+
if (typeof value === "boolean") {
|
|
422
|
+
return value ? 1 : 0;
|
|
423
|
+
}
|
|
424
|
+
return value;
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=query-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-translator.js","sourceRoot":"","sources":["../../src/lib/sqlite/query-translator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hazo_connect",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Module to connect to the data store (postgres via postgrest, supabase, etc)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"test:watch": "jest --watch",
|
|
22
22
|
"test:coverage": "jest --coverage",
|
|
23
23
|
"test:integration": "POSTGREST_INTEGRATION=true jest --runInBand tests/integration/postgrest.integration.test.ts",
|
|
24
|
+
"test:integration:sqlite": "jest --runInBand tests/integration/sqlite.integration.test.ts",
|
|
24
25
|
"prepublishOnly": "npm run build:lib",
|
|
25
26
|
"postinstall": "patch-package"
|
|
26
27
|
},
|
|
@@ -44,7 +45,8 @@
|
|
|
44
45
|
"hazo_config": "^1.3.0",
|
|
45
46
|
"next": "14.2.5",
|
|
46
47
|
"react": "18.3.1",
|
|
47
|
-
"react-dom": "18.3.1"
|
|
48
|
+
"react-dom": "18.3.1",
|
|
49
|
+
"sql.js": "^1.13.0"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"@storybook/addon-essentials": "^8.2.6",
|
|
@@ -57,6 +59,7 @@
|
|
|
57
59
|
"@types/node": "^20.14.10",
|
|
58
60
|
"@types/react": "^18.3.3",
|
|
59
61
|
"@types/react-dom": "^18.3.0",
|
|
62
|
+
"@types/sql.js": "^1.4.9",
|
|
60
63
|
"autoprefixer": "^10.4.19",
|
|
61
64
|
"eslint": "^8.57.0",
|
|
62
65
|
"eslint-config-next": "14.2.5",
|