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.
Files changed (271) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +761 -758
  3. package/SECURITY.md +9 -9
  4. package/buildin/amd-define.js +3 -3
  5. package/buildin/amd-options.js +2 -2
  6. package/buildin/global.js +20 -20
  7. package/buildin/harmony-module.js +24 -24
  8. package/buildin/module.js +22 -22
  9. package/buildin/system.js +7 -7
  10. package/hot/dev-server.js +61 -61
  11. package/hot/emitter.js +2 -2
  12. package/hot/log-apply-result.js +44 -44
  13. package/hot/log.js +45 -45
  14. package/hot/only-dev-server.js +105 -105
  15. package/hot/poll.js +40 -37
  16. package/hot/signal.js +62 -62
  17. package/lib/APIPlugin.js +84 -84
  18. package/lib/AmdMainTemplatePlugin.js +87 -87
  19. package/lib/AsyncDependencyToInitialChunkError.js +31 -31
  20. package/lib/AutomaticPrefetchPlugin.js +1 -1
  21. package/lib/BannerPlugin.js +117 -117
  22. package/lib/BasicEvaluatedExpression.js +211 -211
  23. package/lib/CachePlugin.js +102 -102
  24. package/lib/CaseSensitiveModulesWarning.js +67 -67
  25. package/lib/Chunk.js +833 -811
  26. package/lib/ChunkGroup.js +4 -4
  27. package/lib/ChunkRenderError.js +32 -32
  28. package/lib/CommentCompilationWarning.js +2 -2
  29. package/lib/CompatibilityPlugin.js +70 -70
  30. package/lib/Compilation.js +46 -15
  31. package/lib/ConcurrentCompilationError.js +19 -19
  32. package/lib/ConstPlugin.js +258 -258
  33. package/lib/ContextExclusionPlugin.js +28 -17
  34. package/lib/ContextModule.js +844 -739
  35. package/lib/ContextModuleFactory.js +262 -256
  36. package/lib/ContextReplacementPlugin.js +133 -133
  37. package/lib/DefinePlugin.js +49 -0
  38. package/lib/DelegatedModule.js +5 -0
  39. package/lib/DelegatedModuleFactoryPlugin.js +95 -89
  40. package/lib/DelegatedPlugin.js +39 -39
  41. package/lib/DependenciesBlock.js +1 -1
  42. package/lib/Dependency.js +10 -4
  43. package/lib/DllModule.js +60 -54
  44. package/lib/DllModuleFactory.js +29 -29
  45. package/lib/DllPlugin.js +44 -44
  46. package/lib/DllReferencePlugin.js +132 -84
  47. package/lib/EntryModuleNotFoundError.js +21 -21
  48. package/lib/Entrypoint.js +54 -54
  49. package/lib/EnvironmentPlugin.js +72 -65
  50. package/lib/ErrorHelpers.js +60 -60
  51. package/lib/EvalDevToolModulePlugin.js +27 -27
  52. package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
  53. package/lib/EvalSourceMapDevToolPlugin.js +41 -41
  54. package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
  55. package/lib/ExternalModule.js +165 -159
  56. package/lib/ExternalsPlugin.js +23 -23
  57. package/lib/FlagDependencyExportsPlugin.js +146 -146
  58. package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
  59. package/lib/FunctionModuleTemplatePlugin.js +100 -100
  60. package/lib/Generator.js +60 -52
  61. package/lib/HarmonyLinkingError.js +17 -17
  62. package/lib/HashedModuleIdsPlugin.js +53 -53
  63. package/lib/HotModuleReplacementPlugin.js +411 -413
  64. package/lib/IgnorePlugin.js +90 -90
  65. package/lib/JavascriptGenerator.js +229 -229
  66. package/lib/JavascriptModulesPlugin.js +179 -179
  67. package/lib/JsonGenerator.js +55 -55
  68. package/lib/JsonModulesPlugin.js +30 -30
  69. package/lib/JsonParser.js +27 -27
  70. package/lib/LibManifestPlugin.js +86 -86
  71. package/lib/LibraryTemplatePlugin.js +153 -153
  72. package/lib/LoaderOptionsPlugin.js +53 -53
  73. package/lib/LoaderTargetPlugin.js +24 -24
  74. package/lib/MemoryOutputFileSystem.js +5 -5
  75. package/lib/Module.js +431 -391
  76. package/lib/ModuleBuildError.js +52 -52
  77. package/lib/ModuleDependencyError.js +35 -35
  78. package/lib/ModuleDependencyWarning.js +25 -25
  79. package/lib/ModuleError.js +36 -36
  80. package/lib/ModuleFilenameHelpers.js +178 -178
  81. package/lib/ModuleNotFoundError.js +23 -23
  82. package/lib/ModuleParseError.js +57 -57
  83. package/lib/ModuleTemplate.js +93 -93
  84. package/lib/ModuleWarning.js +36 -36
  85. package/lib/MultiCompiler.js +283 -283
  86. package/lib/MultiModule.js +87 -81
  87. package/lib/MultiModuleFactory.js +23 -23
  88. package/lib/MultiStats.js +92 -92
  89. package/lib/MultiWatching.js +38 -38
  90. package/lib/NamedChunksPlugin.js +29 -29
  91. package/lib/NamedModulesPlugin.js +57 -57
  92. package/lib/NoEmitOnErrorsPlugin.js +20 -20
  93. package/lib/NoModeWarning.js +23 -23
  94. package/lib/NodeStuffPlugin.js +197 -179
  95. package/lib/NormalModule.js +542 -536
  96. package/lib/NormalModuleFactory.js +526 -526
  97. package/lib/NormalModuleReplacementPlugin.js +51 -51
  98. package/lib/NullFactory.js +12 -12
  99. package/lib/OptionsApply.js +10 -10
  100. package/lib/OptionsDefaulter.js +84 -84
  101. package/lib/Parser.js +2202 -2193
  102. package/lib/ParserHelpers.js +103 -103
  103. package/lib/PrefetchPlugin.js +37 -37
  104. package/lib/ProgressPlugin.js +246 -246
  105. package/lib/ProvidePlugin.js +86 -86
  106. package/lib/RawModule.js +56 -56
  107. package/lib/RecordIdsPlugin.js +230 -230
  108. package/lib/RemovedPluginError.js +11 -11
  109. package/lib/RequestShortener.js +83 -83
  110. package/lib/RequireJsStuffPlugin.js +69 -69
  111. package/lib/ResolverFactory.js +64 -64
  112. package/lib/RuntimeTemplate.js +12 -0
  113. package/lib/SetVarMainTemplatePlugin.js +69 -69
  114. package/lib/SingleEntryPlugin.js +6 -1
  115. package/lib/SizeFormatHelpers.js +24 -24
  116. package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
  117. package/lib/SourceMapDevToolPlugin.js +301 -301
  118. package/lib/Stats.js +28 -5
  119. package/lib/TemplatedPathPlugin.js +173 -173
  120. package/lib/UnsupportedFeatureWarning.js +22 -22
  121. package/lib/UseStrictPlugin.js +54 -54
  122. package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
  123. package/lib/WarnNoModeSetPlugin.js +17 -17
  124. package/lib/WatchIgnorePlugin.js +100 -100
  125. package/lib/Watching.js +194 -194
  126. package/lib/WebpackOptionsApply.js +92 -10
  127. package/lib/WebpackOptionsDefaulter.js +368 -354
  128. package/lib/debug/ProfilingPlugin.js +430 -430
  129. package/lib/dependencies/AMDPlugin.js +250 -250
  130. package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
  131. package/lib/dependencies/AMDRequireContextDependency.js +20 -20
  132. package/lib/dependencies/AMDRequireDependency.js +135 -135
  133. package/lib/dependencies/AMDRequireItemDependency.js +22 -22
  134. package/lib/dependencies/CommonJsPlugin.js +161 -161
  135. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
  136. package/lib/dependencies/CommonJsRequireDependency.js +22 -22
  137. package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
  138. package/lib/dependencies/ConstDependency.js +33 -33
  139. package/lib/dependencies/ContextDependency.js +68 -68
  140. package/lib/dependencies/ContextDependencyHelpers.js +142 -142
  141. package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
  142. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
  143. package/lib/dependencies/ContextElementDependency.js +21 -21
  144. package/lib/dependencies/CriticalDependencyWarning.js +20 -20
  145. package/lib/dependencies/DelegatedSourceDependency.js +18 -18
  146. package/lib/dependencies/DllEntryDependency.js +20 -20
  147. package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
  148. package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
  149. package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
  150. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
  151. package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
  152. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
  153. package/lib/dependencies/HarmonyImportDependency.js +109 -109
  154. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
  155. package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
  156. package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
  157. package/lib/dependencies/HarmonyInitDependency.js +60 -60
  158. package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
  159. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
  160. package/lib/dependencies/ImportContextDependency.js +23 -23
  161. package/lib/dependencies/ImportDependenciesBlock.js +18 -18
  162. package/lib/dependencies/ImportDependency.js +34 -34
  163. package/lib/dependencies/ImportEagerDependency.js +32 -32
  164. package/lib/dependencies/ImportParserPlugin.js +263 -263
  165. package/lib/dependencies/ImportPlugin.js +82 -82
  166. package/lib/dependencies/ImportWeakDependency.js +34 -34
  167. package/lib/dependencies/LoaderPlugin.js +18 -1
  168. package/lib/dependencies/LocalModule.js +23 -23
  169. package/lib/dependencies/LocalModulesHelpers.js +52 -52
  170. package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
  171. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
  172. package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
  173. package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
  174. package/lib/dependencies/NullDependency.js +20 -20
  175. package/lib/dependencies/PrefetchDependency.js +18 -18
  176. package/lib/dependencies/RequireContextDependency.js +22 -22
  177. package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
  178. package/lib/dependencies/RequireContextPlugin.js +143 -143
  179. package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
  180. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
  181. package/lib/dependencies/RequireEnsureDependency.js +58 -58
  182. package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
  183. package/lib/dependencies/RequireEnsurePlugin.js +74 -74
  184. package/lib/dependencies/RequireHeaderDependency.js +26 -26
  185. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
  186. package/lib/dependencies/RequireIncludePlugin.js +61 -61
  187. package/lib/dependencies/RequireResolveContextDependency.js +23 -23
  188. package/lib/dependencies/RequireResolveDependency.js +22 -22
  189. package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
  190. package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
  191. package/lib/dependencies/SystemPlugin.js +125 -125
  192. package/lib/dependencies/UnsupportedDependency.js +27 -27
  193. package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
  194. package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
  195. package/lib/dependencies/WebpackMissingModule.js +20 -20
  196. package/lib/formatLocation.js +75 -61
  197. package/lib/node/NodeChunkTemplatePlugin.js +31 -31
  198. package/lib/node/NodeEnvironmentPlugin.js +28 -28
  199. package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
  200. package/lib/node/NodeMainTemplate.runtime.js +27 -27
  201. package/lib/node/NodeMainTemplatePlugin.js +323 -323
  202. package/lib/node/NodeOutputFileSystem.js +22 -22
  203. package/lib/node/NodeSourcePlugin.js +144 -144
  204. package/lib/node/NodeTargetPlugin.js +18 -18
  205. package/lib/node/NodeTemplatePlugin.js +31 -31
  206. package/lib/node/NodeWatchFileSystem.js +99 -99
  207. package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
  208. package/lib/optimize/AggressiveMergingPlugin.js +87 -87
  209. package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
  210. package/lib/optimize/ConcatenatedModule.js +5 -0
  211. package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
  212. package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
  213. package/lib/optimize/LimitChunkCountPlugin.js +66 -66
  214. package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
  215. package/lib/optimize/MinChunkSizePlugin.js +77 -77
  216. package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
  217. package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
  218. package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
  219. package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
  220. package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
  221. package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
  222. package/lib/optimize/RuntimeChunkPlugin.js +41 -41
  223. package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
  224. package/lib/optimize/SplitChunksPlugin.js +866 -850
  225. package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
  226. package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
  227. package/lib/performance/NoAsyncChunksWarning.js +21 -21
  228. package/lib/performance/SizeLimitsPlugin.js +105 -105
  229. package/lib/util/SortableSet.js +1 -0
  230. package/lib/util/StackedSetMap.js +144 -135
  231. package/lib/util/TrackingSet.js +35 -35
  232. package/lib/util/cachedMerge.js +35 -35
  233. package/lib/util/deterministicGrouping.js +251 -251
  234. package/lib/util/identifier.js +103 -103
  235. package/lib/util/objectToMap.js +16 -16
  236. package/lib/validateSchema.js +67 -67
  237. package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
  238. package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
  239. package/lib/wasm/WebAssemblyGenerator.js +16 -2
  240. package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
  241. package/lib/wasm/WebAssemblyParser.js +174 -174
  242. package/lib/wasm/WebAssemblyUtils.js +59 -59
  243. package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
  244. package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
  245. package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
  246. package/lib/web/JsonpMainTemplate.runtime.js +65 -65
  247. package/lib/web/JsonpMainTemplatePlugin.js +1 -1
  248. package/lib/web/JsonpTemplatePlugin.js +23 -23
  249. package/lib/web/WebEnvironmentPlugin.js +18 -18
  250. package/lib/webpack.js +5 -0
  251. package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
  252. package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
  253. package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
  254. package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
  255. package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
  256. package/package.json +22 -13
  257. package/schemas/WebpackOptions.json +2062 -2036
  258. package/schemas/ajv.absolutePath.js +55 -55
  259. package/schemas/plugins/BannerPlugin.json +96 -96
  260. package/schemas/plugins/DllPlugin.json +32 -32
  261. package/schemas/plugins/DllReferencePlugin.json +99 -99
  262. package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
  263. package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
  264. package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
  265. package/schemas/plugins/WatchIgnorePlugin.json +16 -16
  266. package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
  267. package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
  268. package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
  269. package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
  270. package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
  271. package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
@@ -1,739 +1,844 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
- const util = require("util");
7
- const { OriginalSource, RawSource } = require("webpack-sources");
8
- const Module = require("./Module");
9
- const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
10
- const Template = require("./Template");
11
- const contextify = require("./util/identifier").contextify;
12
-
13
- /** @typedef {import("./dependencies/ContextElementDependency")} ContextElementDependency */
14
-
15
- class ContextModule extends Module {
16
- // type ContextMode = "sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"
17
- // type ContextOptions = { resource: string, recursive: boolean, regExp: RegExp, addon?: string, mode?: ContextMode, chunkName?: string, include?: RegExp, exclude?: RegExp, groupOptions?: Object }
18
- // resolveDependencies: (fs: FS, options: ContextOptions, (err: Error?, dependencies: Dependency[]) => void) => void
19
- // options: ContextOptions
20
- constructor(resolveDependencies, options) {
21
- let resource;
22
- let resourceQuery;
23
- const queryIdx = options.resource.indexOf("?");
24
- if (queryIdx >= 0) {
25
- resource = options.resource.substr(0, queryIdx);
26
- resourceQuery = options.resource.substr(queryIdx);
27
- } else {
28
- resource = options.resource;
29
- resourceQuery = "";
30
- }
31
-
32
- super("javascript/dynamic", resource);
33
-
34
- // Info from Factory
35
- this.resolveDependencies = resolveDependencies;
36
- this.options = Object.assign({}, options, {
37
- resource: resource,
38
- resourceQuery: resourceQuery
39
- });
40
- if (options.resolveOptions !== undefined) {
41
- this.resolveOptions = options.resolveOptions;
42
- }
43
-
44
- // Info from Build
45
- this._contextDependencies = new Set([this.context]);
46
-
47
- if (typeof options.mode !== "string") {
48
- throw new Error("options.mode is a required option");
49
- }
50
-
51
- this._identifier = this._createIdentifier();
52
- }
53
-
54
- updateCacheModule(module) {
55
- this.resolveDependencies = module.resolveDependencies;
56
- this.options = module.options;
57
- this.resolveOptions = module.resolveOptions;
58
- }
59
-
60
- prettyRegExp(regexString) {
61
- // remove the "/" at the front and the beginning
62
- // "/foo/" -> "foo"
63
- return regexString.substring(1, regexString.length - 1);
64
- }
65
-
66
- _createIdentifier() {
67
- let identifier = this.context;
68
- if (this.options.resourceQuery) {
69
- identifier += ` ${this.options.resourceQuery}`;
70
- }
71
- if (this.options.mode) {
72
- identifier += ` ${this.options.mode}`;
73
- }
74
- if (!this.options.recursive) {
75
- identifier += " nonrecursive";
76
- }
77
- if (this.options.addon) {
78
- identifier += ` ${this.options.addon}`;
79
- }
80
- if (this.options.regExp) {
81
- identifier += ` ${this.options.regExp}`;
82
- }
83
- if (this.options.include) {
84
- identifier += ` include: ${this.options.include}`;
85
- }
86
- if (this.options.exclude) {
87
- identifier += ` exclude: ${this.options.exclude}`;
88
- }
89
- if (this.options.groupOptions) {
90
- identifier += ` groupOptions: ${JSON.stringify(
91
- this.options.groupOptions
92
- )}`;
93
- }
94
- if (this.options.namespaceObject === "strict") {
95
- identifier += " strict namespace object";
96
- } else if (this.options.namespaceObject) {
97
- identifier += " namespace object";
98
- }
99
-
100
- return identifier;
101
- }
102
-
103
- identifier() {
104
- return this._identifier;
105
- }
106
-
107
- readableIdentifier(requestShortener) {
108
- let identifier = requestShortener.shorten(this.context);
109
- if (this.options.resourceQuery) {
110
- identifier += ` ${this.options.resourceQuery}`;
111
- }
112
- if (this.options.mode) {
113
- identifier += ` ${this.options.mode}`;
114
- }
115
- if (!this.options.recursive) {
116
- identifier += " nonrecursive";
117
- }
118
- if (this.options.addon) {
119
- identifier += ` ${requestShortener.shorten(this.options.addon)}`;
120
- }
121
- if (this.options.regExp) {
122
- identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
123
- }
124
- if (this.options.include) {
125
- identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
126
- }
127
- if (this.options.exclude) {
128
- identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
129
- }
130
- if (this.options.groupOptions) {
131
- const groupOptions = this.options.groupOptions;
132
- for (const key of Object.keys(groupOptions)) {
133
- identifier += ` ${key}: ${groupOptions[key]}`;
134
- }
135
- }
136
- if (this.options.namespaceObject === "strict") {
137
- identifier += " strict namespace object";
138
- } else if (this.options.namespaceObject) {
139
- identifier += " namespace object";
140
- }
141
-
142
- return identifier;
143
- }
144
-
145
- libIdent(options) {
146
- let identifier = contextify(options.context, this.context);
147
- if (this.options.mode) {
148
- identifier += ` ${this.options.mode}`;
149
- }
150
- if (this.options.recursive) {
151
- identifier += " recursive";
152
- }
153
- if (this.options.addon) {
154
- identifier += ` ${contextify(options.context, this.options.addon)}`;
155
- }
156
- if (this.options.regExp) {
157
- identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
158
- }
159
- if (this.options.include) {
160
- identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
161
- }
162
- if (this.options.exclude) {
163
- identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
164
- }
165
-
166
- return identifier;
167
- }
168
-
169
- needRebuild(fileTimestamps, contextTimestamps) {
170
- const ts = contextTimestamps.get(this.context);
171
- if (!ts) {
172
- return true;
173
- }
174
-
175
- return ts >= this.buildInfo.builtTime;
176
- }
177
-
178
- build(options, compilation, resolver, fs, callback) {
179
- this.built = true;
180
- this.buildMeta = {};
181
- this.buildInfo = {
182
- builtTime: Date.now(),
183
- contextDependencies: this._contextDependencies
184
- };
185
- this.resolveDependencies(fs, this.options, (err, dependencies) => {
186
- if (err) return callback(err);
187
-
188
- // abort if something failed
189
- // this will create an empty context
190
- if (!dependencies) {
191
- callback();
192
- return;
193
- }
194
-
195
- // enhance dependencies with meta info
196
- for (const dep of dependencies) {
197
- dep.loc = dep.userRequest;
198
- dep.request = this.options.addon + dep.request;
199
- }
200
-
201
- if (this.options.mode === "sync" || this.options.mode === "eager") {
202
- // if we have an sync or eager context
203
- // just add all dependencies and continue
204
- this.dependencies = dependencies;
205
- } else if (this.options.mode === "lazy-once") {
206
- // for the lazy-once mode create a new async dependency block
207
- // and add that block to this context
208
- if (dependencies.length > 0) {
209
- const block = new AsyncDependenciesBlock(
210
- Object.assign({}, this.options.groupOptions, {
211
- name: this.options.chunkName
212
- }),
213
- this
214
- );
215
- for (const dep of dependencies) {
216
- block.addDependency(dep);
217
- }
218
- this.addBlock(block);
219
- }
220
- } else if (
221
- this.options.mode === "weak" ||
222
- this.options.mode === "async-weak"
223
- ) {
224
- // we mark all dependencies as weak
225
- for (const dep of dependencies) {
226
- dep.weak = true;
227
- }
228
- this.dependencies = dependencies;
229
- } else if (this.options.mode === "lazy") {
230
- // if we are lazy create a new async dependency block per dependency
231
- // and add all blocks to this context
232
- let index = 0;
233
- for (const dep of dependencies) {
234
- let chunkName = this.options.chunkName;
235
- if (chunkName) {
236
- if (!/\[(index|request)\]/.test(chunkName)) {
237
- chunkName += "[index]";
238
- }
239
- chunkName = chunkName.replace(/\[index\]/g, index++);
240
- chunkName = chunkName.replace(
241
- /\[request\]/g,
242
- Template.toPath(dep.userRequest)
243
- );
244
- }
245
- const block = new AsyncDependenciesBlock(
246
- Object.assign({}, this.options.groupOptions, {
247
- name: chunkName
248
- }),
249
- dep.module,
250
- dep.loc,
251
- dep.userRequest
252
- );
253
- block.addDependency(dep);
254
- this.addBlock(block);
255
- }
256
- } else {
257
- callback(
258
- new Error(`Unsupported mode "${this.options.mode}" in context`)
259
- );
260
- return;
261
- }
262
- callback();
263
- });
264
- }
265
-
266
- getUserRequestMap(dependencies) {
267
- // if we filter first we get a new array
268
- // therefor we dont need to create a clone of dependencies explicitly
269
- // therefore the order of this is !important!
270
- return dependencies
271
- .filter(dependency => dependency.module)
272
- .sort((a, b) => {
273
- if (a.userRequest === b.userRequest) {
274
- return 0;
275
- }
276
- return a.userRequest < b.userRequest ? -1 : 1;
277
- })
278
- .reduce((map, dep) => {
279
- map[dep.userRequest] = dep.module.id;
280
- return map;
281
- }, Object.create(null));
282
- }
283
-
284
- getFakeMap(dependencies) {
285
- if (!this.options.namespaceObject) {
286
- return 9;
287
- }
288
- // if we filter first we get a new array
289
- // therefor we dont need to create a clone of dependencies explicitly
290
- // therefore the order of this is !important!
291
- let hasNonHarmony = false;
292
- let hasNamespace = false;
293
- let hasNamed = false;
294
- const fakeMap = dependencies
295
- .filter(dependency => dependency.module)
296
- .sort((a, b) => {
297
- return b.module.id - a.module.id;
298
- })
299
- .reduce((map, dep) => {
300
- const exportsType =
301
- dep.module.buildMeta && dep.module.buildMeta.exportsType;
302
- const id = dep.module.id;
303
- if (!exportsType) {
304
- map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
305
- hasNonHarmony = true;
306
- } else if (exportsType === "namespace") {
307
- map[id] = 9;
308
- hasNamespace = true;
309
- } else if (exportsType === "named") {
310
- map[id] = 3;
311
- hasNamed = true;
312
- }
313
- return map;
314
- }, Object.create(null));
315
- if (!hasNamespace && hasNonHarmony && !hasNamed) {
316
- return this.options.namespaceObject === "strict" ? 1 : 7;
317
- }
318
- if (hasNamespace && !hasNonHarmony && !hasNamed) {
319
- return 9;
320
- }
321
- if (!hasNamespace && !hasNonHarmony && hasNamed) {
322
- return 3;
323
- }
324
- if (!hasNamespace && !hasNonHarmony && !hasNamed) {
325
- return 9;
326
- }
327
- return fakeMap;
328
- }
329
-
330
- getFakeMapInitStatement(fakeMap) {
331
- return typeof fakeMap === "object"
332
- ? `var fakeMap = ${JSON.stringify(fakeMap, null, "\t")};`
333
- : "";
334
- }
335
-
336
- getReturn(type) {
337
- if (type === 9) {
338
- return "__webpack_require__(id)";
339
- }
340
- return `__webpack_require__.t(id, ${type})`;
341
- }
342
-
343
- getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
344
- if (typeof fakeMap === "number") {
345
- return `return ${this.getReturn(fakeMap)};`;
346
- }
347
- return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
348
- }
349
-
350
- getSyncSource(dependencies, id) {
351
- const map = this.getUserRequestMap(dependencies);
352
- const fakeMap = this.getFakeMap(dependencies);
353
- const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
354
-
355
- return `var map = ${JSON.stringify(map, null, "\t")};
356
- ${this.getFakeMapInitStatement(fakeMap)}
357
-
358
- function webpackContext(req) {
359
- var id = webpackContextResolve(req);
360
- ${returnModuleObject}
361
- }
362
- function webpackContextResolve(req) {
363
- var id = map[req];
364
- if(!(id + 1)) { // check for number or string
365
- var e = new Error("Cannot find module '" + req + "'");
366
- e.code = 'MODULE_NOT_FOUND';
367
- throw e;
368
- }
369
- return id;
370
- }
371
- webpackContext.keys = function webpackContextKeys() {
372
- return Object.keys(map);
373
- };
374
- webpackContext.resolve = webpackContextResolve;
375
- module.exports = webpackContext;
376
- webpackContext.id = ${JSON.stringify(id)};`;
377
- }
378
-
379
- getWeakSyncSource(dependencies, id) {
380
- const map = this.getUserRequestMap(dependencies);
381
- const fakeMap = this.getFakeMap(dependencies);
382
- const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
383
-
384
- return `var map = ${JSON.stringify(map, null, "\t")};
385
- ${this.getFakeMapInitStatement(fakeMap)}
386
-
387
- function webpackContext(req) {
388
- var id = webpackContextResolve(req);
389
- if(!__webpack_require__.m[id]) {
390
- var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
391
- e.code = 'MODULE_NOT_FOUND';
392
- throw e;
393
- }
394
- ${returnModuleObject}
395
- }
396
- function webpackContextResolve(req) {
397
- var id = map[req];
398
- if(!(id + 1)) { // check for number or string
399
- var e = new Error("Cannot find module '" + req + "'");
400
- e.code = 'MODULE_NOT_FOUND';
401
- throw e;
402
- }
403
- return id;
404
- }
405
- webpackContext.keys = function webpackContextKeys() {
406
- return Object.keys(map);
407
- };
408
- webpackContext.resolve = webpackContextResolve;
409
- webpackContext.id = ${JSON.stringify(id)};
410
- module.exports = webpackContext;`;
411
- }
412
-
413
- getAsyncWeakSource(dependencies, id) {
414
- const map = this.getUserRequestMap(dependencies);
415
- const fakeMap = this.getFakeMap(dependencies);
416
- const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
417
-
418
- return `var map = ${JSON.stringify(map, null, "\t")};
419
- ${this.getFakeMapInitStatement(fakeMap)}
420
-
421
- function webpackAsyncContext(req) {
422
- return webpackAsyncContextResolve(req).then(function(id) {
423
- if(!__webpack_require__.m[id]) {
424
- var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
425
- e.code = 'MODULE_NOT_FOUND';
426
- throw e;
427
- }
428
- ${returnModuleObject}
429
- });
430
- }
431
- function webpackAsyncContextResolve(req) {
432
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
433
- // uncaught exception popping up in devtools
434
- return Promise.resolve().then(function() {
435
- var id = map[req];
436
- if(!(id + 1)) { // check for number or string
437
- var e = new Error("Cannot find module '" + req + "'");
438
- e.code = 'MODULE_NOT_FOUND';
439
- throw e;
440
- }
441
- return id;
442
- });
443
- }
444
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
445
- return Object.keys(map);
446
- };
447
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
448
- webpackAsyncContext.id = ${JSON.stringify(id)};
449
- module.exports = webpackAsyncContext;`;
450
- }
451
-
452
- getEagerSource(dependencies, id) {
453
- const map = this.getUserRequestMap(dependencies);
454
- const fakeMap = this.getFakeMap(dependencies);
455
- const thenFunction =
456
- fakeMap !== 9
457
- ? `function(id) {
458
- ${this.getReturnModuleObjectSource(fakeMap)}
459
- }`
460
- : "__webpack_require__";
461
- return `var map = ${JSON.stringify(map, null, "\t")};
462
- ${this.getFakeMapInitStatement(fakeMap)}
463
-
464
- function webpackAsyncContext(req) {
465
- return webpackAsyncContextResolve(req).then(${thenFunction});
466
- }
467
- function webpackAsyncContextResolve(req) {
468
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
469
- // uncaught exception popping up in devtools
470
- return Promise.resolve().then(function() {
471
- var id = map[req];
472
- if(!(id + 1)) { // check for number or string
473
- var e = new Error("Cannot find module '" + req + "'");
474
- e.code = 'MODULE_NOT_FOUND';
475
- throw e;
476
- }
477
- return id;
478
- });
479
- }
480
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
481
- return Object.keys(map);
482
- };
483
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
484
- webpackAsyncContext.id = ${JSON.stringify(id)};
485
- module.exports = webpackAsyncContext;`;
486
- }
487
-
488
- getLazyOnceSource(block, dependencies, id, runtimeTemplate) {
489
- const promise = runtimeTemplate.blockPromise({
490
- block,
491
- message: "lazy-once context"
492
- });
493
- const map = this.getUserRequestMap(dependencies);
494
- const fakeMap = this.getFakeMap(dependencies);
495
- const thenFunction =
496
- fakeMap !== 9
497
- ? `function(id) {
498
- ${this.getReturnModuleObjectSource(fakeMap)};
499
- }`
500
- : "__webpack_require__";
501
-
502
- return `var map = ${JSON.stringify(map, null, "\t")};
503
- ${this.getFakeMapInitStatement(fakeMap)}
504
-
505
- function webpackAsyncContext(req) {
506
- return webpackAsyncContextResolve(req).then(${thenFunction});
507
- }
508
- function webpackAsyncContextResolve(req) {
509
- return ${promise}.then(function() {
510
- var id = map[req];
511
- if(!(id + 1)) { // check for number or string
512
- var e = new Error("Cannot find module '" + req + "'");
513
- e.code = 'MODULE_NOT_FOUND';
514
- throw e;
515
- }
516
- return id;
517
- });
518
- }
519
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
520
- return Object.keys(map);
521
- };
522
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
523
- webpackAsyncContext.id = ${JSON.stringify(id)};
524
- module.exports = webpackAsyncContext;`;
525
- }
526
-
527
- getLazySource(blocks, id) {
528
- let hasMultipleOrNoChunks = false;
529
- const fakeMap = this.getFakeMap(blocks.map(b => b.dependencies[0]));
530
- const map = blocks
531
- .filter(block => block.dependencies[0].module)
532
- .map(block => ({
533
- dependency: block.dependencies[0],
534
- block: block,
535
- userRequest: block.dependencies[0].userRequest
536
- }))
537
- .sort((a, b) => {
538
- if (a.userRequest === b.userRequest) return 0;
539
- return a.userRequest < b.userRequest ? -1 : 1;
540
- })
541
- .reduce((map, item) => {
542
- const chunks =
543
- (item.block.chunkGroup && item.block.chunkGroup.chunks) || [];
544
- if (chunks.length !== 1) {
545
- hasMultipleOrNoChunks = true;
546
- }
547
- const arrayStart = [item.dependency.module.id];
548
- if (typeof fakeMap === "object") {
549
- arrayStart.push(fakeMap[item.dependency.module.id]);
550
- }
551
- map[item.userRequest] = arrayStart.concat(
552
- chunks.map(chunk => chunk.id)
553
- );
554
-
555
- return map;
556
- }, Object.create(null));
557
-
558
- const chunksStartPosition = typeof fakeMap === "object" ? 2 : 1;
559
- const requestPrefix = hasMultipleOrNoChunks
560
- ? `Promise.all(ids.slice(${chunksStartPosition}).map(__webpack_require__.e))`
561
- : `__webpack_require__.e(ids[${chunksStartPosition}])`;
562
- const returnModuleObject = this.getReturnModuleObjectSource(
563
- fakeMap,
564
- "ids[1]"
565
- );
566
-
567
- return `var map = ${JSON.stringify(map, null, "\t")};
568
- function webpackAsyncContext(req) {
569
- var ids = map[req];
570
- if(!ids) {
571
- return Promise.resolve().then(function() {
572
- var e = new Error("Cannot find module '" + req + "'");
573
- e.code = 'MODULE_NOT_FOUND';
574
- throw e;
575
- });
576
- }
577
- return ${requestPrefix}.then(function() {
578
- var id = ids[0];
579
- ${returnModuleObject}
580
- });
581
- }
582
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
583
- return Object.keys(map);
584
- };
585
- webpackAsyncContext.id = ${JSON.stringify(id)};
586
- module.exports = webpackAsyncContext;`;
587
- }
588
-
589
- getSourceForEmptyContext(id) {
590
- return `function webpackEmptyContext(req) {
591
- var e = new Error("Cannot find module '" + req + "'");
592
- e.code = 'MODULE_NOT_FOUND';
593
- throw e;
594
- }
595
- webpackEmptyContext.keys = function() { return []; };
596
- webpackEmptyContext.resolve = webpackEmptyContext;
597
- module.exports = webpackEmptyContext;
598
- webpackEmptyContext.id = ${JSON.stringify(id)};`;
599
- }
600
-
601
- getSourceForEmptyAsyncContext(id) {
602
- return `function webpackEmptyAsyncContext(req) {
603
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
604
- // uncaught exception popping up in devtools
605
- return Promise.resolve().then(function() {
606
- var e = new Error("Cannot find module '" + req + "'");
607
- e.code = 'MODULE_NOT_FOUND';
608
- throw e;
609
- });
610
- }
611
- webpackEmptyAsyncContext.keys = function() { return []; };
612
- webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
613
- module.exports = webpackEmptyAsyncContext;
614
- webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
615
- }
616
-
617
- getSourceString(asyncMode, runtimeTemplate) {
618
- if (asyncMode === "lazy") {
619
- if (this.blocks && this.blocks.length > 0) {
620
- return this.getLazySource(this.blocks, this.id);
621
- }
622
- return this.getSourceForEmptyAsyncContext(this.id);
623
- }
624
- if (asyncMode === "eager") {
625
- if (this.dependencies && this.dependencies.length > 0) {
626
- return this.getEagerSource(this.dependencies, this.id);
627
- }
628
- return this.getSourceForEmptyAsyncContext(this.id);
629
- }
630
- if (asyncMode === "lazy-once") {
631
- const block = this.blocks[0];
632
- if (block) {
633
- return this.getLazyOnceSource(
634
- block,
635
- block.dependencies,
636
- this.id,
637
- runtimeTemplate
638
- );
639
- }
640
- return this.getSourceForEmptyAsyncContext(this.id);
641
- }
642
- if (asyncMode === "async-weak") {
643
- if (this.dependencies && this.dependencies.length > 0) {
644
- return this.getAsyncWeakSource(this.dependencies, this.id);
645
- }
646
- return this.getSourceForEmptyAsyncContext(this.id);
647
- }
648
- if (asyncMode === "weak") {
649
- if (this.dependencies && this.dependencies.length > 0) {
650
- return this.getWeakSyncSource(this.dependencies, this.id);
651
- }
652
- }
653
- if (this.dependencies && this.dependencies.length > 0) {
654
- return this.getSyncSource(this.dependencies, this.id);
655
- }
656
- return this.getSourceForEmptyContext(this.id);
657
- }
658
-
659
- getSource(sourceString) {
660
- if (this.useSourceMap) {
661
- return new OriginalSource(sourceString, this.identifier());
662
- }
663
- return new RawSource(sourceString);
664
- }
665
-
666
- source(dependencyTemplates, runtimeTemplate) {
667
- return this.getSource(
668
- this.getSourceString(this.options.mode, runtimeTemplate)
669
- );
670
- }
671
-
672
- size() {
673
- // base penalty
674
- const initialSize = 160;
675
-
676
- // if we dont have dependencies we stop here.
677
- return this.dependencies.reduce((size, dependency) => {
678
- const element = /** @type {ContextElementDependency} */ (dependency);
679
- return size + 5 + element.userRequest.length;
680
- }, initialSize);
681
- }
682
- }
683
-
684
- // TODO remove in webpack 5
685
- Object.defineProperty(ContextModule.prototype, "recursive", {
686
- configurable: false,
687
- get: util.deprecate(function() {
688
- return this.options.recursive;
689
- }, "ContextModule.recursive has been moved to ContextModule.options.recursive"),
690
- set: util.deprecate(function(value) {
691
- this.options.recursive = value;
692
- }, "ContextModule.recursive has been moved to ContextModule.options.recursive")
693
- });
694
-
695
- // TODO remove in webpack 5
696
- Object.defineProperty(ContextModule.prototype, "regExp", {
697
- configurable: false,
698
- get: util.deprecate(function() {
699
- return this.options.regExp;
700
- }, "ContextModule.regExp has been moved to ContextModule.options.regExp"),
701
- set: util.deprecate(function(value) {
702
- this.options.regExp = value;
703
- }, "ContextModule.regExp has been moved to ContextModule.options.regExp")
704
- });
705
-
706
- // TODO remove in webpack 5
707
- Object.defineProperty(ContextModule.prototype, "addon", {
708
- configurable: false,
709
- get: util.deprecate(function() {
710
- return this.options.addon;
711
- }, "ContextModule.addon has been moved to ContextModule.options.addon"),
712
- set: util.deprecate(function(value) {
713
- this.options.addon = value;
714
- }, "ContextModule.addon has been moved to ContextModule.options.addon")
715
- });
716
-
717
- // TODO remove in webpack 5
718
- Object.defineProperty(ContextModule.prototype, "async", {
719
- configurable: false,
720
- get: util.deprecate(function() {
721
- return this.options.mode;
722
- }, "ContextModule.async has been moved to ContextModule.options.mode"),
723
- set: util.deprecate(function(value) {
724
- this.options.mode = value;
725
- }, "ContextModule.async has been moved to ContextModule.options.mode")
726
- });
727
-
728
- // TODO remove in webpack 5
729
- Object.defineProperty(ContextModule.prototype, "chunkName", {
730
- configurable: false,
731
- get: util.deprecate(function() {
732
- return this.options.chunkName;
733
- }, "ContextModule.chunkName has been moved to ContextModule.options.chunkName"),
734
- set: util.deprecate(function(value) {
735
- this.options.chunkName = value;
736
- }, "ContextModule.chunkName has been moved to ContextModule.options.chunkName")
737
- });
738
-
739
- module.exports = ContextModule;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const util = require("util");
7
+ const { OriginalSource, RawSource } = require("webpack-sources");
8
+ const Module = require("./Module");
9
+ const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
10
+ const Template = require("./Template");
11
+ const contextify = require("./util/identifier").contextify;
12
+
13
+ /** @typedef {"sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"} ContextMode Context mode */
14
+ /** @typedef {import("./dependencies/ContextElementDependency")} ContextElementDependency */
15
+
16
+ /**
17
+ * @callback ResolveDependenciesCallback
18
+ * @param {Error=} err
19
+ * @param {ContextElementDependency[]} dependencies
20
+ */
21
+
22
+ /**
23
+ * @callback ResolveDependencies
24
+ * @param {TODO} fs
25
+ * @param {TODO} options
26
+ * @param {ResolveDependenciesCallback} callback
27
+ */
28
+
29
+ class ContextModule extends Module {
30
+ // type ContextMode = "sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"
31
+ // type ContextOptions = { resource: string, recursive: boolean, regExp: RegExp, addon?: string, mode?: ContextMode, chunkName?: string, include?: RegExp, exclude?: RegExp, groupOptions?: Object }
32
+ // resolveDependencies: (fs: FS, options: ContextOptions, (err: Error?, dependencies: Dependency[]) => void) => void
33
+ // options: ContextOptions
34
+ /**
35
+ * @param {ResolveDependencies} resolveDependencies function to get dependencies in this context
36
+ * @param {TODO} options options object
37
+ */
38
+ constructor(resolveDependencies, options) {
39
+ let resource;
40
+ let resourceQuery;
41
+ const queryIdx = options.resource.indexOf("?");
42
+ if (queryIdx >= 0) {
43
+ resource = options.resource.substr(0, queryIdx);
44
+ resourceQuery = options.resource.substr(queryIdx);
45
+ } else {
46
+ resource = options.resource;
47
+ resourceQuery = "";
48
+ }
49
+
50
+ super("javascript/dynamic", resource);
51
+
52
+ // Info from Factory
53
+ this.resolveDependencies = resolveDependencies;
54
+ this.options = Object.assign({}, options, {
55
+ resource: resource,
56
+ resourceQuery: resourceQuery
57
+ });
58
+ if (options.resolveOptions !== undefined) {
59
+ this.resolveOptions = options.resolveOptions;
60
+ }
61
+
62
+ // Info from Build
63
+ this._contextDependencies = new Set([this.context]);
64
+
65
+ if (typeof options.mode !== "string") {
66
+ throw new Error("options.mode is a required option");
67
+ }
68
+
69
+ this._identifier = this._createIdentifier();
70
+ }
71
+
72
+ updateCacheModule(module) {
73
+ this.resolveDependencies = module.resolveDependencies;
74
+ this.options = module.options;
75
+ this.resolveOptions = module.resolveOptions;
76
+ }
77
+
78
+ prettyRegExp(regexString) {
79
+ // remove the "/" at the front and the beginning
80
+ // "/foo/" -> "foo"
81
+ return regexString.substring(1, regexString.length - 1);
82
+ }
83
+
84
+ _createIdentifier() {
85
+ let identifier = this.context;
86
+ if (this.options.resourceQuery) {
87
+ identifier += ` ${this.options.resourceQuery}`;
88
+ }
89
+ if (this.options.mode) {
90
+ identifier += ` ${this.options.mode}`;
91
+ }
92
+ if (!this.options.recursive) {
93
+ identifier += " nonrecursive";
94
+ }
95
+ if (this.options.addon) {
96
+ identifier += ` ${this.options.addon}`;
97
+ }
98
+ if (this.options.regExp) {
99
+ identifier += ` ${this.options.regExp}`;
100
+ }
101
+ if (this.options.include) {
102
+ identifier += ` include: ${this.options.include}`;
103
+ }
104
+ if (this.options.exclude) {
105
+ identifier += ` exclude: ${this.options.exclude}`;
106
+ }
107
+ if (this.options.groupOptions) {
108
+ identifier += ` groupOptions: ${JSON.stringify(
109
+ this.options.groupOptions
110
+ )}`;
111
+ }
112
+ if (this.options.namespaceObject === "strict") {
113
+ identifier += " strict namespace object";
114
+ } else if (this.options.namespaceObject) {
115
+ identifier += " namespace object";
116
+ }
117
+
118
+ return identifier;
119
+ }
120
+
121
+ identifier() {
122
+ return this._identifier;
123
+ }
124
+
125
+ readableIdentifier(requestShortener) {
126
+ let identifier = requestShortener.shorten(this.context);
127
+ if (this.options.resourceQuery) {
128
+ identifier += ` ${this.options.resourceQuery}`;
129
+ }
130
+ if (this.options.mode) {
131
+ identifier += ` ${this.options.mode}`;
132
+ }
133
+ if (!this.options.recursive) {
134
+ identifier += " nonrecursive";
135
+ }
136
+ if (this.options.addon) {
137
+ identifier += ` ${requestShortener.shorten(this.options.addon)}`;
138
+ }
139
+ if (this.options.regExp) {
140
+ identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
141
+ }
142
+ if (this.options.include) {
143
+ identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
144
+ }
145
+ if (this.options.exclude) {
146
+ identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
147
+ }
148
+ if (this.options.groupOptions) {
149
+ const groupOptions = this.options.groupOptions;
150
+ for (const key of Object.keys(groupOptions)) {
151
+ identifier += ` ${key}: ${groupOptions[key]}`;
152
+ }
153
+ }
154
+ if (this.options.namespaceObject === "strict") {
155
+ identifier += " strict namespace object";
156
+ } else if (this.options.namespaceObject) {
157
+ identifier += " namespace object";
158
+ }
159
+
160
+ return identifier;
161
+ }
162
+
163
+ libIdent(options) {
164
+ let identifier = contextify(options.context, this.context);
165
+ if (this.options.mode) {
166
+ identifier += ` ${this.options.mode}`;
167
+ }
168
+ if (this.options.recursive) {
169
+ identifier += " recursive";
170
+ }
171
+ if (this.options.addon) {
172
+ identifier += ` ${contextify(options.context, this.options.addon)}`;
173
+ }
174
+ if (this.options.regExp) {
175
+ identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
176
+ }
177
+ if (this.options.include) {
178
+ identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
179
+ }
180
+ if (this.options.exclude) {
181
+ identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
182
+ }
183
+
184
+ return identifier;
185
+ }
186
+
187
+ needRebuild(fileTimestamps, contextTimestamps) {
188
+ const ts = contextTimestamps.get(this.context);
189
+ if (!ts) {
190
+ return true;
191
+ }
192
+
193
+ return ts >= this.buildInfo.builtTime;
194
+ }
195
+
196
+ build(options, compilation, resolver, fs, callback) {
197
+ this.built = true;
198
+ this.buildMeta = {};
199
+ this.buildInfo = {
200
+ builtTime: Date.now(),
201
+ contextDependencies: this._contextDependencies
202
+ };
203
+ this.resolveDependencies(fs, this.options, (err, dependencies) => {
204
+ if (err) return callback(err);
205
+
206
+ // abort if something failed
207
+ // this will create an empty context
208
+ if (!dependencies) {
209
+ callback();
210
+ return;
211
+ }
212
+
213
+ // enhance dependencies with meta info
214
+ for (const dep of dependencies) {
215
+ dep.loc = {
216
+ name: dep.userRequest
217
+ };
218
+ dep.request = this.options.addon + dep.request;
219
+ }
220
+
221
+ if (this.options.mode === "sync" || this.options.mode === "eager") {
222
+ // if we have an sync or eager context
223
+ // just add all dependencies and continue
224
+ this.dependencies = dependencies;
225
+ } else if (this.options.mode === "lazy-once") {
226
+ // for the lazy-once mode create a new async dependency block
227
+ // and add that block to this context
228
+ if (dependencies.length > 0) {
229
+ const block = new AsyncDependenciesBlock(
230
+ Object.assign({}, this.options.groupOptions, {
231
+ name: this.options.chunkName
232
+ }),
233
+ this
234
+ );
235
+ for (const dep of dependencies) {
236
+ block.addDependency(dep);
237
+ }
238
+ this.addBlock(block);
239
+ }
240
+ } else if (
241
+ this.options.mode === "weak" ||
242
+ this.options.mode === "async-weak"
243
+ ) {
244
+ // we mark all dependencies as weak
245
+ for (const dep of dependencies) {
246
+ dep.weak = true;
247
+ }
248
+ this.dependencies = dependencies;
249
+ } else if (this.options.mode === "lazy") {
250
+ // if we are lazy create a new async dependency block per dependency
251
+ // and add all blocks to this context
252
+ let index = 0;
253
+ for (const dep of dependencies) {
254
+ let chunkName = this.options.chunkName;
255
+ if (chunkName) {
256
+ if (!/\[(index|request)\]/.test(chunkName)) {
257
+ chunkName += "[index]";
258
+ }
259
+ chunkName = chunkName.replace(/\[index\]/g, index++);
260
+ chunkName = chunkName.replace(
261
+ /\[request\]/g,
262
+ Template.toPath(dep.userRequest)
263
+ );
264
+ }
265
+ const block = new AsyncDependenciesBlock(
266
+ Object.assign({}, this.options.groupOptions, {
267
+ name: chunkName
268
+ }),
269
+ dep.module,
270
+ dep.loc,
271
+ dep.userRequest
272
+ );
273
+ block.addDependency(dep);
274
+ this.addBlock(block);
275
+ }
276
+ } else {
277
+ callback(
278
+ new Error(`Unsupported mode "${this.options.mode}" in context`)
279
+ );
280
+ return;
281
+ }
282
+ callback();
283
+ });
284
+ }
285
+
286
+ getUserRequestMap(dependencies) {
287
+ // if we filter first we get a new array
288
+ // therefor we dont need to create a clone of dependencies explicitly
289
+ // therefore the order of this is !important!
290
+ return dependencies
291
+ .filter(dependency => dependency.module)
292
+ .sort((a, b) => {
293
+ if (a.userRequest === b.userRequest) {
294
+ return 0;
295
+ }
296
+ return a.userRequest < b.userRequest ? -1 : 1;
297
+ })
298
+ .reduce((map, dep) => {
299
+ map[dep.userRequest] = dep.module.id;
300
+ return map;
301
+ }, Object.create(null));
302
+ }
303
+
304
+ getFakeMap(dependencies) {
305
+ if (!this.options.namespaceObject) {
306
+ return 9;
307
+ }
308
+ // if we filter first we get a new array
309
+ // therefor we dont need to create a clone of dependencies explicitly
310
+ // therefore the order of this is !important!
311
+ let hasNonHarmony = false;
312
+ let hasNamespace = false;
313
+ let hasNamed = false;
314
+ const fakeMap = dependencies
315
+ .filter(dependency => dependency.module)
316
+ .sort((a, b) => {
317
+ return b.module.id - a.module.id;
318
+ })
319
+ .reduce((map, dep) => {
320
+ const exportsType =
321
+ dep.module.buildMeta && dep.module.buildMeta.exportsType;
322
+ const id = dep.module.id;
323
+ if (!exportsType) {
324
+ map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
325
+ hasNonHarmony = true;
326
+ } else if (exportsType === "namespace") {
327
+ map[id] = 9;
328
+ hasNamespace = true;
329
+ } else if (exportsType === "named") {
330
+ map[id] = 3;
331
+ hasNamed = true;
332
+ }
333
+ return map;
334
+ }, Object.create(null));
335
+ if (!hasNamespace && hasNonHarmony && !hasNamed) {
336
+ return this.options.namespaceObject === "strict" ? 1 : 7;
337
+ }
338
+ if (hasNamespace && !hasNonHarmony && !hasNamed) {
339
+ return 9;
340
+ }
341
+ if (!hasNamespace && !hasNonHarmony && hasNamed) {
342
+ return 3;
343
+ }
344
+ if (!hasNamespace && !hasNonHarmony && !hasNamed) {
345
+ return 9;
346
+ }
347
+ return fakeMap;
348
+ }
349
+
350
+ getFakeMapInitStatement(fakeMap) {
351
+ return typeof fakeMap === "object"
352
+ ? `var fakeMap = ${JSON.stringify(fakeMap, null, "\t")};`
353
+ : "";
354
+ }
355
+
356
+ getReturn(type) {
357
+ if (type === 9) {
358
+ return "__webpack_require__(id)";
359
+ }
360
+ return `__webpack_require__.t(id, ${type})`;
361
+ }
362
+
363
+ getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
364
+ if (typeof fakeMap === "number") {
365
+ return `return ${this.getReturn(fakeMap)};`;
366
+ }
367
+ return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
368
+ }
369
+
370
+ getSyncSource(dependencies, id) {
371
+ const map = this.getUserRequestMap(dependencies);
372
+ const fakeMap = this.getFakeMap(dependencies);
373
+ const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
374
+
375
+ return `var map = ${JSON.stringify(map, null, "\t")};
376
+ ${this.getFakeMapInitStatement(fakeMap)}
377
+
378
+ function webpackContext(req) {
379
+ var id = webpackContextResolve(req);
380
+ ${returnModuleObject}
381
+ }
382
+ function webpackContextResolve(req) {
383
+ var id = map[req];
384
+ if(!(id + 1)) { // check for number or string
385
+ var e = new Error("Cannot find module '" + req + "'");
386
+ e.code = 'MODULE_NOT_FOUND';
387
+ throw e;
388
+ }
389
+ return id;
390
+ }
391
+ webpackContext.keys = function webpackContextKeys() {
392
+ return Object.keys(map);
393
+ };
394
+ webpackContext.resolve = webpackContextResolve;
395
+ module.exports = webpackContext;
396
+ webpackContext.id = ${JSON.stringify(id)};`;
397
+ }
398
+
399
+ getWeakSyncSource(dependencies, id) {
400
+ const map = this.getUserRequestMap(dependencies);
401
+ const fakeMap = this.getFakeMap(dependencies);
402
+ const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
403
+
404
+ return `var map = ${JSON.stringify(map, null, "\t")};
405
+ ${this.getFakeMapInitStatement(fakeMap)}
406
+
407
+ function webpackContext(req) {
408
+ var id = webpackContextResolve(req);
409
+ if(!__webpack_require__.m[id]) {
410
+ var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
411
+ e.code = 'MODULE_NOT_FOUND';
412
+ throw e;
413
+ }
414
+ ${returnModuleObject}
415
+ }
416
+ function webpackContextResolve(req) {
417
+ var id = map[req];
418
+ if(!(id + 1)) { // check for number or string
419
+ var e = new Error("Cannot find module '" + req + "'");
420
+ e.code = 'MODULE_NOT_FOUND';
421
+ throw e;
422
+ }
423
+ return id;
424
+ }
425
+ webpackContext.keys = function webpackContextKeys() {
426
+ return Object.keys(map);
427
+ };
428
+ webpackContext.resolve = webpackContextResolve;
429
+ webpackContext.id = ${JSON.stringify(id)};
430
+ module.exports = webpackContext;`;
431
+ }
432
+
433
+ getAsyncWeakSource(dependencies, id) {
434
+ const map = this.getUserRequestMap(dependencies);
435
+ const fakeMap = this.getFakeMap(dependencies);
436
+ const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
437
+
438
+ return `var map = ${JSON.stringify(map, null, "\t")};
439
+ ${this.getFakeMapInitStatement(fakeMap)}
440
+
441
+ function webpackAsyncContext(req) {
442
+ return webpackAsyncContextResolve(req).then(function(id) {
443
+ if(!__webpack_require__.m[id]) {
444
+ var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
445
+ e.code = 'MODULE_NOT_FOUND';
446
+ throw e;
447
+ }
448
+ ${returnModuleObject}
449
+ });
450
+ }
451
+ function webpackAsyncContextResolve(req) {
452
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
453
+ // uncaught exception popping up in devtools
454
+ return Promise.resolve().then(function() {
455
+ var id = map[req];
456
+ if(!(id + 1)) { // check for number or string
457
+ var e = new Error("Cannot find module '" + req + "'");
458
+ e.code = 'MODULE_NOT_FOUND';
459
+ throw e;
460
+ }
461
+ return id;
462
+ });
463
+ }
464
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
465
+ return Object.keys(map);
466
+ };
467
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
468
+ webpackAsyncContext.id = ${JSON.stringify(id)};
469
+ module.exports = webpackAsyncContext;`;
470
+ }
471
+
472
+ getEagerSource(dependencies, id) {
473
+ const map = this.getUserRequestMap(dependencies);
474
+ const fakeMap = this.getFakeMap(dependencies);
475
+ const thenFunction =
476
+ fakeMap !== 9
477
+ ? `function(id) {
478
+ ${this.getReturnModuleObjectSource(fakeMap)}
479
+ }`
480
+ : "__webpack_require__";
481
+ return `var map = ${JSON.stringify(map, null, "\t")};
482
+ ${this.getFakeMapInitStatement(fakeMap)}
483
+
484
+ function webpackAsyncContext(req) {
485
+ return webpackAsyncContextResolve(req).then(${thenFunction});
486
+ }
487
+ function webpackAsyncContextResolve(req) {
488
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
489
+ // uncaught exception popping up in devtools
490
+ return Promise.resolve().then(function() {
491
+ var id = map[req];
492
+ if(!(id + 1)) { // check for number or string
493
+ var e = new Error("Cannot find module '" + req + "'");
494
+ e.code = 'MODULE_NOT_FOUND';
495
+ throw e;
496
+ }
497
+ return id;
498
+ });
499
+ }
500
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
501
+ return Object.keys(map);
502
+ };
503
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
504
+ webpackAsyncContext.id = ${JSON.stringify(id)};
505
+ module.exports = webpackAsyncContext;`;
506
+ }
507
+
508
+ getLazyOnceSource(block, dependencies, id, runtimeTemplate) {
509
+ const promise = runtimeTemplate.blockPromise({
510
+ block,
511
+ message: "lazy-once context"
512
+ });
513
+ const map = this.getUserRequestMap(dependencies);
514
+ const fakeMap = this.getFakeMap(dependencies);
515
+ const thenFunction =
516
+ fakeMap !== 9
517
+ ? `function(id) {
518
+ ${this.getReturnModuleObjectSource(fakeMap)};
519
+ }`
520
+ : "__webpack_require__";
521
+
522
+ return `var map = ${JSON.stringify(map, null, "\t")};
523
+ ${this.getFakeMapInitStatement(fakeMap)}
524
+
525
+ function webpackAsyncContext(req) {
526
+ return webpackAsyncContextResolve(req).then(${thenFunction});
527
+ }
528
+ function webpackAsyncContextResolve(req) {
529
+ return ${promise}.then(function() {
530
+ var id = map[req];
531
+ if(!(id + 1)) { // check for number or string
532
+ var e = new Error("Cannot find module '" + req + "'");
533
+ e.code = 'MODULE_NOT_FOUND';
534
+ throw e;
535
+ }
536
+ return id;
537
+ });
538
+ }
539
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
540
+ return Object.keys(map);
541
+ };
542
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
543
+ webpackAsyncContext.id = ${JSON.stringify(id)};
544
+ module.exports = webpackAsyncContext;`;
545
+ }
546
+
547
+ getLazySource(blocks, id) {
548
+ let hasMultipleOrNoChunks = false;
549
+ const fakeMap = this.getFakeMap(blocks.map(b => b.dependencies[0]));
550
+ const map = blocks
551
+ .filter(block => block.dependencies[0].module)
552
+ .map(block => ({
553
+ dependency: block.dependencies[0],
554
+ block: block,
555
+ userRequest: block.dependencies[0].userRequest
556
+ }))
557
+ .sort((a, b) => {
558
+ if (a.userRequest === b.userRequest) return 0;
559
+ return a.userRequest < b.userRequest ? -1 : 1;
560
+ })
561
+ .reduce((map, item) => {
562
+ const chunks =
563
+ (item.block.chunkGroup && item.block.chunkGroup.chunks) || [];
564
+ if (chunks.length !== 1) {
565
+ hasMultipleOrNoChunks = true;
566
+ }
567
+ const arrayStart = [item.dependency.module.id];
568
+ if (typeof fakeMap === "object") {
569
+ arrayStart.push(fakeMap[item.dependency.module.id]);
570
+ }
571
+ map[item.userRequest] = arrayStart.concat(
572
+ chunks.map(chunk => chunk.id)
573
+ );
574
+
575
+ return map;
576
+ }, Object.create(null));
577
+
578
+ const chunksStartPosition = typeof fakeMap === "object" ? 2 : 1;
579
+ const requestPrefix = hasMultipleOrNoChunks
580
+ ? `Promise.all(ids.slice(${chunksStartPosition}).map(__webpack_require__.e))`
581
+ : `__webpack_require__.e(ids[${chunksStartPosition}])`;
582
+ const returnModuleObject = this.getReturnModuleObjectSource(
583
+ fakeMap,
584
+ "ids[1]"
585
+ );
586
+
587
+ return `var map = ${JSON.stringify(map, null, "\t")};
588
+ function webpackAsyncContext(req) {
589
+ var ids = map[req];
590
+ if(!ids) {
591
+ return Promise.resolve().then(function() {
592
+ var e = new Error("Cannot find module '" + req + "'");
593
+ e.code = 'MODULE_NOT_FOUND';
594
+ throw e;
595
+ });
596
+ }
597
+ return ${requestPrefix}.then(function() {
598
+ var id = ids[0];
599
+ ${returnModuleObject}
600
+ });
601
+ }
602
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
603
+ return Object.keys(map);
604
+ };
605
+ webpackAsyncContext.id = ${JSON.stringify(id)};
606
+ module.exports = webpackAsyncContext;`;
607
+ }
608
+
609
+ getSourceForEmptyContext(id) {
610
+ return `function webpackEmptyContext(req) {
611
+ var e = new Error("Cannot find module '" + req + "'");
612
+ e.code = 'MODULE_NOT_FOUND';
613
+ throw e;
614
+ }
615
+ webpackEmptyContext.keys = function() { return []; };
616
+ webpackEmptyContext.resolve = webpackEmptyContext;
617
+ module.exports = webpackEmptyContext;
618
+ webpackEmptyContext.id = ${JSON.stringify(id)};`;
619
+ }
620
+
621
+ getSourceForEmptyAsyncContext(id) {
622
+ return `function webpackEmptyAsyncContext(req) {
623
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
624
+ // uncaught exception popping up in devtools
625
+ return Promise.resolve().then(function() {
626
+ var e = new Error("Cannot find module '" + req + "'");
627
+ e.code = 'MODULE_NOT_FOUND';
628
+ throw e;
629
+ });
630
+ }
631
+ webpackEmptyAsyncContext.keys = function() { return []; };
632
+ webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
633
+ module.exports = webpackEmptyAsyncContext;
634
+ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
635
+ }
636
+
637
+ getSourceString(asyncMode, runtimeTemplate) {
638
+ if (asyncMode === "lazy") {
639
+ if (this.blocks && this.blocks.length > 0) {
640
+ return this.getLazySource(this.blocks, this.id);
641
+ }
642
+ return this.getSourceForEmptyAsyncContext(this.id);
643
+ }
644
+ if (asyncMode === "eager") {
645
+ if (this.dependencies && this.dependencies.length > 0) {
646
+ return this.getEagerSource(this.dependencies, this.id);
647
+ }
648
+ return this.getSourceForEmptyAsyncContext(this.id);
649
+ }
650
+ if (asyncMode === "lazy-once") {
651
+ const block = this.blocks[0];
652
+ if (block) {
653
+ return this.getLazyOnceSource(
654
+ block,
655
+ block.dependencies,
656
+ this.id,
657
+ runtimeTemplate
658
+ );
659
+ }
660
+ return this.getSourceForEmptyAsyncContext(this.id);
661
+ }
662
+ if (asyncMode === "async-weak") {
663
+ if (this.dependencies && this.dependencies.length > 0) {
664
+ return this.getAsyncWeakSource(this.dependencies, this.id);
665
+ }
666
+ return this.getSourceForEmptyAsyncContext(this.id);
667
+ }
668
+ if (asyncMode === "weak") {
669
+ if (this.dependencies && this.dependencies.length > 0) {
670
+ return this.getWeakSyncSource(this.dependencies, this.id);
671
+ }
672
+ }
673
+ if (this.dependencies && this.dependencies.length > 0) {
674
+ return this.getSyncSource(this.dependencies, this.id);
675
+ }
676
+ return this.getSourceForEmptyContext(this.id);
677
+ }
678
+
679
+ getSource(sourceString) {
680
+ if (this.useSourceMap) {
681
+ return new OriginalSource(sourceString, this.identifier());
682
+ }
683
+ return new RawSource(sourceString);
684
+ }
685
+
686
+ source(dependencyTemplates, runtimeTemplate) {
687
+ return this.getSource(
688
+ this.getSourceString(this.options.mode, runtimeTemplate)
689
+ );
690
+ }
691
+
692
+ size() {
693
+ // base penalty
694
+ const initialSize = 160;
695
+
696
+ // if we dont have dependencies we stop here.
697
+ return this.dependencies.reduce((size, dependency) => {
698
+ const element = /** @type {ContextElementDependency} */ (dependency);
699
+ return size + 5 + element.userRequest.length;
700
+ }, initialSize);
701
+ }
702
+ }
703
+
704
+ // TODO remove in webpack 5
705
+ Object.defineProperty(ContextModule.prototype, "recursive", {
706
+ configurable: false,
707
+ get: util.deprecate(
708
+ /**
709
+ * @deprecated
710
+ * @this {ContextModule}
711
+ * @returns {boolean} is recursive
712
+ */
713
+ function() {
714
+ return this.options.recursive;
715
+ },
716
+ "ContextModule.recursive has been moved to ContextModule.options.recursive"
717
+ ),
718
+ set: util.deprecate(
719
+ /**
720
+ * @deprecated
721
+ * @this {ContextModule}
722
+ * @param {boolean} value is recursive
723
+ * @returns {void}
724
+ */
725
+ function(value) {
726
+ this.options.recursive = value;
727
+ },
728
+ "ContextModule.recursive has been moved to ContextModule.options.recursive"
729
+ )
730
+ });
731
+
732
+ // TODO remove in webpack 5
733
+ Object.defineProperty(ContextModule.prototype, "regExp", {
734
+ configurable: false,
735
+ get: util.deprecate(
736
+ /**
737
+ * @deprecated
738
+ * @this {ContextModule}
739
+ * @returns {RegExp} regular expression
740
+ */
741
+ function() {
742
+ return this.options.regExp;
743
+ },
744
+ "ContextModule.regExp has been moved to ContextModule.options.regExp"
745
+ ),
746
+ set: util.deprecate(
747
+ /**
748
+ * @deprecated
749
+ * @this {ContextModule}
750
+ * @param {RegExp} value Regular expression
751
+ * @returns {void}
752
+ */
753
+ function(value) {
754
+ this.options.regExp = value;
755
+ },
756
+ "ContextModule.regExp has been moved to ContextModule.options.regExp"
757
+ )
758
+ });
759
+
760
+ // TODO remove in webpack 5
761
+ Object.defineProperty(ContextModule.prototype, "addon", {
762
+ configurable: false,
763
+ get: util.deprecate(
764
+ /**
765
+ * @deprecated
766
+ * @this {ContextModule}
767
+ * @returns {string} addon
768
+ */
769
+ function() {
770
+ return this.options.addon;
771
+ },
772
+ "ContextModule.addon has been moved to ContextModule.options.addon"
773
+ ),
774
+ set: util.deprecate(
775
+ /**
776
+ * @deprecated
777
+ * @this {ContextModule}
778
+ * @param {string} value addon
779
+ * @returns {void}
780
+ */
781
+ function(value) {
782
+ this.options.addon = value;
783
+ },
784
+ "ContextModule.addon has been moved to ContextModule.options.addon"
785
+ )
786
+ });
787
+
788
+ // TODO remove in webpack 5
789
+ Object.defineProperty(ContextModule.prototype, "async", {
790
+ configurable: false,
791
+ get: util.deprecate(
792
+ /**
793
+ * @deprecated
794
+ * @this {ContextModule}
795
+ * @returns {boolean} is async
796
+ */
797
+ function() {
798
+ return this.options.mode;
799
+ },
800
+ "ContextModule.async has been moved to ContextModule.options.mode"
801
+ ),
802
+ set: util.deprecate(
803
+ /**
804
+ * @deprecated
805
+ * @this {ContextModule}
806
+ * @param {ContextMode} value Context mode
807
+ * @returns {void}
808
+ */
809
+ function(value) {
810
+ this.options.mode = value;
811
+ },
812
+ "ContextModule.async has been moved to ContextModule.options.mode"
813
+ )
814
+ });
815
+
816
+ // TODO remove in webpack 5
817
+ Object.defineProperty(ContextModule.prototype, "chunkName", {
818
+ configurable: false,
819
+ get: util.deprecate(
820
+ /**
821
+ * @deprecated
822
+ * @this {ContextModule}
823
+ * @returns {string} chunk name
824
+ */
825
+ function() {
826
+ return this.options.chunkName;
827
+ },
828
+ "ContextModule.chunkName has been moved to ContextModule.options.chunkName"
829
+ ),
830
+ set: util.deprecate(
831
+ /**
832
+ * @deprecated
833
+ * @this {ContextModule}
834
+ * @param {string} value chunk name
835
+ * @returns {void}
836
+ */
837
+ function(value) {
838
+ this.options.chunkName = value;
839
+ },
840
+ "ContextModule.chunkName has been moved to ContextModule.options.chunkName"
841
+ )
842
+ });
843
+
844
+ module.exports = ContextModule;