Skip to content

Commit 00f2b5e

Browse files
committed
advanced module type refactoring
added json type .mjs default to javascript/esm type adjusted parser plugins to react on module type
1 parent 65e855c commit 00f2b5e

101 files changed

Lines changed: 537 additions & 265 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎lib/APIPlugin.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class APIPlugin {
3232
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
3333
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
3434

35-
params.normalModuleFactory.plugin("parser", parser => {
35+
params.normalModuleFactory.plugin(["parser javascript/auto", "parser javascript/dynamic", "parser javascript/esm"], parser => {
3636
Object.keys(REPLACEMENTS).forEach(key => {
3737
parser.plugin(`expression ${key}`, ParserHelpers.toConstantDependency(REPLACEMENTS[key]));
3838
parser.plugin(`evaluate typeof ${key}`, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));

‎lib/CompatibilityPlugin.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,14 @@ const ConstDependency = require("./dependencies/ConstDependency");
88

99
const NullFactory = require("./NullFactory");
1010

11-
const jsonLoaderPath = require.resolve("json-loader");
12-
const matchJson = /\.json$/i;
13-
1411
class CompatibilityPlugin {
1512

1613
apply(compiler) {
1714
compiler.plugin("compilation", (compilation, params) => {
1815
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
1916
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
2017

21-
params.normalModuleFactory.plugin("parser", (parser, parserOptions) => {
18+
params.normalModuleFactory.plugin("parser javascript/auto", (parser, parserOptions) => {
2219

2320
if(typeof parserOptions.browserify !== "undefined" && !parserOptions.browserify)
2421
return;
@@ -40,17 +37,6 @@ class CompatibilityPlugin {
4037
return true;
4138
});
4239
});
43-
44-
params.normalModuleFactory.plugin("after-resolve", (data, done) => {
45-
// if this is a json file and there are no loaders active, we use the json-loader in order to avoid parse errors
46-
// @see https://github.com/webpack/webpack/issues/3363
47-
if(matchJson.test(data.request) && data.loaders.length === 0) {
48-
data.loaders.push({
49-
loader: jsonLoaderPath
50-
});
51-
}
52-
done(null, data);
53-
});
5440
});
5541
}
5642
}

‎lib/ConstPlugin.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ConstPlugin {
1818
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
1919
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
2020

21-
params.normalModuleFactory.plugin("parser", parser => {
21+
params.normalModuleFactory.plugin(["parser javascript/auto", "parser javascript/dynamic", "parser javascript/esm"], parser => {
2222
parser.plugin("statement if", statement => {
2323
const param = parser.evaluateExpression(statement.test);
2424
const bool = param.asBool();

‎lib/DefinePlugin.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class DefinePlugin {
3636
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
3737
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
3838

39-
params.normalModuleFactory.plugin("parser", (parser) => {
39+
params.normalModuleFactory.plugin(["parser javascript/auto", "parser javascript/dynamic", "parser javascript/esm"], (parser) => {
4040
const walkDefinitions = (definitions, prefix) => {
4141
Object.keys(definitions).forEach((key) => {
4242
const code = definitions[key];

‎lib/ExtendedAPIPlugin.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class ExtendedAPIPlugin {
3636
});
3737
mainTemplate.plugin("global-hash", () => true);
3838

39-
params.normalModuleFactory.plugin("parser", (parser, parserOptions) => {
39+
params.normalModuleFactory.plugin(["parser javascript/auto", "parser javascript/dynamic", "parser javascript/esm"], (parser, parserOptions) => {
4040
Object.keys(REPLACEMENTS).forEach(key => {
4141
parser.plugin(`expression ${key}`, ParserHelpers.toConstantDependency(REPLACEMENTS[key]));
4242
parser.plugin(`evaluate typeof ${key}`, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));

‎lib/FunctionModuleTemplatePlugin.js‎

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,19 @@ class FunctionModuleTemplatePlugin {
1111
apply(moduleTemplate) {
1212
moduleTemplate.plugin("render", (moduleSource, module) => {
1313
const source = new ConcatSource();
14-
const defaultArguments = [module.moduleArgument || "module", module.exportsArgument || "exports"];
14+
const args = [module.moduleArgument];
1515
// TODO remove HACK checking type for javascript
16-
if(!module.type || !module.type.startsWith("javascript") || (module.arguments && module.arguments.length !== 0) || module.hasDependencies(d => d.requireWebpackRequire !== false)) {
17-
defaultArguments.push("__webpack_require__");
16+
if(module.type && module.type.startsWith("javascript")) {
17+
args.push(module.exportsArgument);
18+
if(module.hasDependencies(d => d.requireWebpackRequire !== false)) {
19+
args.push("__webpack_require__");
20+
}
21+
} else if(module.type && module.type.startsWith("json")) {
22+
// no additional arguments needed
23+
} else {
24+
args.push(module.exportsArgument, "__webpack_require__");
1825
}
19-
source.add("/***/ (function(" + defaultArguments.concat(module.arguments || []).join(", ") + ") {\n\n");
26+
source.add("/***/ (function(" + args.join(", ") + ") {\n\n");
2027
if(module.strict) source.add("\"use strict\";\n");
2128
source.add(moduleSource);
2229
source.add("\n\n/***/ })");

‎lib/HotModuleReplacementPlugin.js‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ module.exports = class HotModuleReplacementPlugin {
190190
]);
191191
});
192192

193-
normalModuleFactory.plugin("parser", (parser, parserOptions) => {
193+
// TODO add HMR support for javascript/esm
194+
normalModuleFactory.plugin(["parser javascript/auto", "parser javascript/dynamic"], (parser, parserOptions) => {
194195
parser.plugin("expression __webpack_hash__", ParserHelpers.toConstantDependency("__webpack_require__.h()"));
195196
parser.plugin("evaluate typeof __webpack_hash__", ParserHelpers.evaluateToString("string"));
196197
parser.plugin("evaluate Identifier module.hot", expr => {

‎lib/JavascriptModulesPlugin.js‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ const Parser = require("./Parser");
88

99
class JavascriptModulesPlugin {
1010
apply(compiler) {
11-
compiler.plugin("compilation", (compilation, { normalModuleFactory }) => {
12-
normalModuleFactory.plugin(["create-parser javascript/auto", "create-parser javascript/esm"], () => {
11+
compiler.plugin("compilation", (compilation, {
12+
normalModuleFactory
13+
}) => {
14+
normalModuleFactory.plugin(["create-parser javascript/auto", "create-parser javascript/dynamic", "create-parser javascript/esm"], () => {
1315
return new Parser();
1416
});
1517
});

‎lib/JsonModulesPlugin.js‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
"use strict";
6+
7+
const JsonParser = require("./JsonParser");
8+
const ConcatSource = require("webpack-sources").ConcatSource;
9+
10+
class JsonModulesPlugin {
11+
apply(compiler) {
12+
compiler.plugin("compilation", (compilation, {
13+
normalModuleFactory
14+
}) => {
15+
normalModuleFactory.plugin("create-parser json", () => {
16+
return new JsonParser();
17+
});
18+
compilation.moduleTemplates.javascript.plugin("content", (moduleSource, module) => {
19+
if(module.type && module.type.startsWith("json")) {
20+
const source = new ConcatSource();
21+
source.add(`${module.moduleArgument}.exports = `);
22+
source.add(moduleSource);
23+
return source;
24+
} else {
25+
return moduleSource;
26+
}
27+
});
28+
});
29+
}
30+
}
31+
32+
module.exports = JsonModulesPlugin;

‎lib/JsonParser.js‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
"use strict";
6+
7+
const ConstDependency = require("./dependencies/ConstDependency");
8+
9+
class JsonParser {
10+
constructor(options) {
11+
this.options = options;
12+
}
13+
14+
parse(source, state) {
15+
const regExp = /\u2028|\u2029/g; // invalid in JavaScript but valid JSON
16+
let match = regExp.exec(source);
17+
while(match) {
18+
const escaped = match[0] === "\u2028" ? "\\u2028" : "\\u2029";
19+
const dep = new ConstDependency(escaped, [match.index, match.index]);
20+
state.module.addDependency(dep);
21+
match = regExp.exec(source);
22+
}
23+
return state;
24+
}
25+
}
26+
27+
module.exports = JsonParser;

0 commit comments

Comments
 (0)