@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.
Files changed (40) hide show
  1. package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
  2. package/dist/{components → cjs/components}/index.js +1 -1
  3. package/dist/cjs/components/monaco-editor.js +174 -0
  4. package/dist/cjs/components/preview-data-panel.js +127 -0
  5. package/dist/cjs/components/schema-panel.js +170 -0
  6. package/dist/cjs/components/sql-panel.js +395 -0
  7. package/dist/cjs/components/tree.js +90 -0
  8. package/dist/{index.js → cjs/index.js} +1 -1
  9. package/dist/{plugin.js → cjs/plugin.js} +2 -2
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +670 -0
  12. package/dist/cjs/table/duckdb-table.js +482 -0
  13. package/dist/{table → cjs/table}/index.js +1 -1
  14. package/dist/cjs/utils/perf.js +46 -0
  15. package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
  16. package/dist/esm/components/index.js +9 -0
  17. package/dist/esm/components/monaco-editor.js +167 -0
  18. package/dist/esm/components/preview-data-panel.js +120 -0
  19. package/dist/esm/components/schema-panel.js +164 -0
  20. package/dist/esm/components/sql-panel.js +388 -0
  21. package/dist/esm/components/tree.js +82 -0
  22. package/dist/esm/index.js +9 -0
  23. package/dist/esm/plugin.js +22 -0
  24. package/dist/esm/processors/data-processor.js +342 -0
  25. package/dist/esm/table/duckdb-table-utils.js +645 -0
  26. package/dist/esm/table/duckdb-table.js +477 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/dist/table/duckdb-table-utils.d.ts +7 -0
  30. package/package.json +28 -24
  31. package/dist/adapters/duckdb-wasm-adapter.js +0 -259
  32. package/dist/components/monaco-editor.js +0 -175
  33. package/dist/components/preview-data-panel.js +0 -128
  34. package/dist/components/schema-panel.js +0 -171
  35. package/dist/components/sql-panel.js +0 -396
  36. package/dist/components/tree.js +0 -91
  37. package/dist/processors/data-processor.js +0 -353
  38. package/dist/table/duckdb-table-utils.js +0 -669
  39. package/dist/table/duckdb-table.js +0 -480
  40. package/dist/utils/perf.js +0 -46
package/package.json CHANGED
@@ -1,26 +1,29 @@
1
1
  {
2
2
  "name": "@kepler.gl/duckdb",
3
3
  "author": "Shan He <heshan0131@gmail.com>",
4
- "version": "3.3.0-alpha.0",
4
+ "version": "3.3.0-alpha.10",
5
5
  "description": "DuckDB plugin for Kepler.gl",
6
6
  "license": "MIT",
7
- "main": "dist/index.js",
7
+ "main": "dist/cjs/index.js",
8
8
  "types": "dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.js"
12
+ "import": "./dist/esm/index.js",
13
+ "require": "./dist/cjs/index.js",
14
+ "default": "./dist/cjs/index.js"
14
15
  },
15
16
  "./components": {
16
17
  "types": "./dist/components/index.d.ts",
17
- "import": "./dist/components/index.js",
18
- "require": "./dist/components/index.js"
18
+ "import": "./dist/esm/components/index.js",
19
+ "require": "./dist/cjs/components/index.js",
20
+ "default": "./dist/cjs/components/index.js"
19
21
  },
20
22
  "./table": {
21
23
  "types": "./dist/table/index.d.ts",
22
- "import": "./dist/table/index.js",
23
- "require": "./dist/table/index.js"
24
+ "import": "./dist/esm/table/index.js",
25
+ "require": "./dist/cjs/table/index.js",
26
+ "default": "./dist/cjs/table/index.js"
24
27
  }
25
28
  },
26
29
  "keywords": [
@@ -31,27 +34,26 @@
31
34
  "url": "https://github.com/keplergl/kepler.gl.git"
32
35
  },
33
36
  "scripts": {
34
- "build": "rm -fr dist && babel src --out-dir dist --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts'",
35
- "build:umd": "NODE_OPTIONS=--openssl-legacy-provider webpack --config ./webpack/umd.js --progress --env.prod",
37
+ "build": "rm -fr dist && babel src --out-dir dist/cjs --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts' && BABEL_ENV=esm babel src --out-dir dist/esm --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts'",
36
38
  "build:types": "tsc --project ./tsconfig.production.json",
37
39
  "prepublishOnly": "babel-node ../../scripts/license-header/bin --license ../../FILE-HEADER && yarn build && yarn build:types",
38
- "stab": "mkdir -p dist/components dist/table && echo \"export * from '../src';\" > dist/index.js && echo \"export * from '../../src/components';\" > dist/components/index.js && echo \"export * from '../../src/table';\" > dist/table/index.js"
40
+ "stab": "mkdir -p dist/cjs/components dist/cjs/table dist/esm/components dist/esm/table && echo \"'use strict'; Object.assign(module.exports, require('../../src'));\" > dist/cjs/index.js && echo \"export * from '../../src';\" > dist/esm/index.js && echo \"'use strict'; Object.assign(module.exports, require('../../../src/components'));\" > dist/cjs/components/index.js && echo \"export * from '../../../src/components';\" > dist/esm/components/index.js && echo \"'use strict'; Object.assign(module.exports, require('../../../src/table'));\" > dist/cjs/table/index.js && echo \"export * from '../../../src/table';\" > dist/esm/table/index.js"
39
41
  },
40
42
  "files": [
41
- "dist",
42
- "umd"
43
+ "dist"
43
44
  ],
44
45
  "dependencies": {
45
46
  "@duckdb/duckdb-wasm": "^1.28.0",
46
- "@kepler.gl/common-utils": "3.3.0-alpha.0",
47
- "@kepler.gl/constants": "3.3.0-alpha.0",
48
- "@kepler.gl/processors": "3.3.0-alpha.0",
49
- "@kepler.gl/table": "3.3.0-alpha.0",
50
- "@kepler.gl/types": "3.3.0-alpha.0",
51
- "@kepler.gl/utils": "3.3.0-alpha.0",
52
- "@monaco-editor/react": "^4.6.0",
47
+ "@kepler.gl/common-utils": "3.3.0-alpha.10",
48
+ "@kepler.gl/constants": "3.3.0-alpha.10",
49
+ "@kepler.gl/processors": "3.3.0-alpha.10",
50
+ "@kepler.gl/table": "3.3.0-alpha.10",
51
+ "@kepler.gl/types": "3.3.0-alpha.10",
52
+ "@kepler.gl/utils": "3.3.0-alpha.10",
53
+ "@monaco-editor/react": "^4.7.0",
53
54
  "@radix-ui/react-collapsible": "^1.1.0",
54
55
  "apache-arrow": ">=15.0.0",
56
+ "es-toolkit": "^1.39.10",
55
57
  "monaco-editor": "^0.52.0",
56
58
  "react-resizable-panels": "^2.1.7"
57
59
  },
@@ -62,14 +64,16 @@
62
64
  "maintainers": [
63
65
  "Shan He <heshan0131@gmail.com>",
64
66
  "Igor Dykhta <dikhta.igor@gmail.com>",
65
- "Ilya Boyandin <ilya@boyandin.me>"
67
+ "Ilya Boyandin <ilya@boyandin.me>",
68
+ "Xun Li <lixun910@gmail.com>"
66
69
  ],
67
70
  "engines": {
68
- "node": ">=18"
71
+ "node": ">=20"
69
72
  },
70
73
  "volta": {
71
- "node": "18.18.2",
74
+ "node": "20.19.3",
72
75
  "yarn": "4.4.0"
73
76
  },
74
- "packageManager": "yarn@4.4.0"
77
+ "packageManager": "yarn@4.4.0",
78
+ "module": "dist/esm/index.js"
75
79
  }
@@ -1,259 +0,0 @@
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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
18
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
19
- // SPDX-License-Identifier: MIT
20
- // Copyright contributors to the kepler.gl project
21
- var Connection = /*#__PURE__*/function () {
22
- function Connection(connection) {
23
- (0, _classCallCheck2["default"])(this, Connection);
24
- (0, _defineProperty2["default"])(this, "connection", void 0);
25
- this.connection = connection;
26
- }
27
- return (0, _createClass2["default"])(Connection, [{
28
- key: "query",
29
- value: function () {
30
- var _query = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(statement) {
31
- return _regenerator["default"].wrap(function _callee$(_context) {
32
- while (1) switch (_context.prev = _context.next) {
33
- case 0:
34
- return _context.abrupt("return", this.connection.query(statement));
35
- case 1:
36
- case "end":
37
- return _context.stop();
38
- }
39
- }, _callee, this);
40
- }));
41
- function query(_x) {
42
- return _query.apply(this, arguments);
43
- }
44
- return query;
45
- }()
46
- }, {
47
- key: "insertArrowTable",
48
- value: function () {
49
- var _insertArrowTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(arrowTable, params) {
50
- return _regenerator["default"].wrap(function _callee2$(_context2) {
51
- while (1) switch (_context2.prev = _context2.next) {
52
- case 0:
53
- _context2.next = 2;
54
- return this.connection.insertArrowTable(arrowTable, params);
55
- case 2:
56
- case "end":
57
- return _context2.stop();
58
- }
59
- }, _callee2, this);
60
- }));
61
- function insertArrowTable(_x2, _x3) {
62
- return _insertArrowTable.apply(this, arguments);
63
- }
64
- return insertArrowTable;
65
- }()
66
- }, {
67
- key: "close",
68
- value: function () {
69
- var _close = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
70
- return _regenerator["default"].wrap(function _callee3$(_context3) {
71
- while (1) switch (_context3.prev = _context3.next) {
72
- case 0:
73
- _context3.next = 2;
74
- return this.connection.close();
75
- case 2:
76
- case "end":
77
- return _context3.stop();
78
- }
79
- }, _callee3, this);
80
- }));
81
- function close() {
82
- return _close.apply(this, arguments);
83
- }
84
- return close;
85
- }()
86
- }]);
87
- }();
88
- var DuckDBWasmAdapter = exports.DuckDBWasmAdapter = /*#__PURE__*/function () {
89
- function DuckDBWasmAdapter(options) {
90
- (0, _classCallCheck2["default"])(this, DuckDBWasmAdapter);
91
- (0, _defineProperty2["default"])(this, "duckDB", void 0);
92
- // pass existing AsyncDuckDB object created elsewhere
93
- if (options instanceof Promise || options instanceof _duckdbWasm.AsyncDuckDB) {
94
- this.duckDB = options;
95
- return;
96
- }
97
-
98
- // or create a new AsyncDuckDB object
99
- var _ref = options || {},
100
- _ref$debug = _ref.debug,
101
- debug = _ref$debug === void 0 ? false : _ref$debug,
102
- config = _ref.config;
103
- this.duckDB = initializeDuckDbWasm(config, debug);
104
- }
105
- return (0, _createClass2["default"])(DuckDBWasmAdapter, [{
106
- key: "connect",
107
- value: function () {
108
- var _connect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
109
- var db, c;
110
- return _regenerator["default"].wrap(function _callee4$(_context4) {
111
- while (1) switch (_context4.prev = _context4.next) {
112
- case 0:
113
- _context4.next = 2;
114
- return this.duckDB;
115
- case 2:
116
- db = _context4.sent;
117
- _context4.next = 5;
118
- return db.connect();
119
- case 5:
120
- c = _context4.sent;
121
- return _context4.abrupt("return", new Connection(c));
122
- case 7:
123
- case "end":
124
- return _context4.stop();
125
- }
126
- }, _callee4, this);
127
- }));
128
- function connect() {
129
- return _connect.apply(this, arguments);
130
- }
131
- return connect;
132
- }()
133
- }, {
134
- key: "registerFileText",
135
- value: function () {
136
- var _registerFileText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(filename, content) {
137
- var db;
138
- return _regenerator["default"].wrap(function _callee5$(_context5) {
139
- while (1) switch (_context5.prev = _context5.next) {
140
- case 0:
141
- _context5.next = 2;
142
- return this.duckDB;
143
- case 2:
144
- db = _context5.sent;
145
- _context5.next = 5;
146
- return db.registerFileText(filename, content);
147
- case 5:
148
- case "end":
149
- return _context5.stop();
150
- }
151
- }, _callee5, this);
152
- }));
153
- function registerFileText(_x4, _x5) {
154
- return _registerFileText.apply(this, arguments);
155
- }
156
- return registerFileText;
157
- }()
158
- }, {
159
- key: "registerFileHandle",
160
- value: function () {
161
- var _registerFileHandle = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(name, handle, protocol, directIO) {
162
- var db;
163
- return _regenerator["default"].wrap(function _callee6$(_context6) {
164
- while (1) switch (_context6.prev = _context6.next) {
165
- case 0:
166
- _context6.next = 2;
167
- return this.duckDB;
168
- case 2:
169
- db = _context6.sent;
170
- _context6.next = 5;
171
- return db.registerFileHandle(name, handle, protocol, directIO);
172
- case 5:
173
- case "end":
174
- return _context6.stop();
175
- }
176
- }, _callee6, this);
177
- }));
178
- function registerFileHandle(_x6, _x7, _x8, _x9) {
179
- return _registerFileHandle.apply(this, arguments);
180
- }
181
- return registerFileHandle;
182
- }()
183
- }]);
184
- }();
185
- /**
186
- * Initialize DuckDB with a browser-specific Wasm bundle.
187
- */
188
- var initializeDuckDbWasm = /*#__PURE__*/function () {
189
- var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(config, debug) {
190
- var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch;
191
- return _regenerator["default"].wrap(function _callee7$(_context7) {
192
- while (1) switch (_context7.prev = _context7.next) {
193
- case 0:
194
- start = performance.now(); // Select a bundle based on browser checks
195
- JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
196
- _context7.next = 4;
197
- return duckdb.selectBundle(JSDELIVR_BUNDLES);
198
- case 4:
199
- bundle = _context7.sent;
200
- if (bundle.mainWorker) {
201
- _context7.next = 7;
202
- break;
203
- }
204
- throw new Error('Failed to initialize DuckDB');
205
- case 7:
206
- worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], {
207
- type: 'text/javascript'
208
- })); // Instantiate the async version of DuckDB-wasm
209
- worker = new Worker(worker_url);
210
- logger = debug ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
211
- db = new _duckdbWasm.AsyncDuckDB(logger, worker);
212
- _context7.next = 13;
213
- return db.instantiate(bundle.mainModule, bundle.pthreadWorker);
214
- case 13:
215
- URL.revokeObjectURL(worker_url);
216
- if (!config) {
217
- _context7.next = 28;
218
- break;
219
- }
220
- if (!config.path) {
221
- _context7.next = 26;
222
- break;
223
- }
224
- _context7.next = 18;
225
- return fetch(config.path);
226
- case 18:
227
- res = _context7.sent;
228
- _context7.next = 21;
229
- return res.arrayBuffer();
230
- case 21:
231
- buffer = _context7.sent;
232
- fileNameMatch = config.path.match(/[^/]*$/);
233
- if (fileNameMatch) {
234
- config.path = fileNameMatch[0];
235
- }
236
- _context7.next = 26;
237
- return db.registerFileBuffer(config.path, new Uint8Array(buffer));
238
- case 26:
239
- _context7.next = 28;
240
- return db.open(config);
241
- case 28:
242
- if (debug) {
243
- (0, _perf.logElapsedTime)('DuckDB initialized', start);
244
- if (config) {
245
- console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2)));
246
- }
247
- }
248
- return _context7.abrupt("return", db);
249
- case 30:
250
- case "end":
251
- return _context7.stop();
252
- }
253
- }, _callee7);
254
- }));
255
- return function initializeDuckDbWasm(_x10, _x11) {
256
- return _ref2.apply(this, arguments);
257
- };
258
- }();
259
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ29ubmVjdGlvbiIsImNvbm5lY3Rpb24iLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsIl9xdWVyeSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwic3RhdGVtZW50Iiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInF1ZXJ5Iiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5zZXJ0QXJyb3dUYWJsZSIsIl9jYWxsZWUyIiwiYXJyb3dUYWJsZSIsInBhcmFtcyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImluc2VydEFycm93VGFibGUiLCJfeDIiLCJfeDMiLCJfY2xvc2UiLCJfY2FsbGVlMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsImNsb3NlIiwiRHVja0RCV2FzbUFkYXB0ZXIiLCJleHBvcnRzIiwib3B0aW9ucyIsIlByb21pc2UiLCJBc3luY0R1Y2tEQiIsImR1Y2tEQiIsIl9yZWYiLCJfcmVmJGRlYnVnIiwiZGVidWciLCJjb25maWciLCJpbml0aWFsaXplRHVja0RiV2FzbSIsIl9jb25uZWN0IiwiX2NhbGxlZTQiLCJkYiIsImMiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJzZW50IiwiY29ubmVjdCIsIl9yZWdpc3RlckZpbGVUZXh0IiwiX2NhbGxlZTUiLCJmaWxlbmFtZSIsImNvbnRlbnQiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJyZWdpc3RlckZpbGVUZXh0IiwiX3g0IiwiX3g1IiwiX3JlZ2lzdGVyRmlsZUhhbmRsZSIsIl9jYWxsZWU2IiwibmFtZSIsImhhbmRsZSIsInByb3RvY29sIiwiZGlyZWN0SU8iLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJyZWdpc3RlckZpbGVIYW5kbGUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfcmVmMiIsIl9jYWxsZWU3Iiwic3RhcnQiLCJKU0RFTElWUl9CVU5ETEVTIiwiYnVuZGxlIiwid29ya2VyX3VybCIsIndvcmtlciIsImxvZ2dlciIsInJlcyIsImJ1ZmZlciIsImZpbGVOYW1lTWF0Y2giLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJwZXJmb3JtYW5jZSIsIm5vdyIsImdldEpzRGVsaXZyQnVuZGxlcyIsInNlbGVjdEJ1bmRsZSIsIm1haW5Xb3JrZXIiLCJFcnJvciIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJjb25jYXQiLCJ0eXBlIiwiV29ya2VyIiwiQ29uc29sZUxvZ2dlciIsIlZvaWRMb2dnZXIiLCJpbnN0YW50aWF0ZSIsIm1haW5Nb2R1bGUiLCJwdGhyZWFkV29ya2VyIiwicmV2b2tlT2JqZWN0VVJMIiwicGF0aCIsImZldGNoIiwiYXJyYXlCdWZmZXIiLCJtYXRjaCIsInJlZ2lzdGVyRmlsZUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJvcGVuIiwibG9nRWxhcHNlZFRpbWUiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIl94MTAiLCJfeDExIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL2R1Y2tkYi13YXNtLWFkYXB0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGR1Y2tkYiBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7QXN5bmNEdWNrREIsIER1Y2tEQkNvbmZpZywgQXN5bmNEdWNrREJDb25uZWN0aW9ufSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtEYXRhYmFzZUFkYXB0ZXIsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4uL3V0aWxzL3BlcmYnO1xuXG5jbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGF0YWJhc2VDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxhcnJvdy5UYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucXVlcnkoc3RhdGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsIHBhcmFtczoge25hbWU6IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cbn1cblxudHlwZSBEdWNrREJXYXNtQWRhcHRlclByb3BzID1cbiAgfCB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBjb25maWc/OiBEdWNrREJDb25maWc7XG4gICAgfVxuICB8IFByb21pc2U8QXN5bmNEdWNrREI+O1xuXG5leHBvcnQgY2xhc3MgRHVja0RCV2FzbUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFkYXB0ZXIge1xuICBwcml2YXRlIGR1Y2tEQjogUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRHVja0RCV2FzbUFkYXB0ZXJQcm9wcykge1xuICAgIC8vIHBhc3MgZXhpc3RpbmcgQXN5bmNEdWNrREIgb2JqZWN0IGNyZWF0ZWQgZWxzZXdoZXJlXG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiBBc3luY0R1Y2tEQikge1xuICAgICAgdGhpcy5kdWNrREIgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvciBjcmVhdGUgYSBuZXcgQXN5bmNEdWNrREIgb2JqZWN0XG4gICAgY29uc3Qge2RlYnVnID0gZmFsc2UsIGNvbmZpZ30gPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuZHVja0RCID0gaW5pdGlhbGl6ZUR1Y2tEYldhc20oY29uZmlnLCBkZWJ1Zyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oYyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVUZXh0KGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJGaWxlSGFuZGxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGU6IGFueSxcbiAgICBwcm90b2NvbDogZHVja2RiLkR1Y2tEQkRhdGFQcm90b2NvbCxcbiAgICBkaXJlY3RJTzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShuYW1lLCBoYW5kbGUsIHByb3RvY29sLCBkaXJlY3RJTyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIER1Y2tEQiB3aXRoIGEgYnJvd3Nlci1zcGVjaWZpYyBXYXNtIGJ1bmRsZS5cbiAqL1xuY29uc3QgaW5pdGlhbGl6ZUR1Y2tEYldhc20gPSBhc3luYyAoXG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZyxcbiAgZGVidWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFzeW5jRHVja0RCPiA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gU2VsZWN0IGEgYnVuZGxlIGJhc2VkIG9uIGJyb3dzZXIgY2hlY2tzXG4gIGNvbnN0IEpTREVMSVZSX0JVTkRMRVMgPSBkdWNrZGIuZ2V0SnNEZWxpdnJCdW5kbGVzKCk7XG4gIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGR1Y2tkYi5zZWxlY3RCdW5kbGUoSlNERUxJVlJfQlVORExFUyk7XG4gIGlmICghYnVuZGxlLm1haW5Xb3JrZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIER1Y2tEQicpO1xuICB9XG5cbiAgY29uc3Qgd29ya2VyX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgbmV3IEJsb2IoW2BpbXBvcnRTY3JpcHRzKFwiJHtidW5kbGUubWFpbldvcmtlcn1cIik7YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfSlcbiAgKTtcblxuICAvLyBJbnN0YW50aWF0ZSB0aGUgYXN5bmMgdmVyc2lvbiBvZiBEdWNrREItd2FzbVxuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlcl91cmwpO1xuICBjb25zdCBsb2dnZXIgPSBkZWJ1ZyA/IG5ldyBkdWNrZGIuQ29uc29sZUxvZ2dlcigpIDogbmV3IGR1Y2tkYi5Wb2lkTG9nZ2VyKCk7XG4gIGNvbnN0IGRiID0gbmV3IEFzeW5jRHVja0RCKGxvZ2dlciwgd29ya2VyKTtcbiAgYXdhaXQgZGIuaW5zdGFudGlhdGUoYnVuZGxlLm1haW5Nb2R1bGUsIGJ1bmRsZS5wdGhyZWFkV29ya2VyKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJfdXJsKTtcblxuICBpZiAoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5wYXRoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjb25maWcucGF0aCk7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb25maWcucGF0aC5tYXRjaCgvW14vXSokLyk7XG4gICAgICBpZiAoZmlsZU5hbWVNYXRjaCkge1xuICAgICAgICBjb25maWcucGF0aCA9IGZpbGVOYW1lTWF0Y2hbMF07XG4gICAgICB9XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVCdWZmZXIoY29uZmlnLnBhdGgsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cbiAgICBhd2FpdCBkYi5vcGVuKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoZGVidWcpIHtcbiAgICBsb2dFbGFwc2VkVGltZSgnRHVja0RCIGluaXRpYWxpemVkJywgc3RhcnQpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYER1Y2tEYkNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsV0FBQSxHQUFB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
@@ -1,175 +0,0 @@
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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
17
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
18
- 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; }
19
- 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
20
- // Copyright contributors to the kepler.gl project
21
- // import {tableSchema as DEFAULT_SCHEMA} from './table-schema';
22
- var MONACO_OPTIONS = {
23
- minimap: {
24
- enabled: false
25
- },
26
- language: 'sql',
27
- contextmenu: false,
28
- renderLineHighlight: 'none',
29
- scrollBeyondLastLine: false,
30
- scrollbar: {
31
- alwaysConsumeMouseWheel: false
32
- },
33
- overviewRulerLanes: 0,
34
- automaticLayout: true,
35
- acceptSuggestionOnEnter: 'on',
36
- quickSuggestionsDelay: 400,
37
- matchOnWordStartOnly: false,
38
- tabCompletion: 'off',
39
- lineNumbers: 'off'
40
- };
41
- function parseSqlAndFindTableNameAndAliases(sql) {
42
- var regex = /\b(?:FROM|JOIN)\s+([^\s.]+(?:\.[^\s.]+)?)\s*(?:AS)?\s*([^\s,]+)?/gi;
43
- var tables = [];
44
- while (true) {
45
- var match = regex.exec(sql);
46
- if (!match) {
47
- break;
48
- }
49
- var table_name = match[1];
50
- if (!/\(/.test(table_name)) {
51
- // exclude function calls
52
- var alias = match[2];
53
- if (alias && /on|where|inner|left|right|join/.test(alias)) {
54
- alias = null;
55
- }
56
- tables.push({
57
- table_name: table_name,
58
- alias: alias || table_name
59
- });
60
- }
61
- }
62
- return tables;
63
- }
64
- var MonacoEditor = function MonacoEditor(_ref) {
65
- var onRunQuery = _ref.onRunQuery,
66
- onChange = _ref.onChange,
67
- code = _ref.code,
68
- tableSchema = _ref.tableSchema,
69
- isReadOnly = _ref.isReadOnly;
70
- // private editor?: monaco.editor.IStandaloneCodeEditor;
71
- var schemaTableNames = (0, _react.useMemo)(function () {
72
- return tableSchema ? (0, _uniq["default"])(tableSchema.map(function (d) {
73
- return d.table_name;
74
- })) : [];
75
- }, [tableSchema]);
76
- var schemaTableNamesSet = (0, _react.useMemo)(function () {
77
- return new Set(schemaTableNames);
78
- }, [schemaTableNames]);
79
- var handleRunQueryRef = (0, _react.useRef)(onRunQuery);
80
- handleRunQueryRef.current = onRunQuery;
81
- var handleEditorDidMount = (0, _react.useCallback)(function (editor) {
82
- // this.editor = editor;
83
- editor.focus();
84
- editor.addAction({
85
- id: 'run-query',
86
- label: 'Run Query',
87
- keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, monaco.KeyMod.Shift | monaco.KeyCode.Enter],
88
- contextMenuGroupId: 'custom',
89
- contextMenuOrder: 0,
90
- run: function run() {
91
- return handleRunQueryRef.current();
92
- }
93
- });
94
- monaco.languages.registerCompletionItemProvider('*', {
95
- provideCompletionItems: function provideCompletionItems(model, position, _context, _cancelationToken) {
96
- var _thisLine$trim$split$, _exec, _exec2;
97
- var suggestions = [{
98
- label: 'myCustomSnippet',
99
- kind: monaco.languages.CompletionItemKind.Snippet,
100
- insertText: 'This is a piece of custom code',
101
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
102
- documentation: 'This is a piece of custom code'
103
- // TODO: range is missing
104
- }];
105
- var fullQueryText = model.getValue();
106
- var tableNamesAndAliases = new Map(parseSqlAndFindTableNameAndAliases(fullQueryText).map(function (_ref2) {
107
- var table_name = _ref2.table_name,
108
- alias = _ref2.alias;
109
- return [alias, table_name];
110
- }));
111
- var thisLine = model.getValueInRange({
112
- startLineNumber: position.lineNumber,
113
- startColumn: 1,
114
- endLineNumber: position.lineNumber,
115
- endColumn: position.column
116
- });
117
- var thisToken = ((_thisLine$trim$split$ = thisLine.trim().split(' ').slice(-1)) === null || _thisLine$trim$split$ === void 0 ? void 0 : _thisLine$trim$split$[0]) || '';
118
- var lastTokenBeforeSpace = (_exec = /\s?(\w+)\s+\w+$/.exec(thisLine.trim())) === null || _exec === void 0 ? void 0 : _exec[1];
119
- var lastTokenBeforeDot = (_exec2 = /(\w+)\.\w*$/.exec(thisToken)) === null || _exec2 === void 0 ? void 0 : _exec2[1];
120
-
121
- // console.log(tableNamesAndAliases, thisToken, lastTokenBeforeSpace, lastTokenBeforeDot);
122
-
123
- if (lastTokenBeforeSpace && /from|join|update|into/.test(lastTokenBeforeSpace)) {
124
- suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(schemaTableNames.map(function (table_name) {
125
- return {
126
- label: table_name,
127
- kind: monaco.languages.CompletionItemKind.Field,
128
- insertText: table_name
129
- // TODO: range is missing
130
- };
131
- })));
132
- }
133
- if (lastTokenBeforeDot) {
134
- var table_name = null;
135
- if (schemaTableNamesSet.has(lastTokenBeforeDot)) {
136
- table_name = lastTokenBeforeDot;
137
- } else if (tableNamesAndAliases.get(lastTokenBeforeDot)) {
138
- table_name = tableNamesAndAliases.get(lastTokenBeforeDot);
139
- }
140
- if (table_name && tableSchema) {
141
- suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(tableSchema.filter(function (d) {
142
- return d.table_name === table_name;
143
- }).map(function (_ref3) {
144
- var column_name = _ref3.column_name;
145
- return {
146
- label: column_name,
147
- kind: monaco.languages.CompletionItemKind.Field,
148
- insertText: column_name
149
- // TODO: range is missing
150
- };
151
- })));
152
- }
153
- }
154
- return {
155
- suggestions: (0, _uniqBy["default"])(suggestions, function (s) {
156
- return s.insertText;
157
- })
158
- };
159
- }
160
- });
161
- }, [tableSchema, schemaTableNames, schemaTableNamesSet]);
162
- return /*#__PURE__*/_react["default"].createElement(_react2["default"], {
163
- height: "100%",
164
- theme: "vs-dark",
165
- defaultLanguage: "sql",
166
- defaultValue: code,
167
- onChange: onChange,
168
- onMount: handleEditorDidMount,
169
- options: _objectSpread(_objectSpread({}, MONACO_OPTIONS), {}, {
170
- readOnly: isReadOnly
171
- })
172
- });
173
- };
174
- var _default = exports["default"] = MonacoEditor;
175
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl91bmlxIiwiX3VuaXFCeSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIk1PTkFDT19PUFRJT05TIiwibWluaW1hcCIsImVuYWJsZWQiLCJsYW5ndWFnZSIsImNvbnRleHRtZW51IiwicmVuZGVyTGluZUhpZ2hsaWdodCIsInNjcm9sbEJleW9uZExhc3RMaW5lIiwic2Nyb2xsYmFyIiwiYWx3YXlzQ29uc3VtZU1vdXNlV2hlZWwiLCJvdmVydmlld1J1bGVyTGFuZXMiLCJhdXRvbWF0aWNMYXlvdXQiLCJhY2NlcHRTdWdnZXN0aW9uT25FbnRlciIsInF1aWNrU3VnZ2VzdGlvbnNEZWxheSIsIm1hdGNoT25Xb3JkU3RhcnRPbmx5IiwidGFiQ29tcGxldGlvbiIsImxpbmVOdW1iZXJzIiwicGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyIsInNxbCIsInJlZ2V4IiwidGFibGVzIiwibWF0Y2giLCJleGVjIiwidGFibGVfbmFtZSIsInRlc3QiLCJhbGlhcyIsIk1vbmFjb0VkaXRvciIsIl9yZWYiLCJvblJ1blF1ZXJ5Iiwib25DaGFuZ2UiLCJjb2RlIiwidGFibGVTY2hlbWEiLCJpc1JlYWRPbmx5Iiwic2NoZW1hVGFibGVOYW1lcyIsInVzZU1lbW8iLCJ1bmlxIiwibWFwIiwiZCIsInNjaGVtYVRhYmxlTmFtZXNTZXQiLCJTZXQiLCJoYW5kbGVSdW5RdWVyeVJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJoYW5kbGVFZGl0b3JEaWRNb3VudCIsInVzZUNhbGxiYWNrIiwiZWRpdG9yIiwiZm9jdXMiLCJhZGRBY3Rpb24iLCJpZCIsImxhYmVsIiwia2V5YmluZGluZ3MiLCJLZXlNb2QiLCJDdHJsQ21kIiwiS2V5Q29kZSIsIkVudGVyIiwiU2hpZnQiLCJjb250ZXh0TWVudUdyb3VwSWQiLCJjb250ZXh0TWVudU9yZGVyIiwicnVuIiwibGFuZ3VhZ2VzIiwicmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyIiwicHJvdmlkZUNvbXBsZXRpb25JdGVtcyIsIm1vZGVsIiwicG9zaXRpb24iLCJfY29udGV4dCIsIl9jYW5jZWxhdGlvblRva2VuIiwiX3RoaXNMaW5lJHRyaW0kc3BsaXQkIiwiX2V4ZWMiLCJfZXhlYzIiLCJzdWdnZXN0aW9ucyIsImtpbmQiLCJDb21wbGV0aW9uSXRlbUtpbmQiLCJTbmlwcGV0IiwiaW5zZXJ0VGV4dCIsImluc2VydFRleHRSdWxlcyIsIkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUiLCJJbnNlcnRBc1NuaXBwZXQiLCJkb2N1bWVudGF0aW9uIiwiZnVsbFF1ZXJ5VGV4dCIsImdldFZhbHVlIiwidGFibGVOYW1lc0FuZEFsaWFzZXMiLCJNYXAiLCJfcmVmMiIsInRoaXNMaW5lIiwiZ2V0VmFsdWVJblJhbmdlIiwic3RhcnRMaW5lTnVtYmVyIiwibGluZU51bWJlciIsInN0YXJ0Q29sdW1uIiwiZW5kTGluZU51bWJlciIsImVuZENvbHVtbiIsImNvbHVtbiIsInRoaXNUb2tlbiIsInRyaW0iLCJzcGxpdCIsInNsaWNlIiwibGFzdFRva2VuQmVmb3JlU3BhY2UiLCJsYXN0VG9rZW5CZWZvcmVEb3QiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiRmllbGQiLCJfcmVmMyIsImNvbHVtbl9uYW1lIiwidW5pcUJ5IiwicyIsImNyZWF0ZUVsZW1lbnQiLCJoZWlnaHQiLCJ0aGVtZSIsImRlZmF1bHRMYW5ndWFnZSIsImRlZmF1bHRWYWx1ZSIsIm9uTW91bnQiLCJvcHRpb25zIiwicmVhZE9ubHkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9tb25hY28tZWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRWRpdG9yLCB7T25DaGFuZ2UsIE9uTW91bnR9IGZyb20gJ0Btb25hY28tZWRpdG9yL3JlYWN0JztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbi8vIGltcG9ydCB7dGFibGVTY2hlbWEgYXMgREVGQVVMVF9TQ0hFTUF9IGZyb20gJy4vdGFibGUtc2NoZW1hJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmNvbnN0IE1PTkFDT19PUFRJT05TOiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbWluaW1hcDoge2VuYWJsZWQ6IGZhbHNlfSxcbiAgbGFuZ3VhZ2U6ICdzcWwnLFxuICBjb250ZXh0bWVudTogZmFsc2UsXG4gIHJlbmRlckxpbmVIaWdobGlnaHQ6ICdub25lJyxcbiAgc2Nyb2xsQmV5b25kTGFzdExpbmU6IGZhbHNlLFxuICBzY3JvbGxiYXI6IHthbHdheXNDb25zdW1lTW91c2VXaGVlbDogZmFsc2V9LFxuICBvdmVydmlld1J1bGVyTGFuZXM6IDAsXG4gIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcbiAgYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXI6ICdvbicsXG4gIHF1aWNrU3VnZ2VzdGlvbnNEZWxheTogNDAwLFxuICBtYXRjaE9uV29yZFN0YXJ0T25seTogZmFsc2UsXG4gIHRhYkNvbXBsZXRpb246ICdvZmYnLFxuICBsaW5lTnVtYmVyczogJ29mZidcbn07XG5cbmZ1bmN0aW9uIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoc3FsOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVnZXggPSAvXFxiKD86RlJPTXxKT0lOKVxccysoW15cXHMuXSsoPzpcXC5bXlxccy5dKyk/KVxccyooPzpBUyk/XFxzKihbXlxccyxdKyk/L2dpO1xuICBjb25zdCB0YWJsZXM6IHt0YWJsZV9uYW1lOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmd9W10gPSBbXTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhzcWwpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZV9uYW1lID0gbWF0Y2hbMV07XG4gICAgaWYgKCEvXFwoLy50ZXN0KHRhYmxlX25hbWUpKSB7XG4gICAgICAvLyBleGNsdWRlIGZ1bmN0aW9uIGNhbGxzXG4gICAgICBsZXQgYWxpYXMgPSBtYXRjaFsyXSBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgaWYgKGFsaWFzICYmIC9vbnx3aGVyZXxpbm5lcnxsZWZ0fHJpZ2h0fGpvaW4vLnRlc3QoYWxpYXMpKSB7XG4gICAgICAgIGFsaWFzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRhYmxlcy5wdXNoKHtcbiAgICAgICAgdGFibGVfbmFtZSxcbiAgICAgICAgYWxpYXM6IGFsaWFzIHx8IHRhYmxlX25hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YWJsZXM7XG59XG5cbmludGVyZmFjZSBNb25hY29FZGl0b3JQcm9wcyB7XG4gIGNvZGU6IHN0cmluZztcbiAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiBPbkNoYW5nZTtcbiAgb25SdW5RdWVyeTogKCkgPT4gdm9pZDtcbiAgdGFibGVTY2hlbWE/OiB7dGFibGVfbmFtZTogc3RyaW5nOyBjb2x1bW5fbmFtZTogc3RyaW5nfVtdO1xufVxuXG5jb25zdCBNb25hY29FZGl0b3I6IFJlYWN0LkZDPE1vbmFjb0VkaXRvclByb3BzPiA9ICh7XG4gIG9uUnVuUXVlcnksXG4gIG9uQ2hhbmdlLFxuICBjb2RlLFxuICB0YWJsZVNjaGVtYSxcbiAgaXNSZWFkT25seVxufSkgPT4ge1xuICAvLyBwcml2YXRlIGVkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuICBjb25zdCBzY2hlbWFUYWJsZU5hbWVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodGFibGVTY2hlbWEgPyB1bmlxKHRhYmxlU2NoZW1hLm1hcChkID0+IGQudGFibGVfbmFtZSkpIDogW10pLFxuICAgIFt0YWJsZVNjaGVtYV1cbiAgKTtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lc1NldCA9IHVzZU1lbW8oKCkgPT4gbmV3IFNldChzY2hlbWFUYWJsZU5hbWVzKSwgW3NjaGVtYVRhYmxlTmFtZXNdKTtcbiAgY29uc3QgaGFuZGxlUnVuUXVlcnlSZWYgPSB1c2VSZWYob25SdW5RdWVyeSk7XG4gIGhhbmRsZVJ1blF1ZXJ5UmVmLmN1cnJlbnQgPSBvblJ1blF1ZXJ5O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRvckRpZE1vdW50OiBPbk1vdW50ID0gdXNlQ2FsbGJhY2soXG4gICAgZWRpdG9yID0+IHtcbiAgICAgIC8vIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xuICAgICAgZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgIGVkaXRvci5hZGRBY3Rpb24oe1xuICAgICAgICBpZDogJ3J1bi1xdWVyeScsXG4gICAgICAgIGxhYmVsOiAnUnVuIFF1ZXJ5JyxcbiAgICAgICAga2V5YmluZGluZ3M6IFtcbiAgICAgICAgICBtb25hY28uS2V5TW9kLkN0cmxDbWQgfCBtb25hY28uS2V5Q29kZS5FbnRlcixcbiAgICAgICAgICBtb25hY28uS2V5TW9kLlNoaWZ0IHwgbW9uYWNvLktleUNvZGUuRW50ZXJcbiAgICAgICAgXSxcbiAgICAgICAgY29udGV4dE1lbnVHcm91cElkOiAnY3VzdG9tJyxcbiAgICAgICAgY29udGV4dE1lbnVPcmRlcjogMCxcbiAgICAgICAgcnVuOiAoKSA9PiBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50KClcbiAgICAgIH0pO1xuXG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignKicsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbiwgX2NvbnRleHQsIF9jYW5jZWxhdGlvblRva2VuKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdteUN1c3RvbVNuaXBwZXQnLFxuICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0LFxuICAgICAgICAgICAgICBpbnNlcnRUZXh0OiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJyxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0LFxuICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJ1xuICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1cbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgY29uc3QgZnVsbFF1ZXJ5VGV4dCA9IG1vZGVsLmdldFZhbHVlKCk7XG5cbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzQW5kQWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFxuICAgICAgICAgICAgcGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyhmdWxsUXVlcnlUZXh0KS5tYXAoKHt0YWJsZV9uYW1lLCBhbGlhc30pID0+IFtcbiAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgIHRhYmxlX25hbWVcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRoaXNMaW5lID0gbW9kZWwuZ2V0VmFsdWVJblJhbmdlKHtcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIGVuZENvbHVtbjogcG9zaXRpb24uY29sdW1uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgdGhpc1Rva2VuID0gdGhpc0xpbmUudHJpbSgpLnNwbGl0KCcgJykuc2xpY2UoLTEpPy5bMF0gfHwgJyc7XG5cbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVTcGFjZSA9IC9cXHM/KFxcdyspXFxzK1xcdyskLy5leGVjKHRoaXNMaW5lLnRyaW0oKSk/LlsxXTtcbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVEb3QgPSAvKFxcdyspXFwuXFx3KiQvLmV4ZWModGhpc1Rva2VuKT8uWzFdO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGFibGVOYW1lc0FuZEFsaWFzZXMsIHRoaXNUb2tlbiwgbGFzdFRva2VuQmVmb3JlU3BhY2UsIGxhc3RUb2tlbkJlZm9yZURvdCk7XG5cbiAgICAgICAgICBpZiAobGFzdFRva2VuQmVmb3JlU3BhY2UgJiYgL2Zyb218am9pbnx1cGRhdGV8aW50by8udGVzdChsYXN0VG9rZW5CZWZvcmVTcGFjZSkpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIC4uLnNjaGVtYVRhYmxlTmFtZXMubWFwKFxuICAgICAgICAgICAgICAgIHRhYmxlX25hbWUgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YWJsZV9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogdGFibGVfbmFtZVxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZURvdCkge1xuICAgICAgICAgICAgbGV0IHRhYmxlX25hbWUgPSBudWxsIGFzIHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICBpZiAoc2NoZW1hVGFibGVOYW1lc1NldC5oYXMobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gbGFzdFRva2VuQmVmb3JlRG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0YWJsZU5hbWVzQW5kQWxpYXNlcy5nZXQobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gdGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhYmxlX25hbWUgJiYgdGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50YWJsZVNjaGVtYVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihkID0+IGQudGFibGVfbmFtZSA9PT0gdGFibGVfbmFtZSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICh7Y29sdW1uX25hbWV9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sdW1uX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGNvbHVtbl9uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uczogdW5pcUJ5KHN1Z2dlc3Rpb25zLCBzID0+IHMuaW5zZXJ0VGV4dClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFt0YWJsZVNjaGVtYSwgc2NoZW1hVGFibGVOYW1lcywgc2NoZW1hVGFibGVOYW1lc1NldF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxFZGl0b3JcbiAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgdGhlbWU9XCJ2cy1kYXJrXCJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZT1cInNxbFwiXG4gICAgICBkZWZhdWx0VmFsdWU9e2NvZGV9XG4gICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICBvbk1vdW50PXtoYW5kbGVFZGl0b3JEaWRNb3VudH1cbiAgICAgIG9wdGlvbnM9e3tcbiAgICAgICAgLi4uTU9OQUNPX09QVElPTlMsXG4gICAgICAgIHJlYWRPbmx5OiBpc1JlYWRPbmx5XG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb25hY29FZGl0b3I7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFKLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSSxLQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFBbUMsU0FBQU0seUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFSLHdCQUFBUSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFH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