@depup/webpack 5.109.2-depup.0 → 5.110.1-depup.0

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 (640) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +26 -17
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +117 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +50 -13
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +101 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +32 -47
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +141 -85
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +332 -169
  89. package/lib/RuntimeTemplate.js +2792 -352
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +261 -79
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +36 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +57 -24
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +168 -88
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5324 -0
  160. package/lib/css/syntax.js +9579 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +27 -19
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +2 -2
  230. package/lib/dependencies/ImportDependency.js +24 -20
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +49 -35
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  290. package/lib/dependencies/WorkerDependency.js +28 -22
  291. package/lib/dependencies/WorkletDependency.js +15 -14
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/processExportInfo.js +5 -5
  294. package/lib/dll/DelegatedModule.js +34 -22
  295. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  296. package/lib/dll/DelegatedPlugin.js +2 -2
  297. package/lib/dll/DllEntryPlugin.js +2 -2
  298. package/lib/dll/DllModule.js +22 -15
  299. package/lib/dll/DllModuleFactory.js +7 -3
  300. package/lib/dll/DllPlugin.js +7 -5
  301. package/lib/dll/DllReferencePlugin.js +10 -7
  302. package/lib/dll/LibManifestPlugin.js +5 -5
  303. package/lib/electron/ElectronTargetPlugin.js +53 -49
  304. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  305. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  306. package/lib/errors/BroadContextsWarning.js +43 -0
  307. package/lib/errors/BuildCycleError.js +1 -1
  308. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  309. package/lib/errors/ChunkRenderError.js +1 -1
  310. package/lib/errors/CircularDependenciesWarning.js +38 -0
  311. package/lib/errors/CodeGenerationError.js +1 -1
  312. package/lib/errors/CommentCompilationWarning.js +1 -1
  313. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  314. package/lib/errors/DuplicateModulesWarning.js +45 -0
  315. package/lib/errors/DynamicExportsWarning.js +30 -0
  316. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  317. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  318. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  319. package/lib/errors/EvalUsageWarning.js +28 -0
  320. package/lib/errors/HookWebpackError.js +5 -5
  321. package/lib/errors/HotspotsWarning.js +57 -0
  322. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  323. package/lib/errors/InlinedAssetsWarning.js +36 -0
  324. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  325. package/lib/errors/LargeModulesWarning.js +45 -0
  326. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  327. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  328. package/lib/errors/MixedExportsWarning.js +41 -0
  329. package/lib/errors/ModuleDependencyError.js +13 -16
  330. package/lib/errors/ModuleDependencyWarning.js +5 -15
  331. package/lib/errors/ModuleHashingError.js +1 -1
  332. package/lib/errors/ModuleNotFoundError.js +2 -2
  333. package/lib/errors/ModuleParseError.js +1 -2
  334. package/lib/errors/ModuleRestoreError.js +1 -1
  335. package/lib/errors/ModuleStoreError.js +1 -1
  336. package/lib/errors/NodeStuffInWebError.js +1 -1
  337. package/lib/errors/OsDependentRuleWarning.js +31 -0
  338. package/lib/errors/PureAnnotationsWarning.js +36 -0
  339. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  340. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  341. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  342. package/lib/errors/TinyChunksWarning.js +40 -0
  343. package/lib/errors/TopLevelThisWarning.js +34 -0
  344. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  345. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  346. package/lib/errors/UnusedAliasesWarning.js +29 -0
  347. package/lib/errors/UnusedDefinesWarning.js +29 -0
  348. package/lib/errors/UnusedExternalsWarning.js +29 -0
  349. package/lib/errors/UnusedReexportsWarning.js +42 -0
  350. package/lib/errors/UnusedRuleWarning.js +29 -0
  351. package/lib/errors/WebpackError.js +9 -5
  352. package/lib/errors/deriveStackFromNestedError.js +90 -0
  353. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  354. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  355. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  356. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
  357. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  358. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  359. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  360. package/lib/hmr/lazyCompilationBackend.js +9 -6
  361. package/lib/hmr/parserHooks.js +56 -0
  362. package/lib/html/HtmlGenerator.js +277 -77
  363. package/lib/html/HtmlModule.js +7 -3
  364. package/lib/html/HtmlModulesPlugin.js +282 -162
  365. package/lib/html/HtmlParser.js +31 -86
  366. package/lib/html/data.js +1928 -0
  367. package/lib/html/htmlMinify.js +288 -0
  368. package/lib/html/syntax.js +5557 -1155
  369. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  370. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  371. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  372. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  373. package/lib/ids/IdHelpers.js +7 -8
  374. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  375. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  376. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  377. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  378. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  379. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  380. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  381. package/lib/index.js +10 -0
  382. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  383. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  384. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  385. package/lib/javascript/ChunkHelpers.js +1 -1
  386. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  387. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  388. package/lib/javascript/JavascriptGenerator.js +65 -165
  389. package/lib/javascript/JavascriptModule.js +9 -3
  390. package/lib/javascript/JavascriptModulesPlugin.js +98 -113
  391. package/lib/javascript/JavascriptParser.js +242 -99
  392. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  393. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  394. package/lib/javascript/StartupHelpers.js +55 -9
  395. package/lib/javascript/syntax.js +2678 -232
  396. package/lib/json/JsonData.js +8 -4
  397. package/lib/json/JsonGenerator.js +38 -16
  398. package/lib/json/JsonModule.js +7 -3
  399. package/lib/json/JsonModulesPlugin.js +1 -1
  400. package/lib/json/JsonParser.js +5 -6
  401. package/lib/library/AbstractLibraryPlugin.js +20 -14
  402. package/lib/library/AmdLibraryPlugin.js +11 -7
  403. package/lib/library/AssignLibraryPlugin.js +19 -13
  404. package/lib/library/EnableLibraryPlugin.js +2 -2
  405. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  406. package/lib/library/JsonpLibraryPlugin.js +11 -7
  407. package/lib/library/ModuleLibraryPlugin.js +256 -64
  408. package/lib/library/SystemLibraryPlugin.js +12 -8
  409. package/lib/library/UmdLibraryPlugin.js +62 -25
  410. package/lib/loaders/LoaderRunner.js +14 -1
  411. package/lib/loaders/loadLoader.js +8 -4
  412. package/lib/logging/createConsoleLogger.js +7 -4
  413. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  414. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  415. package/lib/node/NodeSourcePlugin.js +1 -1
  416. package/lib/node/NodeTargetPlugin.js +4 -3
  417. package/lib/node/NodeTemplatePlugin.js +1 -1
  418. package/lib/node/NodeWatchFileSystem.js +70 -9
  419. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  420. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  421. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  422. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/nodeConsole.js +7 -3
  424. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  425. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  426. package/lib/optimize/ConcatenatedModule.js +985 -470
  427. package/lib/optimize/ConstExportsPlugin.js +11 -7
  428. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  429. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  430. package/lib/optimize/InlineExports.js +9 -5
  431. package/lib/optimize/InnerGraph.js +28 -12
  432. package/lib/optimize/InnerGraphPlugin.js +23 -18
  433. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  434. package/lib/optimize/MangleExportsPlugin.js +7 -8
  435. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  436. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  437. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  438. package/lib/optimize/RealContentHashPlugin.js +10 -6
  439. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  440. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  441. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  442. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  443. package/lib/optimize/SplitChunksPlugin.js +86 -24
  444. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  445. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  446. package/lib/performance/BroadContextsPlugin.js +142 -0
  447. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  448. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  449. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  450. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  451. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  452. package/lib/performance/DynamicExportsPlugin.js +120 -0
  453. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  454. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  455. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  456. package/lib/performance/EvalUsagePlugin.js +115 -0
  457. package/lib/performance/HotspotsPlugin.js +296 -0
  458. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  459. package/lib/performance/LargeModulesPlugin.js +126 -0
  460. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  461. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  462. package/lib/performance/MixedExportsPlugin.js +136 -0
  463. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  464. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  465. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  466. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  467. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  468. package/lib/performance/SizeLimitsPlugin.js +139 -7
  469. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  470. package/lib/performance/TinyChunksPlugin.js +128 -0
  471. package/lib/performance/TopLevelThisPlugin.js +208 -0
  472. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  473. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  474. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  475. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  476. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  477. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  478. package/lib/performance/getModuleSize.js +22 -0
  479. package/lib/performance/getSourceModules.js +22 -0
  480. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  481. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  482. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  483. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  484. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  487. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  488. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  489. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  490. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  491. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  492. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  493. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  494. package/lib/rules/RuleSetCompiler.js +146 -12
  495. package/lib/rules/UseEffectRulePlugin.js +18 -11
  496. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  497. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  498. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  499. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  500. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  501. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  502. package/lib/runtime/CompatRuntimeModule.js +5 -3
  503. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  504. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  505. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  506. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  507. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  508. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  509. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  510. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  511. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  512. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  513. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  514. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  515. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  516. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  517. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  518. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  519. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  520. package/lib/runtime/NonceRuntimeModule.js +10 -0
  521. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  522. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  523. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  524. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  525. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  526. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  527. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  528. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  529. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  530. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  531. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  532. package/lib/runtime/baseUri.js +63 -0
  533. package/lib/schemes/DataUriPlugin.js +1 -1
  534. package/lib/schemes/FileUriPlugin.js +1 -1
  535. package/lib/schemes/HttpUriPlugin.js +24 -15
  536. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  537. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  538. package/lib/serialization/BinaryMiddleware.js +4 -4
  539. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  540. package/lib/serialization/FileMiddleware.js +7 -7
  541. package/lib/serialization/ObjectMiddleware.js +139 -114
  542. package/lib/serialization/PlainObjectSerializer.js +19 -16
  543. package/lib/sharing/ConsumeSharedModule.js +30 -21
  544. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  545. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  546. package/lib/sharing/ProvideSharedModule.js +25 -16
  547. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  548. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  549. package/lib/sharing/SharePlugin.js +17 -5
  550. package/lib/sharing/ShareRuntimeModule.js +4 -4
  551. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  552. package/lib/sharing/utils.js +1 -3
  553. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  554. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  555. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  556. package/lib/stats/StatsFactory.js +25 -26
  557. package/lib/stats/StatsPrinter.js +16 -12
  558. package/lib/typescript/TypeScriptPlugin.js +12 -14
  559. package/lib/url/URLParserPlugin.js +26 -13
  560. package/lib/util/AsyncQueue.js +4 -3
  561. package/lib/util/Hash.js +5 -1
  562. package/lib/util/LazySet.js +35 -22
  563. package/lib/util/LocConverter.js +36 -13
  564. package/lib/util/SourceProcessor.js +1050 -24
  565. package/lib/util/StringXor.js +1 -1
  566. package/lib/util/chainedImports.js +9 -5
  567. package/lib/util/cleverMerge.js +1 -1
  568. package/lib/util/comparators.js +45 -14
  569. package/lib/util/concatenate.js +203 -77
  570. package/lib/util/conventions.js +5 -1
  571. package/lib/util/createHash.js +2 -2
  572. package/lib/util/createHooksRegistry.js +8 -10
  573. package/lib/util/dataURL.js +225 -1
  574. package/lib/util/extractSourceMap.js +4 -3
  575. package/lib/util/findCaseMismatch.js +139 -0
  576. package/lib/util/formatLocation.js +1 -2
  577. package/lib/util/fs.js +22 -5
  578. package/lib/util/globUtils.js +298 -24
  579. package/lib/util/hash/BatchedHash.js +5 -1
  580. package/lib/util/hash/BulkUpdateHash.js +5 -1
  581. package/lib/util/hash/DebugHash.js +5 -1
  582. package/lib/util/hash/hash-digest.js +6 -2
  583. package/lib/util/identifier.js +4 -0
  584. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  585. package/lib/util/internalSerializables.js +6 -0
  586. package/lib/util/lazyModule.js +56 -0
  587. package/lib/util/makeSerializable.js +7 -3
  588. package/lib/util/matchAlias.js +25 -0
  589. package/lib/util/mimeTypes.js +11 -5
  590. package/lib/util/nonNumericOnlyHash.js +4 -3
  591. package/lib/util/parseJson.js +5 -3
  592. package/lib/util/preloadModuleType.js +32 -0
  593. package/lib/util/registerExternalSerializer.js +7 -5
  594. package/lib/util/runtime.js +2 -2
  595. package/lib/util/semver.js +1 -1
  596. package/lib/util/serialization.js +28 -28
  597. package/lib/util/source.js +2 -2
  598. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  599. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  600. package/lib/wasm/wasmModuleFilename.js +54 -0
  601. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  602. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  603. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  604. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  605. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  606. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  607. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  608. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  609. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  610. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  611. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  612. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  613. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  614. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  615. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  616. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  617. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  618. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  619. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  620. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  621. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  622. package/lib/web/JsonpTemplatePlugin.js +2 -2
  623. package/lib/webpack.js +22 -11
  624. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  625. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  626. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  627. package/module.d.ts +1 -0
  628. package/package.json +32 -25
  629. package/schemas/WebpackOptions.check.js +1 -1
  630. package/schemas/WebpackOptions.json +670 -36
  631. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  634. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  635. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  636. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  639. package/types.d.ts +3144 -454
  640. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -0,0 +1,138 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const NormalModule = require("../NormalModule");
9
+ const MissingSideEffectsWarning = require("../errors/MissingSideEffectsWarning");
10
+ const { compareStrings } = require("../util/comparators");
11
+ const getModuleSize = require("./getModuleSize");
12
+ const hasOnlyUnusedExports = require("./hasOnlyUnusedExports");
13
+
14
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
15
+ /** @import Compiler from "../Compiler" */
16
+ /** @import Module from "../Module" */
17
+ /**
18
+ * @import {
19
+ * MissingSideEffectsDetails
20
+ * } from "../errors/MissingSideEffectsWarning"
21
+ */
22
+
23
+ const PLUGIN_NAME = "MissingSideEffectsPlugin";
24
+
25
+ // Enough to name the costliest without listing the whole dependency tree.
26
+ const MAX_REPORTED_PACKAGES = 5;
27
+
28
+ /**
29
+ * The package a module belongs to, when its package.json leaves 'sideEffects'
30
+ * unsaid. Nearly every package does, so only the costly ones are worth naming.
31
+ * @param {Module} module the module to look up
32
+ * @returns {string | undefined} the package name, or undefined
33
+ */
34
+ const getUndeclaredPackage = (module) => {
35
+ if (!(module instanceof NormalModule)) return undefined;
36
+
37
+ const resolveData = module.resourceResolveData;
38
+ const description = resolveData && resolveData.descriptionFileData;
39
+
40
+ if (!description || typeof description.name !== "string") return undefined;
41
+ if ("sideEffects" in description) return undefined;
42
+
43
+ return description.name;
44
+ };
45
+
46
+ class MissingSideEffectsPlugin {
47
+ /**
48
+ * Creates an instance of MissingSideEffectsPlugin.
49
+ * @param {PerformanceOptions} options the plugin options
50
+ */
51
+ constructor(options) {
52
+ /** @type {PerformanceOptions["hints"]} */
53
+ this.hints = options.hints;
54
+ }
55
+
56
+ /**
57
+ * Applies the plugin by registering its hooks on the compiler.
58
+ * @param {Compiler} compiler the compiler instance
59
+ * @returns {void}
60
+ */
61
+ apply(compiler) {
62
+ const hints = this.hints;
63
+
64
+ if (!hints) return;
65
+
66
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
67
+ /** @type {MissingSideEffectsWarning | undefined} */
68
+ let warning;
69
+
70
+ // Usage is final here, and concatenation has not merged the modules
71
+ // away yet, so each one can still be measured and attributed.
72
+ compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
73
+ const { chunkGraph, moduleGraph } = compilation;
74
+ /** @type {Map<string, { modules: number, size: number }>} */
75
+ const byPackage = new Map();
76
+ let wasted = 0;
77
+
78
+ for (const module of modules) {
79
+ // One webpack already left out costs nothing.
80
+ if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
81
+ if (!hasOnlyUnusedExports(module, moduleGraph, chunkGraph)) continue;
82
+
83
+ const name = getUndeclaredPackage(module);
84
+
85
+ if (name === undefined) continue;
86
+
87
+ const size = getModuleSize(module);
88
+ const entry = byPackage.get(name);
89
+
90
+ wasted += size;
91
+
92
+ if (entry === undefined) {
93
+ byPackage.set(name, { modules: 1, size });
94
+ } else {
95
+ entry.modules++;
96
+ entry.size += size;
97
+ }
98
+ }
99
+
100
+ if (byPackage.size === 0) return;
101
+
102
+ /** @type {MissingSideEffectsDetails[]} */
103
+ const packages = [];
104
+
105
+ for (const [name, { modules: count, size }] of byPackage) {
106
+ packages.push({ name, modules: count, size });
107
+ }
108
+
109
+ // Ties break by name: module order is not stable across runtimes.
110
+ packages.sort(
111
+ (a, b) => b.size - a.size || compareStrings(a.name, b.name)
112
+ );
113
+
114
+ warning = new MissingSideEffectsWarning(
115
+ packages.slice(0, MAX_REPORTED_PACKAGES),
116
+ packages.length,
117
+ wasted
118
+ );
119
+ });
120
+
121
+ // Reported past the hash: `createHash` folds every message into it, so
122
+ // a hint pushed earlier would change the build's identity.
123
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
124
+ if (warning === undefined) return;
125
+
126
+ if (hints === "error") {
127
+ compilation.errors.push(warning);
128
+ } else if (hints === "stats") {
129
+ compilation.hints.push(warning);
130
+ } else {
131
+ compilation.warnings.push(warning);
132
+ }
133
+ });
134
+ });
135
+ }
136
+ }
137
+
138
+ module.exports = MissingSideEffectsPlugin;
@@ -0,0 +1,136 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const MixedExportsWarning = require("../errors/MixedExportsWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+
11
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
12
+ /** @import Compiler from "../Compiler" */
13
+ /** @import { MixedExportsDetails } from "../errors/MixedExportsWarning" */
14
+
15
+ const PLUGIN_NAME = "MixedExportsPlugin";
16
+
17
+ // Enough to name the offenders without listing every entry.
18
+ const MAX_REPORTED_ENTRIES = 5;
19
+
20
+ // Only these hand the namespace object straight to `require()`, so only here
21
+ // does a default sitting beside named exports change what a consumer receives.
22
+ const AMBIGUOUS_LIBRARY_TYPES = new Set([
23
+ "commonjs",
24
+ "commonjs2",
25
+ "commonjs-module",
26
+ "commonjs-static"
27
+ ]);
28
+
29
+ class MixedExportsPlugin {
30
+ /**
31
+ * Creates an instance of MixedExportsPlugin.
32
+ * @param {PerformanceOptions} options the plugin options
33
+ */
34
+ constructor(options) {
35
+ /** @type {PerformanceOptions["hints"]} */
36
+ this.hints = options.hints;
37
+ }
38
+
39
+ /**
40
+ * Applies the plugin by registering its hooks on the compiler.
41
+ * @param {Compiler} compiler the compiler instance
42
+ * @returns {void}
43
+ */
44
+ apply(compiler) {
45
+ const hints = this.hints;
46
+
47
+ if (!hints) return;
48
+
49
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
50
+ // `afterSeal` is past the hash, which folds every message into it — a
51
+ // hint reported earlier would change the build's identity.
52
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
53
+ const { moduleGraph, outputOptions } = compilation;
54
+
55
+ /** @type {Map<string, MixedExportsDetails[]>} */
56
+ const byType = new Map();
57
+
58
+ for (const [name, entry] of compilation.entries) {
59
+ // An entry can carry its own library, which wins over the output one.
60
+ const library = entry.options.library || outputOptions.library;
61
+ const type = library && library.type;
62
+
63
+ if (!type || !AMBIGUOUS_LIBRARY_TYPES.has(type)) continue;
64
+
65
+ // Naming one export already resolves it, whichever it is.
66
+ if (library.export) continue;
67
+
68
+ // Only the last module of an entry reaches the consumer: every chunk
69
+ // format renders the startup with `entries[entries.length - 1]`.
70
+ const { dependencies } = entry;
71
+ const exported = dependencies[dependencies.length - 1];
72
+
73
+ if (!exported) continue;
74
+
75
+ const module = moduleGraph.getModule(exported);
76
+
77
+ if (!module) continue;
78
+
79
+ const provided = moduleGraph
80
+ .getExportsInfo(module)
81
+ .getProvidedExports();
82
+
83
+ // `true` means "everything", which says nothing about a default.
84
+ if (!Array.isArray(provided)) continue;
85
+
86
+ /** @type {string[]} */
87
+ const named = [];
88
+ let hasDefault = false;
89
+
90
+ for (const it of provided) {
91
+ if (it === "default") {
92
+ hasDefault = true;
93
+ } else {
94
+ named.push(it);
95
+ }
96
+ }
97
+
98
+ if (!hasDefault || named.length === 0) continue;
99
+
100
+ const mixed = byType.get(type);
101
+ const details = { name, named: named.sort(compareStrings) };
102
+
103
+ if (mixed) {
104
+ mixed.push(details);
105
+ } else {
106
+ byType.set(type, [details]);
107
+ }
108
+ }
109
+
110
+ if (byType.size === 0) return;
111
+
112
+ // One report per library type, sorted so a rename cannot reorder them.
113
+ for (const type of [...byType.keys()].sort(compareStrings)) {
114
+ const mixed = /** @type {MixedExportsDetails[]} */ (byType.get(type));
115
+
116
+ mixed.sort((a, b) => compareStrings(a.name, b.name));
117
+
118
+ const warning = new MixedExportsWarning(
119
+ mixed.slice(0, MAX_REPORTED_ENTRIES),
120
+ type
121
+ );
122
+
123
+ if (hints === "error") {
124
+ compilation.errors.push(warning);
125
+ } else if (hints === "stats") {
126
+ compilation.hints.push(warning);
127
+ } else {
128
+ compilation.warnings.push(warning);
129
+ }
130
+ }
131
+ });
132
+ });
133
+ }
134
+ }
135
+
136
+ module.exports = MixedExportsPlugin;
@@ -0,0 +1,178 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const OsDependentRuleWarning = require("../errors/OsDependentRuleWarning");
9
+
10
+ /**
11
+ * @import {
12
+ * Falsy,
13
+ * PerformanceOptions,
14
+ * RuleSetCondition,
15
+ * RuleSetRule
16
+ * } from "../../declarations/WebpackOptions"
17
+ */
18
+ /** @import Compiler from "../Compiler" */
19
+
20
+ const PLUGIN_NAME = "OsDependentRuleWarningPlugin";
21
+
22
+ // Only these carry a path. `resourceQuery`, `resourceFragment`, `mimetype` and
23
+ // `scheme` legitimately contain a `/`.
24
+ const PATH_PROPERTIES = [
25
+ "test",
26
+ "include",
27
+ "exclude",
28
+ "resource",
29
+ "realResource",
30
+ "issuer"
31
+ ];
32
+
33
+ /** @typedef {"posix" | "windows" | undefined} Separator */
34
+
35
+ /**
36
+ * Which separator a pattern can match, walking its source so an escape is never
37
+ * mistaken for the separator after it (`\.` is not `\\`); both means portable.
38
+ * @param {RegExp} regExp the condition
39
+ * @returns {Separator} the only separator it matches, or `undefined` when it is portable
40
+ */
41
+ const onlyMatchedSeparator = (regExp) => {
42
+ const { source } = regExp;
43
+ let posix = false;
44
+ let windows = false;
45
+
46
+ for (let i = 0; i < source.length; i++) {
47
+ const character = source[i];
48
+
49
+ if (character === "\\") {
50
+ const escaped = source[i + 1];
51
+
52
+ if (escaped === "\\") {
53
+ windows = true;
54
+ } else if (escaped === "/") {
55
+ posix = true;
56
+ }
57
+
58
+ i++;
59
+ } else if (character === "/") {
60
+ posix = true;
61
+ }
62
+ }
63
+
64
+ if (posix === windows) return undefined;
65
+
66
+ return posix ? "posix" : "windows";
67
+ };
68
+
69
+ /**
70
+ * @param {RuleSetCondition} condition the condition to walk
71
+ * @param {(regExp: RegExp) => void} callback called for every regexp within
72
+ * @returns {void}
73
+ */
74
+ const forEachRegExp = (condition, callback) => {
75
+ if (condition instanceof RegExp) {
76
+ callback(condition);
77
+ } else if (Array.isArray(condition)) {
78
+ for (const item of condition) forEachRegExp(item, callback);
79
+ } else if (condition && typeof condition === "object") {
80
+ // `not` is skipped: negated, a separator says which paths are *excluded*,
81
+ // so the condition still matches the other OS.
82
+ for (const key of ["and", "or"]) {
83
+ const nested = condition[/** @type {keyof typeof condition} */ (key)];
84
+
85
+ if (nested !== undefined) {
86
+ forEachRegExp(/** @type {RuleSetCondition} */ (nested), callback);
87
+ }
88
+ }
89
+ }
90
+ };
91
+
92
+ class OsDependentRuleWarningPlugin {
93
+ /**
94
+ * Creates an instance of OsDependentRuleWarningPlugin.
95
+ * @param {PerformanceOptions} options the plugin options
96
+ */
97
+ constructor(options) {
98
+ /** @type {PerformanceOptions["hints"]} */
99
+ this.hints = options.hints;
100
+ }
101
+
102
+ /**
103
+ * Applies the plugin by registering its hooks on the compiler.
104
+ * @param {Compiler} compiler the compiler instance
105
+ * @returns {void}
106
+ */
107
+ apply(compiler) {
108
+ const hints = this.hints;
109
+ const rules =
110
+ compiler.options.module && compiler.options.module.rules
111
+ ? compiler.options.module.rules
112
+ : [];
113
+
114
+ /** @type {string[]} */
115
+ const descriptions = [];
116
+
117
+ /**
118
+ * @param {(RuleSetRule | Falsy)[]} ruleSet rules to walk
119
+ * @param {string} path where `ruleSet` sits in the configuration
120
+ * @returns {void}
121
+ */
122
+ const walk = (ruleSet, path) => {
123
+ for (let i = 0; i < ruleSet.length; i++) {
124
+ const rule = ruleSet[i];
125
+
126
+ if (!rule || typeof rule !== "object") continue;
127
+
128
+ const rulePath = `${path}[${i}]`;
129
+
130
+ for (const property of PATH_PROPERTIES) {
131
+ const condition = rule[/** @type {keyof RuleSetRule} */ (property)];
132
+
133
+ if (condition === undefined) continue;
134
+
135
+ forEachRegExp(
136
+ /** @type {RuleSetCondition} */ (condition),
137
+ (regExp) => {
138
+ const separator = onlyMatchedSeparator(regExp);
139
+
140
+ if (separator === undefined) return;
141
+
142
+ descriptions.push(
143
+ `${rulePath}.${property} (${regExp}) only matches ${
144
+ separator === "posix" ? "'/'" : "'\\'"
145
+ } paths`
146
+ );
147
+ }
148
+ );
149
+ }
150
+
151
+ if (Array.isArray(rule.oneOf)) walk(rule.oneOf, `${rulePath}.oneOf`);
152
+ if (Array.isArray(rule.rules)) walk(rule.rules, `${rulePath}.rules`);
153
+ }
154
+ };
155
+
156
+ walk(/** @type {RuleSetRule[]} */ (rules), "module.rules");
157
+
158
+ if (descriptions.length === 0) return;
159
+
160
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
161
+ // Reported past the hash: `createHash` folds every message into it, so
162
+ // a hint pushed earlier would change the build's identity.
163
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
164
+ const warning = new OsDependentRuleWarning(descriptions);
165
+
166
+ if (hints === "error") {
167
+ compilation.errors.push(warning);
168
+ } else if (hints === "stats") {
169
+ compilation.hints.push(warning);
170
+ } else {
171
+ compilation.warnings.push(warning);
172
+ }
173
+ });
174
+ });
175
+ }
176
+ }
177
+
178
+ module.exports = OsDependentRuleWarningPlugin;
@@ -0,0 +1,219 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const {
9
+ JAVASCRIPT_MODULE_TYPE_AUTO,
10
+ JAVASCRIPT_MODULE_TYPE_DYNAMIC,
11
+ JAVASCRIPT_MODULE_TYPE_ESM
12
+ } = require("../ModuleTypeConstants");
13
+ const PureAnnotationsWarning = require("../errors/PureAnnotationsWarning");
14
+ const { compareStrings } = require("../util/comparators");
15
+ const { CompilerHintNotationRegExp } = require("../util/magicComment");
16
+
17
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
18
+ /** @import Compiler from "../Compiler" */
19
+ /** @import { Program } from "estree" */
20
+ /** @import { BuildInfo } from "../Module" */
21
+ /** @import JavascriptParser from "../javascript/JavascriptParser" */
22
+ /** @import { PureAnnotationDetails } from "../errors/PureAnnotationsWarning" */
23
+
24
+ const PLUGIN_NAME = "PureAnnotationsPlugin";
25
+
26
+ // Enough to name the offenders without listing every module.
27
+ const MAX_REPORTED_MODULES = 5;
28
+
29
+ // The only three the parser reads the annotation for; before anything else it
30
+ // is just a comment. Kept in step with `JavascriptParser.isPure`.
31
+ const ANNOTATED_TYPES = new Set([
32
+ "CallExpression",
33
+ "NewExpression",
34
+ "TaggedTemplateExpression"
35
+ ]);
36
+
37
+ /**
38
+ * Collects where every node starts, and which of those starts carry a node the
39
+ * annotation is read for.
40
+ * @param {Program} ast the program
41
+ * @returns {{ starts: number[], annotated: Set<number> }} the two of them
42
+ */
43
+ const collectStarts = (ast) => {
44
+ /** @type {number[]} */
45
+ const starts = [];
46
+ /** @type {Set<number>} */
47
+ const annotated = new Set();
48
+ /** @type {unknown[]} */
49
+ const queue = [ast];
50
+
51
+ while (queue.length > 0) {
52
+ const node = queue.pop();
53
+
54
+ if (!node || typeof node !== "object") continue;
55
+
56
+ if (Array.isArray(node)) {
57
+ for (const item of /** @type {unknown[]} */ (node)) queue.push(item);
58
+ continue;
59
+ }
60
+
61
+ // Walked structurally rather than per node type, so a node the estree
62
+ // types do not name is still reached.
63
+ const fields = /** @type {Record<string, unknown>} */ (node);
64
+ const { type, range } = fields;
65
+
66
+ const start = Array.isArray(range)
67
+ ? /** @type {unknown[]} */ (range)[0]
68
+ : undefined;
69
+
70
+ if (typeof type === "string" && typeof start === "number") {
71
+ starts.push(start);
72
+
73
+ if (ANNOTATED_TYPES.has(type)) annotated.add(start);
74
+ }
75
+
76
+ for (const key of Object.keys(fields)) {
77
+ if (key !== "range" && key !== "loc") queue.push(fields[key]);
78
+ }
79
+ }
80
+
81
+ // Sorted so each annotation can binary-search for the node after it rather
82
+ // than walking every start, which is quadratic on a generated file.
83
+ starts.sort((a, b) => a - b);
84
+
85
+ return { starts, annotated };
86
+ };
87
+
88
+ class PureAnnotationsPlugin {
89
+ /**
90
+ * Creates an instance of PureAnnotationsPlugin.
91
+ * @param {PerformanceOptions} options the plugin options
92
+ */
93
+ constructor(options) {
94
+ /** @type {PerformanceOptions["hints"]} */
95
+ this.hints = options.hints;
96
+ }
97
+
98
+ /**
99
+ * Applies the plugin by registering its hooks on the compiler.
100
+ * @param {Compiler} compiler the compiler instance
101
+ * @returns {void}
102
+ */
103
+ apply(compiler) {
104
+ const hints = this.hints;
105
+
106
+ if (!hints) return;
107
+
108
+ compiler.hooks.compilation.tap(
109
+ PLUGIN_NAME,
110
+ (compilation, { normalModuleFactory }) => {
111
+ /**
112
+ * @param {JavascriptParser} parser the parser
113
+ */
114
+ const handler = (parser) => {
115
+ parser.hooks.program.tap(PLUGIN_NAME, (ast, comments) => {
116
+ const pure = comments.filter((comment) =>
117
+ CompilerHintNotationRegExp.Pure.test(comment.value)
118
+ );
119
+
120
+ if (pure.length === 0) return;
121
+
122
+ const { starts, annotated } = collectStarts(ast);
123
+ let wasted = 0;
124
+
125
+ for (const comment of pure) {
126
+ const range = /** @type {[number, number]} */ (comment.range);
127
+ const after = range[1];
128
+
129
+ // Comments are outside every node's range, so the node the
130
+ // annotation applies to is whichever starts first after it.
131
+ let low = 0;
132
+ let high = starts.length;
133
+
134
+ while (low < high) {
135
+ const middle = (low + high) >> 1;
136
+
137
+ if (starts[middle] < after) {
138
+ low = middle + 1;
139
+ } else {
140
+ high = middle;
141
+ }
142
+ }
143
+
144
+ if (low === starts.length || !annotated.has(starts[low])) {
145
+ wasted++;
146
+ }
147
+ }
148
+
149
+ if (wasted === 0) return;
150
+
151
+ // Kept on the module rather than in a map here, so a module the
152
+ // filesystem cache restores rather than parses still reports.
153
+ const buildInfo = /** @type {BuildInfo} */ (
154
+ parser.state.module.buildInfo
155
+ );
156
+
157
+ buildInfo.ineffectivePureAnnotations = wasted;
158
+ });
159
+ };
160
+
161
+ normalModuleFactory.hooks.parser
162
+ .for(JAVASCRIPT_MODULE_TYPE_AUTO)
163
+ .tap(PLUGIN_NAME, handler);
164
+ normalModuleFactory.hooks.parser
165
+ .for(JAVASCRIPT_MODULE_TYPE_ESM)
166
+ .tap(PLUGIN_NAME, handler);
167
+ normalModuleFactory.hooks.parser
168
+ .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
169
+ .tap(PLUGIN_NAME, handler);
170
+
171
+ // `afterSeal` is past the hash, which folds every message into it — a
172
+ // hint reported earlier would change the build's identity.
173
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
174
+ const { requestShortener } = compilation;
175
+ /** @type {PureAnnotationDetails[]} */
176
+ const wasteful = [];
177
+ let total = 0;
178
+
179
+ for (const module of compilation.modules) {
180
+ // Every built module carries one, so only the field is in question.
181
+ const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
182
+
183
+ if (!buildInfo.ineffectivePureAnnotations) continue;
184
+
185
+ const count = buildInfo.ineffectivePureAnnotations;
186
+
187
+ total += count;
188
+ wasteful.push({
189
+ name: module.readableIdentifier(requestShortener),
190
+ count
191
+ });
192
+ }
193
+
194
+ if (wasteful.length === 0) return;
195
+
196
+ // Ties break by name: module order is not stable across runs.
197
+ wasteful.sort(
198
+ (a, b) => b.count - a.count || compareStrings(a.name, b.name)
199
+ );
200
+
201
+ const warning = new PureAnnotationsWarning(
202
+ wasteful.slice(0, MAX_REPORTED_MODULES),
203
+ total
204
+ );
205
+
206
+ if (hints === "error") {
207
+ compilation.errors.push(warning);
208
+ } else if (hints === "stats") {
209
+ compilation.hints.push(warning);
210
+ } else {
211
+ compilation.warnings.push(warning);
212
+ }
213
+ });
214
+ }
215
+ );
216
+ }
217
+ }
218
+
219
+ module.exports = PureAnnotationsPlugin;