ud
Version:
Utilities for updating code live with hot module replacement
114 lines (112 loc) • 14.6 kB
JavaScript
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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
;