kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
144 lines (106 loc) • 15.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.injector = injector;
exports.typeCheckRecipe = typeCheckRecipe;
exports.withState = withState;
exports.ERROR_MSG = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _react = _interopRequireDefault(require("react"));
var _reactRedux = require("react-redux");
var _redux = require("redux");
var _window = require("global/window");
var _context = _interopRequireDefault(require("./context"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var MissingComp = function MissingComp() {
return _react["default"].createElement("div", null);
};
var ERROR_MSG = {
wrongRecipeType: "injectComponents takes an array of factories replacement pairs as input, " + "each pair be a array as [originalFactory, replacement].",
noDep: function noDep(fac, parent) {
return "".concat(fac.name, " is required as a dependency of ").concat(parent.name, ", ") + "but is not provided to injectComponents. It will not be rendered.";
},
notFunc: 'factory and its replacement should be a function'
};
exports.ERROR_MSG = ERROR_MSG;
function injector() {
var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
var cache = new Map(); // map<factory, factory -> ?>
var get = function get(fac, parent) {
var factory = map.get(fac); // factory is not injected
if (!factory) {
_window.console.error(ERROR_MSG.noDep(fac, parent));
return MissingComp;
} // check if custom factory deps is declared
var instances = cache.get(factory) || factory.apply(void 0, (0, _toConsumableArray2["default"])(factory.deps ? factory.deps.map(function (dep) {
return get(dep, factory);
}) : []));
cache.set(fac, instances);
return instances;
}; // if you have two functions that happen to have the exactly same text
// it will be override: 2018-02-05
return {
provide: function provide(factory, replacement) {
if (!typeCheckRecipe([factory, replacement])) {
return injector(map);
}
return injector(new Map(map).set(factory, replacement));
},
get: get
};
}
function typeCheckRecipe(recipe) {
if (!Array.isArray(recipe) || recipe.length < 2) {
_window.console.error('Error injecting [factory, replacement]', recipe);
_window.console.error(ERROR_MSG.wrongRecipeType);
return false;
}
var _recipe = (0, _slicedToArray2["default"])(recipe, 2),
factory = _recipe[0],
replacement = _recipe[1];
if (typeof factory !== 'function') {
_window.console.error('Error injecting factory: ', factory);
_window.console.error(ERROR_MSG.notFunc);
return false;
} else if (typeof replacement !== 'function') {
_window.console.error('Error injecting replacement for: ', factory);
_window.console.error(ERROR_MSG.notFunc);
return false;
}
return true;
}
var identity = function identity(state) {
return state;
}; // Helper to add reducer state to custom component
function withState() {
var lenses = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var mapStateToProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;
var actions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return function (Component) {
var WrappedComponent = function WrappedComponent(_ref) {
var state = _ref.state,
props = (0, _objectWithoutProperties2["default"])(_ref, ["state"]);
return _react["default"].createElement(_context["default"].Consumer, null, function (context) {
return _react["default"].createElement(Component, lenses.reduce(function (totalState, lens) {
return _objectSpread({}, totalState, {}, lens(context.selector(state)));
}, props));
});
};
return (0, _reactRedux.connect)(function (state) {
return _objectSpread({}, mapStateToProps(state), {
state: state
});
}, function (dispatch) {
return Object.keys(actions).reduce(function (accu, key) {
return _objectSpread({}, accu, (0, _defineProperty2["default"])({}, key, (0, _redux.bindActionCreators)(actions[key], dispatch)));
}, {});
})(WrappedComponent);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2luamVjdG9yLmpzIl0sIm5hbWVzIjpbIk1pc3NpbmdDb21wIiwiRVJST1JfTVNHIiwid3JvbmdSZWNpcGVUeXBlIiwibm9EZXAiLCJmYWMiLCJwYXJlbnQiLCJuYW1lIiwibm90RnVuYyIsImluamVjdG9yIiwibWFwIiwiTWFwIiwiY2FjaGUiLCJnZXQiLCJmYWN0b3J5IiwiQ29uc29sZSIsImVycm9yIiwiaW5zdGFuY2VzIiwiZGVwcyIsImRlcCIsInNldCIsInByb3ZpZGUiLCJyZXBsYWNlbWVudCIsInR5cGVDaGVja1JlY2lwZSIsInJlY2lwZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImlkZW50aXR5Iiwic3RhdGUiLCJ3aXRoU3RhdGUiLCJsZW5zZXMiLCJtYXBTdGF0ZVRvUHJvcHMiLCJhY3Rpb25zIiwiQ29tcG9uZW50IiwiV3JhcHBlZENvbXBvbmVudCIsInByb3BzIiwiY29udGV4dCIsInJlZHVjZSIsInRvdGFsU3RhdGUiLCJsZW5zIiwic2VsZWN0b3IiLCJkaXNwYXRjaCIsIk9iamVjdCIsImtleXMiLCJhY2N1Iiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyxHQUFHLFNBQWRBLFdBQWM7QUFBQSxTQUFNLDRDQUFOO0FBQUEsQ0FBcEI7O0FBRU8sSUFBTUMsU0FBUyxHQUFHO0FBQ3ZCQyxFQUFBQSxlQUFlLEVBQ2IsdUlBRnFCO0FBS3ZCQyxFQUFBQSxLQUFLLEVBQUUsZUFBQ0MsR0FBRCxFQUFNQyxNQUFOO0FBQUEsV0FDTCxVQUFHRCxHQUFHLENBQUNFLElBQVAsNkNBQThDRCxNQUFNLENBQUNDLElBQXJELDZFQURLO0FBQUEsR0FMZ0I7QUFTdkJDLEVBQUFBLE9BQU8sRUFBRTtBQVRjLENBQWxCOzs7QUFZQSxTQUFTQyxRQUFULEdBQW1DO0FBQUEsTUFBakJDLEdBQWlCLHVF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QW5CQSxnQkFBbUI7QUFBQSxVQUFFTixLQUFGLFFBQUVBLEtBQUY7QUFBQSxVQUFZTyxLQUFaO0FBQUEsYUFDdkIsZ0NBQUMsbUJBQUQsQ0FBaUIsUUFBakIsUUFDRyxVQUFBQyxPQUFPO0FBQUEsZUFDTixnQ0FBQyxTQUFELEVBQ01OLE1BQU0sQ0FBQ08sTUFBUCxDQUNGLFVBQUNDLFVBQUQsRUFBYUMsSUFBYjtBQUFBLG1DQUNLRCxVQURMLE1BRUtDLElBQUksQ0FBQ0gsT0FBTyxDQUFDSSxRQUFSLENBQWlCWixLQUFqQixDQUFELENBRlQ7QUFBQSxTQURFLEVBS0ZPLEtBTEUsQ0FETixDQURNO0FBQUEsT0FEVixDQUR1QjtBQUFBLEtBQXpCOztBQWdCQSxXQUFPLHlCQUNMLFVBQUFQLEtBQUs7QUFBQSwrQkFBU0csZUFBZSxDQUFDSCxLQUFELENBQXhCO0FBQWlDQSxRQUFBQSxLQUFLLEVBQUxBO0FBQWpDO0FBQUEsS0FEQSxFQUVMLFVBQUFhLFFBQVE7QUFBQSxhQUNOQyxNQUFNLENBQUNDLElBQVAsQ0FBWVgsT0FBWixFQUFxQkssTUFBckIsQ0FDRSxVQUFDTyxJQUFELEVBQU9DLEdBQVA7QUFBQSxpQ0FDS0QsSUFETCx1Q0FFR0MsR0FGSCxFQUVTLCtCQUFtQmIsT0FBTyxDQUFDYSxHQUFELENBQTFCLEVBQWlDSixRQUFqQyxDQUZUO0FBQUEsT0FERixFQUtFLEVBTEYsQ0FETTtBQUFBLEtBRkgsRUFVTFAsZ0JBVkssQ0FBUDtBQVdELEdBNUJEO0FBNkJEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtiaW5kQWN0aW9uQ3JlYXRvcnN9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBLZXBsZXJHbENvbnRleHQgZnJvbSAnY29tcG9uZW50cy9jb250ZXh0JztcblxuY29uc3QgTWlzc2luZ0NvbXAgPSAoKSA9PiA8ZGl2IC8+O1xuXG5leHBvcnQgY29uc3QgRVJST1JfTVNHID0ge1xuICB3cm9uZ1JlY2lwZVR5cGU6XG4gICAgYGluamVjdENvbXBvbmVudHMgdGFrZXMgYW4gYXJyYXkgb2YgZmFjdG9yaWVzIHJlcGxhY2VtZW50IHBhaXJzIGFzIGlucHV0LCBgICtcbiAgICBgZWFjaCBwYWlyIGJlIGEgYXJyYXkgYXMgW29yaWdpbmFsRmFjdG9yeSwgcmVwbGFjZW1lbnRdLmAsXG5cbiAgbm9EZXA6IChmYWMsIHBhcmVudCkgPT5cbiAgICBgJHtmYWMubmFtZX0gaXMgcmVxdWlyZWQgYXMgYSBkZXBlbmRlbmN5IG9mICR7cGFyZW50Lm5hbWV9LCBgICtcbiAgICBgYnV0IGlzIG5vdCBwcm92aWRlZCB0byBpbmplY3RDb21wb25lbnRzLiBJdCB3aWxsIG5vdCBiZSByZW5kZXJlZC5gLFxuXG4gIG5vdEZ1bmM6ICdmYWN0b3J5IGFuZCBpdHMgcmVwbGFjZW1lbnQgc2hvdWxkIGJlIGEgZnVuY3Rpb24nXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0b3IobWFwID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcCgpOyAvLyBtYXA8ZmFjdG9yeSwgZmFjdG9yeSAtPiA/PlxuICBjb25zdCBnZXQgPSAoZmFjLCBwYXJlbnQpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbWFwLmdldChmYWMpO1xuICAgIC8vIGZhY3RvcnkgaXMgbm90IGluamVjdGVkXG4gICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICBDb25zb2xlLmVycm9yKEVSUk9SX01TRy5ub0RlcChmYWMsIHBhcmVudCkpO1xuICAgICAgcmV0dXJuIE1pc3NpbmdDb21wO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGN1c3RvbSBmYWN0b3J5IGRlcHMgaXMgZGVjbGFyZWRcbiAgICBjb25zdCBpbnN0YW5jZXMgPVxuICAgICAgY2FjaGUuZ2V0KGZhY3RvcnkpIHx8XG4gICAgICBmYWN0b3J5KC4uLihmYWN0b3J5LmRlcHMgPyBmYWN0b3J5LmRlcHMubWFwKGRlcCA9PiBnZXQoZGVwLCBmYWN0b3J5KSkgOiBbXSkpO1xuXG4gICAgY2FjaGUuc2V0KGZhYywgaW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaW5zdGFuY2VzO1xuICB9O1xuXG4gIC8vIGlmIHlvdSBoYXZlIHR3byBmdW5jdGlvbnMgdGhhdCBoYXBwZW4gdG8gaGF2ZSB0aGUgZXhhY3RseSBzYW1lIHRleHRcbiAgLy8gaXQgd2lsbCBiZSBvdmVycmlkZTogMjAxOC0wMi0wNVxuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IChmYWN0b3J5LCByZXBsYWNlbWVudCkgPT4ge1xuICAgICAgaWYgKCF0eXBlQ2hlY2tSZWNpcGUoW2ZhY3RvcnksIHJlcGxhY2VtZW50XSkpIHtcbiAgICAgICAgcmV0dXJuIGluamVjdG9yKG1hcCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5qZWN0b3IobmV3IE1hcChtYXApLnNldChmYWN0b3J5LCByZXBsYWNlbWVudCkpO1xuICAgIH0sXG4gICAgZ2V0XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlQ2hlY2tSZWNpcGUocmVjaXBlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZWNpcGUpIHx8IHJlY2lwZS5sZW5ndGggPCAyKSB7XG4gICAgQ29uc29sZS5lcnJvcignRXJyb3IgaW5qZWN0aW5nIFtmYWN0b3J5LCByZXBsYWNlbWVudF0nLCByZWNpcGUpO1xuICAgIENvbnNvbGUuZXJyb3IoRVJST1JfTVNHLndyb25nUmVjaXBlVHlwZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgW2ZhY3RvcnksIHJlcGxhY2VtZW50XSA9IHJlY2lwZTtcbiAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgQ29uc29sZS5lcnJvcignRXJyb3IgaW5qZWN0aW5nIGZhY3Rvcnk6ICcsIGZhY3RvcnkpO1xuICAgIENvbnNvbGUuZXJyb3IoRVJST1JfTVNHLm5vdEZ1bmMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICBDb25zb2xlLmVycm9yKCdFcnJvciBpbmplY3RpbmcgcmVwbGFjZW1lbnQgZm9yOiAnLCBmYWN0b3J5KTtcbiAgICBDb25zb2xlLmVycm9yKEVSUk9SX01TRy5ub3RGdW5jKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWRlbnRpdHkgPSBzdGF0ZSA9PiBzdGF0ZTtcbi8vIEhlbHBlciB0byBhZGQgcmVkdWNlciBzdGF0ZSB0byBjdXN0b20gY29tcG9uZW50XG5leHBvcnQgZnVuY3Rpb24gd2l0aFN0YXRlKGxlbnNlcyA9IFtdLCBtYXBTdGF0ZVRvUHJvcHMgPSBpZGVudGl0eSwgYWN0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBDb21wb25lbnQgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSAoe3N0YXRlLCAuLi5wcm9wc30pID0+IChcbiAgICAgIDxLZXBsZXJHbENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIHtjb250ZXh0ID0+IChcbiAgICAgICAgICA8Q29tcG9uZW50XG4gICAgICAgICAgICB7Li4ubGVuc2VzLnJlZHVjZShcbiAgICAgICAgICAgICAgKHRvdGFsU3RhdGUsIGxlbnMpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udG90YWxTdGF0ZSxcbiAgICAgICAgICAgICAgICAuLi5sZW5zKGNvbnRleHQuc2VsZWN0b3Ioc3RhdGUpKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvS2VwbGVyR2xDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG5cbiAgICByZXR1cm4gY29ubmVjdChcbiAgICAgIHN0YXRlID0+ICh7Li4ubWFwU3RhdGVUb1Byb3BzKHN0YXRlKSwgc3RhdGV9KSxcbiAgICAgIGRpc3BhdGNoID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGFjdGlvbnMpLnJlZHVjZShcbiAgICAgICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICAgIFtrZXldOiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uc1trZXldLCBkaXNwYXRjaClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApXG4gICAgKShXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcbn1cbiJdfQ==
;