@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.19

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 (73) hide show
  1. package/dist/cjs/commands/add-column-command.js +192 -0
  2. package/dist/cjs/commands/basemap-command.js +80 -0
  3. package/dist/cjs/commands/boundary-command.js +81 -0
  4. package/dist/cjs/commands/command-wrappers.js +122 -0
  5. package/dist/cjs/commands/dataset-context-command.js +87 -0
  6. package/dist/cjs/commands/index.js +230 -0
  7. package/dist/cjs/commands/layer-creation-command.js +534 -0
  8. package/dist/cjs/commands/layer-style-command.js +136 -0
  9. package/dist/cjs/commands/load-data-command.js +270 -0
  10. package/dist/cjs/commands/save-data-command.js +118 -0
  11. package/dist/cjs/commands/split-view-command.js +261 -0
  12. package/dist/cjs/commands/table-command.js +199 -0
  13. package/dist/cjs/commands/time-filter-command.js +289 -0
  14. package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
  15. package/dist/cjs/commands/types.js +6 -0
  16. package/dist/cjs/commands/utils.js +536 -0
  17. package/dist/cjs/commands/view-mode-command.js +94 -0
  18. package/dist/cjs/index.js +39 -0
  19. package/dist/cjs/map-contract.js +6 -0
  20. package/dist/cjs/server/bridge-server.js +435 -0
  21. package/dist/cjs/server/index.js +31 -0
  22. package/dist/cjs/server/stdio.js +201 -0
  23. package/dist/cjs/types.js +30 -0
  24. package/dist/commands/add-column-command.d.ts +4 -0
  25. package/dist/commands/basemap-command.d.ts +4 -0
  26. package/dist/commands/boundary-command.d.ts +4 -0
  27. package/dist/commands/command-wrappers.d.ts +52 -0
  28. package/dist/commands/dataset-context-command.d.ts +4 -0
  29. package/dist/commands/index.d.ts +31 -0
  30. package/dist/commands/layer-creation-command.d.ts +8 -0
  31. package/dist/commands/layer-style-command.d.ts +4 -0
  32. package/dist/commands/load-data-command.d.ts +4 -0
  33. package/dist/commands/save-data-command.d.ts +4 -0
  34. package/dist/commands/split-view-command.d.ts +4 -0
  35. package/dist/commands/table-command.d.ts +4 -0
  36. package/dist/commands/time-filter-command.d.ts +13 -0
  37. package/dist/commands/toggle-time-filter-command.d.ts +4 -0
  38. package/dist/commands/types.d.ts +132 -0
  39. package/dist/commands/utils.d.ts +138 -0
  40. package/dist/commands/view-mode-command.d.ts +4 -0
  41. package/dist/esm/commands/add-column-command.js +185 -0
  42. package/dist/esm/commands/basemap-command.js +72 -0
  43. package/dist/esm/commands/boundary-command.js +73 -0
  44. package/dist/esm/commands/command-wrappers.js +114 -0
  45. package/dist/esm/commands/dataset-context-command.js +79 -0
  46. package/dist/esm/commands/index.js +51 -0
  47. package/dist/esm/commands/layer-creation-command.js +527 -0
  48. package/dist/esm/commands/layer-style-command.js +130 -0
  49. package/dist/esm/commands/load-data-command.js +264 -0
  50. package/dist/esm/commands/save-data-command.js +112 -0
  51. package/dist/esm/commands/split-view-command.js +255 -0
  52. package/dist/esm/commands/table-command.js +194 -0
  53. package/dist/esm/commands/time-filter-command.js +280 -0
  54. package/dist/esm/commands/toggle-time-filter-command.js +147 -0
  55. package/dist/esm/commands/types.js +3 -0
  56. package/dist/esm/commands/utils.js +521 -0
  57. package/dist/esm/commands/view-mode-command.js +86 -0
  58. package/dist/esm/index.js +20 -0
  59. package/dist/esm/map-contract.js +3 -0
  60. package/dist/esm/server/bridge-server.js +428 -0
  61. package/dist/esm/server/index.js +13 -0
  62. package/dist/esm/server/stdio.js +198 -0
  63. package/dist/esm/types.js +24 -0
  64. package/dist/index.d.ts +15 -0
  65. package/dist/map-contract.d.ts +31 -0
  66. package/dist/server/bridge-server.d.ts +53 -0
  67. package/dist/server/index.d.ts +9 -0
  68. package/dist/server/stdio.d.ts +2 -0
  69. package/dist/types.d.ts +24 -0
  70. package/package.json +84 -4
  71. package/skill/kepler/SKILL.md +438 -0
  72. package/skill/kepler/skill.yaml +4 -0
  73. package/README.md +0 -3
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getUpdateLayerColorCommand = getUpdateLayerColorCommand;
8
+ exports.updateLayerColorCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+ var _zod = require("zod");
14
+ var _actions = require("@kepler.gl/actions");
15
+ 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; }
16
+ 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
17
+ // Copyright contributors to the kepler.gl project
18
+ var updateLayerColorCommandId = exports.updateLayerColorCommandId = 'map.update-layer-color';
19
+ function getUpdateLayerColorCommand(ctx) {
20
+ return {
21
+ id: updateLayerColorCommandId,
22
+ name: 'Update layer color',
23
+ group: 'Map',
24
+ description: 'Update the color palette of an existing layer.',
25
+ metadata: {
26
+ readOnly: false,
27
+ riskLevel: 'low',
28
+ idempotent: true
29
+ },
30
+ inputSchema: _zod.z.object({
31
+ layerId: _zod.z.string(),
32
+ numberOfColors: _zod.z.number(),
33
+ customColors: _zod.z.array(_zod.z.string()).describe('An array of hex color values. Try to generate colors from user description like: van gogh starry night, water color etc.')
34
+ }),
35
+ execute: function () {
36
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
37
+ var _ref, layerId, numberOfColors, customColors, HEX_COLOR_RE, visState, layers, layer, channel, newConfig, oldColorRange, newColorRange, newVisConfig;
38
+ return _regenerator["default"].wrap(function _callee$(_context) {
39
+ while (1) switch (_context.prev = _context.next) {
40
+ case 0:
41
+ _ref = input !== null && input !== void 0 ? input : {}, layerId = _ref.layerId, numberOfColors = _ref.numberOfColors, customColors = _ref.customColors;
42
+ _context.prev = 1;
43
+ if (!(typeof layerId !== 'string' || layerId.length === 0)) {
44
+ _context.next = 4;
45
+ break;
46
+ }
47
+ throw new Error('layerId is required and must be a string.');
48
+ case 4:
49
+ if (!(typeof numberOfColors !== 'number' || !Number.isInteger(numberOfColors) || numberOfColors <= 0)) {
50
+ _context.next = 6;
51
+ break;
52
+ }
53
+ throw new Error('numberOfColors is required and must be a positive integer.');
54
+ case 6:
55
+ // The schema/description promise hex colors — a non-hex string would
56
+ // produce an invalid palette downstream, so reject it up front with an
57
+ // actionable error instead of a confusing render.
58
+ HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
59
+ if (!(!Array.isArray(customColors) || customColors.some(function (c) {
60
+ return typeof c !== 'string' || !HEX_COLOR_RE.test(c);
61
+ }))) {
62
+ _context.next = 9;
63
+ break;
64
+ }
65
+ throw new Error('customColors is required and must be an array of hex color strings (e.g. #RRGGBB or #RRGGBBAA).');
66
+ case 9:
67
+ visState = ctx.getVisState();
68
+ layers = visState.layers;
69
+ layer = layers.find(function (l) {
70
+ return l.id === layerId;
71
+ });
72
+ if (layer) {
73
+ _context.next = 14;
74
+ break;
75
+ }
76
+ throw new Error("Layer with id ".concat(layerId, " not found"));
77
+ case 14:
78
+ if (!(numberOfColors !== customColors.length)) {
79
+ _context.next = 16;
80
+ break;
81
+ }
82
+ throw new Error("customColors array must contain exactly ".concat(numberOfColors, " colors"));
83
+ case 16:
84
+ channel = 'color';
85
+ newConfig = {};
86
+ oldColorRange = layer.config.visConfig.colorRange;
87
+ if (!(oldColorRange.colorMap && customColors.length !== oldColorRange.colorMap.length)) {
88
+ _context.next = 21;
89
+ break;
90
+ }
91
+ throw new Error("Layer ".concat(layerId, " has ").concat(oldColorRange.colorMap.length, " classes (custom colorMap); provide exactly ").concat(oldColorRange.colorMap.length, " colors, got ").concat(customColors.length, "."));
92
+ case 21:
93
+ newColorRange = _objectSpread(_objectSpread({}, oldColorRange), {}, {
94
+ colors: customColors
95
+ }, oldColorRange.colorMap ? {
96
+ colorMap: (0, _toConsumableArray2["default"])(oldColorRange.colorMap.map(function (c, i) {
97
+ return [c[0], customColors[i]];
98
+ }))
99
+ } : {});
100
+ newVisConfig = {
101
+ colorRange: newColorRange,
102
+ strokeColorRange: newColorRange
103
+ };
104
+ ctx.dispatch((0, _actions.layerVisualChannelConfigChange)(layer, newConfig, channel, newVisConfig));
105
+ return _context.abrupt("return", {
106
+ success: true,
107
+ commandId: updateLayerColorCommandId,
108
+ data: {
109
+ details: "Color updated to ".concat(customColors.join(', '), " for layer ").concat(layerId)
110
+ }
111
+ });
112
+ case 27:
113
+ _context.prev = 27;
114
+ _context.t0 = _context["catch"](1);
115
+ return _context.abrupt("return", {
116
+ success: false,
117
+ commandId: updateLayerColorCommandId,
118
+ error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
119
+ data: {
120
+ instruction: 'Try to fix the error. If the error persists, ask the user to try with different parameters.'
121
+ }
122
+ });
123
+ case 30:
124
+ case "end":
125
+ return _context.stop();
126
+ }
127
+ }, _callee, null, [[1, 27]]);
128
+ }));
129
+ function execute(_x, _x2) {
130
+ return _execute.apply(this, arguments);
131
+ }
132
+ return execute;
133
+ }()
134
+ };
135
+ }
136
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJ1cGRhdGVMYXllckNvbG9yQ29tbWFuZElkIiwiZXhwb3J0cyIsImdldFVwZGF0ZUxheWVyQ29sb3JDb21tYW5kIiwiY3R4IiwiaWQiLCJuYW1lIiwiZ3JvdXAiLCJkZXNjcmlwdGlvbiIsIm1ldGFkYXRhIiwicmVhZE9ubHkiLCJyaXNrTGV2ZWwiLCJpZGVtcG90ZW50IiwiaW5wdXRTY2hlbWEiLCJ6Iiwib2JqZWN0IiwibGF5ZXJJZCIsInN0cmluZyIsIm51bWJlck9mQ29sb3JzIiwibnVtYmVyIiwiY3VzdG9tQ29sb3JzIiwiYXJyYXkiLCJkZXNjcmliZSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJIRVhfQ09MT1JfUkUiLCJ2aXNTdGF0ZSIsImxheWVycyIsImxheWVyIiwiY2hhbm5lbCIsIm5ld0NvbmZpZyIsIm9sZENvbG9yUmFuZ2UiLCJuZXdDb2xvclJhbmdlIiwibmV3VmlzQ29uZmlnIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIkVycm9yIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiQXJyYXkiLCJpc0FycmF5Iiwic29tZSIsImMiLCJ0ZXN0IiwiZ2V0VmlzU3RhdGUiLCJmaW5kIiwibCIsImNvbmNhdCIsImNvbmZpZyIsInZpc0NvbmZpZyIsImNvbG9yUmFuZ2UiLCJjb2xvck1hcCIsImNvbG9ycyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJtYXAiLCJpIiwic3Ryb2tlQ29sb3JSYW5nZSIsImRpc3BhdGNoIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwiYWJydXB0Iiwic3VjY2VzcyIsImNvbW1hbmRJZCIsImRhdGEiLCJkZXRhaWxzIiwiam9pbiIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvbGF5ZXItc3R5bGUtY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckNvbG9yQ29tbWFuZElkID0gJ21hcC51cGRhdGUtbGF5ZXItY29sb3InIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlTGF5ZXJDb2xvckNvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiB1cGRhdGVMYXllckNvbG9yQ29tbWFuZElkLFxuICAgIG5hbWU6ICdVcGRhdGUgbGF5ZXIgY29sb3InLFxuICAgIGdyb3VwOiAnTWFwJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZSB0aGUgY29sb3IgcGFsZXR0ZSBvZiBhbiBleGlzdGluZyBsYXllci4nLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdsb3cnLCBpZGVtcG90ZW50OiB0cnVlfSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGF5ZXJJZDogei5zdHJpbmcoKSxcbiAgICAgIG51bWJlck9mQ29sb3JzOiB6Lm51bWJlcigpLFxuICAgICAgY3VzdG9tQ29sb3JzOiB6XG4gICAgICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0FuIGFycmF5IG9mIGhleCBjb2xvciB2YWx1ZXMuIFRyeSB0byBnZW5lcmF0ZSBjb2xvcnMgZnJvbSB1c2VyIGRlc2NyaXB0aW9uIGxpa2U6IHZhbiBnb2doIHN0YXJyeSBuaWdodCwgd2F0ZXIgY29sb3IgZXRjLidcbiAgICAgICAgKVxuICAgIH0pIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2V4ZWNDdHgsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB7bGF5ZXJJZCwgbnVtYmVyT2ZDb2xvcnMsIGN1c3RvbUNvbG9yc30gPSAoaW5wdXQgPz8ge30pIGFzIHtcbiAgICAgICAgbGF5ZXJJZDogc3RyaW5nO1xuICAgICAgICBudW1iZXJPZkNvbG9yczogbnVtYmVyO1xuICAgICAgICBjdXN0b21Db2xvcnM6IHN0cmluZ1tdO1xuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgZ3VhcmRzOiB0aGUgYnJpZGdlL3dlYk1DUCBjYWxsIGV4ZWN1dGUgd2l0aG91dCB6b2QgcGFyc2luZyxcbiAgICAgICAgLy8gc28gbWlzc2luZy93cm9uZy10eXBlZCBpbnB1dHMgbXVzdCBmYWlsIHdpdGggYWN0aW9uYWJsZSBlcnJvcnNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiBhIFR5cGVFcnJvciAoZS5nLiByZWFkaW5nIGAubGVuZ3RoYCBvZiB1bmRlZmluZWQpLlxuICAgICAgICBpZiAodHlwZW9mIGxheWVySWQgIT09ICdzdHJpbmcnIHx8IGxheWVySWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYXllcklkIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgbnVtYmVyT2ZDb2xvcnMgIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgIU51bWJlci5pc0ludGVnZXIobnVtYmVyT2ZDb2xvcnMpIHx8XG4gICAgICAgICAgbnVtYmVyT2ZDb2xvcnMgPD0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlck9mQ29sb3JzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc2NoZW1hL2Rlc2NyaXB0aW9uIHByb21pc2UgaGV4IGNvbG9ycyDigJQgYSBub24taGV4IHN0cmluZyB3b3VsZFxuICAgICAgICAvLyBwcm9kdWNlIGFuIGludmFsaWQgcGFsZXR0ZSBkb3duc3RyZWFtLCBzbyByZWplY3QgaXQgdXAgZnJvbnQgd2l0aCBhblxuICAgICAgICAvLyBhY3Rpb25hYmxlIGVycm9yIGluc3RlYWQgb2YgYSBjb25mdXNpbmcgcmVuZGVyLlxuICAgICAgICBjb25zdCBIRVhfQ09MT1JfUkUgPSAvXiMoWzAtOWEtZkEtRl17M318WzAtOWEtZkEtRl17Nn18WzAtOWEtZkEtRl17OH0pJC87XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShjdXN0b21Db2xvcnMpIHx8XG4gICAgICAgICAgY3VzdG9tQ29sb3JzLnNvbWUoYyA9PiB0eXBlb2YgYyAhPT0gJ3N0cmluZycgfHwgIUhFWF9DT0xPUl9SRS50ZXN0KGMpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnY3VzdG9tQ29sb3JzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IG9mIGhleCBjb2xvciBzdHJpbmdzIChlLmcuICNSUkdHQkIgb3IgI1JSR0dCQkFBKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc1N0YXRlID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IHZpc1N0YXRlLmxheWVycztcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciB3aXRoIGlkICR7bGF5ZXJJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyT2ZDb2xvcnMgIT09IGN1c3RvbUNvbG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGN1c3RvbUNvbG9ycyBhcnJheSBtdXN0IGNvbnRhaW4gZXhhY3RseSAke251bWJlck9mQ29sb3JzfSBjb2xvcnNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSAnY29sb3InO1xuICAgICAgICBjb25zdCBuZXdDb25maWcgPSB7fTtcblxuICAgICAgICBjb25zdCBvbGRDb2xvclJhbmdlID0gbGF5ZXIuY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlO1xuICAgICAgICBpZiAob2xkQ29sb3JSYW5nZS5jb2xvck1hcCAmJiBjdXN0b21Db2xvcnMubGVuZ3RoICE9PSBvbGRDb2xvclJhbmdlLmNvbG9yTWFwLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBMYXllciAke2xheWVySWR9IGhhcyAke29sZENvbG9yUmFuZ2UuY29sb3JNYXAubGVuZ3RofSBjbGFzc2VzIChjdXN0b20gY29sb3JNYXApOyBwcm92aWRlIGV4YWN0bHkgJHtvbGRDb2xvclJhbmdlLmNvbG9yTWFwLmxlbmd0aH0gY29sb3JzLCBnb3QgJHtjdXN0b21Db2xvcnMubGVuZ3RofS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdDb2xvclJhbmdlID0ge1xuICAgICAgICAgIC4uLm9sZENvbG9yUmFuZ2UsXG4gICAgICAgICAgY29sb3JzOiBjdXN0b21Db2xvcnMsXG4gICAgICAgICAgLi4uKG9sZENvbG9yUmFuZ2UuY29sb3JNYXBcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGNvbG9yTWFwOiBbXG4gICAgICAgICAgICAgICAgICAuLi5vbGRDb2xvclJhbmdlLmNvbG9yTWFwLm1hcCgoYzogYW55LCBpOiBudW1iZXIpID0+IFtjWzBdLCBjdXN0b21Db2xvcnNbaV1dKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgICAgICAgY29sb3JSYW5nZTogbmV3Q29sb3JSYW5nZSxcbiAgICAgICAgICBzdHJva2VDb2xvclJhbmdlOiBuZXdDb2xvclJhbmdlXG4gICAgICAgIH07XG5cbiAgICAgICAgY3R4LmRpc3BhdGNoKGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShsYXllciwgbmV3Q29uZmlnLCBjaGFubmVsLCBuZXdWaXNDb25maWcpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiB1cGRhdGVMYXllckNvbG9yQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiBgQ29sb3IgdXBkYXRlZCB0byAke2N1c3RvbUNvbG9ycy5qb2luKCcsICcpfSBmb3IgbGF5ZXIgJHtsYXllcklkfWB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdXBkYXRlTGF5ZXJDb2xvckNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdUcnkgdG8gZml4IHRoZSBlcnJvci4gSWYgdGhlIGVycm9yIHBlcnNpc3RzLCBhc2sgdGhlIHVzZXIgdG8gdHJ5IHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUFrRSxTQUFBRSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsR0FBQWEsT0FBQSxXQUFBZCxDQUFBLElBQUFFLE1BQUEsQ0FBQWdCLGNBQUEsQ0FBQW5CLENBQUEsRUFBQUMsQ0FBQSxFQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFOLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUQsQ0FBQSxJQUxsRTtBQUNBO0FBT08sSUFBTW9CLHlCQUF5QixHQUFBQyxPQUFBLENBQUFELHlCQUFBLEdBQUcsd0JBQWlDO0FBRW5FLFNBQVNFLDBCQUEwQkEsQ0FBQ0MsR0FBa0IsRUFBZTtFQUMxRSxPQUFPO0lBQ0xDLEVBQUUsRUFBRUoseUJBQXlCO0lBQzdCSyxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCQyxLQUFLLEVBQUUsS0FBSztJQUNaQyxXQUFXLEVBQUUsZ0RBQWdEO0lBQzdEQyxRQUFRLEVBQUU7TUFBQ0MsUUFBUSxFQUFFLEtBQUs7TUFBRUMsU0FBUyxFQUFFLEtBQUs7TUFBRUMsVUFBVSxFQUFFO0lBQUksQ0FBQztJQUMvREMsV0FBVyxFQUFFQyxNQUFDLENBQUNDLE1BQU0sQ0FBQztNQUNwQkMsT0FBTyxFQUFFRixNQUFDLENBQUNHLE1BQU0sQ0FBQyxDQUFDO01BQ25CQyxjQUFjLEVBQUVKLE1BQUMsQ0FBQ0ssTUFBTSxDQUFDLENBQUM7TUFDMUJDLFlBQVksRUFBRU4sTUFBQyxDQUNaTyxLQUFLLENBQUNQLE1BQUMsQ0FBQ0csTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNqQkssUUFBUSxDQUNQLDBIQUNGO0lBQ0osQ0FBQyxDQUFRO0lBQ1RDLE9BQU87TUFBQSxJQUFBQyxRQUFBLE9BQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBQyxRQUFPQyxRQUFRLEVBQUVDLEtBQUs7UUFBQSxJQUFBQyxJQUFBLEVBQUFmLE9BQUEsRUFBQUUsY0FBQSxFQUFBRSxZQUFBLEVBQUFZLFlBQUEsRUFBQUMsUUFBQSxFQUFBQyxNQUFBLEVBQUFDLEtBQUEsRUFBQUMsT0FBQSxFQUFBQyxTQUFBLEVBQUFDLGFBQUEsRUFBQUMsYUFBQSxFQUFBQyxZQUFBO1FBQUEsT0FBQWQsWUFBQSxZQUFBZSxJQUFBLFVBQUFDLFNBQUFDLFFBQUE7VUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtZQUFBO2NBQUFkLElBQUEsR0FDb0JELEtBQUssYUFBTEEsS0FBSyxjQUFMQSxLQUFLLEdBQUksQ0FBQyxDQUFDLEVBQXJEZCxPQUFPLEdBQUFlLElBQUEsQ0FBUGYsT0FBTyxFQUFFRSxjQUFjLEdBQUFhLElBQUEsQ0FBZGIsY0FBYyxFQUFFRSxZQUFZLEdBQUFXLElBQUEsQ0FBWlgsWUFBWTtjQUFBdUIsUUFBQSxDQUFBQyxJQUFBO2NBQUEsTUFTdEMsT0FBTzVCLE9BQU8sS0FBSyxRQUFRLElBQUlBLE9BQU8sQ0FBQ3JCLE1BQU0sS0FBSyxDQUFDO2dCQUFBZ0QsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUMvQyxJQUFJQyxLQUFLLENBQUMsMkNBQTJDLENBQUM7WUFBQTtjQUFBLE1BRzVELE9BQU81QixjQUFjLEtBQUssUUFBUSxJQUNsQyxDQUFDNkIsTUFBTSxDQUFDQyxTQUFTLENBQUM5QixjQUFjLENBQUMsSUFDakNBLGNBQWMsSUFBSSxDQUFDO2dCQUFBeUIsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUViLElBQUlDLEtBQUssQ0FBQyw0REFBNEQsQ0FBQztZQUFBO2NBRS9FO2NBQ0E7Y0FDQTtjQUNNZCxZQUFZLEdBQUcsbURBQW1EO2NBQUEsTUFFdEUsQ0FBQ2lCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDOUIsWUFBWSxDQUFDLElBQzVCQSxZQUFZLENBQUMrQixJQUFJLENBQUMsVUFBQUMsQ0FBQztnQkFBQSxPQUFJLE9BQU9BLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQ3BCLFlBQVksQ0FBQ3FCLElBQUksQ0FBQ0QsQ0FBQyxDQUFDO2NBQUEsRUFBQztnQkFBQVQsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUVoRSxJQUFJQyxLQUFLLENBQ2IsaUdBQ0YsQ0FBQztZQUFBO2NBR0diLFFBQVEsR0FBRzdCLEdBQUcsQ0FBQ2tELFdBQVcsQ0FBQyxDQUFDO2NBQzVCcEIsTUFBTSxHQUFHRCxRQUFRLENBQUNDLE1BQU07Y0FDeEJDLEtBQUssR0FBR0QsTUFBTSxDQUFDcUIsSUFBSSxDQUFDLFVBQUFDLENBQUM7Z0JBQUEsT0FBSUEsQ0FBQyxDQUFDbkQsRUFBRSxLQUFLVyxPQUFPO2NBQUEsRUFBQztjQUFBLElBQzNDbUIsS0FBSztnQkFBQVEsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUNGLElBQUlDLEtBQUssa0JBQUFXLE1BQUEsQ0FBa0J6QyxPQUFPLGVBQVksQ0FBQztZQUFBO2NBQUEsTUFHbkRFLGNBQWMsS0FBS0UsWUFBWSxDQUFDekIsTUFBTTtnQkFBQWdELFFBQUEsQ0FBQUUsSUFBQTtnQkFBQTtjQUFBO2NBQUEsTUFDbEMsSUFBSUMsS0FBSyw0Q0FBQVcsTUFBQSxDQUE0Q3ZDLGNBQWMsWUFBUyxDQUFDO1lBQUE7Y0FHL0VrQixPQUFPLEdBQUcsT0FBTztjQUNqQkMsU0FBUyxHQUFHLENBQUMsQ0FBQztjQUVkQyxhQUFhLEdBQUdILEtBQUssQ0FBQ3VCLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxVQUFVO2NBQUEsTUFDbkR0QixhQUFhLENBQUN1QixRQUFRLElBQUl6QyxZQUFZLENBQUN6QixNQUFNLEtBQUsyQyxhQUFhLENBQUN1QixRQUFRLENBQUNsRSxNQUFNO2dCQUFBZ0QsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUMzRSxJQUFJQyxLQUFLLFVBQUFXLE1BQUEsQ0FDSnpDLE9BQU8sV0FBQXlDLE1BQUEsQ0FBUW5CLGFBQWEsQ0FBQ3VCLFFBQVEsQ0FBQ2xFLE1BQU0sa0RBQUE4RCxNQUFBLENBQStDbkIsYUFBYSxDQUFDdUIsUUFBUSxDQUFDbEUsTUFBTSxtQkFBQThELE1BQUEsQ0FBZ0JyQyxZQUFZLENBQUN6QixNQUFNLE1BQ3RLLENBQUM7WUFBQTtjQUVHNEMsYUFBYSxHQUFBOUMsYUFBQSxDQUFBQSxhQUFBLEtBQ2Q2QyxhQUFhO2dCQUNoQndCLE1BQU0sRUFBRTFDO2NBQVksR0FDaEJrQixhQUFhLENBQUN1QixRQUFRLEdBQ3RCO2dCQUNFQSxRQUFRLE1BQUFFLG1CQUFBLGFBQ0h6QixhQUFhLENBQUN1QixRQUFRLENBQUNHLEdBQUcsQ0FBQyxVQUFDWixDQUFNLEVBQUVhLENBQVM7a0JBQUEsT0FBSyxDQUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVoQyxZQUFZLENBQUM2QyxDQUFDLENBQUMsQ0FBQztnQkFBQSxFQUFDO2NBRWpGLENBQUMsR0FDRCxDQUFDLENBQUM7Y0FHRnpCLFlBQVksR0FBRztnQkFDbkJvQixVQUFVLEVBQUVyQixhQUFhO2dCQUN6QjJCLGdCQUFnQixFQUFFM0I7Y0FDcEIsQ0FBQztjQUVEbkMsR0FBRyxDQUFDK0QsUUFBUSxDQUFDLElBQUFDLHVDQUE4QixFQUFDakMsS0FBSyxFQUFFRSxTQUFTLEVBQUVELE9BQU8sRUFBRUksWUFBWSxDQUFDLENBQUM7Y0FBQyxPQUFBRyxRQUFBLENBQUEwQixNQUFBLFdBRS9FO2dCQUNMQyxPQUFPLEVBQUUsSUFBSTtnQkFDYkMsU0FBUyxFQUFFdEUseUJBQXlCO2dCQUNwQ3VFLElBQUksRUFBRTtrQkFBQ0MsT0FBTyxzQkFBQWhCLE1BQUEsQ0FBc0JyQyxZQUFZLENBQUNzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFBakIsTUFBQSxDQUFjekMsT0FBTztnQkFBRTtjQUNwRixDQUFDO1lBQUE7Y0FBQTJCLFFBQUEsQ0FBQUMsSUFBQTtjQUFBRCxRQUFBLENBQUFnQyxFQUFBLEdBQUFoQyxRQUFBO2NBQUEsT0FBQUEsUUFBQSxDQUFBMEIsTUFBQSxXQUVNO2dCQUNMQyxPQUFPLEVBQUUsS0FBSztnQkFDZEMsU0FBUyxFQUFFdEUseUJBQXlCO2dCQUNwQzJFLEtBQUssRUFBRWpDLFFBQUEsQ0FBQWdDLEVBQUEsWUFBaUI3QixLQUFLLEdBQUdILFFBQUEsQ0FBQWdDLEVBQUEsQ0FBTUUsT0FBTyxHQUFHLGVBQWU7Z0JBQy9ETCxJQUFJLEVBQUU7a0JBQ0pNLFdBQVcsRUFDVDtnQkFDSjtjQUNGLENBQUM7WUFBQTtZQUFBO2NBQUEsT0FBQW5DLFFBQUEsQ0FBQW9DLElBQUE7VUFBQTtRQUFBLEdBQUFuRCxPQUFBO01BQUEsQ0FFSjtNQUFBLFNBeEZETCxPQUFPQSxDQUFBeUQsRUFBQSxFQUFBQyxHQUFBO1FBQUEsT0FBQXpELFFBQUEsQ0FBQWhDLEtBQUEsT0FBQUUsU0FBQTtNQUFBO01BQUEsT0FBUDZCLE9BQU87SUFBQTtFQXlGVCxDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getLoadDataCommand = getLoadDataCommand;
8
+ exports.loadDataCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _zod = require("zod");
12
+ var _actions = require("@kepler.gl/actions");
13
+ var _processors = require("@kepler.gl/processors");
14
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
15
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
16
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
17
+ // Copyright contributors to the kepler.gl project
18
+ // MIME type → file extension for data URLs, so a `data:text/csv;base64,...`
19
+ // payload gets a sensible default dataset name (`data.csv`) instead of `data`.
20
+ var DATA_URL_EXTENSIONS = {
21
+ 'text/csv': '.csv',
22
+ 'application/csv': '.csv',
23
+ 'application/json': '.json',
24
+ 'application/geo+json': '.geojson',
25
+ 'application/vnd.apache.arrow.file': '.arrow',
26
+ 'application/vnd.apache.parquet': '.parquet',
27
+ 'text/plain': '.txt'
28
+ };
29
+ function fileNameFromDataUrl(parsedUrl) {
30
+ var _DATA_URL_EXTENSIONS$;
31
+ // data:text/csv;base64,... → pathname is "text/csv;base64,"
32
+ var mime = parsedUrl.pathname.split(';')[0].toLowerCase();
33
+ return "data".concat((_DATA_URL_EXTENSIONS$ = DATA_URL_EXTENSIONS[mime]) !== null && _DATA_URL_EXTENSIONS$ !== void 0 ? _DATA_URL_EXTENSIONS$ : '');
34
+ }
35
+
36
+ // Same 32-bit string hash the processors use for dataset ids — applied to a
37
+ // data URL's content so the dataset id is content-derived (unique per payload)
38
+ // without storing the whole (potentially large) data URL in the metadata.
39
+ function hashString(str) {
40
+ var hash = 0;
41
+ for (var i = 0; i < str.length; i++) {
42
+ // eslint-disable-next-line no-bitwise
43
+ hash = (hash << 5) - hash + str.charCodeAt(i);
44
+ // eslint-disable-next-line no-bitwise
45
+ hash |= 0;
46
+ }
47
+ return hash.toString(36);
48
+ }
49
+ var loadDataCommandId = exports.loadDataCommandId = 'map.load-data';
50
+ function getLoadDataCommand(ctx) {
51
+ return {
52
+ id: loadDataCommandId,
53
+ name: 'Load data from URL',
54
+ group: 'Map',
55
+ description: 'Load a dataset from a URL into kepler.gl. The dataset is named after the URL filename, ' + 'or after `datasetName` when provided. Does NOT create a layer — call map.add-layer to visualize. ' + 'Do NOT create a duplicate dataset (e.g. via map.create-table) just to rename it; ' + 'name it here with `datasetName` instead, or use the URL-filename dataset as-is. ' + 'LOCAL FILES: a local file must be served over http(s) — the browser cannot fetch ' + "`file://` paths. To load a file you have on disk: (1) copy it into the demo app's " + 'served directory (e.g. `examples/demo-app/dist/`) and pass `/filename.csv`, or ' + '(2) serve it with a CORS-enabled local server (`npx serve --cors -l 8000` in the ' + "file's folder) and pass `http://localhost:8000/filename.csv`. " + 'EMBEDDED CONTENT: if you have the file content but cannot serve it (e.g. a remote ' + 'browser context), pass it as a data URL — `data:text/csv;base64,<base64 content>` ' + '(encode with `base64 -i file.csv`). Works for small files (up to ~2MB). ' + 'LARGE DATASETS: for files over a few MB, prefer Parquet (.parquet) over GeoJSON/CSV — ' + 'it loads much faster and is less likely to time out. Convert GeoJSON to GeoParquet ' + 'with geopandas (`gdf.to_parquet("data.parquet")`); kepler reads GeoParquet geometry (WKB) natively.',
56
+ metadata: {
57
+ readOnly: false,
58
+ riskLevel: 'medium',
59
+ requiresConfirmation: true
60
+ },
61
+ inputSchema: _zod.z.object({
62
+ url: _zod.z.string().describe('The URL to load data from. May be a full http(s) URL, a path served by the demo app ' + '(e.g. /data.geojson), or a data URL embedding small file content (data:text/csv;base64,...).'),
63
+ datasetName: _zod.z.string().optional().describe('Optional name for the loaded dataset. If omitted, the URL filename is used. ' + 'Use this instead of creating a duplicate dataset to rename it.')
64
+ }),
65
+ execute: function () {
66
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(execCtx, input) {
67
+ var _ref, url, datasetName, _visState$loaders, _visState$loadOptions, _parsedData$, hasScheme, pageOrigin, parsedUrl, MAX_DATA_URL_LENGTH, visState, response, reason, blob, fileName, file, sourceUrl, batches, result, content, parsedData, _iterator, _step, d, _ref2, dataInfo;
68
+ return _regenerator["default"].wrap(function _callee$(_context) {
69
+ while (1) switch (_context.prev = _context.next) {
70
+ case 0:
71
+ _ref = input !== null && input !== void 0 ? input : {}, url = _ref.url, datasetName = _ref.datasetName;
72
+ _context.prev = 1;
73
+ if (!(typeof url !== 'string' || url.trim() === '')) {
74
+ _context.next = 4;
75
+ break;
76
+ }
77
+ throw new Error("Invalid URL: ".concat(url));
78
+ case 4:
79
+ // Resolve the URL before validating the scheme. A scheme-less string is
80
+ // a relative reference — resolve it against the page origin so files
81
+ // served by the demo app itself (same-origin) can be loaded with a bare
82
+ // path (e.g. `/sf_streets.geojson`). Browsers cannot fetch `file://`
83
+ // URLs, so a local file must be served over http(s) by the page's own
84
+ // server (or a CORS-enabled local server). `data:` URLs are allowed for
85
+ // small files — they embed the content directly, which is the one way
86
+ // an agent in a remote browser context can load a local file it cannot
87
+ // serve. `javascript:` and other schemes are rejected.
88
+ hasScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url);
89
+ pageOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;
90
+ _context.prev = 6;
91
+ parsedUrl = hasScheme ? new URL(url) : new URL(url, pageOrigin);
92
+ _context.next = 13;
93
+ break;
94
+ case 10:
95
+ _context.prev = 10;
96
+ _context.t0 = _context["catch"](6);
97
+ throw new Error("Invalid URL: ".concat(url));
98
+ case 13:
99
+ if (!(parsedUrl.protocol === 'data:')) {
100
+ _context.next = 19;
101
+ break;
102
+ }
103
+ // Cap the size so a huge embedded payload can't stall the load or
104
+ // bloat the tool input. For larger files the agent should serve the
105
+ // file over http(s) or convert to Parquet instead.
106
+ MAX_DATA_URL_LENGTH = 2 * 1024 * 1024; // ~2MB of base64
107
+ if (!(parsedUrl.href.length > MAX_DATA_URL_LENGTH)) {
108
+ _context.next = 17;
109
+ break;
110
+ }
111
+ throw new Error("Data URL is too large (".concat(parsedUrl.href.length, " chars). ") + 'For files over a few MB, serve the file over http(s) or convert to Parquet.');
112
+ case 17:
113
+ _context.next = 21;
114
+ break;
115
+ case 19:
116
+ if (!(parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:')) {
117
+ _context.next = 21;
118
+ break;
119
+ }
120
+ throw new Error("Unsupported URL scheme \"".concat(parsedUrl.protocol, "\". Only http(s) URLs are supported."));
121
+ case 21:
122
+ visState = ctx.getVisState(); // Thread the caller's AbortSignal into the fetch so WebMCP/bridge
123
+ // cancellations stop long-running loads instead of letting them hang.
124
+ _context.next = 24;
125
+ return fetch(parsedUrl.href, {
126
+ signal: execCtx === null || execCtx === void 0 ? void 0 : execCtx.signal
127
+ });
128
+ case 24:
129
+ response = _context.sent;
130
+ if (response.ok) {
131
+ _context.next = 28;
132
+ break;
133
+ }
134
+ // Include the numeric status — statusText is often empty (e.g. some
135
+ // CDNs / error pages), and the code alone makes failures diagnosable.
136
+ reason = response.statusText ? "HTTP ".concat(response.status, " ").concat(response.statusText) : "HTTP ".concat(response.status);
137
+ throw new Error("Failed to fetch data from ".concat(parsedUrl.href, ": ").concat(reason));
138
+ case 28:
139
+ _context.next = 30;
140
+ return response.blob();
141
+ case 30:
142
+ blob = _context.sent;
143
+ // Derive the filename from the URL pathname so query strings (e.g.
144
+ // `data.csv?x=1`) don't end up in the dataset name. A data URL has no
145
+ // pathname — fall back to a name derived from its MIME type so the
146
+ // dataset gets a sensible default label (e.g. `data.csv`).
147
+ fileName = parsedUrl.protocol === 'data:' ? fileNameFromDataUrl(parsedUrl) : parsedUrl.pathname.split('/').pop() || 'data'; // Carry the Blob's MIME type into the File so loader selection in
148
+ // readFileInBatches can use it — a URL with no extension (or a
149
+ // misleading one) would otherwise leave file.type empty and fail to
150
+ // pick the right loader.
151
+ file = new File([blob], fileName, {
152
+ type: blob.type || undefined
153
+ }); // Preserve the source URL so processors hash by URL (avoiding dataset-id
154
+ // collisions between same-named files) and can attach externally-hosted
155
+ // metadata — mirrors loadExternallyHostedDataset. Use the RESOLVED href
156
+ // so a relative path and its absolute form hash to the same dataset id.
157
+ // For a data URL the href IS the content (potentially large) — hash it
158
+ // down so the id stays content-derived (unique per payload) without
159
+ // storing the whole payload in the dataset metadata.
160
+ sourceUrl = parsedUrl.protocol === 'data:' ? "data:".concat(hashString(parsedUrl.href)) : parsedUrl.href;
161
+ file.keplerSourceUrl = sourceUrl;
162
+ _context.next = 37;
163
+ return (0, _processors.readFileInBatches)({
164
+ file: file,
165
+ fileCache: [],
166
+ loaders: (_visState$loaders = visState.loaders) !== null && _visState$loaders !== void 0 ? _visState$loaders : [],
167
+ loadOptions: (_visState$loadOptions = visState.loadOptions) !== null && _visState$loadOptions !== void 0 ? _visState$loadOptions : {}
168
+ });
169
+ case 37:
170
+ batches = _context.sent;
171
+ _context.next = 40;
172
+ return batches.next();
173
+ case 40:
174
+ result = _context.sent;
175
+ content = {
176
+ data: [],
177
+ fileName: ''
178
+ };
179
+ parsedData = [];
180
+ case 43:
181
+ if (result.done) {
182
+ _context.next = 55;
183
+ break;
184
+ }
185
+ content = result.value;
186
+ _context.next = 47;
187
+ return batches.next();
188
+ case 47:
189
+ result = _context.sent;
190
+ if (!result.done) {
191
+ _context.next = 53;
192
+ break;
193
+ }
194
+ _context.next = 51;
195
+ return (0, _processors.processFileData)({
196
+ content: content,
197
+ fileCache: []
198
+ });
199
+ case 51:
200
+ parsedData = _context.sent;
201
+ return _context.abrupt("break", 55);
202
+ case 53:
203
+ _context.next = 43;
204
+ break;
205
+ case 55:
206
+ if (!(parsedData.length === 0)) {
207
+ _context.next = 57;
208
+ break;
209
+ }
210
+ throw new Error("No data could be parsed from ".concat(url, "."));
211
+ case 57:
212
+ // Apply a caller-chosen dataset name (default: the URL filename) so the
213
+ // agent never has to create a duplicate dataset just to rename it.
214
+ _iterator = _createForOfIteratorHelper(parsedData);
215
+ try {
216
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
217
+ d = _step.value;
218
+ if (d !== null && d !== void 0 && d.info) {
219
+ d.info.label = (_ref2 = datasetName !== null && datasetName !== void 0 ? datasetName : d.info.label) !== null && _ref2 !== void 0 ? _ref2 : fileName;
220
+ }
221
+ }
222
+ } catch (err) {
223
+ _iterator.e(err);
224
+ } finally {
225
+ _iterator.f();
226
+ }
227
+ ctx.dispatch((0, _actions.addDataToMap)({
228
+ datasets: parsedData,
229
+ // Do NOT auto-create a layer — the assistant creates the layer
230
+ // explicitly via `map.add-layer` (with full styling control), so
231
+ // loading data never produces a duplicate default layer.
232
+ options: {
233
+ autoCreateLayers: false,
234
+ centerMap: true
235
+ }
236
+ }));
237
+ dataInfo = (_parsedData$ = parsedData[0]) === null || _parsedData$ === void 0 ? void 0 : _parsedData$.info;
238
+ return _context.abrupt("return", {
239
+ success: true,
240
+ commandId: loadDataCommandId,
241
+ data: {
242
+ details: "Successfully loaded data from ".concat(url),
243
+ dataInfo: dataInfo
244
+ }
245
+ });
246
+ case 64:
247
+ _context.prev = 64;
248
+ _context.t1 = _context["catch"](1);
249
+ return _context.abrupt("return", {
250
+ success: false,
251
+ commandId: loadDataCommandId,
252
+ error: _context.t1 instanceof Error ? _context.t1.message : 'Unknown error',
253
+ data: {
254
+ instruction: 'Try to fix the error. If the error persists, ask the user to try with a different URL or format.'
255
+ }
256
+ });
257
+ case 67:
258
+ case "end":
259
+ return _context.stop();
260
+ }
261
+ }, _callee, null, [[1, 64], [6, 10]]);
262
+ }));
263
+ function execute(_x, _x2) {
264
+ return _execute.apply(this, arguments);
265
+ }
266
+ return execute;
267
+ }()
268
+ };
269
+ }
270
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3Byb2Nlc3NvcnMiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIkRBVEFfVVJMX0VYVEVOU0lPTlMiLCJmaWxlTmFtZUZyb21EYXRhVXJsIiwicGFyc2VkVXJsIiwiX0RBVEFfVVJMX0VYVEVOU0lPTlMkIiwibWltZSIsInBhdGhuYW1lIiwic3BsaXQiLCJ0b0xvd2VyQ2FzZSIsImNvbmNhdCIsImhhc2hTdHJpbmciLCJzdHIiLCJoYXNoIiwiaSIsImNoYXJDb2RlQXQiLCJsb2FkRGF0YUNvbW1hbmRJZCIsImV4cG9ydHMiLCJnZXRMb2FkRGF0YUNvbW1hbmQiLCJjdHgiLCJpZCIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwicmVxdWlyZXNDb25maXJtYXRpb24iLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJ1cmwiLCJzdHJpbmciLCJkZXNjcmliZSIsImRhdGFzZXROYW1lIiwib3B0aW9uYWwiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImV4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJfdmlzU3RhdGUkbG9hZGVycyIsIl92aXNTdGF0ZSRsb2FkT3B0aW9ucyIsIl9wYXJzZWREYXRhJCIsImhhc1NjaGVtZSIsInBhZ2VPcmlnaW4iLCJNQVhfREFUQV9VUkxfTEVOR1RIIiwidmlzU3RhdGUiLCJyZXNwb25zZSIsInJlYXNvbiIsImJsb2IiLCJmaWxlTmFtZSIsImZpbGUiLCJzb3VyY2VVcmwiLCJiYXRjaGVzIiwicmVzdWx0IiwiY29udGVudCIsInBhcnNlZERhdGEiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImQiLCJfcmVmMiIsImRhdGFJbmZvIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwidHJpbSIsIkVycm9yIiwid2luZG93IiwibG9jYXRpb24iLCJvcmlnaW4iLCJ1bmRlZmluZWQiLCJVUkwiLCJ0MCIsInByb3RvY29sIiwiaHJlZiIsImdldFZpc1N0YXRlIiwiZmV0Y2giLCJzaWduYWwiLCJzZW50Iiwib2siLCJzdGF0dXNUZXh0Iiwic3RhdHVzIiwicG9wIiwiRmlsZSIsInR5cGUiLCJrZXBsZXJTb3VyY2VVcmwiLCJyZWFkRmlsZUluQmF0Y2hlcyIsImZpbGVDYWNoZSIsImxvYWRlcnMiLCJsb2FkT3B0aW9ucyIsImRhdGEiLCJwcm9jZXNzRmlsZURhdGEiLCJhYnJ1cHQiLCJpbmZvIiwibGFiZWwiLCJlcnIiLCJkaXNwYXRjaCIsImFkZERhdGFUb01hcCIsImRhdGFzZXRzIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsInQxIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9sb2FkLWRhdGEtY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge3JlYWRGaWxlSW5CYXRjaGVzLCBwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQgdHlwZSB7UHJvY2Vzc0ZpbGVEYXRhQ29udGVudH0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuLy8gTUlNRSB0eXBlIOKGkiBmaWxlIGV4dGVuc2lvbiBmb3IgZGF0YSBVUkxzLCBzbyBhIGBkYXRhOnRleHQvY3N2O2Jhc2U2NCwuLi5gXG4vLyBwYXlsb2FkIGdldHMgYSBzZW5zaWJsZSBkZWZhdWx0IGRhdGFzZXQgbmFtZSAoYGRhdGEuY3N2YCkgaW5zdGVhZCBvZiBgZGF0YWAuXG5jb25zdCBEQVRBX1VSTF9FWFRFTlNJT05TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAndGV4dC9jc3YnOiAnLmNzdicsXG4gICdhcHBsaWNhdGlvbi9jc3YnOiAnLmNzdicsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogJy5qc29uJyxcbiAgJ2FwcGxpY2F0aW9uL2dlbytqc29uJzogJy5nZW9qc29uJyxcbiAgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUuYXJyb3cuZmlsZSc6ICcuYXJyb3cnLFxuICAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS5wYXJxdWV0JzogJy5wYXJxdWV0JyxcbiAgJ3RleHQvcGxhaW4nOiAnLnR4dCdcbn07XG5cbmZ1bmN0aW9uIGZpbGVOYW1lRnJvbURhdGFVcmwocGFyc2VkVXJsOiBVUkwpOiBzdHJpbmcge1xuICAvLyBkYXRhOnRleHQvY3N2O2Jhc2U2NCwuLi4g4oaSIHBhdGhuYW1lIGlzIFwidGV4dC9jc3Y7YmFzZTY0LFwiXG4gIGNvbnN0IG1pbWUgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoJzsnKVswXS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gYGRhdGEke0RBVEFfVVJMX0VYVEVOU0lPTlNbbWltZV0gPz8gJyd9YDtcbn1cblxuLy8gU2FtZSAzMi1iaXQgc3RyaW5nIGhhc2ggdGhlIHByb2Nlc3NvcnMgdXNlIGZvciBkYXRhc2V0IGlkcyDigJQgYXBwbGllZCB0byBhXG4vLyBkYXRhIFVSTCdzIGNvbnRlbnQgc28gdGhlIGRhdGFzZXQgaWQgaXMgY29udGVudC1kZXJpdmVkICh1bmlxdWUgcGVyIHBheWxvYWQpXG4vLyB3aXRob3V0IHN0b3JpbmcgdGhlIHdob2xlIChwb3RlbnRpYWxseSBsYXJnZSkgZGF0YSBVUkwgaW4gdGhlIG1ldGFkYXRhLlxuZnVuY3Rpb24gaGFzaFN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoYXNoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGhhc2ggfD0gMDtcbiAgfVxuICByZXR1cm4gaGFzaC50b1N0cmluZygzNik7XG59XG5cbmV4cG9ydCBjb25zdCBsb2FkRGF0YUNvbW1hbmRJZCA9ICdtYXAubG9hZC1kYXRhJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWREYXRhQ29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGxvYWREYXRhQ29tbWFuZElkLFxuICAgIG5hbWU6ICdMb2FkIGRhdGEgZnJvbSBVUkwnLFxuICAgIGdyb3VwOiAnTWFwJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdMb2FkIGEgZGF0YXNldCBmcm9tIGEgVVJMIGludG8ga2VwbGVyLmdsLiBUaGUgZGF0YXNldCBpcyBuYW1lZCBhZnRlciB0aGUgVVJMIGZpbGVuYW1lLCAnICtcbiAgICAgICdvciBhZnRlciBgZGF0YXNldE5hbWVgIHdoZW4gcHJvdmlkZWQuIERvZXMgTk9UIGNyZWF0ZSBhIGxheWVyIOKAlCBjYWxsIG1hcC5hZGQtbGF5ZXIgdG8gdmlzdWFsaXplLiAnICtcbiAgICAgICdEbyBOT1QgY3JlYXRlIGEgZHVwbGljYXRlIGRhdGFzZXQgKGUuZy4gdmlhIG1hcC5jcmVhdGUtdGFibGUpIGp1c3QgdG8gcmVuYW1lIGl0OyAnICtcbiAgICAgICduYW1lIGl0IGhlcmUgd2l0aCBgZGF0YXNldE5hbWVgIGluc3RlYWQsIG9yIHVzZSB0aGUgVVJMLWZpbGVuYW1lIGRhdGFzZXQgYXMtaXMuICcgK1xuICAgICAgJ0xPQ0FMIEZJTEVTOiBhIGxvY2FsIGZpbGUgbXVzdCBiZSBzZXJ2ZWQgb3ZlciBodHRwKHMpIOKAlCB0aGUgYnJvd3NlciBjYW5ub3QgZmV0Y2ggJyArXG4gICAgICBcImBmaWxlOi8vYCBwYXRocy4gVG8gbG9hZCBhIGZpbGUgeW91IGhhdmUgb24gZGlzazogKDEpIGNvcHkgaXQgaW50byB0aGUgZGVtbyBhcHAncyBcIiArXG4gICAgICAnc2VydmVkIGRpcmVjdG9yeSAoZS5nLiBgZXhhbXBsZXMvZGVtby1hcHAvZGlzdC9gKSBhbmQgcGFzcyBgL2ZpbGVuYW1lLmNzdmAsIG9yICcgK1xuICAgICAgJygyKSBzZXJ2ZSBpdCB3aXRoIGEgQ09SUy1lbmFibGVkIGxvY2FsIHNlcnZlciAoYG5weCBzZXJ2ZSAtLWNvcnMgLWwgODAwMGAgaW4gdGhlICcgK1xuICAgICAgXCJmaWxlJ3MgZm9sZGVyKSBhbmQgcGFzcyBgaHR0cDovL2xvY2FsaG9zdDo4MDAwL2ZpbGVuYW1lLmNzdmAuIFwiICtcbiAgICAgICdFTUJFRERFRCBDT05URU5UOiBpZiB5b3UgaGF2ZSB0aGUgZmlsZSBjb250ZW50IGJ1dCBjYW5ub3Qgc2VydmUgaXQgKGUuZy4gYSByZW1vdGUgJyArXG4gICAgICAnYnJvd3NlciBjb250ZXh0KSwgcGFzcyBpdCBhcyBhIGRhdGEgVVJMIOKAlCBgZGF0YTp0ZXh0L2NzdjtiYXNlNjQsPGJhc2U2NCBjb250ZW50PmAgJyArXG4gICAgICAnKGVuY29kZSB3aXRoIGBiYXNlNjQgLWkgZmlsZS5jc3ZgKS4gV29ya3MgZm9yIHNtYWxsIGZpbGVzICh1cCB0byB+Mk1CKS4gJyArXG4gICAgICAnTEFSR0UgREFUQVNFVFM6IGZvciBmaWxlcyBvdmVyIGEgZmV3IE1CLCBwcmVmZXIgUGFycXVldCAoLnBhcnF1ZXQpIG92ZXIgR2VvSlNPTi9DU1Yg4oCUICcgK1xuICAgICAgJ2l0IGxvYWRzIG11Y2ggZmFzdGVyIGFuZCBpcyBsZXNzIGxpa2VseSB0byB0aW1lIG91dC4gQ29udmVydCBHZW9KU09OIHRvIEdlb1BhcnF1ZXQgJyArXG4gICAgICAnd2l0aCBnZW9wYW5kYXMgKGBnZGYudG9fcGFycXVldChcImRhdGEucGFycXVldFwiKWApOyBrZXBsZXIgcmVhZHMgR2VvUGFycXVldCBnZW9tZXRyeSAoV0tCKSBuYXRpdmVseS4nLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdtZWRpdW0nLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHVybDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICdUaGUgVVJMIHRvIGxvYWQgZGF0YSBmcm9tLiBNYXkgYmUgYSBmdWxsIGh0dHAocykgVVJMLCBhIHBhdGggc2VydmVkIGJ5IHRoZSBkZW1vIGFwcCAnICtcbiAgICAgICAgICAgICcoZS5nLiAvZGF0YS5nZW9qc29uKSwgb3IgYSBkYXRhIFVSTCBlbWJlZGRpbmcgc21hbGwgZmlsZSBjb250ZW50IChkYXRhOnRleHQvY3N2O2Jhc2U2NCwuLi4pLidcbiAgICAgICAgKSxcbiAgICAgIGRhdGFzZXROYW1lOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ09wdGlvbmFsIG5hbWUgZm9yIHRoZSBsb2FkZWQgZGF0YXNldC4gSWYgb21pdHRlZCwgdGhlIFVSTCBmaWxlbmFtZSBpcyB1c2VkLiAnICtcbiAgICAgICAgICAgICdVc2UgdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgZHVwbGljYXRlIGRhdGFzZXQgdG8gcmVuYW1lIGl0LidcbiAgICAgICAgKVxuICAgIH0pIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHt1cmwsIGRhdGFzZXROYW1lfSA9IChpbnB1dCA/PyB7fSkgYXMge3VybDogc3RyaW5nOyBkYXRhc2V0TmFtZT86IHN0cmluZ307XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdXJsLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVVJMOiAke3VybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIFVSTCBiZWZvcmUgdmFsaWRhdGluZyB0aGUgc2NoZW1lLiBBIHNjaGVtZS1sZXNzIHN0cmluZyBpc1xuICAgICAgICAvLyBhIHJlbGF0aXZlIHJlZmVyZW5jZSDigJQgcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSBwYWdlIG9yaWdpbiBzbyBmaWxlc1xuICAgICAgICAvLyBzZXJ2ZWQgYnkgdGhlIGRlbW8gYXBwIGl0c2VsZiAoc2FtZS1vcmlnaW4pIGNhbiBiZSBsb2FkZWQgd2l0aCBhIGJhcmVcbiAgICAgICAgLy8gcGF0aCAoZS5nLiBgL3NmX3N0cmVldHMuZ2VvanNvbmApLiBCcm93c2VycyBjYW5ub3QgZmV0Y2ggYGZpbGU6Ly9gXG4gICAgICAgIC8vIFVSTHMsIHNvIGEgbG9jYWwgZmlsZSBtdXN0IGJlIHNlcnZlZCBvdmVyIGh0dHAocykgYnkgdGhlIHBhZ2UncyBvd25cbiAgICAgICAgLy8gc2VydmVyIChvciBhIENPUlMtZW5hYmxlZCBsb2NhbCBzZXJ2ZXIpLiBgZGF0YTpgIFVSTHMgYXJlIGFsbG93ZWQgZm9yXG4gICAgICAgIC8vIHNtYWxsIGZpbGVzIOKAlCB0aGV5IGVtYmVkIHRoZSBjb250ZW50IGRpcmVjdGx5LCB3aGljaCBpcyB0aGUgb25lIHdheVxuICAgICAgICAvLyBhbiBhZ2VudCBpbiBhIHJlbW90ZSBicm93c2VyIGNvbnRleHQgY2FuIGxvYWQgYSBsb2NhbCBmaWxlIGl0IGNhbm5vdFxuICAgICAgICAvLyBzZXJ2ZS4gYGphdmFzY3JpcHQ6YCBhbmQgb3RoZXIgc2NoZW1lcyBhcmUgcmVqZWN0ZWQuXG4gICAgICAgIGNvbnN0IGhhc1NjaGVtZSA9IC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6Ly50ZXN0KHVybCk7XG4gICAgICAgIGNvbnN0IHBhZ2VPcmlnaW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBwYXJzZWRVcmw6IFVSTDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWRVcmwgPSBoYXNTY2hlbWUgPyBuZXcgVVJMKHVybCkgOiBuZXcgVVJMKHVybCwgcGFnZU9yaWdpbik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkw6ICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdkYXRhOicpIHtcbiAgICAgICAgICAvLyBDYXAgdGhlIHNpemUgc28gYSBodWdlIGVtYmVkZGVkIHBheWxvYWQgY2FuJ3Qgc3RhbGwgdGhlIGxvYWQgb3JcbiAgICAgICAgICAvLyBibG9hdCB0aGUgdG9vbCBpbnB1dC4gRm9yIGxhcmdlciBmaWxlcyB0aGUgYWdlbnQgc2hvdWxkIHNlcnZlIHRoZVxuICAgICAgICAgIC8vIGZpbGUgb3ZlciBodHRwKHMpIG9yIGNvbnZlcnQgdG8gUGFycXVldCBpbnN0ZWFkLlxuICAgICAgICAgIGNvbnN0IE1BWF9EQVRBX1VSTF9MRU5HVEggPSAyICogMTAyNCAqIDEwMjQ7IC8vIH4yTUIgb2YgYmFzZTY0XG4gICAgICAgICAgaWYgKHBhcnNlZFVybC5ocmVmLmxlbmd0aCA+IE1BWF9EQVRBX1VSTF9MRU5HVEgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYERhdGEgVVJMIGlzIHRvbyBsYXJnZSAoJHtwYXJzZWRVcmwuaHJlZi5sZW5ndGh9IGNoYXJzKS4gYCArXG4gICAgICAgICAgICAgICAgJ0ZvciBmaWxlcyBvdmVyIGEgZmV3IE1CLCBzZXJ2ZSB0aGUgZmlsZSBvdmVyIGh0dHAocykgb3IgY29udmVydCB0byBQYXJxdWV0LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZFVybC5wcm90b2NvbCAhPT0gJ2h0dHA6JyAmJiBwYXJzZWRVcmwucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIFVSTCBzY2hlbWUgXCIke3BhcnNlZFVybC5wcm90b2NvbH1cIi4gT25seSBodHRwKHMpIFVSTHMgYXJlIHN1cHBvcnRlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc1N0YXRlID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgIC8vIFRocmVhZCB0aGUgY2FsbGVyJ3MgQWJvcnRTaWduYWwgaW50byB0aGUgZmV0Y2ggc28gV2ViTUNQL2JyaWRnZVxuICAgICAgICAvLyBjYW5jZWxsYXRpb25zIHN0b3AgbG9uZy1ydW5uaW5nIGxvYWRzIGluc3RlYWQgb2YgbGV0dGluZyB0aGVtIGhhbmcuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocGFyc2VkVXJsLmhyZWYsIHtzaWduYWw6IGV4ZWNDdHg/LnNpZ25hbH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgLy8gSW5jbHVkZSB0aGUgbnVtZXJpYyBzdGF0dXMg4oCUIHN0YXR1c1RleHQgaXMgb2Z0ZW4gZW1wdHkgKGUuZy4gc29tZVxuICAgICAgICAgIC8vIENETnMgLyBlcnJvciBwYWdlcyksIGFuZCB0aGUgY29kZSBhbG9uZSBtYWtlcyBmYWlsdXJlcyBkaWFnbm9zYWJsZS5cbiAgICAgICAgICBjb25zdCByZWFzb24gPSByZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICA/IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YFxuICAgICAgICAgICAgOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGRhdGEgZnJvbSAke3BhcnNlZFVybC5ocmVmfTogJHtyZWFzb259YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICAvLyBEZXJpdmUgdGhlIGZpbGVuYW1lIGZyb20gdGhlIFVSTCBwYXRobmFtZSBzbyBxdWVyeSBzdHJpbmdzIChlLmcuXG4gICAgICAgIC8vIGBkYXRhLmNzdj94PTFgKSBkb24ndCBlbmQgdXAgaW4gdGhlIGRhdGFzZXQgbmFtZS4gQSBkYXRhIFVSTCBoYXMgbm9cbiAgICAgICAgLy8gcGF0aG5hbWUg4oCUIGZhbGwgYmFjayB0byBhIG5hbWUgZGVyaXZlZCBmcm9tIGl0cyBNSU1FIHR5cGUgc28gdGhlXG4gICAgICAgIC8vIGRhdGFzZXQgZ2V0cyBhIHNlbnNpYmxlIGRlZmF1bHQgbGFiZWwgKGUuZy4gYGRhdGEuY3N2YCkuXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID1cbiAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdkYXRhOidcbiAgICAgICAgICAgID8gZmlsZU5hbWVGcm9tRGF0YVVybChwYXJzZWRVcmwpXG4gICAgICAgICAgICA6IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICdkYXRhJztcbiAgICAgICAgLy8gQ2FycnkgdGhlIEJsb2IncyBNSU1FIHR5cGUgaW50byB0aGUgRmlsZSBzbyBsb2FkZXIgc2VsZWN0aW9uIGluXG4gICAgICAgIC8vIHJlYWRGaWxlSW5CYXRjaGVzIGNhbiB1c2UgaXQg4oCUIGEgVVJMIHdpdGggbm8gZXh0ZW5zaW9uIChvciBhXG4gICAgICAgIC8vIG1pc2xlYWRpbmcgb25lKSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgZmlsZS50eXBlIGVtcHR5IGFuZCBmYWlsIHRvXG4gICAgICAgIC8vIHBpY2sgdGhlIHJpZ2h0IGxvYWRlci5cbiAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZU5hbWUsIHt0eXBlOiBibG9iLnR5cGUgfHwgdW5kZWZpbmVkfSk7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBzb3VyY2UgVVJMIHNvIHByb2Nlc3NvcnMgaGFzaCBieSBVUkwgKGF2b2lkaW5nIGRhdGFzZXQtaWRcbiAgICAgICAgLy8gY29sbGlzaW9ucyBiZXR3ZWVuIHNhbWUtbmFtZWQgZmlsZXMpIGFuZCBjYW4gYXR0YWNoIGV4dGVybmFsbHktaG9zdGVkXG4gICAgICAgIC8vIG1ldGFkYXRhIOKAlCBtaXJyb3JzIGxvYWRFeHRlcm5hbGx5SG9zdGVkRGF0YXNldC4gVXNlIHRoZSBSRVNPTFZFRCBocmVmXG4gICAgICAgIC8vIHNvIGEgcmVsYXRpdmUgcGF0aCBhbmQgaXRzIGFic29sdXRlIGZvcm0gaGFzaCB0byB0aGUgc2FtZSBkYXRhc2V0IGlkLlxuICAgICAgICAvLyBGb3IgYSBkYXRhIFVSTCB0aGUgaHJlZiBJUyB0aGUgY29udGVudCAocG90ZW50aWFsbHkgbGFyZ2UpIOKAlCBoYXNoIGl0XG4gICAgICAgIC8vIGRvd24gc28gdGhlIGlkIHN0YXlzIGNvbnRlbnQtZGVyaXZlZCAodW5pcXVlIHBlciBwYXlsb2FkKSB3aXRob3V0XG4gICAgICAgIC8vIHN0b3JpbmcgdGhlIHdob2xlIHBheWxvYWQgaW4gdGhlIGRhdGFzZXQgbWV0YWRhdGEuXG4gICAgICAgIGNvbnN0IHNvdXJjZVVybCA9XG4gICAgICAgICAgcGFyc2VkVXJsLnByb3RvY29sID09PSAnZGF0YTonID8gYGRhdGE6JHtoYXNoU3RyaW5nKHBhcnNlZFVybC5ocmVmKX1gIDogcGFyc2VkVXJsLmhyZWY7XG4gICAgICAgIChmaWxlIGFzIEZpbGUgJiB7a2VwbGVyU291cmNlVXJsPzogc3RyaW5nfSkua2VwbGVyU291cmNlVXJsID0gc291cmNlVXJsO1xuXG4gICAgICAgIGNvbnN0IGJhdGNoZXMgPSBhd2FpdCByZWFkRmlsZUluQmF0Y2hlcyh7XG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICBmaWxlQ2FjaGU6IFtdLFxuICAgICAgICAgIGxvYWRlcnM6IHZpc1N0YXRlLmxvYWRlcnMgPz8gW10sXG4gICAgICAgICAgbG9hZE9wdGlvbnM6IHZpc1N0YXRlLmxvYWRPcHRpb25zID8/IHt9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBiYXRjaGVzLm5leHQoKTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IFByb2Nlc3NGaWxlRGF0YUNvbnRlbnQgPSB7ZGF0YTogW10sIGZpbGVOYW1lOiAnJ307XG4gICAgICAgIGxldCBwYXJzZWREYXRhOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICBjb250ZW50ID0gcmVzdWx0LnZhbHVlIGFzIFByb2Nlc3NGaWxlRGF0YUNvbnRlbnQ7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYmF0Y2hlcy5uZXh0KCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtjb250ZW50LCBmaWxlQ2FjaGU6IFtdfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VkRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGEgY291bGQgYmUgcGFyc2VkIGZyb20gJHt1cmx9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgYSBjYWxsZXItY2hvc2VuIGRhdGFzZXQgbmFtZSAoZGVmYXVsdDogdGhlIFVSTCBmaWxlbmFtZSkgc28gdGhlXG4gICAgICAgIC8vIGFnZW50IG5ldmVyIGhhcyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgZGF0YXNldCBqdXN0IHRvIHJlbmFtZSBpdC5cbiAgICAgICAgZm9yIChjb25zdCBkIG9mIHBhcnNlZERhdGEpIHtcbiAgICAgICAgICBpZiAoZD8uaW5mbykge1xuICAgICAgICAgICAgZC5pbmZvLmxhYmVsID0gZGF0YXNldE5hbWUgPz8gZC5pbmZvLmxhYmVsID8/IGZpbGVOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5kaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe1xuICAgICAgICAgICAgZGF0YXNldHM6IHBhcnNlZERhdGEsXG4gICAgICAgICAgICAvLyBEbyBOT1QgYXV0by1jcmVhdGUgYSBsYXllciDigJQgdGhlIGFzc2lzdGFudCBjcmVhdGVzIHRoZSBsYXllclxuICAgICAgICAgICAgLy8gZXhwbGljaXRseSB2aWEgYG1hcC5hZGQtbGF5ZXJgICh3aXRoIGZ1bGwgc3R5bGluZyBjb250cm9sKSwgc29cbiAgICAgICAgICAgIC8vIGxvYWRpbmcgZGF0YSBuZXZlciBwcm9kdWNlcyBhIGR1cGxpY2F0ZSBkZWZhdWx0IGxheWVyLlxuICAgICAgICAgICAgb3B0aW9uczoge2F1dG9DcmVhdGVMYXllcnM6IGZhbHNlLCBjZW50ZXJNYXA6IHRydWV9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkYXRhSW5mbyA9IHBhcnNlZERhdGFbMF0/LmluZm87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IGxvYWREYXRhQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IGxvYWRlZCBkYXRhIGZyb20gJHt1cmx9YCwgZGF0YUluZm99XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGNvbW1hbmRJZDogbG9hZERhdGFDb21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnVHJ5IHRvIGZpeCB0aGUgZXJyb3IuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgYXNrIHRoZSB1c2VyIHRvIHRyeSB3aXRoIGEgZGlmZmVyZW50IFVSTCBvciBmb3JtYXQuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFGLE9BQUE7QUFBeUUsU0FBQUcsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEs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
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getSaveDataCommand = getSaveDataCommand;
8
+ exports.saveDataCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _zod = require("zod");
12
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
13
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
15
+ // Copyright contributors to the kepler.gl project
16
+ var saveDataCommandId = exports.saveDataCommandId = 'map.save-data';
17
+ function getSaveDataCommand(ctx) {
18
+ return {
19
+ id: saveDataCommandId,
20
+ name: 'Save DuckDB table to map',
21
+ group: 'Map',
22
+ description: 'Save a DuckDB table to kepler.gl as a map dataset. Works with any table including those from buffer, zipcode, county, state, isochrone, routing, query results, etc.',
23
+ metadata: {
24
+ readOnly: false,
25
+ riskLevel: 'medium',
26
+ requiresConfirmation: true
27
+ },
28
+ inputSchema: _zod.z.object({
29
+ datasetNames: _zod.z.array(_zod.z.string()).min(1).describe('The names of the DuckDB tables to load into kepler.gl.')
30
+ }),
31
+ execute: function () {
32
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
33
+ var _ref, datasetNames, loadedDatasetNames, _iterator, _step, datasetName, result;
34
+ return _regenerator["default"].wrap(function _callee$(_context) {
35
+ while (1) switch (_context.prev = _context.next) {
36
+ case 0:
37
+ _ref = input !== null && input !== void 0 ? input : {}, datasetNames = _ref.datasetNames;
38
+ _context.prev = 1;
39
+ if (!(!Array.isArray(datasetNames) || datasetNames.length === 0 || datasetNames.some(function (name) {
40
+ return typeof name !== 'string' || name.length === 0;
41
+ }))) {
42
+ _context.next = 4;
43
+ break;
44
+ }
45
+ throw new Error('datasetNames must be a non-empty array of DuckDB table names, e.g. ["my_table"].');
46
+ case 4:
47
+ loadedDatasetNames = [];
48
+ _iterator = _createForOfIteratorHelper(datasetNames);
49
+ _context.prev = 6;
50
+ _iterator.s();
51
+ case 8:
52
+ if ((_step = _iterator.n()).done) {
53
+ _context.next = 18;
54
+ break;
55
+ }
56
+ datasetName = _step.value;
57
+ _context.next = 12;
58
+ return ctx.loadTableToKepler(datasetName);
59
+ case 12:
60
+ result = _context.sent;
61
+ if (result.success) {
62
+ _context.next = 15;
63
+ break;
64
+ }
65
+ throw new Error("Cannot save table \"".concat(datasetName, "\" to kepler.gl: ").concat(result.error));
66
+ case 15:
67
+ loadedDatasetNames.push(datasetName);
68
+ case 16:
69
+ _context.next = 8;
70
+ break;
71
+ case 18:
72
+ _context.next = 23;
73
+ break;
74
+ case 20:
75
+ _context.prev = 20;
76
+ _context.t0 = _context["catch"](6);
77
+ _iterator.e(_context.t0);
78
+ case 23:
79
+ _context.prev = 23;
80
+ _iterator.f();
81
+ return _context.finish(23);
82
+ case 26:
83
+ if (!(loadedDatasetNames.length === 0)) {
84
+ _context.next = 28;
85
+ break;
86
+ }
87
+ throw new Error("No datasets found from ".concat(datasetNames.join(', ')));
88
+ case 28:
89
+ return _context.abrupt("return", {
90
+ success: true,
91
+ commandId: saveDataCommandId,
92
+ data: {
93
+ savedDatasetNames: loadedDatasetNames,
94
+ details: "Successfully saved dataset(s): ".concat(loadedDatasetNames.join(', '), " in kepler.gl")
95
+ }
96
+ });
97
+ case 31:
98
+ _context.prev = 31;
99
+ _context.t1 = _context["catch"](1);
100
+ return _context.abrupt("return", {
101
+ success: false,
102
+ commandId: saveDataCommandId,
103
+ error: "Cannot save data to kepler.gl: ".concat(_context.t1 instanceof Error ? _context.t1.message : String(_context.t1))
104
+ });
105
+ case 34:
106
+ case "end":
107
+ return _context.stop();
108
+ }
109
+ }, _callee, null, [[1, 31], [6, 20, 23, 26]]);
110
+ }));
111
+ function execute(_x, _x2) {
112
+ return _execute.apply(this, arguments);
113
+ }
114
+ return execute;
115
+ }()
116
+ };
117
+ }
118
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwic2F2ZURhdGFDb21tYW5kSWQiLCJleHBvcnRzIiwiZ2V0U2F2ZURhdGFDb21tYW5kIiwiY3R4IiwiaWQiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsInJlcXVpcmVzQ29uZmlybWF0aW9uIiwiaW5wdXRTY2hlbWEiLCJ6Iiwib2JqZWN0IiwiZGF0YXNldE5hbWVzIiwiYXJyYXkiLCJzdHJpbmciLCJtaW4iLCJkZXNjcmliZSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJsb2FkZWREYXRhc2V0TmFtZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImRhdGFzZXROYW1lIiwicmVzdWx0Iiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2Iiwic29tZSIsIkVycm9yIiwibG9hZFRhYmxlVG9LZXBsZXIiLCJzZW50Iiwic3VjY2VzcyIsImNvbmNhdCIsImVycm9yIiwicHVzaCIsInQwIiwiZmluaXNoIiwiam9pbiIsImFicnVwdCIsImNvbW1hbmRJZCIsImRhdGEiLCJzYXZlZERhdGFzZXROYW1lcyIsImRldGFpbHMiLCJ0MSIsIm1lc3NhZ2UiLCJTdHJpbmciLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zYXZlLWRhdGEtY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3Qgc2F2ZURhdGFDb21tYW5kSWQgPSAnbWFwLnNhdmUtZGF0YScgYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYXZlRGF0YUNvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBzYXZlRGF0YUNvbW1hbmRJZCxcbiAgICBuYW1lOiAnU2F2ZSBEdWNrREIgdGFibGUgdG8gbWFwJyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnU2F2ZSBhIER1Y2tEQiB0YWJsZSB0byBrZXBsZXIuZ2wgYXMgYSBtYXAgZGF0YXNldC4gV29ya3Mgd2l0aCBhbnkgdGFibGUgaW5jbHVkaW5nIHRob3NlIGZyb20gYnVmZmVyLCB6aXBjb2RlLCBjb3VudHksIHN0YXRlLCBpc29jaHJvbmUsIHJvdXRpbmcsIHF1ZXJ5IHJlc3VsdHMsIGV0Yy4nLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdtZWRpdW0nLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGRhdGFzZXROYW1lczogelxuICAgICAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAgICAgLm1pbigxKVxuICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lcyBvZiB0aGUgRHVja0RCIHRhYmxlcyB0byBsb2FkIGludG8ga2VwbGVyLmdsLicpXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHtkYXRhc2V0TmFtZXN9ID0gKGlucHV0ID8/IHt9KSBhcyB7ZGF0YXNldE5hbWVzOiBzdHJpbmdbXX07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSdW50aW1lIGd1YXJkOiB0aGUgYnJpZGdlL3dlYk1DUCBjYWxsIGV4ZWN1dGUgd2l0aG91dCB6b2QgcGFyc2luZyxcbiAgICAgICAgLy8gc28gYSBtaXNzaW5nL2VtcHR5L3dyb25nLXR5cGVkIGRhdGFzZXROYW1lcyBtdXN0IG5vdCBmYWxsIHRocm91Z2ggdG9cbiAgICAgICAgLy8gYSBjb25mdXNpbmcgVHlwZUVycm9yIG9yIGFuIHVuaGVscGZ1bCBcIk5vIGRhdGFzZXRzIGZvdW5k4oCmXCIgbWVzc2FnZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBcnJheS5pc0FycmF5KGRhdGFzZXROYW1lcykgfHxcbiAgICAgICAgICBkYXRhc2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgZGF0YXNldE5hbWVzLnNvbWUobmFtZSA9PiB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdkYXRhc2V0TmFtZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBEdWNrREIgdGFibGUgbmFtZXMsIGUuZy4gW1wibXlfdGFibGVcIl0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZWREYXRhc2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRhc2V0TmFtZSBvZiBkYXRhc2V0TmFtZXMpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjdHgubG9hZFRhYmxlVG9LZXBsZXIoZGF0YXNldE5hbWUpO1xuICAgICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgdGFibGUgXCIke2RhdGFzZXROYW1lfVwiIHRvIGtlcGxlci5nbDogJHtyZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvYWRlZERhdGFzZXROYW1lcy5wdXNoKGRhdGFzZXROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZWREYXRhc2V0TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhc2V0cyBmb3VuZCBmcm9tICR7ZGF0YXNldE5hbWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBzYXZlRGF0YUNvbW1hbmRJZCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBzYXZlZERhdGFzZXROYW1lczogbG9hZGVkRGF0YXNldE5hbWVzLFxuICAgICAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBzYXZlZCBkYXRhc2V0KHMpOiAke2xvYWRlZERhdGFzZXROYW1lcy5qb2luKCcsICcpfSBpbiBrZXBsZXIuZ2xgXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHNhdmVEYXRhQ29tbWFuZElkLFxuICAgICAgICAgIGVycm9yOiBgQ2Fubm90IHNhdmUgZGF0YSB0byBrZXBsZXIuZ2w6ICR7XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9YFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUlBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUFzQixTQUFBQywyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEseUJBQUFDLE1BQUEsSUFBQUgsQ0FBQSxDQUFBRyxNQUFBLENBQUFDLFFBQUEsS0FBQUosQ0FBQSxxQkFBQUUsQ0FBQSxRQUFBRyxLQUFBLENBQUFDLE9BQUEsQ0FBQU4sQ0FBQSxNQUFBRSxDQUFBLEdBQUFLLDJCQUFBLENBQUFQLENBQUEsTUFBQUMsQ0FBQSxJQUFBRCxDQUFBLHVCQUFBQSxDQUFBLENBQUFRLE1BQUEsSUFBQU4sQ0FBQSxLQUFBRixDQUFBLEdBQUFFLENBQUEsT0FBQU8sRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFULENBQUEsQ0FBQVEsTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElBQUEsTUFBQUMsS0FBQSxFQUFBZCxDQUFBLENBQUFTLEVBQUEsVUFBQVIsQ0FBQSxXQUFBQSxFQUFBRCxDQUFBLFVBQUFBLENBQUEsS0FBQWUsQ0FBQSxFQUFBTCxDQUFBLGdCQUFBTSxTQUFBLGlKQUFBQyxDQUFBLEVBQUFDLENBQUEsT0FBQUMsQ0FBQSxnQkFBQVIsQ0FBQSxXQUFBQSxFQUFBLElBQUFULENBQUEsR0FBQUEsQ0FBQSxDQUFBa0IsSUFBQSxDQUFBcEIsQ0FBQSxNQUFBWSxDQUFBLFdBQUFBLEVBQUEsUUFBQVosQ0FBQSxHQUFBRSxDQUFBLENBQUFtQixJQUFBLFdBQUFILENBQUEsR0FBQWxCLENBQUEsQ0FBQWEsSUFBQSxFQUFBYixDQUFBLEtBQUFDLENBQUEsV0FBQUEsRUFBQUQsQ0FB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