@kepler.gl/duckdb 3.3.0-alpha.5 → 3.3.0-alpha.7
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} +1 -1
- 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 +481 -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 +476 -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 +22 -17
- package/dist/adapters/duckdb-wasm-adapter.js +0 -258
- package/dist/components/monaco-editor.js +0 -174
- package/dist/components/preview-data-panel.js +0 -127
- package/dist/components/schema-panel.js +0 -170
- package/dist/components/sql-panel.js +0 -395
- package/dist/components/tree.js +0 -90
- package/dist/processors/data-processor.js +0 -353
- package/dist/table/duckdb-table-utils.js +0 -668
- package/dist/table/duckdb-table.js +0 -479
- 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 'lodash/uniq';
|
|
13
|
+
import uniqBy from 'lodash/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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlTWVtbyIsInVzZVJlZiIsIkVkaXRvciIsIm1vbmFjbyIsInVuaXEiLCJ1bmlxQnkiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJwdXNoIiwiTW9uYWNvRWRpdG9yIiwiX3JlZiIsIm9uUnVuUXVlcnkiLCJvbkNoYW5nZSIsImNvZGUiLCJ0YWJsZVNjaGVtYSIsImlzUmVhZE9ubHkiLCJzY2hlbWFUYWJsZU5hbWVzIiwibWFwIiwiZCIsInNjaGVtYVRhYmxlTmFtZXNTZXQiLCJTZXQiLCJoYW5kbGVSdW5RdWVyeVJlZiIsImN1cnJlbnQiLCJoYW5kbGVFZGl0b3JEaWRNb3VudCIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJGaWVsZCIsImhhcyIsImdldCIsImZpbHRlciIsIl9yZWYzIiwiY29sdW1uX25hbWUiLCJzIiwiY3JlYXRlRWxlbWVudCIsImhlaWdodCIsInRoZW1lIiwiZGVmYXVsdExhbmd1YWdlIiwiZGVmYXVsdFZhbHVlIiwib25Nb3VudCIsIm9wdGlvbnMiLCJfb2JqZWN0U3ByZWFkIiwicmVhZE9ubHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb25hY28tZWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRWRpdG9yLCB7T25DaGFuZ2UsIE9uTW91bnR9IGZyb20gJ0Btb25hY28tZWRpdG9yL3JlYWN0JztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbi8vIGltcG9ydCB7dGFibGVTY2hlbWEgYXMgREVGQVVMVF9TQ0hFTUF9IGZyb20gJy4vdGFibGUtc2NoZW1hJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmNvbnN0IE1PTkFDT19PUFRJT05TOiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbWluaW1hcDoge2VuYWJsZWQ6IGZhbHNlfSxcbiAgbGFuZ3VhZ2U6ICdzcWwnLFxuICBjb250ZXh0bWVudTogZmFsc2UsXG4gIHJlbmRlckxpbmVIaWdobGlnaHQ6ICdub25lJyxcbiAgc2Nyb2xsQmV5b25kTGFzdExpbmU6IGZhbHNlLFxuICBzY3JvbGxiYXI6IHthbHdheXNDb25zdW1lTW91c2VXaGVlbDogZmFsc2V9LFxuICBvdmVydmlld1J1bGVyTGFuZXM6IDAsXG4gIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcbiAgYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXI6ICdvbicsXG4gIHF1aWNrU3VnZ2VzdGlvbnNEZWxheTogNDAwLFxuICBtYXRjaE9uV29yZFN0YXJ0T25seTogZmFsc2UsXG4gIHRhYkNvbXBsZXRpb246ICdvZmYnLFxuICBsaW5lTnVtYmVyczogJ29mZidcbn07XG5cbmZ1bmN0aW9uIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoc3FsOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVnZXggPSAvXFxiKD86RlJPTXxKT0lOKVxccysoW15cXHMuXSsoPzpcXC5bXlxccy5dKyk/KVxccyooPzpBUyk/XFxzKihbXlxccyxdKyk/L2dpO1xuICBjb25zdCB0YWJsZXM6IHt0YWJsZV9uYW1lOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmd9W10gPSBbXTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhzcWwpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZV9uYW1lID0gbWF0Y2hbMV07XG4gICAgaWYgKCEvXFwoLy50ZXN0KHRhYmxlX25hbWUpKSB7XG4gICAgICAvLyBleGNsdWRlIGZ1bmN0aW9uIGNhbGxzXG4gICAgICBsZXQgYWxpYXMgPSBtYXRjaFsyXSBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgaWYgKGFsaWFzICYmIC9vbnx3aGVyZXxpbm5lcnxsZWZ0fHJpZ2h0fGpvaW4vLnRlc3QoYWxpYXMpKSB7XG4gICAgICAgIGFsaWFzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRhYmxlcy5wdXNoKHtcbiAgICAgICAgdGFibGVfbmFtZSxcbiAgICAgICAgYWxpYXM6IGFsaWFzIHx8IHRhYmxlX25hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YWJsZXM7XG59XG5cbmludGVyZmFjZSBNb25hY29FZGl0b3JQcm9wcyB7XG4gIGNvZGU6IHN0cmluZztcbiAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiBPbkNoYW5nZTtcbiAgb25SdW5RdWVyeTogKCkgPT4gdm9pZDtcbiAgdGFibGVTY2hlbWE/OiB7dGFibGVfbmFtZTogc3RyaW5nOyBjb2x1bW5fbmFtZTogc3RyaW5nfVtdO1xufVxuXG5jb25zdCBNb25hY29FZGl0b3I6IFJlYWN0LkZDPE1vbmFjb0VkaXRvclByb3BzPiA9ICh7XG4gIG9uUnVuUXVlcnksXG4gIG9uQ2hhbmdlLFxuICBjb2RlLFxuICB0YWJsZVNjaGVtYSxcbiAgaXNSZWFkT25seVxufSkgPT4ge1xuICAvLyBwcml2YXRlIGVkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuICBjb25zdCBzY2hlbWFUYWJsZU5hbWVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodGFibGVTY2hlbWEgPyB1bmlxKHRhYmxlU2NoZW1hLm1hcChkID0+IGQudGFibGVfbmFtZSkpIDogW10pLFxuICAgIFt0YWJsZVNjaGVtYV1cbiAgKTtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lc1NldCA9IHVzZU1lbW8oKCkgPT4gbmV3IFNldChzY2hlbWFUYWJsZU5hbWVzKSwgW3NjaGVtYVRhYmxlTmFtZXNdKTtcbiAgY29uc3QgaGFuZGxlUnVuUXVlcnlSZWYgPSB1c2VSZWYob25SdW5RdWVyeSk7XG4gIGhhbmRsZVJ1blF1ZXJ5UmVmLmN1cnJlbnQgPSBvblJ1blF1ZXJ5O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRvckRpZE1vdW50OiBPbk1vdW50ID0gdXNlQ2FsbGJhY2soXG4gICAgZWRpdG9yID0+IHtcbiAgICAgIC8vIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xuICAgICAgZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgIGVkaXRvci5hZGRBY3Rpb24oe1xuICAgICAgICBpZDogJ3J1bi1xdWVyeScsXG4gICAgICAgIGxhYmVsOiAnUnVuIFF1ZXJ5JyxcbiAgICAgICAga2V5YmluZGluZ3M6IFtcbiAgICAgICAgICBtb25hY28uS2V5TW9kLkN0cmxDbWQgfCBtb25hY28uS2V5Q29kZS5FbnRlcixcbiAgICAgICAgICBtb25hY28uS2V5TW9kLlNoaWZ0IHwgbW9uYWNvLktleUNvZGUuRW50ZXJcbiAgICAgICAgXSxcbiAgICAgICAgY29udGV4dE1lbnVHcm91cElkOiAnY3VzdG9tJyxcbiAgICAgICAgY29udGV4dE1lbnVPcmRlcjogMCxcbiAgICAgICAgcnVuOiAoKSA9PiBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50KClcbiAgICAgIH0pO1xuXG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignKicsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbiwgX2NvbnRleHQsIF9jYW5jZWxhdGlvblRva2VuKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdteUN1c3RvbVNuaXBwZXQnLFxuICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0LFxuICAgICAgICAgICAgICBpbnNlcnRUZXh0OiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJyxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0LFxuICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJ1xuICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1cbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgY29uc3QgZnVsbFF1ZXJ5VGV4dCA9IG1vZGVsLmdldFZhbHVlKCk7XG5cbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzQW5kQWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFxuICAgICAgICAgICAgcGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyhmdWxsUXVlcnlUZXh0KS5tYXAoKHt0YWJsZV9uYW1lLCBhbGlhc30pID0+IFtcbiAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgIHRhYmxlX25hbWVcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRoaXNMaW5lID0gbW9kZWwuZ2V0VmFsdWVJblJhbmdlKHtcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIGVuZENvbHVtbjogcG9zaXRpb24uY29sdW1uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgdGhpc1Rva2VuID0gdGhpc0xpbmUudHJpbSgpLnNwbGl0KCcgJykuc2xpY2UoLTEpPy5bMF0gfHwgJyc7XG5cbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVTcGFjZSA9IC9cXHM/KFxcdyspXFxzK1xcdyskLy5leGVjKHRoaXNMaW5lLnRyaW0oKSk/LlsxXTtcbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVEb3QgPSAvKFxcdyspXFwuXFx3KiQvLmV4ZWModGhpc1Rva2VuKT8uWzFdO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGFibGVOYW1lc0FuZEFsaWFzZXMsIHRoaXNUb2tlbiwgbGFzdFRva2VuQmVmb3JlU3BhY2UsIGxhc3RUb2tlbkJlZm9yZURvdCk7XG5cbiAgICAgICAgICBpZiAobGFzdFRva2VuQmVmb3JlU3BhY2UgJiYgL2Zyb218am9pbnx1cGRhdGV8aW50by8udGVzdChsYXN0VG9rZW5CZWZvcmVTcGFjZSkpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIC4uLnNjaGVtYVRhYmxlTmFtZXMubWFwKFxuICAgICAgICAgICAgICAgIHRhYmxlX25hbWUgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YWJsZV9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogdGFibGVfbmFtZVxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZURvdCkge1xuICAgICAgICAgICAgbGV0IHRhYmxlX25hbWUgPSBudWxsIGFzIHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICBpZiAoc2NoZW1hVGFibGVOYW1lc1NldC5oYXMobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gbGFzdFRva2VuQmVmb3JlRG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0YWJsZU5hbWVzQW5kQWxpYXNlcy5nZXQobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gdGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhYmxlX25hbWUgJiYgdGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50YWJsZVNjaGVtYVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihkID0+IGQudGFibGVfbmFtZSA9PT0gdGFibGVfbmFtZSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICh7Y29sdW1uX25hbWV9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sdW1uX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGNvbHVtbl9uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uczogdW5pcUJ5KHN1Z2dlc3Rpb25zLCBzID0+IHMuaW5zZXJ0VGV4dClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFt0YWJsZVNjaGVtYSwgc2NoZW1hVGFibGVOYW1lcywgc2NoZW1hVGFibGVOYW1lc1NldF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxFZGl0b3JcbiAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgdGhlbWU9XCJ2cy1kYXJrXCJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZT1cInNxbFwiXG4gICAgICBkZWZhdWx0VmFsdWU9e2NvZGV9XG4gICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICBvbk1vdW50PXtoYW5kbGVFZGl0b3JEaWRNb3VudH1cbiAgICAgIG9wdGlvbnM9e3tcbiAgICAgICAgLi4uTU9OQUNPX09QVElPTlMsXG4gICAgICAgIHJlYWRPbmx5OiBpc1JlYWRPbmx5XG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb25hY29FZGl0b3I7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBOztBQUVBLE9BQU9BLEtBQUssSUFBR0MsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sUUFBTyxPQUFPO0FBQ3pELE9BQU9DLE1BQU0sTUFBMkIsc0JBQXNCO0FB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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+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgUHJldmlld0RhdGFQYW5lbCA9IHdpdGhUaGVtZShcbiAgUHJldmlld0RhdGFQYW5lbFdPVGhlbWVcbikgYXMgUmVhY3QuRkM8UHJldmlld0RhdGFQYW5lbFByb3BzPjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUdBLE9BQU9BLEtBQUssSUFBR0MsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsUUFBc0IsT0FBTztBQUMxRSxTQUFRQyxTQUFTLFFBQU8sbUJBQW1CO0FBRTNDLFNBQVFDLFNBQVMsRUFBRUMsWUFBWSxRQUFPLHVCQUF1QjtBQUM3RCxTQUFRQyxtQkFBbUIsUUFBTyx1QkFBdUI7QUFDekQsU0FBUUMsZUFBZSxFQUFFQyxtQkFBbUIsRUFBRUMsUUFBUSxRQUFPLGtCQUFrQjtBQU8vRSxJQUFNQyxpQ0FBaUMsR0FBRyxHQUFHO0FBQzdDO0FBQ0EsSUFBTUMsV0FBVyxHQUFHLEVBQUU7QUFDdEI7QUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxFQUFFO0FBQzVCLElBQU1DLFNBQVMsR0FBRyxFQUFFO0FBQ3BCLElBQU1DLFdBQVcsR0FBRyxFQUFFO0FBa0N0QixJQUFNQyx1QkFBd0QsR0FBRyxTQUEzREEsdUJBQXdEQSxDQUFBQyxJQUFBLEVBS3hEO0VBQUEsSUFKSkMsTUFBTSxHQUFBRCxJQUFBLENBQU5DLE1BQU07SUFBQUMscUJBQUEsR0FBQUYsSUFBQSxDQUNORyxzQkFBc0I7SUFBdEJBLHNCQUFzQixHQUFBRCxxQkFBQSxjQUFHUixpQ0FBaUMsR0FBQVEscUJBQUE7SUFBQUUscUJBQUEsR0FBQUosSUFBQSxDQUMxREssb0JBQW9CO0lBQXBCQSxvQkFBb0IsR0FBQUQscUJBQUEsY0FBRyxFQUFFLEdBQUFBLHFCQUFBO0lBQ3pCRSxLQUFLLEdBQUFOLElBQUEsQ0FBTE0sS0FBSztFQUVMLElBQUFDLFNBQUEsR0FBMENyQixRQUFRLENBQVdtQixvQkFBb0IsQ0FBQztJQUFBRyxVQUFBLEdBQUFDLGNBQUEsQ0FBQUYsU0FBQTtJQUEzRUcsYUFBYSxHQUFBRixVQUFBO0lBQUVHLGdCQUFnQixHQUFBSCxVQUFBO0VBQ3RDLElBQU1JLE1BQU0sR0FBRzNCLE9BQU8sQ0FDcEI7SUFBQSxPQUFNSyxtQkFBbUIsQ0FBQ1csTUFBTSxDQUFDWSxLQUFLLEVBQUVaLE1BQU0sQ0FBQ2EsZ0JBQWdCLENBQUM7RUFBQSxHQUNoRSxDQUFDYixNQUFNLENBQ1QsQ0FBQztFQUNELElBQU1jLGFBQWEsR0FBRzlCLE9BQU8sQ0FBQyxZQUFNO0lBQ2xDLElBQU0rQixJQUFJLEdBQUdDLGtCQUFBLENBQUlDLEtBQUssQ0FBQ2pCLE1BQU0sQ0FBQ1ksS0FBSyxDQUFDTSxPQUFPLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsRUFBRUMsR0FBRyxDQUFDLFVBQUFDLENBQUM7TUFBQSxPQUFJckIsTUFBTSxDQUFDWSxLQUFLLENBQUNVLFVBQVUsQ0FBQ0QsQ0FBQyxDQUFDO0lBQUEsRUFBQztJQUV6RixJQUFNUCxhQUFhLEdBQUd2QixtQkFBbUIsQ0FBQ3dCLElBQUksRUFBRTtNQUM5Q0osTUFBTSxFQUFOQSxNQUFNO01BQ05ZLGVBQWUsRUFBRS9CLFFBQVEsQ0FBQ2dDO0lBQzVCLENBQUMsQ0FBQztJQUNGLE9BQU9WLGFBQWE7RUFDdEIsQ0FBQyxFQUFFLENBQUNkLE1BQU0sRUFBRVcsTUFBTSxDQUFDLENBQUM7RUFFcEIsSUFBTWMsT0FBTyxHQUFHekMsT0FBTyxDQUFDO0lBQUEsT0FBTTJCLE1BQU0sQ0FBQ1MsR0FBRyxDQUFDLFVBQUFNLENBQUM7TUFBQSxPQUFJQSxDQUFDLENBQUNDLElBQUk7SUFBQSxFQUFDO0VBQUEsR0FBRSxDQUFDaEIsTUFBTSxDQUFDLENBQUM7RUFDaEUsSUFBTWlCLE9BQU8sR0FBRzVDLE9BQU8sQ0FDckI7SUFBQSxPQUNFMkIsTUFBTSxDQUFDa0IsTUFBTSxDQUNYLFVBQUNDLEdBQUcsRUFBQUMsS0FBQSxFQUE0Q0MsTUFBTTtNQUFBLElBQS9DTCxJQUFJLEdBQUFJLEtBQUEsQ0FBSkosSUFBSTtRQUFFTSxXQUFXLEdBQUFGLEtBQUEsQ0FBWEUsV0FBVztRQUFFQyxJQUFJLEdBQUFILEtBQUEsQ0FBSkcsSUFBSTtRQUFFQyxhQUFhLEdBQUFKLEtBQUEsQ0FBYkksYUFBYTtNQUFBLE9BQUFDLGFBQUEsQ0FBQUEsYUFBQSxLQUN4Q04sR0FBRyxPQUFBTyxlQUFBLEtBQ0xWLElBQUksRUFBRztRQUNOO1FBQ0FBLElBQUksRUFBRU0sV0FBVyxLQUFLSyxTQUFTLEdBQUdMLFdBQVcsR0FBR04sSUFBSTtRQUNwRE0sV0FBVyxFQUFYQSxXQUFXO1FBQ1hFLGFBQWEsRUFBYkEsYUFBYTtRQUNiRCxJQUFJLEVBQUpBLElBQUk7UUFDSkYsTUFBTSxFQUFOQTtNQUNGLENBQUM7SUFBQSxDQUNELEVBQ0YsQ0FBQyxDQUNILENBQUM7RUFBQSxHQUNILENBQUNyQixNQUFNLENBQ1QsQ0FBQztFQUNELElBQU00QixlQUFlLEdBQUd4RCxXQUFXLENBQ2pDLFVBQUF5RCxNQUFNLEVBQUk7SUFBQSxJQUFBQyxVQUFBO0lBQ1IsSUFBQUMsZUFBQSxHQUF1QmQsT0FBTyxDQUFDWSxNQUFNLENBQUM7TUFBL0JSLE1BQU0sR0FBQVUsZUFBQSxDQUFOVixNQUFNO01BQUVFLElBQUksR0FBQVEsZUFBQSxDQUFKUixJQUFJO0lBQ25CLElBQU1TLElBQUksR0FBRzdCLGFBQWEsQ0FDdkI4QixRQUFRLENBQUMsVUFBQUMsR0FBRztNQUFBLE9BQUl2RCxlQUFlLENBQUN3QixhQUFhLENBQUNnQyxPQUFPLENBQUNELEdBQUcsQ0FBQ0UsS0FBSyxFQUFFZixNQUFNLENBQUMsRUFBRUUsSUFBSSxDQUFDO0lBQUEsRUFBQyxDQUNoRmMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNiLENBQUFQLFVBQUEsR0FBQVEsU0FBUyxjQUFBUixVQUFBLGVBQVRBLFVBQUEsQ0FBV1MsU0FBUyxDQUFDQyxTQUFTLENBQUNSLElBQUksQ0FBQztFQUN0QyxDQUFDLEVBQ0QsQ0FBQ2YsT0FBTyxFQUFFZCxhQUFhLENBQ3pCLENBQUM7RUFDRCxJQUFNc0MsY0FBYyxHQUFHckUsV0FBVyxDQUNoQyxVQUFBeUQsTUFBTTtJQUFBLE9BQ0ovQixhQUFhLENBQUM0QyxRQUFRLENBQUNiLE1BQU0sQ0FBQyxHQUMxQjlCLGdCQUFnQixDQUFDRCxhQUFhLENBQUM2QyxNQUFNLENBQUMsVUFBQUMsQ0FBQztNQUFBLE9BQUlBLENBQUMsS0FBS2YsTUFBTTtJQUFBLEVBQUMsQ0FBQyxHQUN6RDlCLGdCQUFnQixJQUFBOEMsTUFBQSxDQUFBeEMsa0JBQUEsQ0FBS1AsYUFBYSxJQUFFK0IsTUFBTSxFQUFDLENBQUM7RUFBQSxHQUNsRCxDQUFDL0IsYUFBYSxDQUNoQixDQUFDOztFQUVEO0VBQ0EsSUFBTWdELGNBQWMsR0FBR3pFLE9BQU8sQ0FDNUI7SUFBQSxPQUFPO01BQ0xVLFdBQVcsRUFBWEEsV0FBVztNQUNYRyxXQUFXLEVBQVhBLFdBQVc7TUFDWDZELGFBQWEsRUFDWHJELEtBQUssQ0FBQ3NELGVBQWUsR0FBR3RELEtBQUssQ0FBQ3VELHFCQUFxQixHQUFHakUsaUJBQWlCLEdBQUdDLFNBQVM7TUFDckZpRSxRQUFRLEVBQUV4RCxLQUFLLENBQUN5RCxZQUFZO01BQzVCQyxJQUFJLEVBQUUxRCxLQUFLLENBQUMyRDtJQUNkLENBQUM7RUFBQSxDQUFDLEVBQ0YsQ0FBQzNELEtBQUssQ0FDUixDQUFDO0VBQ0QsSUFBTTRELGFBQWEsR0FBR2pGLE9BQU8sQ0FBQyxZQUFNO0lBQ2xDLE9BQU95QyxPQUFPLENBQUNJLE1BQU0sQ0FBQyxVQUFDQyxHQUFHLEVBQUVVLE1BQU0sRUFBSztNQUNyQyxJQUFBMEIsZ0JBQUEsR0FBb0N0QyxPQUFPLENBQUNZLE1BQU0sQ0FBQztRQUE1Q1IsTUFBTSxHQUFBa0MsZ0JBQUEsQ0FBTmxDLE1BQU07UUFBRUMsV0FBVyxHQUFBaUMsZ0JBQUEsQ0FBWGpDLFdBQVc7UUFBRUMsSUFBSSxHQUFBZ0MsZ0JBQUEsQ0FBSmhDLElBQUk7TUFDaEMsT0FBQUUsYUFBQSxDQUFBQSxhQUFBLEtBQ0tOLEdBQUcsT0FBQU8sZUFBQSxLQUNMRyxNQUFNLEVBQUdwRCxZQUFZLENBQUFnRCxhQUFBO1FBQ3BCTyxJQUFJLEVBQUU7VUFDSjdCLGFBQWEsRUFBYkEsYUFBYTtVQUNiMEIsTUFBTSxFQUFFUDtRQUNWLENBQUM7UUFDREQsTUFBTSxFQUFOQSxNQUFNO1FBQ05FLElBQUksRUFBSkEsSUFBSTtRQUNKaUMsa0JBQWtCLEVBQUVqRTtNQUFzQixHQUN2Q3VELGNBQWMsQ0FDbEIsQ0FBQztJQUVOLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNSLENBQUMsRUFBRSxDQUFDaEMsT0FBTyxFQUFFRyxPQUFPLEVBQUVkLGFBQWEsRUFBRVosc0JBQXNCLEVBQUV1RCxjQUFjLENBQUMsQ0FBQztFQUU3RSxvQkFDRTNFLEtBQUEsQ0FBQXNGLGFBQUEsQ0FBQ2pGLFNBQVM7SUFDUnlDLE9BQU8sRUFBRUEsT0FBUTtJQUNqQkgsT0FBTyxFQUFFQSxPQUFRO0lBQ2pCd0MsYUFBYSxFQUFFQSxhQUFjO0lBQzdCbkQsYUFBYSxFQUFFQSxhQUFjO0lBQzdCTCxhQUFhLEVBQUVBLGFBQWM7SUFDN0I4QixlQUFlLEVBQUVBLGVBQWdCO0lBQ2pDYSxjQUFjLEVBQUVBO0VBQWUsQ0FDaEMsQ0FBQztBQUVOLENBQUM7QUFFRCxPQUFPLElBQU1pQixnQkFBZ0IsR0FBR25GLFNBQVMsQ0FDdkNZLHVCQUNGLENBQW9DIiwiaWdub3JlTGlzdCI6W119
|