| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const RequireContextDependency = require("./RequireContextDependency"); |
| const ContextElementDependency = require("./ContextElementDependency"); |
| |
| const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin"); |
| |
| class RequireContextPlugin { |
| constructor(modulesDirectories, extensions, mainFiles) { |
| if (!Array.isArray(modulesDirectories)) { |
| throw new Error("modulesDirectories must be an array"); |
| } |
| if (!Array.isArray(extensions)) { |
| throw new Error("extensions must be an array"); |
| } |
| this.modulesDirectories = modulesDirectories; |
| this.extensions = extensions; |
| this.mainFiles = mainFiles; |
| } |
| |
| apply(compiler) { |
| compiler.hooks.compilation.tap( |
| "RequireContextPlugin", |
| (compilation, { contextModuleFactory, normalModuleFactory }) => { |
| compilation.dependencyFactories.set( |
| RequireContextDependency, |
| contextModuleFactory |
| ); |
| compilation.dependencyTemplates.set( |
| RequireContextDependency, |
| new RequireContextDependency.Template() |
| ); |
| |
| compilation.dependencyFactories.set( |
| ContextElementDependency, |
| normalModuleFactory |
| ); |
| |
| const handler = (parser, parserOptions) => { |
| if ( |
| parserOptions.requireContext !== undefined && |
| !parserOptions.requireContext |
| ) |
| return; |
| |
| new RequireContextDependencyParserPlugin().apply(parser); |
| }; |
| |
| normalModuleFactory.hooks.parser |
| .for("javascript/auto") |
| .tap("RequireContextPlugin", handler); |
| normalModuleFactory.hooks.parser |
| .for("javascript/dynamic") |
| .tap("RequireContextPlugin", handler); |
| |
| contextModuleFactory.hooks.alternatives.tap( |
| "RequireContextPlugin", |
| items => { |
| if (items.length === 0) return items; |
| return items |
| .map(obj => { |
| return this.extensions |
| .filter(ext => { |
| const l = obj.request.length; |
| return ( |
| l > ext.length && |
| obj.request.substr(l - ext.length, l) === ext |
| ); |
| }) |
| .map(ext => { |
| const l = obj.request.length; |
| return { |
| context: obj.context, |
| request: obj.request.substr(0, l - ext.length) |
| }; |
| }) |
| .concat(obj); |
| }) |
| .reduce((a, b) => a.concat(b), []); |
| } |
| ); |
| |
| contextModuleFactory.hooks.alternatives.tap( |
| "RequireContextPlugin", |
| items => { |
| if (items.length === 0) return items; |
| return items |
| .map(obj => { |
| return this.mainFiles |
| .filter(mainFile => { |
| const l = obj.request.length; |
| return ( |
| l > mainFile.length + 1 && |
| obj.request.substr(l - mainFile.length - 1, l) === |
| "/" + mainFile |
| ); |
| }) |
| .map(mainFile => { |
| const l = obj.request.length; |
| return [ |
| { |
| context: obj.context, |
| request: obj.request.substr(0, l - mainFile.length) |
| }, |
| { |
| context: obj.context, |
| request: obj.request.substr(0, l - mainFile.length - 1) |
| } |
| ]; |
| }) |
| .reduce((a, b) => a.concat(b), []) |
| .concat(obj); |
| }) |
| .reduce((a, b) => a.concat(b), []); |
| } |
| ); |
| |
| contextModuleFactory.hooks.alternatives.tap( |
| "RequireContextPlugin", |
| items => { |
| if (items.length === 0) return items; |
| return items.map(obj => { |
| for (let i = 0; i < this.modulesDirectories.length; i++) { |
| const dir = this.modulesDirectories[i]; |
| const idx = obj.request.indexOf("./" + dir + "/"); |
| if (idx === 0) { |
| obj.request = obj.request.slice(dir.length + 3); |
| break; |
| } |
| } |
| return obj; |
| }); |
| } |
| ); |
| } |
| ); |
| } |
| } |
| module.exports = RequireContextPlugin; |