Skip to content

Commit dd23201

Browse files
committed
Merge pull request webpack#427 from diurnalist/feature/templated-path-plugin-sq
Add TemplatedPathPlugin to generically handle asset paths w/ template vars
2 parents 911b62c + f371945 commit dd23201

21 files changed

+269
-135
lines changed

bin/webpack.js

100644100755
File mode changed.

lib/AmdMainTemplatePlugin.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
Author Tobias Koppers @sokra
44
*/
55
var ConcatSource = require("webpack-core/lib/ConcatSource");
6-
var Template = require("./Template");
76

87
function AmdMainTemplatePlugin(name) {
98
this.name = name;
@@ -21,24 +20,23 @@ AmdMainTemplatePlugin.prototype.apply = function(mainTemplate) {
2120
return "__WEBPACK_EXTERNAL_MODULE_" + m.id + "__";
2221
}).join(", ");
2322
if(this.name) {
24-
var name = this.name
25-
.replace(Template.REGEXP_HASH, hash)
26-
.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash)
27-
.replace(Template.REGEXP_ID, chunk.id)
28-
.replace(Template.REGEXP_NAME, chunk.name || chunk.id);
23+
var name = this.applyPluginsWaterfall("asset-path", this.name, {
24+
hash: hash,
25+
chunk: chunk
26+
});
2927
return new ConcatSource("define(" + JSON.stringify(name) + ", " + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});");
3028
} else if(externalsArguments) {
3129
return new ConcatSource("define(" + externalsDepsArray + ", function(" + externalsArguments + ") { return ", source, "});");
3230
} else {
3331
return new ConcatSource("define(function() { return ", source, "});");
3432
}
3533
}.bind(this));
36-
mainTemplate.plugin("global-hash", function(chunk) {
37-
if(Template.REGEXP_HASH.test(this.name || ""))
38-
return true;
34+
mainTemplate.plugin("global-hash-paths", function(paths) {
35+
if (this.name) paths.push(this.name);
36+
return paths;
3937
}.bind(this));
4038
mainTemplate.plugin("hash", function(hash) {
4139
hash.update("exports amd");
4240
hash.update(this.name + "");
4341
}.bind(this));
44-
};
42+
};

lib/Chunk.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Chunk.prototype.integrate = function(other, reason) {
134134
moveChunks(other.chunks, "parents", function(c) {
135135
if(c !== this && this.addChunk(c)) {
136136
c.addParent(this);
137-
}
137+
}
138138
}.bind(this));
139139
other.chunks.length = 0;
140140
other.blocks.forEach(function(b) {
@@ -217,4 +217,4 @@ Chunk.prototype.integratedSize = function(other, options) {
217217

218218
Chunk.prototype.toString = function() {
219219
return "Chunk[" + this.modules.join() + "]";
220-
};
220+
};

lib/Compilation.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ var Module = require("./Module");
1414
var ArrayMap = require("./ArrayMap");
1515
var Chunk = require("./Chunk");
1616
var Stats = require("./Stats");
17-
var Template = require("./Template");
1817
var MainTemplate = require("./MainTemplate");
1918
var ChunkTemplate = require("./ChunkTemplate");
2019
var HotUpdateChunkTemplate = require("./HotUpdateChunkTemplate");
@@ -723,7 +722,7 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
723722
var module = this.modules[i];
724723
if(module.assets) {
725724
Object.keys(module.assets).forEach(function(name) {
726-
var file = name.replace(Template.REGEXP_HASH, this.hash);
725+
var file = this.getPath(name);
727726
this.assets[file] = module.assets[name];
728727
this.applyPlugins("module-asset", module, file);
729728
}, this);
@@ -755,28 +754,30 @@ Compilation.prototype.createChunkAssets = function createChunkAssets() {
755754
}
756755
}
757756
this.assets[
758-
file = filenameTemplate
759-
.replace(Template.REGEXP_HASH, this.hash)
760-
.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash)
761-
.replace(Template.REGEXP_ID, chunk.id)
762-
.replace(Template.REGEXP_NAME, chunk.name || chunk.id)
757+
file = this.getPath(filenameTemplate, {
758+
chunk: chunk
759+
})
763760
] = source;
764761
chunk.files.push(file);
765762
this.applyPlugins("chunk-asset", chunk, file);
766763
if(chunk.id !== 0 && namedChunkFilename && chunk.name) {
767764
this.assets[
768-
file = namedChunkFilename
769-
.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash)
770-
.replace(Template.REGEXP_HASH, this.hash)
771-
.replace(Template.REGEXP_ID, chunk.id)
772-
.replace(Template.REGEXP_NAME, chunk.name || chunk.id)
765+
file = this.getPath(namedChunkFilename, {
766+
chunk: chunk
767+
})
773768
] = source;
774769
chunk.files.push(file);
775770
this.applyPlugins("chunk-asset", chunk, file);
776771
}
777772
}
778773
};
779774

775+
Compilation.prototype.getPath = function (filename, data) {
776+
data = data || {};
777+
data.hash = data.hash || this.hash;
778+
return this.mainTemplate.applyPluginsWaterfall("asset-path", filename, data);
779+
};
780+
780781
Compilation.prototype.getStats = function() {
781782
return new Stats(this);
782783
};

lib/Compiler.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ var Tapable = require("tapable");
77

88
var Compilation = require("./Compilation");
99
var Parser = require("./Parser");
10-
var Template = require("./Template");
1110
var Resolver = require("enhanced-resolve/lib/Resolver");
1211

1312
var NormalModuleFactory = require("./NormalModuleFactory");
@@ -219,7 +218,7 @@ Compiler.prototype.emitAssets = function(compilation, callback) {
219218

220219
this.applyPluginsAsync("emit", compilation, function(err) {
221220
if(err) return callback(err);
222-
outputPath = this.outputPath.replace(Template.REGEXP_HASH, compilation.hash);
221+
outputPath = compilation.getPath(this.outputPath);
223222
this.outputFileSystem.mkdirp(outputPath, emitFiles.bind(this));
224223
}.bind(this));
225224

lib/HotModuleReplacementPlugin.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
9393
});
9494
if(newModules.length > 0) {
9595
var source = hotUpdateChunkTemplate.render(chunkId, newModules, this.hash, this.moduleTemplate, this.dependencyTemplates);
96-
var filename = hotUpdateChunkFilename
97-
.replace(Template.REGEXP_HASH, records.hash)
98-
.replace(Template.REGEXP_ID, chunkId);
96+
var filename = this.getPath(hotUpdateChunkFilename, {
97+
hash: records.hash,
98+
chunk: currentChunk
99+
});
99100
this.additionalChunkAssets.push(filename);
100101
this.assets[filename] = source;
101102
hotUpdateMainContent.c.push(chunkId);
@@ -105,7 +106,9 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
105106
}
106107
}, this);
107108
var source = new RawSource(JSON.stringify(hotUpdateMainContent));
108-
var filename = hotUpdateMainFilename.replace(Template.REGEXP_HASH, records.hash);
109+
var filename = this.getPath(hotUpdateMainFilename, {
110+
hash: records.hash
111+
});
109112
this.assets[filename] = source;
110113
});
111114

lib/JsonpExportMainTemplatePlugin.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,25 @@
33
Author Tobias Koppers @sokra
44
*/
55
var ConcatSource = require("webpack-core/lib/ConcatSource");
6-
var Template = require("./Template");
76

87
function JsonpExportMainTemplatePlugin(name) {
98
this.name = name;
109
}
1110
module.exports = JsonpExportMainTemplatePlugin;
1211
JsonpExportMainTemplatePlugin.prototype.apply = function(mainTemplate) {
1312
mainTemplate.plugin("render", function(source, chunk, hash) {
14-
var name = (this.name || "")
15-
.replace(Template.REGEXP_HASH, hash)
16-
.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash)
17-
.replace(Template.REGEXP_ID, chunk.id)
18-
.replace(Template.REGEXP_NAME, chunk.name || chunk.id);
13+
var name = this.applyPluginsWaterfall("asset-path", this.name || "", {
14+
hash: hash,
15+
chunk: chunk
16+
});
1917
return new ConcatSource(name + "(", source, ");");
2018
}.bind(this));
21-
mainTemplate.plugin("global-hash", function(chunk) {
22-
if(Template.REGEXP_HASH.test(this.name || ""))
23-
return true;
19+
mainTemplate.plugin("global-hash-paths", function(paths) {
20+
if (this.name) paths.push(this.name);
21+
return paths;
2422
}.bind(this));
2523
mainTemplate.plugin("hash", function(hash) {
2624
hash.update("jsonp export");
2725
hash.update(this.name + "");
2826
}.bind(this));
29-
};
27+
};

lib/JsonpMainTemplatePlugin.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ JsonpMainTemplatePlugin.prototype.apply = function(mainTemplate) {
6060
"script.type = 'text/javascript';",
6161
"script.charset = 'utf-8';",
6262
"script.src = " + this.requireFn + ".p + " +
63-
JSON.stringify(chunkFilename)
64-
.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"")
65-
.replace(Template.REGEXP_CHUNKHASH, "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"")
66-
.replace(Template.REGEXP_NAME, "\" + (" + JSON.stringify(chunkNameMap) + "[chunkId]||chunkId) + \"")
67-
.replace(Template.REGEXP_ID, "\" + chunkId + \"") + ";",
63+
this.applyPluginsWaterfall("asset-path", JSON.stringify(chunkFilename), {
64+
hash: "\" + " + this.renderCurrentHashCode(hash) + " + \"",
65+
chunk: {
66+
id: "\" + chunkId + \"",
67+
hash: "\" + " + JSON.stringify(chunkHashMap) + "[chunkId] + \"",
68+
name: "\" + (" + JSON.stringify(chunkNameMap) + "[chunkId]||chunkId) + \""
69+
}
70+
}) + ";",
6871
"head.appendChild(script);"
6972
]),
7073
"}"
@@ -115,11 +118,15 @@ JsonpMainTemplatePlugin.prototype.apply = function(mainTemplate) {
115118
var hotUpdateChunkFilename = this.outputOptions.hotUpdateChunkFilename;
116119
var hotUpdateMainFilename = this.outputOptions.hotUpdateMainFilename;
117120
var hotUpdateFunction = this.outputOptions.hotUpdateFunction || Template.toIdentifier("webpackHotUpdate" + (this.outputOptions.library || ""));
118-
var currentHotUpdateChunkFilename = JSON.stringify(hotUpdateChunkFilename)
119-
.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"")
120-
.replace(Template.REGEXP_ID, "\" + chunkId + \"");
121-
var currentHotUpdateMainFilename = JSON.stringify(hotUpdateMainFilename)
122-
.replace(Template.REGEXP_HASH, "\" + " + this.renderCurrentHashCode(hash) + " + \"");
121+
var currentHotUpdateChunkFilename = this.applyPluginsWaterfall("asset-path", JSON.stringify(hotUpdateChunkFilename), {
122+
hash: "\" + " + this.renderCurrentHashCode(hash) + " + \"",
123+
chunk: {
124+
id: "\" + chunkId + \""
125+
}
126+
});
127+
var currentHotUpdateMainFilename = this.applyPluginsWaterfall("asset-path", JSON.stringify(hotUpdateMainFilename), {
128+
hash: "\" + " + this.renderCurrentHashCode(hash) + " + \""
129+
});
123130
return source + "\n"+
124131
"var parentHotUpdateCallback = this[" + JSON.stringify(hotUpdateFunction) + "];\n" +
125132
"this[" + JSON.stringify(hotUpdateFunction) + "] = " + Template.getFunctionContent(function() {

lib/MainTemplate.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,14 @@ function MainTemplate(outputOptions) {
8484
buf.push(this.requireFn + ".c = installedModules;");
8585

8686
var publicPath = this.outputOptions.publicPath || "";
87-
publicPath = publicPath.replace(Template.REGEXP_HASH, hash);
87+
publicPath = this.applyPluginsWaterfall("asset-path", publicPath, {
88+
hash: hash
89+
});
8890
buf.push("");
8991
buf.push("// __webpack_public_path__");
9092
buf.push(this.requireFn + ".p = " + JSON.stringify(publicPath) + ";");
9193
return this.asString(buf);
9294
});
93-
this.plugin("global-hash", function(chunk) {
94-
var publicPath = this.outputOptions.publicPath || "";
95-
var filename = this.outputOptions.filename || "";
96-
var chunkFilename = this.outputOptions.chunkFilename || "";
97-
if(Template.REGEXP_HASH.test(publicPath) || Template.REGEXP_CHUNKHASH.test(publicPath) || Template.REGEXP_NAME.test(publicPath))
98-
return true;
99-
if(Template.REGEXP_HASH.test(filename))
100-
return true;
101-
if(Template.REGEXP_HASH.test(chunkFilename) || Template.REGEXP_CHUNKHASH.test(chunkFilename) || Template.REGEXP_NAME.test(chunkFilename))
102-
return true;
103-
});
10495
}
10596
module.exports = MainTemplate;
10697

@@ -156,5 +147,6 @@ MainTemplate.prototype.updateHash = function(hash) {
156147
};
157148

158149
MainTemplate.prototype.useChunkHash = function(chunk) {
159-
return !this.applyPluginsBailResult("global-hash", chunk);
160-
};
150+
var paths = this.applyPluginsWaterfall("global-hash-paths", []);
151+
return !this.applyPluginsBailResult("global-hash", chunk, paths);
152+
};

lib/SetVarMainTemplatePlugin.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
Author Tobias Koppers @sokra
44
*/
55
var ConcatSource = require("webpack-core/lib/ConcatSource");
6-
var Template = require("./Template");
76

87
function SetVarMainTemplatePlugin(varExpression, copyObject) {
98
this.varExpression = varExpression;
@@ -12,11 +11,10 @@ function SetVarMainTemplatePlugin(varExpression, copyObject) {
1211
module.exports = SetVarMainTemplatePlugin;
1312
SetVarMainTemplatePlugin.prototype.apply = function(mainTemplate) {
1413
mainTemplate.plugin("render", function(source, chunk, hash) {
15-
var varExpression = this.varExpression
16-
.replace(Template.REGEXP_HASH, hash)
17-
.replace(Template.REGEXP_CHUNKHASH, chunk.renderedHash)
18-
.replace(Template.REGEXP_ID, chunk.id)
19-
.replace(Template.REGEXP_NAME, chunk.name || chunk.id);
14+
var varExpression = mainTemplate.applyPluginsWaterfall("asset-path", this.varExpression, {
15+
hash: hash,
16+
chunk: chunk
17+
});
2018
if(this.copyObject) {
2119
return new ConcatSource("(function(e, a) { for(var i in a) e[i] = a[i]; }(" +
2220
varExpression + ", ", source, "))");
@@ -25,13 +23,13 @@ SetVarMainTemplatePlugin.prototype.apply = function(mainTemplate) {
2523
return new ConcatSource(prefix, source);
2624
}
2725
}.bind(this));
28-
mainTemplate.plugin("global-hash", function(chunk) {
29-
if(Template.REGEXP_HASH.test(this.varExpression || ""))
30-
return true;
31-
}.bind(this));
26+
mainTemplate.plugin("global-hash-paths", function (paths) {
27+
if (this.varExpression) paths.push(this.varExpression);
28+
return paths;
29+
});
3230
mainTemplate.plugin("hash", function(hash) {
3331
hash.update("set var");
3432
hash.update(this.varExpression + "");
3533
hash.update(this.copyObject + "");
3634
}.bind(this));
37-
};
35+
};

0 commit comments

Comments
 (0)