@kepler.gl/duckdb 3.3.0-alpha.5 → 3.3.0-alpha.6
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 +668 -0
- package/dist/cjs/table/duckdb-table.js +479 -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 +644 -0
- package/dist/esm/table/duckdb-table.js +474 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/utils/perf.js +40 -0
- package/package.json +21 -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,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("lodash/uniq"));
|
|
15
|
+
var _uniqBy = _interopRequireDefault(require("lodash/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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl91bmlxIiwiX3VuaXFCeSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJNb25hY29FZGl0b3IiLCJfcmVmIiwib25SdW5RdWVyeSIsIm9uQ2hhbmdlIiwiY29kZSIsInRhYmxlU2NoZW1hIiwiaXNSZWFkT25seSIsInNjaGVtYVRhYmxlTmFtZXMiLCJ1c2VNZW1vIiwidW5pcSIsIm1hcCIsImQiLCJzY2hlbWFUYWJsZU5hbWVzU2V0IiwiU2V0IiwiaGFuZGxlUnVuUXVlcnlSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwiaGFuZGxlRWRpdG9yRGlkTW91bnQiLCJ1c2VDYWxsYmFjayIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIkZpZWxkIiwiX3JlZjMiLCJjb2x1bW5fbmFtZSIsInVuaXFCeSIsInMiLCJjcmVhdGVFbGVtZW50IiwiaGVpZ2h0IiwidGhlbWUiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJkZWZhdWx0VmFsdWUiLCJvbk1vdW50Iiwib3B0aW9ucyIsInJlYWRPbmx5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9uYWNvLWVkaXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVkaXRvciwge09uQ2hhbmdlLCBPbk1vdW50fSBmcm9tICdAbW9uYWNvLWVkaXRvci9yZWFjdCc7XG5pbXBvcnQgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG4vLyBpbXBvcnQge3RhYmxlU2NoZW1hIGFzIERFRkFVTFRfU0NIRU1BfSBmcm9tICcuL3RhYmxlLXNjaGVtYSc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC91bmlxQnknO1xuXG5jb25zdCBNT05BQ09fT1BUSU9OUzogbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIG1pbmltYXA6IHtlbmFibGVkOiBmYWxzZX0sXG4gIGxhbmd1YWdlOiAnc3FsJyxcbiAgY29udGV4dG1lbnU6IGZhbHNlLFxuICByZW5kZXJMaW5lSGlnaGxpZ2h0OiAnbm9uZScsXG4gIHNjcm9sbEJleW9uZExhc3RMaW5lOiBmYWxzZSxcbiAgc2Nyb2xsYmFyOiB7YWx3YXlzQ29uc3VtZU1vdXNlV2hlZWw6IGZhbHNlfSxcbiAgb3ZlcnZpZXdSdWxlckxhbmVzOiAwLFxuICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsXG4gIGFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyOiAnb24nLFxuICBxdWlja1N1Z2dlc3Rpb25zRGVsYXk6IDQwMCxcbiAgbWF0Y2hPbldvcmRTdGFydE9ubHk6IGZhbHNlLFxuICB0YWJDb21wbGV0aW9uOiAnb2ZmJyxcbiAgbGluZU51bWJlcnM6ICdvZmYnXG59O1xuXG5mdW5jdGlvbiBwYXJzZVNxbEFuZEZpbmRUYWJsZU5hbWVBbmRBbGlhc2VzKHNxbDogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcYig/OkZST018Sk9JTilcXHMrKFteXFxzLl0rKD86XFwuW15cXHMuXSspPylcXHMqKD86QVMpP1xccyooW15cXHMsXSspPy9naTtcbiAgY29uc3QgdGFibGVzOiB7dGFibGVfbmFtZTogc3RyaW5nOyBhbGlhczogc3RyaW5nfVtdID0gW107XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3FsKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgdGFibGVfbmFtZSA9IG1hdGNoWzFdO1xuICAgIGlmICghL1xcKC8udGVzdCh0YWJsZV9uYW1lKSkge1xuICAgICAgLy8gZXhjbHVkZSBmdW5jdGlvbiBjYWxsc1xuICAgICAgbGV0IGFsaWFzID0gbWF0Y2hbMl0gYXMgc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlmIChhbGlhcyAmJiAvb258d2hlcmV8aW5uZXJ8bGVmdHxyaWdodHxqb2luLy50ZXN0KGFsaWFzKSkge1xuICAgICAgICBhbGlhcyA9IG51bGw7XG4gICAgICB9XG4gICAgICB0YWJsZXMucHVzaCh7XG4gICAgICAgIHRhYmxlX25hbWUsXG4gICAgICAgIGFsaWFzOiBhbGlhcyB8fCB0YWJsZV9uYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFibGVzO1xufVxuXG5pbnRlcmZhY2UgTW9uYWNvRWRpdG9yUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICBvbkNoYW5nZTogT25DaGFuZ2U7XG4gIG9uUnVuUXVlcnk6ICgpID0+IHZvaWQ7XG4gIHRhYmxlU2NoZW1hPzoge3RhYmxlX25hbWU6IHN0cmluZzsgY29sdW1uX25hbWU6IHN0cmluZ31bXTtcbn1cblxuY29uc3QgTW9uYWNvRWRpdG9yOiBSZWFjdC5GQzxNb25hY29FZGl0b3JQcm9wcz4gPSAoe1xuICBvblJ1blF1ZXJ5LFxuICBvbkNoYW5nZSxcbiAgY29kZSxcbiAgdGFibGVTY2hlbWEsXG4gIGlzUmVhZE9ubHlcbn0pID0+IHtcbiAgLy8gcHJpdmF0ZSBlZGl0b3I/OiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcjtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHRhYmxlU2NoZW1hID8gdW5pcSh0YWJsZVNjaGVtYS5tYXAoZCA9PiBkLnRhYmxlX25hbWUpKSA6IFtdKSxcbiAgICBbdGFibGVTY2hlbWFdXG4gICk7XG4gIGNvbnN0IHNjaGVtYVRhYmxlTmFtZXNTZXQgPSB1c2VNZW1vKCgpID0+IG5ldyBTZXQoc2NoZW1hVGFibGVOYW1lcyksIFtzY2hlbWFUYWJsZU5hbWVzXSk7XG4gIGNvbnN0IGhhbmRsZVJ1blF1ZXJ5UmVmID0gdXNlUmVmKG9uUnVuUXVlcnkpO1xuICBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50ID0gb25SdW5RdWVyeTtcblxuICBjb25zdCBoYW5kbGVFZGl0b3JEaWRNb3VudDogT25Nb3VudCA9IHVzZUNhbGxiYWNrKFxuICAgIGVkaXRvciA9PiB7XG4gICAgICAvLyB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgIGVkaXRvci5mb2N1cygpO1xuXG4gICAgICBlZGl0b3IuYWRkQWN0aW9uKHtcbiAgICAgICAgaWQ6ICdydW4tcXVlcnknLFxuICAgICAgICBsYWJlbDogJ1J1biBRdWVyeScsXG4gICAgICAgIGtleWJpbmRpbmdzOiBbXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5DdHJsQ21kIHwgbW9uYWNvLktleUNvZGUuRW50ZXIsXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5TaGlmdCB8IG1vbmFjby5LZXlDb2RlLkVudGVyXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRleHRNZW51R3JvdXBJZDogJ2N1c3RvbScsXG4gICAgICAgIGNvbnRleHRNZW51T3JkZXI6IDAsXG4gICAgICAgIHJ1bjogKCkgPT4gaGFuZGxlUnVuUXVlcnlSZWYuY3VycmVudCgpXG4gICAgICB9KTtcblxuICAgICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJyonLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24sIF9jb250ZXh0LCBfY2FuY2VsYXRpb25Ub2tlbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnbXlDdXN0b21TbmlwcGV0JyxcbiAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZScsXG4gICAgICAgICAgICAgIGluc2VydFRleHRSdWxlczogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldCxcbiAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZSdcbiAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGNvbnN0IGZ1bGxRdWVyeVRleHQgPSBtb2RlbC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lc0FuZEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihcbiAgICAgICAgICAgIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoZnVsbFF1ZXJ5VGV4dCkubWFwKCh7dGFibGVfbmFtZSwgYWxpYXN9KSA9PiBbXG4gICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICB0YWJsZV9uYW1lXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCB0aGlzTGluZSA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZSh7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBlbmRDb2x1bW46IHBvc2l0aW9uLmNvbHVtblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHRoaXNUb2tlbiA9IHRoaXNMaW5lLnRyaW0oKS5zcGxpdCgnICcpLnNsaWNlKC0xKT8uWzBdIHx8ICcnO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlU3BhY2UgPSAvXFxzPyhcXHcrKVxccytcXHcrJC8uZXhlYyh0aGlzTGluZS50cmltKCkpPy5bMV07XG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlRG90ID0gLyhcXHcrKVxcLlxcdyokLy5leGVjKHRoaXNUb2tlbik/LlsxXTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRhYmxlTmFtZXNBbmRBbGlhc2VzLCB0aGlzVG9rZW4sIGxhc3RUb2tlbkJlZm9yZVNwYWNlLCBsYXN0VG9rZW5CZWZvcmVEb3QpO1xuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZVNwYWNlICYmIC9mcm9tfGpvaW58dXBkYXRlfGludG8vLnRlc3QobGFzdFRva2VuQmVmb3JlU3BhY2UpKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAuLi5zY2hlbWFUYWJsZU5hbWVzLm1hcChcbiAgICAgICAgICAgICAgICB0YWJsZV9uYW1lID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFibGVfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IHRhYmxlX25hbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYXN0VG9rZW5CZWZvcmVEb3QpIHtcbiAgICAgICAgICAgIGxldCB0YWJsZV9uYW1lID0gbnVsbCBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgICAgaWYgKHNjaGVtYVRhYmxlTmFtZXNTZXQuaGFzKGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IGxhc3RUb2tlbkJlZm9yZURvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IHRhYmxlTmFtZXNBbmRBbGlhc2VzLmdldChsYXN0VG9rZW5CZWZvcmVEb3QpIGFzIHN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YWJsZV9uYW1lICYmIHRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGFibGVTY2hlbWFcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLnRhYmxlX25hbWUgPT09IHRhYmxlX25hbWUpXG4gICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoe2NvbHVtbl9uYW1lfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbHVtbl9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBjb2x1bW5fbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IHVuaXFCeShzdWdnZXN0aW9ucywgcyA9PiBzLmluc2VydFRleHQpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdGFibGVTY2hlbWEsIHNjaGVtYVRhYmxlTmFtZXMsIHNjaGVtYVRhYmxlTmFtZXNTZXRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RWRpdG9yXG4gICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgIHRoZW1lPVwidnMtZGFya1wiXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U9XCJzcWxcIlxuICAgICAgZGVmYXVsdFZhbHVlPXtjb2RlfVxuICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgb25Nb3VudD17aGFuZGxlRWRpdG9yRGlkTW91bnR9XG4gICAgICBvcHRpb25zPXt7XG4gICAgICAgIC4uLk1PTkFDT19PUFRJT05TLFxuICAgICAgICByZWFkT25seTogaXNSZWFkT25seVxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9uYWNvRWRpdG9yO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksS0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQW1DLFNBQUFELHdCQUFBTyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBVCx1QkFBQSxZQUFBQSx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLG1CQUFBVCxDQUFBLGlCQUFBQSxDQUFBLGdCQUFBVSxPQUFBLENBQUFWLENBQUEsMEJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENB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
|