@kepler.gl/duckdb 3.1.0-alpha.7 → 3.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/dist/components/monaco-editor.js +4 -5
- package/dist/components/preview-data-panel.d.ts +7 -2
- package/dist/components/preview-data-panel.js +8 -16
- package/dist/components/schema-panel.d.ts +12 -3
- package/dist/components/schema-panel.js +41 -24
- package/dist/components/sql-panel.js +246 -57
- package/dist/init.js +20 -14
- package/dist/plugin.js +8 -2
- package/dist/processors/data-processor.d.ts +1 -0
- package/dist/processors/data-processor.js +4 -4
- package/dist/table/duckdb-table-utils.d.ts +106 -0
- package/dist/table/duckdb-table-utils.js +493 -2
- package/dist/table/duckdb-table.d.ts +5 -3
- package/dist/table/duckdb-table.js +153 -261
- package/package.json +6 -6
|
@@ -1,15 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
8
|
+
exports.SUPPORTED_DUCKDB_DROP_EXTENSIONS = void 0;
|
|
9
|
+
exports.checkIsSelectQuery = checkIsSelectQuery;
|
|
10
|
+
exports.constructST_asWKBQuery = constructST_asWKBQuery;
|
|
11
|
+
exports.dropTableIfExists = void 0;
|
|
12
|
+
exports.getDuckDBColumnTypes = getDuckDBColumnTypes;
|
|
13
|
+
exports.getDuckDBColumnTypesMap = getDuckDBColumnTypesMap;
|
|
14
|
+
exports.getGeometryColumns = getGeometryColumns;
|
|
6
15
|
exports.isGeoArrowLineString = isGeoArrowLineString;
|
|
7
16
|
exports.isGeoArrowMultiLineString = isGeoArrowMultiLineString;
|
|
8
17
|
exports.isGeoArrowMultiPoint = isGeoArrowMultiPoint;
|
|
9
18
|
exports.isGeoArrowMultiPolygon = isGeoArrowMultiPolygon;
|
|
10
19
|
exports.isGeoArrowPoint = isGeoArrowPoint;
|
|
11
20
|
exports.isGeoArrowPolygon = isGeoArrowPolygon;
|
|
21
|
+
exports.removeSQLComments = removeSQLComments;
|
|
22
|
+
exports.restoreUnsupportedExtensions = exports.restoreArrowTable = exports.removeUnsupportedExtensions = void 0;
|
|
23
|
+
exports.sanitizeDuckDBTableName = sanitizeDuckDBTableName;
|
|
24
|
+
exports.setGeoArrowWKBExtension = setGeoArrowWKBExtension;
|
|
25
|
+
exports.splitSqlStatements = splitSqlStatements;
|
|
26
|
+
exports.tableFromFile = tableFromFile;
|
|
27
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
28
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
29
|
+
var arrow = _interopRequireWildcard(require("apache-arrow"));
|
|
12
30
|
var _type = require("apache-arrow/type");
|
|
31
|
+
var _duckdbWasm = require("@duckdb/duckdb-wasm");
|
|
32
|
+
var _constants = require("@kepler.gl/constants");
|
|
33
|
+
var _init = require("../init");
|
|
34
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
35
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
13
36
|
// SPDX-License-Identifier: MIT
|
|
14
37
|
// Copyright contributors to the kepler.gl project
|
|
15
38
|
|
|
@@ -19,7 +42,148 @@ var _type = require("apache-arrow/type");
|
|
|
19
42
|
|
|
20
43
|
// Copied from loaders.gl/geoarrow
|
|
21
44
|
|
|
22
|
-
// TODO: Remove once Kepler.gl is upgraded to loaders.gl 4.4+
|
|
45
|
+
// TODO: Remove isGeoArrow* once Kepler.gl is upgraded to loaders.gl 4.4+
|
|
46
|
+
|
|
47
|
+
var SUPPORTED_DUCKDB_DROP_EXTENSIONS = exports.SUPPORTED_DUCKDB_DROP_EXTENSIONS = ['arrow', 'csv', 'geojson', 'json', 'parquet'];
|
|
48
|
+
/**
|
|
49
|
+
* Queries a DuckDB table for the schema description.
|
|
50
|
+
* @param connection An active DuckDB connection.
|
|
51
|
+
* @param tableName A name of DuckDB table to query.
|
|
52
|
+
* @returns An array of column names and DuckDB types.
|
|
53
|
+
*/
|
|
54
|
+
function getDuckDBColumnTypes(_x, _x2) {
|
|
55
|
+
return _getDuckDBColumnTypes.apply(this, arguments);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generates a mapping of column names to their corresponding DuckDB data types.
|
|
59
|
+
* @param columns An array of column descriptions from DuckDB. Check getDuckDBColumnTypes.
|
|
60
|
+
* @returns A record where keys are column names and values are their data types.
|
|
61
|
+
*/
|
|
62
|
+
function _getDuckDBColumnTypes() {
|
|
63
|
+
_getDuckDBColumnTypes = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(connection, tableName) {
|
|
64
|
+
var resDescribe, duckDbTypes, numRows, i, _resDescribe$getChild, _resDescribe$getChild2, columnName, columnType;
|
|
65
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
66
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
67
|
+
case 0:
|
|
68
|
+
_context2.next = 2;
|
|
69
|
+
return connection.query("DESCRIBE \"".concat(tableName, "\";"));
|
|
70
|
+
case 2:
|
|
71
|
+
resDescribe = _context2.sent;
|
|
72
|
+
duckDbTypes = [];
|
|
73
|
+
numRows = resDescribe.numRows;
|
|
74
|
+
for (i = 0; i < numRows; ++i) {
|
|
75
|
+
columnName = (_resDescribe$getChild = resDescribe.getChildAt(0)) === null || _resDescribe$getChild === void 0 ? void 0 : _resDescribe$getChild.get(i);
|
|
76
|
+
columnType = (_resDescribe$getChild2 = resDescribe.getChildAt(1)) === null || _resDescribe$getChild2 === void 0 ? void 0 : _resDescribe$getChild2.get(i);
|
|
77
|
+
duckDbTypes.push({
|
|
78
|
+
name: columnName,
|
|
79
|
+
type: columnType
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return _context2.abrupt("return", duckDbTypes);
|
|
83
|
+
case 7:
|
|
84
|
+
case "end":
|
|
85
|
+
return _context2.stop();
|
|
86
|
+
}
|
|
87
|
+
}, _callee2);
|
|
88
|
+
}));
|
|
89
|
+
return _getDuckDBColumnTypes.apply(this, arguments);
|
|
90
|
+
}
|
|
91
|
+
function getDuckDBColumnTypesMap(columns) {
|
|
92
|
+
return columns.reduce(function (acc, value) {
|
|
93
|
+
acc[value.name] = value.type;
|
|
94
|
+
return acc;
|
|
95
|
+
}, {});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Constructs an SQL query to select all columns from a given table,
|
|
100
|
+
* converting specified columns to Well-Known Binary (WKB) format using ST_AsWKB.
|
|
101
|
+
* @param tableName The name of the table from which to select data.
|
|
102
|
+
* @param columnsToConvertToWKB An array of column names that should be converted to WKB format.
|
|
103
|
+
* @returns The constructed SQL query.
|
|
104
|
+
*/
|
|
105
|
+
function constructST_asWKBQuery(tableName, columnsToConvertToWKB) {
|
|
106
|
+
var exclude = columnsToConvertToWKB.length > 0 ? "EXCLUDE ".concat(columnsToConvertToWKB.join(', ')) : '';
|
|
107
|
+
var asWKB = columnsToConvertToWKB.length > 0 ? ", ".concat(columnsToConvertToWKB.map(function (column) {
|
|
108
|
+
return "ST_AsWKB(".concat(column, ") as ").concat(column);
|
|
109
|
+
}).join(', ')) : '';
|
|
110
|
+
return "SELECT * ".concat(exclude, " ").concat(asWKB, " FROM '").concat(tableName, "';");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Finds the names of columns that have a GEOMETRY type.
|
|
115
|
+
* @param columns An array of column descriptors from a DuckDB table.
|
|
116
|
+
* @returns An array of column names that are of type GEOMETRY.
|
|
117
|
+
*/
|
|
118
|
+
function getGeometryColumns(columns) {
|
|
119
|
+
return columns.filter(function (column) {
|
|
120
|
+
return column.type === 'GEOMETRY';
|
|
121
|
+
}).map(function (column) {
|
|
122
|
+
return column.name;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Sets the GeoArrow WKB extension metadata for columns of type GEOMETRY in an Arrow table.
|
|
128
|
+
* @param table The Apache Arrow table whose schema fields will be modified.
|
|
129
|
+
* @param columns An array of column descriptors from a DuckDB table.
|
|
130
|
+
*/
|
|
131
|
+
function setGeoArrowWKBExtension(table, columns) {
|
|
132
|
+
table.schema.fields.forEach(function (field) {
|
|
133
|
+
var info = columns.find(function (t) {
|
|
134
|
+
return t.name === field.name;
|
|
135
|
+
});
|
|
136
|
+
if ((info === null || info === void 0 ? void 0 : info.type) === 'GEOMETRY') {
|
|
137
|
+
field.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.WKB);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Creates an arrow table from an array of arrow vectors and fields.
|
|
144
|
+
* @param columns An array of arrow vectors.
|
|
145
|
+
* @param fields An array of fields per arrow vector.
|
|
146
|
+
* @param arrowSchema Optional arrow table schema when available.
|
|
147
|
+
* @returns An arrow table.
|
|
148
|
+
*/
|
|
149
|
+
var restoreArrowTable = exports.restoreArrowTable = function restoreArrowTable(columns, fields, arrowSchema) {
|
|
150
|
+
var creaOpts = {};
|
|
151
|
+
fields.map(function (field, index) {
|
|
152
|
+
creaOpts[field.name] = columns[index];
|
|
153
|
+
});
|
|
154
|
+
return arrowSchema ? new arrow.Table(arrowSchema, creaOpts) : new arrow.Table(creaOpts);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* DuckDb throws when geoarrow extensions are present in metadata.
|
|
159
|
+
* @param table An arrow table to clear from extensions.
|
|
160
|
+
* @returns A map of removed per field geoarrow extensions.
|
|
161
|
+
*/
|
|
162
|
+
var removeUnsupportedExtensions = exports.removeUnsupportedExtensions = function removeUnsupportedExtensions(table) {
|
|
163
|
+
var removedMetadata = {};
|
|
164
|
+
table.schema.fields.forEach(function (field) {
|
|
165
|
+
var extension = field.metadata.get(_constants.GEOARROW_METADATA_KEY);
|
|
166
|
+
if (extension !== null && extension !== void 0 && extension.startsWith('geoarrow')) {
|
|
167
|
+
removedMetadata[field.name] = extension;
|
|
168
|
+
field.metadata["delete"](_constants.GEOARROW_METADATA_KEY);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
return removedMetadata;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Restore removed metadata extensions after a call to removeUnsupportedExtensions.
|
|
176
|
+
* @param table An arrow table to restore geoarrow extensions.
|
|
177
|
+
* @param removedExtensions A map of per field geoarrow extensions to restore.
|
|
178
|
+
*/
|
|
179
|
+
var restoreUnsupportedExtensions = exports.restoreUnsupportedExtensions = function restoreUnsupportedExtensions(table, removedExtensions) {
|
|
180
|
+
table.schema.fields.forEach(function (field) {
|
|
181
|
+
var extension = removedExtensions[field.name];
|
|
182
|
+
if (extension) {
|
|
183
|
+
field.metadata.set(_constants.GEOARROW_METADATA_KEY, extension);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
};
|
|
23
187
|
|
|
24
188
|
/** Checks whether the given Apache Arrow JS type is a Point data type */
|
|
25
189
|
function isGeoArrowPoint(type) {
|
|
@@ -107,4 +271,331 @@ function isGeoArrowMultiPolygon(type) {
|
|
|
107
271
|
}
|
|
108
272
|
return true;
|
|
109
273
|
}
|
|
110
|
-
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Checks if the given SQL query is a SELECT query by using the EXPLAIN command.
|
|
277
|
+
* @param connection The DuckDB connection instance.
|
|
278
|
+
* @param query The SQL query to check.
|
|
279
|
+
* @returns Resolves to `true` if the query is a SELECT statement, otherwise `false`.
|
|
280
|
+
*/
|
|
281
|
+
function checkIsSelectQuery(_x3, _x4) {
|
|
282
|
+
return _checkIsSelectQuery.apply(this, arguments);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Split a string with potentially multiple SQL queries (separated as usual by ';') into an array of queries.
|
|
286
|
+
* This implementation:
|
|
287
|
+
* - Handles single and double quoted strings with proper escaping
|
|
288
|
+
* - Ignores semicolons in line comments (--) and block comments (slash asterisk)
|
|
289
|
+
* - Trims whitespace from queries
|
|
290
|
+
* - Handles SQL-style escaped quotes ('' inside strings)
|
|
291
|
+
* - Returns only non-empty queries
|
|
292
|
+
* @param input A string with potentially multiple SQL queries.
|
|
293
|
+
* @returns An array of queries.
|
|
294
|
+
*/
|
|
295
|
+
function _checkIsSelectQuery() {
|
|
296
|
+
_checkIsSelectQuery = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(connection, query) {
|
|
297
|
+
var result;
|
|
298
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
299
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
300
|
+
case 0:
|
|
301
|
+
_context3.prev = 0;
|
|
302
|
+
_context3.next = 3;
|
|
303
|
+
return connection.query("EXPLAIN (".concat(query, ")"));
|
|
304
|
+
case 3:
|
|
305
|
+
result = _context3.sent;
|
|
306
|
+
return _context3.abrupt("return", result.numRows > 0);
|
|
307
|
+
case 7:
|
|
308
|
+
_context3.prev = 7;
|
|
309
|
+
_context3.t0 = _context3["catch"](0);
|
|
310
|
+
return _context3.abrupt("return", false);
|
|
311
|
+
case 10:
|
|
312
|
+
case "end":
|
|
313
|
+
return _context3.stop();
|
|
314
|
+
}
|
|
315
|
+
}, _callee3, null, [[0, 7]]);
|
|
316
|
+
}));
|
|
317
|
+
return _checkIsSelectQuery.apply(this, arguments);
|
|
318
|
+
}
|
|
319
|
+
function splitSqlStatements(input) {
|
|
320
|
+
var queries = [];
|
|
321
|
+
var currentQuery = '';
|
|
322
|
+
var inSingleQuote = false;
|
|
323
|
+
var inDoubleQuote = false;
|
|
324
|
+
var inLineComment = false;
|
|
325
|
+
var inBlockComment = false;
|
|
326
|
+
for (var i = 0; i < input.length; i++) {
|
|
327
|
+
var _char = input[i];
|
|
328
|
+
if (inLineComment) {
|
|
329
|
+
currentQuery += _char;
|
|
330
|
+
if (_char === '\n') {
|
|
331
|
+
inLineComment = false;
|
|
332
|
+
}
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (inBlockComment) {
|
|
336
|
+
currentQuery += _char;
|
|
337
|
+
if (_char === '*' && input[i + 1] === '/') {
|
|
338
|
+
inBlockComment = false;
|
|
339
|
+
currentQuery += input[++i]; // Consume '/'
|
|
340
|
+
}
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (inSingleQuote) {
|
|
344
|
+
currentQuery += _char;
|
|
345
|
+
if (_char === "'") {
|
|
346
|
+
// Handle escaped single quotes in SQL
|
|
347
|
+
if (i + 1 < input.length && input[i + 1] === "'") {
|
|
348
|
+
currentQuery += input[++i];
|
|
349
|
+
} else {
|
|
350
|
+
inSingleQuote = false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (inDoubleQuote) {
|
|
356
|
+
currentQuery += _char;
|
|
357
|
+
if (_char === '"') {
|
|
358
|
+
// Handle escaped double quotes
|
|
359
|
+
if (i + 1 < input.length && input[i + 1] === '"') {
|
|
360
|
+
currentQuery += input[++i];
|
|
361
|
+
} else {
|
|
362
|
+
inDoubleQuote = false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Check for comment starts
|
|
369
|
+
if (_char === '-' && input[i + 1] === '-') {
|
|
370
|
+
inLineComment = true;
|
|
371
|
+
currentQuery += _char + input[++i];
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (_char === '/' && input[i + 1] === '*') {
|
|
375
|
+
inBlockComment = true;
|
|
376
|
+
currentQuery += _char + input[++i];
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Check for quote starts
|
|
381
|
+
if (_char === "'") {
|
|
382
|
+
inSingleQuote = true;
|
|
383
|
+
currentQuery += _char;
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
if (_char === '"') {
|
|
387
|
+
inDoubleQuote = true;
|
|
388
|
+
currentQuery += _char;
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Handle query separator
|
|
393
|
+
if (_char === ';') {
|
|
394
|
+
var _trimmed = currentQuery.trim();
|
|
395
|
+
if (_trimmed.length > 0) {
|
|
396
|
+
queries.push(_trimmed);
|
|
397
|
+
}
|
|
398
|
+
currentQuery = '';
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
currentQuery += _char;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Add the final query
|
|
405
|
+
var trimmed = currentQuery.trim();
|
|
406
|
+
if (trimmed.length > 0) {
|
|
407
|
+
queries.push(trimmed);
|
|
408
|
+
}
|
|
409
|
+
return queries;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Removes SQL comments from a given SQL string.
|
|
414
|
+
* @param sql The SQL query string from which comments should be removed.
|
|
415
|
+
* @returns The cleaned SQL string without comments.
|
|
416
|
+
*/
|
|
417
|
+
function removeSQLComments(sql) {
|
|
418
|
+
// Remove multi-line comments (/* ... */)
|
|
419
|
+
sql = sql.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
420
|
+
// Remove single-line comments (-- ...)
|
|
421
|
+
sql = sql.replace(/--.*$/gm, '');
|
|
422
|
+
return sql.trim();
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Drops a table if it exists in the DuckDB database.
|
|
427
|
+
* @param connection The DuckDB connection instance.
|
|
428
|
+
* @param tableName The name of the table to drop.
|
|
429
|
+
* @returns A promise that resolves when the operation is complete.
|
|
430
|
+
* @throws Logs an error if the table drop operation fails.
|
|
431
|
+
*/
|
|
432
|
+
var dropTableIfExists = exports.dropTableIfExists = /*#__PURE__*/function () {
|
|
433
|
+
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(connection, tableName) {
|
|
434
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
435
|
+
while (1) switch (_context.prev = _context.next) {
|
|
436
|
+
case 0:
|
|
437
|
+
_context.prev = 0;
|
|
438
|
+
_context.next = 3;
|
|
439
|
+
return connection.query("DROP TABLE IF EXISTS \"".concat(tableName, "\";"));
|
|
440
|
+
case 3:
|
|
441
|
+
_context.next = 8;
|
|
442
|
+
break;
|
|
443
|
+
case 5:
|
|
444
|
+
_context.prev = 5;
|
|
445
|
+
_context.t0 = _context["catch"](0);
|
|
446
|
+
console.error('Dropping table failed', tableName, _context.t0);
|
|
447
|
+
case 8:
|
|
448
|
+
case "end":
|
|
449
|
+
return _context.stop();
|
|
450
|
+
}
|
|
451
|
+
}, _callee, null, [[0, 5]]);
|
|
452
|
+
}));
|
|
453
|
+
return function dropTableIfExists(_x5, _x6) {
|
|
454
|
+
return _ref.apply(this, arguments);
|
|
455
|
+
};
|
|
456
|
+
}();
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Imports a file into DuckDB as a table, supporting multiple formats from SUPPORTED_DUCKDB_DROP_EXTENSIONS.
|
|
460
|
+
* @param file The file to be imported.
|
|
461
|
+
* @returns A promise that resolves when the file has been processed into a DuckDB table.
|
|
462
|
+
*/
|
|
463
|
+
function tableFromFile(_x7) {
|
|
464
|
+
return _tableFromFile.apply(this, arguments);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Sanitizes a file name to be a valid DuckDB table name.
|
|
468
|
+
* @param fileName The input file name to be sanitized.
|
|
469
|
+
* @returns A valid DuckDB table name.
|
|
470
|
+
*/
|
|
471
|
+
function _tableFromFile() {
|
|
472
|
+
_tableFromFile = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(file) {
|
|
473
|
+
var fileExt, db, c, error, tableName, sourceName, arrayBuffer, uint8Array, arrowTable, message;
|
|
474
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
475
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
476
|
+
case 0:
|
|
477
|
+
if (file) {
|
|
478
|
+
_context4.next = 2;
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
return _context4.abrupt("return", new Error('File Drag & Drop: No file'));
|
|
482
|
+
case 2:
|
|
483
|
+
fileExt = SUPPORTED_DUCKDB_DROP_EXTENSIONS.find(function (ext) {
|
|
484
|
+
return file.name.endsWith(ext);
|
|
485
|
+
});
|
|
486
|
+
if (fileExt) {
|
|
487
|
+
_context4.next = 5;
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
return _context4.abrupt("return", new Error("File Drag & Drop: File extension isn't supported"));
|
|
491
|
+
case 5:
|
|
492
|
+
_context4.next = 7;
|
|
493
|
+
return (0, _init.getDuckDB)();
|
|
494
|
+
case 7:
|
|
495
|
+
db = _context4.sent;
|
|
496
|
+
_context4.next = 10;
|
|
497
|
+
return db.connect();
|
|
498
|
+
case 10:
|
|
499
|
+
c = _context4.sent;
|
|
500
|
+
error = null;
|
|
501
|
+
_context4.prev = 12;
|
|
502
|
+
tableName = sanitizeDuckDBTableName(file.name);
|
|
503
|
+
sourceName = 'temp_file_handle';
|
|
504
|
+
c.query("install spatial;\n load spatial;");
|
|
505
|
+
if (!(fileExt === 'arrow')) {
|
|
506
|
+
_context4.next = 26;
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
_context4.next = 19;
|
|
510
|
+
return file.arrayBuffer();
|
|
511
|
+
case 19:
|
|
512
|
+
arrayBuffer = _context4.sent;
|
|
513
|
+
uint8Array = new Uint8Array(arrayBuffer);
|
|
514
|
+
arrowTable = arrow.tableFromIPC(uint8Array);
|
|
515
|
+
_context4.next = 24;
|
|
516
|
+
return c.insertArrowTable(arrowTable, {
|
|
517
|
+
name: tableName
|
|
518
|
+
});
|
|
519
|
+
case 24:
|
|
520
|
+
_context4.next = 46;
|
|
521
|
+
break;
|
|
522
|
+
case 26:
|
|
523
|
+
_context4.next = 28;
|
|
524
|
+
return db.registerFileHandle(sourceName, file, _duckdbWasm.DuckDBDataProtocol.BROWSER_FILEREADER, true);
|
|
525
|
+
case 28:
|
|
526
|
+
if (!(fileExt === 'csv')) {
|
|
527
|
+
_context4.next = 33;
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
_context4.next = 31;
|
|
531
|
+
return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_csv('").concat(sourceName, "', header = true, auto_detect = true, sample_size = -1);\n "));
|
|
532
|
+
case 31:
|
|
533
|
+
_context4.next = 46;
|
|
534
|
+
break;
|
|
535
|
+
case 33:
|
|
536
|
+
if (!(fileExt === 'json')) {
|
|
537
|
+
_context4.next = 38;
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
_context4.next = 36;
|
|
541
|
+
return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_json_auto('").concat(sourceName, "');\n "));
|
|
542
|
+
case 36:
|
|
543
|
+
_context4.next = 46;
|
|
544
|
+
break;
|
|
545
|
+
case 38:
|
|
546
|
+
if (!(fileExt === 'geojson')) {
|
|
547
|
+
_context4.next = 43;
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
_context4.next = 41;
|
|
551
|
+
return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM ST_READ('").concat(sourceName, "', keep_wkb = TRUE);\n "));
|
|
552
|
+
case 41:
|
|
553
|
+
_context4.next = 46;
|
|
554
|
+
break;
|
|
555
|
+
case 43:
|
|
556
|
+
if (!(fileExt === 'parquet')) {
|
|
557
|
+
_context4.next = 46;
|
|
558
|
+
break;
|
|
559
|
+
}
|
|
560
|
+
_context4.next = 46;
|
|
561
|
+
return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_parquet('").concat(sourceName, "')\n "));
|
|
562
|
+
case 46:
|
|
563
|
+
_context4.next = 52;
|
|
564
|
+
break;
|
|
565
|
+
case 48:
|
|
566
|
+
_context4.prev = 48;
|
|
567
|
+
_context4.t0 = _context4["catch"](12);
|
|
568
|
+
if (_context4.t0 instanceof Error) {
|
|
569
|
+
message = _context4.t0.message || ''; // output more readable errors for known issues
|
|
570
|
+
if (message.includes('Arrow Type with extension name: geoarrow')) {
|
|
571
|
+
error = new Error('The GeoArrow extensions are not implemented in the connected DuckDB version.');
|
|
572
|
+
} else if (message.includes("Geoparquet column 'geometry' does not have geometry types")) {
|
|
573
|
+
error = new Error("Invalid Input Error: Geoparquet column 'geometry' does not have geometry types.\nPossible reasons:\n - Old .parquet files that don't match the Parquet format specification.\n - Unsupported compression.");
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (!error) {
|
|
577
|
+
error = _context4.t0;
|
|
578
|
+
}
|
|
579
|
+
case 52:
|
|
580
|
+
_context4.next = 54;
|
|
581
|
+
return c.close();
|
|
582
|
+
case 54:
|
|
583
|
+
return _context4.abrupt("return", error);
|
|
584
|
+
case 55:
|
|
585
|
+
case "end":
|
|
586
|
+
return _context4.stop();
|
|
587
|
+
}
|
|
588
|
+
}, _callee4, null, [[12, 48]]);
|
|
589
|
+
}));
|
|
590
|
+
return _tableFromFile.apply(this, arguments);
|
|
591
|
+
}
|
|
592
|
+
function sanitizeDuckDBTableName(fileName) {
|
|
593
|
+
// Replace invalid characters with underscores
|
|
594
|
+
var name = fileName.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
595
|
+
// Ensure it doesn't start with a digit
|
|
596
|
+
if (/^\d/.test(name)) {
|
|
597
|
+
name = "t_".concat(name);
|
|
598
|
+
}
|
|
599
|
+
return name || 'default_table';
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl90eXBlIiwiX2R1Y2tkYldhc20iLCJfY29uc3RhbnRzIiwiX2luaXQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTVVBQT1JURURfRFVDS0RCX0RST1BfRVhURU5TSU9OUyIsImV4cG9ydHMiLCJnZXREdWNrREJDb2x1bW5UeXBlcyIsIl94IiwiX3gyIiwiX2dldER1Y2tEQkNvbHVtblR5cGVzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZTIiLCJjb25uZWN0aW9uIiwidGFibGVOYW1lIiwicmVzRGVzY3JpYmUiLCJkdWNrRGJUeXBlcyIsIm51bVJvd3MiLCJfcmVzRGVzY3JpYmUkZ2V0Q2hpbGQiLCJfcmVzRGVzY3JpYmUkZ2V0Q2hpbGQyIiwiY29sdW1uTmFtZSIsImNvbHVtblR5cGUiLCJ3cmFwIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwicHJldiIsIm5leHQiLCJxdWVyeSIsImNvbmNhdCIsInNlbnQiLCJnZXRDaGlsZEF0IiwicHVzaCIsIm5hbWUiLCJ0eXBlIiwiYWJydXB0Iiwic3RvcCIsImdldER1Y2tEQkNvbHVtblR5cGVzTWFwIiwiY29sdW1ucyIsInJlZHVjZSIsImFjYyIsInZhbHVlIiwiY29uc3RydWN0U1RfYXNXS0JRdWVyeSIsImNvbHVtbnNUb0NvbnZlcnRUb1dLQiIsImV4Y2x1ZGUiLCJsZW5ndGgiLCJqb2luIiwiYXNXS0IiLCJtYXAiLCJjb2x1bW4iLCJnZXRHZW9tZXRyeUNvbHVtbnMiLCJmaWx0ZXIiLCJzZXRHZW9BcnJvd1dLQkV4dGVuc2lvbiIsInRhYmxlIiwic2NoZW1hIiwiZmllbGRzIiwiZm9yRWFjaCIsImZpZWxkIiwiaW5mbyIsImZpbmQiLCJtZXRhZGF0YSIsIkdFT0FSUk9XX01FVEFEQVRBX0tFWSIsIkdFT0FSUk9XX0VYVEVOU0lPTlMiLCJXS0IiLCJyZXN0b3JlQXJyb3dUYWJsZSIsImFycm93U2NoZW1hIiwiY3JlYU9wdHMiLCJpbmRleCIsIlRhYmxlIiwicmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zIiwicmVtb3ZlZE1ldGFkYXRhIiwiZXh0ZW5zaW9uIiwic3RhcnRzV2l0aCIsInJlc3RvcmVVbnN1cHBvcnRlZEV4dGVuc2lvbnMiLCJyZW1vdmVkRXh0ZW5zaW9ucyIsImlzR2VvQXJyb3dQb2ludCIsIkRhdGFUeXBlIiwiaXNGaXhlZFNpemVMaXN0IiwiaW5jbHVkZXMiLCJsaXN0U2l6ZSIsImlzRmxvYXQiLCJjaGlsZHJlbiIsImlzR2VvQXJyb3dMaW5lU3RyaW5nIiwiaXNMaXN0IiwiaXNHZW9BcnJvd1BvbHlnb24iLCJpc0dlb0Fycm93TXVsdGlQb2ludCIsImlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmciLCJpc0dlb0Fycm93TXVsdGlQb2x5Z29uIiwiY2hlY2tJc1NlbGVjdFF1ZXJ5IiwiX3gzIiwiX3g0IiwiX2NoZWNrSXNTZWxlY3RRdWVyeSIsIl9jYWxsZWUzIiwicmVzdWx0IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwidDAiLCJzcGxpdFNxbFN0YXRlbWVudHMiLCJpbnB1dCIsInF1ZXJpZXMiLCJjdXJyZW50UXVlcnkiLCJpblNpbmdsZVF1b3RlIiwiaW5Eb3VibGVRdW90ZSIsImluTGluZUNvbW1lbnQiLCJpbkJsb2NrQ29tbWVudCIsImNoYXIiLCJ0cmltbWVkIiwidHJpbSIsInJlbW92ZVNRTENvbW1lbnRzIiwic3FsIiwicmVwbGFjZSIsImRyb3BUYWJsZUlmRXhpc3RzIiwiX3JlZiIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiY29uc29sZSIsImVycm9yIiwiX3g1IiwiX3g2IiwidGFibGVGcm9tRmlsZSIsIl94NyIsIl90YWJsZUZyb21GaWxlIiwiX2NhbGxlZTQiLCJmaWxlIiwiZmlsZUV4dCIsImRiIiwiYyIsInNvdXJjZU5hbWUiLCJhcnJheUJ1ZmZlciIsInVpbnQ4QXJyYXkiLCJhcnJvd1RhYmxlIiwibWVzc2FnZSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIkVycm9yIiwiZXh0IiwiZW5kc1dpdGgiLCJnZXREdWNrREIiLCJjb25uZWN0Iiwic2FuaXRpemVEdWNrREJUYWJsZU5hbWUiLCJVaW50OEFycmF5IiwidGFibGVGcm9tSVBDIiwiaW5zZXJ0QXJyb3dUYWJsZSIsInJlZ2lzdGVyRmlsZUhhbmRsZSIsIkR1Y2tEQkRhdGFQcm90b2NvbCIsIkJST1dTRVJfRklMRVJFQURFUiIsImNsb3NlIiwiZmlsZU5hbWUiLCJ0ZXN0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RhYmxlL2R1Y2tkYi10YWJsZS11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBsb2FkZXJzLmdsXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgKGMpIHZpcy5nbCBjb250cmlidXRvcnNcblxuLy8gQ29waWVkIGZyb20gbG9hZGVycy5nbC9nZW9hcnJvd1xuXG4vLyBUT0RPOiBSZW1vdmUgaXNHZW9BcnJvdyogb25jZSBLZXBsZXIuZ2wgaXMgdXBncmFkZWQgdG8gbG9hZGVycy5nbCA0LjQrXG5cbmltcG9ydCAqIGFzIGFycm93IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICdhcGFjaGUtYXJyb3cvdHlwZSc7XG5pbXBvcnQge0FzeW5jRHVja0RCQ29ubmVjdGlvbiwgRHVja0RCRGF0YVByb3RvY29sfSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtHRU9BUlJPV19FWFRFTlNJT05TLCBHRU9BUlJPV19NRVRBREFUQV9LRVl9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQge2dldER1Y2tEQn0gZnJvbSAnLi4vaW5pdCc7XG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfRFVDS0RCX0RST1BfRVhURU5TSU9OUyA9IFsnYXJyb3cnLCAnY3N2JywgJ2dlb2pzb24nLCAnanNvbicsICdwYXJxdWV0J107XG5cbmV4cG9ydCB0eXBlIER1Y2tEQkNvbHVtbkRlc2MgPSB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmd9O1xuXG4vKipcbiAqIFF1ZXJpZXMgYSBEdWNrREIgdGFibGUgZm9yIHRoZSBzY2hlbWEgZGVzY3JpcHRpb24uXG4gKiBAcGFyYW0gY29ubmVjdGlvbiBBbiBhY3RpdmUgRHVja0RCIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gdGFibGVOYW1lIEEgbmFtZSBvZiBEdWNrREIgdGFibGUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgYW5kIER1Y2tEQiB0eXBlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldER1Y2tEQkNvbHVtblR5cGVzKFxuICBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb24sXG4gIHRhYmxlTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPER1Y2tEQkNvbHVtbkRlc2NbXT4ge1xuICBjb25zdCByZXNEZXNjcmliZSA9IGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoYERFU0NSSUJFIFwiJHt0YWJsZU5hbWV9XCI7YCk7XG5cbiAgY29uc3QgZHVja0RiVHlwZXM6IER1Y2tEQkNvbHVtbkRlc2NbXSA9IFtdO1xuICBjb25zdCBudW1Sb3dzID0gcmVzRGVzY3JpYmUubnVtUm93cztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyArK2kpIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gcmVzRGVzY3JpYmUuZ2V0Q2hpbGRBdCgwKT8uZ2V0KGkpO1xuICAgIGNvbnN0IGNvbHVtblR5cGUgPSByZXNEZXNjcmliZS5nZXRDaGlsZEF0KDEpPy5nZXQoaSk7XG5cbiAgICBkdWNrRGJUeXBlcy5wdXNoKHtcbiAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICB0eXBlOiBjb2x1bW5UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZHVja0RiVHlwZXM7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbWFwcGluZyBvZiBjb2x1bW4gbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBEdWNrREIgZGF0YSB0eXBlcy5cbiAqIEBwYXJhbSBjb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbiBkZXNjcmlwdGlvbnMgZnJvbSBEdWNrREIuIENoZWNrIGdldER1Y2tEQkNvbHVtblR5cGVzLlxuICogQHJldHVybnMgQSByZWNvcmQgd2hlcmUga2V5cyBhcmUgY29sdW1uIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZWlyIGRhdGEgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREdWNrREJDb2x1bW5UeXBlc01hcChjb2x1bW5zOiBEdWNrREJDb2x1bW5EZXNjW10pIHtcbiAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKChhY2MsIHZhbHVlKSA9PiB7XG4gICAgYWNjW3ZhbHVlLm5hbWVdID0gdmFsdWUudHlwZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGFuIFNRTCBxdWVyeSB0byBzZWxlY3QgYWxsIGNvbHVtbnMgZnJvbSBhIGdpdmVuIHRhYmxlLFxuICogY29udmVydGluZyBzcGVjaWZpZWQgY29sdW1ucyB0byBXZWxsLUtub3duIEJpbmFyeSAoV0tCKSBmb3JtYXQgdXNpbmcgU1RfQXNXS0IuXG4gKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBmcm9tIHdoaWNoIHRvIHNlbGVjdCBkYXRhLlxuICogQHBhcmFtIGNvbHVtbnNUb0NvbnZlcnRUb1dLQiBBbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvIFdLQiBmb3JtYXQuXG4gKiBAcmV0dXJucyBUaGUgY29uc3RydWN0ZWQgU1FMIHF1ZXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0U1RfYXNXS0JRdWVyeSh0YWJsZU5hbWU6IHN0cmluZywgY29sdW1uc1RvQ29udmVydFRvV0tCOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4Y2x1ZGUgPVxuICAgIGNvbHVtbnNUb0NvbnZlcnRUb1dLQi5sZW5ndGggPiAwID8gYEVYQ0xVREUgJHtjb2x1bW5zVG9Db252ZXJ0VG9XS0Iuam9pbignLCAnKX1gIDogJyc7XG4gIGNvbnN0IGFzV0tCID1cbiAgICBjb2x1bW5zVG9Db252ZXJ0VG9XS0IubGVuZ3RoID4gMFxuICAgICAgPyBgLCAke2NvbHVtbnNUb0NvbnZlcnRUb1dLQi5tYXAoY29sdW1uID0+IGBTVF9Bc1dLQigke2NvbHVtbn0pIGFzICR7Y29sdW1ufWApLmpvaW4oJywgJyl9YFxuICAgICAgOiAnJztcbiAgcmV0dXJuIGBTRUxFQ1QgKiAke2V4Y2x1ZGV9ICR7YXNXS0J9IEZST00gJyR7dGFibGVOYW1lfSc7YDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgbmFtZXMgb2YgY29sdW1ucyB0aGF0IGhhdmUgYSBHRU9NRVRSWSB0eXBlLlxuICogQHBhcmFtIGNvbHVtbnMgQW4gYXJyYXkgb2YgY29sdW1uIGRlc2NyaXB0b3JzIGZyb20gYSBEdWNrREIgdGFibGUuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgb2YgdHlwZSBHRU9NRVRSWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb21ldHJ5Q29sdW1ucyhjb2x1bW5zOiBEdWNrREJDb2x1bW5EZXNjW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnR5cGUgPT09ICdHRU9NRVRSWScpLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIEdlb0Fycm93IFdLQiBleHRlbnNpb24gbWV0YWRhdGEgZm9yIGNvbHVtbnMgb2YgdHlwZSBHRU9NRVRSWSBpbiBhbiBBcnJvdyB0YWJsZS5cbiAqIEBwYXJhbSB0YWJsZSBUaGUgQXBhY2hlIEFycm93IHRhYmxlIHdob3NlIHNjaGVtYSBmaWVsZHMgd2lsbCBiZSBtb2RpZmllZC5cbiAqIEBwYXJhbSBjb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbiBkZXNjcmlwdG9ycyBmcm9tIGEgRHVja0RCIHRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2VvQXJyb3dXS0JFeHRlbnNpb24odGFibGU6IGFycm93LlRhYmxlLCBjb2x1bW5zOiBEdWNrREJDb2x1bW5EZXNjW10pIHtcbiAgdGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBjb25zdCBpbmZvID0gY29sdW1ucy5maW5kKHQgPT4gdC5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICBpZiAoaW5mbz8udHlwZSA9PT0gJ0dFT01FVFJZJykge1xuICAgICAgZmllbGQubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5XS0IpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJvdyB0YWJsZSBmcm9tIGFuIGFycmF5IG9mIGFycm93IHZlY3RvcnMgYW5kIGZpZWxkcy5cbiAqIEBwYXJhbSBjb2x1bW5zIEFuIGFycmF5IG9mIGFycm93IHZlY3RvcnMuXG4gKiBAcGFyYW0gZmllbGRzIEFuIGFycmF5IG9mIGZpZWxkcyBwZXIgYXJyb3cgdmVjdG9yLlxuICogQHBhcmFtIGFycm93U2NoZW1hIE9wdGlvbmFsIGFycm93IHRhYmxlIHNjaGVtYSB3aGVuIGF2YWlsYWJsZS5cbiAqIEByZXR1cm5zIEFuIGFycm93IHRhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVzdG9yZUFycm93VGFibGUgPSAoXG4gIGNvbHVtbnM6IGFycm93LlZlY3RvcltdLFxuICBmaWVsZHM6IFByb3RvRGF0YXNldEZpZWxkW10sXG4gIGFycm93U2NoZW1hPzogYXJyb3cuU2NoZW1hXG4pID0+IHtcbiAgY29uc3QgY3JlYU9wdHMgPSB7fTtcbiAgZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgY3JlYU9wdHNbZmllbGQubmFtZV0gPSBjb2x1bW5zW2luZGV4XTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycm93U2NoZW1hID8gbmV3IGFycm93LlRhYmxlKGFycm93U2NoZW1hLCBjcmVhT3B0cykgOiBuZXcgYXJyb3cuVGFibGUoY3JlYU9wdHMpO1xufTtcblxuLyoqXG4gKiBEdWNrRGIgdGhyb3dzIHdoZW4gZ2VvYXJyb3cgZXh0ZW5zaW9ucyBhcmUgcHJlc2VudCBpbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB0YWJsZSBBbiBhcnJvdyB0YWJsZSB0byBjbGVhciBmcm9tIGV4dGVuc2lvbnMuXG4gKiBAcmV0dXJucyBBIG1hcCBvZiByZW1vdmVkIHBlciBmaWVsZCBnZW9hcnJvdyBleHRlbnNpb25zLlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zID0gKHRhYmxlOiBhcnJvdy5UYWJsZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCByZW1vdmVkTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgdGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWVsZC5tZXRhZGF0YS5nZXQoR0VPQVJST1dfTUVUQURBVEFfS0VZKTtcbiAgICBpZiAoZXh0ZW5zaW9uPy5zdGFydHNXaXRoKCdnZW9hcnJvdycpKSB7XG4gICAgICByZW1vdmVkTWV0YWRhdGFbZmllbGQubmFtZV0gPSBleHRlbnNpb247XG4gICAgICBmaWVsZC5tZXRhZGF0YS5kZWxldGUoR0VPQVJST1dfTUVUQURBVEFfS0VZKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVtb3ZlZE1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBSZXN0b3JlIHJlbW92ZWQgbWV0YWRhdGEgZXh0ZW5zaW9ucyBhZnRlciBhIGNhbGwgdG8gcmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zLlxuICogQHBhcmFtIHRhYmxlIEFuIGFycm93IHRhYmxlIHRvIHJlc3RvcmUgZ2VvYXJyb3cgZXh0ZW5zaW9ucy5cbiAqIEBwYXJhbSByZW1vdmVkRXh0ZW5zaW9ucyBBIG1hcCBvZiBwZXIgZmllbGQgZ2VvYXJyb3cgZXh0ZW5zaW9ucyB0byByZXN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgcmVzdG9yZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IChcbiAgdGFibGU6IGFycm93LlRhYmxlLFxuICByZW1vdmVkRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKSA9PiB7XG4gIHRhYmxlLnNjaGVtYS5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcmVtb3ZlZEV4dGVuc2lvbnNbZmllbGQubmFtZV07XG4gICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgZmllbGQubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgZXh0ZW5zaW9uKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvaW50IGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dQb2ludCh0eXBlOiBEYXRhVHlwZSkge1xuICBpZiAoRGF0YVR5cGUuaXNGaXhlZFNpemVMaXN0KHR5cGUpKSB7XG4gICAgLy8gQ2hlY2sgbGlzdCBzaXplXG4gICAgaWYgKCFbMiwgMywgNF0uaW5jbHVkZXModHlwZS5saXN0U2l6ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBjaGlsZCBvZiBGaXhlZFNpemVMaXN0IGlzIGZsb2F0aW5nIHR5cGVcbiAgICBpZiAoIURhdGFUeXBlLmlzRmxvYXQodHlwZS5jaGlsZHJlblswXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvaW50IGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dMaW5lU3RyaW5nKHR5cGU6IERhdGFUeXBlKSB7XG4gIC8vIENoZWNrIHRoZSBvdXRlciB0eXBlIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvaW50IHR5cGVcbiAgaWYgKCFpc0dlb0Fycm93UG9pbnQodHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9seWdvbiBkYXRhIHR5cGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0Fycm93UG9seWdvbih0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIGxpbmVzdHJpbmcgdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd0xpbmVTdHJpbmcodHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9seWdvbiBkYXRhIHR5cGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0Fycm93TXVsdGlQb2ludCh0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvaW50IHZlY3RvclxuICBpZiAoIWlzR2VvQXJyb3dQb2ludCh0eXBlLmNoaWxkcmVuWzBdLnR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gQXBhY2hlIEFycm93IEpTIHR5cGUgaXMgYSBQb2x5Z29uIGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcodHlwZTogRGF0YVR5cGUpIHtcbiAgLy8gQ2hlY2sgdGhlIG91dGVyIHZlY3RvciBpcyBhIExpc3RcbiAgaWYgKCFEYXRhVHlwZS5pc0xpc3QodHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayB0aGUgY2hpbGQgaXMgYSBsaW5lc3RyaW5nIHZlY3RvclxuICBpZiAoIWlzR2VvQXJyb3dMaW5lU3RyaW5nKHR5cGUuY2hpbGRyZW5bMF0udHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvbHlnb24gZGF0YSB0eXBlICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9BcnJvd011bHRpUG9seWdvbih0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvbHlnb24gdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd1BvbHlnb24odHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGlzIGEgU0VMRUNUIHF1ZXJ5IGJ5IHVzaW5nIHRoZSBFWFBMQUlOIGNvbW1hbmQuXG4gKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgRHVja0RCIGNvbm5lY3Rpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcXVlcnkgVGhlIFNRTCBxdWVyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVlcnkgaXMgYSBTRUxFQ1Qgc3RhdGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrSXNTZWxlY3RRdWVyeShcbiAgY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uLFxuICBxdWVyeTogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KGBFWFBMQUlOICgke3F1ZXJ5fSlgKTtcbiAgICByZXR1cm4gcmVzdWx0Lm51bVJvd3MgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNwbGl0IGEgc3RyaW5nIHdpdGggcG90ZW50aWFsbHkgbXVsdGlwbGUgU1FMIHF1ZXJpZXMgKHNlcGFyYXRlZCBhcyB1c3VhbCBieSAnOycpIGludG8gYW4gYXJyYXkgb2YgcXVlcmllcy5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb246XG4gKiAgLSBIYW5kbGVzIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlZCBzdHJpbmdzIHdpdGggcHJvcGVyIGVzY2FwaW5nXG4gKiAgLSBJZ25vcmVzIHNlbWljb2xvbnMgaW4gbGluZSBjb21tZW50cyAoLS0pIGFuZCBibG9jayBjb21tZW50cyAoc2xhc2ggYXN0ZXJpc2spXG4gKiAgLSBUcmltcyB3aGl0ZXNwYWNlIGZyb20gcXVlcmllc1xuICogIC0gSGFuZGxlcyBTUUwtc3R5bGUgZXNjYXBlZCBxdW90ZXMgKCcnIGluc2lkZSBzdHJpbmdzKVxuICogIC0gUmV0dXJucyBvbmx5IG5vbi1lbXB0eSBxdWVyaWVzXG4gKiBAcGFyYW0gaW5wdXQgQSBzdHJpbmcgd2l0aCBwb3RlbnRpYWxseSBtdWx0aXBsZSBTUUwgcXVlcmllcy5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNxbFN0YXRlbWVudHMoaW5wdXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcXVlcmllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRRdWVyeSA9ICcnO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5MaW5lQ29tbWVudCA9IGZhbHNlO1xuICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IGlucHV0W2ldO1xuXG4gICAgaWYgKGluTGluZUNvbW1lbnQpIHtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgaWYgKGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgIGluTGluZUNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpbkJsb2NrQ29tbWVudCkge1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXI7XG4gICAgICBpZiAoY2hhciA9PT0gJyonICYmIGlucHV0W2kgKyAxXSA9PT0gJy8nKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIGN1cnJlbnRRdWVyeSArPSBpbnB1dFsrK2ldOyAvLyBDb25zdW1lICcvJ1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGluU2luZ2xlUXVvdGUpIHtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSBlc2NhcGVkIHNpbmdsZSBxdW90ZXMgaW4gU1FMXG4gICAgICAgIGlmIChpICsgMSA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXJ5ICs9IGlucHV0WysraV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5Eb3VibGVRdW90ZSkge1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXI7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAvLyBIYW5kbGUgZXNjYXBlZCBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmIChpICsgMSA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtpICsgMV0gPT09ICdcIicpIHtcbiAgICAgICAgICBjdXJyZW50UXVlcnkgKz0gaW5wdXRbKytpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBjb21tZW50IHN0YXJ0c1xuICAgIGlmIChjaGFyID09PSAnLScgJiYgaW5wdXRbaSArIDFdID09PSAnLScpIHtcbiAgICAgIGluTGluZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXIgKyBpbnB1dFsrK2ldO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBpbnB1dFtpICsgMV0gPT09ICcqJykge1xuICAgICAgaW5CbG9ja0NvbW1lbnQgPSB0cnVlO1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXIgKyBpbnB1dFsrK2ldO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHF1b3RlIHN0YXJ0c1xuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgaW5TaW5nbGVRdW90ZSA9IHRydWU7XG4gICAgICBjdXJyZW50UXVlcnkgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICBpbkRvdWJsZVF1b3RlID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHF1ZXJ5IHNlcGFyYXRvclxuICAgIGlmIChjaGFyID09PSAnOycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50UXVlcnkudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBxdWVyaWVzLnB1c2godHJpbW1lZCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UXVlcnkgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBxdWVyeVxuICBjb25zdCB0cmltbWVkID0gY3VycmVudFF1ZXJ5LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkge1xuICAgIHF1ZXJpZXMucHVzaCh0cmltbWVkKTtcbiAgfVxuXG4gIHJldHVybiBxdWVyaWVzO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgU1FMIGNvbW1lbnRzIGZyb20gYSBnaXZlbiBTUUwgc3RyaW5nLlxuICogQHBhcmFtIHNxbCBUaGUgU1FMIHF1ZXJ5IHN0cmluZyBmcm9tIHdoaWNoIGNvbW1lbnRzIHNob3VsZCBiZSByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgU1FMIHN0cmluZyB3aXRob3V0IGNvbW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU1FMQ29tbWVudHMoc3FsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZW1vdmUgbXVsdGktbGluZSBjb21tZW50cyAoLyogLi4uICovKVxuICBzcWwgPSBzcWwucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG4gIC8vIFJlbW92ZSBzaW5nbGUtbGluZSBjb21tZW50cyAoLS0gLi4uKVxuICBzcWwgPSBzcWwucmVwbGFjZSgvLS0uKiQvZ20sICcnKTtcbiAgcmV0dXJuIHNxbC50cmltKCk7XG59XG5cbi8qKlxuICogRHJvcHMgYSB0YWJsZSBpZiBpdCBleGlzdHMgaW4gdGhlIER1Y2tEQiBkYXRhYmFzZS5cbiAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBEdWNrREIgY29ubmVjdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB0YWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRyb3AuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKiBAdGhyb3dzIExvZ3MgYW4gZXJyb3IgaWYgdGhlIHRhYmxlIGRyb3Agb3BlcmF0aW9uIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3QgZHJvcFRhYmxlSWZFeGlzdHMgPSBhc3luYyAoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uLCB0YWJsZU5hbWU6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoYERST1AgVEFCTEUgSUYgRVhJU1RTIFwiJHt0YWJsZU5hbWV9XCI7YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRHJvcHBpbmcgdGFibGUgZmFpbGVkJywgdGFibGVOYW1lLCBlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogSW1wb3J0cyBhIGZpbGUgaW50byBEdWNrREIgYXMgYSB0YWJsZSwgc3VwcG9ydGluZyBtdWx0aXBsZSBmb3JtYXRzIGZyb20gU1VQUE9SVEVEX0RVQ0tEQl9EUk9QX0VYVEVOU0lPTlMuXG4gKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSBpbXBvcnRlZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkIGludG8gYSBEdWNrREIgdGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YWJsZUZyb21GaWxlKGZpbGU6IEZpbGUgfCBudWxsKTogUHJvbWlzZTxudWxsIHwgRXJyb3I+IHtcbiAgaWYgKCFmaWxlKSByZXR1cm4gbmV3IEVycm9yKCdGaWxlIERyYWcgJiBEcm9wOiBObyBmaWxlJyk7XG5cbiAgY29uc3QgZmlsZUV4dCA9IFNVUFBPUlRFRF9EVUNLREJfRFJPUF9FWFRFTlNJT05TLmZpbmQoZXh0ID0+IGZpbGUubmFtZS5lbmRzV2l0aChleHQpKTtcbiAgaWYgKCFmaWxlRXh0KSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcIkZpbGUgRHJhZyAmIERyb3A6IEZpbGUgZXh0ZW5zaW9uIGlzbid0IHN1cHBvcnRlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGRiID0gYXdhaXQgZ2V0RHVja0RCKCk7XG4gIGNvbnN0IGMgPSBhd2FpdCBkYi5jb25uZWN0KCk7XG5cbiAgbGV0IGVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gc2FuaXRpemVEdWNrREJUYWJsZU5hbWUoZmlsZS5uYW1lKTtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gJ3RlbXBfZmlsZV9oYW5kbGUnO1xuXG4gICAgYy5xdWVyeShgaW5zdGFsbCBzcGF0aWFsO1xuICAgICAgbG9hZCBzcGF0aWFsO2ApO1xuXG4gICAgaWYgKGZpbGVFeHQgPT09ICdhcnJvdycpIHtcbiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgIGNvbnN0IGFycm93VGFibGUgPSBhcnJvdy50YWJsZUZyb21JUEModWludDhBcnJheSk7XG5cbiAgICAgIGF3YWl0IGMuaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCB7bmFtZTogdGFibGVOYW1lfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShzb3VyY2VOYW1lLCBmaWxlLCBEdWNrREJEYXRhUHJvdG9jb2wuQlJPV1NFUl9GSUxFUkVBREVSLCB0cnVlKTtcblxuICAgICAgaWYgKGZpbGVFeHQgPT09ICdjc3YnKSB7XG4gICAgICAgIGF3YWl0IGMucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RhYmxlTmFtZX0nIEFTXG4gICAgICAgICAgICBTRUxFQ1QgKlxuICAgICAgICAgICAgRlJPTSByZWFkX2NzdignJHtzb3VyY2VOYW1lfScsIGhlYWRlciA9IHRydWUsIGF1dG9fZGV0ZWN0ID0gdHJ1ZSwgc2FtcGxlX3NpemUgPSAtMSk7XG4gICAgICAgICAgYCk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVFeHQgPT09ICdqc29uJykge1xuICAgICAgICBhd2FpdCBjLnF1ZXJ5KGBcbiAgICAgICAgICAgIENSRUFURSBUQUJMRSAnJHt0YWJsZU5hbWV9JyBBU1xuICAgICAgICAgICAgU0VMRUNUICpcbiAgICAgICAgICAgIEZST00gcmVhZF9qc29uX2F1dG8oJyR7c291cmNlTmFtZX0nKTtcbiAgICAgICAgICBgKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZUV4dCA9PT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIGF3YWl0IGMucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RhYmxlTmFtZX0nIEFTXG4gICAgICAgICAgICBTRUxFQ1QgKlxuICAgICAgICAgICAgRlJPTSBTVF9SRUFEKCcke3NvdXJjZU5hbWV9Jywga2VlcF93a2IgPSBUUlVFKTtcbiAgICAgICAgICBgKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZUV4dCA9PT0gJ3BhcnF1ZXQnKSB7XG4gICAgICAgIGF3YWl0IGMucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RhYmxlTmFtZX0nIEFTXG4gICAgICAgICAgICBTRUxFQ1QgKlxuICAgICAgICAgICAgRlJPTSByZWFkX3BhcnF1ZXQoJyR7c291cmNlTmFtZX0nKVxuICAgICAgICAgIGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3JEYXRhKSB7XG4gICAgaWYgKGVycm9yRGF0YSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JEYXRhLm1lc3NhZ2UgfHwgJyc7XG4gICAgICAvLyBvdXRwdXQgbW9yZSByZWFkYWJsZSBlcnJvcnMgZm9yIGtub3duIGlzc3Vlc1xuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ0Fycm93IFR5cGUgd2l0aCBleHRlbnNpb24gbmFtZTogZ2VvYXJyb3cnKSkge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGhlIEdlb0Fycm93IGV4dGVuc2lvbnMgYXJlIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29ubmVjdGVkIER1Y2tEQiB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIkdlb3BhcnF1ZXQgY29sdW1uICdnZW9tZXRyeScgZG9lcyBub3QgaGF2ZSBnZW9tZXRyeSB0eXBlc1wiKSkge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBJbnB1dCBFcnJvcjogR2VvcGFycXVldCBjb2x1bW4gJ2dlb21ldHJ5JyBkb2VzIG5vdCBoYXZlIGdlb21ldHJ5IHR5cGVzLlxuUG9zc2libGUgcmVhc29uczpcbiAgLSBPbGQgLnBhcnF1ZXQgZmlsZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgUGFycXVldCBmb3JtYXQgc3BlY2lmaWNhdGlvbi5cbiAgLSBVbnN1cHBvcnRlZCBjb21wcmVzc2lvbi5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgZXJyb3IgPSBlcnJvckRhdGEgYXMgRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYy5jbG9zZSgpO1xuXG4gIHJldHVybiBlcnJvcjtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZXMgYSBmaWxlIG5hbWUgdG8gYmUgYSB2YWxpZCBEdWNrREIgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgaW5wdXQgZmlsZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cbiAqIEByZXR1cm5zIEEgdmFsaWQgRHVja0RCIHRhYmxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUR1Y2tEQlRhYmxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3Jlc1xuICBsZXQgbmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgJ18nKTtcbiAgLy8gRW5zdXJlIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRpZ2l0XG4gIGlmICgvXlxcZC8udGVzdChuYW1lKSkge1xuICAgIG5hbWUgPSBgdF8ke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZSB8fCAnZGVmYXVsdF90YWJsZSc7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxJQUFBQSxLQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFHQSxJQUFBSSxLQUFBLEdBQUFKLE9BQUE7QUFBa0MsU0FBQUsseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFQLHdCQUFBTyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FB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
|
|
@@ -3,12 +3,14 @@ import { AsyncDuckDB, AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
|
3
3
|
import { KeplerTable } from '@kepler.gl/table';
|
|
4
4
|
import { ProcessorResult } from '../processors/data-processor';
|
|
5
5
|
declare type ImportDataToDuckProps = {
|
|
6
|
-
data: ProcessorResult
|
|
6
|
+
data: ProcessorResult & {
|
|
7
|
+
arrowSchema: arrow.Schema;
|
|
8
|
+
};
|
|
7
9
|
db: AsyncDuckDB;
|
|
8
10
|
c: AsyncDuckDBConnection;
|
|
9
11
|
};
|
|
10
12
|
declare type ImportDataToDuckResult = {
|
|
11
|
-
|
|
13
|
+
geoarrowMetadata?: Record<string, string>;
|
|
12
14
|
useNewFields?: boolean;
|
|
13
15
|
};
|
|
14
16
|
export declare class KeplerGlDuckDbTable extends KeplerTable {
|
|
@@ -19,7 +21,7 @@ export declare class KeplerGlDuckDbTable extends KeplerTable {
|
|
|
19
21
|
constructor(props: any);
|
|
20
22
|
importRowData({ data, db, c }: ImportDataToDuckProps): Promise<void>;
|
|
21
23
|
importGeoJsonData({ data, db, c }: ImportDataToDuckProps): Promise<ImportDataToDuckResult>;
|
|
22
|
-
importArrowData({ data,
|
|
24
|
+
importArrowData({ data, c }: ImportDataToDuckProps): Promise<ImportDataToDuckResult>;
|
|
23
25
|
/**
|
|
24
26
|
* Creates a table from data, returns an arrow table with the data
|
|
25
27
|
* @param data
|