UNPKG

jaybe-react-universal-component

Version:

A higher order component for loading components with promises

216 lines (173 loc) 7.23 kB
"use strict"; 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 }; };