UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

105 lines (101 loc) 16.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getPropValueToMerger = getPropValueToMerger; exports.hasPropsToMerge = hasPropsToMerge; exports.isValidMerger = isValidMerger; exports.mergeStateFromMergers = mergeStateFromMergers; exports.resetStateToMergeProps = resetStateToMergeProps; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _tasks = require("react-palm/tasks"); var _utils = require("@kepler.gl/utils"); var _commonUtils = require("@kepler.gl/common-utils"); 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; } 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 // Copyright contributors to the kepler.gl project function isValidMerger(merger) { return (0, _utils.isObject)(merger) && typeof merger.merge === 'function' && (typeof merger.prop === 'string' || Array.isArray(merger.prop)); } /** * Call state updater, return the tasks created by the state update with withTask() */ function callFunctionGetTask(fn) { var before = (0, _tasks.getGlobalTaskQueue)(); var ret = fn(); var after = (0, _tasks.getGlobalTaskQueue)(); var diff = after.filter(function (t) { return !before.includes(t); }); return [ret, diff]; } function mergeStateFromMergers(state, initialState, mergers, postMergerPayload) { // const newDataIds = Object.keys(postMergerPayload.newDataEntries); var mergedState = state; // merge state with config to be merged var mergerQueue = (0, _toConsumableArray2["default"])(mergers); var _loop = function _loop() { var merger = mergerQueue.shift(); if (merger && isValidMerger(merger) && merger.toMergeProp && hasPropsToMerge(state, merger.toMergeProp)) { // put the rest of mergers and payload for postMergeUpdater in mergerActionPayload // and pass it to current merger, which (if async) knows to continue merging var mergerActionPayload = { mergers: mergerQueue, postMergerPayload: postMergerPayload }; // reset toMerge var toMerge = getPropValueToMerger(mergedState, merger.toMergeProp, merger.toMergeProp); mergedState = resetStateToMergeProps(mergedState, initialState, merger.toMergeProp); // call merger // eslint-disable-next-line no-loop-func var mergeFunc = function mergeFunc() { return merger.merge(mergedState, toMerge, false, mergerActionPayload); }; var _callFunctionGetTask = callFunctionGetTask(mergeFunc), _callFunctionGetTask2 = (0, _slicedToArray2["default"])(_callFunctionGetTask, 2), updatedState = _callFunctionGetTask2[0], newTasks = _callFunctionGetTask2[1]; mergedState = updatedState; // check if asyncTask was created (time consuming tasks) if (newTasks.length && merger.waitToFinish) { // skip rest, the async merger will call applyMergerUpdater() to continue return { v: { mergedState: mergedState, allMerged: false } }; } } }, _ret; while (mergerQueue.length) { _ret = _loop(); if (_ret) return _ret.v; } // we merged all mergers in the queue, and we can call post merger now return { mergedState: mergedState, allMerged: true }; } function hasPropsToMerge(state, mergerProps) { return Array.isArray(mergerProps) ? Boolean(mergerProps.some(function (p) { return Object.prototype.hasOwnProperty.call(state, p); })) : typeof mergerProps === 'string' && Object.prototype.hasOwnProperty.call(state, mergerProps); } function getPropValueToMerger(state, mergerProps, toMergeProps) { return Array.isArray(mergerProps) && Array.isArray(toMergeProps) ? mergerProps.reduce(function (accu, p, i) { if (!toMergeProps) return accu; return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, toMergeProps[i], state[p])); }, {}) : state[mergerProps]; } function resetStateToMergeProps(state, initialState, mergerProps) { return (0, _commonUtils.toArray)(mergerProps).reduce(function (accu, prop) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, prop, initialState[prop])); }, state); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGFza3MiLCJyZXF1aXJlIiwiX3V0aWxzIiwiX2NvbW1vblV0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJpc1ZhbGlkTWVyZ2VyIiwibWVyZ2VyIiwiaXNPYmplY3QiLCJtZXJnZSIsInByb3AiLCJBcnJheSIsImlzQXJyYXkiLCJjYWxsRnVuY3Rpb25HZXRUYXNrIiwiZm4iLCJiZWZvcmUiLCJnZXRHbG9iYWxUYXNrUXVldWUiLCJyZXQiLCJhZnRlciIsImRpZmYiLCJpbmNsdWRlcyIsIm1lcmdlU3RhdGVGcm9tTWVyZ2VycyIsInN0YXRlIiwiaW5pdGlhbFN0YXRlIiwibWVyZ2VycyIsInBvc3RNZXJnZXJQYXlsb2FkIiwibWVyZ2VkU3RhdGUiLCJtZXJnZXJRdWV1ZSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJfbG9vcCIsInNoaWZ0IiwidG9NZXJnZVByb3AiLCJoYXNQcm9wc1RvTWVyZ2UiLCJtZXJnZXJBY3Rpb25QYXlsb2FkIiwidG9NZXJnZSIsImdldFByb3BWYWx1ZVRvTWVyZ2VyIiwicmVzZXRTdGF0ZVRvTWVyZ2VQcm9wcyIsIm1lcmdlRnVuYyIsIl9jYWxsRnVuY3Rpb25HZXRUYXNrIiwiX2NhbGxGdW5jdGlvbkdldFRhc2syIiwiX3NsaWNlZFRvQXJyYXkyIiwidXBkYXRlZFN0YXRlIiwibmV3VGFza3MiLCJ3YWl0VG9GaW5pc2giLCJ2IiwiYWxsTWVyZ2VkIiwiX3JldCIsIm1lcmdlclByb3BzIiwiQm9vbGVhbiIsInNvbWUiLCJwIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwidG9NZXJnZVByb3BzIiwicmVkdWNlIiwiYWNjdSIsImkiLCJ0b0FycmF5Il0sInNvdXJjZXMiOlsiLi4vc3JjL21lcmdlci1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7Z2V0R2xvYmFsVGFza1F1ZXVlfSBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHt0b0FycmF5fSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge1ZhbHVlT2Z9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtWaXNTdGF0ZSwgTWVyZ2VyLCBQb3N0TWVyZ2VyUGF5bG9hZH0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRNZXJnZXIobWVyZ2VyOiBNZXJnZXI8YW55Pik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzT2JqZWN0KG1lcmdlcikgJiZcbiAgICB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShtZXJnZXIucHJvcCkpXG4gICk7XG59XG5cbi8qKlxuICogQ2FsbCBzdGF0ZSB1cGRhdGVyLCByZXR1cm4gdGhlIHRhc2tzIGNyZWF0ZWQgYnkgdGhlIHN0YXRlIHVwZGF0ZSB3aXRoIHdpdGhUYXNrKClcbiAqL1xuZnVuY3Rpb24gY2FsbEZ1bmN0aW9uR2V0VGFzayhmbjogKCkgPT4gYW55KTogW2FueSwgYW55XSB7XG4gIGNvbnN0IGJlZm9yZSA9IGdldEdsb2JhbFRhc2tRdWV1ZSgpO1xuICBjb25zdCByZXQgPSBmbigpO1xuICBjb25zdCBhZnRlciA9IGdldEdsb2JhbFRhc2tRdWV1ZSgpO1xuICBjb25zdCBkaWZmID0gYWZ0ZXIuZmlsdGVyKHQgPT4gIWJlZm9yZS5pbmNsdWRlcyh0KSk7XG4gIHJldHVybiBbcmV0LCBkaWZmXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3RhdGVGcm9tTWVyZ2VyczxTdGF0ZSBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IFN0YXRlLFxuICBtZXJnZXJzOiBNZXJnZXI8U3RhdGU+W10sXG4gIHBvc3RNZXJnZXJQYXlsb2FkOiBQb3N0TWVyZ2VyUGF5bG9hZFxuKToge1xuICBtZXJnZWRTdGF0ZTogU3RhdGU7XG4gIGFsbE1lcmdlZDogYm9vbGVhbjtcbn0ge1xuICAvLyBjb25zdCBuZXdEYXRhSWRzID0gT2JqZWN0LmtleXMocG9zdE1lcmdlclBheWxvYWQubmV3RGF0YUVudHJpZXMpO1xuICBsZXQgbWVyZ2VkU3RhdGUgPSBzdGF0ZTtcbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IG1lcmdlclF1ZXVlID0gWy4uLm1lcmdlcnNdO1xuXG4gIHdoaWxlIChtZXJnZXJRdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBtZXJnZXIgPSBtZXJnZXJRdWV1ZS5zaGlmdCgpO1xuXG4gICAgaWYgKFxuICAgICAgbWVyZ2VyICYmXG4gICAgICBpc1ZhbGlkTWVyZ2VyKG1lcmdlcikgJiZcbiAgICAgIG1lcmdlci50b01lcmdlUHJvcCAmJlxuICAgICAgaGFzUHJvcHNUb01lcmdlKHN0YXRlLCBtZXJnZXIudG9NZXJnZVByb3ApXG4gICAgKSB7XG4gICAgICAvLyBwdXQgdGhlIHJlc3Qgb2YgbWVyZ2VycyBhbmQgcGF5bG9hZCBmb3IgcG9zdE1lcmdlVXBkYXRlciBpbiBtZXJnZXJBY3Rpb25QYXlsb2FkXG4gICAgICAvLyBhbmQgcGFzcyBpdCB0byBjdXJyZW50IG1lcmdlciwgd2hpY2ggKGlmIGFzeW5jKSBrbm93cyB0byBjb250aW51ZSBtZXJnaW5nXG4gICAgICBjb25zdCBtZXJnZXJBY3Rpb25QYXlsb2FkID0ge1xuICAgICAgICBtZXJnZXJzOiBtZXJnZXJRdWV1ZSxcbiAgICAgICAgcG9zdE1lcmdlclBheWxvYWRcbiAgICAgIH07XG4gICAgICAvLyByZXNldCB0b01lcmdlXG4gICAgICBjb25zdCB0b01lcmdlID0gZ2V0UHJvcFZhbHVlVG9NZXJnZXIobWVyZ2VkU3RhdGUsIG1lcmdlci50b01lcmdlUHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKTtcblxuICAgICAgbWVyZ2VkU3RhdGUgPSByZXNldFN0YXRlVG9NZXJnZVByb3BzKG1lcmdlZFN0YXRlLCBpbml0aWFsU3RhdGUsIG1lcmdlci50b01lcmdlUHJvcCk7XG4gICAgICAvLyBjYWxsIG1lcmdlclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgY29uc3QgbWVyZ2VGdW5jID0gKCkgPT4gbWVyZ2VyLm1lcmdlKG1lcmdlZFN0YXRlLCB0b01lcmdlLCBmYWxzZSwgbWVyZ2VyQWN0aW9uUGF5bG9hZCk7XG4gICAgICBjb25zdCBbdXBkYXRlZFN0YXRlLCBuZXdUYXNrc10gPSBjYWxsRnVuY3Rpb25HZXRUYXNrKG1lcmdlRnVuYyk7XG5cbiAgICAgIG1lcmdlZFN0YXRlID0gdXBkYXRlZFN0YXRlO1xuXG4gICAgICAvLyBjaGVjayBpZiBhc3luY1Rhc2sgd2FzIGNyZWF0ZWQgKHRpbWUgY29uc3VtaW5nIHRhc2tzKVxuICAgICAgaWYgKG5ld1Rhc2tzLmxlbmd0aCAmJiBtZXJnZXIud2FpdFRvRmluaXNoKSB7XG4gICAgICAgIC8vIHNraXAgcmVzdCwgdGhlIGFzeW5jIG1lcmdlciB3aWxsIGNhbGwgYXBwbHlNZXJnZXJVcGRhdGVyKCkgdG8gY29udGludWVcbiAgICAgICAgcmV0dXJuIHttZXJnZWRTdGF0ZSwgYWxsTWVyZ2VkOiBmYWxzZX07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gd2UgbWVyZ2VkIGFsbCBtZXJnZXJzIGluIHRoZSBxdWV1ZSwgYW5kIHdlIGNhbiBjYWxsIHBvc3QgbWVyZ2VyIG5vd1xuICByZXR1cm4ge21lcmdlZFN0YXRlLCBhbGxNZXJnZWQ6IHRydWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcHNUb01lcmdlPFN0YXRlIGV4dGVuZHMgb2JqZWN0PihcbiAgc3RhdGU6IFN0YXRlLFxuICBtZXJnZXJQcm9wcz86IHN0cmluZyB8IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVyZ2VyUHJvcHMpXG4gICAgPyBCb29sZWFuKG1lcmdlclByb3BzLnNvbWUocCA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdGUsIHApKSlcbiAgICA6IHR5cGVvZiBtZXJnZXJQcm9wcyA9PT0gJ3N0cmluZycgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLCBtZXJnZXJQcm9wcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wVmFsdWVUb01lcmdlcjxTdGF0ZSBleHRlbmRzIG9iamVjdD4oXG4gIHN0YXRlOiBTdGF0ZSxcbiAgbWVyZ2VyUHJvcHM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdG9NZXJnZVByb3BzPzogc3RyaW5nIHwgc3RyaW5nW11cbik6IFBhcnRpYWw8U3RhdGU+IHwgVmFsdWVPZjxTdGF0ZT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXJnZXJQcm9wcykgJiYgQXJyYXkuaXNBcnJheSh0b01lcmdlUHJvcHMpXG4gICAgPyBtZXJnZXJQcm9wcy5yZWR1Y2UoKGFjY3UsIHAsIGkpID0+IHtcbiAgICAgICAgaWYgKCF0b01lcmdlUHJvcHMpIHJldHVybiBhY2N1O1xuICAgICAgICByZXR1cm4gey4uLmFjY3UsIFt0b01lcmdlUHJvcHNbaV1dOiBzdGF0ZVtwXX07XG4gICAgICB9LCB7fSlcbiAgICA6IHN0YXRlW21lcmdlclByb3BzIGFzIHN0cmluZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFN0YXRlVG9NZXJnZVByb3BzPFN0YXRlIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogU3RhdGUsXG4gIGluaXRpYWxTdGF0ZTogU3RhdGUsXG4gIG1lcmdlclByb3BzOiBzdHJpbmcgfCBzdHJpbmdbXVxuKSB7XG4gIHJldHVybiB0b0FycmF5KG1lcmdlclByb3BzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIHByb3ApID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW3Byb3BdOiBpbml0aWFsU3RhdGVbcHJvcF1cbiAgICB9KSxcbiAgICBzdGF0ZVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUFnRCxTQUFBRyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEs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