@kepler.gl/duckdb 3.3.0-alpha.1 → 3.3.0-alpha.10
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/cjs/adapters/duckdb-wasm-adapter.js +258 -0
- package/dist/{components → cjs/components}/index.js +1 -1
- package/dist/cjs/components/monaco-editor.js +174 -0
- package/dist/cjs/components/preview-data-panel.js +127 -0
- package/dist/cjs/components/schema-panel.js +170 -0
- package/dist/cjs/components/sql-panel.js +395 -0
- package/dist/cjs/components/tree.js +90 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/{plugin.js → cjs/plugin.js} +2 -2
- package/dist/cjs/processors/data-processor.js +353 -0
- package/dist/cjs/table/duckdb-table-utils.js +670 -0
- package/dist/cjs/table/duckdb-table.js +482 -0
- package/dist/{table → cjs/table}/index.js +1 -1
- package/dist/cjs/utils/perf.js +46 -0
- package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
- package/dist/esm/components/index.js +9 -0
- package/dist/esm/components/monaco-editor.js +167 -0
- package/dist/esm/components/preview-data-panel.js +120 -0
- package/dist/esm/components/schema-panel.js +164 -0
- package/dist/esm/components/sql-panel.js +388 -0
- package/dist/esm/components/tree.js +82 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/plugin.js +22 -0
- package/dist/esm/processors/data-processor.js +342 -0
- package/dist/esm/table/duckdb-table-utils.js +645 -0
- package/dist/esm/table/duckdb-table.js +477 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/utils/perf.js +40 -0
- package/dist/table/duckdb-table-utils.d.ts +7 -0
- package/package.json +24 -21
- package/dist/adapters/duckdb-wasm-adapter.js +0 -259
- package/dist/components/monaco-editor.js +0 -175
- package/dist/components/preview-data-panel.js +0 -128
- package/dist/components/schema-panel.js +0 -171
- package/dist/components/sql-panel.js +0 -396
- package/dist/components/tree.js +0 -91
- package/dist/processors/data-processor.js +0 -353
- package/dist/table/duckdb-table-utils.js +0 -669
- package/dist/table/duckdb-table.js +0 -480
- package/dist/utils/perf.js +0 -46
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
4
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
5
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
6
|
+
// SPDX-License-Identifier: MIT
|
|
7
|
+
// Copyright contributors to the kepler.gl project
|
|
8
|
+
|
|
9
|
+
import * as duckdb from '@duckdb/duckdb-wasm';
|
|
10
|
+
import { AsyncDuckDB } from '@duckdb/duckdb-wasm';
|
|
11
|
+
import { logElapsedTime } from '../utils/perf';
|
|
12
|
+
var Connection = /*#__PURE__*/function () {
|
|
13
|
+
function Connection(connection) {
|
|
14
|
+
_classCallCheck(this, Connection);
|
|
15
|
+
_defineProperty(this, "connection", void 0);
|
|
16
|
+
this.connection = connection;
|
|
17
|
+
}
|
|
18
|
+
return _createClass(Connection, [{
|
|
19
|
+
key: "query",
|
|
20
|
+
value: function () {
|
|
21
|
+
var _query = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(statement) {
|
|
22
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
23
|
+
while (1) switch (_context.prev = _context.next) {
|
|
24
|
+
case 0:
|
|
25
|
+
return _context.abrupt("return", this.connection.query(statement));
|
|
26
|
+
case 1:
|
|
27
|
+
case "end":
|
|
28
|
+
return _context.stop();
|
|
29
|
+
}
|
|
30
|
+
}, _callee, this);
|
|
31
|
+
}));
|
|
32
|
+
function query(_x) {
|
|
33
|
+
return _query.apply(this, arguments);
|
|
34
|
+
}
|
|
35
|
+
return query;
|
|
36
|
+
}()
|
|
37
|
+
}, {
|
|
38
|
+
key: "insertArrowTable",
|
|
39
|
+
value: function () {
|
|
40
|
+
var _insertArrowTable = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(arrowTable, params) {
|
|
41
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
42
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
43
|
+
case 0:
|
|
44
|
+
_context2.next = 2;
|
|
45
|
+
return this.connection.insertArrowTable(arrowTable, params);
|
|
46
|
+
case 2:
|
|
47
|
+
case "end":
|
|
48
|
+
return _context2.stop();
|
|
49
|
+
}
|
|
50
|
+
}, _callee2, this);
|
|
51
|
+
}));
|
|
52
|
+
function insertArrowTable(_x2, _x3) {
|
|
53
|
+
return _insertArrowTable.apply(this, arguments);
|
|
54
|
+
}
|
|
55
|
+
return insertArrowTable;
|
|
56
|
+
}()
|
|
57
|
+
}, {
|
|
58
|
+
key: "close",
|
|
59
|
+
value: function () {
|
|
60
|
+
var _close = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
61
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
62
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
63
|
+
case 0:
|
|
64
|
+
_context3.next = 2;
|
|
65
|
+
return this.connection.close();
|
|
66
|
+
case 2:
|
|
67
|
+
case "end":
|
|
68
|
+
return _context3.stop();
|
|
69
|
+
}
|
|
70
|
+
}, _callee3, this);
|
|
71
|
+
}));
|
|
72
|
+
function close() {
|
|
73
|
+
return _close.apply(this, arguments);
|
|
74
|
+
}
|
|
75
|
+
return close;
|
|
76
|
+
}()
|
|
77
|
+
}]);
|
|
78
|
+
}();
|
|
79
|
+
export var DuckDBWasmAdapter = /*#__PURE__*/function () {
|
|
80
|
+
function DuckDBWasmAdapter(options) {
|
|
81
|
+
_classCallCheck(this, DuckDBWasmAdapter);
|
|
82
|
+
_defineProperty(this, "duckDB", void 0);
|
|
83
|
+
// pass existing AsyncDuckDB object created elsewhere
|
|
84
|
+
if (options instanceof Promise || options instanceof AsyncDuckDB) {
|
|
85
|
+
this.duckDB = options;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// or create a new AsyncDuckDB object
|
|
90
|
+
var _ref = options || {},
|
|
91
|
+
_ref$debug = _ref.debug,
|
|
92
|
+
debug = _ref$debug === void 0 ? false : _ref$debug,
|
|
93
|
+
config = _ref.config;
|
|
94
|
+
this.duckDB = initializeDuckDbWasm(config, debug);
|
|
95
|
+
}
|
|
96
|
+
return _createClass(DuckDBWasmAdapter, [{
|
|
97
|
+
key: "connect",
|
|
98
|
+
value: function () {
|
|
99
|
+
var _connect = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
100
|
+
var db, c;
|
|
101
|
+
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
102
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
103
|
+
case 0:
|
|
104
|
+
_context4.next = 2;
|
|
105
|
+
return this.duckDB;
|
|
106
|
+
case 2:
|
|
107
|
+
db = _context4.sent;
|
|
108
|
+
_context4.next = 5;
|
|
109
|
+
return db.connect();
|
|
110
|
+
case 5:
|
|
111
|
+
c = _context4.sent;
|
|
112
|
+
return _context4.abrupt("return", new Connection(c));
|
|
113
|
+
case 7:
|
|
114
|
+
case "end":
|
|
115
|
+
return _context4.stop();
|
|
116
|
+
}
|
|
117
|
+
}, _callee4, this);
|
|
118
|
+
}));
|
|
119
|
+
function connect() {
|
|
120
|
+
return _connect.apply(this, arguments);
|
|
121
|
+
}
|
|
122
|
+
return connect;
|
|
123
|
+
}()
|
|
124
|
+
}, {
|
|
125
|
+
key: "registerFileText",
|
|
126
|
+
value: function () {
|
|
127
|
+
var _registerFileText = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(filename, content) {
|
|
128
|
+
var db;
|
|
129
|
+
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
130
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
131
|
+
case 0:
|
|
132
|
+
_context5.next = 2;
|
|
133
|
+
return this.duckDB;
|
|
134
|
+
case 2:
|
|
135
|
+
db = _context5.sent;
|
|
136
|
+
_context5.next = 5;
|
|
137
|
+
return db.registerFileText(filename, content);
|
|
138
|
+
case 5:
|
|
139
|
+
case "end":
|
|
140
|
+
return _context5.stop();
|
|
141
|
+
}
|
|
142
|
+
}, _callee5, this);
|
|
143
|
+
}));
|
|
144
|
+
function registerFileText(_x4, _x5) {
|
|
145
|
+
return _registerFileText.apply(this, arguments);
|
|
146
|
+
}
|
|
147
|
+
return registerFileText;
|
|
148
|
+
}()
|
|
149
|
+
}, {
|
|
150
|
+
key: "registerFileHandle",
|
|
151
|
+
value: function () {
|
|
152
|
+
var _registerFileHandle = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(name, handle, protocol, directIO) {
|
|
153
|
+
var db;
|
|
154
|
+
return _regeneratorRuntime.wrap(function _callee6$(_context6) {
|
|
155
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
156
|
+
case 0:
|
|
157
|
+
_context6.next = 2;
|
|
158
|
+
return this.duckDB;
|
|
159
|
+
case 2:
|
|
160
|
+
db = _context6.sent;
|
|
161
|
+
_context6.next = 5;
|
|
162
|
+
return db.registerFileHandle(name, handle, protocol, directIO);
|
|
163
|
+
case 5:
|
|
164
|
+
case "end":
|
|
165
|
+
return _context6.stop();
|
|
166
|
+
}
|
|
167
|
+
}, _callee6, this);
|
|
168
|
+
}));
|
|
169
|
+
function registerFileHandle(_x6, _x7, _x8, _x9) {
|
|
170
|
+
return _registerFileHandle.apply(this, arguments);
|
|
171
|
+
}
|
|
172
|
+
return registerFileHandle;
|
|
173
|
+
}()
|
|
174
|
+
}]);
|
|
175
|
+
}();
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Initialize DuckDB with a browser-specific Wasm bundle.
|
|
179
|
+
*/
|
|
180
|
+
var initializeDuckDbWasm = /*#__PURE__*/function () {
|
|
181
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(config, debug) {
|
|
182
|
+
var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch;
|
|
183
|
+
return _regeneratorRuntime.wrap(function _callee7$(_context7) {
|
|
184
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
185
|
+
case 0:
|
|
186
|
+
start = performance.now(); // Select a bundle based on browser checks
|
|
187
|
+
JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
|
|
188
|
+
_context7.next = 4;
|
|
189
|
+
return duckdb.selectBundle(JSDELIVR_BUNDLES);
|
|
190
|
+
case 4:
|
|
191
|
+
bundle = _context7.sent;
|
|
192
|
+
if (bundle.mainWorker) {
|
|
193
|
+
_context7.next = 7;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
throw new Error('Failed to initialize DuckDB');
|
|
197
|
+
case 7:
|
|
198
|
+
worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], {
|
|
199
|
+
type: 'text/javascript'
|
|
200
|
+
})); // Instantiate the async version of DuckDB-wasm
|
|
201
|
+
worker = new Worker(worker_url);
|
|
202
|
+
logger = debug ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
|
|
203
|
+
db = new AsyncDuckDB(logger, worker);
|
|
204
|
+
_context7.next = 13;
|
|
205
|
+
return db.instantiate(bundle.mainModule, bundle.pthreadWorker);
|
|
206
|
+
case 13:
|
|
207
|
+
URL.revokeObjectURL(worker_url);
|
|
208
|
+
if (!config) {
|
|
209
|
+
_context7.next = 28;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
if (!config.path) {
|
|
213
|
+
_context7.next = 26;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
_context7.next = 18;
|
|
217
|
+
return fetch(config.path);
|
|
218
|
+
case 18:
|
|
219
|
+
res = _context7.sent;
|
|
220
|
+
_context7.next = 21;
|
|
221
|
+
return res.arrayBuffer();
|
|
222
|
+
case 21:
|
|
223
|
+
buffer = _context7.sent;
|
|
224
|
+
fileNameMatch = config.path.match(/[^/]*$/);
|
|
225
|
+
if (fileNameMatch) {
|
|
226
|
+
config.path = fileNameMatch[0];
|
|
227
|
+
}
|
|
228
|
+
_context7.next = 26;
|
|
229
|
+
return db.registerFileBuffer(config.path, new Uint8Array(buffer));
|
|
230
|
+
case 26:
|
|
231
|
+
_context7.next = 28;
|
|
232
|
+
return db.open(config);
|
|
233
|
+
case 28:
|
|
234
|
+
if (debug) {
|
|
235
|
+
logElapsedTime('DuckDB initialized', start);
|
|
236
|
+
if (config) {
|
|
237
|
+
console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2)));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return _context7.abrupt("return", db);
|
|
241
|
+
case 30:
|
|
242
|
+
case "end":
|
|
243
|
+
return _context7.stop();
|
|
244
|
+
}
|
|
245
|
+
}, _callee7);
|
|
246
|
+
}));
|
|
247
|
+
return function initializeDuckDbWasm(_x0, _x1) {
|
|
248
|
+
return _ref2.apply(this, arguments);
|
|
249
|
+
};
|
|
250
|
+
}();
|
|
251
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkdWNrZGIiLCJBc3luY0R1Y2tEQiIsImxvZ0VsYXBzZWRUaW1lIiwiQ29ubmVjdGlvbiIsImNvbm5lY3Rpb24iLCJfY2xhc3NDYWxsQ2hlY2siLCJfZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsIl9xdWVyeSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwic3RhdGVtZW50Iiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInF1ZXJ5Iiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5zZXJ0QXJyb3dUYWJsZSIsIl9jYWxsZWUyIiwiYXJyb3dUYWJsZSIsInBhcmFtcyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImluc2VydEFycm93VGFibGUiLCJfeDIiLCJfeDMiLCJfY2xvc2UiLCJfY2FsbGVlMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsImNsb3NlIiwiRHVja0RCV2FzbUFkYXB0ZXIiLCJvcHRpb25zIiwiUHJvbWlzZSIsImR1Y2tEQiIsIl9yZWYiLCJfcmVmJGRlYnVnIiwiZGVidWciLCJjb25maWciLCJpbml0aWFsaXplRHVja0RiV2FzbSIsIl9jb25uZWN0IiwiX2NhbGxlZTQiLCJkYiIsImMiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJzZW50IiwiY29ubmVjdCIsIl9yZWdpc3RlckZpbGVUZXh0IiwiX2NhbGxlZTUiLCJmaWxlbmFtZSIsImNvbnRlbnQiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJyZWdpc3RlckZpbGVUZXh0IiwiX3g0IiwiX3g1IiwiX3JlZ2lzdGVyRmlsZUhhbmRsZSIsIl9jYWxsZWU2IiwibmFtZSIsImhhbmRsZSIsInByb3RvY29sIiwiZGlyZWN0SU8iLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJyZWdpc3RlckZpbGVIYW5kbGUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfcmVmMiIsIl9jYWxsZWU3Iiwic3RhcnQiLCJKU0RFTElWUl9CVU5ETEVTIiwiYnVuZGxlIiwid29ya2VyX3VybCIsIndvcmtlciIsImxvZ2dlciIsInJlcyIsImJ1ZmZlciIsImZpbGVOYW1lTWF0Y2giLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJwZXJmb3JtYW5jZSIsIm5vdyIsImdldEpzRGVsaXZyQnVuZGxlcyIsInNlbGVjdEJ1bmRsZSIsIm1haW5Xb3JrZXIiLCJFcnJvciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJjb25jYXQiLCJ0eXBlIiwiV29ya2VyIiwiQ29uc29sZUxvZ2dlciIsIlZvaWRMb2dnZXIiLCJpbnN0YW50aWF0ZSIsIm1haW5Nb2R1bGUiLCJwdGhyZWFkV29ya2VyIiwicmV2b2tlT2JqZWN0VVJMIiwicGF0aCIsImZldGNoIiwiYXJyYXlCdWZmZXIiLCJtYXRjaCIsInJlZ2lzdGVyRmlsZUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJvcGVuIiwiY29uc29sZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJfeDAiLCJfeDEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvZHVja2RiLXdhc20tYWRhcHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0ICogYXMgZHVja2RiIGZyb20gJ0BkdWNrZGIvZHVja2RiLXdhc20nO1xuaW1wb3J0IHtBc3luY0R1Y2tEQiwgRHVja0RCQ29uZmlnLCBBc3luY0R1Y2tEQkNvbm5lY3Rpb259IGZyb20gJ0BkdWNrZGIvZHVja2RiLXdhc20nO1xuXG5pbXBvcnQge0RhdGFiYXNlQWRhcHRlciwgRGF0YWJhc2VDb25uZWN0aW9ufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtsb2dFbGFwc2VkVGltZX0gZnJvbSAnLi4vdXRpbHMvcGVyZic7XG5cbmNsYXNzIENvbm5lY3Rpb24gaW1wbGVtZW50cyBEYXRhYmFzZUNvbm5lY3Rpb24ge1xuICBwcml2YXRlIGNvbm5lY3Rpb246IEFzeW5jRHVja0RCQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb24pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoc3RhdGVtZW50OiBzdHJpbmcpOiBQcm9taXNlPGFycm93LlRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5xdWVyeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlOiBhcnJvdy5UYWJsZSwgcGFyYW1zOiB7bmFtZTogc3RyaW5nfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5pbnNlcnRBcnJvd1RhYmxlKGFycm93VGFibGUsIHBhcmFtcyk7XG4gIH1cblxuICBhc3luYyBjbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgfVxufVxuXG50eXBlIER1Y2tEQldhc21BZGFwdGVyUHJvcHMgPVxuICB8IHtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIGNvbmZpZz86IER1Y2tEQkNvbmZpZztcbiAgICB9XG4gIHwgUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbmV4cG9ydCBjbGFzcyBEdWNrREJXYXNtQWRhcHRlciBpbXBsZW1lbnRzIERhdGFiYXNlQWRhcHRlciB7XG4gIHByaXZhdGUgZHVja0RCOiBQcm9taXNlPEFzeW5jRHVja0RCPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEdWNrREJXYXNtQWRhcHRlclByb3BzKSB7XG4gICAgLy8gcGFzcyBleGlzdGluZyBBc3luY0R1Y2tEQiBvYmplY3QgY3JlYXRlZCBlbHNld2hlcmVcbiAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFByb21pc2UgfHwgb3B0aW9ucyBpbnN0YW5jZW9mIEFzeW5jRHVja0RCKSB7XG4gICAgICB0aGlzLmR1Y2tEQiA9IG9wdGlvbnMgYXMgYW55O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9yIGNyZWF0ZSBhIG5ldyBBc3luY0R1Y2tEQiBvYmplY3RcbiAgICBjb25zdCB7ZGVidWcgPSBmYWxzZSwgY29uZmlnfSA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5kdWNrREIgPSBpbml0aWFsaXplRHVja0RiV2FzbShjb25maWcsIGRlYnVnKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCB0aGlzLmR1Y2tEQjtcbiAgICBjb25zdCBjID0gYXdhaXQgZGIuY29ubmVjdCgpO1xuICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbihjKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWU6IHN0cmluZywgY29udGVudCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgYXdhaXQgZGIucmVnaXN0ZXJGaWxlVGV4dChmaWxlbmFtZSwgY29udGVudCk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVIYW5kbGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZTogYW55LFxuICAgIHByb3RvY29sOiBkdWNrZGIuRHVja0RCRGF0YVByb3RvY29sLFxuICAgIGRpcmVjdElPOiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgYXdhaXQgZGIucmVnaXN0ZXJGaWxlSGFuZGxlKG5hbWUsIGhhbmRsZSwgcHJvdG9jb2wsIGRpcmVjdElPKTtcbiAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgRHVja0RCIHdpdGggYSBicm93c2VyLXNwZWNpZmljIFdhc20gYnVuZGxlLlxuICovXG5jb25zdCBpbml0aWFsaXplRHVja0RiV2FzbSA9IGFzeW5jIChcbiAgY29uZmlnPzogRHVja0RCQ29uZmlnLFxuICBkZWJ1Zz86IGJvb2xlYW5cbik6IFByb21pc2U8QXN5bmNEdWNrREI+ID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAvLyBTZWxlY3QgYSBidW5kbGUgYmFzZWQgb24gYnJvd3NlciBjaGVja3NcbiAgY29uc3QgSlNERUxJVlJfQlVORExFUyA9IGR1Y2tkYi5nZXRKc0RlbGl2ckJ1bmRsZXMoKTtcbiAgY29uc3QgYnVuZGxlID0gYXdhaXQgZHVja2RiLnNlbGVjdEJ1bmRsZShKU0RFTElWUl9CVU5ETEVTKTtcbiAgaWYgKCFidW5kbGUubWFpbldvcmtlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgRHVja0RCJyk7XG4gIH1cblxuICBjb25zdCB3b3JrZXJfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChcbiAgICBuZXcgQmxvYihbYGltcG9ydFNjcmlwdHMoXCIke2J1bmRsZS5tYWluV29ya2VyfVwiKTtgXSwge1xuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9KVxuICApO1xuXG4gIC8vIEluc3RhbnRpYXRlIHRoZSBhc3luYyB2ZXJzaW9uIG9mIER1Y2tEQi13YXNtXG4gIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyX3VybCk7XG4gIGNvbnN0IGxvZ2dlciA9IGRlYnVnID8gbmV3IGR1Y2tkYi5Db25zb2xlTG9nZ2VyKCkgOiBuZXcgZHVja2RiLlZvaWRMb2dnZXIoKTtcbiAgY29uc3QgZGIgPSBuZXcgQXN5bmNEdWNrREIobG9nZ2VyLCB3b3JrZXIpO1xuICBhd2FpdCBkYi5pbnN0YW50aWF0ZShidW5kbGUubWFpbk1vZHVsZSwgYnVuZGxlLnB0aHJlYWRXb3JrZXIpO1xuICBVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlcl91cmwpO1xuXG4gIGlmIChjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLnBhdGgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGNvbmZpZy5wYXRoKTtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbmZpZy5wYXRoLm1hdGNoKC9bXi9dKiQvKTtcbiAgICAgIGlmIChmaWxlTmFtZU1hdGNoKSB7XG4gICAgICAgIGNvbmZpZy5wYXRoID0gZmlsZU5hbWVNYXRjaFswXTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUJ1ZmZlcihjb25maWcucGF0aCwgbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgfVxuICAgIGF3YWl0IGRiLm9wZW4oY29uZmlnKTtcbiAgfVxuXG4gIGlmIChkZWJ1Zykge1xuICAgIGxvZ0VsYXBzZWRUaW1lKCdEdWNrREIgaW5pdGlhbGl6ZWQnLCBzdGFydCk7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgRHVja0RiQ29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkYjtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTs7QUFHQSxPQUFPLEtBQUtBLE1BQU0sTUFBTSxxQkFBcUI7QUFDN0MsU0FBUUMsV0FBVyxRQUE0QyxxQkFBcUI7QUFJcEYsU0FBUUMsY0FBYyxRQUFPLGVBQWU7QUFBQyxJQUV2Q0MsVUFBVTtFQUdkLFNBQUFBLFdBQVlDLFVBQWlDLEVBQUU7SUFBQUMsZUFBQSxPQUFBRixVQUFBO0lBQUFHLGVBQUE7SUFDN0MsSUFBSSxDQUFDRixVQUFVLEdBQUdBLFVBQVU7RUFDOUI7RUFBQyxPQUFBRyxZQUFBLENBQUFKLFVBQUE7SUFBQUssR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQUMsTUFBQSxHQUFB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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright contributors to the kepler.gl project
|
|
3
|
+
|
|
4
|
+
export { SqlPanel } from './sql-panel';
|
|
5
|
+
export { SchemaPanel, SchemaPanelDropMessage } from './schema-panel';
|
|
6
|
+
export { PreviewDataPanel } from './preview-data-panel';
|
|
7
|
+
export { Tree, DatasetNode, ColumnNode } from './tree';
|
|
8
|
+
export { default as MonacoEditor } from './monaco-editor';
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTcWxQYW5lbCIsIlNjaGVtYVBhbmVsIiwiU2NoZW1hUGFuZWxEcm9wTWVzc2FnZSIsIlByZXZpZXdEYXRhUGFuZWwiLCJUcmVlIiwiRGF0YXNldE5vZGUiLCJDb2x1bW5Ob2RlIiwiZGVmYXVsdCIsIk1vbmFjb0VkaXRvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5leHBvcnQge1NxbFBhbmVsfSBmcm9tICcuL3NxbC1wYW5lbCc7XG5leHBvcnQge1NjaGVtYVBhbmVsLCBTY2hlbWFQYW5lbERyb3BNZXNzYWdlfSBmcm9tICcuL3NjaGVtYS1wYW5lbCc7XG5leHBvcnQge1ByZXZpZXdEYXRhUGFuZWx9IGZyb20gJy4vcHJldmlldy1kYXRhLXBhbmVsJztcbmV4cG9ydCB7VHJlZSwgRGF0YXNldE5vZGUsIENvbHVtbk5vZGV9IGZyb20gJy4vdHJlZSc7XG5leHBvcnQge2RlZmF1bHQgYXMgTW9uYWNvRWRpdG9yfSBmcm9tICcuL21vbmFjby1lZGl0b3InO1xuXG5leHBvcnQgdHlwZSB7U2NoZW1hU3VnZ2VzdGlvbn0gZnJvbSAnLi9zY2hlbWEtcGFuZWwnO1xuZXhwb3J0IHR5cGUge1ByZXZpZXdEYXRhUGFuZWxQcm9wcywgUXVlcnlSZXN1bHQsIERhdGFUYWJsZVN0eWxlfSBmcm9tICcuL3ByZXZpZXctZGF0YS1wYW5lbCc7XG5leHBvcnQgdHlwZSB7VHJlZU5vZGVEYXRhLCBUcmVlTm9kZVByb3BzLCBUcmVlUHJvcHN9IGZyb20gJy4vdHJlZSc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUEsU0FBUUEsUUFBUSxRQUFPLGFBQWE7QUFDcEMsU0FBUUMsV0FBVyxFQUFFQyxzQkFBc0IsUUFBTyxnQkFBZ0I7QUFDbEUsU0FBUUMsZ0JBQWdCLFFBQU8sc0JBQXNCO0FBQ3JELFNBQVFDLElBQUksRUFBRUMsV0FBVyxFQUFFQyxVQUFVLFFBQU8sUUFBUTtBQUNwRCxTQUFRQyxPQUFPLElBQUlDLFlBQVksUUFBTyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
|
+
// SPDX-License-Identifier: MIT
|
|
6
|
+
// Copyright contributors to the kepler.gl project
|
|
7
|
+
|
|
8
|
+
import React, { useCallback, useMemo, useRef } from 'react';
|
|
9
|
+
import Editor from '@monaco-editor/react';
|
|
10
|
+
import * as monaco from 'monaco-editor';
|
|
11
|
+
// import {tableSchema as DEFAULT_SCHEMA} from './table-schema';
|
|
12
|
+
import uniq from 'es-toolkit/compat/uniq';
|
|
13
|
+
import uniqBy from 'es-toolkit/compat/uniqBy';
|
|
14
|
+
var MONACO_OPTIONS = {
|
|
15
|
+
minimap: {
|
|
16
|
+
enabled: false
|
|
17
|
+
},
|
|
18
|
+
language: 'sql',
|
|
19
|
+
contextmenu: false,
|
|
20
|
+
renderLineHighlight: 'none',
|
|
21
|
+
scrollBeyondLastLine: false,
|
|
22
|
+
scrollbar: {
|
|
23
|
+
alwaysConsumeMouseWheel: false
|
|
24
|
+
},
|
|
25
|
+
overviewRulerLanes: 0,
|
|
26
|
+
automaticLayout: true,
|
|
27
|
+
acceptSuggestionOnEnter: 'on',
|
|
28
|
+
quickSuggestionsDelay: 400,
|
|
29
|
+
matchOnWordStartOnly: false,
|
|
30
|
+
tabCompletion: 'off',
|
|
31
|
+
lineNumbers: 'off'
|
|
32
|
+
};
|
|
33
|
+
function parseSqlAndFindTableNameAndAliases(sql) {
|
|
34
|
+
var regex = /\b(?:FROM|JOIN)\s+([^\s.]+(?:\.[^\s.]+)?)\s*(?:AS)?\s*([^\s,]+)?/gi;
|
|
35
|
+
var tables = [];
|
|
36
|
+
while (true) {
|
|
37
|
+
var match = regex.exec(sql);
|
|
38
|
+
if (!match) {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
var table_name = match[1];
|
|
42
|
+
if (!/\(/.test(table_name)) {
|
|
43
|
+
// exclude function calls
|
|
44
|
+
var alias = match[2];
|
|
45
|
+
if (alias && /on|where|inner|left|right|join/.test(alias)) {
|
|
46
|
+
alias = null;
|
|
47
|
+
}
|
|
48
|
+
tables.push({
|
|
49
|
+
table_name: table_name,
|
|
50
|
+
alias: alias || table_name
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return tables;
|
|
55
|
+
}
|
|
56
|
+
var MonacoEditor = function MonacoEditor(_ref) {
|
|
57
|
+
var onRunQuery = _ref.onRunQuery,
|
|
58
|
+
onChange = _ref.onChange,
|
|
59
|
+
code = _ref.code,
|
|
60
|
+
tableSchema = _ref.tableSchema,
|
|
61
|
+
isReadOnly = _ref.isReadOnly;
|
|
62
|
+
// private editor?: monaco.editor.IStandaloneCodeEditor;
|
|
63
|
+
var schemaTableNames = useMemo(function () {
|
|
64
|
+
return tableSchema ? uniq(tableSchema.map(function (d) {
|
|
65
|
+
return d.table_name;
|
|
66
|
+
})) : [];
|
|
67
|
+
}, [tableSchema]);
|
|
68
|
+
var schemaTableNamesSet = useMemo(function () {
|
|
69
|
+
return new Set(schemaTableNames);
|
|
70
|
+
}, [schemaTableNames]);
|
|
71
|
+
var handleRunQueryRef = useRef(onRunQuery);
|
|
72
|
+
handleRunQueryRef.current = onRunQuery;
|
|
73
|
+
var handleEditorDidMount = useCallback(function (editor) {
|
|
74
|
+
// this.editor = editor;
|
|
75
|
+
editor.focus();
|
|
76
|
+
editor.addAction({
|
|
77
|
+
id: 'run-query',
|
|
78
|
+
label: 'Run Query',
|
|
79
|
+
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, monaco.KeyMod.Shift | monaco.KeyCode.Enter],
|
|
80
|
+
contextMenuGroupId: 'custom',
|
|
81
|
+
contextMenuOrder: 0,
|
|
82
|
+
run: function run() {
|
|
83
|
+
return handleRunQueryRef.current();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
monaco.languages.registerCompletionItemProvider('*', {
|
|
87
|
+
provideCompletionItems: function provideCompletionItems(model, position, _context, _cancelationToken) {
|
|
88
|
+
var _thisLine$trim$split$, _exec, _exec2;
|
|
89
|
+
var suggestions = [{
|
|
90
|
+
label: 'myCustomSnippet',
|
|
91
|
+
kind: monaco.languages.CompletionItemKind.Snippet,
|
|
92
|
+
insertText: 'This is a piece of custom code',
|
|
93
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
94
|
+
documentation: 'This is a piece of custom code'
|
|
95
|
+
// TODO: range is missing
|
|
96
|
+
}];
|
|
97
|
+
var fullQueryText = model.getValue();
|
|
98
|
+
var tableNamesAndAliases = new Map(parseSqlAndFindTableNameAndAliases(fullQueryText).map(function (_ref2) {
|
|
99
|
+
var table_name = _ref2.table_name,
|
|
100
|
+
alias = _ref2.alias;
|
|
101
|
+
return [alias, table_name];
|
|
102
|
+
}));
|
|
103
|
+
var thisLine = model.getValueInRange({
|
|
104
|
+
startLineNumber: position.lineNumber,
|
|
105
|
+
startColumn: 1,
|
|
106
|
+
endLineNumber: position.lineNumber,
|
|
107
|
+
endColumn: position.column
|
|
108
|
+
});
|
|
109
|
+
var thisToken = ((_thisLine$trim$split$ = thisLine.trim().split(' ').slice(-1)) === null || _thisLine$trim$split$ === void 0 ? void 0 : _thisLine$trim$split$[0]) || '';
|
|
110
|
+
var lastTokenBeforeSpace = (_exec = /\s?(\w+)\s+\w+$/.exec(thisLine.trim())) === null || _exec === void 0 ? void 0 : _exec[1];
|
|
111
|
+
var lastTokenBeforeDot = (_exec2 = /(\w+)\.\w*$/.exec(thisToken)) === null || _exec2 === void 0 ? void 0 : _exec2[1];
|
|
112
|
+
|
|
113
|
+
// console.log(tableNamesAndAliases, thisToken, lastTokenBeforeSpace, lastTokenBeforeDot);
|
|
114
|
+
|
|
115
|
+
if (lastTokenBeforeSpace && /from|join|update|into/.test(lastTokenBeforeSpace)) {
|
|
116
|
+
suggestions.push.apply(suggestions, _toConsumableArray(schemaTableNames.map(function (table_name) {
|
|
117
|
+
return {
|
|
118
|
+
label: table_name,
|
|
119
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
120
|
+
insertText: table_name
|
|
121
|
+
// TODO: range is missing
|
|
122
|
+
};
|
|
123
|
+
})));
|
|
124
|
+
}
|
|
125
|
+
if (lastTokenBeforeDot) {
|
|
126
|
+
var table_name = null;
|
|
127
|
+
if (schemaTableNamesSet.has(lastTokenBeforeDot)) {
|
|
128
|
+
table_name = lastTokenBeforeDot;
|
|
129
|
+
} else if (tableNamesAndAliases.get(lastTokenBeforeDot)) {
|
|
130
|
+
table_name = tableNamesAndAliases.get(lastTokenBeforeDot);
|
|
131
|
+
}
|
|
132
|
+
if (table_name && tableSchema) {
|
|
133
|
+
suggestions.push.apply(suggestions, _toConsumableArray(tableSchema.filter(function (d) {
|
|
134
|
+
return d.table_name === table_name;
|
|
135
|
+
}).map(function (_ref3) {
|
|
136
|
+
var column_name = _ref3.column_name;
|
|
137
|
+
return {
|
|
138
|
+
label: column_name,
|
|
139
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
140
|
+
insertText: column_name
|
|
141
|
+
// TODO: range is missing
|
|
142
|
+
};
|
|
143
|
+
})));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
suggestions: uniqBy(suggestions, function (s) {
|
|
148
|
+
return s.insertText;
|
|
149
|
+
})
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}, [tableSchema, schemaTableNames, schemaTableNamesSet]);
|
|
154
|
+
return /*#__PURE__*/React.createElement(Editor, {
|
|
155
|
+
height: "100%",
|
|
156
|
+
theme: "vs-dark",
|
|
157
|
+
defaultLanguage: "sql",
|
|
158
|
+
defaultValue: code,
|
|
159
|
+
onChange: onChange,
|
|
160
|
+
onMount: handleEditorDidMount,
|
|
161
|
+
options: _objectSpread(_objectSpread({}, MONACO_OPTIONS), {}, {
|
|
162
|
+
readOnly: isReadOnly
|
|
163
|
+
})
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
export default MonacoEditor;
|
|
167
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsInVzZVJlZiIsIkVkaXRvciIsIm1vbmFjbyIsInVuaXEiLCJ1bmlxQnkiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJwdXNoIiwiTW9uYWNvRWRpdG9yIiwiX3JlZiIsIm9uUnVuUXVlcnkiLCJvbkNoYW5nZSIsImNvZGUiLCJ0YWJsZVNjaGVtYSIsImlzUmVhZE9ubHkiLCJzY2hlbWFUYWJsZU5hbWVzIiwibWFwIiwiZCIsInNjaGVtYVRhYmxlTmFtZXNTZXQiLCJTZXQiLCJoYW5kbGVSdW5RdWVyeVJlZiIsImN1cnJlbnQiLCJoYW5kbGVFZGl0b3JEaWRNb3VudCIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJGaWVsZCIsImhhcyIsImdldCIsImZpbHRlciIsIl9yZWYzIiwiY29sdW1uX25hbWUiLCJzIiwiY3JlYXRlRWxlbWVudCIsImhlaWdodCIsInRoZW1lIiwiZGVmYXVsdExhbmd1YWdlIiwiZGVmYXVsdFZhbHVlIiwib25Nb3VudCIsIm9wdGlvbnMiLCJfb2JqZWN0U3ByZWFkIiwicmVhZE9ubHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb25hY28tZWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRWRpdG9yLCB7T25DaGFuZ2UsIE9uTW91bnR9IGZyb20gJ0Btb25hY28tZWRpdG9yL3JlYWN0JztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbi8vIGltcG9ydCB7dGFibGVTY2hlbWEgYXMgREVGQVVMVF9TQ0hFTUF9IGZyb20gJy4vdGFibGUtc2NoZW1hJztcbmltcG9ydCB1bmlxIGZyb20gJ2VzLXRvb2xraXQvY29tcGF0L3VuaXEnO1xuaW1wb3J0IHVuaXFCeSBmcm9tICdlcy10b29sa2l0L2NvbXBhdC91bmlxQnknO1xuXG5jb25zdCBNT05BQ09fT1BUSU9OUzogbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIG1pbmltYXA6IHtlbmFibGVkOiBmYWxzZX0sXG4gIGxhbmd1YWdlOiAnc3FsJyxcbiAgY29udGV4dG1lbnU6IGZhbHNlLFxuICByZW5kZXJMaW5lSGlnaGxpZ2h0OiAnbm9uZScsXG4gIHNjcm9sbEJleW9uZExhc3RMaW5lOiBmYWxzZSxcbiAgc2Nyb2xsYmFyOiB7YWx3YXlzQ29uc3VtZU1vdXNlV2hlZWw6IGZhbHNlfSxcbiAgb3ZlcnZpZXdSdWxlckxhbmVzOiAwLFxuICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsXG4gIGFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyOiAnb24nLFxuICBxdWlja1N1Z2dlc3Rpb25zRGVsYXk6IDQwMCxcbiAgbWF0Y2hPbldvcmRTdGFydE9ubHk6IGZhbHNlLFxuICB0YWJDb21wbGV0aW9uOiAnb2ZmJyxcbiAgbGluZU51bWJlcnM6ICdvZmYnXG59O1xuXG5mdW5jdGlvbiBwYXJzZVNxbEFuZEZpbmRUYWJsZU5hbWVBbmRBbGlhc2VzKHNxbDogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcYig/OkZST018Sk9JTilcXHMrKFteXFxzLl0rKD86XFwuW15cXHMuXSspPylcXHMqKD86QVMpP1xccyooW15cXHMsXSspPy9naTtcbiAgY29uc3QgdGFibGVzOiB7dGFibGVfbmFtZTogc3RyaW5nOyBhbGlhczogc3RyaW5nfVtdID0gW107XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3FsKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgdGFibGVfbmFtZSA9IG1hdGNoWzFdO1xuICAgIGlmICghL1xcKC8udGVzdCh0YWJsZV9uYW1lKSkge1xuICAgICAgLy8gZXhjbHVkZSBmdW5jdGlvbiBjYWxsc1xuICAgICAgbGV0IGFsaWFzID0gbWF0Y2hbMl0gYXMgc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlmIChhbGlhcyAmJiAvb258d2hlcmV8aW5uZXJ8bGVmdHxyaWdodHxqb2luLy50ZXN0KGFsaWFzKSkge1xuICAgICAgICBhbGlhcyA9IG51bGw7XG4gICAgICB9XG4gICAgICB0YWJsZXMucHVzaCh7XG4gICAgICAgIHRhYmxlX25hbWUsXG4gICAgICAgIGFsaWFzOiBhbGlhcyB8fCB0YWJsZV9uYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFibGVzO1xufVxuXG5pbnRlcmZhY2UgTW9uYWNvRWRpdG9yUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICBvbkNoYW5nZTogT25DaGFuZ2U7XG4gIG9uUnVuUXVlcnk6ICgpID0+IHZvaWQ7XG4gIHRhYmxlU2NoZW1hPzoge3RhYmxlX25hbWU6IHN0cmluZzsgY29sdW1uX25hbWU6IHN0cmluZ31bXTtcbn1cblxuY29uc3QgTW9uYWNvRWRpdG9yOiBSZWFjdC5GQzxNb25hY29FZGl0b3JQcm9wcz4gPSAoe1xuICBvblJ1blF1ZXJ5LFxuICBvbkNoYW5nZSxcbiAgY29kZSxcbiAgdGFibGVTY2hlbWEsXG4gIGlzUmVhZE9ubHlcbn0pID0+IHtcbiAgLy8gcHJpdmF0ZSBlZGl0b3I/OiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcjtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHRhYmxlU2NoZW1hID8gdW5pcSh0YWJsZVNjaGVtYS5tYXAoZCA9PiBkLnRhYmxlX25hbWUpKSA6IFtdKSxcbiAgICBbdGFibGVTY2hlbWFdXG4gICk7XG4gIGNvbnN0IHNjaGVtYVRhYmxlTmFtZXNTZXQgPSB1c2VNZW1vKCgpID0+IG5ldyBTZXQoc2NoZW1hVGFibGVOYW1lcyksIFtzY2hlbWFUYWJsZU5hbWVzXSk7XG4gIGNvbnN0IGhhbmRsZVJ1blF1ZXJ5UmVmID0gdXNlUmVmKG9uUnVuUXVlcnkpO1xuICBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50ID0gb25SdW5RdWVyeTtcblxuICBjb25zdCBoYW5kbGVFZGl0b3JEaWRNb3VudDogT25Nb3VudCA9IHVzZUNhbGxiYWNrKFxuICAgIGVkaXRvciA9PiB7XG4gICAgICAvLyB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgIGVkaXRvci5mb2N1cygpO1xuXG4gICAgICBlZGl0b3IuYWRkQWN0aW9uKHtcbiAgICAgICAgaWQ6ICdydW4tcXVlcnknLFxuICAgICAgICBsYWJlbDogJ1J1biBRdWVyeScsXG4gICAgICAgIGtleWJpbmRpbmdzOiBbXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5DdHJsQ21kIHwgbW9uYWNvLktleUNvZGUuRW50ZXIsXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5TaGlmdCB8IG1vbmFjby5LZXlDb2RlLkVudGVyXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRleHRNZW51R3JvdXBJZDogJ2N1c3RvbScsXG4gICAgICAgIGNvbnRleHRNZW51T3JkZXI6IDAsXG4gICAgICAgIHJ1bjogKCkgPT4gaGFuZGxlUnVuUXVlcnlSZWYuY3VycmVudCgpXG4gICAgICB9KTtcblxuICAgICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJyonLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24sIF9jb250ZXh0LCBfY2FuY2VsYXRpb25Ub2tlbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnbXlDdXN0b21TbmlwcGV0JyxcbiAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZScsXG4gICAgICAgICAgICAgIGluc2VydFRleHRSdWxlczogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldCxcbiAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZSdcbiAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGNvbnN0IGZ1bGxRdWVyeVRleHQgPSBtb2RlbC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lc0FuZEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihcbiAgICAgICAgICAgIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoZnVsbFF1ZXJ5VGV4dCkubWFwKCh7dGFibGVfbmFtZSwgYWxpYXN9KSA9PiBbXG4gICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICB0YWJsZV9uYW1lXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCB0aGlzTGluZSA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZSh7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBlbmRDb2x1bW46IHBvc2l0aW9uLmNvbHVtblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHRoaXNUb2tlbiA9IHRoaXNMaW5lLnRyaW0oKS5zcGxpdCgnICcpLnNsaWNlKC0xKT8uWzBdIHx8ICcnO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlU3BhY2UgPSAvXFxzPyhcXHcrKVxccytcXHcrJC8uZXhlYyh0aGlzTGluZS50cmltKCkpPy5bMV07XG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlRG90ID0gLyhcXHcrKVxcLlxcdyokLy5leGVjKHRoaXNUb2tlbik/LlsxXTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRhYmxlTmFtZXNBbmRBbGlhc2VzLCB0aGlzVG9rZW4sIGxhc3RUb2tlbkJlZm9yZVNwYWNlLCBsYXN0VG9rZW5CZWZvcmVEb3QpO1xuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZVNwYWNlICYmIC9mcm9tfGpvaW58dXBkYXRlfGludG8vLnRlc3QobGFzdFRva2VuQmVmb3JlU3BhY2UpKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAuLi5zY2hlbWFUYWJsZU5hbWVzLm1hcChcbiAgICAgICAgICAgICAgICB0YWJsZV9uYW1lID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFibGVfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IHRhYmxlX25hbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYXN0VG9rZW5CZWZvcmVEb3QpIHtcbiAgICAgICAgICAgIGxldCB0YWJsZV9uYW1lID0gbnVsbCBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgICAgaWYgKHNjaGVtYVRhYmxlTmFtZXNTZXQuaGFzKGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IGxhc3RUb2tlbkJlZm9yZURvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IHRhYmxlTmFtZXNBbmRBbGlhc2VzLmdldChsYXN0VG9rZW5CZWZvcmVEb3QpIGFzIHN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YWJsZV9uYW1lICYmIHRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGFibGVTY2hlbWFcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLnRhYmxlX25hbWUgPT09IHRhYmxlX25hbWUpXG4gICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoe2NvbHVtbl9uYW1lfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbHVtbl9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBjb2x1bW5fbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IHVuaXFCeShzdWdnZXN0aW9ucywgcyA9PiBzLmluc2VydFRleHQpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdGFibGVTY2hlbWEsIHNjaGVtYVRhYmxlTmFtZXMsIHNjaGVtYVRhYmxlTmFtZXNTZXRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RWRpdG9yXG4gICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgIHRoZW1lPVwidnMtZGFya1wiXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U9XCJzcWxcIlxuICAgICAgZGVmYXVsdFZhbHVlPXtjb2RlfVxuICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgb25Nb3VudD17aGFuZGxlRWRpdG9yRGlkTW91bnR9XG4gICAgICBvcHRpb25zPXt7XG4gICAgICAgIC4uLk1PTkFDT19PUFRJT05TLFxuICAgICAgICByZWFkT25seTogaXNSZWFkT25seVxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9uYWNvRWRpdG9yO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTs7QUFFQSxPQUFPQSxLQUFLLElBQUdDLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLFFBQU8sT0FBTztBQUN6RCxPQUFP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
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
+
// SPDX-License-Identifier: MIT
|
|
7
|
+
// Copyright contributors to the kepler.gl project
|
|
8
|
+
|
|
9
|
+
import React, { useCallback, useMemo, useState } from 'react';
|
|
10
|
+
import { withTheme } from 'styled-components';
|
|
11
|
+
import { DataTable, renderedSize } from '@kepler.gl/components';
|
|
12
|
+
import { arrowSchemaToFields } from '@kepler.gl/processors';
|
|
13
|
+
import { parseFieldValue, createDataContainer, DataForm } from '@kepler.gl/utils';
|
|
14
|
+
var DEFAULT_ROWS_TO_CALCULATE_PREVIEW = 100;
|
|
15
|
+
// min Cellsize should take into account option button and field token
|
|
16
|
+
var minCellSize = 80;
|
|
17
|
+
// option buttons and field token
|
|
18
|
+
var optionButtonWidth = 20;
|
|
19
|
+
var pinButton = 20;
|
|
20
|
+
var cellPadding = 20;
|
|
21
|
+
var PreviewDataPanelWOTheme = function PreviewDataPanelWOTheme(_ref) {
|
|
22
|
+
var result = _ref.result,
|
|
23
|
+
_ref$rowsToCalculateP = _ref.rowsToCalculatePreview,
|
|
24
|
+
rowsToCalculatePreview = _ref$rowsToCalculateP === void 0 ? DEFAULT_ROWS_TO_CALCULATE_PREVIEW : _ref$rowsToCalculateP,
|
|
25
|
+
_ref$defaultPinnedCol = _ref.defaultPinnedColumns,
|
|
26
|
+
defaultPinnedColumns = _ref$defaultPinnedCol === void 0 ? [] : _ref$defaultPinnedCol,
|
|
27
|
+
theme = _ref.theme;
|
|
28
|
+
var _useState = useState(defaultPinnedColumns),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
30
|
+
pinnedColumns = _useState2[0],
|
|
31
|
+
setPinnedColumns = _useState2[1];
|
|
32
|
+
var fields = useMemo(function () {
|
|
33
|
+
return arrowSchemaToFields(result.table, result.tableDuckDBTypes);
|
|
34
|
+
}, [result]);
|
|
35
|
+
var dataContainer = useMemo(function () {
|
|
36
|
+
var cols = _toConsumableArray(Array(result.table.numCols).keys()).map(function (i) {
|
|
37
|
+
return result.table.getChildAt(i);
|
|
38
|
+
});
|
|
39
|
+
var dataContainer = createDataContainer(cols, {
|
|
40
|
+
fields: fields,
|
|
41
|
+
inputDataFormat: DataForm.COLS_ARRAY
|
|
42
|
+
});
|
|
43
|
+
return dataContainer;
|
|
44
|
+
}, [result, fields]);
|
|
45
|
+
var columns = useMemo(function () {
|
|
46
|
+
return fields.map(function (f) {
|
|
47
|
+
return f.name;
|
|
48
|
+
});
|
|
49
|
+
}, [fields]);
|
|
50
|
+
var colMeta = useMemo(function () {
|
|
51
|
+
return fields.reduce(function (acc, _ref2, colIdx) {
|
|
52
|
+
var name = _ref2.name,
|
|
53
|
+
displayName = _ref2.displayName,
|
|
54
|
+
type = _ref2.type,
|
|
55
|
+
displayFormat = _ref2.displayFormat;
|
|
56
|
+
return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, name, {
|
|
57
|
+
// because '' || 'aaa' = 'aaa'
|
|
58
|
+
name: displayName !== undefined ? displayName : name,
|
|
59
|
+
displayName: displayName,
|
|
60
|
+
displayFormat: displayFormat,
|
|
61
|
+
type: type,
|
|
62
|
+
colIdx: colIdx
|
|
63
|
+
}));
|
|
64
|
+
}, {});
|
|
65
|
+
}, [fields]);
|
|
66
|
+
var copyTableColumn = useCallback(function (column) {
|
|
67
|
+
var _navigator;
|
|
68
|
+
var _colMeta$column = colMeta[column],
|
|
69
|
+
colIdx = _colMeta$column.colIdx,
|
|
70
|
+
type = _colMeta$column.type;
|
|
71
|
+
var text = dataContainer.mapIndex(function (row) {
|
|
72
|
+
return parseFieldValue(dataContainer.valueAt(row.index, colIdx), type);
|
|
73
|
+
}).join('\n');
|
|
74
|
+
(_navigator = navigator) === null || _navigator === void 0 || _navigator.clipboard.writeText(text);
|
|
75
|
+
}, [colMeta, dataContainer]);
|
|
76
|
+
var pinTableColumn = useCallback(function (column) {
|
|
77
|
+
return pinnedColumns.includes(column) ? setPinnedColumns(pinnedColumns.filter(function (c) {
|
|
78
|
+
return c !== column;
|
|
79
|
+
})) : setPinnedColumns([].concat(_toConsumableArray(pinnedColumns), [column]));
|
|
80
|
+
}, [pinnedColumns]);
|
|
81
|
+
|
|
82
|
+
// TODO Potentially costly operation for non row based data containers. Revisit sorting below.
|
|
83
|
+
var dataTableStyle = useMemo(function () {
|
|
84
|
+
return {
|
|
85
|
+
minCellSize: minCellSize,
|
|
86
|
+
cellPadding: cellPadding,
|
|
87
|
+
optionsButton: theme.fieldTokenWidth + theme.fieldTokenRightMargin + optionButtonWidth + pinButton,
|
|
88
|
+
fontSize: theme.cellFontSize,
|
|
89
|
+
font: theme.fontFamily
|
|
90
|
+
};
|
|
91
|
+
}, [theme]);
|
|
92
|
+
var cellSizeCache = useMemo(function () {
|
|
93
|
+
return columns.reduce(function (acc, column) {
|
|
94
|
+
var _colMeta$column2 = colMeta[column],
|
|
95
|
+
colIdx = _colMeta$column2.colIdx,
|
|
96
|
+
displayName = _colMeta$column2.displayName,
|
|
97
|
+
type = _colMeta$column2.type;
|
|
98
|
+
return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, column, renderedSize(_objectSpread({
|
|
99
|
+
text: {
|
|
100
|
+
dataContainer: dataContainer,
|
|
101
|
+
column: displayName
|
|
102
|
+
},
|
|
103
|
+
colIdx: colIdx,
|
|
104
|
+
type: type,
|
|
105
|
+
numRowsToCalculate: rowsToCalculatePreview
|
|
106
|
+
}, dataTableStyle))));
|
|
107
|
+
}, {});
|
|
108
|
+
}, [columns, colMeta, dataContainer, rowsToCalculatePreview, dataTableStyle]);
|
|
109
|
+
return /*#__PURE__*/React.createElement(DataTable, {
|
|
110
|
+
colMeta: colMeta,
|
|
111
|
+
columns: columns,
|
|
112
|
+
cellSizeCache: cellSizeCache,
|
|
113
|
+
dataContainer: dataContainer,
|
|
114
|
+
pinnedColumns: pinnedColumns,
|
|
115
|
+
copyTableColumn: copyTableColumn,
|
|
116
|
+
pinTableColumn: pinTableColumn
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
export var PreviewDataPanel = withTheme(PreviewDataPanelWOTheme);
|
|
120
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsInVzZVN0YXRlIiwid2l0aFRoZW1lIiwiRGF0YVRhYmxlIiwicmVuZGVyZWRTaXplIiwiYXJyb3dTY2hlbWFUb0ZpZWxkcyIsInBhcnNlRmllbGRWYWx1ZSIsImNyZWF0ZURhdGFDb250YWluZXIiLCJEYXRhRm9ybSIsIkRFRkFVTFRfUk9XU19UT19DQUxDVUxBVEVfUFJFVklFVyIsIm1pbkNlbGxTaXplIiwib3B0aW9uQnV0dG9uV2lkdGgiLCJwaW5CdXR0b24iLCJjZWxsUGFkZGluZyIsIlByZXZpZXdEYXRhUGFuZWxXT1RoZW1lIiwiX3JlZiIsInJlc3VsdCIsIl9yZWYkcm93c1RvQ2FsY3VsYXRlUCIsInJvd3NUb0NhbGN1bGF0ZVByZXZpZXciLCJfcmVmJGRlZmF1bHRQaW5uZWRDb2wiLCJkZWZhdWx0UGlubmVkQ29sdW1ucyIsInRoZW1lIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwicGlubmVkQ29sdW1ucyIsInNldFBpbm5lZENvbHVtbnMiLCJmaWVsZHMiLCJ0YWJsZSIsInRhYmxlRHVja0RCVHlwZXMiLCJkYXRhQ29udGFpbmVyIiwiY29scyIsIl90b0NvbnN1bWFibGVBcnJheSIsIkFycmF5IiwibnVtQ29scyIsImtleXMiLCJtYXAiLCJpIiwiZ2V0Q2hpbGRBdCIsImlucHV0RGF0YUZvcm1hdCIsIkNPTFNfQVJSQVkiLCJjb2x1bW5zIiwiZiIsIm5hbWUiLCJjb2xNZXRhIiwicmVkdWNlIiwiYWNjIiwiX3JlZjIiLCJjb2xJZHgiLCJkaXNwbGF5TmFtZSIsInR5cGUiLCJkaXNwbGF5Rm9ybWF0IiwiX29iamVjdFNwcmVhZCIsIl9kZWZpbmVQcm9wZXJ0eSIsInVuZGVmaW5lZCIsImNvcHlUYWJsZUNvbHVtbiIsImNvbHVtbiIsIl9uYXZpZ2F0b3IiLCJfY29sTWV0YSRjb2x1bW4iLCJ0ZXh0IiwibWFwSW5kZXgiLCJyb3ciLCJ2YWx1ZUF0IiwiaW5kZXgiLCJqb2luIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwicGluVGFibGVDb2x1bW4iLCJpbmNsdWRlcyIsImZpbHRlciIsImMiLCJjb25jYXQiLCJkYXRhVGFibGVTdHlsZSIsIm9wdGlvbnNCdXR0b24iLCJmaWVsZFRva2VuV2lkdGgiLCJmaWVsZFRva2VuUmlnaHRNYXJnaW4iLCJmb250U2l6ZSIsImNlbGxGb250U2l6ZSIsImZvbnQiLCJmb250RmFtaWx5IiwiY2VsbFNpemVDYWNoZSIsIl9jb2xNZXRhJGNvbHVtbjIiLCJudW1Sb3dzVG9DYWxjdWxhdGUiLCJjcmVhdGVFbGVtZW50IiwiUHJldmlld0RhdGFQYW5lbCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ByZXZpZXctZGF0YS1wYW5lbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZSwgQ1NTUHJvcGVydGllc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt3aXRoVGhlbWV9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtEYXRhVGFibGUsIHJlbmRlcmVkU2l6ZX0gZnJvbSAnQGtlcGxlci5nbC9jb21wb25lbnRzJztcbmltcG9ydCB7YXJyb3dTY2hlbWFUb0ZpZWxkc30gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7cGFyc2VGaWVsZFZhbHVlLCBjcmVhdGVEYXRhQ29udGFpbmVyLCBEYXRhRm9ybX0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbnR5cGUgQmFzZUNvbXBvbmVudFByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHN0eWxlPzogQ1NTUHJvcGVydGllcztcbn07XG5cbmNvbnN0IERFRkFVTFRfUk9XU19UT19DQUxDVUxBVEVfUFJFVklFVyA9IDEwMDtcbi8vIG1pbiBDZWxsc2l6ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgb3B0aW9uIGJ1dHRvbiBhbmQgZmllbGQgdG9rZW5cbmNvbnN0IG1pbkNlbGxTaXplID0gODA7XG4vLyBvcHRpb24gYnV0dG9ucyBhbmQgZmllbGQgdG9rZW5cbmNvbnN0IG9wdGlvbkJ1dHRvbldpZHRoID0gMjA7XG5jb25zdCBwaW5CdXR0b24gPSAyMDtcbmNvbnN0IGNlbGxQYWRkaW5nID0gMjA7XG5cbmV4cG9ydCB0eXBlIENvbE1ldGEgPSB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICBjb2xJZHg6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhVGFibGVTdHlsZSA9IHtcbiAgbWluQ2VsbFNpemU/OiBudW1iZXI7XG4gIGNlbGxQYWRkaW5nPzogbnVtYmVyO1xuICBmb250U2l6ZT86IG51bWJlcjtcbiAgZm9udD86IHN0cmluZztcbiAgb3B0aW9uc0J1dHRvbj86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVzdWx0ID0ge1xuICB0YWJsZTogYXJyb3cuVGFibGU7XG4gIHRhYmxlRHVja0RCVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5leHBvcnQgdHlwZSBQcmV2aWV3RGF0YVBhbmVsUHJvcHMgPSBCYXNlQ29tcG9uZW50UHJvcHMgJiB7XG4gIHJlc3VsdDogUXVlcnlSZXN1bHQ7XG4gIHJvd3NUb0NhbGN1bGF0ZVByZXZpZXc/OiBudW1iZXI7XG4gIHRoZW1lPzogYW55O1xuICBzZXRDb2x1bW5EaXNwbGF5Rm9ybWF0PzogKGZvcm1hdHM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSA9PiB2b2lkO1xuICBkZWZhdWx0UGlubmVkQ29sdW1ucz86IHN0cmluZ1tdO1xuICBkYXRhVGFibGVTdHlsZTogRGF0YVRhYmxlU3R5bGU7XG4gIG9uQWRkUmVzdWx0VG9NYXA6IChyZXN1bHQ6IFF1ZXJ5UmVzdWx0KSA9PiB2b2lkO1xufTtcblxuY29uc3QgUHJldmlld0RhdGFQYW5lbFdPVGhlbWU6IFJlYWN0LkZDPFByZXZpZXdEYXRhUGFuZWxQcm9wcz4gPSAoe1xuICByZXN1bHQsXG4gIHJvd3NUb0NhbGN1bGF0ZVByZXZpZXcgPSBERUZBVUxUX1JPV1NfVE9fQ0FMQ1VMQVRFX1BSRVZJRVcsXG4gIGRlZmF1bHRQaW5uZWRDb2x1bW5zID0gW10sXG4gIHRoZW1lXG59KSA9PiB7XG4gIGNvbnN0IFtwaW5uZWRDb2x1bW5zLCBzZXRQaW5uZWRDb2x1bW5zXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihkZWZhdWx0UGlubmVkQ29sdW1ucyk7XG4gIGNvbnN0IGZpZWxkcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gYXJyb3dTY2hlbWFUb0ZpZWxkcyhyZXN1bHQudGFibGUsIHJlc3VsdC50YWJsZUR1Y2tEQlR5cGVzKSxcbiAgICBbcmVzdWx0XVxuICApO1xuICBjb25zdCBkYXRhQ29udGFpbmVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY29scyA9IFsuLi5BcnJheShyZXN1bHQudGFibGUubnVtQ29scykua2V5cygpXS5tYXAoaSA9PiByZXN1bHQudGFibGUuZ2V0Q2hpbGRBdChpKSk7XG5cbiAgICBjb25zdCBkYXRhQ29udGFpbmVyID0gY3JlYXRlRGF0YUNvbnRhaW5lcihjb2xzLCB7XG4gICAgICBmaWVsZHMsXG4gICAgICBpbnB1dERhdGFGb3JtYXQ6IERhdGFGb3JtLkNPTFNfQVJSQVlcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YUNvbnRhaW5lcjtcbiAgfSwgW3Jlc3VsdCwgZmllbGRzXSk7XG5cbiAgY29uc3QgY29sdW1ucyA9IHVzZU1lbW8oKCkgPT4gZmllbGRzLm1hcChmID0+IGYubmFtZSksIFtmaWVsZHNdKTtcbiAgY29uc3QgY29sTWV0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGZpZWxkcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHtuYW1lLCBkaXNwbGF5TmFtZSwgdHlwZSwgZGlzcGxheUZvcm1hdH0sIGNvbElkeCkgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlICcnIHx8ICdhYWEnID0gJ2FhYSdcbiAgICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQgPyBkaXNwbGF5TmFtZSA6IG5hbWUsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgY29sSWR4XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICksXG4gICAgW2ZpZWxkc11cbiAgKTtcbiAgY29uc3QgY29weVRhYmxlQ29sdW1uID0gdXNlQ2FsbGJhY2soXG4gICAgY29sdW1uID0+IHtcbiAgICAgIGNvbnN0IHtjb2xJZHgsIHR5cGV9ID0gY29sTWV0YVtjb2x1bW5dO1xuICAgICAgY29uc3QgdGV4dCA9IGRhdGFDb250YWluZXJcbiAgICAgICAgLm1hcEluZGV4KHJvdyA9PiBwYXJzZUZpZWxkVmFsdWUoZGF0YUNvbnRhaW5lci52YWx1ZUF0KHJvdy5pbmRleCwgY29sSWR4KSwgdHlwZSkpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgIG5hdmlnYXRvcj8uY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgICB9LFxuICAgIFtjb2xNZXRhLCBkYXRhQ29udGFpbmVyXVxuICApO1xuICBjb25zdCBwaW5UYWJsZUNvbHVtbiA9IHVzZUNhbGxiYWNrKFxuICAgIGNvbHVtbiA9PlxuICAgICAgcGlubmVkQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pXG4gICAgICAgID8gc2V0UGlubmVkQ29sdW1ucyhwaW5uZWRDb2x1bW5zLmZpbHRlcihjID0+IGMgIT09IGNvbHVtbikpXG4gICAgICAgIDogc2V0UGlubmVkQ29sdW1ucyhbLi4ucGlubmVkQ29sdW1ucywgY29sdW1uXSksXG4gICAgW3Bpbm5lZENvbHVtbnNdXG4gICk7XG5cbiAgLy8gVE9ETyBQb3RlbnRpYWxseSBjb3N0bHkgb3BlcmF0aW9uIGZvciBub24gcm93IGJhc2VkIGRhdGEgY29udGFpbmVycy4gUmV2aXNpdCBzb3J0aW5nIGJlbG93LlxuICBjb25zdCBkYXRhVGFibGVTdHlsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG1pbkNlbGxTaXplLFxuICAgICAgY2VsbFBhZGRpbmcsXG4gICAgICBvcHRpb25zQnV0dG9uOlxuICAgICAgICB0aGVtZS5maWVsZFRva2VuV2lkdGggKyB0aGVtZS5maWVsZFRva2VuUmlnaHRNYXJnaW4gKyBvcHRpb25CdXR0b25XaWR0aCArIHBpbkJ1dHRvbixcbiAgICAgIGZvbnRTaXplOiB0aGVtZS5jZWxsRm9udFNpemUsXG4gICAgICBmb250OiB0aGVtZS5mb250RmFtaWx5XG4gICAgfSksXG4gICAgW3RoZW1lXVxuICApO1xuICBjb25zdCBjZWxsU2l6ZUNhY2hlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xuICAgICAgY29uc3Qge2NvbElkeCwgZGlzcGxheU5hbWUsIHR5cGV9ID0gY29sTWV0YVtjb2x1bW5dO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbY29sdW1uXTogcmVuZGVyZWRTaXplKHtcbiAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICBkYXRhQ29udGFpbmVyLFxuICAgICAgICAgICAgY29sdW1uOiBkaXNwbGF5TmFtZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29sSWR4LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbnVtUm93c1RvQ2FsY3VsYXRlOiByb3dzVG9DYWxjdWxhdGVQcmV2aWV3LFxuICAgICAgICAgIC4uLmRhdGFUYWJsZVN0eWxlXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sIHt9KTtcbiAgfSwgW2NvbHVtbnMsIGNvbE1ldGEsIGRhdGFDb250YWluZXIsIHJvd3NUb0NhbGN1bGF0ZVByZXZpZXcsIGRhdGFUYWJsZVN0eWxlXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGF0YVRhYmxlXG4gICAgICBjb2xNZXRhPXtjb2xNZXRhfVxuICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgIGNlbGxTaXplQ2FjaGU9e2NlbGxTaXplQ2FjaGV9XG4gICAgICBkYXRhQ29udGFpbmVyPXtkYXRhQ29udGFpbmVyfVxuICAgICAgcGlubmVkQ29sdW1ucz17cGlubmVkQ29sdW1uc31cbiAgICAgIGNvcHlUYWJsZUNvbHVtbj17Y29weVRhYmxlQ29sdW1ufVxuICAgICAgcGluVGFibGVDb2x1bW49e3BpblRhYmxlQ29sdW1ufVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgUHJldmlld0RhdGFQYW5lbCA9IHdpdGhUaGVtZShcbiAgUHJldmlld0RhdGFQYW5lbFdPVGhlbWVcbikgYXMgUmVhY3QuRkM8UHJldmlld0RhdGFQYW5lbFByb3BzPjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUdBLE9BQU9BLEtBQUssSUFBR0MsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsUUFBc0IsT0FBTztBQUMxRSxTQUFRQyxTQUFTLFFBQU8sbUJBQW1CO0FBRTNDLFNBQVFDLFNBQVMsRUFBRUMsWUFBWSxRQUFPLHVCQUF1QjtBQUM3RCxTQUFRQyxtQkFBbUIsUUFBTyx1QkFBdUI7QUFDekQsU0FBUUMsZUFBZSxFQUFFQyxtQkFBbUIsRUFBRUMsUUFBUSxRQUFPLGtCQUFrQjtBQU8vRSxJQUFNQyxpQ0FBaUMsR0FBRyxHQUFHO0FBQzdDO0FBQ0EsSUFBTUMsV0FBVyxHQUFHLEVBQUU7QUFDdEI7QUFD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
|