n8n-nodes-sqlite-wasm 0.1.1

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/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2022 n8n
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # n8n-nodes-sqlite-wasm
2
+
3
+ Self-hosted n8n community node for working with SQLite in read-only mode via `sql.js`. It does not rely on native addons, so it is suitable for environments where you do not want to add `better-sqlite3` or `sqlite3`.
4
+
5
+ ## Included Node
6
+
7
+ - `SQLite WASM`
8
+ - `Query Database`
9
+ - `List Tables`
10
+ - `Describe Table`
11
+
12
+ ## Features
13
+
14
+ - SQLite loading powered by `sql.js`
15
+ - Supports both binary input and file path input
16
+ - Read-only SQL restrictions
17
+ - Single-statement enforcement
18
+ - `items` / `singleItem` return modes
19
+
20
+ ## Usage Notes
21
+
22
+ - `Query Database` only allows `SELECT`, `WITH ... SELECT`, and `PRAGMA table_info(...)`
23
+ - Statements such as `ATTACH`, `DROP`, `ALTER`, `VACUUM`, and `load_extension` are rejected
24
+ - File path mode only reads files under the configured allowed prefixes
25
+ - This package is intended for self-hosted n8n and uses `sql.js` as an external dependency
26
+
27
+ ## Development
28
+
29
+ ```bash
30
+ npm install
31
+ npm run build
32
+ npm test
33
+ ```
34
+
35
+ ## License
36
+
37
+ MIT
@@ -0,0 +1,3 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="white"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="#24292F"/>
3
+ </svg>
@@ -0,0 +1,13 @@
1
+ {
2
+ "node": "n8n-nodes-sqlite-wasm",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["Development", "Data & Storage"],
6
+ "resources": {
7
+ "primaryDocumentation": [
8
+ {
9
+ "url": "https://github.com/Aodaruma/n8n-nodes-sqlite-wasm#readme"
10
+ }
11
+ ]
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class SQLiteWasm implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLiteWasm = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const sqliteWasm_utils_1 = require("./sqliteWasm.utils");
6
+ class SQLiteWasm {
7
+ constructor() {
8
+ this.description = {
9
+ displayName: 'SQLite WASM',
10
+ name: 'sqliteWasm',
11
+ icon: { light: 'file:sqliteWasm.svg', dark: 'file:sqliteWasm.dark.svg' },
12
+ group: ['transform'],
13
+ version: 1,
14
+ subtitle: '={{$parameter["operation"]}}',
15
+ description: 'Query SQLite databases in read-only mode via sql.js (WASM)',
16
+ defaults: {
17
+ name: 'SQLite WASM',
18
+ },
19
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
20
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
21
+ usableAsTool: true,
22
+ properties: [
23
+ {
24
+ displayName: 'Operation',
25
+ name: 'operation',
26
+ type: 'options',
27
+ noDataExpression: true,
28
+ options: [
29
+ {
30
+ name: 'Describe Table',
31
+ value: 'describeTable',
32
+ },
33
+ {
34
+ name: 'List Tables',
35
+ value: 'listTables',
36
+ },
37
+ {
38
+ name: 'Query Database',
39
+ value: 'queryDatabase',
40
+ },
41
+ ],
42
+ default: 'queryDatabase',
43
+ },
44
+ {
45
+ displayName: 'Input Mode',
46
+ name: 'inputMode',
47
+ type: 'options',
48
+ noDataExpression: true,
49
+ options: [
50
+ {
51
+ name: 'Binary',
52
+ value: 'binary',
53
+ },
54
+ {
55
+ name: 'File Path',
56
+ value: 'filePath',
57
+ },
58
+ ],
59
+ default: 'binary',
60
+ },
61
+ {
62
+ displayName: 'Binary Property',
63
+ name: 'binaryPropertyName',
64
+ type: 'string',
65
+ default: 'data',
66
+ displayOptions: {
67
+ show: {
68
+ inputMode: ['binary'],
69
+ },
70
+ },
71
+ },
72
+ {
73
+ displayName: 'Database File Path',
74
+ name: 'databaseFilePath',
75
+ type: 'string',
76
+ default: '',
77
+ placeholder: '/files/example.db',
78
+ displayOptions: {
79
+ show: {
80
+ inputMode: ['filePath'],
81
+ },
82
+ },
83
+ },
84
+ {
85
+ displayName: 'Allowed Path Prefixes',
86
+ name: 'allowedPathPrefixes',
87
+ type: 'string',
88
+ typeOptions: {
89
+ rows: 3,
90
+ },
91
+ default: (0, sqliteWasm_utils_1.getDefaultAllowedPathPrefixes)().join('\n'),
92
+ description: 'Absolute prefixes allowed in file path mode, one per line',
93
+ displayOptions: {
94
+ show: {
95
+ inputMode: ['filePath'],
96
+ },
97
+ },
98
+ },
99
+ {
100
+ displayName: 'Query',
101
+ name: 'query',
102
+ type: 'string',
103
+ typeOptions: {
104
+ rows: 4,
105
+ },
106
+ default: 'SELECT name FROM sqlite_master ORDER BY name;',
107
+ displayOptions: {
108
+ show: {
109
+ operation: ['queryDatabase'],
110
+ },
111
+ },
112
+ },
113
+ {
114
+ displayName: 'Query Parameters',
115
+ name: 'queryParameters',
116
+ type: 'string',
117
+ typeOptions: {
118
+ rows: 3,
119
+ },
120
+ default: '',
121
+ placeholder: '["value"] or {"name":"value"}',
122
+ description: 'Optional JSON array or object passed to the prepared statement',
123
+ displayOptions: {
124
+ show: {
125
+ operation: ['queryDatabase'],
126
+ },
127
+ },
128
+ },
129
+ {
130
+ displayName: 'Table Name',
131
+ name: 'tableName',
132
+ type: 'string',
133
+ default: '',
134
+ displayOptions: {
135
+ show: {
136
+ operation: ['describeTable'],
137
+ },
138
+ },
139
+ },
140
+ {
141
+ displayName: 'Return Mode',
142
+ name: 'returnMode',
143
+ type: 'options',
144
+ noDataExpression: true,
145
+ options: [
146
+ {
147
+ name: 'Items',
148
+ value: 'items',
149
+ description: 'Return one n8n item per row',
150
+ },
151
+ {
152
+ name: 'Single Item',
153
+ value: 'singleItem',
154
+ description: 'Return one item containing rows and metadata',
155
+ },
156
+ ],
157
+ default: 'items',
158
+ },
159
+ {
160
+ displayName: 'Fail On Error',
161
+ name: 'failOnError',
162
+ type: 'boolean',
163
+ default: false,
164
+ description: 'Whether to throw instead of returning a structured error payload',
165
+ },
166
+ ],
167
+ };
168
+ }
169
+ async execute() {
170
+ var _a, _b, _c;
171
+ const items = this.getInputData();
172
+ const returnData = [];
173
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
174
+ const failOnError = this.getNodeParameter('failOnError', itemIndex, false);
175
+ try {
176
+ const operation = this.getNodeParameter('operation', itemIndex);
177
+ const returnMode = this.getNodeParameter('returnMode', itemIndex, 'items');
178
+ const database = await getDatabaseInput.call(this, itemIndex);
179
+ const result = await executeOperation.call(this, itemIndex, operation, database.bytes);
180
+ if (returnMode === 'singleItem') {
181
+ returnData.push({
182
+ json: {
183
+ ok: true,
184
+ source: 'sqliteWasm',
185
+ operation,
186
+ inputMode: database.inputMode,
187
+ fileName: (_a = database.fileName) !== null && _a !== void 0 ? _a : null,
188
+ resolvedPath: (_b = database.resolvedPath) !== null && _b !== void 0 ? _b : null,
189
+ allowedPathPrefixes: (_c = database.allowedPathPrefixes) !== null && _c !== void 0 ? _c : null,
190
+ ...result,
191
+ },
192
+ pairedItem: itemIndex,
193
+ });
194
+ continue;
195
+ }
196
+ for (const row of result.rows) {
197
+ returnData.push({
198
+ json: row,
199
+ pairedItem: itemIndex,
200
+ });
201
+ }
202
+ }
203
+ catch (error) {
204
+ const message = error instanceof Error ? error.message : 'Unknown SQLite error';
205
+ if (failOnError && !this.continueOnFail()) {
206
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), message, { itemIndex });
207
+ }
208
+ returnData.push({
209
+ json: {
210
+ ok: false,
211
+ source: 'sqliteWasm',
212
+ error: {
213
+ message,
214
+ },
215
+ rows: [],
216
+ columns: [],
217
+ rowCount: 0,
218
+ },
219
+ pairedItem: itemIndex,
220
+ });
221
+ }
222
+ }
223
+ return [returnData];
224
+ }
225
+ }
226
+ exports.SQLiteWasm = SQLiteWasm;
227
+ async function getDatabaseInput(itemIndex) {
228
+ const inputMode = this.getNodeParameter('inputMode', itemIndex);
229
+ if (inputMode === 'binary') {
230
+ const binaryPropertyName = this.getNodeParameter('binaryPropertyName', itemIndex, 'data');
231
+ const binaryData = this.helpers.assertBinaryData(itemIndex, binaryPropertyName);
232
+ const buffer = await this.helpers.getBinaryDataBuffer(itemIndex, binaryPropertyName);
233
+ const input = (0, sqliteWasm_utils_1.readDatabaseBytesFromBinary)(buffer, binaryPropertyName, binaryData.fileName);
234
+ return {
235
+ inputMode,
236
+ bytes: input.bytes,
237
+ fileName: input.fileName,
238
+ };
239
+ }
240
+ const databaseFilePath = this.getNodeParameter('databaseFilePath', itemIndex);
241
+ const rawAllowedPathPrefixes = this.getNodeParameter('allowedPathPrefixes', itemIndex);
242
+ const allowedPathPrefixes = (0, sqliteWasm_utils_1.parseAllowedPathPrefixes)(rawAllowedPathPrefixes);
243
+ const input = await (0, sqliteWasm_utils_1.readDatabaseBytesFromFile)(databaseFilePath, allowedPathPrefixes);
244
+ return {
245
+ inputMode,
246
+ bytes: input.bytes,
247
+ fileName: input.fileName,
248
+ resolvedPath: input.resolvedPath,
249
+ allowedPathPrefixes,
250
+ };
251
+ }
252
+ async function executeOperation(itemIndex, operation, bytes) {
253
+ if (operation === 'listTables') {
254
+ return await (0, sqliteWasm_utils_1.runSqliteQuery)(bytes, (0, sqliteWasm_utils_1.buildListTablesQuery)());
255
+ }
256
+ if (operation === 'describeTable') {
257
+ const tableName = this.getNodeParameter('tableName', itemIndex);
258
+ return await (0, sqliteWasm_utils_1.runSqliteQuery)(bytes, (0, sqliteWasm_utils_1.buildDescribeTableQuery)(tableName));
259
+ }
260
+ const query = this.getNodeParameter('query', itemIndex);
261
+ const queryParameters = this.getNodeParameter('queryParameters', itemIndex, '');
262
+ const parameters = (0, sqliteWasm_utils_1.parseQueryParameters)(queryParameters);
263
+ return await (0, sqliteWasm_utils_1.runSqliteQuery)(bytes, query, parameters);
264
+ }
265
+ //# sourceMappingURL=SqliteWasm.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteWasm.node.js","sourceRoot":"","sources":["../../../nodes/SQLiteWasm/SqliteWasm.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="SQLite WASM dark">
2
+ <rect x="8" y="10" width="48" height="44" rx="8" fill="#d9f3ff"/>
3
+ <ellipse cx="32" cy="18" rx="18" ry="6" fill="#0b6aa2"/>
4
+ <path d="M14 18v22c0 3.3 8.1 6 18 6s18-2.7 18-6V18" fill="#6bc7f2"/>
5
+ <path d="M14 28c0 3.3 8.1 6 18 6s18-2.7 18-6M14 38c0 3.3 8.1 6 18 6s18-2.7 18-6" fill="none" stroke="#0b3651" stroke-width="3" stroke-linecap="round"/>
6
+ <path d="M22 24h6l4 7 4-7h6l-7 11 7 11h-6l-4-7-4 7h-6l7-11z" fill="#08314a"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="SQLite WASM">
2
+ <rect x="8" y="10" width="48" height="44" rx="8" fill="#0b6aa2"/>
3
+ <ellipse cx="32" cy="18" rx="18" ry="6" fill="#7fd4ff"/>
4
+ <path d="M14 18v22c0 3.3 8.1 6 18 6s18-2.7 18-6V18" fill="#4db8f0"/>
5
+ <path d="M14 28c0 3.3 8.1 6 18 6s18-2.7 18-6M14 38c0 3.3 8.1 6 18 6s18-2.7 18-6" fill="none" stroke="#dff5ff" stroke-width="3" stroke-linecap="round"/>
6
+ <path d="M22 24h6l4 7 4-7h6l-7 11 7 11h-6l-4-7-4 7h-6l7-11z" fill="#08314a"/>
7
+ </svg>
@@ -0,0 +1,29 @@
1
+ export type SqliteInputMode = 'binary' | 'filePath';
2
+ export type SqliteReturnMode = 'items' | 'singleItem';
3
+ export interface SqliteQueryResult {
4
+ rows: Array<Record<string, unknown>>;
5
+ columns: string[];
6
+ rowCount: number;
7
+ }
8
+ export interface SqliteOperationResult extends SqliteQueryResult {
9
+ query: string;
10
+ }
11
+ export declare function getSqlJs(): Promise<import("sql.js").SqlJsStatic>;
12
+ export declare function getDefaultAllowedPathPrefixes(): string[];
13
+ export declare function parseAllowedPathPrefixes(rawValue: string): string[];
14
+ export declare function parseQueryParameters(rawValue: string): unknown[] | Record<string, unknown> | undefined;
15
+ export declare function sanitizeSqlValue(value: unknown): unknown;
16
+ export declare function readDatabaseBytesFromFile(databaseFilePath: string, allowedPrefixes: string[]): Promise<{
17
+ bytes: Uint8Array;
18
+ resolvedPath: string;
19
+ fileName: string;
20
+ }>;
21
+ export declare function readDatabaseBytesFromBinary(buffer: Buffer | Uint8Array | undefined, propertyName: string, fileName?: string): {
22
+ bytes: Uint8Array;
23
+ fileName?: string;
24
+ };
25
+ export declare function resolveSafeDatabaseFilePath(databaseFilePath: string, allowedPrefixes: string[]): Promise<string>;
26
+ export declare function validateReadOnlySql(rawSql: string): string;
27
+ export declare function runSqliteQuery(bytes: Uint8Array, rawSql: string, parameters?: unknown[] | Record<string, unknown>): Promise<SqliteOperationResult>;
28
+ export declare function buildListTablesQuery(): string;
29
+ export declare function buildDescribeTableQuery(tableName: string): string;
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSqlJs = getSqlJs;
7
+ exports.getDefaultAllowedPathPrefixes = getDefaultAllowedPathPrefixes;
8
+ exports.parseAllowedPathPrefixes = parseAllowedPathPrefixes;
9
+ exports.parseQueryParameters = parseQueryParameters;
10
+ exports.sanitizeSqlValue = sanitizeSqlValue;
11
+ exports.readDatabaseBytesFromFile = readDatabaseBytesFromFile;
12
+ exports.readDatabaseBytesFromBinary = readDatabaseBytesFromBinary;
13
+ exports.resolveSafeDatabaseFilePath = resolveSafeDatabaseFilePath;
14
+ exports.validateReadOnlySql = validateReadOnlySql;
15
+ exports.runSqliteQuery = runSqliteQuery;
16
+ exports.buildListTablesQuery = buildListTablesQuery;
17
+ exports.buildDescribeTableQuery = buildDescribeTableQuery;
18
+ const fs_1 = require("fs");
19
+ const path_1 = __importDefault(require("path"));
20
+ const sql_wasm_js_1 = __importDefault(require("./vendor/sql-wasm.js"));
21
+ const DEFAULT_ALLOWED_PATH_PREFIXES = ['/files/', '/home/node/.n8n-files/'];
22
+ const FORBIDDEN_SQL_PATTERNS = [
23
+ /\bINSERT\b/i,
24
+ /\bUPDATE\b/i,
25
+ /\bDELETE\b/i,
26
+ /\bDROP\b/i,
27
+ /\bALTER\b/i,
28
+ /\bATTACH\b/i,
29
+ /\bDETACH\b/i,
30
+ /\bVACUUM\b/i,
31
+ /\bREINDEX\b/i,
32
+ /\bREPLACE\b/i,
33
+ /\bTRUNCATE\b/i,
34
+ /\bANALYZE\b/i,
35
+ /\bLOAD_EXTENSION\b/i,
36
+ /\.load/i,
37
+ ];
38
+ let sqlJsPromise;
39
+ async function getSqlJs() {
40
+ if (!sqlJsPromise) {
41
+ sqlJsPromise = (0, sql_wasm_js_1.default)({
42
+ locateFile: (file) => path_1.default.join(__dirname, 'vendor', file),
43
+ });
44
+ }
45
+ return await sqlJsPromise;
46
+ }
47
+ function getDefaultAllowedPathPrefixes() {
48
+ return [...DEFAULT_ALLOWED_PATH_PREFIXES];
49
+ }
50
+ function parseAllowedPathPrefixes(rawValue) {
51
+ const prefixes = rawValue
52
+ .split(/\r?\n/)
53
+ .map((entry) => entry.trim())
54
+ .filter(Boolean);
55
+ return prefixes.length > 0 ? prefixes : getDefaultAllowedPathPrefixes();
56
+ }
57
+ function parseQueryParameters(rawValue) {
58
+ const normalized = rawValue.trim();
59
+ if (!normalized) {
60
+ return undefined;
61
+ }
62
+ const parsed = JSON.parse(normalized);
63
+ if (Array.isArray(parsed)) {
64
+ return parsed;
65
+ }
66
+ if (parsed !== null && typeof parsed === 'object') {
67
+ return parsed;
68
+ }
69
+ throw new Error('Query parameters must be a JSON array or object.');
70
+ }
71
+ function sanitizeSqlValue(value) {
72
+ if (value === null || value === undefined) {
73
+ return value;
74
+ }
75
+ if (Buffer.isBuffer(value) || value instanceof Uint8Array) {
76
+ return {
77
+ encoding: 'base64',
78
+ length: value.length,
79
+ data: Buffer.from(value).toString('base64'),
80
+ };
81
+ }
82
+ if (Array.isArray(value)) {
83
+ return value.map((entry) => sanitizeSqlValue(entry));
84
+ }
85
+ if (value instanceof Date) {
86
+ return value.toISOString();
87
+ }
88
+ if (typeof value === 'object') {
89
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
90
+ key,
91
+ sanitizeSqlValue(entry),
92
+ ]));
93
+ }
94
+ return value;
95
+ }
96
+ async function readDatabaseBytesFromFile(databaseFilePath, allowedPrefixes) {
97
+ const resolvedPath = await resolveSafeDatabaseFilePath(databaseFilePath, allowedPrefixes);
98
+ const buffer = await fs_1.promises.readFile(resolvedPath);
99
+ return {
100
+ bytes: new Uint8Array(buffer),
101
+ resolvedPath,
102
+ fileName: path_1.default.basename(resolvedPath),
103
+ };
104
+ }
105
+ function readDatabaseBytesFromBinary(buffer, propertyName, fileName) {
106
+ if (!buffer) {
107
+ throw new Error(`Binary property "${propertyName}" was not found.`);
108
+ }
109
+ return {
110
+ bytes: buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer),
111
+ fileName,
112
+ };
113
+ }
114
+ async function resolveSafeDatabaseFilePath(databaseFilePath, allowedPrefixes) {
115
+ if (!databaseFilePath.trim()) {
116
+ throw new Error('Database file path is required.');
117
+ }
118
+ if (!path_1.default.isAbsolute(databaseFilePath)) {
119
+ throw new Error('Database file path must be absolute.');
120
+ }
121
+ const segments = databaseFilePath.split(/[\\/]+/).filter(Boolean);
122
+ if (segments.includes('..')) {
123
+ throw new Error('Database file path may not contain ".." segments.');
124
+ }
125
+ const realFilePath = await fs_1.promises.realpath(databaseFilePath);
126
+ const normalizedPrefixes = await Promise.all(allowedPrefixes.map(async (prefix) => {
127
+ const trimmed = prefix.trim();
128
+ if (!trimmed) {
129
+ return '';
130
+ }
131
+ try {
132
+ return await fs_1.promises.realpath(trimmed);
133
+ }
134
+ catch {
135
+ return path_1.default.resolve(trimmed);
136
+ }
137
+ }));
138
+ const isAllowed = normalizedPrefixes
139
+ .filter(Boolean)
140
+ .some((prefix) => isPathWithinPrefix(realFilePath, prefix));
141
+ if (!isAllowed) {
142
+ throw new Error('Database file path is outside the allowed prefixes.');
143
+ }
144
+ return realFilePath;
145
+ }
146
+ function validateReadOnlySql(rawSql) {
147
+ const sql = normalizeSql(rawSql);
148
+ if (!sql) {
149
+ throw new Error('SQL query must not be empty.');
150
+ }
151
+ if (containsMultipleStatements(sql)) {
152
+ throw new Error('Only a single SQL statement is allowed.');
153
+ }
154
+ for (const pattern of FORBIDDEN_SQL_PATTERNS) {
155
+ if (pattern.test(sql)) {
156
+ throw new Error('The SQL statement is not allowed in read-only mode.');
157
+ }
158
+ }
159
+ if (/^PRAGMA\b/i.test(sql)) {
160
+ if (!/^PRAGMA\s+table_info\s*\(/i.test(sql)) {
161
+ throw new Error('Only PRAGMA table_info(...) is allowed in read-only mode.');
162
+ }
163
+ return sql;
164
+ }
165
+ if (/^(SELECT|WITH)\b/i.test(sql)) {
166
+ return sql;
167
+ }
168
+ throw new Error('Only SELECT, WITH ... SELECT, and PRAGMA table_info(...) are allowed.');
169
+ }
170
+ async function runSqliteQuery(bytes, rawSql, parameters) {
171
+ const sql = validateReadOnlySql(rawSql);
172
+ const SQL = await getSqlJs();
173
+ const db = new SQL.Database(bytes);
174
+ try {
175
+ const statement = db.prepare(sql);
176
+ try {
177
+ if (parameters) {
178
+ statement.bind(parameters);
179
+ }
180
+ const columns = statement.getColumnNames();
181
+ const rows = [];
182
+ while (statement.step()) {
183
+ rows.push(sanitizeSqlValue(statement.getAsObject()));
184
+ }
185
+ return {
186
+ query: sql,
187
+ rows,
188
+ columns,
189
+ rowCount: rows.length,
190
+ };
191
+ }
192
+ finally {
193
+ statement.free();
194
+ }
195
+ }
196
+ finally {
197
+ db.close();
198
+ }
199
+ }
200
+ function buildListTablesQuery() {
201
+ return `
202
+ SELECT name, type
203
+ FROM sqlite_master
204
+ WHERE type IN ('table', 'view')
205
+ ORDER BY type, name
206
+ `.trim();
207
+ }
208
+ function buildDescribeTableQuery(tableName) {
209
+ if (!tableName.trim()) {
210
+ throw new Error('Table name is required.');
211
+ }
212
+ return `PRAGMA table_info(${quoteSqlIdentifier(tableName)});`;
213
+ }
214
+ function quoteSqlIdentifier(identifier) {
215
+ return `"${identifier.replace(/"/g, '""')}"`;
216
+ }
217
+ function containsMultipleStatements(sql) {
218
+ const withoutTrailingSemicolon = sql.replace(/;\s*$/u, '');
219
+ return withoutTrailingSemicolon.includes(';');
220
+ }
221
+ function normalizeSql(rawSql) {
222
+ return stripSqlComments(rawSql).trim();
223
+ }
224
+ function stripSqlComments(sql) {
225
+ return sql
226
+ .replace(/\/\*[\s\S]*?\*\//g, ' ')
227
+ .replace(/--.*$/gm, ' ')
228
+ .replace(/\s+/g, ' ');
229
+ }
230
+ function isPathWithinPrefix(targetPath, prefix) {
231
+ const relative = path_1.default.relative(prefix, targetPath);
232
+ return relative === '' || (!relative.startsWith('..') && !path_1.default.isAbsolute(relative));
233
+ }
234
+ //# sourceMappingURL=sqliteWasm.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteWasm.utils.js","sourceRoot":"","sources":["../../../nodes/SQLiteWasm/sqliteWasm.utils.ts"],"names":[],"mappings":"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"}