Merge pull request #6086 from webpack/refactor/runtime-template

pass runtimeTemplate to DependencyTemplate
This commit is contained in:
Tobias Koppers 2017-12-11 20:42:38 +01:00 committed by GitHub
commit d526d5f11c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 130 additions and 122 deletions

View File

@ -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);

View File

@ -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)
);
}

View File

@ -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;
}

View File

@ -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)});`);

View File

@ -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 || "";

View File

@ -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");
});
}

View File

@ -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);

View File

@ -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(")");

View File

@ -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;

12
lib/RuntimeTemplate.js Normal file
View File

@ -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;
}
};

View File

@ -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(", ")}]`;

View File

@ -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) {

View File

@ -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) {

View File

@ -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";

View File

@ -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);

View File

@ -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) {

View File

@ -17,7 +17,7 @@ class HarmonyAcceptImportDependency extends HarmonyImportDependency {
}
HarmonyAcceptImportDependency.Template = class HarmonyAcceptImportDependencyTemplate {
apply(dep, source, outputOptions, requestShortener) {}
apply(dep, source, runtime) {}
};
module.exports = HarmonyAcceptImportDependency;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
};

View File

@ -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);
}

View File

@ -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);
}
}
};

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)})`;

View File

@ -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]}`;

View File

@ -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}`);
}
};

View File

@ -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));
}
};

View File

@ -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
}
}

View File

@ -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", () => {