UNPKG

react-universal-component

Version:

A higher order component for loading components with promises

192 lines (154 loc) 6.07 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.clearChunks = exports.flushModuleIds = exports.flushChunkNames = exports.MODULE_IDS = exports.CHUNK_NAMES = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.default = requireUniversalModule; var _utils = require('./utils'); var CHUNK_NAMES = exports.CHUNK_NAMES = new Set(); var MODULE_IDS = exports.MODULE_IDS = new Set(); function requireUniversalModule(universalConfig, options, props, prevProps) { var key = options.key, _options$timeout = options.timeout, timeout = _options$timeout === undefined ? 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) { var exp = (0, _utils.loadFromCache)(chunkName, props, modCache); if (!exp) { var mod = void 0; if (!(0, _utils.isWebpack)() && path) { var modulePath = (0, _utils.callForString)(path, props) || ''; mod = (0, _utils.tryRequire)(modulePath); } else if ((0, _utils.isWebpack)() && resolve) { var weakId = (0, _utils.callForString)(resolve, props); if (__webpack_modules__[weakId]) { mod = (0, _utils.tryRequire)(weakId); } } if (mod) { exp = (0, _utils.resolveExport)(mod, key, onLoad, chunkName, props, modCache, true); } } return exp; }; var requireAsync = function requireAsync(props) { 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 _isServer = typeof window === 'undefined'; var info = { isServer: _isServer }; 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, 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) { 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) { var cacheKey = (0, _utils.callForString)(chunkName, next); var config = getConfig(isDynamic, universalConfig, options, prev); var prevCacheKey = (0, _utils.callForString)(config.chunkName, prev); return cacheKey !== prevCacheKey; }; return { requireSync: requireSync, requireAsync: requireAsync, addModule: addModule, shouldUpdate: shouldUpdate, asyncOnly: asyncOnly }; } var flushChunkNames = exports.flushChunkNames = function flushChunkNames() { var chunks = Array.from(CHUNK_NAMES); CHUNK_NAMES.clear(); return chunks; }; var flushModuleIds = exports.flushModuleIds = function flushModuleIds() { var ids = Array.from(MODULE_IDS); MODULE_IDS.clear(); return ids; }; var clearChunks = exports.clearChunks = function clearChunks() { CHUNK_NAMES.clear(); MODULE_IDS.clear(); }; var getConfig = function getConfig(isDynamic, universalConfig, options, props) { if (isDynamic) { var resultingConfig = typeof universalConfig === 'function' ? universalConfig(props) : universalConfig; if (options) { resultingConfig = _extends({}, resultingConfig, options); } 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, ignoreBabelRename: true }; };