UNPKG

@steambrew/client

Version:
116 lines (115 loc) 3.99 kB
import Logger from './logger'; const logger = new Logger('Webpack'); export let modules = []; function initModuleCache() { const startTime = performance.now(); logger.group('Webpack Module Init'); // Webpack 5, currently on beta // Generate a fake module ID const id = Math.random(); // really should be an int and not a float but who cares let webpackRequire; // Insert our module in a new chunk. // The module will then be called with webpack's internal require function as its first argument window.webpackChunksteamui.push([ [id], {}, (r) => { webpackRequire = r; }, ]); logger.log('Initializing all modules. Errors here likely do not matter, as they are usually just failing module side effects.'); // Loop over every module ID for (let i of Object.keys(webpackRequire.m)) { try { const module = webpackRequire(i); if (module) { modules.push(module); } } catch (e) { logger.debug('Ignoring require error for module', i, e); } } logger.groupEnd(`Modules initialized in ${performance.now() - startTime}ms...`); } initModuleCache(); export const findModule = (filter) => { for (const m of modules) { if (m.default && filter(m.default)) return m.default; if (filter(m)) return m; } }; if (typeof window.SP_REACT === 'undefined') { // @ts-ignore window.SP_REACTDOM = findModule((module) => module.createPortal && module.createRoot && module.flushSync); window.SP_REACT = findModule((module) => module.Component && module.PureComponent && module.useLayoutEffect); } export const findModuleDetailsByExport = (filter, minExports) => { for (const m of modules) { if (!m) continue; for (const mod of [m.default, m]) { if (typeof mod !== 'object') continue; if (minExports && Object.keys(mod).length < minExports) continue; for (let exportName in mod) { if (mod?.[exportName]) { const filterRes = filter(mod[exportName], exportName); if (filterRes) { return [mod, mod[exportName], exportName]; } else { continue; } } } } } return [undefined, undefined, undefined]; }; export const findModuleByExport = (filter, minExports) => { return findModuleDetailsByExport(filter, minExports)?.[0]; }; export const findModuleExport = (filter, minExports) => { return findModuleDetailsByExport(filter, minExports)?.[1]; }; /** * @deprecated use findModuleExport instead */ export const findModuleChild = (filter) => { for (const m of modules) { for (const mod of [m.default, m]) { const filterRes = filter(mod); if (filterRes) { return filterRes; } else { continue; } } } }; export const findAllModules = (filter) => { const out = []; for (const m of modules) { if (m.default && filter(m.default)) out.push(m.default); if (filter(m)) out.push(m); } return out; }; export const CommonUIModule = modules.find((m) => { if (typeof m !== 'object') return false; for (let prop in m) { if (m[prop]?.contextType?._currentValue && Object.keys(m).length > 60) return true; } return false; }); export const IconsModule = findModuleByExport((e) => e?.toString && /Spinner\)}\)?,.\.createElement\(\"path\",{d:\"M18 /.test(e.toString())); export const ReactRouter = findModuleByExport((e) => e.computeRootMatch);