webpack/lib/util/lazyRequire.js

48 lines
1.4 KiB
JavaScript

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Ivan Kopeykin @vankop
*/
"use strict";
/* Fork from https://github.com/sindresorhus/import-lazy */
const lazy = (importedModule, requireFn, moduleId) =>
importedModule === undefined ? requireFn(moduleId) : importedModule;
/**
* @template T
* @callback LazyRequire
* @param {string} moduleId path to module
* @param {boolean} [isFunction] flag for Proxy type,
* if true returns function, object otherwise.
* True by default since webpack modules are mostly functions or classes
* @returns {T} module export
*/
/**
* @template T
* @param {Function} requireFn require function relative to parent module
* @returns {LazyRequire<T>} require function
*/
module.exports = requireFn => (moduleId, isFunction = true) => {
let importedModule;
const handler = {
get: (target, property) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.get(importedModule, property);
},
apply: (target, thisArgument, argumentsList) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.apply(importedModule, thisArgument, argumentsList);
},
construct: (target, argumentsList) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.construct(importedModule, argumentsList);
}
};
return new Proxy(isFunction ? function() {} : {}, handler);
};