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,173 +1,173 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Jason Anderson @diurnalist
4
- */
5
- "use strict";
6
-
7
- const REGEXP_HASH = /\[hash(?::(\d+))?\]/gi,
8
- REGEXP_CHUNKHASH = /\[chunkhash(?::(\d+))?\]/gi,
9
- REGEXP_MODULEHASH = /\[modulehash(?::(\d+))?\]/gi,
10
- REGEXP_CONTENTHASH = /\[contenthash(?::(\d+))?\]/gi,
11
- REGEXP_NAME = /\[name\]/gi,
12
- REGEXP_ID = /\[id\]/gi,
13
- REGEXP_MODULEID = /\[moduleid\]/gi,
14
- REGEXP_FILE = /\[file\]/gi,
15
- REGEXP_QUERY = /\[query\]/gi,
16
- REGEXP_FILEBASE = /\[filebase\]/gi;
17
-
18
- // Using global RegExp for .test is dangerous
19
- // We use a normal RegExp instead of .test
20
- const REGEXP_HASH_FOR_TEST = new RegExp(REGEXP_HASH.source, "i"),
21
- REGEXP_CHUNKHASH_FOR_TEST = new RegExp(REGEXP_CHUNKHASH.source, "i"),
22
- REGEXP_CONTENTHASH_FOR_TEST = new RegExp(REGEXP_CONTENTHASH.source, "i"),
23
- REGEXP_NAME_FOR_TEST = new RegExp(REGEXP_NAME.source, "i");
24
-
25
- const withHashLength = (replacer, handlerFn) => {
26
- const fn = (match, hashLength, ...args) => {
27
- const length = hashLength && parseInt(hashLength, 10);
28
- if (length && handlerFn) {
29
- return handlerFn(length);
30
- }
31
- const hash = replacer(match, hashLength, ...args);
32
- return length ? hash.slice(0, length) : hash;
33
- };
34
- return fn;
35
- };
36
-
37
- const getReplacer = (value, allowEmpty) => {
38
- const fn = (match, ...args) => {
39
- // last argument in replacer is the entire input string
40
- const input = args[args.length - 1];
41
- if (value === null || value === undefined) {
42
- if (!allowEmpty) {
43
- throw new Error(
44
- `Path variable ${match} not implemented in this context: ${input}`
45
- );
46
- }
47
- return "";
48
- } else {
49
- return `${value}`;
50
- }
51
- };
52
- return fn;
53
- };
54
-
55
- const replacePathVariables = (path, data) => {
56
- const chunk = data.chunk;
57
- const chunkId = chunk && chunk.id;
58
- const chunkName = chunk && (chunk.name || chunk.id);
59
- const chunkHash = chunk && (chunk.renderedHash || chunk.hash);
60
- const chunkHashWithLength = chunk && chunk.hashWithLength;
61
- const contentHashType = data.contentHashType;
62
- const contentHash =
63
- (chunk && chunk.contentHash && chunk.contentHash[contentHashType]) ||
64
- data.contentHash;
65
- const contentHashWithLength =
66
- (chunk &&
67
- chunk.contentHashWithLength &&
68
- chunk.contentHashWithLength[contentHashType]) ||
69
- data.contentHashWithLength;
70
- const module = data.module;
71
- const moduleId = module && module.id;
72
- const moduleHash = module && (module.renderedHash || module.hash);
73
- const moduleHashWithLength = module && module.hashWithLength;
74
-
75
- if (typeof path === "function") {
76
- path = path(data);
77
- }
78
-
79
- if (
80
- data.noChunkHash &&
81
- (REGEXP_CHUNKHASH_FOR_TEST.test(path) ||
82
- REGEXP_CONTENTHASH_FOR_TEST.test(path))
83
- ) {
84
- throw new Error(
85
- `Cannot use [chunkhash] or [contenthash] for chunk in '${path}' (use [hash] instead)`
86
- );
87
- }
88
-
89
- return (
90
- path
91
- .replace(
92
- REGEXP_HASH,
93
- withHashLength(getReplacer(data.hash), data.hashWithLength)
94
- )
95
- .replace(
96
- REGEXP_CHUNKHASH,
97
- withHashLength(getReplacer(chunkHash), chunkHashWithLength)
98
- )
99
- .replace(
100
- REGEXP_CONTENTHASH,
101
- withHashLength(getReplacer(contentHash), contentHashWithLength)
102
- )
103
- .replace(
104
- REGEXP_MODULEHASH,
105
- withHashLength(getReplacer(moduleHash), moduleHashWithLength)
106
- )
107
- .replace(REGEXP_ID, getReplacer(chunkId))
108
- .replace(REGEXP_MODULEID, getReplacer(moduleId))
109
- .replace(REGEXP_NAME, getReplacer(chunkName))
110
- .replace(REGEXP_FILE, getReplacer(data.filename))
111
- .replace(REGEXP_FILEBASE, getReplacer(data.basename))
112
- // query is optional, it's OK if it's in a path but there's nothing to replace it with
113
- .replace(REGEXP_QUERY, getReplacer(data.query, true))
114
- );
115
- };
116
-
117
- class TemplatedPathPlugin {
118
- apply(compiler) {
119
- compiler.hooks.compilation.tap("TemplatedPathPlugin", compilation => {
120
- const mainTemplate = compilation.mainTemplate;
121
-
122
- mainTemplate.hooks.assetPath.tap(
123
- "TemplatedPathPlugin",
124
- replacePathVariables
125
- );
126
-
127
- mainTemplate.hooks.globalHash.tap(
128
- "TemplatedPathPlugin",
129
- (chunk, paths) => {
130
- const outputOptions = mainTemplate.outputOptions;
131
- const publicPath = outputOptions.publicPath || "";
132
- const filename = outputOptions.filename || "";
133
- const chunkFilename =
134
- outputOptions.chunkFilename || outputOptions.filename;
135
- if (
136
- REGEXP_HASH_FOR_TEST.test(publicPath) ||
137
- REGEXP_CHUNKHASH_FOR_TEST.test(publicPath) ||
138
- REGEXP_CONTENTHASH_FOR_TEST.test(publicPath) ||
139
- REGEXP_NAME_FOR_TEST.test(publicPath)
140
- )
141
- return true;
142
- if (REGEXP_HASH_FOR_TEST.test(filename)) return true;
143
- if (REGEXP_HASH_FOR_TEST.test(chunkFilename)) return true;
144
- if (REGEXP_HASH_FOR_TEST.test(paths.join("|"))) return true;
145
- }
146
- );
147
-
148
- mainTemplate.hooks.hashForChunk.tap(
149
- "TemplatedPathPlugin",
150
- (hash, chunk) => {
151
- const outputOptions = mainTemplate.outputOptions;
152
- const chunkFilename =
153
- outputOptions.chunkFilename || outputOptions.filename;
154
- if (REGEXP_CHUNKHASH_FOR_TEST.test(chunkFilename)) {
155
- hash.update(JSON.stringify(chunk.getChunkMaps(true).hash));
156
- }
157
- if (REGEXP_CONTENTHASH_FOR_TEST.test(chunkFilename)) {
158
- hash.update(
159
- JSON.stringify(
160
- chunk.getChunkMaps(true).contentHash.javascript || {}
161
- )
162
- );
163
- }
164
- if (REGEXP_NAME_FOR_TEST.test(chunkFilename)) {
165
- hash.update(JSON.stringify(chunk.getChunkMaps(true).name));
166
- }
167
- }
168
- );
169
- });
170
- }
171
- }
172
-
173
- module.exports = TemplatedPathPlugin;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Jason Anderson @diurnalist
4
+ */
5
+ "use strict";
6
+
7
+ const REGEXP_HASH = /\[hash(?::(\d+))?\]/gi,
8
+ REGEXP_CHUNKHASH = /\[chunkhash(?::(\d+))?\]/gi,
9
+ REGEXP_MODULEHASH = /\[modulehash(?::(\d+))?\]/gi,
10
+ REGEXP_CONTENTHASH = /\[contenthash(?::(\d+))?\]/gi,
11
+ REGEXP_NAME = /\[name\]/gi,
12
+ REGEXP_ID = /\[id\]/gi,
13
+ REGEXP_MODULEID = /\[moduleid\]/gi,
14
+ REGEXP_FILE = /\[file\]/gi,
15
+ REGEXP_QUERY = /\[query\]/gi,
16
+ REGEXP_FILEBASE = /\[filebase\]/gi;
17
+
18
+ // Using global RegExp for .test is dangerous
19
+ // We use a normal RegExp instead of .test
20
+ const REGEXP_HASH_FOR_TEST = new RegExp(REGEXP_HASH.source, "i"),
21
+ REGEXP_CHUNKHASH_FOR_TEST = new RegExp(REGEXP_CHUNKHASH.source, "i"),
22
+ REGEXP_CONTENTHASH_FOR_TEST = new RegExp(REGEXP_CONTENTHASH.source, "i"),
23
+ REGEXP_NAME_FOR_TEST = new RegExp(REGEXP_NAME.source, "i");
24
+
25
+ const withHashLength = (replacer, handlerFn) => {
26
+ const fn = (match, hashLength, ...args) => {
27
+ const length = hashLength && parseInt(hashLength, 10);
28
+ if (length && handlerFn) {
29
+ return handlerFn(length);
30
+ }
31
+ const hash = replacer(match, hashLength, ...args);
32
+ return length ? hash.slice(0, length) : hash;
33
+ };
34
+ return fn;
35
+ };
36
+
37
+ const getReplacer = (value, allowEmpty) => {
38
+ const fn = (match, ...args) => {
39
+ // last argument in replacer is the entire input string
40
+ const input = args[args.length - 1];
41
+ if (value === null || value === undefined) {
42
+ if (!allowEmpty) {
43
+ throw new Error(
44
+ `Path variable ${match} not implemented in this context: ${input}`
45
+ );
46
+ }
47
+ return "";
48
+ } else {
49
+ return `${value}`;
50
+ }
51
+ };
52
+ return fn;
53
+ };
54
+
55
+ const replacePathVariables = (path, data) => {
56
+ const chunk = data.chunk;
57
+ const chunkId = chunk && chunk.id;
58
+ const chunkName = chunk && (chunk.name || chunk.id);
59
+ const chunkHash = chunk && (chunk.renderedHash || chunk.hash);
60
+ const chunkHashWithLength = chunk && chunk.hashWithLength;
61
+ const contentHashType = data.contentHashType;
62
+ const contentHash =
63
+ (chunk && chunk.contentHash && chunk.contentHash[contentHashType]) ||
64
+ data.contentHash;
65
+ const contentHashWithLength =
66
+ (chunk &&
67
+ chunk.contentHashWithLength &&
68
+ chunk.contentHashWithLength[contentHashType]) ||
69
+ data.contentHashWithLength;
70
+ const module = data.module;
71
+ const moduleId = module && module.id;
72
+ const moduleHash = module && (module.renderedHash || module.hash);
73
+ const moduleHashWithLength = module && module.hashWithLength;
74
+
75
+ if (typeof path === "function") {
76
+ path = path(data);
77
+ }
78
+
79
+ if (
80
+ data.noChunkHash &&
81
+ (REGEXP_CHUNKHASH_FOR_TEST.test(path) ||
82
+ REGEXP_CONTENTHASH_FOR_TEST.test(path))
83
+ ) {
84
+ throw new Error(
85
+ `Cannot use [chunkhash] or [contenthash] for chunk in '${path}' (use [hash] instead)`
86
+ );
87
+ }
88
+
89
+ return (
90
+ path
91
+ .replace(
92
+ REGEXP_HASH,
93
+ withHashLength(getReplacer(data.hash), data.hashWithLength)
94
+ )
95
+ .replace(
96
+ REGEXP_CHUNKHASH,
97
+ withHashLength(getReplacer(chunkHash), chunkHashWithLength)
98
+ )
99
+ .replace(
100
+ REGEXP_CONTENTHASH,
101
+ withHashLength(getReplacer(contentHash), contentHashWithLength)
102
+ )
103
+ .replace(
104
+ REGEXP_MODULEHASH,
105
+ withHashLength(getReplacer(moduleHash), moduleHashWithLength)
106
+ )
107
+ .replace(REGEXP_ID, getReplacer(chunkId))
108
+ .replace(REGEXP_MODULEID, getReplacer(moduleId))
109
+ .replace(REGEXP_NAME, getReplacer(chunkName))
110
+ .replace(REGEXP_FILE, getReplacer(data.filename))
111
+ .replace(REGEXP_FILEBASE, getReplacer(data.basename))
112
+ // query is optional, it's OK if it's in a path but there's nothing to replace it with
113
+ .replace(REGEXP_QUERY, getReplacer(data.query, true))
114
+ );
115
+ };
116
+
117
+ class TemplatedPathPlugin {
118
+ apply(compiler) {
119
+ compiler.hooks.compilation.tap("TemplatedPathPlugin", compilation => {
120
+ const mainTemplate = compilation.mainTemplate;
121
+
122
+ mainTemplate.hooks.assetPath.tap(
123
+ "TemplatedPathPlugin",
124
+ replacePathVariables
125
+ );
126
+
127
+ mainTemplate.hooks.globalHash.tap(
128
+ "TemplatedPathPlugin",
129
+ (chunk, paths) => {
130
+ const outputOptions = mainTemplate.outputOptions;
131
+ const publicPath = outputOptions.publicPath || "";
132
+ const filename = outputOptions.filename || "";
133
+ const chunkFilename =
134
+ outputOptions.chunkFilename || outputOptions.filename;
135
+ if (
136
+ REGEXP_HASH_FOR_TEST.test(publicPath) ||
137
+ REGEXP_CHUNKHASH_FOR_TEST.test(publicPath) ||
138
+ REGEXP_CONTENTHASH_FOR_TEST.test(publicPath) ||
139
+ REGEXP_NAME_FOR_TEST.test(publicPath)
140
+ )
141
+ return true;
142
+ if (REGEXP_HASH_FOR_TEST.test(filename)) return true;
143
+ if (REGEXP_HASH_FOR_TEST.test(chunkFilename)) return true;
144
+ if (REGEXP_HASH_FOR_TEST.test(paths.join("|"))) return true;
145
+ }
146
+ );
147
+
148
+ mainTemplate.hooks.hashForChunk.tap(
149
+ "TemplatedPathPlugin",
150
+ (hash, chunk) => {
151
+ const outputOptions = mainTemplate.outputOptions;
152
+ const chunkFilename =
153
+ outputOptions.chunkFilename || outputOptions.filename;
154
+ if (REGEXP_CHUNKHASH_FOR_TEST.test(chunkFilename)) {
155
+ hash.update(JSON.stringify(chunk.getChunkMaps(true).hash));
156
+ }
157
+ if (REGEXP_CONTENTHASH_FOR_TEST.test(chunkFilename)) {
158
+ hash.update(
159
+ JSON.stringify(
160
+ chunk.getChunkMaps(true).contentHash.javascript || {}
161
+ )
162
+ );
163
+ }
164
+ if (REGEXP_NAME_FOR_TEST.test(chunkFilename)) {
165
+ hash.update(JSON.stringify(chunk.getChunkMaps(true).name));
166
+ }
167
+ }
168
+ );
169
+ });
170
+ }
171
+ }
172
+
173
+ module.exports = TemplatedPathPlugin;
@@ -1,22 +1,22 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const WebpackError = require("./WebpackError");
8
-
9
- class UnsupportedFeatureWarning extends WebpackError {
10
- constructor(module, message, loc) {
11
- super(message);
12
-
13
- this.name = "UnsupportedFeatureWarning";
14
- this.module = module;
15
- this.loc = loc;
16
- this.hideStack = true;
17
-
18
- Error.captureStackTrace(this, this.constructor);
19
- }
20
- }
21
-
22
- module.exports = UnsupportedFeatureWarning;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const WebpackError = require("./WebpackError");
8
+
9
+ class UnsupportedFeatureWarning extends WebpackError {
10
+ constructor(module, message, loc) {
11
+ super(message);
12
+
13
+ this.name = "UnsupportedFeatureWarning";
14
+ this.module = module;
15
+ this.loc = loc;
16
+ this.hideStack = true;
17
+
18
+ Error.captureStackTrace(this, this.constructor);
19
+ }
20
+ }
21
+
22
+ module.exports = UnsupportedFeatureWarning;
@@ -1,54 +1,54 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const ConstDependency = require("./dependencies/ConstDependency");
8
-
9
- /** @typedef {import("./Compiler.js")} Compiler */
10
-
11
- class UseStrictPlugin {
12
- /**
13
- * @param {Compiler} compiler Webpack Compiler
14
- * @returns {void}
15
- */
16
- apply(compiler) {
17
- compiler.hooks.compilation.tap(
18
- "UseStrictPlugin",
19
- (compilation, { normalModuleFactory }) => {
20
- const handler = parser => {
21
- parser.hooks.program.tap("UseStrictPlugin", ast => {
22
- const firstNode = ast.body[0];
23
- if (
24
- firstNode &&
25
- firstNode.type === "ExpressionStatement" &&
26
- firstNode.expression.type === "Literal" &&
27
- firstNode.expression.value === "use strict"
28
- ) {
29
- // Remove "use strict" expression. It will be added later by the renderer again.
30
- // This is necessary in order to not break the strict mode when webpack prepends code.
31
- // @see https://github.com/webpack/webpack/issues/1970
32
- const dep = new ConstDependency("", firstNode.range);
33
- dep.loc = firstNode.loc;
34
- parser.state.current.addDependency(dep);
35
- parser.state.module.buildInfo.strict = true;
36
- }
37
- });
38
- };
39
-
40
- normalModuleFactory.hooks.parser
41
- .for("javascript/auto")
42
- .tap("UseStrictPlugin", handler);
43
- normalModuleFactory.hooks.parser
44
- .for("javascript/dynamic")
45
- .tap("UseStrictPlugin", handler);
46
- normalModuleFactory.hooks.parser
47
- .for("javascript/esm")
48
- .tap("UseStrictPlugin", handler);
49
- }
50
- );
51
- }
52
- }
53
-
54
- module.exports = UseStrictPlugin;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const ConstDependency = require("./dependencies/ConstDependency");
8
+
9
+ /** @typedef {import("./Compiler")} Compiler */
10
+
11
+ class UseStrictPlugin {
12
+ /**
13
+ * @param {Compiler} compiler Webpack Compiler
14
+ * @returns {void}
15
+ */
16
+ apply(compiler) {
17
+ compiler.hooks.compilation.tap(
18
+ "UseStrictPlugin",
19
+ (compilation, { normalModuleFactory }) => {
20
+ const handler = parser => {
21
+ parser.hooks.program.tap("UseStrictPlugin", ast => {
22
+ const firstNode = ast.body[0];
23
+ if (
24
+ firstNode &&
25
+ firstNode.type === "ExpressionStatement" &&
26
+ firstNode.expression.type === "Literal" &&
27
+ firstNode.expression.value === "use strict"
28
+ ) {
29
+ // Remove "use strict" expression. It will be added later by the renderer again.
30
+ // This is necessary in order to not break the strict mode when webpack prepends code.
31
+ // @see https://github.com/webpack/webpack/issues/1970
32
+ const dep = new ConstDependency("", firstNode.range);
33
+ dep.loc = firstNode.loc;
34
+ parser.state.current.addDependency(dep);
35
+ parser.state.module.buildInfo.strict = true;
36
+ }
37
+ });
38
+ };
39
+
40
+ normalModuleFactory.hooks.parser
41
+ .for("javascript/auto")
42
+ .tap("UseStrictPlugin", handler);
43
+ normalModuleFactory.hooks.parser
44
+ .for("javascript/dynamic")
45
+ .tap("UseStrictPlugin", handler);
46
+ normalModuleFactory.hooks.parser
47
+ .for("javascript/esm")
48
+ .tap("UseStrictPlugin", handler);
49
+ }
50
+ );
51
+ }
52
+ }
53
+
54
+ module.exports = UseStrictPlugin;
@@ -1,37 +1,37 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const CaseSensitiveModulesWarning = require("./CaseSensitiveModulesWarning");
8
-
9
- class WarnCaseSensitiveModulesPlugin {
10
- apply(compiler) {
11
- compiler.hooks.compilation.tap(
12
- "WarnCaseSensitiveModulesPlugin",
13
- compilation => {
14
- compilation.hooks.seal.tap("WarnCaseSensitiveModulesPlugin", () => {
15
- const moduleWithoutCase = new Map();
16
- for (const module of compilation.modules) {
17
- const identifier = module.identifier().toLowerCase();
18
- const array = moduleWithoutCase.get(identifier);
19
- if (array) {
20
- array.push(module);
21
- } else {
22
- moduleWithoutCase.set(identifier, [module]);
23
- }
24
- }
25
- for (const pair of moduleWithoutCase) {
26
- const array = pair[1];
27
- if (array.length > 1) {
28
- compilation.warnings.push(new CaseSensitiveModulesWarning(array));
29
- }
30
- }
31
- });
32
- }
33
- );
34
- }
35
- }
36
-
37
- module.exports = WarnCaseSensitiveModulesPlugin;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const CaseSensitiveModulesWarning = require("./CaseSensitiveModulesWarning");
8
+
9
+ class WarnCaseSensitiveModulesPlugin {
10
+ apply(compiler) {
11
+ compiler.hooks.compilation.tap(
12
+ "WarnCaseSensitiveModulesPlugin",
13
+ compilation => {
14
+ compilation.hooks.seal.tap("WarnCaseSensitiveModulesPlugin", () => {
15
+ const moduleWithoutCase = new Map();
16
+ for (const module of compilation.modules) {
17
+ const identifier = module.identifier().toLowerCase();
18
+ const array = moduleWithoutCase.get(identifier);
19
+ if (array) {
20
+ array.push(module);
21
+ } else {
22
+ moduleWithoutCase.set(identifier, [module]);
23
+ }
24
+ }
25
+ for (const pair of moduleWithoutCase) {
26
+ const array = pair[1];
27
+ if (array.length > 1) {
28
+ compilation.warnings.push(new CaseSensitiveModulesWarning(array));
29
+ }
30
+ }
31
+ });
32
+ }
33
+ );
34
+ }
35
+ }
36
+
37
+ module.exports = WarnCaseSensitiveModulesPlugin;
@@ -1,17 +1,17 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const NoModeWarning = require("./NoModeWarning");
8
-
9
- class WarnNoModeSetPlugin {
10
- apply(compiler) {
11
- compiler.hooks.thisCompilation.tap("WarnNoModeSetPlugin", compilation => {
12
- compilation.warnings.push(new NoModeWarning());
13
- });
14
- }
15
- }
16
-
17
- module.exports = WarnNoModeSetPlugin;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const NoModeWarning = require("./NoModeWarning");
8
+
9
+ class WarnNoModeSetPlugin {
10
+ apply(compiler) {
11
+ compiler.hooks.thisCompilation.tap("WarnNoModeSetPlugin", compilation => {
12
+ compilation.warnings.push(new NoModeWarning());
13
+ });
14
+ }
15
+ }
16
+
17
+ module.exports = WarnNoModeSetPlugin;