From 758a388f691bba849b199964640cbab1cab8f91d Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 7 Dec 2017 10:31:00 +0100 Subject: [PATCH] pass runtimeTemplate to DependencyTemplate move outputOptions and requestShortener into runtimeTemplate --- lib/Compilation.js | 6 ++- lib/ContextModule.js | 12 +++--- lib/DependenciesBlockVariable.js | 4 +- lib/EvalDevToolModuleTemplatePlugin.js | 4 +- ...valSourceMapDevToolModuleTemplatePlugin.js | 4 +- lib/FunctionModuleTemplatePlugin.js | 6 +-- lib/ModuleTemplate.js | 7 ++-- lib/MultiModule.js | 4 +- lib/NormalModule.js | 21 +++++----- lib/RuntimeTemplate.js | 12 ++++++ lib/dependencies/AMDRequireArrayDependency.js | 8 ++-- lib/dependencies/AMDRequireDependency.js | 4 +- .../ContextDependencyTemplateAsId.js | 4 +- .../ContextDependencyTemplateAsRequireCall.js | 4 +- lib/dependencies/DepBlockHelpers.js | 10 ++--- lib/dependencies/HarmonyAcceptDependency.js | 4 +- .../HarmonyAcceptImportDependency.js | 2 +- ...armonyExportImportedSpecifierDependency.js | 6 +-- .../HarmonyExportSpecifierDependency.js | 2 +- lib/dependencies/HarmonyImportDependency.js | 8 ++-- .../HarmonyImportSpecifierDependency.js | 6 +-- lib/dependencies/HarmonyInitDependency.js | 4 +- lib/dependencies/ImportDependency.js | 6 +-- lib/dependencies/ImportEagerDependency.js | 4 +- lib/dependencies/ImportWeakDependency.js | 4 +- .../ModuleDependencyTemplateAsId.js | 6 +-- .../ModuleDependencyTemplateAsRequireId.js | 6 +-- lib/dependencies/RequireEnsureDependency.js | 4 +- lib/dependencies/RequireIncludeDependency.js | 4 +- lib/dependencies/UnsupportedDependency.js | 2 +- lib/optimize/ConcatenatedModule.js | 41 ++++++++++--------- .../ContextDependencyTemplateAsId.unittest.js | 33 +++++++-------- 32 files changed, 130 insertions(+), 122 deletions(-) create mode 100644 lib/RuntimeTemplate.js diff --git a/lib/Compilation.js b/lib/Compilation.js index a3688d5e9..0afe5c9b2 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -22,6 +22,7 @@ const MainTemplate = require("./MainTemplate"); const ChunkTemplate = require("./ChunkTemplate"); const HotUpdateChunkTemplate = require("./HotUpdateChunkTemplate"); const ModuleTemplate = require("./ModuleTemplate"); +const RuntimeTemplate = require("./RuntimeTemplate"); const Dependency = require("./Dependency"); const ChunkRenderError = require("./ChunkRenderError"); const AsyncDependencyToInitialChunkWarning = require("./AsyncDependencyToInitialChunkWarning"); @@ -181,9 +182,10 @@ class Compilation extends Tapable { this.mainTemplate = new MainTemplate(this.outputOptions); this.chunkTemplate = new ChunkTemplate(this.outputOptions); this.hotUpdateChunkTemplate = new HotUpdateChunkTemplate(this.outputOptions); + this.runtimeTemplate = new RuntimeTemplate(this.outputOptions, this.requestShortener); this.moduleTemplates = { - javascript: new ModuleTemplate(this.outputOptions, this.requestShortener), - webassembly: new ModuleTemplate(this.outputOptions, this.requestShortener) + javascript: new ModuleTemplate(this.runtimeTemplate), + webassembly: new ModuleTemplate(this.runtimeTemplate) }; this.semaphore = new Semaphore(options.parallelism || 100); diff --git a/lib/ContextModule.js b/lib/ContextModule.js index bf6ec89c6..473057d23 100644 --- a/lib/ContextModule.js +++ b/lib/ContextModule.js @@ -384,8 +384,8 @@ webpackAsyncContext.id = ${JSON.stringify(id)}; module.exports = webpackAsyncContext;`; } - getLazyOnceSource(block, dependencies, id, outputOptions, requestShortener) { - const promise = DepBlockHelpers.getDepBlockPromise(block, outputOptions, requestShortener, "lazy-once context"); + getLazyOnceSource(block, dependencies, id, runtimeTemplate) { + const promise = DepBlockHelpers.getDepBlockPromise(block, runtimeTemplate, "lazy-once context"); const map = this.getUserRequestMap(dependencies); const fakeMap = this.getFakeMap(dependencies); const thenFunction = fakeMap ? @@ -490,7 +490,7 @@ module.exports = webpackEmptyAsyncContext; webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`; } - getSourceString(asyncMode, outputOptions, requestShortener) { + getSourceString(asyncMode, runtimeTemplate) { if(asyncMode === "lazy") { if(this.blocks && this.blocks.length > 0) { return this.getLazySource(this.blocks, this.id); @@ -506,7 +506,7 @@ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`; if(asyncMode === "lazy-once") { const block = this.blocks[0]; if(block) { - return this.getLazyOnceSource(block, block.dependencies, this.id, outputOptions, requestShortener); + return this.getLazyOnceSource(block, block.dependencies, this.id, runtimeTemplate); } return this.getSourceForEmptyAsyncContext(this.id); } @@ -534,9 +534,9 @@ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`; return new RawSource(sourceString); } - source(dependencyTemplates, outputOptions, requestShortener) { + source(dependencyTemplates, runtimeTemplate) { return this.getSource( - this.getSourceString(this.options.mode, outputOptions, requestShortener) + this.getSourceString(this.options.mode, runtimeTemplate) ); } diff --git a/lib/DependenciesBlockVariable.js b/lib/DependenciesBlockVariable.js index 3668cf380..6a6ff5e0d 100644 --- a/lib/DependenciesBlockVariable.js +++ b/lib/DependenciesBlockVariable.js @@ -22,12 +22,12 @@ class DependenciesBlockVariable { }); } - expressionSource(dependencyTemplates, outputOptions, requestShortener) { + expressionSource(dependencyTemplates, runtimeTemplate) { const source = new ReplaceSource(new RawSource(this.expression)); this.dependencies.forEach(dep => { const template = dependencyTemplates.get(dep.constructor); if(!template) throw new Error(`No template for dependency: ${dep.constructor.name}`); - template.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); + template.apply(dep, source, runtimeTemplate, dependencyTemplates); }); return source; } diff --git a/lib/EvalDevToolModuleTemplatePlugin.js b/lib/EvalDevToolModuleTemplatePlugin.js index af4b443a6..eb5bd1446 100644 --- a/lib/EvalDevToolModuleTemplatePlugin.js +++ b/lib/EvalDevToolModuleTemplatePlugin.js @@ -23,9 +23,9 @@ class EvalDevToolModuleTemplatePlugin { const str = ModuleFilenameHelpers.createFilename(module, { moduleFilenameTemplate: this.moduleFilenameTemplate, namespace: this.namespace - }, moduleTemplate.requestShortener); + }, moduleTemplate.runtimeTemplate.requestShortener); const footer = ["\n", - ModuleFilenameHelpers.createFooter(module, moduleTemplate.requestShortener), + ModuleFilenameHelpers.createFooter(module, moduleTemplate.runtimeTemplate.requestShortener), this.sourceUrlComment.replace(/\[url\]/g, encodeURI(str).replace(/%2F/g, "/").replace(/%20/g, "_").replace(/%5E/g, "^").replace(/%5C/g, "\\").replace(/^\//, "")) ].join("\n"); const result = new RawSource(`eval(${JSON.stringify(content + footer)});`); diff --git a/lib/EvalSourceMapDevToolModuleTemplatePlugin.js b/lib/EvalSourceMapDevToolModuleTemplatePlugin.js index b959c8b6f..24fd1996e 100644 --- a/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +++ b/lib/EvalSourceMapDevToolModuleTemplatePlugin.js @@ -49,7 +49,7 @@ class EvalSourceMapDevToolModuleTemplatePlugin { return ModuleFilenameHelpers.createFilename(module, { moduleFilenameTemplate: self.moduleFilenameTemplate, namespace: self.namespace - }, moduleTemplate.requestShortener); + }, moduleTemplate.runtimeTemplate.requestShortener); }); moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(moduleFilenames, (filename, i, n) => { for(let j = 0; j < n; j++) @@ -59,7 +59,7 @@ class EvalSourceMapDevToolModuleTemplatePlugin { sourceMap.sources = moduleFilenames; if(sourceMap.sourcesContent) { sourceMap.sourcesContent = sourceMap.sourcesContent.map((content, i) => { - return typeof content === "string" ? `${content}\n\n\n${ModuleFilenameHelpers.createFooter(modules[i], moduleTemplate.requestShortener)}` : null; + return typeof content === "string" ? `${content}\n\n\n${ModuleFilenameHelpers.createFooter(modules[i], moduleTemplate.runtimeTemplate.requestShortener)}` : null; }); } sourceMap.sourceRoot = options.sourceRoot || ""; diff --git a/lib/FunctionModuleTemplatePlugin.js b/lib/FunctionModuleTemplatePlugin.js index 0507884d2..2fd32ef66 100644 --- a/lib/FunctionModuleTemplatePlugin.js +++ b/lib/FunctionModuleTemplatePlugin.js @@ -31,9 +31,9 @@ class FunctionModuleTemplatePlugin { }); moduleTemplate.plugin("package", (moduleSource, module) => { - if(moduleTemplate.outputOptions.pathinfo) { + if(moduleTemplate.runtimeTemplate.outputOptions.pathinfo) { const source = new ConcatSource(); - const req = module.readableIdentifier(moduleTemplate.requestShortener); + const req = module.readableIdentifier(moduleTemplate.runtimeTemplate.requestShortener); source.add("/*!****" + req.replace(/./g, "*") + "****!*\\\n"); source.add(" !*** " + req.replace(/\*\//g, "*_/") + " ***!\n"); source.add(" \\****" + req.replace(/./g, "*") + "****/\n"); @@ -51,7 +51,7 @@ class FunctionModuleTemplatePlugin { source.add(Template.toComment("all exports used") + "\n"); if(module.optimizationBailout) { module.optimizationBailout.forEach(text => { - if(typeof text === "function") text = text(moduleTemplate.requestShortener); + if(typeof text === "function") text = text(moduleTemplate.runtimeTemplate.requestShortener); source.add(Template.toComment(`${text}`) + "\n"); }); } diff --git a/lib/ModuleTemplate.js b/lib/ModuleTemplate.js index 05fa3f1ff..1a9191a3b 100644 --- a/lib/ModuleTemplate.js +++ b/lib/ModuleTemplate.js @@ -9,10 +9,9 @@ const SyncWaterfallHook = require("tapable").SyncWaterfallHook; const SyncHook = require("tapable").SyncHook; module.exports = class ModuleTemplate extends Tapable { - constructor(outputOptions, requestShortener) { + constructor(runtimeTemplate) { super(); - this.outputOptions = outputOptions || {}; - this.requestShortener = requestShortener; + this.runtimeTemplate = runtimeTemplate; this.hooks = { content: new SyncWaterfallHook(["source", "module", "options", "dependencyTemplates"]), module: new SyncWaterfallHook(["source", "module", "options", "dependencyTemplates"]), @@ -23,7 +22,7 @@ module.exports = class ModuleTemplate extends Tapable { } render(module, dependencyTemplates, options) { - const moduleSource = module.source(dependencyTemplates, this.outputOptions, this.requestShortener); + const moduleSource = module.source(dependencyTemplates, this.runtimeTemplate); const moduleSourcePostContent = this.hooks.content.call(moduleSource, module, options, dependencyTemplates); const moduleSourcePostModule = this.hooks.module.call(moduleSourcePostContent, module, options, dependencyTemplates); const moduleSourcePostRender = this.hooks.render.call(moduleSourcePostModule, module, options, dependencyTemplates); diff --git a/lib/MultiModule.js b/lib/MultiModule.js index e2dd7455d..70bc1a103 100644 --- a/lib/MultiModule.js +++ b/lib/MultiModule.js @@ -46,14 +46,14 @@ class MultiModule extends Module { super.updateHash(hash); } - source(dependencyTemplates, outputOptions) { + source(dependencyTemplates, runtimeTemplate) { const str = []; this.dependencies.forEach((dep, idx) => { if(dep.module) { if(idx === this.dependencies.length - 1) str.push("module.exports = "); str.push("__webpack_require__("); - if(outputOptions.pathinfo) + if(runtimeTemplate.outputOptions.pathinfo) str.push(Template.toComment(dep.request)); str.push(`${JSON.stringify(dep.module.id)}`); str.push(")"); diff --git a/lib/NormalModule.js b/lib/NormalModule.js index da50e4e02..b1ffec554 100644 --- a/lib/NormalModule.js +++ b/lib/NormalModule.js @@ -332,15 +332,15 @@ class NormalModule extends Module { return `${this.hash}-${dtHash}`; } - sourceDependency(dependency, dependencyTemplates, source, outputOptions, requestShortener) { + sourceDependency(dependency, dependencyTemplates, source, runtimeTemplate) { const template = dependencyTemplates.get(dependency.constructor); if(!template) throw new Error("No template for dependency: " + dependency.constructor.name); - template.apply(dependency, source, outputOptions, requestShortener, dependencyTemplates); + template.apply(dependency, source, runtimeTemplate, dependencyTemplates); } - sourceVariables(variable, availableVars, dependencyTemplates, outputOptions, requestShortener) { + sourceVariables(variable, availableVars, dependencyTemplates, runtimeTemplate) { const name = variable.name; - const expr = variable.expressionSource(dependencyTemplates, outputOptions, requestShortener); + const expr = variable.expressionSource(dependencyTemplates, runtimeTemplate); if(availableVars.some(v => v.name === name && v.expression.source() === expr.source())) { return; @@ -400,9 +400,9 @@ class NormalModule extends Module { }, startState); } - sourceBlock(block, availableVars, dependencyTemplates, source, outputOptions, requestShortener) { + sourceBlock(block, availableVars, dependencyTemplates, source, runtimeTemplate) { block.dependencies.forEach((dependency) => this.sourceDependency( - dependency, dependencyTemplates, source, outputOptions, requestShortener)); + dependency, dependencyTemplates, source, runtimeTemplate)); /** * Get the variables of all blocks that we need to inject. @@ -411,7 +411,7 @@ class NormalModule extends Module { */ const vars = block.variables.reduce((result, value) => { const variable = this.sourceVariables( - value, availableVars, dependencyTemplates, outputOptions, requestShortener); + value, availableVars, dependencyTemplates, runtimeTemplate); if(variable) { result.push(variable); @@ -478,13 +478,12 @@ class NormalModule extends Module { availableVars.concat(vars), dependencyTemplates, source, - outputOptions, - requestShortener + runtimeTemplate ) ); } - source(dependencyTemplates, outputOptions, requestShortener) { + source(dependencyTemplates, runtimeTemplate) { if(this.type.startsWith("javascript")) { const hashDigest = this.getHashDigest(dependencyTemplates); if(this._cachedSourceHash === hashDigest) { @@ -498,7 +497,7 @@ class NormalModule extends Module { const source = new ReplaceSource(this._source); - this.sourceBlock(this, [], dependencyTemplates, source, outputOptions, requestShortener); + this.sourceBlock(this, [], dependencyTemplates, source, runtimeTemplate); const cachedSource = new CachedSource(source); this._cachedSource = cachedSource; diff --git a/lib/RuntimeTemplate.js b/lib/RuntimeTemplate.js new file mode 100644 index 000000000..1ec891d40 --- /dev/null +++ b/lib/RuntimeTemplate.js @@ -0,0 +1,12 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +module.exports = class RuntimeTemplate { + constructor(outputOptions, requestShortener) { + this.outputOptions = outputOptions || {}; + this.requestShortener = requestShortener; + } +}; diff --git a/lib/dependencies/AMDRequireArrayDependency.js b/lib/dependencies/AMDRequireArrayDependency.js index 952e52ad4..6ae6e70b7 100644 --- a/lib/dependencies/AMDRequireArrayDependency.js +++ b/lib/dependencies/AMDRequireArrayDependency.js @@ -20,14 +20,14 @@ class AMDRequireArrayDependency extends Dependency { } AMDRequireArrayDependency.Template = class AMDRequireArrayDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { - const content = this.getContent(dep, outputOptions, requestShortener); + apply(dep, source, runtime) { + const content = this.getContent(dep, runtime); source.replace(dep.range[0], dep.range[1] - 1, content); } - getContent(dep, outputOptions, requestShortener) { + getContent(dep, runtime) { const requires = dep.depsArray.map((dependency) => { - const optionalComment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dependency.request)) : ""; + const optionalComment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dependency.request)) : ""; return this.contentForDependency(dependency, optionalComment); }); return `[${requires.join(", ")}]`; diff --git a/lib/dependencies/AMDRequireDependency.js b/lib/dependencies/AMDRequireDependency.js index b97c1fb4a..5c5839e77 100644 --- a/lib/dependencies/AMDRequireDependency.js +++ b/lib/dependencies/AMDRequireDependency.js @@ -14,9 +14,9 @@ class AMDRequireDependency extends NullDependency { } AMDRequireDependency.Template = class AMDRequireDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { const depBlock = dep.block; - const wrapper = DepBlockHelpers.getLoadDepBlockWrapper(depBlock, outputOptions, requestShortener, "require"); + const wrapper = DepBlockHelpers.getLoadDepBlockWrapper(depBlock, runtime, "require"); // has array range but no function range if(depBlock.arrayRange && !depBlock.functionRange) { diff --git a/lib/dependencies/ContextDependencyTemplateAsId.js b/lib/dependencies/ContextDependencyTemplateAsId.js index df9bf7cc5..6fd99f486 100644 --- a/lib/dependencies/ContextDependencyTemplateAsId.js +++ b/lib/dependencies/ContextDependencyTemplateAsId.js @@ -8,8 +8,8 @@ const Template = require("../Template"); class ContextDependencyTemplateAsId { - apply(dep, source, outputOptions, requestShortener) { - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dep.request)) + " " : ""; + apply(dep, source, runtime) { + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dep.request)) + " " : ""; if(dep.module && dep.module.dependencies && dep.module.dependencies.length > 0) { if(dep.valueRange) { diff --git a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js index 1bb034fd3..5e50e4678 100644 --- a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +++ b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js @@ -8,8 +8,8 @@ const Template = require("../Template"); class ContextDependencyTemplateAsRequireCall { - apply(dep, source, outputOptions, requestShortener) { - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dep.options.request)) + " " : ""; + apply(dep, source, runtime) { + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dep.options.request)) + " " : ""; const containsDeps = dep.module && dep.module.dependencies && dep.module.dependencies.length > 0; const isAsync = dep.options.mode !== "sync" && dep.options.mode !== "weak"; diff --git a/lib/dependencies/DepBlockHelpers.js b/lib/dependencies/DepBlockHelpers.js index f91a51b90..eb1bdd146 100644 --- a/lib/dependencies/DepBlockHelpers.js +++ b/lib/dependencies/DepBlockHelpers.js @@ -8,8 +8,8 @@ const Template = require("../Template"); const DepBlockHelpers = exports; -DepBlockHelpers.getLoadDepBlockWrapper = (depBlock, outputOptions, requestShortener, name) => { - const promiseCode = DepBlockHelpers.getDepBlockPromise(depBlock, outputOptions, requestShortener, name); +DepBlockHelpers.getLoadDepBlockWrapper = (depBlock, runtimeTemplate, name) => { + const promiseCode = DepBlockHelpers.getDepBlockPromise(depBlock, runtimeTemplate, name); return [ promiseCode + ".then(", ").catch(", @@ -17,11 +17,11 @@ DepBlockHelpers.getLoadDepBlockWrapper = (depBlock, outputOptions, requestShorte ]; }; -DepBlockHelpers.getDepBlockPromise = (depBlock, outputOptions, requestShortener, name) => { +DepBlockHelpers.getDepBlockPromise = (depBlock, runtimeTemplate, name) => { if(depBlock.chunks) { const chunks = depBlock.chunks.filter(chunk => !chunk.hasRuntime() && chunk.id !== null); - const pathChunkCheck = outputOptions.pathinfo && depBlock.chunkName; - const shortChunkName = requestShortener.shorten(depBlock.chunkName); + const pathChunkCheck = runtimeTemplate.outputOptions.pathinfo && depBlock.chunkName; + const shortChunkName = runtimeTemplate.requestShortener.shorten(depBlock.chunkName); const chunkReason = Template.toNormalComment(depBlock.chunkReason); const requireChunkId = chunk => "__webpack_require__.e(" + JSON.stringify(chunk.id) + ")"; name = Template.toNormalComment(name); diff --git a/lib/dependencies/HarmonyAcceptDependency.js b/lib/dependencies/HarmonyAcceptDependency.js index 31ec58c64..599fc3c64 100644 --- a/lib/dependencies/HarmonyAcceptDependency.js +++ b/lib/dependencies/HarmonyAcceptDependency.js @@ -21,10 +21,10 @@ class HarmonyAcceptDependency extends NullDependency { } HarmonyAcceptDependency.Template = class HarmonyAcceptDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { const content = dep.dependencies .filter(dependency => HarmonyImportDependency.Template.isImportEmitted(dependency, source)) - .map(dependency => dependency.getImportStatement(false, outputOptions, requestShortener)) + .map(dependency => dependency.getImportStatement(false, runtime)) .join(""); if(dep.hasCallback) { diff --git a/lib/dependencies/HarmonyAcceptImportDependency.js b/lib/dependencies/HarmonyAcceptImportDependency.js index eefaf6596..dc238f708 100644 --- a/lib/dependencies/HarmonyAcceptImportDependency.js +++ b/lib/dependencies/HarmonyAcceptImportDependency.js @@ -17,7 +17,7 @@ class HarmonyAcceptImportDependency extends HarmonyImportDependency { } HarmonyAcceptImportDependency.Template = class HarmonyAcceptImportDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) {} + apply(dep, source, runtime) {} }; module.exports = HarmonyAcceptImportDependency; diff --git a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js index 0d564412b..78bbec453 100644 --- a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +++ b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js @@ -337,9 +337,9 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency { module.exports = HarmonyExportImportedSpecifierDependency; HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedSpecifierDependencyTemplate extends HarmonyImportDependency.Template { - harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates) { - super.harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates); - const importVar = dep.getImportVar(requestShortener); + harmonyInit(dep, source, runtime, dependencyTemplates) { + super.harmonyInit(dep, source, runtime, dependencyTemplates); + const importVar = dep.getImportVar(); const content = this.getContent(dep, importVar); source.insert(-1, content); } diff --git a/lib/dependencies/HarmonyExportSpecifierDependency.js b/lib/dependencies/HarmonyExportSpecifierDependency.js index cb2b60bfa..f6fa34c31 100644 --- a/lib/dependencies/HarmonyExportSpecifierDependency.js +++ b/lib/dependencies/HarmonyExportSpecifierDependency.js @@ -31,7 +31,7 @@ HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependen return 0; } - harmonyInit(dep, source, outputOptions, requestShortener) { + harmonyInit(dep, source, runtime) { const content = this.getContent(dep); source.insert(-1, content); } diff --git a/lib/dependencies/HarmonyImportDependency.js b/lib/dependencies/HarmonyImportDependency.js index f5bfc228e..5e6841249 100644 --- a/lib/dependencies/HarmonyImportDependency.js +++ b/lib/dependencies/HarmonyImportDependency.js @@ -34,9 +34,9 @@ class HarmonyImportDependency extends ModuleDependency { return importVar; } - getImportStatement(declare, outputOptions, requestShortener) { + getImportStatement(declare, runtime) { const module = this.module; - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(this.request)) : ""; + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(this.request)) : ""; const optDeclaration = declare ? "var " : ""; const optNewline = declare ? "\n" : " "; @@ -85,7 +85,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate { return key && sourceInfo.emittedImports.get(key); } - harmonyInit(dep, source, outputOptions, requestShortener) { + harmonyInit(dep, source, runtime) { let sourceInfo = importEmittedMap.get(source); if(!sourceInfo) { importEmittedMap.set(source, sourceInfo = { @@ -95,7 +95,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate { const key = dep.module || dep.request; if(key && sourceInfo.emittedImports.get(key)) return; sourceInfo.emittedImports.set(key, true); - const content = dep.getImportStatement(true, outputOptions, requestShortener); + const content = dep.getImportStatement(true, runtime); source.insert(-1, content); } }; diff --git a/lib/dependencies/HarmonyImportSpecifierDependency.js b/lib/dependencies/HarmonyImportSpecifierDependency.js index 612ae4908..6f93c4c35 100644 --- a/lib/dependencies/HarmonyImportSpecifierDependency.js +++ b/lib/dependencies/HarmonyImportSpecifierDependency.js @@ -95,9 +95,9 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency { } HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependencyTemplate extends HarmonyImportDependency.Template { - apply(dep, source, outputOptions, requestShortener) { - super.apply(dep, source, outputOptions, requestShortener); - const importedVar = dep.getImportVar(requestShortener); + apply(dep, source, runtime) { + super.apply(dep, source, runtime); + const importedVar = dep.getImportVar(); const content = this.getContent(dep, importedVar); source.replace(dep.range[0], dep.range[1] - 1, content); } diff --git a/lib/dependencies/HarmonyInitDependency.js b/lib/dependencies/HarmonyInitDependency.js index fd684b679..68b2c0543 100644 --- a/lib/dependencies/HarmonyInitDependency.js +++ b/lib/dependencies/HarmonyInitDependency.js @@ -20,7 +20,7 @@ class HarmonyInitDependency extends NullDependency { module.exports = HarmonyInitDependency; HarmonyInitDependency.Template = class HarmonyInitDependencyTemplate { - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { const module = dep.originModule; const list = []; for(const dependency of module.dependencies) { @@ -45,7 +45,7 @@ HarmonyInitDependency.Template = class HarmonyInitDependencyTemplate { }); for(const item of list) { - item.template.harmonyInit(item.dependency, source, outputOptions, requestShortener, dependencyTemplates); + item.template.harmonyInit(item.dependency, source, runtime, dependencyTemplates); } } }; diff --git a/lib/dependencies/ImportDependency.js b/lib/dependencies/ImportDependency.js index fe40eeef2..002895ddf 100644 --- a/lib/dependencies/ImportDependency.js +++ b/lib/dependencies/ImportDependency.js @@ -21,10 +21,10 @@ class ImportDependency extends ModuleDependency { } ImportDependency.Template = class ImportDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { const depBlock = dep.block; - const promise = DepBlockHelpers.getDepBlockPromise(depBlock, outputOptions, requestShortener, "import()"); - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dep.request)) : ""; + const promise = DepBlockHelpers.getDepBlockPromise(depBlock, runtime, "import()"); + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dep.request)) : ""; const content = this.getContent(promise, dep, comment); source.replace(depBlock.range[0], depBlock.range[1] - 1, content); diff --git a/lib/dependencies/ImportEagerDependency.js b/lib/dependencies/ImportEagerDependency.js index a858d5937..dc5ab5b06 100644 --- a/lib/dependencies/ImportEagerDependency.js +++ b/lib/dependencies/ImportEagerDependency.js @@ -19,8 +19,8 @@ class ImportEagerDependency extends ModuleDependency { } ImportEagerDependency.Template = class ImportEagerDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dep.request)) : ""; + apply(dep, source, runtime) { + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dep.request)) : ""; const content = this.getContent(dep, comment); source.replace(dep.range[0], dep.range[1] - 1, content); diff --git a/lib/dependencies/ImportWeakDependency.js b/lib/dependencies/ImportWeakDependency.js index ca391aa88..9e83825b2 100644 --- a/lib/dependencies/ImportWeakDependency.js +++ b/lib/dependencies/ImportWeakDependency.js @@ -20,8 +20,8 @@ class ImportWeakDependency extends ModuleDependency { } ImportWeakDependency.Template = class ImportDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { - const comment = outputOptions.pathinfo ? Template.toComment(requestShortener.shorten(dep.request)) : ""; + apply(dep, source, runtime) { + const comment = runtime.outputOptions.pathinfo ? Template.toComment(runtime.requestShortener.shorten(dep.request)) : ""; const content = this.getContent(dep, comment); source.replace(dep.range[0], dep.range[1] - 1, content); diff --git a/lib/dependencies/ModuleDependencyTemplateAsId.js b/lib/dependencies/ModuleDependencyTemplateAsId.js index a9fafb268..10199711c 100644 --- a/lib/dependencies/ModuleDependencyTemplateAsId.js +++ b/lib/dependencies/ModuleDependencyTemplateAsId.js @@ -8,10 +8,10 @@ const Template = require("../Template"); class ModuleDependencyTemplateAsId { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { if(!dep.range) return; - const comment = outputOptions.pathinfo ? - Template.toComment(requestShortener.shorten(dep.request)) + " " : ""; + const comment = runtime.outputOptions.pathinfo ? + Template.toComment(runtime.requestShortener.shorten(dep.request)) + " " : ""; let content; if(dep.module) content = comment + JSON.stringify(dep.module.id); diff --git a/lib/dependencies/ModuleDependencyTemplateAsRequireId.js b/lib/dependencies/ModuleDependencyTemplateAsRequireId.js index b40d5f3ec..e33061ecb 100644 --- a/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +++ b/lib/dependencies/ModuleDependencyTemplateAsRequireId.js @@ -8,10 +8,10 @@ const Template = require("../Template"); class ModuleDependencyTemplateAsRequireId { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { if(!dep.range) return; - const comment = outputOptions.pathinfo ? - Template.toComment(requestShortener.shorten(dep.request)) + " " : ""; + const comment = runtime.outputOptions.pathinfo ? + Template.toComment(runtime.requestShortener.shorten(dep.request)) + " " : ""; let content; if(dep.module) content = `__webpack_require__(${comment}${JSON.stringify(dep.module.id)})`; diff --git a/lib/dependencies/RequireEnsureDependency.js b/lib/dependencies/RequireEnsureDependency.js index 3a711c946..92b89ed22 100644 --- a/lib/dependencies/RequireEnsureDependency.js +++ b/lib/dependencies/RequireEnsureDependency.js @@ -18,9 +18,9 @@ class RequireEnsureDependency extends NullDependency { } RequireEnsureDependency.Template = class RequireEnsureDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { const depBlock = dep.block; - const wrapper = DepBlockHelpers.getLoadDepBlockWrapper(depBlock, outputOptions, requestShortener, "require.ensure"); + const wrapper = DepBlockHelpers.getLoadDepBlockWrapper(depBlock, runtime, "require.ensure"); const errorCallbackExists = depBlock.expr.arguments.length === 4 || (!depBlock.chunkName && depBlock.expr.arguments.length === 3); const startBlock = wrapper[0] + "("; const middleBlock = `).bind(null, __webpack_require__)${wrapper[1]}`; diff --git a/lib/dependencies/RequireIncludeDependency.js b/lib/dependencies/RequireIncludeDependency.js index 8a34149e2..e429f002d 100644 --- a/lib/dependencies/RequireIncludeDependency.js +++ b/lib/dependencies/RequireIncludeDependency.js @@ -27,8 +27,8 @@ class RequireIncludeDependency extends ModuleDependency { } RequireIncludeDependency.Template = class RequireIncludeDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { - const comment = outputOptions.pathinfo ? Template.toComment(`require.include ${requestShortener.shorten(dep.request)}`) : ""; + apply(dep, source, runtime) { + const comment = runtime.outputOptions.pathinfo ? Template.toComment(`require.include ${runtime.requestShortener.shorten(dep.request)}`) : ""; source.replace(dep.range[0], dep.range[1] - 1, `undefined${comment}`); } }; diff --git a/lib/dependencies/UnsupportedDependency.js b/lib/dependencies/UnsupportedDependency.js index 7fff098b1..be1fd7085 100644 --- a/lib/dependencies/UnsupportedDependency.js +++ b/lib/dependencies/UnsupportedDependency.js @@ -15,7 +15,7 @@ class UnsupportedDependency extends NullDependency { } UnsupportedDependency.Template = class UnsupportedDependencyTemplate { - apply(dep, source, outputOptions, requestShortener) { + apply(dep, source, runtime) { source.replace(dep.range[0], dep.range[1], webpackMissingModule(dep.request)); } }; diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index 9cff4dc52..1c5cc3c23 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -333,7 +333,8 @@ class ConcatenatedModule extends Module { return this.rootModule.identifier() + " " + hash.digest("hex"); } - source(dependencyTemplates, outputOptions, requestShortener) { + source(dependencyTemplates, runtimeTemplate) { + const requestShortener = runtimeTemplate.requestShortener; // Metainfo for each module const modulesWithInfo = this._orderedConcatenationList.map((info, idx) => { switch(info.type) { @@ -454,7 +455,7 @@ class ConcatenatedModule extends Module { modulesWithInfo.forEach(info => { if(info.type === "concatenated") { const m = info.module; - const source = m.source(innerDependencyTemplates, outputOptions, requestShortener); + const source = m.source(innerDependencyTemplates, runtimeTemplate); const code = source.source(); let ast; try { @@ -710,20 +711,20 @@ class HarmonyImportSpecifierDependencyConcatenatedTemplate { return NaN; } - harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates) { + harmonyInit(dep, source, runtimeTemplate, dependencyTemplates) { const module = dep.module; const info = this.modulesMap.get(module); if(!info) { - this.originalTemplate.harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.harmonyInit(dep, source, runtimeTemplate, dependencyTemplates); return; } } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { const module = dep.module; const info = this.modulesMap.get(module); if(!info) { - this.originalTemplate.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.apply(dep, source, runtime, dependencyTemplates); return; } let content; @@ -759,20 +760,20 @@ class HarmonyImportSideEffectDependencyConcatenatedTemplate { return NaN; } - harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates) { + harmonyInit(dep, source, runtime, dependencyTemplates) { const module = dep.module; const info = this.modulesMap.get(module); if(!info) { - this.originalTemplate.harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.harmonyInit(dep, source, runtime, dependencyTemplates); return; } } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { const module = dep.module; const info = this.modulesMap.get(module); if(!info) { - this.originalTemplate.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.apply(dep, source, runtime, dependencyTemplates); return; } } @@ -791,16 +792,16 @@ class HarmonyExportSpecifierDependencyConcatenatedTemplate { return NaN; } - harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates) { + harmonyInit(dep, source, runtime, dependencyTemplates) { if(dep.originModule === this.rootModule) { - this.originalTemplate.harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.harmonyInit(dep, source, runtime, dependencyTemplates); return; } } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { if(dep.originModule === this.rootModule) { - this.originalTemplate.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.apply(dep, source, runtime, dependencyTemplates); } } } @@ -811,7 +812,7 @@ class HarmonyExportExpressionDependencyConcatenatedTemplate { this.rootModule = rootModule; } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { let content = "/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = "; if(dep.originModule === this.rootModule) { const used = dep.originModule.isUsed("default"); @@ -873,16 +874,16 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate { return NaN; } - harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates) { + harmonyInit(dep, source, runtime, dependencyTemplates) { const module = dep.module; const info = this.modulesMap.get(module); if(!info) { - this.originalTemplate.harmonyInit(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.harmonyInit(dep, source, runtime, dependencyTemplates); return; } } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { if(dep.originModule === this.rootModule) { if(this.modulesMap.get(dep.module)) { const exportDefs = this.getExports(dep); @@ -905,7 +906,7 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate { source.insert(-1, content); }); } else { - this.originalTemplate.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); + this.originalTemplate.apply(dep, source, runtime, dependencyTemplates); } } } @@ -918,7 +919,7 @@ class HarmonyCompatibilityDependencyConcatenatedTemplate { this.modulesMap = modulesMap; } - apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + apply(dep, source, runtime, dependencyTemplates) { // do nothing } } diff --git a/test/ContextDependencyTemplateAsId.unittest.js b/test/ContextDependencyTemplateAsId.unittest.js index 0332470f6..6873bc9f9 100644 --- a/test/ContextDependencyTemplateAsId.unittest.js +++ b/test/ContextDependencyTemplateAsId.unittest.js @@ -5,26 +5,21 @@ require("should"); const sinon = require("sinon"); const ContextDependencyTemplateAsId = require("../lib/dependencies/ContextDependencyTemplateAsId"); -const requestShortenerMock = { - shorten: (request) => `shortened ${request}` -}; - describe("ContextDependencyTemplateAsId", () => { let env; - const applyContextDependencyTemplateAsId = function() { - const contextDependencyTemplateAsId = new ContextDependencyTemplateAsId(); - const args = [].slice.call(arguments).concat(requestShortenerMock); - contextDependencyTemplateAsId.apply.apply(contextDependencyTemplateAsId, args); - }; - beforeEach(() => { env = { source: { replace: sinon.stub() }, - outputOptions: { - pathinfo: true + runtimeTemplate: { + outputOptions: { + pathinfo: true + }, + requestShortener: { + shorten: (request) => `shortened ${request}` + } }, module: { id: "123", @@ -46,7 +41,7 @@ describe("ContextDependencyTemplateAsId", () => { describe("when applied", () => { describe("with module missing depedencies", () => { beforeEach(() => { - applyContextDependencyTemplateAsId(env.baseDependency, env.source, env.outputOptions); + new ContextDependencyTemplateAsId().apply(env.baseDependency, env.source, env.runtimeTemplate); }); it("replaces source with missing module error", () => { @@ -65,8 +60,8 @@ describe("ContextDependencyTemplateAsId", () => { describe("and path info true", function() { beforeEach(function() { - env.outputOptions.pathinfo = true; - applyContextDependencyTemplateAsId(env.dependency, env.source, env.outputOptions); + env.runtimeTemplate.outputOptions.pathinfo = true; + new ContextDependencyTemplateAsId().apply(env.dependency, env.source, env.runtimeTemplate); }); it("replaces source with webpack require with comment", () => { @@ -77,8 +72,8 @@ describe("ContextDependencyTemplateAsId", () => { describe("and path info false", function() { beforeEach(function() { - env.outputOptions.pathinfo = false; - applyContextDependencyTemplateAsId(env.dependency, env.source, env.outputOptions); + env.runtimeTemplate.outputOptions.pathinfo = false; + new ContextDependencyTemplateAsId().apply(env.dependency, env.source, env.runtimeTemplate); }); it("replaces source with webpack require without comment", () => { @@ -97,7 +92,7 @@ describe("ContextDependencyTemplateAsId", () => { module: env.module }); - applyContextDependencyTemplateAsId(dependency, env.source, env.outputOptions); + new ContextDependencyTemplateAsId().apply(dependency, env.source, env.runtimeTemplate); }); it("replaces source with webpack require and wraps value", () => { @@ -124,7 +119,7 @@ describe("ContextDependencyTemplateAsId", () => { module: env.module }); - applyContextDependencyTemplateAsId(dependency, env.source, env.outputOptions); + new ContextDependencyTemplateAsId().apply(dependency, env.source, env.runtimeTemplate); }); it("replaces source with webpack require, wraps value and make replacements", () => {