@kepler.gl/duckdb 3.3.0-alpha.0 → 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 +28 -24
- 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,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.DuckDBWasmAdapter = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _duckdbWasm = _interopRequireWildcard(require("@duckdb/duckdb-wasm"));
|
|
15
|
+
var duckdb = _duckdbWasm;
|
|
16
|
+
var _perf = require("../utils/perf");
|
|
17
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
18
|
+
// SPDX-License-Identifier: MIT
|
|
19
|
+
// Copyright contributors to the kepler.gl project
|
|
20
|
+
var Connection = /*#__PURE__*/function () {
|
|
21
|
+
function Connection(connection) {
|
|
22
|
+
(0, _classCallCheck2["default"])(this, Connection);
|
|
23
|
+
(0, _defineProperty2["default"])(this, "connection", void 0);
|
|
24
|
+
this.connection = connection;
|
|
25
|
+
}
|
|
26
|
+
return (0, _createClass2["default"])(Connection, [{
|
|
27
|
+
key: "query",
|
|
28
|
+
value: function () {
|
|
29
|
+
var _query = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(statement) {
|
|
30
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
31
|
+
while (1) switch (_context.prev = _context.next) {
|
|
32
|
+
case 0:
|
|
33
|
+
return _context.abrupt("return", this.connection.query(statement));
|
|
34
|
+
case 1:
|
|
35
|
+
case "end":
|
|
36
|
+
return _context.stop();
|
|
37
|
+
}
|
|
38
|
+
}, _callee, this);
|
|
39
|
+
}));
|
|
40
|
+
function query(_x) {
|
|
41
|
+
return _query.apply(this, arguments);
|
|
42
|
+
}
|
|
43
|
+
return query;
|
|
44
|
+
}()
|
|
45
|
+
}, {
|
|
46
|
+
key: "insertArrowTable",
|
|
47
|
+
value: function () {
|
|
48
|
+
var _insertArrowTable = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(arrowTable, params) {
|
|
49
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
50
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
51
|
+
case 0:
|
|
52
|
+
_context2.next = 2;
|
|
53
|
+
return this.connection.insertArrowTable(arrowTable, params);
|
|
54
|
+
case 2:
|
|
55
|
+
case "end":
|
|
56
|
+
return _context2.stop();
|
|
57
|
+
}
|
|
58
|
+
}, _callee2, this);
|
|
59
|
+
}));
|
|
60
|
+
function insertArrowTable(_x2, _x3) {
|
|
61
|
+
return _insertArrowTable.apply(this, arguments);
|
|
62
|
+
}
|
|
63
|
+
return insertArrowTable;
|
|
64
|
+
}()
|
|
65
|
+
}, {
|
|
66
|
+
key: "close",
|
|
67
|
+
value: function () {
|
|
68
|
+
var _close = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
69
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
70
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
71
|
+
case 0:
|
|
72
|
+
_context3.next = 2;
|
|
73
|
+
return this.connection.close();
|
|
74
|
+
case 2:
|
|
75
|
+
case "end":
|
|
76
|
+
return _context3.stop();
|
|
77
|
+
}
|
|
78
|
+
}, _callee3, this);
|
|
79
|
+
}));
|
|
80
|
+
function close() {
|
|
81
|
+
return _close.apply(this, arguments);
|
|
82
|
+
}
|
|
83
|
+
return close;
|
|
84
|
+
}()
|
|
85
|
+
}]);
|
|
86
|
+
}();
|
|
87
|
+
var DuckDBWasmAdapter = exports.DuckDBWasmAdapter = /*#__PURE__*/function () {
|
|
88
|
+
function DuckDBWasmAdapter(options) {
|
|
89
|
+
(0, _classCallCheck2["default"])(this, DuckDBWasmAdapter);
|
|
90
|
+
(0, _defineProperty2["default"])(this, "duckDB", void 0);
|
|
91
|
+
// pass existing AsyncDuckDB object created elsewhere
|
|
92
|
+
if (options instanceof Promise || options instanceof _duckdbWasm.AsyncDuckDB) {
|
|
93
|
+
this.duckDB = options;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// or create a new AsyncDuckDB object
|
|
98
|
+
var _ref = options || {},
|
|
99
|
+
_ref$debug = _ref.debug,
|
|
100
|
+
debug = _ref$debug === void 0 ? false : _ref$debug,
|
|
101
|
+
config = _ref.config;
|
|
102
|
+
this.duckDB = initializeDuckDbWasm(config, debug);
|
|
103
|
+
}
|
|
104
|
+
return (0, _createClass2["default"])(DuckDBWasmAdapter, [{
|
|
105
|
+
key: "connect",
|
|
106
|
+
value: function () {
|
|
107
|
+
var _connect = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
108
|
+
var db, c;
|
|
109
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
110
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
111
|
+
case 0:
|
|
112
|
+
_context4.next = 2;
|
|
113
|
+
return this.duckDB;
|
|
114
|
+
case 2:
|
|
115
|
+
db = _context4.sent;
|
|
116
|
+
_context4.next = 5;
|
|
117
|
+
return db.connect();
|
|
118
|
+
case 5:
|
|
119
|
+
c = _context4.sent;
|
|
120
|
+
return _context4.abrupt("return", new Connection(c));
|
|
121
|
+
case 7:
|
|
122
|
+
case "end":
|
|
123
|
+
return _context4.stop();
|
|
124
|
+
}
|
|
125
|
+
}, _callee4, this);
|
|
126
|
+
}));
|
|
127
|
+
function connect() {
|
|
128
|
+
return _connect.apply(this, arguments);
|
|
129
|
+
}
|
|
130
|
+
return connect;
|
|
131
|
+
}()
|
|
132
|
+
}, {
|
|
133
|
+
key: "registerFileText",
|
|
134
|
+
value: function () {
|
|
135
|
+
var _registerFileText = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(filename, content) {
|
|
136
|
+
var db;
|
|
137
|
+
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
138
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
139
|
+
case 0:
|
|
140
|
+
_context5.next = 2;
|
|
141
|
+
return this.duckDB;
|
|
142
|
+
case 2:
|
|
143
|
+
db = _context5.sent;
|
|
144
|
+
_context5.next = 5;
|
|
145
|
+
return db.registerFileText(filename, content);
|
|
146
|
+
case 5:
|
|
147
|
+
case "end":
|
|
148
|
+
return _context5.stop();
|
|
149
|
+
}
|
|
150
|
+
}, _callee5, this);
|
|
151
|
+
}));
|
|
152
|
+
function registerFileText(_x4, _x5) {
|
|
153
|
+
return _registerFileText.apply(this, arguments);
|
|
154
|
+
}
|
|
155
|
+
return registerFileText;
|
|
156
|
+
}()
|
|
157
|
+
}, {
|
|
158
|
+
key: "registerFileHandle",
|
|
159
|
+
value: function () {
|
|
160
|
+
var _registerFileHandle = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(name, handle, protocol, directIO) {
|
|
161
|
+
var db;
|
|
162
|
+
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
163
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
164
|
+
case 0:
|
|
165
|
+
_context6.next = 2;
|
|
166
|
+
return this.duckDB;
|
|
167
|
+
case 2:
|
|
168
|
+
db = _context6.sent;
|
|
169
|
+
_context6.next = 5;
|
|
170
|
+
return db.registerFileHandle(name, handle, protocol, directIO);
|
|
171
|
+
case 5:
|
|
172
|
+
case "end":
|
|
173
|
+
return _context6.stop();
|
|
174
|
+
}
|
|
175
|
+
}, _callee6, this);
|
|
176
|
+
}));
|
|
177
|
+
function registerFileHandle(_x6, _x7, _x8, _x9) {
|
|
178
|
+
return _registerFileHandle.apply(this, arguments);
|
|
179
|
+
}
|
|
180
|
+
return registerFileHandle;
|
|
181
|
+
}()
|
|
182
|
+
}]);
|
|
183
|
+
}();
|
|
184
|
+
/**
|
|
185
|
+
* Initialize DuckDB with a browser-specific Wasm bundle.
|
|
186
|
+
*/
|
|
187
|
+
var initializeDuckDbWasm = /*#__PURE__*/function () {
|
|
188
|
+
var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7(config, debug) {
|
|
189
|
+
var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch;
|
|
190
|
+
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
191
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
192
|
+
case 0:
|
|
193
|
+
start = performance.now(); // Select a bundle based on browser checks
|
|
194
|
+
JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
|
|
195
|
+
_context7.next = 4;
|
|
196
|
+
return duckdb.selectBundle(JSDELIVR_BUNDLES);
|
|
197
|
+
case 4:
|
|
198
|
+
bundle = _context7.sent;
|
|
199
|
+
if (bundle.mainWorker) {
|
|
200
|
+
_context7.next = 7;
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
throw new Error('Failed to initialize DuckDB');
|
|
204
|
+
case 7:
|
|
205
|
+
worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], {
|
|
206
|
+
type: 'text/javascript'
|
|
207
|
+
})); // Instantiate the async version of DuckDB-wasm
|
|
208
|
+
worker = new Worker(worker_url);
|
|
209
|
+
logger = debug ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
|
|
210
|
+
db = new _duckdbWasm.AsyncDuckDB(logger, worker);
|
|
211
|
+
_context7.next = 13;
|
|
212
|
+
return db.instantiate(bundle.mainModule, bundle.pthreadWorker);
|
|
213
|
+
case 13:
|
|
214
|
+
URL.revokeObjectURL(worker_url);
|
|
215
|
+
if (!config) {
|
|
216
|
+
_context7.next = 28;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
if (!config.path) {
|
|
220
|
+
_context7.next = 26;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
_context7.next = 18;
|
|
224
|
+
return fetch(config.path);
|
|
225
|
+
case 18:
|
|
226
|
+
res = _context7.sent;
|
|
227
|
+
_context7.next = 21;
|
|
228
|
+
return res.arrayBuffer();
|
|
229
|
+
case 21:
|
|
230
|
+
buffer = _context7.sent;
|
|
231
|
+
fileNameMatch = config.path.match(/[^/]*$/);
|
|
232
|
+
if (fileNameMatch) {
|
|
233
|
+
config.path = fileNameMatch[0];
|
|
234
|
+
}
|
|
235
|
+
_context7.next = 26;
|
|
236
|
+
return db.registerFileBuffer(config.path, new Uint8Array(buffer));
|
|
237
|
+
case 26:
|
|
238
|
+
_context7.next = 28;
|
|
239
|
+
return db.open(config);
|
|
240
|
+
case 28:
|
|
241
|
+
if (debug) {
|
|
242
|
+
(0, _perf.logElapsedTime)('DuckDB initialized', start);
|
|
243
|
+
if (config) {
|
|
244
|
+
console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2)));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return _context7.abrupt("return", db);
|
|
248
|
+
case 30:
|
|
249
|
+
case "end":
|
|
250
|
+
return _context7.stop();
|
|
251
|
+
}
|
|
252
|
+
}, _callee7);
|
|
253
|
+
}));
|
|
254
|
+
return function initializeDuckDbWasm(_x0, _x1) {
|
|
255
|
+
return _ref2.apply(this, arguments);
|
|
256
|
+
};
|
|
257
|
+
}();
|
|
258
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJDb25uZWN0aW9uIiwiY29ubmVjdGlvbiIsIl9jbGFzc0NhbGxDaGVjazIiLCJfZGVmaW5lUHJvcGVydHkyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiX3F1ZXJ5IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJzdGF0ZW1lbnQiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYWJydXB0IiwicXVlcnkiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsIl9pbnNlcnRBcnJvd1RhYmxlIiwiX2NhbGxlZTIiLCJhcnJvd1RhYmxlIiwicGFyYW1zIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiaW5zZXJ0QXJyb3dUYWJsZSIsIl94MiIsIl94MyIsIl9jbG9zZSIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY2xvc2UiLCJEdWNrREJXYXNtQWRhcHRlciIsImV4cG9ydHMiLCJvcHRpb25zIiwiUHJvbWlzZSIsIkFzeW5jRHVja0RCIiwiZHVja0RCIiwiX3JlZiIsIl9yZWYkZGVidWciLCJkZWJ1ZyIsImNvbmZpZyIsImluaXRpYWxpemVEdWNrRGJXYXNtIiwiX2Nvbm5lY3QiLCJfY2FsbGVlNCIsImRiIiwiYyIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInNlbnQiLCJjb25uZWN0IiwiX3JlZ2lzdGVyRmlsZVRleHQiLCJfY2FsbGVlNSIsImZpbGVuYW1lIiwiY29udGVudCIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsInJlZ2lzdGVyRmlsZVRleHQiLCJfeDQiLCJfeDUiLCJfcmVnaXN0ZXJGaWxlSGFuZGxlIiwiX2NhbGxlZTYiLCJuYW1lIiwiaGFuZGxlIiwicHJvdG9jb2wiLCJkaXJlY3RJTyIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsInJlZ2lzdGVyRmlsZUhhbmRsZSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9yZWYyIiwiX2NhbGxlZTciLCJzdGFydCIsIkpTREVMSVZSX0JVTkRMRVMiLCJidW5kbGUiLCJ3b3JrZXJfdXJsIiwid29ya2VyIiwibG9nZ2VyIiwicmVzIiwiYnVmZmVyIiwiZmlsZU5hbWVNYXRjaCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsInBlcmZvcm1hbmNlIiwibm93IiwiZ2V0SnNEZWxpdnJCdW5kbGVzIiwic2VsZWN0QnVuZGxlIiwibWFpbldvcmtlciIsIkVycm9yIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImNvbmNhdCIsInR5cGUiLCJXb3JrZXIiLCJDb25zb2xlTG9nZ2VyIiwiVm9pZExvZ2dlciIsImluc3RhbnRpYXRlIiwibWFpbk1vZHVsZSIsInB0aHJlYWRXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwYXRoIiwiZmV0Y2giLCJhcnJheUJ1ZmZlciIsIm1hdGNoIiwicmVnaXN0ZXJGaWxlQnVmZmVyIiwiVWludDhBcnJheSIsIm9wZW4iLCJsb2dFbGFwc2VkVGltZSIsImNvbnNvbGUiLCJKU09OIiwic3RyaW5naWZ5IiwiX3gwIiwiX3gxIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2R1Y2tkYi13YXNtLWFkYXB0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGR1Y2tkYiBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7QXN5bmNEdWNrREIsIER1Y2tEQkNvbmZpZywgQXN5bmNEdWNrREJDb25uZWN0aW9ufSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtEYXRhYmFzZUFkYXB0ZXIsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4uL3V0aWxzL3BlcmYnO1xuXG5jbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGF0YWJhc2VDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxhcnJvdy5UYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucXVlcnkoc3RhdGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsIHBhcmFtczoge25hbWU6IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cbn1cblxudHlwZSBEdWNrREJXYXNtQWRhcHRlclByb3BzID1cbiAgfCB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBjb25maWc/OiBEdWNrREJDb25maWc7XG4gICAgfVxuICB8IFByb21pc2U8QXN5bmNEdWNrREI+O1xuXG5leHBvcnQgY2xhc3MgRHVja0RCV2FzbUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFkYXB0ZXIge1xuICBwcml2YXRlIGR1Y2tEQjogUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRHVja0RCV2FzbUFkYXB0ZXJQcm9wcykge1xuICAgIC8vIHBhc3MgZXhpc3RpbmcgQXN5bmNEdWNrREIgb2JqZWN0IGNyZWF0ZWQgZWxzZXdoZXJlXG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiBBc3luY0R1Y2tEQikge1xuICAgICAgdGhpcy5kdWNrREIgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvciBjcmVhdGUgYSBuZXcgQXN5bmNEdWNrREIgb2JqZWN0XG4gICAgY29uc3Qge2RlYnVnID0gZmFsc2UsIGNvbmZpZ30gPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuZHVja0RCID0gaW5pdGlhbGl6ZUR1Y2tEYldhc20oY29uZmlnLCBkZWJ1Zyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oYyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVUZXh0KGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJGaWxlSGFuZGxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGU6IGFueSxcbiAgICBwcm90b2NvbDogZHVja2RiLkR1Y2tEQkRhdGFQcm90b2NvbCxcbiAgICBkaXJlY3RJTzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShuYW1lLCBoYW5kbGUsIHByb3RvY29sLCBkaXJlY3RJTyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIER1Y2tEQiB3aXRoIGEgYnJvd3Nlci1zcGVjaWZpYyBXYXNtIGJ1bmRsZS5cbiAqL1xuY29uc3QgaW5pdGlhbGl6ZUR1Y2tEYldhc20gPSBhc3luYyAoXG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZyxcbiAgZGVidWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFzeW5jRHVja0RCPiA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gU2VsZWN0IGEgYnVuZGxlIGJhc2VkIG9uIGJyb3dzZXIgY2hlY2tzXG4gIGNvbnN0IEpTREVMSVZSX0JVTkRMRVMgPSBkdWNrZGIuZ2V0SnNEZWxpdnJCdW5kbGVzKCk7XG4gIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGR1Y2tkYi5zZWxlY3RCdW5kbGUoSlNERUxJVlJfQlVORExFUyk7XG4gIGlmICghYnVuZGxlLm1haW5Xb3JrZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIER1Y2tEQicpO1xuICB9XG5cbiAgY29uc3Qgd29ya2VyX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgbmV3IEJsb2IoW2BpbXBvcnRTY3JpcHRzKFwiJHtidW5kbGUubWFpbldvcmtlcn1cIik7YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfSlcbiAgKTtcblxuICAvLyBJbnN0YW50aWF0ZSB0aGUgYXN5bmMgdmVyc2lvbiBvZiBEdWNrREItd2FzbVxuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlcl91cmwpO1xuICBjb25zdCBsb2dnZXIgPSBkZWJ1ZyA/IG5ldyBkdWNrZGIuQ29uc29sZUxvZ2dlcigpIDogbmV3IGR1Y2tkYi5Wb2lkTG9nZ2VyKCk7XG4gIGNvbnN0IGRiID0gbmV3IEFzeW5jRHVja0RCKGxvZ2dlciwgd29ya2VyKTtcbiAgYXdhaXQgZGIuaW5zdGFudGlhdGUoYnVuZGxlLm1haW5Nb2R1bGUsIGJ1bmRsZS5wdGhyZWFkV29ya2VyKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJfdXJsKTtcblxuICBpZiAoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5wYXRoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjb25maWcucGF0aCk7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb25maWcucGF0aC5tYXRjaCgvW14vXSokLyk7XG4gICAgICBpZiAoZmlsZU5hbWVNYXRjaCkge1xuICAgICAgICBjb25maWcucGF0aCA9IGZpbGVOYW1lTWF0Y2hbMF07XG4gICAgICB9XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVCdWZmZXIoY29uZmlnLnBhdGgsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cbiAgICBhd2FpdCBkYi5vcGVuKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoZGVidWcpIHtcbiAgICBsb2dFbGFwc2VkVGltZSgnRHVja0RCIGluaXRpYWxpemVkJywgc3RhcnQpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYER1Y2tEYkNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsV0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FB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
|
|
@@ -57,4 +57,4 @@ var _schemaPanel = require("./schema-panel");
|
|
|
57
57
|
var _previewDataPanel = require("./preview-data-panel");
|
|
58
58
|
var _tree = require("./tree");
|
|
59
59
|
var _monacoEditor = _interopRequireDefault(require("./monaco-editor"));
|
|
60
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3FsUGFuZWwiLCJyZXF1aXJlIiwiX3NjaGVtYVBhbmVsIiwiX3ByZXZpZXdEYXRhUGFuZWwiLCJfdHJlZSIsIl9tb25hY29FZGl0b3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmV4cG9ydCB7U3FsUGFuZWx9IGZyb20gJy4vc3FsLXBhbmVsJztcbmV4cG9ydCB7U2NoZW1hUGFuZWwsIFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2V9IGZyb20gJy4vc2NoZW1hLXBhbmVsJztcbmV4cG9ydCB7UHJldmlld0RhdGFQYW5lbH0gZnJvbSAnLi9wcmV2aWV3LWRhdGEtcGFuZWwnO1xuZXhwb3J0IHtUcmVlLCBEYXRhc2V0Tm9kZSwgQ29sdW1uTm9kZX0gZnJvbSAnLi90cmVlJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBNb25hY29FZGl0b3J9IGZyb20gJy4vbW9uYWNvLWVkaXRvcic7XG5cbmV4cG9ydCB0eXBlIHtTY2hlbWFTdWdnZXN0aW9ufSBmcm9tICcuL3NjaGVtYS1wYW5lbCc7XG5leHBvcnQgdHlwZSB7UHJldmlld0RhdGFQYW5lbFByb3BzLCBRdWVyeVJlc3VsdCwgRGF0YVRhYmxlU3R5bGV9IGZyb20gJy4vcHJldmlldy1kYXRhLXBhbmVsJztcbmV4cG9ydCB0eXBlIHtUcmVlTm9kZURhdGEsIFRyZWVOb2RlUHJvcHMsIFRyZWVQcm9wc30gZnJvbSAnLi90cmVlJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _react2 = _interopRequireDefault(require("@monaco-editor/react"));
|
|
13
|
+
var monaco = _interopRequireWildcard(require("monaco-editor"));
|
|
14
|
+
var _uniq = _interopRequireDefault(require("es-toolkit/compat/uniq"));
|
|
15
|
+
var _uniqBy = _interopRequireDefault(require("es-toolkit/compat/uniqBy"));
|
|
16
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
17
|
+
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; }
|
|
18
|
+
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) { (0, _defineProperty2["default"])(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; } // SPDX-License-Identifier: MIT
|
|
19
|
+
// Copyright contributors to the kepler.gl project
|
|
20
|
+
// import {tableSchema as DEFAULT_SCHEMA} from './table-schema';
|
|
21
|
+
var MONACO_OPTIONS = {
|
|
22
|
+
minimap: {
|
|
23
|
+
enabled: false
|
|
24
|
+
},
|
|
25
|
+
language: 'sql',
|
|
26
|
+
contextmenu: false,
|
|
27
|
+
renderLineHighlight: 'none',
|
|
28
|
+
scrollBeyondLastLine: false,
|
|
29
|
+
scrollbar: {
|
|
30
|
+
alwaysConsumeMouseWheel: false
|
|
31
|
+
},
|
|
32
|
+
overviewRulerLanes: 0,
|
|
33
|
+
automaticLayout: true,
|
|
34
|
+
acceptSuggestionOnEnter: 'on',
|
|
35
|
+
quickSuggestionsDelay: 400,
|
|
36
|
+
matchOnWordStartOnly: false,
|
|
37
|
+
tabCompletion: 'off',
|
|
38
|
+
lineNumbers: 'off'
|
|
39
|
+
};
|
|
40
|
+
function parseSqlAndFindTableNameAndAliases(sql) {
|
|
41
|
+
var regex = /\b(?:FROM|JOIN)\s+([^\s.]+(?:\.[^\s.]+)?)\s*(?:AS)?\s*([^\s,]+)?/gi;
|
|
42
|
+
var tables = [];
|
|
43
|
+
while (true) {
|
|
44
|
+
var match = regex.exec(sql);
|
|
45
|
+
if (!match) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
var table_name = match[1];
|
|
49
|
+
if (!/\(/.test(table_name)) {
|
|
50
|
+
// exclude function calls
|
|
51
|
+
var alias = match[2];
|
|
52
|
+
if (alias && /on|where|inner|left|right|join/.test(alias)) {
|
|
53
|
+
alias = null;
|
|
54
|
+
}
|
|
55
|
+
tables.push({
|
|
56
|
+
table_name: table_name,
|
|
57
|
+
alias: alias || table_name
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return tables;
|
|
62
|
+
}
|
|
63
|
+
var MonacoEditor = function MonacoEditor(_ref) {
|
|
64
|
+
var onRunQuery = _ref.onRunQuery,
|
|
65
|
+
onChange = _ref.onChange,
|
|
66
|
+
code = _ref.code,
|
|
67
|
+
tableSchema = _ref.tableSchema,
|
|
68
|
+
isReadOnly = _ref.isReadOnly;
|
|
69
|
+
// private editor?: monaco.editor.IStandaloneCodeEditor;
|
|
70
|
+
var schemaTableNames = (0, _react.useMemo)(function () {
|
|
71
|
+
return tableSchema ? (0, _uniq["default"])(tableSchema.map(function (d) {
|
|
72
|
+
return d.table_name;
|
|
73
|
+
})) : [];
|
|
74
|
+
}, [tableSchema]);
|
|
75
|
+
var schemaTableNamesSet = (0, _react.useMemo)(function () {
|
|
76
|
+
return new Set(schemaTableNames);
|
|
77
|
+
}, [schemaTableNames]);
|
|
78
|
+
var handleRunQueryRef = (0, _react.useRef)(onRunQuery);
|
|
79
|
+
handleRunQueryRef.current = onRunQuery;
|
|
80
|
+
var handleEditorDidMount = (0, _react.useCallback)(function (editor) {
|
|
81
|
+
// this.editor = editor;
|
|
82
|
+
editor.focus();
|
|
83
|
+
editor.addAction({
|
|
84
|
+
id: 'run-query',
|
|
85
|
+
label: 'Run Query',
|
|
86
|
+
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, monaco.KeyMod.Shift | monaco.KeyCode.Enter],
|
|
87
|
+
contextMenuGroupId: 'custom',
|
|
88
|
+
contextMenuOrder: 0,
|
|
89
|
+
run: function run() {
|
|
90
|
+
return handleRunQueryRef.current();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
monaco.languages.registerCompletionItemProvider('*', {
|
|
94
|
+
provideCompletionItems: function provideCompletionItems(model, position, _context, _cancelationToken) {
|
|
95
|
+
var _thisLine$trim$split$, _exec, _exec2;
|
|
96
|
+
var suggestions = [{
|
|
97
|
+
label: 'myCustomSnippet',
|
|
98
|
+
kind: monaco.languages.CompletionItemKind.Snippet,
|
|
99
|
+
insertText: 'This is a piece of custom code',
|
|
100
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
101
|
+
documentation: 'This is a piece of custom code'
|
|
102
|
+
// TODO: range is missing
|
|
103
|
+
}];
|
|
104
|
+
var fullQueryText = model.getValue();
|
|
105
|
+
var tableNamesAndAliases = new Map(parseSqlAndFindTableNameAndAliases(fullQueryText).map(function (_ref2) {
|
|
106
|
+
var table_name = _ref2.table_name,
|
|
107
|
+
alias = _ref2.alias;
|
|
108
|
+
return [alias, table_name];
|
|
109
|
+
}));
|
|
110
|
+
var thisLine = model.getValueInRange({
|
|
111
|
+
startLineNumber: position.lineNumber,
|
|
112
|
+
startColumn: 1,
|
|
113
|
+
endLineNumber: position.lineNumber,
|
|
114
|
+
endColumn: position.column
|
|
115
|
+
});
|
|
116
|
+
var thisToken = ((_thisLine$trim$split$ = thisLine.trim().split(' ').slice(-1)) === null || _thisLine$trim$split$ === void 0 ? void 0 : _thisLine$trim$split$[0]) || '';
|
|
117
|
+
var lastTokenBeforeSpace = (_exec = /\s?(\w+)\s+\w+$/.exec(thisLine.trim())) === null || _exec === void 0 ? void 0 : _exec[1];
|
|
118
|
+
var lastTokenBeforeDot = (_exec2 = /(\w+)\.\w*$/.exec(thisToken)) === null || _exec2 === void 0 ? void 0 : _exec2[1];
|
|
119
|
+
|
|
120
|
+
// console.log(tableNamesAndAliases, thisToken, lastTokenBeforeSpace, lastTokenBeforeDot);
|
|
121
|
+
|
|
122
|
+
if (lastTokenBeforeSpace && /from|join|update|into/.test(lastTokenBeforeSpace)) {
|
|
123
|
+
suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(schemaTableNames.map(function (table_name) {
|
|
124
|
+
return {
|
|
125
|
+
label: table_name,
|
|
126
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
127
|
+
insertText: table_name
|
|
128
|
+
// TODO: range is missing
|
|
129
|
+
};
|
|
130
|
+
})));
|
|
131
|
+
}
|
|
132
|
+
if (lastTokenBeforeDot) {
|
|
133
|
+
var table_name = null;
|
|
134
|
+
if (schemaTableNamesSet.has(lastTokenBeforeDot)) {
|
|
135
|
+
table_name = lastTokenBeforeDot;
|
|
136
|
+
} else if (tableNamesAndAliases.get(lastTokenBeforeDot)) {
|
|
137
|
+
table_name = tableNamesAndAliases.get(lastTokenBeforeDot);
|
|
138
|
+
}
|
|
139
|
+
if (table_name && tableSchema) {
|
|
140
|
+
suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(tableSchema.filter(function (d) {
|
|
141
|
+
return d.table_name === table_name;
|
|
142
|
+
}).map(function (_ref3) {
|
|
143
|
+
var column_name = _ref3.column_name;
|
|
144
|
+
return {
|
|
145
|
+
label: column_name,
|
|
146
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
147
|
+
insertText: column_name
|
|
148
|
+
// TODO: range is missing
|
|
149
|
+
};
|
|
150
|
+
})));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
suggestions: (0, _uniqBy["default"])(suggestions, function (s) {
|
|
155
|
+
return s.insertText;
|
|
156
|
+
})
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}, [tableSchema, schemaTableNames, schemaTableNamesSet]);
|
|
161
|
+
return /*#__PURE__*/_react["default"].createElement(_react2["default"], {
|
|
162
|
+
height: "100%",
|
|
163
|
+
theme: "vs-dark",
|
|
164
|
+
defaultLanguage: "sql",
|
|
165
|
+
defaultValue: code,
|
|
166
|
+
onChange: onChange,
|
|
167
|
+
onMount: handleEditorDidMount,
|
|
168
|
+
options: _objectSpread(_objectSpread({}, MONACO_OPTIONS), {}, {
|
|
169
|
+
readOnly: isReadOnly
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
var _default = exports["default"] = MonacoEditor;
|
|
174
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl91bmlxIiwiX3VuaXFCeSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJNb25hY29FZGl0b3IiLCJfcmVmIiwib25SdW5RdWVyeSIsIm9uQ2hhbmdlIiwiY29kZSIsInRhYmxlU2NoZW1hIiwiaXNSZWFkT25seSIsInNjaGVtYVRhYmxlTmFtZXMiLCJ1c2VNZW1vIiwidW5pcSIsIm1hcCIsImQiLCJzY2hlbWFUYWJsZU5hbWVzU2V0IiwiU2V0IiwiaGFuZGxlUnVuUXVlcnlSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwiaGFuZGxlRWRpdG9yRGlkTW91bnQiLCJ1c2VDYWxsYmFjayIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIkZpZWxkIiwiX3JlZjMiLCJjb2x1bW5fbmFtZSIsInVuaXFCeSIsInMiLCJjcmVhdGVFbGVtZW50IiwiaGVpZ2h0IiwidGhlbWUiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJkZWZhdWx0VmFsdWUiLCJvbk1vdW50Iiwib3B0aW9ucyIsInJlYWRPbmx5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9uYWNvLWVkaXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVkaXRvciwge09uQ2hhbmdlLCBPbk1vdW50fSBmcm9tICdAbW9uYWNvLWVkaXRvci9yZWFjdCc7XG5pbXBvcnQgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG4vLyBpbXBvcnQge3RhYmxlU2NoZW1hIGFzIERFRkFVTFRfU0NIRU1BfSBmcm9tICcuL3RhYmxlLXNjaGVtYSc7XG5pbXBvcnQgdW5pcSBmcm9tICdlcy10b29sa2l0L2NvbXBhdC91bmlxJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnZXMtdG9vbGtpdC9jb21wYXQvdW5pcUJ5JztcblxuY29uc3QgTU9OQUNPX09QVElPTlM6IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBtaW5pbWFwOiB7ZW5hYmxlZDogZmFsc2V9LFxuICBsYW5ndWFnZTogJ3NxbCcsXG4gIGNvbnRleHRtZW51OiBmYWxzZSxcbiAgcmVuZGVyTGluZUhpZ2hsaWdodDogJ25vbmUnLFxuICBzY3JvbGxCZXlvbmRMYXN0TGluZTogZmFsc2UsXG4gIHNjcm9sbGJhcjoge2Fsd2F5c0NvbnN1bWVNb3VzZVdoZWVsOiBmYWxzZX0sXG4gIG92ZXJ2aWV3UnVsZXJMYW5lczogMCxcbiAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxuICBhY2NlcHRTdWdnZXN0aW9uT25FbnRlcjogJ29uJyxcbiAgcXVpY2tTdWdnZXN0aW9uc0RlbGF5OiA0MDAsXG4gIG1hdGNoT25Xb3JkU3RhcnRPbmx5OiBmYWxzZSxcbiAgdGFiQ29tcGxldGlvbjogJ29mZicsXG4gIGxpbmVOdW1iZXJzOiAnb2ZmJ1xufTtcblxuZnVuY3Rpb24gcGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyhzcWw6IHN0cmluZykge1xuICBjb25zdCByZWdleCA9IC9cXGIoPzpGUk9NfEpPSU4pXFxzKyhbXlxccy5dKyg/OlxcLlteXFxzLl0rKT8pXFxzKig/OkFTKT9cXHMqKFteXFxzLF0rKT8vZ2k7XG4gIGNvbnN0IHRhYmxlczoge3RhYmxlX25hbWU6IHN0cmluZzsgYWxpYXM6IHN0cmluZ31bXSA9IFtdO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHNxbCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlX25hbWUgPSBtYXRjaFsxXTtcbiAgICBpZiAoIS9cXCgvLnRlc3QodGFibGVfbmFtZSkpIHtcbiAgICAgIC8vIGV4Y2x1ZGUgZnVuY3Rpb24gY2FsbHNcbiAgICAgIGxldCBhbGlhcyA9IG1hdGNoWzJdIGFzIHN0cmluZyB8IG51bGw7XG4gICAgICBpZiAoYWxpYXMgJiYgL29ufHdoZXJlfGlubmVyfGxlZnR8cmlnaHR8am9pbi8udGVzdChhbGlhcykpIHtcbiAgICAgICAgYWxpYXMgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGFibGVzLnB1c2goe1xuICAgICAgICB0YWJsZV9uYW1lLFxuICAgICAgICBhbGlhczogYWxpYXMgfHwgdGFibGVfbmFtZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhYmxlcztcbn1cblxuaW50ZXJmYWNlIE1vbmFjb0VkaXRvclByb3BzIHtcbiAgY29kZTogc3RyaW5nO1xuICBpc1JlYWRPbmx5PzogYm9vbGVhbjtcbiAgb25DaGFuZ2U6IE9uQ2hhbmdlO1xuICBvblJ1blF1ZXJ5OiAoKSA9PiB2b2lkO1xuICB0YWJsZVNjaGVtYT86IHt0YWJsZV9uYW1lOiBzdHJpbmc7IGNvbHVtbl9uYW1lOiBzdHJpbmd9W107XG59XG5cbmNvbnN0IE1vbmFjb0VkaXRvcjogUmVhY3QuRkM8TW9uYWNvRWRpdG9yUHJvcHM+ID0gKHtcbiAgb25SdW5RdWVyeSxcbiAgb25DaGFuZ2UsXG4gIGNvZGUsXG4gIHRhYmxlU2NoZW1hLFxuICBpc1JlYWRPbmx5XG59KSA9PiB7XG4gIC8vIHByaXZhdGUgZWRpdG9yPzogbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XG4gIGNvbnN0IHNjaGVtYVRhYmxlTmFtZXMgPSB1c2VNZW1vKFxuICAgICgpID0+ICh0YWJsZVNjaGVtYSA/IHVuaXEodGFibGVTY2hlbWEubWFwKGQgPT4gZC50YWJsZV9uYW1lKSkgOiBbXSksXG4gICAgW3RhYmxlU2NoZW1hXVxuICApO1xuICBjb25zdCBzY2hlbWFUYWJsZU5hbWVzU2V0ID0gdXNlTWVtbygoKSA9PiBuZXcgU2V0KHNjaGVtYVRhYmxlTmFtZXMpLCBbc2NoZW1hVGFibGVOYW1lc10pO1xuICBjb25zdCBoYW5kbGVSdW5RdWVyeVJlZiA9IHVzZVJlZihvblJ1blF1ZXJ5KTtcbiAgaGFuZGxlUnVuUXVlcnlSZWYuY3VycmVudCA9IG9uUnVuUXVlcnk7XG5cbiAgY29uc3QgaGFuZGxlRWRpdG9yRGlkTW91bnQ6IE9uTW91bnQgPSB1c2VDYWxsYmFjayhcbiAgICBlZGl0b3IgPT4ge1xuICAgICAgLy8gdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICBlZGl0b3IuZm9jdXMoKTtcblxuICAgICAgZWRpdG9yLmFkZEFjdGlvbih7XG4gICAgICAgIGlkOiAncnVuLXF1ZXJ5JyxcbiAgICAgICAgbGFiZWw6ICdSdW4gUXVlcnknLFxuICAgICAgICBrZXliaW5kaW5nczogW1xuICAgICAgICAgIG1vbmFjby5LZXlNb2QuQ3RybENtZCB8IG1vbmFjby5LZXlDb2RlLkVudGVyLFxuICAgICAgICAgIG1vbmFjby5LZXlNb2QuU2hpZnQgfCBtb25hY28uS2V5Q29kZS5FbnRlclxuICAgICAgICBdLFxuICAgICAgICBjb250ZXh0TWVudUdyb3VwSWQ6ICdjdXN0b20nLFxuICAgICAgICBjb250ZXh0TWVudU9yZGVyOiAwLFxuICAgICAgICBydW46ICgpID0+IGhhbmRsZVJ1blF1ZXJ5UmVmLmN1cnJlbnQoKVxuICAgICAgfSk7XG5cbiAgICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCcqJywge1xuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiAobW9kZWwsIHBvc2l0aW9uLCBfY29udGV4dCwgX2NhbmNlbGF0aW9uVG9rZW4pID0+IHtcbiAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uczogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ215Q3VzdG9tU25pcHBldCcsXG4gICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQsXG4gICAgICAgICAgICAgIGluc2VydFRleHQ6ICdUaGlzIGlzIGEgcGllY2Ugb2YgY3VzdG9tIGNvZGUnLFxuICAgICAgICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXQsXG4gICAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICdUaGlzIGlzIGEgcGllY2Ugb2YgY3VzdG9tIGNvZGUnXG4gICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbVxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBjb25zdCBmdWxsUXVlcnlUZXh0ID0gbW9kZWwuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXNBbmRBbGlhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oXG4gICAgICAgICAgICBwYXJzZVNxbEFuZEZpbmRUYWJsZU5hbWVBbmRBbGlhc2VzKGZ1bGxRdWVyeVRleHQpLm1hcCgoe3RhYmxlX25hbWUsIGFsaWFzfSkgPT4gW1xuICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgdGFibGVfbmFtZVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgdGhpc0xpbmUgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2Uoe1xuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46IDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiBwb3NpdGlvbi5jb2x1bW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCB0aGlzVG9rZW4gPSB0aGlzTGluZS50cmltKCkuc3BsaXQoJyAnKS5zbGljZSgtMSk/LlswXSB8fCAnJztcblxuICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbkJlZm9yZVNwYWNlID0gL1xccz8oXFx3KylcXHMrXFx3KyQvLmV4ZWModGhpc0xpbmUudHJpbSgpKT8uWzFdO1xuICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbkJlZm9yZURvdCA9IC8oXFx3KylcXC5cXHcqJC8uZXhlYyh0aGlzVG9rZW4pPy5bMV07XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0YWJsZU5hbWVzQW5kQWxpYXNlcywgdGhpc1Rva2VuLCBsYXN0VG9rZW5CZWZvcmVTcGFjZSwgbGFzdFRva2VuQmVmb3JlRG90KTtcblxuICAgICAgICAgIGlmIChsYXN0VG9rZW5CZWZvcmVTcGFjZSAmJiAvZnJvbXxqb2lufHVwZGF0ZXxpbnRvLy50ZXN0KGxhc3RUb2tlbkJlZm9yZVNwYWNlKSkge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgLi4uc2NoZW1hVGFibGVOYW1lcy5tYXAoXG4gICAgICAgICAgICAgICAgdGFibGVfbmFtZSA9PlxuICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhYmxlX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiB0YWJsZV9uYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGFzdFRva2VuQmVmb3JlRG90KSB7XG4gICAgICAgICAgICBsZXQgdGFibGVfbmFtZSA9IG51bGwgYXMgc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgIGlmIChzY2hlbWFUYWJsZU5hbWVzU2V0LmhhcyhsYXN0VG9rZW5CZWZvcmVEb3QpKSB7XG4gICAgICAgICAgICAgIHRhYmxlX25hbWUgPSBsYXN0VG9rZW5CZWZvcmVEb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhYmxlTmFtZXNBbmRBbGlhc2VzLmdldChsYXN0VG9rZW5CZWZvcmVEb3QpKSB7XG4gICAgICAgICAgICAgIHRhYmxlX25hbWUgPSB0YWJsZU5hbWVzQW5kQWxpYXNlcy5nZXQobGFzdFRva2VuQmVmb3JlRG90KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGVfbmFtZSAmJiB0YWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLnRhYmxlU2NoZW1hXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC50YWJsZV9uYW1lID09PSB0YWJsZV9uYW1lKVxuICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHtjb2x1bW5fbmFtZX0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2x1bW5fbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogY29sdW1uX25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiB1bmlxQnkoc3VnZ2VzdGlvbnMsIHMgPT4gcy5pbnNlcnRUZXh0KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3RhYmxlU2NoZW1hLCBzY2hlbWFUYWJsZU5hbWVzLCBzY2hlbWFUYWJsZU5hbWVzU2V0XVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEVkaXRvclxuICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICB0aGVtZT1cInZzLWRhcmtcIlxuICAgICAgZGVmYXVsdExhbmd1YWdlPVwic3FsXCJcbiAgICAgIGRlZmF1bHRWYWx1ZT17Y29kZX1cbiAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgIG9uTW91bnQ9e2hhbmRsZUVkaXRvckRpZE1vdW50fVxuICAgICAgb3B0aW9ucz17e1xuICAgICAgICAuLi5NT05BQ09fT1BUSU9OUyxcbiAgICAgICAgcmVhZE9ubHk6IGlzUmVhZE9ubHlcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1vbmFjb0VkaXRvcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUE4QyxTQUFBRCx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVQsdUJBQUEsWUFBQUEsd0JBQUFPLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxtQkFBQVQsQ0FBQSxpQkFBQUEsQ0FBQSxnQkFBQVUsT0FBQSxDQUFBVixDQUFBLDBCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdB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
|