webpack 4.15.0 → 4.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +761 -758
- package/SECURITY.md +9 -9
- package/buildin/amd-define.js +3 -3
- package/buildin/amd-options.js +2 -2
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/buildin/system.js +7 -7
- package/hot/dev-server.js +61 -61
- package/hot/emitter.js +2 -2
- package/hot/log-apply-result.js +44 -44
- package/hot/log.js +45 -45
- package/hot/only-dev-server.js +105 -105
- package/hot/poll.js +40 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -87
- package/lib/AsyncDependencyToInitialChunkError.js +31 -31
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +117 -117
- package/lib/BasicEvaluatedExpression.js +211 -211
- package/lib/CachePlugin.js +102 -102
- package/lib/CaseSensitiveModulesWarning.js +67 -67
- package/lib/Chunk.js +833 -811
- package/lib/ChunkGroup.js +4 -4
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CommentCompilationWarning.js +2 -2
- package/lib/CompatibilityPlugin.js +70 -70
- package/lib/Compilation.js +46 -15
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -258
- package/lib/ContextExclusionPlugin.js +28 -17
- package/lib/ContextModule.js +844 -739
- package/lib/ContextModuleFactory.js +262 -256
- package/lib/ContextReplacementPlugin.js +133 -133
- package/lib/DefinePlugin.js +49 -0
- package/lib/DelegatedModule.js +5 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +1 -1
- package/lib/Dependency.js +10 -4
- package/lib/DllModule.js +60 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -44
- package/lib/DllReferencePlugin.js +132 -84
- package/lib/EntryModuleNotFoundError.js +21 -21
- package/lib/Entrypoint.js +54 -54
- package/lib/EnvironmentPlugin.js +72 -65
- package/lib/ErrorHelpers.js +60 -60
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
- package/lib/EvalSourceMapDevToolPlugin.js +41 -41
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
- package/lib/ExternalModule.js +165 -159
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModuleTemplatePlugin.js +100 -100
- package/lib/Generator.js +60 -52
- package/lib/HarmonyLinkingError.js +17 -17
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacementPlugin.js +411 -413
- package/lib/IgnorePlugin.js +90 -90
- package/lib/JavascriptGenerator.js +229 -229
- package/lib/JavascriptModulesPlugin.js +179 -179
- package/lib/JsonGenerator.js +55 -55
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -27
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -153
- package/lib/LoaderOptionsPlugin.js +53 -53
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MemoryOutputFileSystem.js +5 -5
- package/lib/Module.js +431 -391
- package/lib/ModuleBuildError.js +52 -52
- package/lib/ModuleDependencyError.js +35 -35
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +36 -36
- package/lib/ModuleFilenameHelpers.js +178 -178
- package/lib/ModuleNotFoundError.js +23 -23
- package/lib/ModuleParseError.js +57 -57
- package/lib/ModuleTemplate.js +93 -93
- package/lib/ModuleWarning.js +36 -36
- package/lib/MultiCompiler.js +283 -283
- package/lib/MultiModule.js +87 -81
- package/lib/MultiModuleFactory.js +23 -23
- package/lib/MultiStats.js +92 -92
- package/lib/MultiWatching.js +38 -38
- package/lib/NamedChunksPlugin.js +29 -29
- package/lib/NamedModulesPlugin.js +57 -57
- package/lib/NoEmitOnErrorsPlugin.js +20 -20
- package/lib/NoModeWarning.js +23 -23
- package/lib/NodeStuffPlugin.js +197 -179
- package/lib/NormalModule.js +542 -536
- package/lib/NormalModuleFactory.js +526 -526
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/NullFactory.js +12 -12
- package/lib/OptionsApply.js +10 -10
- package/lib/OptionsDefaulter.js +84 -84
- package/lib/Parser.js +2202 -2193
- package/lib/ParserHelpers.js +103 -103
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +246 -246
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -56
- package/lib/RecordIdsPlugin.js +230 -230
- package/lib/RemovedPluginError.js +11 -11
- package/lib/RequestShortener.js +83 -83
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuntimeTemplate.js +12 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -69
- package/lib/SingleEntryPlugin.js +6 -1
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -301
- package/lib/Stats.js +28 -5
- package/lib/TemplatedPathPlugin.js +173 -173
- package/lib/UnsupportedFeatureWarning.js +22 -22
- package/lib/UseStrictPlugin.js +54 -54
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -194
- package/lib/WebpackOptionsApply.js +92 -10
- package/lib/WebpackOptionsDefaulter.js +368 -354
- package/lib/debug/ProfilingPlugin.js +430 -430
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/AMDRequireItemDependency.js +22 -22
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependency.js +22 -22
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyHelpers.js +142 -142
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/CriticalDependencyWarning.js +20 -20
- package/lib/dependencies/DelegatedSourceDependency.js +18 -18
- package/lib/dependencies/DllEntryDependency.js +20 -20
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyImportDependency.js +109 -109
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
- package/lib/dependencies/HarmonyInitDependency.js +60 -60
- package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
- package/lib/dependencies/ImportContextDependency.js +23 -23
- package/lib/dependencies/ImportDependenciesBlock.js +18 -18
- package/lib/dependencies/ImportDependency.js +34 -34
- package/lib/dependencies/ImportEagerDependency.js +32 -32
- package/lib/dependencies/ImportParserPlugin.js +263 -263
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/LoaderPlugin.js +18 -1
- package/lib/dependencies/LocalModule.js +23 -23
- package/lib/dependencies/LocalModulesHelpers.js +52 -52
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/PrefetchDependency.js +18 -18
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -143
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependency.js +22 -22
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/formatLocation.js +75 -61
- package/lib/node/NodeChunkTemplatePlugin.js +31 -31
- package/lib/node/NodeEnvironmentPlugin.js +28 -28
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
- package/lib/node/NodeMainTemplate.runtime.js +27 -27
- package/lib/node/NodeMainTemplatePlugin.js +323 -323
- package/lib/node/NodeOutputFileSystem.js +22 -22
- package/lib/node/NodeSourcePlugin.js +144 -144
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -99
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
- package/lib/optimize/ConcatenatedModule.js +5 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
- package/lib/optimize/LimitChunkCountPlugin.js +66 -66
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
- package/lib/optimize/SplitChunksPlugin.js +866 -850
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/SortableSet.js +1 -0
- package/lib/util/StackedSetMap.js +144 -135
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/deterministicGrouping.js +251 -251
- package/lib/util/identifier.js +103 -103
- package/lib/util/objectToMap.js +16 -16
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
- package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
- package/lib/wasm/WebAssemblyGenerator.js +16 -2
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
- package/lib/wasm/WebAssemblyParser.js +174 -174
- package/lib/wasm/WebAssemblyUtils.js +59 -59
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -65
- package/lib/web/JsonpMainTemplatePlugin.js +1 -1
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/web/WebEnvironmentPlugin.js +18 -18
- package/lib/webpack.js +5 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +22 -13
- package/schemas/WebpackOptions.json +2062 -2036
- package/schemas/ajv.absolutePath.js +55 -55
- package/schemas/plugins/BannerPlugin.json +96 -96
- package/schemas/plugins/DllPlugin.json +32 -32
- package/schemas/plugins/DllReferencePlugin.json +99 -99
- package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
- package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
- package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
- package/schemas/plugins/WatchIgnorePlugin.json +16 -16
- package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
@@ -1,526 +1,526 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const path = require("path");
|
8
|
-
const asyncLib = require("neo-async");
|
9
|
-
const {
|
10
|
-
Tapable,
|
11
|
-
AsyncSeriesWaterfallHook,
|
12
|
-
SyncWaterfallHook,
|
13
|
-
SyncBailHook,
|
14
|
-
SyncHook,
|
15
|
-
HookMap
|
16
|
-
} = require("tapable");
|
17
|
-
const NormalModule = require("./NormalModule");
|
18
|
-
const RawModule = require("./RawModule");
|
19
|
-
const RuleSet = require("./RuleSet");
|
20
|
-
const cachedMerge = require("./util/cachedMerge");
|
21
|
-
|
22
|
-
const EMPTY_RESOLVE_OPTIONS = {};
|
23
|
-
|
24
|
-
const MATCH_RESOURCE_REGEX = /^([^!]+)!=!/;
|
25
|
-
|
26
|
-
const loaderToIdent = data => {
|
27
|
-
if (!data.options) {
|
28
|
-
return data.loader;
|
29
|
-
}
|
30
|
-
if (typeof data.options === "string") {
|
31
|
-
return data.loader + "?" + data.options;
|
32
|
-
}
|
33
|
-
if (typeof data.options !== "object") {
|
34
|
-
throw new Error("loader options must be string or object");
|
35
|
-
}
|
36
|
-
if (data.ident) {
|
37
|
-
return data.loader + "??" + data.ident;
|
38
|
-
}
|
39
|
-
return data.loader + "?" + JSON.stringify(data.options);
|
40
|
-
};
|
41
|
-
|
42
|
-
const identToLoaderRequest = resultString => {
|
43
|
-
const idx = resultString.indexOf("?");
|
44
|
-
if (idx >= 0) {
|
45
|
-
const loader = resultString.substr(0, idx);
|
46
|
-
const options = resultString.substr(idx + 1);
|
47
|
-
return {
|
48
|
-
loader,
|
49
|
-
options
|
50
|
-
};
|
51
|
-
} else {
|
52
|
-
return {
|
53
|
-
loader: resultString,
|
54
|
-
options: undefined
|
55
|
-
};
|
56
|
-
}
|
57
|
-
};
|
58
|
-
|
59
|
-
const dependencyCache = new WeakMap();
|
60
|
-
|
61
|
-
class NormalModuleFactory extends Tapable {
|
62
|
-
constructor(context, resolverFactory, options) {
|
63
|
-
super();
|
64
|
-
this.hooks = {
|
65
|
-
resolver: new SyncWaterfallHook(["resolver"]),
|
66
|
-
factory: new SyncWaterfallHook(["factory"]),
|
67
|
-
beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
|
68
|
-
afterResolve: new AsyncSeriesWaterfallHook(["data"]),
|
69
|
-
createModule: new SyncBailHook(["data"]),
|
70
|
-
module: new SyncWaterfallHook(["module", "data"]),
|
71
|
-
createParser: new HookMap(() => new SyncBailHook(["parserOptions"])),
|
72
|
-
parser: new HookMap(() => new SyncHook(["parser", "parserOptions"])),
|
73
|
-
createGenerator: new HookMap(
|
74
|
-
() => new SyncBailHook(["generatorOptions"])
|
75
|
-
),
|
76
|
-
generator: new HookMap(
|
77
|
-
() => new SyncHook(["generator", "generatorOptions"])
|
78
|
-
)
|
79
|
-
};
|
80
|
-
this._pluginCompat.tap("NormalModuleFactory", options => {
|
81
|
-
switch (options.name) {
|
82
|
-
case "before-resolve":
|
83
|
-
case "after-resolve":
|
84
|
-
options.async = true;
|
85
|
-
break;
|
86
|
-
case "parser":
|
87
|
-
this.hooks.parser
|
88
|
-
.for("javascript/auto")
|
89
|
-
.tap(options.fn.name || "unnamed compat plugin", options.fn);
|
90
|
-
return true;
|
91
|
-
}
|
92
|
-
let match;
|
93
|
-
match = /^parser (.+)$/.exec(options.name);
|
94
|
-
if (match) {
|
95
|
-
this.hooks.parser
|
96
|
-
.for(match[1])
|
97
|
-
.tap(
|
98
|
-
options.fn.name || "unnamed compat plugin",
|
99
|
-
options.fn.bind(this)
|
100
|
-
);
|
101
|
-
return true;
|
102
|
-
}
|
103
|
-
match = /^create-parser (.+)$/.exec(options.name);
|
104
|
-
if (match) {
|
105
|
-
this.hooks.createParser
|
106
|
-
.for(match[1])
|
107
|
-
.tap(
|
108
|
-
options.fn.name || "unnamed compat plugin",
|
109
|
-
options.fn.bind(this)
|
110
|
-
);
|
111
|
-
return true;
|
112
|
-
}
|
113
|
-
});
|
114
|
-
this.resolverFactory = resolverFactory;
|
115
|
-
this.ruleSet = new RuleSet(options.defaultRules.concat(options.rules));
|
116
|
-
this.cachePredicate =
|
117
|
-
typeof options.unsafeCache === "function"
|
118
|
-
? options.unsafeCache
|
119
|
-
: Boolean.bind(null, options.unsafeCache);
|
120
|
-
this.context = context || "";
|
121
|
-
this.parserCache = Object.create(null);
|
122
|
-
this.generatorCache = Object.create(null);
|
123
|
-
this.hooks.factory.tap("NormalModuleFactory", () => (result, callback) => {
|
124
|
-
let resolver = this.hooks.resolver.call(null);
|
125
|
-
|
126
|
-
// Ignored
|
127
|
-
if (!resolver) return callback();
|
128
|
-
|
129
|
-
resolver(result, (err, data) => {
|
130
|
-
if (err) return callback(err);
|
131
|
-
|
132
|
-
// Ignored
|
133
|
-
if (!data) return callback();
|
134
|
-
|
135
|
-
// direct module
|
136
|
-
if (typeof data.source === "function") return callback(null, data);
|
137
|
-
|
138
|
-
this.hooks.afterResolve.callAsync(data, (err, result) => {
|
139
|
-
if (err) return callback(err);
|
140
|
-
|
141
|
-
// Ignored
|
142
|
-
if (!result) return callback();
|
143
|
-
|
144
|
-
let createdModule = this.hooks.createModule.call(result);
|
145
|
-
if (!createdModule) {
|
146
|
-
if (!result.request) {
|
147
|
-
return callback(new Error("Empty dependency (no request)"));
|
148
|
-
}
|
149
|
-
|
150
|
-
createdModule = new NormalModule(result);
|
151
|
-
}
|
152
|
-
|
153
|
-
createdModule = this.hooks.module.call(createdModule, result);
|
154
|
-
|
155
|
-
return callback(null, createdModule);
|
156
|
-
});
|
157
|
-
});
|
158
|
-
});
|
159
|
-
this.hooks.resolver.tap("NormalModuleFactory", () => (data, callback) => {
|
160
|
-
const contextInfo = data.contextInfo;
|
161
|
-
const context = data.context;
|
162
|
-
const request = data.request;
|
163
|
-
|
164
|
-
const loaderResolver = this.getResolver("loader");
|
165
|
-
const normalResolver = this.getResolver("normal", data.resolveOptions);
|
166
|
-
|
167
|
-
let matchResource = undefined;
|
168
|
-
let requestWithoutMatchResource = request;
|
169
|
-
const matchResourceMatch = MATCH_RESOURCE_REGEX.exec(request);
|
170
|
-
if (matchResourceMatch) {
|
171
|
-
matchResource = matchResourceMatch[1];
|
172
|
-
if (/^\.\.?\//.test(matchResource)) {
|
173
|
-
matchResource = path.join(context, matchResource);
|
174
|
-
}
|
175
|
-
requestWithoutMatchResource = request.substr(
|
176
|
-
matchResourceMatch[0].length
|
177
|
-
);
|
178
|
-
}
|
179
|
-
|
180
|
-
const noPreAutoLoaders = requestWithoutMatchResource.startsWith("-!");
|
181
|
-
const noAutoLoaders =
|
182
|
-
noPreAutoLoaders || requestWithoutMatchResource.startsWith("!");
|
183
|
-
const noPrePostAutoLoaders = requestWithoutMatchResource.startsWith("!!");
|
184
|
-
let elements = requestWithoutMatchResource
|
185
|
-
.replace(/^-?!+/, "")
|
186
|
-
.replace(/!!+/g, "!")
|
187
|
-
.split("!");
|
188
|
-
let resource = elements.pop();
|
189
|
-
elements = elements.map(identToLoaderRequest);
|
190
|
-
|
191
|
-
asyncLib.parallel(
|
192
|
-
[
|
193
|
-
callback =>
|
194
|
-
this.resolveRequestArray(
|
195
|
-
contextInfo,
|
196
|
-
context,
|
197
|
-
elements,
|
198
|
-
loaderResolver,
|
199
|
-
callback
|
200
|
-
),
|
201
|
-
callback => {
|
202
|
-
if (resource === "" || resource[0] === "?") {
|
203
|
-
return callback(null, {
|
204
|
-
resource
|
205
|
-
});
|
206
|
-
}
|
207
|
-
|
208
|
-
normalResolver.resolve(
|
209
|
-
contextInfo,
|
210
|
-
context,
|
211
|
-
resource,
|
212
|
-
{},
|
213
|
-
(err, resource, resourceResolveData) => {
|
214
|
-
if (err) return callback(err);
|
215
|
-
callback(null, {
|
216
|
-
resourceResolveData,
|
217
|
-
resource
|
218
|
-
});
|
219
|
-
}
|
220
|
-
);
|
221
|
-
}
|
222
|
-
],
|
223
|
-
(err, results) => {
|
224
|
-
if (err) return callback(err);
|
225
|
-
let loaders = results[0];
|
226
|
-
const resourceResolveData = results[1].resourceResolveData;
|
227
|
-
resource = results[1].resource;
|
228
|
-
|
229
|
-
// translate option idents
|
230
|
-
try {
|
231
|
-
for (const item of loaders) {
|
232
|
-
if (typeof item.options === "string" && item.options[0] === "?") {
|
233
|
-
const ident = item.options.substr(1);
|
234
|
-
item.options = this.ruleSet.findOptionsByIdent(ident);
|
235
|
-
item.ident = ident;
|
236
|
-
}
|
237
|
-
}
|
238
|
-
} catch (e) {
|
239
|
-
return callback(e);
|
240
|
-
}
|
241
|
-
|
242
|
-
if (resource === false) {
|
243
|
-
// ignored
|
244
|
-
return callback(
|
245
|
-
null,
|
246
|
-
new RawModule(
|
247
|
-
"/* (ignored) */",
|
248
|
-
`ignored ${context} ${request}`,
|
249
|
-
`${request} (ignored)`
|
250
|
-
)
|
251
|
-
);
|
252
|
-
}
|
253
|
-
|
254
|
-
const userRequest =
|
255
|
-
(matchResource !== undefined ? `${matchResource}!=!` : "") +
|
256
|
-
loaders
|
257
|
-
.map(loaderToIdent)
|
258
|
-
.concat([resource])
|
259
|
-
.join("!");
|
260
|
-
|
261
|
-
let resourcePath =
|
262
|
-
matchResource !== undefined ? matchResource : resource;
|
263
|
-
let resourceQuery = "";
|
264
|
-
const queryIndex = resourcePath.indexOf("?");
|
265
|
-
if (queryIndex >= 0) {
|
266
|
-
resourceQuery = resourcePath.substr(queryIndex);
|
267
|
-
resourcePath = resourcePath.substr(0, queryIndex);
|
268
|
-
}
|
269
|
-
|
270
|
-
const result = this.ruleSet.exec({
|
271
|
-
resource: resourcePath,
|
272
|
-
realResource:
|
273
|
-
matchResource !== undefined
|
274
|
-
? resource.replace(/\?.*/, "")
|
275
|
-
: resourcePath,
|
276
|
-
resourceQuery,
|
277
|
-
issuer: contextInfo.issuer,
|
278
|
-
compiler: contextInfo.compiler
|
279
|
-
});
|
280
|
-
const settings = {};
|
281
|
-
const useLoadersPost = [];
|
282
|
-
const useLoaders = [];
|
283
|
-
const useLoadersPre = [];
|
284
|
-
for (const r of result) {
|
285
|
-
if (r.type === "use") {
|
286
|
-
if (r.enforce === "post" && !noPrePostAutoLoaders) {
|
287
|
-
useLoadersPost.push(r.value);
|
288
|
-
} else if (
|
289
|
-
r.enforce === "pre" &&
|
290
|
-
!noPreAutoLoaders &&
|
291
|
-
!noPrePostAutoLoaders
|
292
|
-
) {
|
293
|
-
useLoadersPre.push(r.value);
|
294
|
-
} else if (
|
295
|
-
!r.enforce &&
|
296
|
-
!noAutoLoaders &&
|
297
|
-
!noPrePostAutoLoaders
|
298
|
-
) {
|
299
|
-
useLoaders.push(r.value);
|
300
|
-
}
|
301
|
-
} else if (
|
302
|
-
typeof r.value === "object" &&
|
303
|
-
r.value !== null &&
|
304
|
-
typeof settings[r.type] === "object" &&
|
305
|
-
settings[r.type] !== null
|
306
|
-
) {
|
307
|
-
settings[r.type] = cachedMerge(settings[r.type], r.value);
|
308
|
-
} else {
|
309
|
-
settings[r.type] = r.value;
|
310
|
-
}
|
311
|
-
}
|
312
|
-
asyncLib.parallel(
|
313
|
-
[
|
314
|
-
this.resolveRequestArray.bind(
|
315
|
-
this,
|
316
|
-
contextInfo,
|
317
|
-
this.context,
|
318
|
-
useLoadersPost,
|
319
|
-
loaderResolver
|
320
|
-
),
|
321
|
-
this.resolveRequestArray.bind(
|
322
|
-
this,
|
323
|
-
contextInfo,
|
324
|
-
this.context,
|
325
|
-
useLoaders,
|
326
|
-
loaderResolver
|
327
|
-
),
|
328
|
-
this.resolveRequestArray.bind(
|
329
|
-
this,
|
330
|
-
contextInfo,
|
331
|
-
this.context,
|
332
|
-
useLoadersPre,
|
333
|
-
loaderResolver
|
334
|
-
)
|
335
|
-
],
|
336
|
-
(err, results) => {
|
337
|
-
if (err) return callback(err);
|
338
|
-
loaders = results[0].concat(loaders, results[1], results[2]);
|
339
|
-
process.nextTick(() => {
|
340
|
-
const type = settings.type;
|
341
|
-
const resolveOptions = settings.resolve;
|
342
|
-
callback(null, {
|
343
|
-
context: context,
|
344
|
-
request: loaders
|
345
|
-
.map(loaderToIdent)
|
346
|
-
.concat([resource])
|
347
|
-
.join("!"),
|
348
|
-
dependencies: data.dependencies,
|
349
|
-
userRequest,
|
350
|
-
rawRequest: request,
|
351
|
-
loaders,
|
352
|
-
resource,
|
353
|
-
matchResource,
|
354
|
-
resourceResolveData,
|
355
|
-
settings,
|
356
|
-
type,
|
357
|
-
parser: this.getParser(type, settings.parser),
|
358
|
-
generator: this.getGenerator(type, settings.generator),
|
359
|
-
resolveOptions
|
360
|
-
});
|
361
|
-
});
|
362
|
-
}
|
363
|
-
);
|
364
|
-
}
|
365
|
-
);
|
366
|
-
});
|
367
|
-
}
|
368
|
-
|
369
|
-
create(data, callback) {
|
370
|
-
const dependencies = data.dependencies;
|
371
|
-
const cacheEntry = dependencyCache.get(dependencies[0]);
|
372
|
-
if (cacheEntry) return callback(null, cacheEntry);
|
373
|
-
const context = data.context || this.context;
|
374
|
-
const resolveOptions = data.resolveOptions || EMPTY_RESOLVE_OPTIONS;
|
375
|
-
const request = dependencies[0].request;
|
376
|
-
const contextInfo = data.contextInfo || {};
|
377
|
-
this.hooks.beforeResolve.callAsync(
|
378
|
-
{
|
379
|
-
contextInfo,
|
380
|
-
resolveOptions,
|
381
|
-
context,
|
382
|
-
request,
|
383
|
-
dependencies
|
384
|
-
},
|
385
|
-
(err, result) => {
|
386
|
-
if (err) return callback(err);
|
387
|
-
|
388
|
-
// Ignored
|
389
|
-
if (!result) return callback();
|
390
|
-
|
391
|
-
const factory = this.hooks.factory.call(null);
|
392
|
-
|
393
|
-
// Ignored
|
394
|
-
if (!factory) return callback();
|
395
|
-
|
396
|
-
factory(result, (err, module) => {
|
397
|
-
if (err) return callback(err);
|
398
|
-
|
399
|
-
if (module && this.cachePredicate(module)) {
|
400
|
-
for (const d of dependencies) {
|
401
|
-
dependencyCache.set(d, module);
|
402
|
-
}
|
403
|
-
}
|
404
|
-
|
405
|
-
callback(null, module);
|
406
|
-
});
|
407
|
-
}
|
408
|
-
);
|
409
|
-
}
|
410
|
-
|
411
|
-
resolveRequestArray(contextInfo, context, array, resolver, callback) {
|
412
|
-
if (array.length === 0) return callback(null, []);
|
413
|
-
asyncLib.map(
|
414
|
-
array,
|
415
|
-
(item, callback) => {
|
416
|
-
resolver.resolve(
|
417
|
-
contextInfo,
|
418
|
-
context,
|
419
|
-
item.loader,
|
420
|
-
{},
|
421
|
-
(err, result) => {
|
422
|
-
if (
|
423
|
-
err &&
|
424
|
-
/^[^/]*$/.test(item.loader) &&
|
425
|
-
!/-loader$/.test(item.loader)
|
426
|
-
) {
|
427
|
-
return resolver.resolve(
|
428
|
-
contextInfo,
|
429
|
-
context,
|
430
|
-
item.loader + "-loader",
|
431
|
-
{},
|
432
|
-
err2 => {
|
433
|
-
if (!err2) {
|
434
|
-
err.message =
|
435
|
-
err.message +
|
436
|
-
"\n" +
|
437
|
-
"BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.\n" +
|
438
|
-
` You need to specify '${
|
439
|
-
item.loader
|
440
|
-
}-loader' instead of '${item.loader}',\n` +
|
441
|
-
" see https://webpack.js.org/migrate/3/#automatic-loader-module-name-extension-removed";
|
442
|
-
}
|
443
|
-
callback(err);
|
444
|
-
}
|
445
|
-
);
|
446
|
-
}
|
447
|
-
if (err) return callback(err);
|
448
|
-
|
449
|
-
const optionsOnly = item.options
|
450
|
-
? {
|
451
|
-
options: item.options
|
452
|
-
}
|
453
|
-
: undefined;
|
454
|
-
return callback(
|
455
|
-
null,
|
456
|
-
Object.assign({}, item, identToLoaderRequest(result), optionsOnly)
|
457
|
-
);
|
458
|
-
}
|
459
|
-
);
|
460
|
-
},
|
461
|
-
callback
|
462
|
-
);
|
463
|
-
}
|
464
|
-
|
465
|
-
getParser(type, parserOptions) {
|
466
|
-
let ident = type;
|
467
|
-
if (parserOptions) {
|
468
|
-
if (parserOptions.ident) {
|
469
|
-
ident = `${type}|${parserOptions.ident}`;
|
470
|
-
} else {
|
471
|
-
ident = JSON.stringify([type, parserOptions]);
|
472
|
-
}
|
473
|
-
}
|
474
|
-
if (ident in this.parserCache) {
|
475
|
-
return this.parserCache[ident];
|
476
|
-
}
|
477
|
-
return (this.parserCache[ident] = this.createParser(type, parserOptions));
|
478
|
-
}
|
479
|
-
|
480
|
-
createParser(type, parserOptions = {}) {
|
481
|
-
const parser = this.hooks.createParser.for(type).call(parserOptions);
|
482
|
-
if (!parser) {
|
483
|
-
throw new Error(`No parser registered for ${type}`);
|
484
|
-
}
|
485
|
-
this.hooks.parser.for(type).call(parser, parserOptions);
|
486
|
-
return parser;
|
487
|
-
}
|
488
|
-
|
489
|
-
getGenerator(type, generatorOptions) {
|
490
|
-
let ident = type;
|
491
|
-
if (generatorOptions) {
|
492
|
-
if (generatorOptions.ident) {
|
493
|
-
ident = `${type}|${generatorOptions.ident}`;
|
494
|
-
} else {
|
495
|
-
ident = JSON.stringify([type, generatorOptions]);
|
496
|
-
}
|
497
|
-
}
|
498
|
-
if (ident in this.generatorCache) {
|
499
|
-
return this.generatorCache[ident];
|
500
|
-
}
|
501
|
-
return (this.generatorCache[ident] = this.createGenerator(
|
502
|
-
type,
|
503
|
-
generatorOptions
|
504
|
-
));
|
505
|
-
}
|
506
|
-
|
507
|
-
createGenerator(type, generatorOptions = {}) {
|
508
|
-
const generator = this.hooks.createGenerator
|
509
|
-
.for(type)
|
510
|
-
.call(generatorOptions);
|
511
|
-
if (!generator) {
|
512
|
-
throw new Error(`No generator registered for ${type}`);
|
513
|
-
}
|
514
|
-
this.hooks.generator.for(type).call(generator, generatorOptions);
|
515
|
-
return generator;
|
516
|
-
}
|
517
|
-
|
518
|
-
getResolver(type, resolveOptions) {
|
519
|
-
return this.resolverFactory.get(
|
520
|
-
type,
|
521
|
-
resolveOptions || EMPTY_RESOLVE_OPTIONS
|
522
|
-
);
|
523
|
-
}
|
524
|
-
}
|
525
|
-
|
526
|
-
module.exports = NormalModuleFactory;
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const path = require("path");
|
8
|
+
const asyncLib = require("neo-async");
|
9
|
+
const {
|
10
|
+
Tapable,
|
11
|
+
AsyncSeriesWaterfallHook,
|
12
|
+
SyncWaterfallHook,
|
13
|
+
SyncBailHook,
|
14
|
+
SyncHook,
|
15
|
+
HookMap
|
16
|
+
} = require("tapable");
|
17
|
+
const NormalModule = require("./NormalModule");
|
18
|
+
const RawModule = require("./RawModule");
|
19
|
+
const RuleSet = require("./RuleSet");
|
20
|
+
const cachedMerge = require("./util/cachedMerge");
|
21
|
+
|
22
|
+
const EMPTY_RESOLVE_OPTIONS = {};
|
23
|
+
|
24
|
+
const MATCH_RESOURCE_REGEX = /^([^!]+)!=!/;
|
25
|
+
|
26
|
+
const loaderToIdent = data => {
|
27
|
+
if (!data.options) {
|
28
|
+
return data.loader;
|
29
|
+
}
|
30
|
+
if (typeof data.options === "string") {
|
31
|
+
return data.loader + "?" + data.options;
|
32
|
+
}
|
33
|
+
if (typeof data.options !== "object") {
|
34
|
+
throw new Error("loader options must be string or object");
|
35
|
+
}
|
36
|
+
if (data.ident) {
|
37
|
+
return data.loader + "??" + data.ident;
|
38
|
+
}
|
39
|
+
return data.loader + "?" + JSON.stringify(data.options);
|
40
|
+
};
|
41
|
+
|
42
|
+
const identToLoaderRequest = resultString => {
|
43
|
+
const idx = resultString.indexOf("?");
|
44
|
+
if (idx >= 0) {
|
45
|
+
const loader = resultString.substr(0, idx);
|
46
|
+
const options = resultString.substr(idx + 1);
|
47
|
+
return {
|
48
|
+
loader,
|
49
|
+
options
|
50
|
+
};
|
51
|
+
} else {
|
52
|
+
return {
|
53
|
+
loader: resultString,
|
54
|
+
options: undefined
|
55
|
+
};
|
56
|
+
}
|
57
|
+
};
|
58
|
+
|
59
|
+
const dependencyCache = new WeakMap();
|
60
|
+
|
61
|
+
class NormalModuleFactory extends Tapable {
|
62
|
+
constructor(context, resolverFactory, options) {
|
63
|
+
super();
|
64
|
+
this.hooks = {
|
65
|
+
resolver: new SyncWaterfallHook(["resolver"]),
|
66
|
+
factory: new SyncWaterfallHook(["factory"]),
|
67
|
+
beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
|
68
|
+
afterResolve: new AsyncSeriesWaterfallHook(["data"]),
|
69
|
+
createModule: new SyncBailHook(["data"]),
|
70
|
+
module: new SyncWaterfallHook(["module", "data"]),
|
71
|
+
createParser: new HookMap(() => new SyncBailHook(["parserOptions"])),
|
72
|
+
parser: new HookMap(() => new SyncHook(["parser", "parserOptions"])),
|
73
|
+
createGenerator: new HookMap(
|
74
|
+
() => new SyncBailHook(["generatorOptions"])
|
75
|
+
),
|
76
|
+
generator: new HookMap(
|
77
|
+
() => new SyncHook(["generator", "generatorOptions"])
|
78
|
+
)
|
79
|
+
};
|
80
|
+
this._pluginCompat.tap("NormalModuleFactory", options => {
|
81
|
+
switch (options.name) {
|
82
|
+
case "before-resolve":
|
83
|
+
case "after-resolve":
|
84
|
+
options.async = true;
|
85
|
+
break;
|
86
|
+
case "parser":
|
87
|
+
this.hooks.parser
|
88
|
+
.for("javascript/auto")
|
89
|
+
.tap(options.fn.name || "unnamed compat plugin", options.fn);
|
90
|
+
return true;
|
91
|
+
}
|
92
|
+
let match;
|
93
|
+
match = /^parser (.+)$/.exec(options.name);
|
94
|
+
if (match) {
|
95
|
+
this.hooks.parser
|
96
|
+
.for(match[1])
|
97
|
+
.tap(
|
98
|
+
options.fn.name || "unnamed compat plugin",
|
99
|
+
options.fn.bind(this)
|
100
|
+
);
|
101
|
+
return true;
|
102
|
+
}
|
103
|
+
match = /^create-parser (.+)$/.exec(options.name);
|
104
|
+
if (match) {
|
105
|
+
this.hooks.createParser
|
106
|
+
.for(match[1])
|
107
|
+
.tap(
|
108
|
+
options.fn.name || "unnamed compat plugin",
|
109
|
+
options.fn.bind(this)
|
110
|
+
);
|
111
|
+
return true;
|
112
|
+
}
|
113
|
+
});
|
114
|
+
this.resolverFactory = resolverFactory;
|
115
|
+
this.ruleSet = new RuleSet(options.defaultRules.concat(options.rules));
|
116
|
+
this.cachePredicate =
|
117
|
+
typeof options.unsafeCache === "function"
|
118
|
+
? options.unsafeCache
|
119
|
+
: Boolean.bind(null, options.unsafeCache);
|
120
|
+
this.context = context || "";
|
121
|
+
this.parserCache = Object.create(null);
|
122
|
+
this.generatorCache = Object.create(null);
|
123
|
+
this.hooks.factory.tap("NormalModuleFactory", () => (result, callback) => {
|
124
|
+
let resolver = this.hooks.resolver.call(null);
|
125
|
+
|
126
|
+
// Ignored
|
127
|
+
if (!resolver) return callback();
|
128
|
+
|
129
|
+
resolver(result, (err, data) => {
|
130
|
+
if (err) return callback(err);
|
131
|
+
|
132
|
+
// Ignored
|
133
|
+
if (!data) return callback();
|
134
|
+
|
135
|
+
// direct module
|
136
|
+
if (typeof data.source === "function") return callback(null, data);
|
137
|
+
|
138
|
+
this.hooks.afterResolve.callAsync(data, (err, result) => {
|
139
|
+
if (err) return callback(err);
|
140
|
+
|
141
|
+
// Ignored
|
142
|
+
if (!result) return callback();
|
143
|
+
|
144
|
+
let createdModule = this.hooks.createModule.call(result);
|
145
|
+
if (!createdModule) {
|
146
|
+
if (!result.request) {
|
147
|
+
return callback(new Error("Empty dependency (no request)"));
|
148
|
+
}
|
149
|
+
|
150
|
+
createdModule = new NormalModule(result);
|
151
|
+
}
|
152
|
+
|
153
|
+
createdModule = this.hooks.module.call(createdModule, result);
|
154
|
+
|
155
|
+
return callback(null, createdModule);
|
156
|
+
});
|
157
|
+
});
|
158
|
+
});
|
159
|
+
this.hooks.resolver.tap("NormalModuleFactory", () => (data, callback) => {
|
160
|
+
const contextInfo = data.contextInfo;
|
161
|
+
const context = data.context;
|
162
|
+
const request = data.request;
|
163
|
+
|
164
|
+
const loaderResolver = this.getResolver("loader");
|
165
|
+
const normalResolver = this.getResolver("normal", data.resolveOptions);
|
166
|
+
|
167
|
+
let matchResource = undefined;
|
168
|
+
let requestWithoutMatchResource = request;
|
169
|
+
const matchResourceMatch = MATCH_RESOURCE_REGEX.exec(request);
|
170
|
+
if (matchResourceMatch) {
|
171
|
+
matchResource = matchResourceMatch[1];
|
172
|
+
if (/^\.\.?\//.test(matchResource)) {
|
173
|
+
matchResource = path.join(context, matchResource);
|
174
|
+
}
|
175
|
+
requestWithoutMatchResource = request.substr(
|
176
|
+
matchResourceMatch[0].length
|
177
|
+
);
|
178
|
+
}
|
179
|
+
|
180
|
+
const noPreAutoLoaders = requestWithoutMatchResource.startsWith("-!");
|
181
|
+
const noAutoLoaders =
|
182
|
+
noPreAutoLoaders || requestWithoutMatchResource.startsWith("!");
|
183
|
+
const noPrePostAutoLoaders = requestWithoutMatchResource.startsWith("!!");
|
184
|
+
let elements = requestWithoutMatchResource
|
185
|
+
.replace(/^-?!+/, "")
|
186
|
+
.replace(/!!+/g, "!")
|
187
|
+
.split("!");
|
188
|
+
let resource = elements.pop();
|
189
|
+
elements = elements.map(identToLoaderRequest);
|
190
|
+
|
191
|
+
asyncLib.parallel(
|
192
|
+
[
|
193
|
+
callback =>
|
194
|
+
this.resolveRequestArray(
|
195
|
+
contextInfo,
|
196
|
+
context,
|
197
|
+
elements,
|
198
|
+
loaderResolver,
|
199
|
+
callback
|
200
|
+
),
|
201
|
+
callback => {
|
202
|
+
if (resource === "" || resource[0] === "?") {
|
203
|
+
return callback(null, {
|
204
|
+
resource
|
205
|
+
});
|
206
|
+
}
|
207
|
+
|
208
|
+
normalResolver.resolve(
|
209
|
+
contextInfo,
|
210
|
+
context,
|
211
|
+
resource,
|
212
|
+
{},
|
213
|
+
(err, resource, resourceResolveData) => {
|
214
|
+
if (err) return callback(err);
|
215
|
+
callback(null, {
|
216
|
+
resourceResolveData,
|
217
|
+
resource
|
218
|
+
});
|
219
|
+
}
|
220
|
+
);
|
221
|
+
}
|
222
|
+
],
|
223
|
+
(err, results) => {
|
224
|
+
if (err) return callback(err);
|
225
|
+
let loaders = results[0];
|
226
|
+
const resourceResolveData = results[1].resourceResolveData;
|
227
|
+
resource = results[1].resource;
|
228
|
+
|
229
|
+
// translate option idents
|
230
|
+
try {
|
231
|
+
for (const item of loaders) {
|
232
|
+
if (typeof item.options === "string" && item.options[0] === "?") {
|
233
|
+
const ident = item.options.substr(1);
|
234
|
+
item.options = this.ruleSet.findOptionsByIdent(ident);
|
235
|
+
item.ident = ident;
|
236
|
+
}
|
237
|
+
}
|
238
|
+
} catch (e) {
|
239
|
+
return callback(e);
|
240
|
+
}
|
241
|
+
|
242
|
+
if (resource === false) {
|
243
|
+
// ignored
|
244
|
+
return callback(
|
245
|
+
null,
|
246
|
+
new RawModule(
|
247
|
+
"/* (ignored) */",
|
248
|
+
`ignored ${context} ${request}`,
|
249
|
+
`${request} (ignored)`
|
250
|
+
)
|
251
|
+
);
|
252
|
+
}
|
253
|
+
|
254
|
+
const userRequest =
|
255
|
+
(matchResource !== undefined ? `${matchResource}!=!` : "") +
|
256
|
+
loaders
|
257
|
+
.map(loaderToIdent)
|
258
|
+
.concat([resource])
|
259
|
+
.join("!");
|
260
|
+
|
261
|
+
let resourcePath =
|
262
|
+
matchResource !== undefined ? matchResource : resource;
|
263
|
+
let resourceQuery = "";
|
264
|
+
const queryIndex = resourcePath.indexOf("?");
|
265
|
+
if (queryIndex >= 0) {
|
266
|
+
resourceQuery = resourcePath.substr(queryIndex);
|
267
|
+
resourcePath = resourcePath.substr(0, queryIndex);
|
268
|
+
}
|
269
|
+
|
270
|
+
const result = this.ruleSet.exec({
|
271
|
+
resource: resourcePath,
|
272
|
+
realResource:
|
273
|
+
matchResource !== undefined
|
274
|
+
? resource.replace(/\?.*/, "")
|
275
|
+
: resourcePath,
|
276
|
+
resourceQuery,
|
277
|
+
issuer: contextInfo.issuer,
|
278
|
+
compiler: contextInfo.compiler
|
279
|
+
});
|
280
|
+
const settings = {};
|
281
|
+
const useLoadersPost = [];
|
282
|
+
const useLoaders = [];
|
283
|
+
const useLoadersPre = [];
|
284
|
+
for (const r of result) {
|
285
|
+
if (r.type === "use") {
|
286
|
+
if (r.enforce === "post" && !noPrePostAutoLoaders) {
|
287
|
+
useLoadersPost.push(r.value);
|
288
|
+
} else if (
|
289
|
+
r.enforce === "pre" &&
|
290
|
+
!noPreAutoLoaders &&
|
291
|
+
!noPrePostAutoLoaders
|
292
|
+
) {
|
293
|
+
useLoadersPre.push(r.value);
|
294
|
+
} else if (
|
295
|
+
!r.enforce &&
|
296
|
+
!noAutoLoaders &&
|
297
|
+
!noPrePostAutoLoaders
|
298
|
+
) {
|
299
|
+
useLoaders.push(r.value);
|
300
|
+
}
|
301
|
+
} else if (
|
302
|
+
typeof r.value === "object" &&
|
303
|
+
r.value !== null &&
|
304
|
+
typeof settings[r.type] === "object" &&
|
305
|
+
settings[r.type] !== null
|
306
|
+
) {
|
307
|
+
settings[r.type] = cachedMerge(settings[r.type], r.value);
|
308
|
+
} else {
|
309
|
+
settings[r.type] = r.value;
|
310
|
+
}
|
311
|
+
}
|
312
|
+
asyncLib.parallel(
|
313
|
+
[
|
314
|
+
this.resolveRequestArray.bind(
|
315
|
+
this,
|
316
|
+
contextInfo,
|
317
|
+
this.context,
|
318
|
+
useLoadersPost,
|
319
|
+
loaderResolver
|
320
|
+
),
|
321
|
+
this.resolveRequestArray.bind(
|
322
|
+
this,
|
323
|
+
contextInfo,
|
324
|
+
this.context,
|
325
|
+
useLoaders,
|
326
|
+
loaderResolver
|
327
|
+
),
|
328
|
+
this.resolveRequestArray.bind(
|
329
|
+
this,
|
330
|
+
contextInfo,
|
331
|
+
this.context,
|
332
|
+
useLoadersPre,
|
333
|
+
loaderResolver
|
334
|
+
)
|
335
|
+
],
|
336
|
+
(err, results) => {
|
337
|
+
if (err) return callback(err);
|
338
|
+
loaders = results[0].concat(loaders, results[1], results[2]);
|
339
|
+
process.nextTick(() => {
|
340
|
+
const type = settings.type;
|
341
|
+
const resolveOptions = settings.resolve;
|
342
|
+
callback(null, {
|
343
|
+
context: context,
|
344
|
+
request: loaders
|
345
|
+
.map(loaderToIdent)
|
346
|
+
.concat([resource])
|
347
|
+
.join("!"),
|
348
|
+
dependencies: data.dependencies,
|
349
|
+
userRequest,
|
350
|
+
rawRequest: request,
|
351
|
+
loaders,
|
352
|
+
resource,
|
353
|
+
matchResource,
|
354
|
+
resourceResolveData,
|
355
|
+
settings,
|
356
|
+
type,
|
357
|
+
parser: this.getParser(type, settings.parser),
|
358
|
+
generator: this.getGenerator(type, settings.generator),
|
359
|
+
resolveOptions
|
360
|
+
});
|
361
|
+
});
|
362
|
+
}
|
363
|
+
);
|
364
|
+
}
|
365
|
+
);
|
366
|
+
});
|
367
|
+
}
|
368
|
+
|
369
|
+
create(data, callback) {
|
370
|
+
const dependencies = data.dependencies;
|
371
|
+
const cacheEntry = dependencyCache.get(dependencies[0]);
|
372
|
+
if (cacheEntry) return callback(null, cacheEntry);
|
373
|
+
const context = data.context || this.context;
|
374
|
+
const resolveOptions = data.resolveOptions || EMPTY_RESOLVE_OPTIONS;
|
375
|
+
const request = dependencies[0].request;
|
376
|
+
const contextInfo = data.contextInfo || {};
|
377
|
+
this.hooks.beforeResolve.callAsync(
|
378
|
+
{
|
379
|
+
contextInfo,
|
380
|
+
resolveOptions,
|
381
|
+
context,
|
382
|
+
request,
|
383
|
+
dependencies
|
384
|
+
},
|
385
|
+
(err, result) => {
|
386
|
+
if (err) return callback(err);
|
387
|
+
|
388
|
+
// Ignored
|
389
|
+
if (!result) return callback();
|
390
|
+
|
391
|
+
const factory = this.hooks.factory.call(null);
|
392
|
+
|
393
|
+
// Ignored
|
394
|
+
if (!factory) return callback();
|
395
|
+
|
396
|
+
factory(result, (err, module) => {
|
397
|
+
if (err) return callback(err);
|
398
|
+
|
399
|
+
if (module && this.cachePredicate(module)) {
|
400
|
+
for (const d of dependencies) {
|
401
|
+
dependencyCache.set(d, module);
|
402
|
+
}
|
403
|
+
}
|
404
|
+
|
405
|
+
callback(null, module);
|
406
|
+
});
|
407
|
+
}
|
408
|
+
);
|
409
|
+
}
|
410
|
+
|
411
|
+
resolveRequestArray(contextInfo, context, array, resolver, callback) {
|
412
|
+
if (array.length === 0) return callback(null, []);
|
413
|
+
asyncLib.map(
|
414
|
+
array,
|
415
|
+
(item, callback) => {
|
416
|
+
resolver.resolve(
|
417
|
+
contextInfo,
|
418
|
+
context,
|
419
|
+
item.loader,
|
420
|
+
{},
|
421
|
+
(err, result) => {
|
422
|
+
if (
|
423
|
+
err &&
|
424
|
+
/^[^/]*$/.test(item.loader) &&
|
425
|
+
!/-loader$/.test(item.loader)
|
426
|
+
) {
|
427
|
+
return resolver.resolve(
|
428
|
+
contextInfo,
|
429
|
+
context,
|
430
|
+
item.loader + "-loader",
|
431
|
+
{},
|
432
|
+
err2 => {
|
433
|
+
if (!err2) {
|
434
|
+
err.message =
|
435
|
+
err.message +
|
436
|
+
"\n" +
|
437
|
+
"BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.\n" +
|
438
|
+
` You need to specify '${
|
439
|
+
item.loader
|
440
|
+
}-loader' instead of '${item.loader}',\n` +
|
441
|
+
" see https://webpack.js.org/migrate/3/#automatic-loader-module-name-extension-removed";
|
442
|
+
}
|
443
|
+
callback(err);
|
444
|
+
}
|
445
|
+
);
|
446
|
+
}
|
447
|
+
if (err) return callback(err);
|
448
|
+
|
449
|
+
const optionsOnly = item.options
|
450
|
+
? {
|
451
|
+
options: item.options
|
452
|
+
}
|
453
|
+
: undefined;
|
454
|
+
return callback(
|
455
|
+
null,
|
456
|
+
Object.assign({}, item, identToLoaderRequest(result), optionsOnly)
|
457
|
+
);
|
458
|
+
}
|
459
|
+
);
|
460
|
+
},
|
461
|
+
callback
|
462
|
+
);
|
463
|
+
}
|
464
|
+
|
465
|
+
getParser(type, parserOptions) {
|
466
|
+
let ident = type;
|
467
|
+
if (parserOptions) {
|
468
|
+
if (parserOptions.ident) {
|
469
|
+
ident = `${type}|${parserOptions.ident}`;
|
470
|
+
} else {
|
471
|
+
ident = JSON.stringify([type, parserOptions]);
|
472
|
+
}
|
473
|
+
}
|
474
|
+
if (ident in this.parserCache) {
|
475
|
+
return this.parserCache[ident];
|
476
|
+
}
|
477
|
+
return (this.parserCache[ident] = this.createParser(type, parserOptions));
|
478
|
+
}
|
479
|
+
|
480
|
+
createParser(type, parserOptions = {}) {
|
481
|
+
const parser = this.hooks.createParser.for(type).call(parserOptions);
|
482
|
+
if (!parser) {
|
483
|
+
throw new Error(`No parser registered for ${type}`);
|
484
|
+
}
|
485
|
+
this.hooks.parser.for(type).call(parser, parserOptions);
|
486
|
+
return parser;
|
487
|
+
}
|
488
|
+
|
489
|
+
getGenerator(type, generatorOptions) {
|
490
|
+
let ident = type;
|
491
|
+
if (generatorOptions) {
|
492
|
+
if (generatorOptions.ident) {
|
493
|
+
ident = `${type}|${generatorOptions.ident}`;
|
494
|
+
} else {
|
495
|
+
ident = JSON.stringify([type, generatorOptions]);
|
496
|
+
}
|
497
|
+
}
|
498
|
+
if (ident in this.generatorCache) {
|
499
|
+
return this.generatorCache[ident];
|
500
|
+
}
|
501
|
+
return (this.generatorCache[ident] = this.createGenerator(
|
502
|
+
type,
|
503
|
+
generatorOptions
|
504
|
+
));
|
505
|
+
}
|
506
|
+
|
507
|
+
createGenerator(type, generatorOptions = {}) {
|
508
|
+
const generator = this.hooks.createGenerator
|
509
|
+
.for(type)
|
510
|
+
.call(generatorOptions);
|
511
|
+
if (!generator) {
|
512
|
+
throw new Error(`No generator registered for ${type}`);
|
513
|
+
}
|
514
|
+
this.hooks.generator.for(type).call(generator, generatorOptions);
|
515
|
+
return generator;
|
516
|
+
}
|
517
|
+
|
518
|
+
getResolver(type, resolveOptions) {
|
519
|
+
return this.resolverFactory.get(
|
520
|
+
type,
|
521
|
+
resolveOptions || EMPTY_RESOLVE_OPTIONS
|
522
|
+
);
|
523
|
+
}
|
524
|
+
}
|
525
|
+
|
526
|
+
module.exports = NormalModuleFactory;
|