@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/commands/add-column-command.js +192 -0
- package/dist/cjs/commands/basemap-command.js +80 -0
- package/dist/cjs/commands/boundary-command.js +81 -0
- package/dist/cjs/commands/command-wrappers.js +122 -0
- package/dist/cjs/commands/dataset-context-command.js +87 -0
- package/dist/cjs/commands/index.js +230 -0
- package/dist/cjs/commands/layer-creation-command.js +534 -0
- package/dist/cjs/commands/layer-style-command.js +136 -0
- package/dist/cjs/commands/load-data-command.js +270 -0
- package/dist/cjs/commands/save-data-command.js +118 -0
- package/dist/cjs/commands/split-view-command.js +261 -0
- package/dist/cjs/commands/table-command.js +199 -0
- package/dist/cjs/commands/time-filter-command.js +289 -0
- package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
- package/dist/cjs/commands/types.js +6 -0
- package/dist/cjs/commands/utils.js +536 -0
- package/dist/cjs/commands/view-mode-command.js +94 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/map-contract.js +6 -0
- package/dist/cjs/server/bridge-server.js +435 -0
- package/dist/cjs/server/index.js +31 -0
- package/dist/cjs/server/stdio.js +201 -0
- package/dist/cjs/types.js +30 -0
- package/dist/commands/add-column-command.d.ts +4 -0
- package/dist/commands/basemap-command.d.ts +4 -0
- package/dist/commands/boundary-command.d.ts +4 -0
- package/dist/commands/command-wrappers.d.ts +52 -0
- package/dist/commands/dataset-context-command.d.ts +4 -0
- package/dist/commands/index.d.ts +31 -0
- package/dist/commands/layer-creation-command.d.ts +8 -0
- package/dist/commands/layer-style-command.d.ts +4 -0
- package/dist/commands/load-data-command.d.ts +4 -0
- package/dist/commands/save-data-command.d.ts +4 -0
- package/dist/commands/split-view-command.d.ts +4 -0
- package/dist/commands/table-command.d.ts +4 -0
- package/dist/commands/time-filter-command.d.ts +13 -0
- package/dist/commands/toggle-time-filter-command.d.ts +4 -0
- package/dist/commands/types.d.ts +132 -0
- package/dist/commands/utils.d.ts +138 -0
- package/dist/commands/view-mode-command.d.ts +4 -0
- package/dist/esm/commands/add-column-command.js +185 -0
- package/dist/esm/commands/basemap-command.js +72 -0
- package/dist/esm/commands/boundary-command.js +73 -0
- package/dist/esm/commands/command-wrappers.js +114 -0
- package/dist/esm/commands/dataset-context-command.js +79 -0
- package/dist/esm/commands/index.js +51 -0
- package/dist/esm/commands/layer-creation-command.js +527 -0
- package/dist/esm/commands/layer-style-command.js +130 -0
- package/dist/esm/commands/load-data-command.js +264 -0
- package/dist/esm/commands/save-data-command.js +112 -0
- package/dist/esm/commands/split-view-command.js +255 -0
- package/dist/esm/commands/table-command.js +194 -0
- package/dist/esm/commands/time-filter-command.js +280 -0
- package/dist/esm/commands/toggle-time-filter-command.js +147 -0
- package/dist/esm/commands/types.js +3 -0
- package/dist/esm/commands/utils.js +521 -0
- package/dist/esm/commands/view-mode-command.js +86 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/map-contract.js +3 -0
- package/dist/esm/server/bridge-server.js +428 -0
- package/dist/esm/server/index.js +13 -0
- package/dist/esm/server/stdio.js +198 -0
- package/dist/esm/types.js +24 -0
- package/dist/index.d.ts +15 -0
- package/dist/map-contract.d.ts +31 -0
- package/dist/server/bridge-server.d.ts +53 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/stdio.d.ts +2 -0
- package/dist/types.d.ts +24 -0
- package/package.json +84 -4
- package/skill/kepler/SKILL.md +438 -0
- package/skill/kepler/skill.yaml +4 -0
- 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/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdUcnkgdG8gZml4IHRoZSBlcnJvci4gSWYgdGhlIGVycm9yIHBlcnNpc3RzLCBhc2sgdGhlIHVzZXIgdG8gdHJ5IHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUFrRSxTQUFBRSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEs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
|
|
@@ -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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
|