@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.
Files changed (39) 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} +1 -1
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +668 -0
  12. package/dist/cjs/table/duckdb-table.js +479 -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 +644 -0
  26. package/dist/esm/table/duckdb-table.js +474 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/package.json +21 -17
  30. package/dist/adapters/duckdb-wasm-adapter.js +0 -258
  31. package/dist/components/monaco-editor.js +0 -174
  32. package/dist/components/preview-data-panel.js +0 -127
  33. package/dist/components/schema-panel.js +0 -170
  34. package/dist/components/sql-panel.js +0 -395
  35. package/dist/components/tree.js +0 -90
  36. package/dist/processors/data-processor.js +0 -353
  37. package/dist/table/duckdb-table-utils.js +0 -668
  38. package/dist/table/duckdb-table.js +0 -479
  39. 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.5",
4
+ "version": "3.3.0-alpha.6",
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,22 +34,22 @@
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'",
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'",
35
38
  "build:types": "tsc --project ./tsconfig.production.json",
36
39
  "prepublishOnly": "babel-node ../../scripts/license-header/bin --license ../../FILE-HEADER && yarn build && yarn build:types",
37
- "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"
38
41
  },
39
42
  "files": [
40
43
  "dist"
41
44
  ],
42
45
  "dependencies": {
43
46
  "@duckdb/duckdb-wasm": "^1.28.0",
44
- "@kepler.gl/common-utils": "3.3.0-alpha.5",
45
- "@kepler.gl/constants": "3.3.0-alpha.5",
46
- "@kepler.gl/processors": "3.3.0-alpha.5",
47
- "@kepler.gl/table": "3.3.0-alpha.5",
48
- "@kepler.gl/types": "3.3.0-alpha.5",
49
- "@kepler.gl/utils": "3.3.0-alpha.5",
47
+ "@kepler.gl/common-utils": "3.3.0-alpha.6",
48
+ "@kepler.gl/constants": "3.3.0-alpha.6",
49
+ "@kepler.gl/processors": "3.3.0-alpha.6",
50
+ "@kepler.gl/table": "3.3.0-alpha.6",
51
+ "@kepler.gl/types": "3.3.0-alpha.6",
52
+ "@kepler.gl/utils": "3.3.0-alpha.6",
50
53
  "@monaco-editor/react": "^4.7.0",
51
54
  "@radix-ui/react-collapsible": "^1.1.0",
52
55
  "apache-arrow": ">=15.0.0",
@@ -70,5 +73,6 @@
70
73
  "node": "20.19.3",
71
74
  "yarn": "4.4.0"
72
75
  },
73
- "packageManager": "yarn@4.4.0"
76
+ "packageManager": "yarn@4.4.0",
77
+ "module": "dist/esm/index.js"
74
78
  }
@@ -1,258 +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 _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJDb25uZWN0aW9uIiwiY29ubmVjdGlvbiIsIl9jbGFzc0NhbGxDaGVjazIiLCJfZGVmaW5lUHJvcGVydHkyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiX3F1ZXJ5IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJzdGF0ZW1lbnQiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYWJydXB0IiwicXVlcnkiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsIl9pbnNlcnRBcnJvd1RhYmxlIiwiX2NhbGxlZTIiLCJhcnJvd1RhYmxlIiwicGFyYW1zIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiaW5zZXJ0QXJyb3dUYWJsZSIsIl94MiIsIl94MyIsIl9jbG9zZSIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY2xvc2UiLCJEdWNrREJXYXNtQWRhcHRlciIsImV4cG9ydHMiLCJvcHRpb25zIiwiUHJvbWlzZSIsIkFzeW5jRHVja0RCIiwiZHVja0RCIiwiX3JlZiIsIl9yZWYkZGVidWciLCJkZWJ1ZyIsImNvbmZpZyIsImluaXRpYWxpemVEdWNrRGJXYXNtIiwiX2Nvbm5lY3QiLCJfY2FsbGVlNCIsImRiIiwiYyIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInNlbnQiLCJjb25uZWN0IiwiX3JlZ2lzdGVyRmlsZVRleHQiLCJfY2FsbGVlNSIsImZpbGVuYW1lIiwiY29udGVudCIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsInJlZ2lzdGVyRmlsZVRleHQiLCJfeDQiLCJfeDUiLCJfcmVnaXN0ZXJGaWxlSGFuZGxlIiwiX2NhbGxlZTYiLCJuYW1lIiwiaGFuZGxlIiwicHJvdG9jb2wiLCJkaXJlY3RJTyIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsInJlZ2lzdGVyRmlsZUhhbmRsZSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9yZWYyIiwiX2NhbGxlZTciLCJzdGFydCIsIkpTREVMSVZSX0JVTkRMRVMiLCJidW5kbGUiLCJ3b3JrZXJfdXJsIiwid29ya2VyIiwibG9nZ2VyIiwicmVzIiwiYnVmZmVyIiwiZmlsZU5hbWVNYXRjaCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsInBlcmZvcm1hbmNlIiwibm93IiwiZ2V0SnNEZWxpdnJCdW5kbGVzIiwic2VsZWN0QnVuZGxlIiwibWFpbldvcmtlciIsIkVycm9yIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImNvbmNhdCIsInR5cGUiLCJXb3JrZXIiLCJDb25zb2xlTG9nZ2VyIiwiVm9pZExvZ2dlciIsImluc3RhbnRpYXRlIiwibWFpbk1vZHVsZSIsInB0aHJlYWRXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwYXRoIiwiZmV0Y2giLCJhcnJheUJ1ZmZlciIsIm1hdGNoIiwicmVnaXN0ZXJGaWxlQnVmZmVyIiwiVWludDhBcnJheSIsIm9wZW4iLCJsb2dFbGFwc2VkVGltZSIsImNvbnNvbGUiLCJKU09OIiwic3RyaW5naWZ5IiwiX3gwIiwiX3gxIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL2R1Y2tkYi13YXNtLWFkYXB0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGR1Y2tkYiBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7QXN5bmNEdWNrREIsIER1Y2tEQkNvbmZpZywgQXN5bmNEdWNrREJDb25uZWN0aW9ufSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtEYXRhYmFzZUFkYXB0ZXIsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4uL3V0aWxzL3BlcmYnO1xuXG5jbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGF0YWJhc2VDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxhcnJvdy5UYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucXVlcnkoc3RhdGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsIHBhcmFtczoge25hbWU6IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cbn1cblxudHlwZSBEdWNrREJXYXNtQWRhcHRlclByb3BzID1cbiAgfCB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBjb25maWc/OiBEdWNrREJDb25maWc7XG4gICAgfVxuICB8IFByb21pc2U8QXN5bmNEdWNrREI+O1xuXG5leHBvcnQgY2xhc3MgRHVja0RCV2FzbUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFkYXB0ZXIge1xuICBwcml2YXRlIGR1Y2tEQjogUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRHVja0RCV2FzbUFkYXB0ZXJQcm9wcykge1xuICAgIC8vIHBhc3MgZXhpc3RpbmcgQXN5bmNEdWNrREIgb2JqZWN0IGNyZWF0ZWQgZWxzZXdoZXJlXG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiBBc3luY0R1Y2tEQikge1xuICAgICAgdGhpcy5kdWNrREIgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvciBjcmVhdGUgYSBuZXcgQXN5bmNEdWNrREIgb2JqZWN0XG4gICAgY29uc3Qge2RlYnVnID0gZmFsc2UsIGNvbmZpZ30gPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuZHVja0RCID0gaW5pdGlhbGl6ZUR1Y2tEYldhc20oY29uZmlnLCBkZWJ1Zyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oYyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVUZXh0KGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJGaWxlSGFuZGxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGU6IGFueSxcbiAgICBwcm90b2NvbDogZHVja2RiLkR1Y2tEQkRhdGFQcm90b2NvbCxcbiAgICBkaXJlY3RJTzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShuYW1lLCBoYW5kbGUsIHByb3RvY29sLCBkaXJlY3RJTyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIER1Y2tEQiB3aXRoIGEgYnJvd3Nlci1zcGVjaWZpYyBXYXNtIGJ1bmRsZS5cbiAqL1xuY29uc3QgaW5pdGlhbGl6ZUR1Y2tEYldhc20gPSBhc3luYyAoXG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZyxcbiAgZGVidWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFzeW5jRHVja0RCPiA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gU2VsZWN0IGEgYnVuZGxlIGJhc2VkIG9uIGJyb3dzZXIgY2hlY2tzXG4gIGNvbnN0IEpTREVMSVZSX0JVTkRMRVMgPSBkdWNrZGIuZ2V0SnNEZWxpdnJCdW5kbGVzKCk7XG4gIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGR1Y2tkYi5zZWxlY3RCdW5kbGUoSlNERUxJVlJfQlVORExFUyk7XG4gIGlmICghYnVuZGxlLm1haW5Xb3JrZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIER1Y2tEQicpO1xuICB9XG5cbiAgY29uc3Qgd29ya2VyX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgbmV3IEJsb2IoW2BpbXBvcnRTY3JpcHRzKFwiJHtidW5kbGUubWFpbldvcmtlcn1cIik7YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfSlcbiAgKTtcblxuICAvLyBJbnN0YW50aWF0ZSB0aGUgYXN5bmMgdmVyc2lvbiBvZiBEdWNrREItd2FzbVxuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlcl91cmwpO1xuICBjb25zdCBsb2dnZXIgPSBkZWJ1ZyA/IG5ldyBkdWNrZGIuQ29uc29sZUxvZ2dlcigpIDogbmV3IGR1Y2tkYi5Wb2lkTG9nZ2VyKCk7XG4gIGNvbnN0IGRiID0gbmV3IEFzeW5jRHVja0RCKGxvZ2dlciwgd29ya2VyKTtcbiAgYXdhaXQgZGIuaW5zdGFudGlhdGUoYnVuZGxlLm1haW5Nb2R1bGUsIGJ1bmRsZS5wdGhyZWFkV29ya2VyKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJfdXJsKTtcblxuICBpZiAoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5wYXRoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjb25maWcucGF0aCk7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb25maWcucGF0aC5tYXRjaCgvW14vXSokLyk7XG4gICAgICBpZiAoZmlsZU5hbWVNYXRjaCkge1xuICAgICAgICBjb25maWcucGF0aCA9IGZpbGVOYW1lTWF0Y2hbMF07XG4gICAgICB9XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVCdWZmZXIoY29uZmlnLnBhdGgsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cbiAgICBhd2FpdCBkYi5vcGVuKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoZGVidWcpIHtcbiAgICBsb2dFbGFwc2VkVGltZSgnRHVja0RCIGluaXRpYWxpemVkJywgc3RhcnQpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYER1Y2tEYkNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsV0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQThD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
@@ -1,174 +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 _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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl91bmlxIiwiX3VuaXFCeSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJNb25hY29FZGl0b3IiLCJfcmVmIiwib25SdW5RdWVyeSIsIm9uQ2hhbmdlIiwiY29kZSIsInRhYmxlU2NoZW1hIiwiaXNSZWFkT25seSIsInNjaGVtYVRhYmxlTmFtZXMiLCJ1c2VNZW1vIiwidW5pcSIsIm1hcCIsImQiLCJzY2hlbWFUYWJsZU5hbWVzU2V0IiwiU2V0IiwiaGFuZGxlUnVuUXVlcnlSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwiaGFuZGxlRWRpdG9yRGlkTW91bnQiLCJ1c2VDYWxsYmFjayIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIkZpZWxkIiwiX3JlZjMiLCJjb2x1bW5fbmFtZSIsInVuaXFCeSIsInMiLCJjcmVhdGVFbGVtZW50IiwiaGVpZ2h0IiwidGhlbWUiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJkZWZhdWx0VmFsdWUiLCJvbk1vdW50Iiwib3B0aW9ucyIsInJlYWRPbmx5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9uYWNvLWVkaXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVkaXRvciwge09uQ2hhbmdlLCBPbk1vdW50fSBmcm9tICdAbW9uYWNvLWVkaXRvci9yZWFjdCc7XG5pbXBvcnQgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG4vLyBpbXBvcnQge3RhYmxlU2NoZW1hIGFzIERFRkFVTFRfU0NIRU1BfSBmcm9tICcuL3RhYmxlLXNjaGVtYSc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC91bmlxQnknO1xuXG5jb25zdCBNT05BQ09fT1BUSU9OUzogbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIG1pbmltYXA6IHtlbmFibGVkOiBmYWxzZX0sXG4gIGxhbmd1YWdlOiAnc3FsJyxcbiAgY29udGV4dG1lbnU6IGZhbHNlLFxuICByZW5kZXJMaW5lSGlnaGxpZ2h0OiAnbm9uZScsXG4gIHNjcm9sbEJleW9uZExhc3RMaW5lOiBmYWxzZSxcbiAgc2Nyb2xsYmFyOiB7YWx3YXlzQ29uc3VtZU1vdXNlV2hlZWw6IGZhbHNlfSxcbiAgb3ZlcnZpZXdSdWxlckxhbmVzOiAwLFxuICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsXG4gIGFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyOiAnb24nLFxuICBxdWlja1N1Z2dlc3Rpb25zRGVsYXk6IDQwMCxcbiAgbWF0Y2hPbldvcmRTdGFydE9ubHk6IGZhbHNlLFxuICB0YWJDb21wbGV0aW9uOiAnb2ZmJyxcbiAgbGluZU51bWJlcnM6ICdvZmYnXG59O1xuXG5mdW5jdGlvbiBwYXJzZVNxbEFuZEZpbmRUYWJsZU5hbWVBbmRBbGlhc2VzKHNxbDogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcYig/OkZST018Sk9JTilcXHMrKFteXFxzLl0rKD86XFwuW15cXHMuXSspPylcXHMqKD86QVMpP1xccyooW15cXHMsXSspPy9naTtcbiAgY29uc3QgdGFibGVzOiB7dGFibGVfbmFtZTogc3RyaW5nOyBhbGlhczogc3RyaW5nfVtdID0gW107XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3FsKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgdGFibGVfbmFtZSA9IG1hdGNoWzFdO1xuICAgIGlmICghL1xcKC8udGVzdCh0YWJsZV9uYW1lKSkge1xuICAgICAgLy8gZXhjbHVkZSBmdW5jdGlvbiBjYWxsc1xuICAgICAgbGV0IGFsaWFzID0gbWF0Y2hbMl0gYXMgc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlmIChhbGlhcyAmJiAvb258d2hlcmV8aW5uZXJ8bGVmdHxyaWdodHxqb2luLy50ZXN0KGFsaWFzKSkge1xuICAgICAgICBhbGlhcyA9IG51bGw7XG4gICAgICB9XG4gICAgICB0YWJsZXMucHVzaCh7XG4gICAgICAgIHRhYmxlX25hbWUsXG4gICAgICAgIGFsaWFzOiBhbGlhcyB8fCB0YWJsZV9uYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFibGVzO1xufVxuXG5pbnRlcmZhY2UgTW9uYWNvRWRpdG9yUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGlzUmVhZE9ubHk/OiBib29sZWFuO1xuICBvbkNoYW5nZTogT25DaGFuZ2U7XG4gIG9uUnVuUXVlcnk6ICgpID0+IHZvaWQ7XG4gIHRhYmxlU2NoZW1hPzoge3RhYmxlX25hbWU6IHN0cmluZzsgY29sdW1uX25hbWU6IHN0cmluZ31bXTtcbn1cblxuY29uc3QgTW9uYWNvRWRpdG9yOiBSZWFjdC5GQzxNb25hY29FZGl0b3JQcm9wcz4gPSAoe1xuICBvblJ1blF1ZXJ5LFxuICBvbkNoYW5nZSxcbiAgY29kZSxcbiAgdGFibGVTY2hlbWEsXG4gIGlzUmVhZE9ubHlcbn0pID0+IHtcbiAgLy8gcHJpdmF0ZSBlZGl0b3I/OiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcjtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHRhYmxlU2NoZW1hID8gdW5pcSh0YWJsZVNjaGVtYS5tYXAoZCA9PiBkLnRhYmxlX25hbWUpKSA6IFtdKSxcbiAgICBbdGFibGVTY2hlbWFdXG4gICk7XG4gIGNvbnN0IHNjaGVtYVRhYmxlTmFtZXNTZXQgPSB1c2VNZW1vKCgpID0+IG5ldyBTZXQoc2NoZW1hVGFibGVOYW1lcyksIFtzY2hlbWFUYWJsZU5hbWVzXSk7XG4gIGNvbnN0IGhhbmRsZVJ1blF1ZXJ5UmVmID0gdXNlUmVmKG9uUnVuUXVlcnkpO1xuICBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50ID0gb25SdW5RdWVyeTtcblxuICBjb25zdCBoYW5kbGVFZGl0b3JEaWRNb3VudDogT25Nb3VudCA9IHVzZUNhbGxiYWNrKFxuICAgIGVkaXRvciA9PiB7XG4gICAgICAvLyB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgIGVkaXRvci5mb2N1cygpO1xuXG4gICAgICBlZGl0b3IuYWRkQWN0aW9uKHtcbiAgICAgICAgaWQ6ICdydW4tcXVlcnknLFxuICAgICAgICBsYWJlbDogJ1J1biBRdWVyeScsXG4gICAgICAgIGtleWJpbmRpbmdzOiBbXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5DdHJsQ21kIHwgbW9uYWNvLktleUNvZGUuRW50ZXIsXG4gICAgICAgICAgbW9uYWNvLktleU1vZC5TaGlmdCB8IG1vbmFjby5LZXlDb2RlLkVudGVyXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRleHRNZW51R3JvdXBJZDogJ2N1c3RvbScsXG4gICAgICAgIGNvbnRleHRNZW51T3JkZXI6IDAsXG4gICAgICAgIHJ1bjogKCkgPT4gaGFuZGxlUnVuUXVlcnlSZWYuY3VycmVudCgpXG4gICAgICB9KTtcblxuICAgICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJyonLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24sIF9jb250ZXh0LCBfY2FuY2VsYXRpb25Ub2tlbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnbXlDdXN0b21TbmlwcGV0JyxcbiAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZScsXG4gICAgICAgICAgICAgIGluc2VydFRleHRSdWxlczogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldCxcbiAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogJ1RoaXMgaXMgYSBwaWVjZSBvZiBjdXN0b20gY29kZSdcbiAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGNvbnN0IGZ1bGxRdWVyeVRleHQgPSBtb2RlbC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lc0FuZEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihcbiAgICAgICAgICAgIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoZnVsbFF1ZXJ5VGV4dCkubWFwKCh7dGFibGVfbmFtZSwgYWxpYXN9KSA9PiBbXG4gICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICB0YWJsZV9uYW1lXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCB0aGlzTGluZSA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZSh7XG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgICAgICBlbmRDb2x1bW46IHBvc2l0aW9uLmNvbHVtblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHRoaXNUb2tlbiA9IHRoaXNMaW5lLnRyaW0oKS5zcGxpdCgnICcpLnNsaWNlKC0xKT8uWzBdIHx8ICcnO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlU3BhY2UgPSAvXFxzPyhcXHcrKVxccytcXHcrJC8uZXhlYyh0aGlzTGluZS50cmltKCkpPy5bMV07XG4gICAgICAgICAgY29uc3QgbGFzdFRva2VuQmVmb3JlRG90ID0gLyhcXHcrKVxcLlxcdyokLy5leGVjKHRoaXNUb2tlbik/LlsxXTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRhYmxlTmFtZXNBbmRBbGlhc2VzLCB0aGlzVG9rZW4sIGxhc3RUb2tlbkJlZm9yZVNwYWNlLCBsYXN0VG9rZW5CZWZvcmVEb3QpO1xuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZVNwYWNlICYmIC9mcm9tfGpvaW58dXBkYXRlfGludG8vLnRlc3QobGFzdFRva2VuQmVmb3JlU3BhY2UpKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAuLi5zY2hlbWFUYWJsZU5hbWVzLm1hcChcbiAgICAgICAgICAgICAgICB0YWJsZV9uYW1lID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFibGVfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IHRhYmxlX25hbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYXN0VG9rZW5CZWZvcmVEb3QpIHtcbiAgICAgICAgICAgIGxldCB0YWJsZV9uYW1lID0gbnVsbCBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgICAgaWYgKHNjaGVtYVRhYmxlTmFtZXNTZXQuaGFzKGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IGxhc3RUb2tlbkJlZm9yZURvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkpIHtcbiAgICAgICAgICAgICAgdGFibGVfbmFtZSA9IHRhYmxlTmFtZXNBbmRBbGlhc2VzLmdldChsYXN0VG9rZW5CZWZvcmVEb3QpIGFzIHN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YWJsZV9uYW1lICYmIHRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGFibGVTY2hlbWFcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLnRhYmxlX25hbWUgPT09IHRhYmxlX25hbWUpXG4gICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoe2NvbHVtbl9uYW1lfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbHVtbl9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBjb2x1bW5fbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmFuZ2UgaXMgbWlzc2luZ1xuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IHVuaXFCeShzdWdnZXN0aW9ucywgcyA9PiBzLmluc2VydFRleHQpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdGFibGVTY2hlbWEsIHNjaGVtYVRhYmxlTmFtZXMsIHNjaGVtYVRhYmxlTmFtZXNTZXRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RWRpdG9yXG4gICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgIHRoZW1lPVwidnMtZGFya1wiXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U9XCJzcWxcIlxuICAgICAgZGVmYXVsdFZhbHVlPXtjb2RlfVxuICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgb25Nb3VudD17aGFuZGxlRWRpdG9yRGlkTW91bnR9XG4gICAgICBvcHRpb25zPXt7XG4gICAgICAgIC4uLk1PTkFDT19PUFRJT05TLFxuICAgICAgICByZWFkT25seTogaXNSZWFkT25seVxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9uYWNvRWRpdG9yO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksS0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQW1DLFNBQUFELHdCQUFBTyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBVCx1QkFBQSxZQUFBQSx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLG1CQUFBVCxDQUFBLGlCQUFBQSxDQUFBLGdCQUFBVSxPQUFBLENBQUFWLENBQUEsMEJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEs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