jaybe-react-universal-component
Version:
A higher order component for loading components with promises
216 lines (173 loc) • 7.23 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = requireUniversalModule;
exports.clearChunks = exports.flushModuleIds = exports.flushChunkNames = exports.MODULE_IDS = exports.CHUNK_NAMES = void 0;
var _utils = require("./utils");
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var CHUNK_NAMES = new Set();
exports.CHUNK_NAMES = CHUNK_NAMES;
var MODULE_IDS = new Set();
exports.MODULE_IDS = MODULE_IDS;
function requireUniversalModule(universalConfig, options, props, prevProps) {
var key = options.key,
_options$timeout = options.timeout,
timeout = _options$timeout === void 0 ? 15000 : _options$timeout,
onLoad = options.onLoad,
onError = options.onError,
isDynamic = options.isDynamic,
modCache = options.modCache,
promCache = options.promCache,
usesBabelPlugin = options.usesBabelPlugin;
var config = getConfig(isDynamic, universalConfig, options, props);
var chunkName = config.chunkName,
path = config.path,
resolve = config.resolve,
load = config.load;
var asyncOnly = !path && !resolve || typeof chunkName === 'function';
var requireSync = function requireSync(props, context) {
var exp = (0, _utils.loadFromCache)(chunkName, props, modCache);
/*eslint-disable */
if (!exp) {
var mod;
if (!(0, _utils.isWebpack)() && path) {
var modulePath = (0, _utils.callForString)(path, props) || '';
mod = (0, _utils.tryRequire)(modulePath);
} else if ((0, _utils.isWebpack)() && resolve) {
var _isServer = typeof window === 'undefined';
var weakId = (0, _utils.callForString)(resolve, props);
console.log('Synchronously requires on', _isServer ? 'server' : 'client', 'weakId', weakId);
if (__webpack_modules__[weakId]) {
console.log('__webpack_modules__[weakId] requires on', _isServer ? 'server' : 'client', 'weakId', weakId);
mod = (0, _utils.tryRequire)(weakId);
}
}
/*eslint-enable */
if (mod) {
exp = (0, _utils.resolveExport)(mod, key, onLoad, chunkName, props, context, modCache, true);
}
}
return exp;
};
var requireAsync = function requireAsync(props, context) {
var exp = (0, _utils.loadFromCache)(chunkName, props, modCache);
if (exp) return Promise.resolve(exp);
var cachedPromise = (0, _utils.loadFromPromiseCache)(chunkName, props, promCache);
if (cachedPromise) return cachedPromise;
var prom = new Promise(function (res, rej) {
var reject = function reject(error) {
error = error || new Error('timeout exceeded');
clearTimeout(timer);
if (onError) {
var _isServer2 = typeof window === 'undefined';
var info = {
isServer: _isServer2
};
onError(error, info);
}
rej(error);
}; // const timer = timeout && setTimeout(reject, timeout)
var timer = timeout && setTimeout(reject, timeout);
var resolve = function resolve(mod) {
clearTimeout(timer);
var exp = (0, _utils.resolveExport)(mod, key, onLoad, chunkName, props, context, modCache);
if (exp) return res(exp);
reject(new Error('export not found'));
};
var request = load(props, {
resolve: resolve,
reject: reject
}); // if load doesn't return a promise, it must call resolveImport
// itself. Most common is the promise implementation below.
if (!request || typeof request.then !== 'function') return;
request.then(resolve).catch(reject);
});
(0, _utils.cacheProm)(prom, chunkName, props, promCache);
return prom;
};
var addModule = function addModule(props) {
if (_utils.isServer || _utils.isTest) {
console.log('add module usesBabelPlugin:', usesBabelPlugin);
if (chunkName) {
var name = (0, _utils.callForString)(chunkName, props);
if (usesBabelPlugin) {
// if ignoreBabelRename is true, don't apply regex
var shouldKeepName = options && !!options.ignoreBabelRename;
if (!shouldKeepName) {
name = name.replace(/\//g, '-');
}
}
if (name) CHUNK_NAMES.add(name);
if (!_utils.isTest) return name; // makes tests way smaller to run both kinds
}
if ((0, _utils.isWebpack)()) {
var weakId = (0, _utils.callForString)(resolve, props);
if (weakId) MODULE_IDS.add(weakId);
return weakId;
}
if (!(0, _utils.isWebpack)()) {
var modulePath = (0, _utils.callForString)(path, props);
if (modulePath) MODULE_IDS.add(modulePath);
return modulePath;
}
}
};
var shouldUpdate = function shouldUpdate(next, prev) {
console.log('shouldUpdate', next, prev, chunkName);
var cacheKey = (0, _utils.callForString)(chunkName, next);
console.log('cacheKey', cacheKey);
var config = getConfig(isDynamic, universalConfig, options, prev);
console.log('config', config);
var prevCacheKey = (0, _utils.callForString)(config.chunkName, prev);
return cacheKey !== prevCacheKey;
};
return {
requireSync: requireSync,
requireAsync: requireAsync,
addModule: addModule,
shouldUpdate: shouldUpdate,
asyncOnly: asyncOnly
};
}
var flushChunkNames = function flushChunkNames() {
var chunks = Array.from(CHUNK_NAMES);
CHUNK_NAMES.clear();
return chunks;
};
exports.flushChunkNames = flushChunkNames;
var flushModuleIds = function flushModuleIds() {
var ids = Array.from(MODULE_IDS);
MODULE_IDS.clear();
return ids;
};
exports.flushModuleIds = flushModuleIds;
var clearChunks = function clearChunks() {
CHUNK_NAMES.clear();
MODULE_IDS.clear();
};
exports.clearChunks = clearChunks;
var getConfig = function getConfig(isDynamic, universalConfig, options, props) {
console.log('getConfig isDynamic', isDynamic);
if (isDynamic) {
var resultingConfig = typeof universalConfig === 'function' ? universalConfig(props) : universalConfig;
if (options) {
resultingConfig = _objectSpread({}, resultingConfig, options);
}
console.log('resultingConfig', resultingConfig);
return resultingConfig;
}
var load = typeof universalConfig === 'function' ? universalConfig : // $FlowIssue
function () {
return universalConfig;
};
return {
file: 'default',
id: options.id || 'default',
chunkName: options.chunkName || 'default',
resolve: options.resolve || '',
path: options.path || '',
load: load
};
};
;