webpack 4.9.1 → 4.10.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 (279) hide show
  1. package/README.md +755 -755
  2. package/SECURITY.md +9 -9
  3. package/buildin/global.js +20 -20
  4. package/buildin/harmony-module.js +24 -24
  5. package/buildin/module.js +22 -22
  6. package/hot/dev-server.js +61 -61
  7. package/hot/log-apply-result.js +44 -44
  8. package/hot/log.js +45 -45
  9. package/hot/only-dev-server.js +105 -105
  10. package/hot/poll.js +37 -37
  11. package/hot/signal.js +62 -62
  12. package/lib/APIPlugin.js +84 -84
  13. package/lib/AmdMainTemplatePlugin.js +87 -75
  14. package/lib/AsyncDependenciesBlock.js +66 -66
  15. package/lib/AsyncDependencyToInitialChunkError.js +31 -21
  16. package/lib/AutomaticPrefetchPlugin.js +50 -50
  17. package/lib/BannerPlugin.js +3 -1
  18. package/lib/BasicEvaluatedExpression.js +211 -208
  19. package/lib/CachePlugin.js +102 -95
  20. package/lib/CaseSensitiveModulesWarning.js +71 -53
  21. package/lib/Chunk.js +750 -722
  22. package/lib/ChunkGroup.js +13 -5
  23. package/lib/ChunkRenderError.js +32 -32
  24. package/lib/CompatibilityPlugin.js +63 -63
  25. package/lib/Compilation.js +1947 -1905
  26. package/lib/Compiler.js +508 -496
  27. package/lib/ConcurrentCompilationError.js +19 -19
  28. package/lib/ConstPlugin.js +258 -242
  29. package/lib/ContextExclusionPlugin.js +17 -17
  30. package/lib/ContextModule.js +749 -710
  31. package/lib/ContextModuleFactory.js +256 -245
  32. package/lib/ContextReplacementPlugin.js +133 -126
  33. package/lib/DefinePlugin.js +206 -197
  34. package/lib/DelegatedModule.js +101 -101
  35. package/lib/DelegatedModuleFactoryPlugin.js +89 -89
  36. package/lib/DelegatedPlugin.js +39 -39
  37. package/lib/DependenciesBlock.js +89 -87
  38. package/lib/DependenciesBlockVariable.js +52 -51
  39. package/lib/Dependency.js +51 -51
  40. package/lib/DllEntryPlugin.js +51 -51
  41. package/lib/DllModule.js +54 -54
  42. package/lib/DllModuleFactory.js +29 -29
  43. package/lib/DllPlugin.js +44 -42
  44. package/lib/DllReferencePlugin.js +84 -84
  45. package/lib/DynamicEntryPlugin.js +73 -71
  46. package/lib/EntryOptionPlugin.js +33 -33
  47. package/lib/EnvironmentPlugin.js +65 -65
  48. package/lib/ErrorHelpers.js +60 -57
  49. package/lib/EvalDevToolModulePlugin.js +27 -27
  50. package/lib/EvalDevToolModuleTemplatePlugin.js +61 -61
  51. package/lib/EvalSourceMapDevToolPlugin.js +41 -40
  52. package/lib/ExportPropertyMainTemplatePlugin.js +53 -40
  53. package/lib/ExtendedAPIPlugin.js +84 -84
  54. package/lib/ExternalModule.js +159 -159
  55. package/lib/ExternalModuleFactoryPlugin.js +110 -110
  56. package/lib/ExternalsPlugin.js +23 -23
  57. package/lib/FlagDependencyExportsPlugin.js +146 -146
  58. package/lib/FlagDependencyUsagePlugin.js +110 -104
  59. package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
  60. package/lib/FunctionModulePlugin.js +19 -19
  61. package/lib/FunctionModuleTemplatePlugin.js +100 -98
  62. package/lib/GraphHelpers.js +64 -64
  63. package/lib/HarmonyLinkingError.js +18 -18
  64. package/lib/HashedModuleIdsPlugin.js +53 -53
  65. package/lib/HotModuleReplacement.runtime.js +7 -3
  66. package/lib/HotModuleReplacementPlugin.js +413 -406
  67. package/lib/HotUpdateChunk.js +16 -16
  68. package/lib/HotUpdateChunkTemplate.js +78 -78
  69. package/lib/IgnorePlugin.js +71 -71
  70. package/lib/JavascriptGenerator.js +229 -228
  71. package/lib/JavascriptModulesPlugin.js +179 -184
  72. package/lib/JsonGenerator.js +42 -42
  73. package/lib/JsonModulesPlugin.js +30 -30
  74. package/lib/JsonParser.js +27 -26
  75. package/lib/LibManifestPlugin.js +86 -86
  76. package/lib/LibraryTemplatePlugin.js +153 -119
  77. package/lib/LoaderOptionsPlugin.js +53 -52
  78. package/lib/LoaderTargetPlugin.js +24 -24
  79. package/lib/MainTemplate.js +34 -9
  80. package/lib/Module.js +381 -377
  81. package/lib/ModuleBuildError.js +42 -42
  82. package/lib/ModuleDependencyError.js +35 -25
  83. package/lib/ModuleDependencyWarning.js +25 -25
  84. package/lib/ModuleError.js +28 -28
  85. package/lib/ModuleFilenameHelpers.js +178 -166
  86. package/lib/ModuleParseError.js +44 -44
  87. package/lib/ModuleReason.js +40 -40
  88. package/lib/ModuleTemplate.js +84 -84
  89. package/lib/ModuleWarning.js +30 -30
  90. package/lib/MultiCompiler.js +283 -271
  91. package/lib/MultiEntryPlugin.js +58 -58
  92. package/lib/MultiModule.js +81 -78
  93. package/lib/MultiModuleFactory.js +23 -23
  94. package/lib/MultiStats.js +92 -92
  95. package/lib/MultiWatching.js +38 -38
  96. package/lib/NamedChunksPlugin.js +29 -29
  97. package/lib/NamedModulesPlugin.js +57 -57
  98. package/lib/NoEmitOnErrorsPlugin.js +20 -20
  99. package/lib/NoModeWarning.js +23 -23
  100. package/lib/NodeStuffPlugin.js +179 -178
  101. package/lib/NormalModule.js +497 -490
  102. package/lib/NormalModuleFactory.js +501 -483
  103. package/lib/NormalModuleReplacementPlugin.js +51 -51
  104. package/lib/OptionsDefaulter.js +84 -80
  105. package/lib/Parser.js +2164 -2086
  106. package/lib/ParserHelpers.js +103 -100
  107. package/lib/PrefetchPlugin.js +37 -37
  108. package/lib/ProgressPlugin.js +231 -231
  109. package/lib/ProvidePlugin.js +86 -86
  110. package/lib/RawModule.js +56 -54
  111. package/lib/RecordIdsPlugin.js +166 -162
  112. package/lib/RemovedPluginError.js +13 -13
  113. package/lib/RequestShortener.js +81 -74
  114. package/lib/RequireJsStuffPlugin.js +69 -69
  115. package/lib/ResolverFactory.js +64 -64
  116. package/lib/RuleSet.js +555 -534
  117. package/lib/RuntimeTemplate.js +320 -277
  118. package/lib/SetVarMainTemplatePlugin.js +69 -57
  119. package/lib/SingleEntryPlugin.js +44 -44
  120. package/lib/SizeFormatHelpers.js +24 -24
  121. package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
  122. package/lib/SourceMapDevToolPlugin.js +301 -300
  123. package/lib/Stats.js +1408 -1367
  124. package/lib/Template.js +4 -2
  125. package/lib/TemplatedPathPlugin.js +173 -170
  126. package/lib/UmdMainTemplatePlugin.js +304 -264
  127. package/lib/UseStrictPlugin.js +48 -48
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +37 -36
  129. package/lib/WarnNoModeSetPlugin.js +17 -17
  130. package/lib/WatchIgnorePlugin.js +100 -100
  131. package/lib/Watching.js +194 -193
  132. package/lib/WebpackError.js +25 -19
  133. package/lib/WebpackOptionsApply.js +421 -405
  134. package/lib/WebpackOptionsDefaulter.js +347 -344
  135. package/lib/WebpackOptionsValidationError.js +345 -316
  136. package/lib/compareLocations.js +56 -56
  137. package/lib/dependencies/AMDDefineDependency.js +137 -137
  138. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -327
  139. package/lib/dependencies/AMDPlugin.js +250 -250
  140. package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
  141. package/lib/dependencies/AMDRequireContextDependency.js +20 -20
  142. package/lib/dependencies/AMDRequireDependenciesBlock.js +43 -43
  143. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +273 -270
  144. package/lib/dependencies/AMDRequireDependency.js +135 -135
  145. package/lib/dependencies/CommonJsPlugin.js +161 -161
  146. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
  147. package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +130 -130
  148. package/lib/dependencies/ConstDependency.js +33 -33
  149. package/lib/dependencies/ContextDependency.js +68 -68
  150. package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
  151. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
  152. package/lib/dependencies/ContextElementDependency.js +21 -21
  153. package/lib/dependencies/DelegatedExportsDependency.js +33 -33
  154. package/lib/dependencies/DependencyReference.js +18 -18
  155. package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
  156. package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -23
  157. package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
  158. package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -90
  159. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
  160. package/lib/dependencies/HarmonyExportExpressionDependency.js +53 -53
  161. package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
  162. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +620 -603
  163. package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -54
  164. package/lib/dependencies/HarmonyImportDependency.js +104 -94
  165. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +217 -214
  166. package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
  167. package/lib/dependencies/HarmonyImportSpecifierDependency.js +166 -156
  168. package/lib/dependencies/HarmonyInitDependency.js +60 -60
  169. package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
  170. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
  171. package/lib/dependencies/ImportContextDependency.js +23 -23
  172. package/lib/dependencies/ImportDependenciesBlock.js +18 -18
  173. package/lib/dependencies/ImportDependency.js +34 -34
  174. package/lib/dependencies/ImportEagerDependency.js +32 -32
  175. package/lib/dependencies/ImportParserPlugin.js +233 -232
  176. package/lib/dependencies/ImportPlugin.js +82 -82
  177. package/lib/dependencies/ImportWeakDependency.js +34 -34
  178. package/lib/dependencies/JsonExportsDependency.js +26 -26
  179. package/lib/dependencies/LoaderPlugin.js +98 -93
  180. package/lib/dependencies/LocalModuleDependency.js +28 -28
  181. package/lib/dependencies/LocalModulesHelpers.js +52 -45
  182. package/lib/dependencies/ModuleDependency.js +20 -20
  183. package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
  184. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
  185. package/lib/dependencies/MultiEntryDependency.js +20 -20
  186. package/lib/dependencies/NullDependency.js +20 -20
  187. package/lib/dependencies/RequireContextDependency.js +22 -22
  188. package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
  189. package/lib/dependencies/RequireContextPlugin.js +143 -141
  190. package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
  191. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -112
  192. package/lib/dependencies/RequireEnsureDependency.js +58 -58
  193. package/lib/dependencies/RequireEnsurePlugin.js +74 -74
  194. package/lib/dependencies/RequireHeaderDependency.js +26 -26
  195. package/lib/dependencies/RequireIncludeDependency.js +39 -39
  196. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
  197. package/lib/dependencies/RequireIncludePlugin.js +61 -61
  198. package/lib/dependencies/RequireResolveContextDependency.js +23 -23
  199. package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
  200. package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
  201. package/lib/dependencies/SingleEntryDependency.js +18 -18
  202. package/lib/dependencies/SystemPlugin.js +125 -125
  203. package/lib/dependencies/UnsupportedDependency.js +27 -27
  204. package/lib/dependencies/WebAssemblyImportDependency.js +48 -44
  205. package/lib/dependencies/WebpackMissingModule.js +20 -20
  206. package/lib/dependencies/getFunctionExpression.js +52 -52
  207. package/lib/formatLocation.js +61 -53
  208. package/lib/node/NodeChunkTemplatePlugin.js +31 -31
  209. package/lib/node/NodeEnvironmentPlugin.js +28 -28
  210. package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
  211. package/lib/node/NodeMainTemplate.runtime.js +27 -27
  212. package/lib/node/NodeMainTemplateAsync.runtime.js +44 -44
  213. package/lib/node/NodeMainTemplatePlugin.js +323 -320
  214. package/lib/node/NodeSourcePlugin.js +144 -140
  215. package/lib/node/NodeTargetPlugin.js +18 -18
  216. package/lib/node/NodeTemplatePlugin.js +31 -31
  217. package/lib/node/NodeWatchFileSystem.js +99 -82
  218. package/lib/node/ReadFileCompileWasmTemplatePlugin.js +52 -52
  219. package/lib/optimize/AggressiveMergingPlugin.js +87 -87
  220. package/lib/optimize/AggressiveSplittingPlugin.js +287 -281
  221. package/lib/optimize/ChunkModuleIdRangePlugin.js +68 -68
  222. package/lib/optimize/ConcatenatedModule.js +1420 -1413
  223. package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
  224. package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
  225. package/lib/optimize/LimitChunkCountPlugin.js +66 -66
  226. package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -75
  227. package/lib/optimize/MinChunkSizePlugin.js +77 -77
  228. package/lib/optimize/ModuleConcatenationPlugin.js +470 -457
  229. package/lib/optimize/OccurrenceOrderPlugin.js +133 -126
  230. package/lib/optimize/RemoveParentModulesPlugin.js +127 -117
  231. package/lib/optimize/RuntimeChunkPlugin.js +41 -41
  232. package/lib/optimize/SideEffectsFlagPlugin.js +158 -156
  233. package/lib/optimize/SplitChunksPlugin.js +709 -696
  234. package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
  235. package/lib/performance/EntrypointsOverSizeLimitWarning.js +31 -31
  236. package/lib/performance/NoAsyncChunksWarning.js +21 -21
  237. package/lib/performance/SizeLimitsPlugin.js +105 -105
  238. package/lib/util/Semaphore.js +41 -41
  239. package/lib/util/SortableSet.js +5 -2
  240. package/lib/util/StackedSetMap.js +12 -5
  241. package/lib/util/TrackingSet.js +35 -35
  242. package/lib/util/cachedMerge.js +35 -35
  243. package/lib/util/createHash.js +77 -77
  244. package/lib/util/identifier.js +76 -76
  245. package/lib/validateSchema.js +67 -67
  246. package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +18 -18
  247. package/lib/wasm/WasmMainTemplatePlugin.js +310 -304
  248. package/lib/wasm/WebAssemblyGenerator.js +143 -19
  249. package/lib/wasm/WebAssemblyJavascriptGenerator.js +90 -107
  250. package/lib/wasm/WebAssemblyModulesPlugin.js +80 -80
  251. package/lib/wasm/WebAssemblyParser.js +28 -5
  252. package/lib/wasm/WebAssemblyUtils.js +48 -0
  253. package/lib/web/FetchCompileWasmTemplatePlugin.js +25 -25
  254. package/lib/web/JsonpChunkTemplatePlugin.js +47 -47
  255. package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
  256. package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
  257. package/lib/web/JsonpMainTemplate.runtime.js +65 -64
  258. package/lib/web/JsonpMainTemplatePlugin.js +576 -574
  259. package/lib/web/JsonpTemplatePlugin.js +23 -23
  260. package/lib/webpack.js +183 -182
  261. package/lib/webpack.web.js +31 -31
  262. package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
  263. package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
  264. package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -64
  265. package/lib/webworker/WebWorkerMainTemplatePlugin.js +179 -179
  266. package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
  267. package/package.json +9 -8
  268. package/schemas/WebpackOptions.json +1988 -1988
  269. package/schemas/ajv.absolutePath.js +55 -55
  270. package/schemas/plugins/DllPlugin.json +32 -32
  271. package/schemas/plugins/DllReferencePlugin.json +99 -99
  272. package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
  273. package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
  274. package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
  275. package/schemas/plugins/WatchIgnorePlugin.json +16 -16
  276. package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
  277. package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
  278. package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
  279. package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
@@ -1,490 +1,497 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const path = require("path");
8
- const NativeModule = require("module");
9
-
10
- const {
11
- CachedSource,
12
- LineToLineMappedSource,
13
- OriginalSource,
14
- RawSource,
15
- SourceMapSource
16
- } = require("webpack-sources");
17
- const { getContext, runLoaders } = require("loader-runner");
18
-
19
- const WebpackError = require("./WebpackError");
20
- const Module = require("./Module");
21
- const ModuleParseError = require("./ModuleParseError");
22
- const ModuleBuildError = require("./ModuleBuildError");
23
- const ModuleError = require("./ModuleError");
24
- const ModuleWarning = require("./ModuleWarning");
25
- const createHash = require("./util/createHash");
26
-
27
- const asString = buf => {
28
- if (Buffer.isBuffer(buf)) {
29
- return buf.toString("utf-8");
30
- }
31
- return buf;
32
- };
33
-
34
- const asBuffer = str => {
35
- if (!Buffer.isBuffer(str)) {
36
- return Buffer.from(str, "utf-8");
37
- }
38
- return str;
39
- };
40
-
41
- const contextify = (context, request) => {
42
- return request
43
- .split("!")
44
- .map(r => {
45
- const splitPath = r.split("?");
46
- splitPath[0] = path.relative(context, splitPath[0]);
47
- if (path.sep === "\\") splitPath[0] = splitPath[0].replace(/\\/g, "/");
48
- if (splitPath[0].indexOf("../") !== 0) splitPath[0] = "./" + splitPath[0];
49
- return splitPath.join("?");
50
- })
51
- .join("!");
52
- };
53
-
54
- class NonErrorEmittedError extends WebpackError {
55
- constructor(error) {
56
- super();
57
-
58
- this.name = "NonErrorEmittedError";
59
- this.message = "(Emitted value instead of an instance of Error) " + error;
60
-
61
- Error.captureStackTrace(this, this.constructor);
62
- }
63
- }
64
-
65
- /**
66
- * @typedef {Object} CachedSourceEntry
67
- * @property {TODO} source the generated source
68
- * @property {string} hash the hash value
69
- */
70
-
71
- class NormalModule extends Module {
72
- constructor({
73
- type,
74
- request,
75
- userRequest,
76
- rawRequest,
77
- loaders,
78
- resource,
79
- parser,
80
- generator,
81
- resolveOptions
82
- }) {
83
- super(type, getContext(resource));
84
-
85
- // Info from Factory
86
- this.request = request;
87
- this.userRequest = userRequest;
88
- this.rawRequest = rawRequest;
89
- this.binary = type.startsWith("webassembly");
90
- this.parser = parser;
91
- this.generator = generator;
92
- this.resource = resource;
93
- this.loaders = loaders;
94
- if (resolveOptions !== undefined) this.resolveOptions = resolveOptions;
95
-
96
- // Info from Build
97
- this.error = null;
98
- this._source = null;
99
- this._buildHash = "";
100
- this.buildTimestamp = undefined;
101
- /** @private @type {Map<string, CachedSourceEntry>} */
102
- this._cachedSources = new Map();
103
-
104
- // Options for the NormalModule set by plugins
105
- // TODO refactor this -> options object filled from Factory
106
- this.useSourceMap = false;
107
- this.lineToLine = false;
108
-
109
- // Cache
110
- this._lastSuccessfulBuildMeta = {};
111
- }
112
-
113
- identifier() {
114
- return this.request;
115
- }
116
-
117
- readableIdentifier(requestShortener) {
118
- return requestShortener.shorten(this.userRequest);
119
- }
120
-
121
- libIdent(options) {
122
- return contextify(options.context, this.userRequest);
123
- }
124
-
125
- nameForCondition() {
126
- const idx = this.resource.indexOf("?");
127
- if (idx >= 0) return this.resource.substr(0, idx);
128
- return this.resource;
129
- }
130
-
131
- updateCacheModule(module) {
132
- this.userRequest = module.userRequest;
133
- this.parser = module.parser;
134
- this.generator = module.generator;
135
- this.resource = module.resource;
136
- this.loaders = module.loaders;
137
- this.resolveOptions = module.resolveOptions;
138
- }
139
-
140
- createSourceForAsset(name, content, sourceMap) {
141
- if (!sourceMap) {
142
- return new RawSource(content);
143
- }
144
-
145
- if (typeof sourceMap === "string") {
146
- return new OriginalSource(content, sourceMap);
147
- }
148
-
149
- return new SourceMapSource(content, name, sourceMap);
150
- }
151
-
152
- createLoaderContext(resolver, options, compilation, fs) {
153
- const loaderContext = {
154
- version: 2,
155
- emitWarning: warning => {
156
- if (!(warning instanceof Error))
157
- warning = new NonErrorEmittedError(warning);
158
- this.warnings.push(new ModuleWarning(this, warning));
159
- },
160
- emitError: error => {
161
- if (!(error instanceof Error)) error = new NonErrorEmittedError(error);
162
- this.errors.push(new ModuleError(this, error));
163
- },
164
- exec: (code, filename) => {
165
- // @ts-ignore Argument of type 'this' is not assignable to parameter of type 'Module'.
166
- const module = new NativeModule(filename, this);
167
- // @ts-ignore _nodeModulePaths is deprecated and undocumented Node.js API
168
- module.paths = NativeModule._nodeModulePaths(this.context);
169
- module.filename = filename;
170
- module._compile(code, filename);
171
- return module.exports;
172
- },
173
- resolve(context, request, callback) {
174
- resolver.resolve({}, context, request, {}, callback);
175
- },
176
- emitFile: (name, content, sourceMap) => {
177
- if (!this.buildInfo.assets) this.buildInfo.assets = Object.create(null);
178
- this.buildInfo.assets[name] = this.createSourceForAsset(
179
- name,
180
- content,
181
- sourceMap
182
- );
183
- },
184
- rootContext: options.context,
185
- webpack: true,
186
- sourceMap: !!this.useSourceMap,
187
- _module: this,
188
- _compilation: compilation,
189
- _compiler: compilation.compiler,
190
- fs: fs
191
- };
192
-
193
- compilation.hooks.normalModuleLoader.call(loaderContext, this);
194
- if (options.loader) Object.assign(loaderContext, options.loader);
195
-
196
- return loaderContext;
197
- }
198
-
199
- createSource(source, resourceBuffer, sourceMap) {
200
- // if there is no identifier return raw source
201
- if (!this.identifier) {
202
- return new RawSource(source);
203
- }
204
-
205
- // from here on we assume we have an identifier
206
- const identifier = this.identifier();
207
-
208
- if (this.lineToLine && resourceBuffer) {
209
- return new LineToLineMappedSource(
210
- source,
211
- identifier,
212
- asString(resourceBuffer)
213
- );
214
- }
215
-
216
- if (this.useSourceMap && sourceMap) {
217
- return new SourceMapSource(source, identifier, sourceMap);
218
- }
219
-
220
- if (Buffer.isBuffer(source)) {
221
- return new RawSource(source);
222
- }
223
-
224
- return new OriginalSource(source, identifier);
225
- }
226
-
227
- doBuild(options, compilation, resolver, fs, callback) {
228
- const loaderContext = this.createLoaderContext(
229
- resolver,
230
- options,
231
- compilation,
232
- fs
233
- );
234
-
235
- runLoaders(
236
- {
237
- resource: this.resource,
238
- loaders: this.loaders,
239
- context: loaderContext,
240
- readResource: fs.readFile.bind(fs)
241
- },
242
- (err, result) => {
243
- if (result) {
244
- this.buildInfo.cacheable = result.cacheable;
245
- this.buildInfo.fileDependencies = new Set(result.fileDependencies);
246
- this.buildInfo.contextDependencies = new Set(
247
- result.contextDependencies
248
- );
249
- }
250
-
251
- if (err) {
252
- const error = new ModuleBuildError(this, err);
253
- return callback(error);
254
- }
255
-
256
- const resourceBuffer = result.resourceBuffer;
257
- const source = result.result[0];
258
- const sourceMap = result.result.length >= 1 ? result.result[1] : null;
259
- const extraInfo = result.result.length >= 2 ? result.result[2] : null;
260
-
261
- if (!Buffer.isBuffer(source) && typeof source !== "string") {
262
- const error = new ModuleBuildError(
263
- this,
264
- new Error("Final loader didn't return a Buffer or String")
265
- );
266
- return callback(error);
267
- }
268
-
269
- this._source = this.createSource(
270
- this.binary ? asBuffer(source) : asString(source),
271
- resourceBuffer,
272
- sourceMap
273
- );
274
- this._ast =
275
- typeof extraInfo === "object" &&
276
- extraInfo !== null &&
277
- extraInfo.webpackAST !== undefined
278
- ? extraInfo.webpackAST
279
- : null;
280
- return callback();
281
- }
282
- );
283
- }
284
-
285
- markModuleAsErrored(error) {
286
- // Restore build meta from successful build to keep importing state
287
- this.buildMeta = Object.assign({}, this._lastSuccessfulBuildMeta);
288
-
289
- this.error = error;
290
- this.errors.push(this.error);
291
- this._source = new RawSource(
292
- "throw new Error(" + JSON.stringify(this.error.message) + ");"
293
- );
294
- this._ast = null;
295
- }
296
-
297
- applyNoParseRule(rule, content) {
298
- // must start with "rule" if rule is a string
299
- if (typeof rule === "string") {
300
- return content.indexOf(rule) === 0;
301
- }
302
-
303
- if (typeof rule === "function") {
304
- return rule(content);
305
- }
306
- // we assume rule is a regexp
307
- return rule.test(content);
308
- }
309
-
310
- // check if module should not be parsed
311
- // returns "true" if the module should !not! be parsed
312
- // returns "false" if the module !must! be parsed
313
- shouldPreventParsing(noParseRule, request) {
314
- // if no noParseRule exists, return false
315
- // the module !must! be parsed.
316
- if (!noParseRule) {
317
- return false;
318
- }
319
-
320
- // we only have one rule to check
321
- if (!Array.isArray(noParseRule)) {
322
- // returns "true" if the module is !not! to be parsed
323
- return this.applyNoParseRule(noParseRule, request);
324
- }
325
-
326
- for (let i = 0; i < noParseRule.length; i++) {
327
- const rule = noParseRule[i];
328
- // early exit on first truthy match
329
- // this module is !not! to be parsed
330
- if (this.applyNoParseRule(rule, request)) {
331
- return true;
332
- }
333
- }
334
- // no match found, so this module !should! be parsed
335
- return false;
336
- }
337
-
338
- _initBuildHash(compilation) {
339
- const hash = createHash(compilation.outputOptions.hashFunction);
340
- if (this._source) {
341
- hash.update("source");
342
- this._source.updateHash(hash);
343
- }
344
- hash.update("meta");
345
- hash.update(JSON.stringify(this.buildMeta));
346
- this._buildHash = hash.digest("hex");
347
- }
348
-
349
- build(options, compilation, resolver, fs, callback) {
350
- this.buildTimestamp = Date.now();
351
- this.built = true;
352
- this._source = null;
353
- this._ast = null;
354
- this._buildHash = "";
355
- this.error = null;
356
- this.errors.length = 0;
357
- this.warnings.length = 0;
358
- this.buildMeta = {};
359
- this.buildInfo = {
360
- cacheable: false,
361
- fileDependencies: new Set(),
362
- contextDependencies: new Set()
363
- };
364
-
365
- return this.doBuild(options, compilation, resolver, fs, err => {
366
- this._cachedSources.clear();
367
-
368
- // if we have an error mark module as failed and exit
369
- if (err) {
370
- this.markModuleAsErrored(err);
371
- this._initBuildHash(compilation);
372
- return callback();
373
- }
374
-
375
- // check if this module should !not! be parsed.
376
- // if so, exit here;
377
- const noParseRule = options.module && options.module.noParse;
378
- if (this.shouldPreventParsing(noParseRule, this.request)) {
379
- this._initBuildHash(compilation);
380
- return callback();
381
- }
382
-
383
- const handleParseError = e => {
384
- const source = this._source.source();
385
- const error = new ModuleParseError(this, source, e);
386
- this.markModuleAsErrored(error);
387
- this._initBuildHash(compilation);
388
- return callback();
389
- };
390
-
391
- const handleParseResult = result => {
392
- this._lastSuccessfulBuildMeta = this.buildMeta;
393
- this._initBuildHash(compilation);
394
- return callback();
395
- };
396
-
397
- try {
398
- const result = this.parser.parse(
399
- this._ast || this._source.source(),
400
- {
401
- current: this,
402
- module: this,
403
- compilation: compilation,
404
- options: options
405
- },
406
- (err, result) => {
407
- if (err) {
408
- handleParseError(err);
409
- } else {
410
- handleParseResult(result);
411
- }
412
- }
413
- );
414
- if (result !== undefined) {
415
- // parse is sync
416
- handleParseResult(result);
417
- }
418
- } catch (e) {
419
- handleParseError(e);
420
- }
421
- });
422
- }
423
-
424
- getHashDigest(dependencyTemplates) {
425
- let dtHash = dependencyTemplates.get("hash");
426
- return `${this.hash}-${dtHash}`;
427
- }
428
-
429
- source(dependencyTemplates, runtimeTemplate, type = "javascript") {
430
- const hashDigest = this.getHashDigest(dependencyTemplates);
431
- const cacheEntry = this._cachedSources.get(type);
432
- if (cacheEntry !== undefined && cacheEntry.hash === hashDigest) {
433
- // We can reuse the cached source
434
- return cacheEntry.source;
435
- }
436
-
437
- const source = this.generator.generate(
438
- this,
439
- dependencyTemplates,
440
- runtimeTemplate,
441
- type
442
- );
443
-
444
- const cachedSource = new CachedSource(source);
445
- this._cachedSources.set(type, {
446
- source: cachedSource,
447
- hash: hashDigest
448
- });
449
- return cachedSource;
450
- }
451
-
452
- originalSource() {
453
- return this._source;
454
- }
455
-
456
- needRebuild(fileTimestamps, contextTimestamps) {
457
- // always try to rebuild in case of an error
458
- if (this.error) return true;
459
-
460
- // always rebuild when module is not cacheable
461
- if (!this.buildInfo.cacheable) return true;
462
-
463
- // Check timestamps of all dependencies
464
- // Missing timestamp -> need rebuild
465
- // Timestamp bigger than buildTimestamp -> need rebuild
466
- for (const file of this.buildInfo.fileDependencies) {
467
- const timestamp = fileTimestamps.get(file);
468
- if (!timestamp) return true;
469
- if (timestamp >= this.buildTimestamp) return true;
470
- }
471
- for (const file of this.buildInfo.contextDependencies) {
472
- const timestamp = contextTimestamps.get(file);
473
- if (!timestamp) return true;
474
- if (timestamp >= this.buildTimestamp) return true;
475
- }
476
- // elsewise -> no rebuild needed
477
- return false;
478
- }
479
-
480
- size() {
481
- return this._source ? this._source.size() : -1;
482
- }
483
-
484
- updateHash(hash) {
485
- hash.update(this._buildHash);
486
- super.updateHash(hash);
487
- }
488
- }
489
-
490
- module.exports = NormalModule;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const path = require("path");
8
+ const NativeModule = require("module");
9
+
10
+ const {
11
+ CachedSource,
12
+ LineToLineMappedSource,
13
+ OriginalSource,
14
+ RawSource,
15
+ SourceMapSource
16
+ } = require("webpack-sources");
17
+ const { getContext, runLoaders } = require("loader-runner");
18
+
19
+ const WebpackError = require("./WebpackError");
20
+ const Module = require("./Module");
21
+ const ModuleParseError = require("./ModuleParseError");
22
+ const ModuleBuildError = require("./ModuleBuildError");
23
+ const ModuleError = require("./ModuleError");
24
+ const ModuleWarning = require("./ModuleWarning");
25
+ const createHash = require("./util/createHash");
26
+
27
+ const asString = buf => {
28
+ if (Buffer.isBuffer(buf)) {
29
+ return buf.toString("utf-8");
30
+ }
31
+ return buf;
32
+ };
33
+
34
+ const asBuffer = str => {
35
+ if (!Buffer.isBuffer(str)) {
36
+ return Buffer.from(str, "utf-8");
37
+ }
38
+ return str;
39
+ };
40
+
41
+ const contextify = (context, request) => {
42
+ return request
43
+ .split("!")
44
+ .map(r => {
45
+ const splitPath = r.split("?");
46
+ splitPath[0] = path.relative(context, splitPath[0]);
47
+ if (path.sep === "\\") splitPath[0] = splitPath[0].replace(/\\/g, "/");
48
+ if (splitPath[0].indexOf("../") !== 0) splitPath[0] = "./" + splitPath[0];
49
+ return splitPath.join("?");
50
+ })
51
+ .join("!");
52
+ };
53
+
54
+ class NonErrorEmittedError extends WebpackError {
55
+ constructor(error) {
56
+ super();
57
+
58
+ this.name = "NonErrorEmittedError";
59
+ this.message = "(Emitted value instead of an instance of Error) " + error;
60
+
61
+ Error.captureStackTrace(this, this.constructor);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @typedef {Object} CachedSourceEntry
67
+ * @property {TODO} source the generated source
68
+ * @property {string} hash the hash value
69
+ */
70
+
71
+ class NormalModule extends Module {
72
+ constructor({
73
+ type,
74
+ request,
75
+ userRequest,
76
+ rawRequest,
77
+ loaders,
78
+ resource,
79
+ parser,
80
+ generator,
81
+ resolveOptions
82
+ }) {
83
+ super(type, getContext(resource));
84
+
85
+ // Info from Factory
86
+ this.request = request;
87
+ this.userRequest = userRequest;
88
+ this.rawRequest = rawRequest;
89
+ this.binary = type.startsWith("webassembly");
90
+ this.parser = parser;
91
+ this.generator = generator;
92
+ this.resource = resource;
93
+ this.loaders = loaders;
94
+ if (resolveOptions !== undefined) this.resolveOptions = resolveOptions;
95
+
96
+ // Info from Build
97
+ this.error = null;
98
+ this._source = null;
99
+ this._buildHash = "";
100
+ this.buildTimestamp = undefined;
101
+ /** @private @type {Map<string, CachedSourceEntry>} */
102
+ this._cachedSources = new Map();
103
+
104
+ // Options for the NormalModule set by plugins
105
+ // TODO refactor this -> options object filled from Factory
106
+ this.useSourceMap = false;
107
+ this.lineToLine = false;
108
+
109
+ // Cache
110
+ this._lastSuccessfulBuildMeta = {};
111
+ }
112
+
113
+ identifier() {
114
+ return this.request;
115
+ }
116
+
117
+ readableIdentifier(requestShortener) {
118
+ return requestShortener.shorten(this.userRequest);
119
+ }
120
+
121
+ libIdent(options) {
122
+ return contextify(options.context, this.userRequest);
123
+ }
124
+
125
+ nameForCondition() {
126
+ const idx = this.resource.indexOf("?");
127
+ if (idx >= 0) return this.resource.substr(0, idx);
128
+ return this.resource;
129
+ }
130
+
131
+ updateCacheModule(module) {
132
+ this.userRequest = module.userRequest;
133
+ this.parser = module.parser;
134
+ this.generator = module.generator;
135
+ this.resource = module.resource;
136
+ this.loaders = module.loaders;
137
+ this.resolveOptions = module.resolveOptions;
138
+ }
139
+
140
+ createSourceForAsset(name, content, sourceMap) {
141
+ if (!sourceMap) {
142
+ return new RawSource(content);
143
+ }
144
+
145
+ if (typeof sourceMap === "string") {
146
+ return new OriginalSource(content, sourceMap);
147
+ }
148
+
149
+ return new SourceMapSource(content, name, sourceMap);
150
+ }
151
+
152
+ createLoaderContext(resolver, options, compilation, fs) {
153
+ const loaderContext = {
154
+ version: 2,
155
+ emitWarning: warning => {
156
+ if (!(warning instanceof Error)) {
157
+ warning = new NonErrorEmittedError(warning);
158
+ }
159
+ this.warnings.push(new ModuleWarning(this, warning));
160
+ },
161
+ emitError: error => {
162
+ if (!(error instanceof Error)) {
163
+ error = new NonErrorEmittedError(error);
164
+ }
165
+ this.errors.push(new ModuleError(this, error));
166
+ },
167
+ exec: (code, filename) => {
168
+ // @ts-ignore Argument of type 'this' is not assignable to parameter of type 'Module'.
169
+ const module = new NativeModule(filename, this);
170
+ // @ts-ignore _nodeModulePaths is deprecated and undocumented Node.js API
171
+ module.paths = NativeModule._nodeModulePaths(this.context);
172
+ module.filename = filename;
173
+ module._compile(code, filename);
174
+ return module.exports;
175
+ },
176
+ resolve(context, request, callback) {
177
+ resolver.resolve({}, context, request, {}, callback);
178
+ },
179
+ emitFile: (name, content, sourceMap) => {
180
+ if (!this.buildInfo.assets) {
181
+ this.buildInfo.assets = Object.create(null);
182
+ }
183
+ this.buildInfo.assets[name] = this.createSourceForAsset(
184
+ name,
185
+ content,
186
+ sourceMap
187
+ );
188
+ },
189
+ rootContext: options.context,
190
+ webpack: true,
191
+ sourceMap: !!this.useSourceMap,
192
+ _module: this,
193
+ _compilation: compilation,
194
+ _compiler: compilation.compiler,
195
+ fs: fs
196
+ };
197
+
198
+ compilation.hooks.normalModuleLoader.call(loaderContext, this);
199
+ if (options.loader) {
200
+ Object.assign(loaderContext, options.loader);
201
+ }
202
+
203
+ return loaderContext;
204
+ }
205
+
206
+ createSource(source, resourceBuffer, sourceMap) {
207
+ // if there is no identifier return raw source
208
+ if (!this.identifier) {
209
+ return new RawSource(source);
210
+ }
211
+
212
+ // from here on we assume we have an identifier
213
+ const identifier = this.identifier();
214
+
215
+ if (this.lineToLine && resourceBuffer) {
216
+ return new LineToLineMappedSource(
217
+ source,
218
+ identifier,
219
+ asString(resourceBuffer)
220
+ );
221
+ }
222
+
223
+ if (this.useSourceMap && sourceMap) {
224
+ return new SourceMapSource(source, identifier, sourceMap);
225
+ }
226
+
227
+ if (Buffer.isBuffer(source)) {
228
+ return new RawSource(source);
229
+ }
230
+
231
+ return new OriginalSource(source, identifier);
232
+ }
233
+
234
+ doBuild(options, compilation, resolver, fs, callback) {
235
+ const loaderContext = this.createLoaderContext(
236
+ resolver,
237
+ options,
238
+ compilation,
239
+ fs
240
+ );
241
+
242
+ runLoaders(
243
+ {
244
+ resource: this.resource,
245
+ loaders: this.loaders,
246
+ context: loaderContext,
247
+ readResource: fs.readFile.bind(fs)
248
+ },
249
+ (err, result) => {
250
+ if (result) {
251
+ this.buildInfo.cacheable = result.cacheable;
252
+ this.buildInfo.fileDependencies = new Set(result.fileDependencies);
253
+ this.buildInfo.contextDependencies = new Set(
254
+ result.contextDependencies
255
+ );
256
+ }
257
+
258
+ if (err) {
259
+ const error = new ModuleBuildError(this, err);
260
+ return callback(error);
261
+ }
262
+
263
+ const resourceBuffer = result.resourceBuffer;
264
+ const source = result.result[0];
265
+ const sourceMap = result.result.length >= 1 ? result.result[1] : null;
266
+ const extraInfo = result.result.length >= 2 ? result.result[2] : null;
267
+
268
+ if (!Buffer.isBuffer(source) && typeof source !== "string") {
269
+ const error = new ModuleBuildError(
270
+ this,
271
+ new Error("Final loader didn't return a Buffer or String")
272
+ );
273
+ return callback(error);
274
+ }
275
+
276
+ this._source = this.createSource(
277
+ this.binary ? asBuffer(source) : asString(source),
278
+ resourceBuffer,
279
+ sourceMap
280
+ );
281
+ this._ast =
282
+ typeof extraInfo === "object" &&
283
+ extraInfo !== null &&
284
+ extraInfo.webpackAST !== undefined
285
+ ? extraInfo.webpackAST
286
+ : null;
287
+ return callback();
288
+ }
289
+ );
290
+ }
291
+
292
+ markModuleAsErrored(error) {
293
+ // Restore build meta from successful build to keep importing state
294
+ this.buildMeta = Object.assign({}, this._lastSuccessfulBuildMeta);
295
+
296
+ this.error = error;
297
+ this.errors.push(this.error);
298
+ this._source = new RawSource(
299
+ "throw new Error(" + JSON.stringify(this.error.message) + ");"
300
+ );
301
+ this._ast = null;
302
+ }
303
+
304
+ applyNoParseRule(rule, content) {
305
+ // must start with "rule" if rule is a string
306
+ if (typeof rule === "string") {
307
+ return content.indexOf(rule) === 0;
308
+ }
309
+
310
+ if (typeof rule === "function") {
311
+ return rule(content);
312
+ }
313
+ // we assume rule is a regexp
314
+ return rule.test(content);
315
+ }
316
+
317
+ // check if module should not be parsed
318
+ // returns "true" if the module should !not! be parsed
319
+ // returns "false" if the module !must! be parsed
320
+ shouldPreventParsing(noParseRule, request) {
321
+ // if no noParseRule exists, return false
322
+ // the module !must! be parsed.
323
+ if (!noParseRule) {
324
+ return false;
325
+ }
326
+
327
+ // we only have one rule to check
328
+ if (!Array.isArray(noParseRule)) {
329
+ // returns "true" if the module is !not! to be parsed
330
+ return this.applyNoParseRule(noParseRule, request);
331
+ }
332
+
333
+ for (let i = 0; i < noParseRule.length; i++) {
334
+ const rule = noParseRule[i];
335
+ // early exit on first truthy match
336
+ // this module is !not! to be parsed
337
+ if (this.applyNoParseRule(rule, request)) {
338
+ return true;
339
+ }
340
+ }
341
+ // no match found, so this module !should! be parsed
342
+ return false;
343
+ }
344
+
345
+ _initBuildHash(compilation) {
346
+ const hash = createHash(compilation.outputOptions.hashFunction);
347
+ if (this._source) {
348
+ hash.update("source");
349
+ this._source.updateHash(hash);
350
+ }
351
+ hash.update("meta");
352
+ hash.update(JSON.stringify(this.buildMeta));
353
+ this._buildHash = hash.digest("hex");
354
+ }
355
+
356
+ build(options, compilation, resolver, fs, callback) {
357
+ this.buildTimestamp = Date.now();
358
+ this.built = true;
359
+ this._source = null;
360
+ this._ast = null;
361
+ this._buildHash = "";
362
+ this.error = null;
363
+ this.errors.length = 0;
364
+ this.warnings.length = 0;
365
+ this.buildMeta = {};
366
+ this.buildInfo = {
367
+ cacheable: false,
368
+ fileDependencies: new Set(),
369
+ contextDependencies: new Set()
370
+ };
371
+
372
+ return this.doBuild(options, compilation, resolver, fs, err => {
373
+ this._cachedSources.clear();
374
+
375
+ // if we have an error mark module as failed and exit
376
+ if (err) {
377
+ this.markModuleAsErrored(err);
378
+ this._initBuildHash(compilation);
379
+ return callback();
380
+ }
381
+
382
+ // check if this module should !not! be parsed.
383
+ // if so, exit here;
384
+ const noParseRule = options.module && options.module.noParse;
385
+ if (this.shouldPreventParsing(noParseRule, this.request)) {
386
+ this._initBuildHash(compilation);
387
+ return callback();
388
+ }
389
+
390
+ const handleParseError = e => {
391
+ const source = this._source.source();
392
+ const error = new ModuleParseError(this, source, e);
393
+ this.markModuleAsErrored(error);
394
+ this._initBuildHash(compilation);
395
+ return callback();
396
+ };
397
+
398
+ const handleParseResult = result => {
399
+ this._lastSuccessfulBuildMeta = this.buildMeta;
400
+ this._initBuildHash(compilation);
401
+ return callback();
402
+ };
403
+
404
+ try {
405
+ const result = this.parser.parse(
406
+ this._ast || this._source.source(),
407
+ {
408
+ current: this,
409
+ module: this,
410
+ compilation: compilation,
411
+ options: options
412
+ },
413
+ (err, result) => {
414
+ if (err) {
415
+ handleParseError(err);
416
+ } else {
417
+ handleParseResult(result);
418
+ }
419
+ }
420
+ );
421
+ if (result !== undefined) {
422
+ // parse is sync
423
+ handleParseResult(result);
424
+ }
425
+ } catch (e) {
426
+ handleParseError(e);
427
+ }
428
+ });
429
+ }
430
+
431
+ getHashDigest(dependencyTemplates) {
432
+ let dtHash = dependencyTemplates.get("hash");
433
+ return `${this.hash}-${dtHash}`;
434
+ }
435
+
436
+ source(dependencyTemplates, runtimeTemplate, type = "javascript") {
437
+ const hashDigest = this.getHashDigest(dependencyTemplates);
438
+ const cacheEntry = this._cachedSources.get(type);
439
+ if (cacheEntry !== undefined && cacheEntry.hash === hashDigest) {
440
+ // We can reuse the cached source
441
+ return cacheEntry.source;
442
+ }
443
+
444
+ const source = this.generator.generate(
445
+ this,
446
+ dependencyTemplates,
447
+ runtimeTemplate,
448
+ type
449
+ );
450
+
451
+ const cachedSource = new CachedSource(source);
452
+ this._cachedSources.set(type, {
453
+ source: cachedSource,
454
+ hash: hashDigest
455
+ });
456
+ return cachedSource;
457
+ }
458
+
459
+ originalSource() {
460
+ return this._source;
461
+ }
462
+
463
+ needRebuild(fileTimestamps, contextTimestamps) {
464
+ // always try to rebuild in case of an error
465
+ if (this.error) return true;
466
+
467
+ // always rebuild when module is not cacheable
468
+ if (!this.buildInfo.cacheable) return true;
469
+
470
+ // Check timestamps of all dependencies
471
+ // Missing timestamp -> need rebuild
472
+ // Timestamp bigger than buildTimestamp -> need rebuild
473
+ for (const file of this.buildInfo.fileDependencies) {
474
+ const timestamp = fileTimestamps.get(file);
475
+ if (!timestamp) return true;
476
+ if (timestamp >= this.buildTimestamp) return true;
477
+ }
478
+ for (const file of this.buildInfo.contextDependencies) {
479
+ const timestamp = contextTimestamps.get(file);
480
+ if (!timestamp) return true;
481
+ if (timestamp >= this.buildTimestamp) return true;
482
+ }
483
+ // elsewise -> no rebuild needed
484
+ return false;
485
+ }
486
+
487
+ size() {
488
+ return this._source ? this._source.size() : -1;
489
+ }
490
+
491
+ updateHash(hash) {
492
+ hash.update(this._buildHash);
493
+ super.updateHash(hash);
494
+ }
495
+ }
496
+
497
+ module.exports = NormalModule;