webpack 5.97.1 → 5.104.1

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 (610) hide show
  1. package/README.md +368 -434
  2. package/bin/webpack.js +15 -9
  3. package/hot/dev-server.js +18 -3
  4. package/hot/emitter-event-target.js +7 -0
  5. package/hot/lazy-compilation-node.js +45 -29
  6. package/hot/lazy-compilation-universal.js +18 -0
  7. package/hot/lazy-compilation-web.js +15 -5
  8. package/hot/load-http.js +7 -0
  9. package/hot/log.js +15 -15
  10. package/hot/only-dev-server.js +19 -4
  11. package/hot/poll.js +1 -0
  12. package/lib/APIPlugin.js +48 -50
  13. package/lib/AbstractMethodError.js +1 -0
  14. package/lib/AsyncDependenciesBlock.js +4 -5
  15. package/lib/AutomaticPrefetchPlugin.js +22 -22
  16. package/lib/BannerPlugin.js +35 -40
  17. package/lib/Cache.js +12 -9
  18. package/lib/CacheFacade.js +13 -13
  19. package/lib/CaseSensitiveModulesWarning.js +6 -6
  20. package/lib/Chunk.js +68 -47
  21. package/lib/ChunkGraph.js +174 -95
  22. package/lib/ChunkGroup.js +32 -24
  23. package/lib/ChunkTemplate.js +8 -8
  24. package/lib/CleanPlugin.js +90 -42
  25. package/lib/CodeGenerationResults.js +12 -9
  26. package/lib/CompatibilityPlugin.js +70 -21
  27. package/lib/Compilation.js +827 -550
  28. package/lib/Compiler.js +137 -109
  29. package/lib/ConcatenationScope.js +45 -8
  30. package/lib/ConditionalInitFragment.js +1 -1
  31. package/lib/ConstPlugin.js +89 -59
  32. package/lib/ContextExclusionPlugin.js +5 -4
  33. package/lib/ContextModule.js +66 -51
  34. package/lib/ContextModuleFactory.js +51 -30
  35. package/lib/ContextReplacementPlugin.js +89 -34
  36. package/lib/CssModule.js +8 -4
  37. package/lib/DefinePlugin.js +209 -57
  38. package/lib/DelegatedModule.js +34 -23
  39. package/lib/DelegatedModuleFactoryPlugin.js +27 -24
  40. package/lib/DelegatedPlugin.js +4 -2
  41. package/lib/DependenciesBlock.js +0 -2
  42. package/lib/Dependency.js +37 -19
  43. package/lib/DependencyTemplate.js +2 -0
  44. package/lib/DependencyTemplates.js +5 -6
  45. package/lib/DllEntryPlugin.js +8 -4
  46. package/lib/DllModule.js +11 -12
  47. package/lib/DllModuleFactory.js +2 -2
  48. package/lib/DllPlugin.js +9 -6
  49. package/lib/DllReferencePlugin.js +60 -65
  50. package/lib/DotenvPlugin.js +462 -0
  51. package/lib/DynamicEntryPlugin.js +8 -8
  52. package/lib/EntryOptionPlugin.js +8 -6
  53. package/lib/EntryPlugin.js +5 -3
  54. package/lib/Entrypoint.js +19 -0
  55. package/lib/EnvironmentNotSupportAsyncWarning.js +0 -3
  56. package/lib/EnvironmentPlugin.js +26 -19
  57. package/lib/ErrorHelpers.js +6 -6
  58. package/lib/EvalDevToolModulePlugin.js +17 -14
  59. package/lib/EvalSourceMapDevToolPlugin.js +156 -142
  60. package/lib/ExportsInfo.js +180 -115
  61. package/lib/ExportsInfoApiPlugin.js +2 -2
  62. package/lib/ExternalModule.js +256 -102
  63. package/lib/ExternalModuleFactoryPlugin.js +66 -29
  64. package/lib/ExternalsPlugin.js +57 -2
  65. package/lib/FileSystemInfo.js +313 -247
  66. package/lib/FlagAllModulesAsUsedPlugin.js +2 -2
  67. package/lib/FlagDependencyExportsPlugin.js +29 -19
  68. package/lib/FlagDependencyUsagePlugin.js +9 -10
  69. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  70. package/lib/Generator.js +43 -10
  71. package/lib/GraphHelpers.js +11 -3
  72. package/lib/HookWebpackError.js +35 -7
  73. package/lib/HotModuleReplacementPlugin.js +149 -108
  74. package/lib/HotUpdateChunk.js +0 -3
  75. package/lib/IgnoreErrorModuleFactory.js +2 -2
  76. package/lib/IgnorePlugin.js +16 -13
  77. package/lib/IgnoreWarningsPlugin.js +6 -4
  78. package/lib/InitFragment.js +41 -23
  79. package/lib/InvalidDependenciesModuleWarning.js +2 -3
  80. package/lib/JavascriptMetaInfoPlugin.js +2 -4
  81. package/lib/LibManifestPlugin.js +12 -13
  82. package/lib/LoaderOptionsPlugin.js +12 -14
  83. package/lib/LoaderTargetPlugin.js +5 -3
  84. package/lib/MainTemplate.js +18 -29
  85. package/lib/ManifestPlugin.js +235 -0
  86. package/lib/Module.js +138 -60
  87. package/lib/ModuleBuildError.js +4 -2
  88. package/lib/ModuleDependencyError.js +4 -3
  89. package/lib/ModuleDependencyWarning.js +4 -3
  90. package/lib/ModuleError.js +1 -1
  91. package/lib/ModuleFactory.js +10 -3
  92. package/lib/ModuleFilenameHelpers.js +63 -60
  93. package/lib/ModuleGraph.js +195 -70
  94. package/lib/ModuleGraphConnection.js +14 -20
  95. package/lib/ModuleInfoHeaderPlugin.js +15 -16
  96. package/lib/ModuleNotFoundError.js +1 -1
  97. package/lib/ModuleParseError.js +8 -4
  98. package/lib/ModuleSourceTypeConstants.js +189 -0
  99. package/lib/ModuleTemplate.js +7 -8
  100. package/lib/ModuleTypeConstants.js +37 -15
  101. package/lib/ModuleWarning.js +1 -1
  102. package/lib/MultiCompiler.js +64 -49
  103. package/lib/MultiStats.js +19 -14
  104. package/lib/MultiWatching.js +7 -11
  105. package/lib/NoEmitOnErrorsPlugin.js +5 -3
  106. package/lib/NodeStuffPlugin.js +438 -126
  107. package/lib/NormalModule.js +322 -201
  108. package/lib/NormalModuleFactory.js +230 -117
  109. package/lib/NormalModuleReplacementPlugin.js +37 -39
  110. package/lib/NullFactory.js +3 -2
  111. package/lib/OptimizationStages.js +1 -1
  112. package/lib/OptionsApply.js +1 -1
  113. package/lib/Parser.js +5 -3
  114. package/lib/PlatformPlugin.js +3 -1
  115. package/lib/PrefetchPlugin.js +6 -4
  116. package/lib/ProgressPlugin.js +48 -49
  117. package/lib/ProvidePlugin.js +7 -5
  118. package/lib/RawModule.js +26 -12
  119. package/lib/RecordIdsPlugin.js +88 -110
  120. package/lib/RequestShortener.js +3 -1
  121. package/lib/ResolverFactory.js +15 -14
  122. package/lib/RuntimeGlobals.js +216 -153
  123. package/lib/RuntimeModule.js +7 -6
  124. package/lib/RuntimePlugin.js +115 -62
  125. package/lib/RuntimeTemplate.js +248 -76
  126. package/lib/SelfModuleFactory.js +2 -2
  127. package/lib/SizeFormatHelpers.js +2 -2
  128. package/lib/SourceMapDevToolModuleOptionsPlugin.js +17 -27
  129. package/lib/SourceMapDevToolPlugin.js +72 -59
  130. package/lib/Stats.js +2 -3
  131. package/lib/Template.js +31 -24
  132. package/lib/TemplatedPathPlugin.js +24 -21
  133. package/lib/UseStrictPlugin.js +1 -1
  134. package/lib/WarnCaseSensitiveModulesPlugin.js +36 -37
  135. package/lib/WarnDeprecatedOptionPlugin.js +7 -8
  136. package/lib/WarnNoModeSetPlugin.js +3 -1
  137. package/lib/WatchIgnorePlugin.js +11 -9
  138. package/lib/Watching.js +27 -29
  139. package/lib/WebpackError.js +10 -3
  140. package/lib/WebpackIsIncludedPlugin.js +4 -5
  141. package/lib/WebpackOptionsApply.js +263 -135
  142. package/lib/asset/AssetBytesGenerator.js +171 -0
  143. package/lib/asset/AssetBytesParser.js +37 -0
  144. package/lib/asset/AssetGenerator.js +285 -223
  145. package/lib/asset/AssetModulesPlugin.js +103 -41
  146. package/lib/asset/AssetParser.js +7 -3
  147. package/lib/asset/AssetSourceGenerator.js +41 -17
  148. package/lib/asset/RawDataUrlModule.js +17 -9
  149. package/lib/async-modules/AsyncModuleHelpers.js +52 -0
  150. package/lib/async-modules/AwaitDependenciesInitFragment.js +39 -24
  151. package/lib/async-modules/InferAsyncModulesPlugin.js +25 -26
  152. package/lib/buildChunkGraph.js +36 -17
  153. package/lib/cache/AddBuildDependenciesPlugin.js +5 -6
  154. package/lib/cache/IdleFileCachePlugin.js +22 -20
  155. package/lib/cache/MemoryCachePlugin.js +3 -3
  156. package/lib/cache/MemoryWithGcCachePlugin.js +17 -11
  157. package/lib/cache/PackFileCacheStrategy.js +198 -170
  158. package/lib/cache/ResolverCachePlugin.js +58 -48
  159. package/lib/cache/getLazyHashedEtag.js +5 -4
  160. package/lib/cli.js +197 -39
  161. package/lib/config/browserslistTargetHandler.js +110 -85
  162. package/lib/config/defaults.js +514 -113
  163. package/lib/config/normalization.js +91 -64
  164. package/lib/config/target.js +30 -18
  165. package/lib/container/ContainerEntryDependency.js +0 -1
  166. package/lib/container/ContainerEntryModule.js +16 -15
  167. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  168. package/lib/container/ContainerPlugin.js +5 -6
  169. package/lib/container/ContainerReferencePlugin.js +27 -30
  170. package/lib/container/FallbackDependency.js +2 -1
  171. package/lib/container/FallbackModule.js +19 -14
  172. package/lib/container/FallbackModuleFactory.js +2 -2
  173. package/lib/container/HoistContainerReferencesPlugin.js +7 -7
  174. package/lib/container/ModuleFederationPlugin.js +4 -4
  175. package/lib/container/RemoteModule.js +14 -14
  176. package/lib/container/RemoteRuntimeModule.js +2 -2
  177. package/lib/container/options.js +9 -9
  178. package/lib/css/CssGenerator.js +366 -74
  179. package/lib/css/CssLoadingRuntimeModule.js +26 -16
  180. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
  181. package/lib/css/CssModulesPlugin.js +191 -142
  182. package/lib/css/CssParser.js +1756 -740
  183. package/lib/css/walkCssTokens.js +180 -67
  184. package/lib/debug/ProfilingPlugin.js +135 -51
  185. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +29 -28
  186. package/lib/dependencies/AMDPlugin.js +18 -11
  187. package/lib/dependencies/AMDRequireArrayDependency.js +5 -4
  188. package/lib/dependencies/AMDRequireContextDependency.js +2 -1
  189. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +35 -26
  190. package/lib/dependencies/AMDRuntimeModules.js +3 -1
  191. package/lib/dependencies/CachedConstDependency.js +24 -18
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +31 -24
  193. package/lib/dependencies/CommonJsExportsDependency.js +2 -1
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +50 -36
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +7 -13
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +146 -127
  197. package/lib/dependencies/CommonJsPlugin.js +29 -18
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +4 -3
  199. package/lib/dependencies/CommonJsSelfReferenceDependency.js +4 -4
  200. package/lib/dependencies/ConstDependency.js +2 -2
  201. package/lib/dependencies/ContextDependency.js +10 -5
  202. package/lib/dependencies/ContextDependencyHelpers.js +21 -13
  203. package/lib/dependencies/ContextDependencyTemplateAsId.js +10 -9
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +13 -10
  205. package/lib/dependencies/ContextElementDependency.js +23 -12
  206. package/lib/dependencies/CssIcssExportDependency.js +402 -22
  207. package/lib/dependencies/CssIcssImportDependency.js +116 -51
  208. package/lib/dependencies/CssIcssSymbolDependency.js +33 -35
  209. package/lib/dependencies/CssImportDependency.js +17 -14
  210. package/lib/dependencies/CssUrlDependency.js +8 -13
  211. package/lib/dependencies/DynamicExports.js +19 -19
  212. package/lib/dependencies/ExportsInfoDependency.js +13 -10
  213. package/lib/dependencies/ExternalModuleDependency.js +7 -7
  214. package/lib/dependencies/ExternalModuleInitFragment.js +3 -2
  215. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +96 -0
  216. package/lib/dependencies/HarmonyAcceptDependency.js +96 -5
  217. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -5
  218. package/lib/dependencies/HarmonyCompatibilityDependency.js +0 -1
  219. package/lib/dependencies/HarmonyDetectionParserPlugin.js +10 -30
  220. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +19 -8
  221. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +136 -99
  222. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +152 -61
  224. package/lib/dependencies/HarmonyExportInitFragment.js +2 -2
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +2 -2
  226. package/lib/dependencies/HarmonyExports.js +5 -5
  227. package/lib/dependencies/HarmonyImportDependency.js +92 -45
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +201 -163
  229. package/lib/dependencies/HarmonyImportSideEffectDependency.js +5 -6
  230. package/lib/dependencies/HarmonyImportSpecifierDependency.js +69 -42
  231. package/lib/dependencies/HarmonyModulesPlugin.js +16 -11
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -15
  233. package/lib/dependencies/ImportContextDependency.js +15 -1
  234. package/lib/dependencies/ImportDependency.js +25 -7
  235. package/lib/dependencies/ImportEagerDependency.js +7 -5
  236. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +23 -13
  237. package/lib/dependencies/ImportMetaContextPlugin.js +2 -2
  238. package/lib/dependencies/ImportMetaPlugin.js +172 -20
  239. package/lib/dependencies/ImportParserPlugin.js +327 -49
  240. package/lib/dependencies/ImportPhase.js +121 -0
  241. package/lib/dependencies/ImportPlugin.js +3 -1
  242. package/lib/dependencies/ImportWeakDependency.js +7 -5
  243. package/lib/dependencies/JsonExportsDependency.js +54 -28
  244. package/lib/dependencies/LoaderDependency.js +0 -3
  245. package/lib/dependencies/LoaderImportDependency.js +0 -3
  246. package/lib/dependencies/LoaderPlugin.js +24 -25
  247. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  248. package/lib/dependencies/ModuleDecoratorDependency.js +2 -4
  249. package/lib/dependencies/ModuleDependency.js +14 -13
  250. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  251. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  252. package/lib/dependencies/NullDependency.js +2 -0
  253. package/lib/dependencies/ProvidedDependency.js +8 -10
  254. package/lib/dependencies/PureExpressionDependency.js +1 -2
  255. package/lib/dependencies/RequireContextDependency.js +2 -1
  256. package/lib/dependencies/RequireContextDependencyParserPlugin.js +47 -44
  257. package/lib/dependencies/RequireContextPlugin.js +5 -2
  258. package/lib/dependencies/RequireEnsureDependenciesBlock.js +3 -3
  259. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +101 -99
  260. package/lib/dependencies/RequireEnsurePlugin.js +6 -6
  261. package/lib/dependencies/RequireIncludeDependency.js +2 -2
  262. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +33 -34
  263. package/lib/dependencies/RequireIncludePlugin.js +1 -0
  264. package/lib/dependencies/RequireResolveContextDependency.js +1 -1
  265. package/lib/dependencies/RequireResolveDependency.js +3 -3
  266. package/lib/dependencies/RuntimeRequirementsDependency.js +3 -4
  267. package/lib/dependencies/StaticExportsDependency.js +3 -5
  268. package/lib/dependencies/SystemPlugin.js +4 -4
  269. package/lib/dependencies/URLContextDependency.js +65 -0
  270. package/lib/dependencies/URLDependency.js +3 -8
  271. package/lib/dependencies/URLPlugin.js +18 -159
  272. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -3
  273. package/lib/dependencies/WebAssemblyImportDependency.js +2 -2
  274. package/lib/dependencies/WebpackIsIncludedDependency.js +2 -3
  275. package/lib/dependencies/WorkerDependency.js +8 -6
  276. package/lib/dependencies/WorkerPlugin.js +131 -67
  277. package/lib/dependencies/getFunctionExpression.js +2 -2
  278. package/lib/dependencies/processExportInfo.js +4 -4
  279. package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -1
  280. package/lib/esm/ModuleChunkFormatPlugin.js +232 -179
  281. package/lib/esm/ModuleChunkLoadingPlugin.js +112 -57
  282. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +102 -28
  283. package/lib/formatLocation.js +2 -2
  284. package/lib/hmr/HotModuleReplacement.runtime.js +41 -29
  285. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  286. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +43 -33
  287. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +37 -0
  288. package/lib/hmr/LazyCompilationPlugin.js +67 -54
  289. package/lib/hmr/lazyCompilationBackend.js +23 -18
  290. package/lib/ids/ChunkModuleIdRangePlugin.js +14 -11
  291. package/lib/ids/DeterministicChunkIdsPlugin.js +32 -37
  292. package/lib/ids/DeterministicModuleIdsPlugin.js +52 -52
  293. package/lib/ids/HashedModuleIdsPlugin.js +15 -13
  294. package/lib/ids/IdHelpers.js +66 -49
  295. package/lib/ids/NamedChunkIdsPlugin.js +14 -17
  296. package/lib/ids/NamedModuleIdsPlugin.js +12 -14
  297. package/lib/ids/NaturalChunkIdsPlugin.js +6 -4
  298. package/lib/ids/NaturalModuleIdsPlugin.js +4 -3
  299. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -5
  300. package/lib/ids/OccurrenceModuleIdsPlugin.js +8 -7
  301. package/lib/ids/SyncModuleIdsPlugin.js +18 -13
  302. package/lib/index.js +54 -14
  303. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +116 -119
  304. package/lib/javascript/BasicEvaluatedExpression.js +26 -18
  305. package/lib/javascript/ChunkFormatHelpers.js +70 -0
  306. package/lib/javascript/ChunkHelpers.js +17 -5
  307. package/lib/javascript/CommonJsChunkFormatPlugin.js +114 -141
  308. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -4
  309. package/lib/javascript/JavascriptGenerator.js +122 -100
  310. package/lib/javascript/JavascriptModulesPlugin.js +332 -152
  311. package/lib/javascript/JavascriptParser.js +1488 -1052
  312. package/lib/javascript/JavascriptParserHelpers.js +48 -47
  313. package/lib/javascript/StartupHelpers.js +23 -22
  314. package/lib/json/JsonData.js +4 -4
  315. package/lib/json/JsonGenerator.js +66 -32
  316. package/lib/json/JsonModulesPlugin.js +16 -6
  317. package/lib/json/JsonParser.js +23 -8
  318. package/lib/library/AbstractLibraryPlugin.js +45 -10
  319. package/lib/library/AmdLibraryPlugin.js +7 -5
  320. package/lib/library/AssignLibraryPlugin.js +71 -17
  321. package/lib/library/EnableLibraryPlugin.js +51 -25
  322. package/lib/library/ExportPropertyLibraryPlugin.js +12 -18
  323. package/lib/library/JsonpLibraryPlugin.js +5 -2
  324. package/lib/library/ModuleLibraryPlugin.js +230 -18
  325. package/lib/library/SystemLibraryPlugin.js +29 -11
  326. package/lib/library/UmdLibraryPlugin.js +35 -32
  327. package/lib/logging/Logger.js +18 -15
  328. package/lib/logging/createConsoleLogger.js +27 -27
  329. package/lib/logging/runtime.js +11 -11
  330. package/lib/logging/truncateArgs.js +5 -5
  331. package/lib/node/CommonJsChunkLoadingPlugin.js +72 -75
  332. package/lib/node/NodeEnvironmentPlugin.js +9 -3
  333. package/lib/node/NodeTargetPlugin.js +9 -1
  334. package/lib/node/NodeTemplatePlugin.js +2 -2
  335. package/lib/node/NodeWatchFileSystem.js +4 -4
  336. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -38
  337. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +10 -11
  338. package/lib/node/ReadFileCompileWasmPlugin.js +11 -14
  339. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -30
  340. package/lib/node/nodeConsole.js +12 -7
  341. package/lib/optimize/AggressiveMergingPlugin.js +46 -47
  342. package/lib/optimize/AggressiveSplittingPlugin.js +233 -238
  343. package/lib/optimize/ConcatenatedModule.js +620 -251
  344. package/lib/optimize/EnsureChunkConditionsPlugin.js +58 -58
  345. package/lib/optimize/FlagIncludedChunksPlugin.js +93 -96
  346. package/lib/optimize/InnerGraph.js +139 -124
  347. package/lib/optimize/InnerGraphPlugin.js +29 -24
  348. package/lib/optimize/LimitChunkCountPlugin.js +32 -8
  349. package/lib/optimize/MangleExportsPlugin.js +22 -22
  350. package/lib/optimize/MergeDuplicateChunksPlugin.js +80 -81
  351. package/lib/optimize/MinChunkSizePlugin.js +12 -7
  352. package/lib/optimize/ModuleConcatenationPlugin.js +92 -71
  353. package/lib/optimize/RealContentHashPlugin.js +58 -44
  354. package/lib/optimize/RemoveEmptyChunksPlugin.js +8 -5
  355. package/lib/optimize/RemoveParentModulesPlugin.js +7 -4
  356. package/lib/optimize/RuntimeChunkPlugin.js +22 -25
  357. package/lib/optimize/SideEffectsFlagPlugin.js +44 -26
  358. package/lib/optimize/SplitChunksPlugin.js +209 -158
  359. package/lib/performance/AssetsOverSizeLimitWarning.js +1 -1
  360. package/lib/performance/EntrypointsOverSizeLimitWarning.js +2 -2
  361. package/lib/performance/SizeLimitsPlugin.js +8 -5
  362. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +5 -7
  363. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +61 -64
  364. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +3 -4
  365. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  366. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  367. package/lib/rules/BasicEffectRulePlugin.js +14 -5
  368. package/lib/rules/BasicMatcherRulePlugin.js +18 -7
  369. package/lib/rules/ObjectMatcherRulePlugin.js +17 -6
  370. package/lib/rules/RuleSetCompiler.js +73 -32
  371. package/lib/rules/UseEffectRulePlugin.js +61 -25
  372. package/lib/runtime/AsyncModuleRuntimeModule.js +74 -9
  373. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -4
  374. package/lib/runtime/BaseUriRuntimeModule.js +2 -2
  375. package/lib/runtime/CompatRuntimeModule.js +0 -1
  376. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +1 -1
  377. package/lib/runtime/GetChunkFilenameRuntimeModule.js +34 -35
  378. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -1
  379. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  380. package/lib/runtime/LoadScriptRuntimeModule.js +0 -2
  381. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +248 -0
  382. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  383. package/lib/runtime/RuntimeIdRuntimeModule.js +2 -1
  384. package/lib/runtime/StartupChunkDependenciesPlugin.js +39 -42
  385. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +10 -9
  386. package/lib/runtime/StartupEntrypointRuntimeModule.js +0 -1
  387. package/lib/runtime/SystemContextRuntimeModule.js +0 -2
  388. package/lib/runtime/ToBinaryRuntimeModule.js +64 -0
  389. package/lib/schemes/DataUriPlugin.js +9 -31
  390. package/lib/schemes/FileUriPlugin.js +11 -6
  391. package/lib/schemes/HttpUriPlugin.js +381 -261
  392. package/lib/schemes/VirtualUrlPlugin.js +222 -0
  393. package/lib/serialization/AggregateErrorSerializer.js +41 -0
  394. package/lib/serialization/BinaryMiddleware.js +51 -33
  395. package/lib/serialization/ErrorObjectSerializer.js +7 -2
  396. package/lib/serialization/FileMiddleware.js +101 -71
  397. package/lib/serialization/NullPrototypeObjectSerializer.js +5 -3
  398. package/lib/serialization/ObjectMiddleware.js +130 -54
  399. package/lib/serialization/PlainObjectSerializer.js +1 -1
  400. package/lib/serialization/Serializer.js +38 -20
  401. package/lib/serialization/SerializerMiddleware.js +121 -49
  402. package/lib/serialization/SingleItemMiddleware.js +9 -7
  403. package/lib/serialization/types.js +1 -1
  404. package/lib/sharing/ConsumeSharedModule.js +9 -9
  405. package/lib/sharing/ConsumeSharedPlugin.js +14 -14
  406. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -8
  407. package/lib/sharing/ProvideSharedModule.js +9 -11
  408. package/lib/sharing/ProvideSharedModuleFactory.js +5 -3
  409. package/lib/sharing/ProvideSharedPlugin.js +15 -10
  410. package/lib/sharing/SharePlugin.js +3 -4
  411. package/lib/sharing/ShareRuntimeModule.js +7 -6
  412. package/lib/sharing/resolveMatchedConfigs.js +27 -13
  413. package/lib/sharing/utils.js +37 -43
  414. package/lib/stats/DefaultStatsFactoryPlugin.js +455 -286
  415. package/lib/stats/DefaultStatsPresetPlugin.js +77 -46
  416. package/lib/stats/DefaultStatsPrinterPlugin.js +583 -419
  417. package/lib/stats/StatsFactory.js +75 -32
  418. package/lib/stats/StatsPrinter.js +71 -51
  419. package/lib/url/URLParserPlugin.js +264 -0
  420. package/lib/util/ArrayHelpers.js +6 -8
  421. package/lib/util/ArrayQueue.js +1 -1
  422. package/lib/util/AsyncQueue.js +11 -10
  423. package/lib/util/Hash.js +37 -5
  424. package/lib/util/IterableHelpers.js +4 -4
  425. package/lib/util/LazyBucketSortedSet.js +46 -27
  426. package/lib/util/LazySet.js +16 -10
  427. package/lib/util/MapHelpers.js +1 -1
  428. package/lib/util/ParallelismFactorCalculator.js +2 -2
  429. package/lib/util/Semaphore.js +3 -3
  430. package/lib/util/SetHelpers.js +6 -6
  431. package/lib/util/SortableSet.js +11 -9
  432. package/lib/util/StackedCacheMap.js +2 -2
  433. package/lib/util/StackedMap.js +3 -3
  434. package/lib/util/StringXor.js +2 -1
  435. package/lib/util/TupleQueue.js +11 -8
  436. package/lib/util/TupleSet.js +44 -19
  437. package/lib/util/URLAbsoluteSpecifier.js +3 -4
  438. package/lib/util/WeakTupleMap.js +56 -42
  439. package/lib/util/binarySearchBounds.js +4 -3
  440. package/lib/util/chainedImports.js +3 -1
  441. package/lib/util/cleverMerge.js +171 -107
  442. package/lib/util/comparators.js +265 -162
  443. package/lib/util/compileBooleanMatcher.js +120 -41
  444. package/lib/util/concatenate.js +20 -16
  445. package/lib/util/conventions.js +73 -74
  446. package/lib/util/create-schema-validation.js +8 -8
  447. package/lib/util/createHash.js +32 -135
  448. package/lib/util/dataURL.js +39 -0
  449. package/lib/util/deprecation.js +119 -116
  450. package/lib/util/deterministicGrouping.js +56 -47
  451. package/lib/util/extractSourceMap.js +319 -0
  452. package/lib/util/extractUrlAndGlobal.js +1 -1
  453. package/lib/util/findGraphRoots.js +19 -9
  454. package/lib/util/fs.js +169 -141
  455. package/lib/util/hash/BatchedHash.js +50 -10
  456. package/lib/util/hash/BulkUpdateHash.js +138 -0
  457. package/lib/util/hash/DebugHash.js +75 -0
  458. package/lib/util/hash/hash-digest.js +216 -0
  459. package/lib/util/hash/md4.js +2 -2
  460. package/lib/util/hash/wasm-hash.js +59 -17
  461. package/lib/util/identifier.js +124 -61
  462. package/lib/util/internalSerializables.js +4 -6
  463. package/lib/util/magicComment.js +9 -5
  464. package/lib/util/makeSerializable.js +2 -2
  465. package/lib/util/memoize.js +5 -2
  466. package/lib/util/objectToMap.js +3 -2
  467. package/lib/util/processAsyncTree.js +5 -5
  468. package/lib/util/propertyAccess.js +1 -1
  469. package/lib/util/propertyName.js +2 -3
  470. package/lib/util/registerExternalSerializer.js +16 -20
  471. package/lib/util/removeBOM.js +25 -0
  472. package/lib/util/runtime.js +72 -56
  473. package/lib/util/semver.js +44 -33
  474. package/lib/util/serialization.js +56 -56
  475. package/lib/util/smartGrouping.js +42 -27
  476. package/lib/util/source.js +5 -4
  477. package/lib/util/traverseDestructuringAssignmentProperties.js +45 -0
  478. package/lib/validateSchema.js +7 -9
  479. package/lib/wasm/EnableWasmLoadingPlugin.js +22 -12
  480. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -5
  481. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +15 -3
  482. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +28 -22
  483. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +47 -57
  484. package/lib/wasm-async/AsyncWebAssemblyParser.js +2 -10
  485. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +8 -4
  486. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +23 -17
  487. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +55 -57
  488. package/lib/wasm-sync/WebAssemblyGenerator.js +56 -41
  489. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +6 -3
  490. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +25 -10
  491. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +11 -12
  492. package/lib/wasm-sync/WebAssemblyParser.js +10 -17
  493. package/lib/wasm-sync/WebAssemblyUtils.js +1 -1
  494. package/lib/web/FetchCompileAsyncWasmPlugin.js +4 -4
  495. package/lib/web/FetchCompileWasmPlugin.js +6 -8
  496. package/lib/web/JsonpChunkLoadingPlugin.js +74 -74
  497. package/lib/web/JsonpChunkLoadingRuntimeModule.js +10 -26
  498. package/lib/web/JsonpTemplatePlugin.js +0 -1
  499. package/lib/webpack.js +107 -87
  500. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +79 -75
  501. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +38 -51
  502. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -0
  503. package/module.d.ts +5 -0
  504. package/package.json +149 -129
  505. package/schemas/WebpackOptions.check.d.ts +1 -1
  506. package/schemas/WebpackOptions.check.js +2 -2
  507. package/schemas/WebpackOptions.json +543 -190
  508. package/schemas/plugins/BannerPlugin.check.d.ts +1 -1
  509. package/schemas/plugins/BannerPlugin.check.js +2 -2
  510. package/schemas/plugins/BannerPlugin.json +4 -0
  511. package/schemas/plugins/DllPlugin.check.d.ts +1 -1
  512. package/schemas/plugins/DllPlugin.check.js +1 -1
  513. package/schemas/plugins/DllReferencePlugin.check.d.ts +1 -1
  514. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  515. package/schemas/plugins/IgnorePlugin.check.d.ts +1 -1
  516. package/schemas/plugins/IgnorePlugin.check.js +1 -1
  517. package/schemas/plugins/IgnorePlugin.json +1 -1
  518. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +1 -1
  519. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  520. package/schemas/plugins/{HashedModuleIdsPlugin.check.d.ts → ManifestPlugin.check.d.ts} +2 -2
  521. package/schemas/plugins/ManifestPlugin.check.js +6 -0
  522. package/schemas/plugins/ManifestPlugin.json +98 -0
  523. package/schemas/plugins/ProgressPlugin.check.d.ts +1 -1
  524. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  525. package/schemas/plugins/ProgressPlugin.json +1 -1
  526. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -2
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +23 -6
  529. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +1 -1
  530. package/schemas/plugins/WatchIgnorePlugin.check.js +1 -1
  531. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +1 -1
  532. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +1 -1
  534. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  535. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +1 -1
  536. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  537. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +1 -1
  538. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  539. package/schemas/plugins/container/ContainerPlugin.check.d.ts +1 -1
  540. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  541. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +1 -1
  542. package/schemas/plugins/container/ContainerReferencePlugin.check.js +2 -2
  543. package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
  544. package/schemas/plugins/container/ExternalsType.check.d.ts +1 -1
  545. package/schemas/plugins/container/ExternalsType.check.js +2 -2
  546. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +1 -1
  547. package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -2
  548. package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
  549. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +1 -1
  550. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  551. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +1 -1
  552. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +2 -2
  553. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +1 -1
  554. package/schemas/plugins/css/CssModuleParserOptions.check.js +2 -2
  555. package/schemas/plugins/css/CssParserOptions.check.d.ts +1 -1
  556. package/schemas/plugins/css/CssParserOptions.check.js +2 -2
  557. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +1 -1
  558. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  559. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +7 -0
  560. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +6 -0
  561. package/schemas/plugins/{HashedModuleIdsPlugin.json → ids/HashedModuleIdsPlugin.json} +15 -2
  562. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +1 -1
  563. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -1
  564. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +1 -1
  565. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -1
  566. package/schemas/plugins/{css/CssGlobalParserOptions.check.d.ts → json/JsonModulesPluginGenerator.check.d.ts} +1 -1
  567. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +6 -0
  568. package/schemas/plugins/json/JsonModulesPluginGenerator.json +3 -0
  569. package/schemas/plugins/{css/CssGlobalGeneratorOptions.check.d.ts → json/JsonModulesPluginParser.check.d.ts} +1 -1
  570. package/schemas/plugins/json/JsonModulesPluginParser.check.js +6 -0
  571. package/schemas/plugins/json/JsonModulesPluginParser.json +3 -0
  572. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +1 -1
  573. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  574. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +1 -1
  575. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  576. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +1 -1
  577. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -1
  578. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +1 -1
  579. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  580. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +1 -1
  581. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  582. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +7 -0
  583. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +6 -0
  584. package/schemas/plugins/schemes/VirtualUrlPlugin.json +77 -0
  585. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +1 -1
  586. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +1 -1
  587. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +1 -1
  588. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +1 -1
  589. package/schemas/plugins/sharing/SharePlugin.check.d.ts +1 -1
  590. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  591. package/types.d.ts +5115 -1863
  592. package/SECURITY.md +0 -9
  593. package/lib/ModuleSourceTypesConstants.js +0 -112
  594. package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
  595. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +0 -111
  596. package/lib/library/ModernModuleLibraryPlugin.js +0 -144
  597. package/schemas/plugins/HashedModuleIdsPlugin.check.js +0 -6
  598. package/schemas/plugins/JsonModulesPluginParser.check.d.ts +0 -7
  599. package/schemas/plugins/JsonModulesPluginParser.check.js +0 -6
  600. package/schemas/plugins/JsonModulesPluginParser.json +0 -12
  601. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +0 -7
  602. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +0 -6
  603. package/schemas/plugins/css/CssAutoGeneratorOptions.json +0 -3
  604. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +0 -7
  605. package/schemas/plugins/css/CssAutoParserOptions.check.js +0 -6
  606. package/schemas/plugins/css/CssAutoParserOptions.json +0 -3
  607. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +0 -6
  608. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +0 -3
  609. package/schemas/plugins/css/CssGlobalParserOptions.check.js +0 -6
  610. package/schemas/plugins/css/CssGlobalParserOptions.json +0 -3
@@ -0,0 +1,462 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Natsu @xiaoxiaojx
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const FileSystemInfo = require("./FileSystemInfo");
9
+ const createSchemaValidation = require("./util/create-schema-validation");
10
+ const { join } = require("./util/fs");
11
+
12
+ /** @typedef {import("../declarations/WebpackOptions").DotenvPluginOptions} DotenvPluginOptions */
13
+ /** @typedef {import("./Compiler")} Compiler */
14
+ /** @typedef {import("./CacheFacade").ItemCacheFacade} ItemCacheFacade */
15
+ /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
16
+ /** @typedef {import("./FileSystemInfo").Snapshot} Snapshot */
17
+
18
+ /** @typedef {Exclude<DotenvPluginOptions["prefix"], string | undefined>} Prefix */
19
+ /** @typedef {Record<string, string>} Env */
20
+
21
+ /** @type {DotenvPluginOptions} */
22
+ const DEFAULT_OPTIONS = {
23
+ prefix: "WEBPACK_",
24
+ template: [".env", ".env.local", ".env.[mode]", ".env.[mode].local"]
25
+ };
26
+
27
+ // Regex for parsing .env files
28
+ // ported from https://github.com/motdotla/dotenv/blob/master/lib/main.js#L32
29
+ const LINE =
30
+ /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;
31
+
32
+ const PLUGIN_NAME = "DotenvPlugin";
33
+
34
+ const validate = createSchemaValidation(
35
+ undefined,
36
+ () => {
37
+ const { definitions } = require("../schemas/WebpackOptions.json");
38
+
39
+ return {
40
+ definitions,
41
+ oneOf: [{ $ref: "#/definitions/DotenvPluginOptions" }]
42
+ };
43
+ },
44
+ {
45
+ name: "Dotenv Plugin",
46
+ baseDataPath: "options"
47
+ }
48
+ );
49
+
50
+ /**
51
+ * Parse .env file content
52
+ * ported from https://github.com/motdotla/dotenv/blob/master/lib/main.js#L49
53
+ * @param {string | Buffer} src the source content to parse
54
+ * @returns {Env} parsed environment variables object
55
+ */
56
+ function parse(src) {
57
+ const obj = /** @type {Env} */ (Object.create(null));
58
+
59
+ // Convert buffer to string
60
+ let lines = src.toString();
61
+
62
+ // Convert line breaks to same format
63
+ lines = lines.replace(/\r\n?/gm, "\n");
64
+
65
+ let match;
66
+ while ((match = LINE.exec(lines)) !== null) {
67
+ const key = match[1];
68
+
69
+ // Default undefined or null to empty string
70
+ let value = match[2] || "";
71
+
72
+ // Remove whitespace
73
+ value = value.trim();
74
+
75
+ // Check if double quoted
76
+ const maybeQuote = value[0];
77
+
78
+ // Remove surrounding quotes
79
+ value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2");
80
+
81
+ // Expand newlines if double quoted
82
+ if (maybeQuote === '"') {
83
+ value = value.replace(/\\n/g, "\n");
84
+ value = value.replace(/\\r/g, "\r");
85
+ }
86
+
87
+ // Add to object
88
+ obj[key] = value;
89
+ }
90
+
91
+ return obj;
92
+ }
93
+
94
+ /**
95
+ * Resolve escape sequences
96
+ * ported from https://github.com/motdotla/dotenv-expand
97
+ * @param {string} value value to resolve
98
+ * @returns {string} resolved value
99
+ */
100
+ function _resolveEscapeSequences(value) {
101
+ return value.replace(/\\\$/g, "$");
102
+ }
103
+
104
+ /**
105
+ * Expand environment variable value
106
+ * ported from https://github.com/motdotla/dotenv-expand
107
+ * @param {string} value value to expand
108
+ * @param {Record<string, string | undefined>} processEnv process.env object
109
+ * @param {Env} runningParsed running parsed object
110
+ * @returns {string} expanded value
111
+ */
112
+ function expandValue(value, processEnv, runningParsed) {
113
+ const env = { ...runningParsed, ...processEnv }; // process.env wins
114
+
115
+ const regex = /(?<!\\)\$\{([^{}]+)\}|(?<!\\)\$([A-Za-z_][A-Za-z0-9_]*)/g;
116
+
117
+ let result = value;
118
+ let match;
119
+ const seen = new Set(); // self-referential checker
120
+
121
+ while ((match = regex.exec(result)) !== null) {
122
+ seen.add(result);
123
+
124
+ const [template, bracedExpression, unbracedExpression] = match;
125
+ const expression = bracedExpression || unbracedExpression;
126
+
127
+ // match the operators `:+`, `+`, `:-`, and `-`
128
+ const opRegex = /(:\+|\+|:-|-)/;
129
+ // find first match
130
+ const opMatch = expression.match(opRegex);
131
+ const splitter = opMatch ? opMatch[0] : null;
132
+
133
+ const r = expression.split(/** @type {string} */ (splitter));
134
+ // const r = splitter ? expression.split(splitter) : [expression];
135
+
136
+ let defaultValue;
137
+ let value;
138
+
139
+ const key = r.shift();
140
+
141
+ if ([":+", "+"].includes(splitter || "")) {
142
+ defaultValue = env[key || ""] ? r.join(splitter || "") : "";
143
+ value = null;
144
+ } else {
145
+ defaultValue = r.join(splitter || "");
146
+ value = env[key || ""];
147
+ }
148
+
149
+ if (value) {
150
+ // self-referential check
151
+ result = seen.has(value)
152
+ ? result.replace(template, defaultValue)
153
+ : result.replace(template, value);
154
+ } else {
155
+ result = result.replace(template, defaultValue);
156
+ }
157
+
158
+ // if the result equaled what was in process.env and runningParsed then stop expanding
159
+ if (result === runningParsed[key || ""]) {
160
+ break;
161
+ }
162
+
163
+ regex.lastIndex = 0; // reset regex search position to re-evaluate after each replacement
164
+ }
165
+
166
+ return result;
167
+ }
168
+
169
+ /**
170
+ * Expand environment variables in parsed object
171
+ * ported from https://github.com/motdotla/dotenv-expand
172
+ * @param {{ parsed: Env, processEnv: Record<string, string | undefined> }} options expand options
173
+ * @returns {{ parsed: Env }} expanded options
174
+ */
175
+ function expand(options) {
176
+ // for use with progressive expansion
177
+ const runningParsed = /** @type {Env} */ (Object.create(null));
178
+ const processEnv = options.processEnv;
179
+
180
+ // dotenv.config() ran before this so the assumption is process.env has already been set
181
+ for (const key in options.parsed) {
182
+ let value = options.parsed[key];
183
+
184
+ // short-circuit scenario: process.env was already set prior to the file value
185
+ value =
186
+ Object.prototype.hasOwnProperty.call(processEnv, key) &&
187
+ processEnv[key] !== value
188
+ ? /** @type {string} */ (processEnv[key])
189
+ : expandValue(value, processEnv, runningParsed);
190
+
191
+ const resolvedValue = _resolveEscapeSequences(value);
192
+
193
+ options.parsed[key] = resolvedValue;
194
+ // for use with progressive expansion
195
+ runningParsed[key] = resolvedValue;
196
+ }
197
+
198
+ // Part of `dotenv-expand` code, but we don't need it because of we don't modify `process.env`
199
+ // for (const processKey in options.parsed) {
200
+ // if (processEnv) {
201
+ // processEnv[processKey] = options.parsed[processKey];
202
+ // }
203
+ // }
204
+
205
+ return options;
206
+ }
207
+
208
+ /**
209
+ * Format environment variables as DefinePlugin definitions
210
+ * @param {Env} env environment variables
211
+ * @returns {Record<string, string>} formatted definitions
212
+ */
213
+ const envToDefinitions = (env) => {
214
+ const definitions = /** @type {Record<string, string>} */ ({});
215
+
216
+ for (const [key, value] of Object.entries(env)) {
217
+ const defValue = JSON.stringify(value);
218
+ definitions[`process.env.${key}`] = defValue;
219
+ definitions[`import.meta.env.${key}`] = defValue;
220
+ }
221
+
222
+ return definitions;
223
+ };
224
+
225
+ class DotenvPlugin {
226
+ /**
227
+ * @param {DotenvPluginOptions=} options options object
228
+ */
229
+ constructor(options = {}) {
230
+ validate(options);
231
+ this.options = { ...DEFAULT_OPTIONS, ...options };
232
+ }
233
+
234
+ /**
235
+ * @param {Compiler} compiler the compiler instance
236
+ * @returns {void}
237
+ */
238
+ apply(compiler) {
239
+ const definePlugin = new compiler.webpack.DefinePlugin({});
240
+ const prefixes = Array.isArray(this.options.prefix)
241
+ ? this.options.prefix
242
+ : [this.options.prefix || "WEBPACK_"];
243
+ /** @type {string | false} */
244
+ const dir =
245
+ typeof this.options.dir === "string"
246
+ ? this.options.dir
247
+ : typeof this.options.dir === "undefined"
248
+ ? compiler.context
249
+ : this.options.dir;
250
+
251
+ /** @type {undefined | Snapshot} */
252
+ let snapshot;
253
+
254
+ const cache = compiler.getCache(PLUGIN_NAME);
255
+ const identifier = JSON.stringify(this.options.template);
256
+ const itemCache = cache.getItemCache(identifier, null);
257
+
258
+ compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async () => {
259
+ const { parsed, snapshot: newSnapshot } = dir
260
+ ? await this._loadEnv(compiler, itemCache, dir)
261
+ : { parsed: {} };
262
+ const env = this._getEnv(prefixes, parsed);
263
+
264
+ definePlugin.definitions = envToDefinitions(env || {});
265
+ snapshot = newSnapshot;
266
+ });
267
+
268
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
269
+ if (snapshot) {
270
+ compilation.fileDependencies.addAll(snapshot.getFileIterable());
271
+ compilation.missingDependencies.addAll(snapshot.getMissingIterable());
272
+ }
273
+ });
274
+
275
+ definePlugin.apply(compiler);
276
+ }
277
+
278
+ /**
279
+ * Get list of env files to load based on mode and template
280
+ * Similar to Vite's getEnvFilesForMode
281
+ * @private
282
+ * @param {InputFileSystem} inputFileSystem the input file system
283
+ * @param {string | false} dir the directory containing .env files
284
+ * @param {string | undefined} mode the mode (e.g., 'production', 'development')
285
+ * @returns {string[]} array of file paths to load
286
+ */
287
+ _getEnvFilesForMode(inputFileSystem, dir, mode) {
288
+ if (!dir) {
289
+ return [];
290
+ }
291
+
292
+ const { template } = /** @type {DotenvPluginOptions} */ (this.options);
293
+ const templates = template || [];
294
+
295
+ return templates
296
+ .map((pattern) => pattern.replace(/\[mode\]/g, mode || "development"))
297
+ .map((file) => join(inputFileSystem, dir, file));
298
+ }
299
+
300
+ /**
301
+ * Get parsed env variables from `.env` files
302
+ * @private
303
+ * @param {InputFileSystem} fs input file system
304
+ * @param {string} dir dir to load `.env` files
305
+ * @param {string} mode mode
306
+ * @returns {Promise<{parsed: Env, fileDependencies: string[], missingDependencies: string[]}>} parsed env variables and dependencies
307
+ */
308
+ async _getParsed(fs, dir, mode) {
309
+ /** @type {string[]} */
310
+ const fileDependencies = [];
311
+ /** @type {string[]} */
312
+ const missingDependencies = [];
313
+
314
+ // Get env files to load
315
+ const envFiles = this._getEnvFilesForMode(fs, dir, mode);
316
+
317
+ // Read all files
318
+ const contents = await Promise.all(
319
+ envFiles.map((filePath) =>
320
+ this._loadFile(fs, filePath).then(
321
+ (content) => {
322
+ fileDependencies.push(filePath);
323
+ return content;
324
+ },
325
+ () => {
326
+ // File doesn't exist, add to missingDependencies (this is normal)
327
+ missingDependencies.push(filePath);
328
+ return "";
329
+ }
330
+ )
331
+ )
332
+ );
333
+
334
+ // Parse all files and merge (later files override earlier ones)
335
+ // Similar to Vite's implementation
336
+ const parsed = /** @type {Env} */ (Object.create(null));
337
+
338
+ for (const content of contents) {
339
+ if (!content) continue;
340
+ const entries = parse(content);
341
+ for (const key in entries) {
342
+ parsed[key] = entries[key];
343
+ }
344
+ }
345
+
346
+ return { parsed, fileDependencies, missingDependencies };
347
+ }
348
+
349
+ /**
350
+ * @private
351
+ * @param {Compiler} compiler compiler
352
+ * @param {ItemCacheFacade} itemCache item cache facade
353
+ * @param {string} dir directory to read
354
+ * @returns {Promise<{ parsed: Env, snapshot: Snapshot }>} parsed result and snapshot
355
+ */
356
+ async _loadEnv(compiler, itemCache, dir) {
357
+ const fs = /** @type {InputFileSystem} */ (compiler.inputFileSystem);
358
+ const fileSystemInfo = new FileSystemInfo(fs, {
359
+ unmanagedPaths: compiler.unmanagedPaths,
360
+ managedPaths: compiler.managedPaths,
361
+ immutablePaths: compiler.immutablePaths,
362
+ hashFunction: compiler.options.output.hashFunction
363
+ });
364
+
365
+ const result = await itemCache.getPromise();
366
+
367
+ if (result) {
368
+ const isSnapshotValid = await new Promise((resolve, reject) => {
369
+ fileSystemInfo.checkSnapshotValid(result.snapshot, (error, isValid) => {
370
+ if (error) {
371
+ reject(error);
372
+
373
+ return;
374
+ }
375
+
376
+ resolve(isValid);
377
+ });
378
+ });
379
+
380
+ if (isSnapshotValid) {
381
+ return { parsed: result.parsed, snapshot: result.snapshot };
382
+ }
383
+ }
384
+
385
+ const { parsed, fileDependencies, missingDependencies } =
386
+ await this._getParsed(
387
+ fs,
388
+ dir,
389
+ /** @type {string} */
390
+ (compiler.options.mode)
391
+ );
392
+
393
+ const startTime = Date.now();
394
+ const newSnapshot = await new Promise((resolve, reject) => {
395
+ fileSystemInfo.createSnapshot(
396
+ startTime,
397
+ fileDependencies,
398
+ null,
399
+ missingDependencies,
400
+ // `.env` files are build dependencies
401
+ compiler.options.snapshot.buildDependencies,
402
+ (err, snapshot) => {
403
+ if (err) return reject(err);
404
+ resolve(snapshot);
405
+ }
406
+ );
407
+ });
408
+
409
+ await itemCache.storePromise({ parsed, snapshot: newSnapshot });
410
+
411
+ return { parsed, snapshot: newSnapshot };
412
+ }
413
+
414
+ /**
415
+ * Generate env variables
416
+ * @private
417
+ * @param {Prefix} prefixes expose only environment variables that start with these prefixes
418
+ * @param {Env} parsed parsed env variables
419
+ * @returns {Env} env variables
420
+ */
421
+ _getEnv(prefixes, parsed) {
422
+ // Always expand environment variables (like Vite does)
423
+ // Make a copy of process.env so that dotenv-expand doesn't modify global process.env
424
+ const processEnv = { ...process.env };
425
+ expand({ parsed, processEnv });
426
+ const env = /** @type {Env} */ (Object.create(null));
427
+
428
+ // Get all keys from parser and process.env
429
+ const keys = [...Object.keys(parsed), ...Object.keys(process.env)];
430
+
431
+ // Prioritize actual env variables from `process.env`, fallback to parsed
432
+ for (const key of keys) {
433
+ if (prefixes.some((prefix) => key.startsWith(prefix))) {
434
+ env[key] =
435
+ Object.prototype.hasOwnProperty.call(process.env, key) &&
436
+ process.env[key]
437
+ ? process.env[key]
438
+ : parsed[key];
439
+ }
440
+ }
441
+
442
+ return env;
443
+ }
444
+
445
+ /**
446
+ * Load a file with proper path resolution
447
+ * @private
448
+ * @param {InputFileSystem} fs the input file system
449
+ * @param {string} file the file to load
450
+ * @returns {Promise<string>} the content of the file
451
+ */
452
+ _loadFile(fs, file) {
453
+ return new Promise((resolve, reject) => {
454
+ fs.readFile(file, (err, content) => {
455
+ if (err) reject(err);
456
+ else resolve(/** @type {Buffer} */ (content).toString() || "");
457
+ });
458
+ });
459
+ }
460
+ }
461
+
462
+ module.exports = DotenvPlugin;
@@ -11,10 +11,10 @@ const EntryDependency = require("./dependencies/EntryDependency");
11
11
 
12
12
  /** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
13
13
  /** @typedef {import("../declarations/WebpackOptions").EntryDynamicNormalized} EntryDynamic */
14
- /** @typedef {import("../declarations/WebpackOptions").EntryItem} EntryItem */
15
- /** @typedef {import("../declarations/WebpackOptions").EntryStaticNormalized} EntryStatic */
16
14
  /** @typedef {import("./Compiler")} Compiler */
17
15
 
16
+ const PLUGIN_NAME = "DynamicEntryPlugin";
17
+
18
18
  class DynamicEntryPlugin {
19
19
  /**
20
20
  * @param {string} context the context path
@@ -32,7 +32,7 @@ class DynamicEntryPlugin {
32
32
  */
33
33
  apply(compiler) {
34
34
  compiler.hooks.compilation.tap(
35
- "DynamicEntryPlugin",
35
+ PLUGIN_NAME,
36
36
  (compilation, { normalModuleFactory }) => {
37
37
  compilation.dependencyFactories.set(
38
38
  EntryDependency,
@@ -41,9 +41,9 @@ class DynamicEntryPlugin {
41
41
  }
42
42
  );
43
43
 
44
- compiler.hooks.make.tapPromise("DynamicEntryPlugin", compilation =>
44
+ compiler.hooks.make.tapPromise(PLUGIN_NAME, (compilation) =>
45
45
  Promise.resolve(this.entry())
46
- .then(entry => {
46
+ .then((entry) => {
47
47
  const promises = [];
48
48
  for (const name of Object.keys(entry)) {
49
49
  const desc = entry[name];
@@ -58,7 +58,7 @@ class DynamicEntryPlugin {
58
58
  promises.push(
59
59
  new Promise(
60
60
  /**
61
- * @param {(value?: any) => void} resolve resolve
61
+ * @param {(value?: undefined) => void} resolve resolve
62
62
  * @param {(reason?: Error) => void} reject reject
63
63
  */
64
64
  (resolve, reject) => {
@@ -66,7 +66,7 @@ class DynamicEntryPlugin {
66
66
  this.context,
67
67
  EntryPlugin.createDependency(entry, options),
68
68
  options,
69
- err => {
69
+ (err) => {
70
70
  if (err) return reject(err);
71
71
  resolve();
72
72
  }
@@ -78,7 +78,7 @@ class DynamicEntryPlugin {
78
78
  }
79
79
  return Promise.all(promises);
80
80
  })
81
- .then(x => {})
81
+ .then(() => {})
82
82
  );
83
83
  }
84
84
  }
@@ -10,13 +10,15 @@
10
10
  /** @typedef {import("./Compiler")} Compiler */
11
11
  /** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
12
12
 
13
+ const PLUGIN_NAME = "EntryOptionPlugin";
14
+
13
15
  class EntryOptionPlugin {
14
16
  /**
15
17
  * @param {Compiler} compiler the compiler instance one is tapping into
16
18
  * @returns {void}
17
19
  */
18
20
  apply(compiler) {
19
- compiler.hooks.entryOption.tap("EntryOptionPlugin", (context, entry) => {
21
+ compiler.hooks.entryOption.tap(PLUGIN_NAME, (context, entry) => {
20
22
  EntryOptionPlugin.applyEntryOption(compiler, context, entry);
21
23
  return true;
22
24
  });
@@ -31,9 +33,11 @@ class EntryOptionPlugin {
31
33
  static applyEntryOption(compiler, context, entry) {
32
34
  if (typeof entry === "function") {
33
35
  const DynamicEntryPlugin = require("./DynamicEntryPlugin");
36
+
34
37
  new DynamicEntryPlugin(context, entry).apply(compiler);
35
38
  } else {
36
39
  const EntryPlugin = require("./EntryPlugin");
40
+
37
41
  for (const name of Object.keys(entry)) {
38
42
  const desc = entry[name];
39
43
  const options = EntryOptionPlugin.entryDescriptionToOptions(
@@ -72,21 +76,19 @@ class EntryOptionPlugin {
72
76
  wasmLoading: desc.wasmLoading,
73
77
  library: desc.library
74
78
  };
75
- if (desc.layer !== undefined && !compiler.options.experiments.layers) {
76
- throw new Error(
77
- "'entryOptions.layer' is only allowed when 'experiments.layers' is enabled"
78
- );
79
- }
80
79
  if (desc.chunkLoading) {
81
80
  const EnableChunkLoadingPlugin = require("./javascript/EnableChunkLoadingPlugin");
81
+
82
82
  EnableChunkLoadingPlugin.checkEnabled(compiler, desc.chunkLoading);
83
83
  }
84
84
  if (desc.wasmLoading) {
85
85
  const EnableWasmLoadingPlugin = require("./wasm/EnableWasmLoadingPlugin");
86
+
86
87
  EnableWasmLoadingPlugin.checkEnabled(compiler, desc.wasmLoading);
87
88
  }
88
89
  if (desc.library) {
89
90
  const EnableLibraryPlugin = require("./library/EnableLibraryPlugin");
91
+
90
92
  EnableLibraryPlugin.checkEnabled(compiler, desc.library.type);
91
93
  }
92
94
  return options;
@@ -10,6 +10,8 @@ const EntryDependency = require("./dependencies/EntryDependency");
10
10
  /** @typedef {import("./Compiler")} Compiler */
11
11
  /** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
12
12
 
13
+ const PLUGIN_NAME = "EntryPlugin";
14
+
13
15
  class EntryPlugin {
14
16
  /**
15
17
  * An entry plugin which will handle creation of the EntryDependency
@@ -30,7 +32,7 @@ class EntryPlugin {
30
32
  */
31
33
  apply(compiler) {
32
34
  compiler.hooks.compilation.tap(
33
- "EntryPlugin",
35
+ PLUGIN_NAME,
34
36
  (compilation, { normalModuleFactory }) => {
35
37
  compilation.dependencyFactories.set(
36
38
  EntryDependency,
@@ -42,8 +44,8 @@ class EntryPlugin {
42
44
  const { entry, options, context } = this;
43
45
  const dep = EntryPlugin.createDependency(entry, options);
44
46
 
45
- compiler.hooks.make.tapAsync("EntryPlugin", (compilation, callback) => {
46
- compilation.addEntry(context, dep, options, err => {
47
+ compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
48
+ compilation.addEntry(context, dep, options, (err) => {
47
49
  callback(err);
48
50
  });
49
51
  });
package/lib/Entrypoint.js CHANGED
@@ -6,6 +6,7 @@
6
6
  "use strict";
7
7
 
8
8
  const ChunkGroup = require("./ChunkGroup");
9
+ const SortableSet = require("./util/SortableSet");
9
10
 
10
11
  /** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescription */
11
12
  /** @typedef {import("./Chunk")} Chunk */
@@ -38,6 +39,8 @@ class Entrypoint extends ChunkGroup {
38
39
  this._entrypointChunk = undefined;
39
40
  /** @type {boolean} */
40
41
  this._initial = initial;
42
+ /** @type {SortableSet<Entrypoint>} */
43
+ this._dependOn = new SortableSet();
41
44
  }
42
45
 
43
46
  /**
@@ -96,6 +99,22 @@ class Entrypoint extends ChunkGroup {
96
99
  if (this._entrypointChunk === oldChunk) this._entrypointChunk = newChunk;
97
100
  return super.replaceChunk(oldChunk, newChunk);
98
101
  }
102
+
103
+ /**
104
+ * @param {Entrypoint} entrypoint the entrypoint
105
+ * @returns {void}
106
+ */
107
+ addDependOn(entrypoint) {
108
+ this._dependOn.add(entrypoint);
109
+ }
110
+
111
+ /**
112
+ * @param {Entrypoint} entrypoint the entrypoint
113
+ * @returns {boolean} true if the entrypoint is in the dependOn set
114
+ */
115
+ dependOn(entrypoint) {
116
+ return this._dependOn.has(entrypoint);
117
+ }
99
118
  }
100
119
 
101
120
  module.exports = Entrypoint;
@@ -9,10 +9,7 @@ const WebpackError = require("./WebpackError");
9
9
  const makeSerializable = require("./util/makeSerializable");
10
10
 
11
11
  /** @typedef {import("./Module")} Module */
12
- /** @typedef {import("./Compilation")} Compilation */
13
12
  /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
14
- /** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
15
- /** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
16
13
  /** @typedef {"asyncWebAssembly" | "topLevelAwait" | "external promise" | "external script" | "external import" | "external module"} Feature */
17
14
 
18
15
  class EnvironmentNotSupportAsyncWarning extends WebpackError {