UNPKG

ud

Version:

Utilities for updating code live with hot module replacement

114 lines (112 loc) 14.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defn = defn; exports.defobj = defobj; exports.defonce = defonce; exports.markReloadable = markReloadable; var range = require('array-range'); var zipObject = require('zip-object'); var moduleUsedUdKeys = new WeakMap(); function markReloadable(module) { if (module.hot) { module.hot.accept(); } } function defonce(module, fn) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; markReloadable(module); var usedKeys = moduleUsedUdKeys.get(module); if (!usedKeys) { usedKeys = new Set(); moduleUsedUdKeys.set(module, usedKeys); } if (usedKeys.has(key)) { throw new Error('ud functions can only be used once per module with a given key'); } usedKeys.add(key); var valueWasSet = false; var value = undefined; if (module.hot) { if (module.hot.data && module.hot.data.__ud__ && Object.prototype.hasOwnProperty.call(module.hot.data.__ud__, key)) { value = module.hot.data.__ud__[key]; valueWasSet = true; } module.hot.dispose(function (data) { if (!data.__ud__) data.__ud__ = {}; data.__ud__[key] = value; }); } if (!valueWasSet) value = fn(); return value; } function defobj(module, object) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var sharedObject = defonce(module, function () { return object; }, '--defobj-' + key); if (sharedObject !== object) { cloneOntoTarget(sharedObject, object); } return sharedObject; } // Assigns all properties of object onto target, and deletes any properties // from target that don't exist on object. The optional blacklist argument // specifies properties to not assign on target. function cloneOntoTarget(target, object) { Object.getOwnPropertyNames(target).filter(function (name) { return !Object.prototype.hasOwnProperty.call(object, name); }).forEach(function (name) { delete target[name]; }); var newPropsChain = Object.getOwnPropertyNames(object); Object.defineProperties(target, zipObject(newPropsChain, newPropsChain.map(function (name) { return Object.getOwnPropertyDescriptor(object, name); }).filter(Boolean).map(function (_ref) { var value = _ref.value, enumerable = _ref.enumerable; return { value: value, enumerable: enumerable, writable: true, configurable: true }; }))); return target; } function defn(module, fn) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var shared = defonce(module, function () { if (!module.hot) { return { fn: null, wrapper: fn }; } var shared = { fn: null, wrapper: null }; var paramsList = range(fn.length).map(function (x) { return 'a' + x; }).join(','); shared.wrapper = new Function('shared', "\n 'use strict';\n return function ".concat(fn.name, "__ud_wrapper(").concat(paramsList, ") {\n if (new.target) {\n return Reflect.construct(shared.fn, arguments, new.target);\n } else {\n return shared.fn.apply(this, arguments);\n }\n };\n "))(shared); if (fn.prototype) { shared.wrapper.prototype = Object.create(fn.prototype); shared.wrapper.prototype.constructor = shared.wrapper; } else { shared.wrapper.prototype = fn.prototype; } return shared; }, '--defn-shared-' + key); shared.fn = fn; if (module.hot) { if (fn.prototype && shared.wrapper.prototype && Object.getPrototypeOf(shared.wrapper.prototype) !== fn.prototype) { Object.setPrototypeOf(shared.wrapper.prototype, fn.prototype); } Object.setPrototypeOf(shared.wrapper, fn); } return shared.wrapper; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyYW5nZSIsInJlcXVpcmUiLCJ6aXBPYmplY3QiLCJtb2R1bGVVc2VkVWRLZXlzIiwiV2Vha01hcCIsIm1hcmtSZWxvYWRhYmxlIiwibW9kdWxlIiwiaG90IiwiYWNjZXB0IiwiZGVmb25jZSIsImZuIiwia2V5IiwidXNlZEtleXMiLCJnZXQiLCJTZXQiLCJzZXQiLCJoYXMiLCJFcnJvciIsImFkZCIsInZhbHVlV2FzU2V0IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJkYXRhIiwiX191ZF9fIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGlzcG9zZSIsImRlZm9iaiIsIm9iamVjdCIsInNoYXJlZE9iamVjdCIsImNsb25lT250b1RhcmdldCIsInRhcmdldCIsImdldE93blByb3BlcnR5TmFtZXMiLCJmaWx0ZXIiLCJuYW1lIiwiZm9yRWFjaCIsIm5ld1Byb3BzQ2hhaW4iLCJkZWZpbmVQcm9wZXJ0aWVzIiwibWFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiQm9vbGVhbiIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImRlZm4iLCJzaGFyZWQiLCJ3cmFwcGVyIiwicGFyYW1zTGlzdCIsImxlbmd0aCIsIngiLCJqb2luIiwiRnVuY3Rpb24iLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogQGZsb3cgKi9cblxuY29uc3QgcmFuZ2UgPSByZXF1aXJlKCdhcnJheS1yYW5nZScpO1xuY29uc3QgemlwT2JqZWN0ID0gcmVxdWlyZSgnemlwLW9iamVjdCcpO1xuY29uc3QgbW9kdWxlVXNlZFVkS2V5czogV2Vha01hcDx0eXBlb2YgbW9kdWxlLCBTZXQ8c3RyaW5nPj4gPSBuZXcgV2Vha01hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFya1JlbG9hZGFibGUobW9kdWxlOiB0eXBlb2YgbW9kdWxlKSB7XG4gIGlmICgobW9kdWxlOmFueSkuaG90KSB7XG4gICAgKG1vZHVsZTphbnkpLmhvdC5hY2NlcHQoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmb25jZTxUPihtb2R1bGU6IHR5cGVvZiBtb2R1bGUsIGZuOiAoKT0+VCwga2V5PzpzdHJpbmc9JycpOiBUIHtcbiAgbWFya1JlbG9hZGFibGUobW9kdWxlKTtcbiAgbGV0IHVzZWRLZXlzID0gbW9kdWxlVXNlZFVkS2V5cy5nZXQobW9kdWxlKTtcbiAgaWYgKCF1c2VkS2V5cykge1xuICAgIHVzZWRLZXlzID0gbmV3IFNldCgpO1xuICAgIG1vZHVsZVVzZWRVZEtleXMuc2V0KG1vZHVsZSwgdXNlZEtleXMpO1xuICB9XG4gIGlmICh1c2VkS2V5cy5oYXMoa2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndWQgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBwZXIgbW9kdWxlIHdpdGggYSBnaXZlbiBrZXknKTtcbiAgfVxuICB1c2VkS2V5cy5hZGQoa2V5KTtcbiAgbGV0IHZhbHVlV2FzU2V0ID0gZmFsc2U7XG4gIGxldCB2YWx1ZTogYW55ID0gdW5kZWZpbmVkO1xuICBpZiAoKG1vZHVsZTphbnkpLmhvdCkge1xuICAgIGlmIChcbiAgICAgIChtb2R1bGU6YW55KS5ob3QuZGF0YSAmJlxuICAgICAgKG1vZHVsZTphbnkpLmhvdC5kYXRhLl9fdWRfXyAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKChtb2R1bGU6YW55KS5ob3QuZGF0YS5fX3VkX18sIGtleSlcbiAgICApIHtcbiAgICAgIHZhbHVlID0gKG1vZHVsZTphbnkpLmhvdC5kYXRhLl9fdWRfX1trZXldO1xuICAgICAgdmFsdWVXYXNTZXQgPSB0cnVlO1xuICAgIH1cbiAgICAobW9kdWxlOmFueSkuaG90LmRpc3Bvc2UoZGF0YSA9PiB7XG4gICAgICBpZiAoIWRhdGEuX191ZF9fKVxuICAgICAgICBkYXRhLl9fdWRfXyA9IHt9O1xuICAgICAgZGF0YS5fX3VkX19ba2V5XSA9IHZhbHVlO1xuICAgIH0pO1xuICB9XG4gIGlmICghdmFsdWVXYXNTZXQpXG4gICAgdmFsdWUgPSBmbigpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZvYmo8VDogT2JqZWN0Pihtb2R1bGU6IHR5cGVvZiBtb2R1bGUsIG9iamVjdDogVCwga2V5PzpzdHJpbmc9JycpOiBUIHtcbiAgY29uc3Qgc2hhcmVkT2JqZWN0ID0gZGVmb25jZShtb2R1bGUsICgpPT5vYmplY3QsICctLWRlZm9iai0nK2tleSk7XG4gIGlmIChzaGFyZWRPYmplY3QgIT09IG9iamVjdCkge1xuICAgIGNsb25lT250b1RhcmdldChzaGFyZWRPYmplY3QsIG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHNoYXJlZE9iamVjdDtcbn1cblxuLy8gQXNzaWducyBhbGwgcHJvcGVydGllcyBvZiBvYmplY3Qgb250byB0YXJnZXQsIGFuZCBkZWxldGVzIGFueSBwcm9wZXJ0aWVzXG4vLyBmcm9tIHRhcmdldCB0aGF0IGRvbid0IGV4aXN0IG9uIG9iamVjdC4gVGhlIG9wdGlvbmFsIGJsYWNrbGlzdCBhcmd1bWVudFxuLy8gc3BlY2lmaWVzIHByb3BlcnRpZXMgdG8gbm90IGFzc2lnbiBvbiB0YXJnZXQuXG5mdW5jdGlvbiBjbG9uZU9udG9UYXJnZXQ8VDogT2JqZWN0Pih0YXJnZXQ6IFQsIG9iamVjdDogT2JqZWN0KTogVCB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAuZmlsdGVyKG5hbWUgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG5hbWUpKVxuICAgIC5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgZGVsZXRlIHRhcmdldFtuYW1lXTtcbiAgICB9KTtcbiAgY29uc3QgbmV3UHJvcHNDaGFpbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFxuICAgIHRhcmdldCxcbiAgICB6aXBPYmplY3QobmV3UHJvcHNDaGFpbiwgbmV3UHJvcHNDaGFpblxuICAgICAgLm1hcChuYW1lID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBuYW1lKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKHt2YWx1ZSxlbnVtZXJhYmxlfSkgPT5cbiAgICAgICAgKHt2YWx1ZSxlbnVtZXJhYmxlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KVxuICAgICAgKVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZm48VDogRnVuY3Rpb24+KG1vZHVsZTogdHlwZW9mIG1vZHVsZSwgZm46IFQsIGtleT86c3RyaW5nPScnKTogVCB7XG4gIGNvbnN0IHNoYXJlZCA9IGRlZm9uY2UobW9kdWxlLCAoKT0+e1xuICAgIGlmICghKG1vZHVsZTphbnkpLmhvdCkge1xuICAgICAgcmV0dXJuIHtmbjogKG51bGw6ID9UKSwgd3JhcHBlcjogZm59O1xuICAgIH1cbiAgICBjb25zdCBzaGFyZWQ6IE9iamVjdCA9IHtmbjogbnVsbCwgd3JhcHBlcjogbnVsbH07XG4gICAgY29uc3QgcGFyYW1zTGlzdCA9IHJhbmdlKGZuLmxlbmd0aCkubWFwKHggPT4gJ2EnK3gpLmpvaW4oJywnKTtcbiAgICBzaGFyZWQud3JhcHBlciA9IChuZXcgRnVuY3Rpb24oXG4gICAgICAnc2hhcmVkJyxcbiAgICAgIGBcbiAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIHJldHVybiBmdW5jdGlvbiAke2ZuLm5hbWV9X191ZF93cmFwcGVyKCR7cGFyYW1zTGlzdH0pIHtcbiAgICAgICAgaWYgKG5ldy50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3Qoc2hhcmVkLmZuLCBhcmd1bWVudHMsIG5ldy50YXJnZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzaGFyZWQuZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGBcbiAgICApOiBhbnkpKHNoYXJlZCk7XG4gICAgaWYgKGZuLnByb3RvdHlwZSkge1xuICAgICAgKHNoYXJlZC53cmFwcGVyOmFueSkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmbi5wcm90b3R5cGUpO1xuICAgICAgKHNoYXJlZC53cmFwcGVyOmFueSkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc2hhcmVkLndyYXBwZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIChzaGFyZWQud3JhcHBlcjphbnkpLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYXJlZDtcbiAgfSwgJy0tZGVmbi1zaGFyZWQtJytrZXkpO1xuICBzaGFyZWQuZm4gPSBmbjtcbiAgaWYgKChtb2R1bGU6YW55KS5ob3QpIHtcbiAgICBpZiAoZm4ucHJvdG90eXBlICYmIChzaGFyZWQud3JhcHBlcjphbnkpLnByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoKHNoYXJlZC53cmFwcGVyOmFueSkucHJvdG90eXBlKSAhPT0gZm4ucHJvdG90eXBlKSB7XG4gICAgICAoT2JqZWN0OiBhbnkpLnNldFByb3RvdHlwZU9mKChzaGFyZWQud3JhcHBlcjphbnkpLnByb3RvdHlwZSwgZm4ucHJvdG90eXBlKTtcbiAgICB9XG4gICAgKE9iamVjdDogYW55KS5zZXRQcm90b3R5cGVPZihzaGFyZWQud3JhcHBlciwgZm4pO1xuICB9XG4gIHJldHVybiBzaGFyZWQud3JhcHBlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUEsSUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3BDLElBQU1DLFNBQVMsR0FBR0QsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN2QyxJQUFNRSxn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