webpack 5.107.1 → 5.108.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 (360) hide show
  1. package/hot/dev-server.js +2 -0
  2. package/lib/APIPlugin.js +8 -4
  3. package/lib/CacheFacade.js +7 -0
  4. package/lib/Chunk.js +4 -0
  5. package/lib/ChunkGraph.js +30 -9
  6. package/lib/CircularModulesPlugin.js +190 -0
  7. package/lib/CleanPlugin.js +2 -1
  8. package/lib/Compilation.js +396 -65
  9. package/lib/Compiler.js +52 -14
  10. package/lib/ConcatenationScope.js +10 -3
  11. package/lib/ContextExclusionPlugin.js +1 -0
  12. package/lib/ContextModule.js +92 -47
  13. package/lib/ContextModuleFactory.js +45 -38
  14. package/lib/ContextReplacementPlugin.js +4 -0
  15. package/lib/DefinePlugin.js +89 -15
  16. package/lib/Dependency.js +111 -7
  17. package/lib/EntryOptionPlugin.js +39 -2
  18. package/lib/EntryPlugin.js +2 -0
  19. package/lib/ExportsInfo.js +314 -73
  20. package/lib/ExternalModule.js +82 -34
  21. package/lib/ExternalModuleFactoryPlugin.js +1 -0
  22. package/lib/ExternalsPlugin.js +1 -0
  23. package/lib/FileSystemInfo.js +173 -23
  24. package/lib/FlagAllModulesAsUsedPlugin.js +1 -5
  25. package/lib/FlagDependencyExportsPlugin.js +23 -0
  26. package/lib/FlagDependencyUsagePlugin.js +87 -5
  27. package/lib/FlagEntryExportAsUsedPlugin.js +2 -0
  28. package/lib/Generator.js +8 -0
  29. package/lib/HotModuleReplacementPlugin.js +65 -28
  30. package/lib/IgnorePlugin.js +1 -0
  31. package/lib/InitFragment.js +5 -0
  32. package/lib/JavascriptMetaInfoPlugin.js +7 -5
  33. package/lib/LazyBarrel.js +361 -0
  34. package/lib/LoaderTargetPlugin.js +1 -0
  35. package/lib/Module.js +21 -42
  36. package/lib/ModuleGraph.js +3 -2
  37. package/lib/ModuleProfile.js +27 -1
  38. package/lib/ModuleTemplate.js +2 -0
  39. package/lib/MultiCompiler.js +16 -0
  40. package/lib/MultiStats.js +1 -0
  41. package/lib/MultiWatching.js +2 -0
  42. package/lib/NodeStuffPlugin.js +22 -17
  43. package/lib/NormalModule.js +557 -77
  44. package/lib/NormalModuleReplacementPlugin.js +2 -0
  45. package/lib/PrefetchPlugin.js +2 -0
  46. package/lib/ProgressPlugin.js +9 -1
  47. package/lib/ProvidePlugin.js +1 -0
  48. package/lib/RawModule.js +20 -16
  49. package/lib/RecordIdsPlugin.js +1 -0
  50. package/lib/RuntimeGlobals.js +5 -0
  51. package/lib/RuntimePlugin.js +58 -26
  52. package/lib/RuntimeTemplate.js +278 -21
  53. package/lib/SelfModuleFactory.js +1 -0
  54. package/lib/SourceMapDevToolPlugin.js +105 -30
  55. package/lib/Stats.js +1 -0
  56. package/lib/Template.js +8 -2
  57. package/lib/TemplatedPathPlugin.js +473 -131
  58. package/lib/WarnCaseSensitiveModulesPlugin.js +1 -0
  59. package/lib/WarnDeprecatedOptionPlugin.js +4 -0
  60. package/lib/WarnNoModeSetPlugin.js +1 -0
  61. package/lib/WatchIgnorePlugin.js +1 -0
  62. package/lib/Watching.js +9 -0
  63. package/lib/WebpackOptionsApply.js +50 -5
  64. package/lib/asset/AssetBytesGenerator.js +11 -3
  65. package/lib/asset/AssetGenerator.js +47 -22
  66. package/lib/asset/AssetModule.js +47 -0
  67. package/lib/asset/AssetModulesPlugin.js +14 -14
  68. package/lib/asset/AssetParser.js +2 -2
  69. package/lib/asset/AssetSourceGenerator.js +8 -0
  70. package/lib/asset/RawDataUrlModule.js +12 -13
  71. package/lib/buildChunkGraph.js +88 -9
  72. package/lib/bun/BunTargetPlugin.js +48 -0
  73. package/lib/cache/AddBuildDependenciesPlugin.js +1 -0
  74. package/lib/cache/AddManagedPathsPlugin.js +3 -0
  75. package/lib/cache/IdleFileCachePlugin.js +4 -0
  76. package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
  77. package/lib/cache/PackFileCacheStrategy.js +1 -0
  78. package/lib/cache/ResolverCachePlugin.js +2 -0
  79. package/lib/cache/getLazyHashedEtag.js +9 -2
  80. package/lib/cache/mergeEtags.js +2 -0
  81. package/lib/cli.js +109 -19
  82. package/lib/config/browserslistTargetHandler.js +99 -0
  83. package/lib/config/defaults.js +147 -7
  84. package/lib/config/defineConfig.js +31 -0
  85. package/lib/config/normalization.js +5 -0
  86. package/lib/config/target.js +181 -2
  87. package/lib/container/ContainerEntryModule.js +15 -14
  88. package/lib/container/ContainerExposedDependency.js +2 -2
  89. package/lib/container/ContainerReferencePlugin.js +1 -1
  90. package/lib/container/FallbackDependency.js +5 -7
  91. package/lib/container/FallbackModule.js +10 -9
  92. package/lib/container/RemoteModule.js +20 -10
  93. package/lib/container/RemoteRuntimeModule.js +14 -12
  94. package/lib/css/CssGenerator.js +353 -327
  95. package/lib/css/CssInjectStyleRuntimeModule.js +36 -8
  96. package/lib/css/CssLoadingRuntimeModule.js +118 -47
  97. package/lib/css/CssModule.js +52 -23
  98. package/lib/css/CssModulesPlugin.js +107 -124
  99. package/lib/css/CssParser.js +2759 -2205
  100. package/lib/css/syntax.js +2859 -0
  101. package/lib/debug/ProfilingPlugin.js +2 -0
  102. package/lib/deno/DenoTargetPlugin.js +47 -0
  103. package/lib/dependencies/AMDDefineDependency.js +22 -17
  104. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +1 -0
  105. package/lib/dependencies/AMDRequireArrayDependency.js +7 -11
  106. package/lib/dependencies/AMDRequireContextDependency.js +7 -11
  107. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -0
  108. package/lib/dependencies/AMDRequireDependency.js +24 -20
  109. package/lib/dependencies/CachedConstDependency.js +3 -0
  110. package/lib/dependencies/CommonJsDependencyHelpers.js +1 -0
  111. package/lib/dependencies/CommonJsExportRequireDependency.js +79 -31
  112. package/lib/dependencies/CommonJsExportsDependency.js +21 -16
  113. package/lib/dependencies/CommonJsExportsParserPlugin.js +230 -7
  114. package/lib/dependencies/CommonJsFullRequireDependency.js +27 -19
  115. package/lib/dependencies/CommonJsImportsParserPlugin.js +51 -16
  116. package/lib/dependencies/CommonJsPlugin.js +1 -1
  117. package/lib/dependencies/CommonJsRequireContextDependency.js +10 -13
  118. package/lib/dependencies/CommonJsRequireDependency.js +42 -11
  119. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -14
  120. package/lib/dependencies/ConstDependency.js +16 -11
  121. package/lib/dependencies/ContextDependency.js +4 -0
  122. package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -1
  123. package/lib/dependencies/ContextElementDependency.js +23 -14
  124. package/lib/dependencies/CreateRequireParserPlugin.js +1 -0
  125. package/lib/dependencies/CreateScriptUrlDependency.js +5 -7
  126. package/lib/dependencies/CriticalDependencyWarning.js +1 -0
  127. package/lib/dependencies/CssIcssExportDependency.js +512 -574
  128. package/lib/dependencies/CssIcssImportDependency.js +9 -9
  129. package/lib/dependencies/CssIcssSymbolDependency.js +22 -15
  130. package/lib/dependencies/CssImportDependency.js +25 -1
  131. package/lib/dependencies/CssUrlDependency.js +23 -14
  132. package/lib/dependencies/DllEntryDependency.js +9 -13
  133. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  134. package/lib/dependencies/ExportsInfoDependency.js +12 -12
  135. package/lib/dependencies/ExternalModuleDependency.js +8 -5
  136. package/lib/dependencies/ExternalModuleInitFragment.js +7 -5
  137. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +13 -10
  138. package/lib/dependencies/HarmonyAcceptDependency.js +11 -11
  139. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -0
  140. package/lib/dependencies/HarmonyDetectionParserPlugin.js +47 -22
  141. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +28 -2
  142. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +46 -22
  143. package/lib/dependencies/HarmonyExportExpressionDependency.js +107 -30
  144. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -9
  145. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +109 -31
  146. package/lib/dependencies/HarmonyExportInitFragment.js +22 -20
  147. package/lib/dependencies/HarmonyExportSpecifierDependency.js +83 -18
  148. package/lib/dependencies/HarmonyExports.js +4 -1
  149. package/lib/dependencies/HarmonyImportDependency.js +24 -0
  150. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +110 -74
  151. package/lib/dependencies/HarmonyImportGuard.js +254 -0
  152. package/lib/dependencies/HarmonyImportSideEffectDependency.js +18 -1
  153. package/lib/dependencies/HarmonyImportSpecifierDependency.js +118 -14
  154. package/lib/dependencies/HarmonyLinkingError.js +1 -0
  155. package/lib/dependencies/HarmonyModulesPlugin.js +1 -0
  156. package/lib/dependencies/{HtmlScriptSrcDependency.js → HtmlEntryDependency.js} +267 -154
  157. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  158. package/lib/dependencies/HtmlInlineScriptDependency.js +20 -27
  159. package/lib/dependencies/HtmlInlineStyleDependency.js +62 -11
  160. package/lib/dependencies/HtmlSourceDependency.js +18 -0
  161. package/lib/dependencies/ImportContextDependency.js +5 -9
  162. package/lib/dependencies/ImportDependency.js +44 -2
  163. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -0
  164. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -0
  165. package/lib/dependencies/ImportMetaPlugin.js +74 -30
  166. package/lib/dependencies/ImportParserPlugin.js +19 -0
  167. package/lib/dependencies/ImportWeakDependency.js +1 -0
  168. package/lib/dependencies/JsonExportsDependency.js +9 -9
  169. package/lib/dependencies/LoaderImportDependency.js +1 -0
  170. package/lib/dependencies/LocalModule.js +11 -12
  171. package/lib/dependencies/LocalModuleDependency.js +11 -13
  172. package/lib/dependencies/ModuleDecoratorDependency.js +9 -9
  173. package/lib/dependencies/ModuleDependency.js +7 -0
  174. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -0
  175. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -0
  176. package/lib/dependencies/ModuleInitFragmentDependency.js +15 -11
  177. package/lib/dependencies/ProvidedDependency.js +31 -27
  178. package/lib/dependencies/PureExpressionDependency.js +7 -9
  179. package/lib/dependencies/RequireEnsureDependency.js +12 -13
  180. package/lib/dependencies/RequireHeaderDependency.js +3 -4
  181. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +3 -0
  182. package/lib/dependencies/RequireResolveContextDependency.js +7 -11
  183. package/lib/dependencies/RequireResolveDependency.js +1 -0
  184. package/lib/dependencies/RequireResolveHeaderDependency.js +3 -5
  185. package/lib/dependencies/RuntimeRequirementsDependency.js +6 -7
  186. package/lib/dependencies/StaticExportsDependency.js +10 -10
  187. package/lib/dependencies/SystemPlugin.js +2 -0
  188. package/lib/dependencies/URLContextDependency.js +5 -7
  189. package/lib/dependencies/URLDependency.js +14 -16
  190. package/lib/dependencies/UnsupportedDependency.js +8 -13
  191. package/lib/dependencies/WebAssemblyExportImportedDependency.js +11 -16
  192. package/lib/dependencies/WebAssemblyImportDependency.js +14 -16
  193. package/lib/dependencies/WebpackIsIncludedDependency.js +1 -0
  194. package/lib/dependencies/WorkerDependency.js +19 -8
  195. package/lib/dependencies/WorkerPlugin.js +40 -10
  196. package/lib/dependencies/processExportInfo.js +13 -11
  197. package/lib/dll/DelegatedModule.js +29 -15
  198. package/lib/dll/DelegatedModuleFactoryPlugin.js +1 -0
  199. package/lib/dll/DelegatedPlugin.js +1 -0
  200. package/lib/dll/DllEntryPlugin.js +3 -0
  201. package/lib/dll/DllModule.js +3 -2
  202. package/lib/dll/DllPlugin.js +16 -0
  203. package/lib/dll/DllReferencePlugin.js +3 -0
  204. package/lib/dll/LibManifestPlugin.js +1 -0
  205. package/lib/electron/ElectronTargetPlugin.js +22 -4
  206. package/lib/errors/ConcurrentCompilationError.js +1 -0
  207. package/lib/errors/HookWebpackError.js +11 -13
  208. package/lib/errors/IgnoreErrorModuleFactory.js +1 -0
  209. package/lib/errors/InvalidDependenciesModuleWarning.js +2 -0
  210. package/lib/errors/JSONParseError.js +9 -8
  211. package/lib/errors/ModuleBuildError.js +16 -13
  212. package/lib/errors/ModuleDependencyError.js +8 -1
  213. package/lib/errors/ModuleDependencyWarning.js +8 -1
  214. package/lib/errors/ModuleError.js +5 -11
  215. package/lib/errors/ModuleHashingError.js +4 -0
  216. package/lib/errors/ModuleNotFoundError.js +3 -0
  217. package/lib/errors/ModuleParseError.js +5 -11
  218. package/lib/errors/ModuleRestoreError.js +2 -0
  219. package/lib/errors/ModuleStoreError.js +3 -0
  220. package/lib/errors/ModuleWarning.js +7 -11
  221. package/lib/errors/NodeStuffInWebError.js +1 -0
  222. package/lib/errors/NonErrorEmittedError.js +2 -0
  223. package/lib/errors/UnhandledSchemeError.js +1 -0
  224. package/lib/esm/ModuleChunkLoadingPlugin.js +0 -1
  225. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +28 -23
  226. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  227. package/lib/hmr/HotModuleReplacementRuntimeModule.js +7 -0
  228. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  229. package/lib/hmr/LazyCompilationPlugin.js +134 -6
  230. package/lib/html/HtmlGenerator.js +292 -50
  231. package/lib/html/HtmlModule.js +40 -0
  232. package/lib/html/HtmlModulesPlugin.js +287 -60
  233. package/lib/html/HtmlParser.js +1108 -1099
  234. package/lib/html/{walkHtmlTokens.js → syntax.js} +4701 -212
  235. package/lib/ids/IdHelpers.js +4 -2
  236. package/lib/index.js +19 -0
  237. package/lib/javascript/BasicEvaluatedExpression.js +1 -0
  238. package/lib/javascript/EnableChunkLoadingPlugin.js +1 -0
  239. package/lib/javascript/JavascriptGenerator.js +6 -2
  240. package/lib/javascript/JavascriptModule.js +54 -0
  241. package/lib/javascript/JavascriptModulesPlugin.js +257 -102
  242. package/lib/javascript/JavascriptParser.js +286 -159
  243. package/lib/json/JsonModule.js +40 -0
  244. package/lib/json/JsonModulesPlugin.js +7 -0
  245. package/lib/json/JsonParser.js +4 -2
  246. package/lib/library/AssignLibraryPlugin.js +5 -3
  247. package/lib/library/ExportPropertyLibraryPlugin.js +1 -0
  248. package/lib/library/FalseIIFEUmdWarning.js +1 -0
  249. package/lib/library/ModuleLibraryPlugin.js +54 -29
  250. package/lib/library/SystemLibraryPlugin.js +3 -3
  251. package/lib/node/NodeTargetPlugin.js +1 -0
  252. package/lib/node/NodeWatchFileSystem.js +38 -22
  253. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +10 -9
  254. package/lib/node/RequireChunkLoadingRuntimeModule.js +18 -16
  255. package/lib/optimize/ConcatenatedModule.js +397 -78
  256. package/lib/optimize/ConstExportsPlugin.js +211 -0
  257. package/lib/optimize/InlineExports.js +178 -0
  258. package/lib/optimize/InnerGraph.js +372 -275
  259. package/lib/optimize/InnerGraphPlugin.js +196 -99
  260. package/lib/optimize/ModuleConcatenationPlugin.js +56 -25
  261. package/lib/optimize/RealContentHashPlugin.js +14 -1
  262. package/lib/optimize/SideEffectsFlagPlugin.js +234 -64
  263. package/lib/runtime/AsyncModuleRuntimeModule.js +32 -30
  264. package/lib/runtime/AutoPublicPathRuntimeModule.js +11 -5
  265. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +1 -1
  266. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +6 -4
  267. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +33 -4
  268. package/lib/runtime/GetChunkFilenameRuntimeModule.js +82 -3
  269. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  270. package/lib/runtime/HasOwnPropertyRuntimeModule.js +1 -1
  271. package/lib/runtime/LoadScriptRuntimeModule.js +18 -13
  272. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +39 -26
  273. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +1 -1
  274. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  275. package/lib/runtime/RelativeUrlRuntimeModule.js +3 -2
  276. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -1
  277. package/lib/runtime/StartupEntrypointRuntimeModule.js +4 -3
  278. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  279. package/lib/schemes/HttpUriPlugin.js +3 -2
  280. package/lib/serialization/AggregateErrorSerializer.js +7 -6
  281. package/lib/serialization/ArraySerializer.js +4 -8
  282. package/lib/serialization/BinaryMiddleware.js +538 -468
  283. package/lib/serialization/DateObjectSerializer.js +2 -2
  284. package/lib/serialization/ErrorObjectSerializer.js +7 -6
  285. package/lib/serialization/MapObjectSerializer.js +5 -9
  286. package/lib/serialization/NullPrototypeObjectSerializer.js +7 -9
  287. package/lib/serialization/ObjectMiddleware.js +50 -13
  288. package/lib/serialization/PlainObjectSerializer.js +9 -8
  289. package/lib/serialization/RegExpObjectSerializer.js +2 -2
  290. package/lib/serialization/Serializer.js +1 -0
  291. package/lib/serialization/SetObjectSerializer.js +4 -8
  292. package/lib/sharing/ConsumeSharedModule.js +6 -7
  293. package/lib/sharing/ConsumeSharedPlugin.js +1 -0
  294. package/lib/sharing/ConsumeSharedRuntimeModule.js +46 -41
  295. package/lib/sharing/ProvideSharedDependency.js +30 -15
  296. package/lib/sharing/ProvideSharedModule.js +30 -11
  297. package/lib/sharing/ProvideSharedPlugin.js +4 -2
  298. package/lib/sharing/SharePlugin.js +3 -0
  299. package/lib/sharing/ShareRuntimeModule.js +18 -16
  300. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  301. package/lib/sharing/utils.js +1 -1
  302. package/lib/stats/DefaultStatsFactoryPlugin.js +4 -6
  303. package/lib/stats/DefaultStatsPrinterPlugin.js +14 -14
  304. package/lib/stats/StatsFactory.js +11 -9
  305. package/lib/stats/StatsPrinter.js +9 -2
  306. package/lib/url/URLParserPlugin.js +5 -2
  307. package/lib/util/AsyncQueue.js +10 -0
  308. package/lib/util/LazyBucketSortedSet.js +5 -0
  309. package/lib/util/LazySet.js +6 -4
  310. package/lib/util/LocConverter.js +11 -1
  311. package/lib/util/Semaphore.js +1 -0
  312. package/lib/util/SourceProcessor.js +106 -0
  313. package/lib/util/TupleSet.js +1 -0
  314. package/lib/util/WeakTupleMap.js +27 -1
  315. package/lib/util/chainedImports.js +3 -3
  316. package/lib/util/comparators.js +2 -2
  317. package/lib/util/concatenate.js +31 -7
  318. package/lib/util/createHash.js +0 -1
  319. package/lib/util/deterministicGrouping.js +19 -12
  320. package/lib/util/extractSourceMap.js +1 -1
  321. package/lib/util/findGraphRoots.js +2 -0
  322. package/lib/util/fs.js +16 -6
  323. package/lib/util/hash/DebugHash.js +1 -0
  324. package/lib/util/hash/hash-digest.js +24 -15
  325. package/lib/util/identifier.js +7 -0
  326. package/lib/util/internalSerializables.js +11 -2
  327. package/lib/util/magicComment.js +42 -0
  328. package/lib/util/makeSerializable.js +1 -0
  329. package/lib/util/nonNumericOnlyHash.js +30 -1
  330. package/lib/util/property.js +7 -1
  331. package/lib/util/publicPathPlaceholder.js +64 -0
  332. package/lib/util/registerExternalSerializer.js +4 -4
  333. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  334. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +1 -1
  335. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +1 -96
  336. package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
  337. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +1 -1
  338. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  339. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +1 -0
  340. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +6 -3
  341. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +2 -1
  342. package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
  343. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +2 -0
  344. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +10 -0
  345. package/lib/wasm-sync/WebAssemblyParser.js +7 -3
  346. package/lib/web/JsonpChunkLoadingRuntimeModule.js +45 -39
  347. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +11 -10
  348. package/package.json +36 -28
  349. package/schemas/WebpackOptions.check.js +1 -1
  350. package/schemas/WebpackOptions.json +212 -3
  351. package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -1
  352. package/schemas/plugins/HtmlParserOptions.check.d.ts +7 -0
  353. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  354. package/schemas/plugins/HtmlParserOptions.json +3 -0
  355. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  356. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  357. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  358. package/types.d.ts +1592 -314
  359. package/lib/css/walkCssTokens.js +0 -2020
  360. package/lib/util/AppendOnlyStackedSet.js +0 -93
@@ -16,6 +16,7 @@ const { getEntryRuntime, mergeRuntime } = require("./util/runtime");
16
16
  /** @typedef {import("./DependenciesBlock")} DependenciesBlock */
17
17
  /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
18
18
  /** @typedef {import("./Entrypoint")} Entrypoint */
19
+ /** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
19
20
  /** @typedef {import("./Module")} Module */
20
21
  /** @typedef {import("./ModuleGraph")} ModuleGraph */
21
22
  /** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
@@ -241,6 +242,44 @@ const extractBlockModules = (module, moduleGraph, runtime, blockModulesMap) => {
241
242
  }
242
243
  };
243
244
 
245
+ /**
246
+ * Derives block modules for another runtime from an already extracted result.
247
+ * Only the merged active state of each connection group can differ per
248
+ * runtime; modules and connection groups are reused. When all states turn
249
+ * out equal, the tuple array is shared instead of copied.
250
+ * @param {Module} module the root module
251
+ * @param {BlockModulesMap} source map containing the extracted result for all blocks of the module
252
+ * @param {RuntimeSpec} runtime runtime to derive for
253
+ * @param {BlockModulesMap} blockModulesMap block modules map to fill
254
+ */
255
+ const deriveBlockModules = (module, source, runtime, blockModulesMap) => {
256
+ /** @type {DependenciesBlock[]} */
257
+ const queue = [module];
258
+ while (queue.length > 0) {
259
+ const block = /** @type {DependenciesBlock} */ (queue.pop());
260
+ const sourceModules =
261
+ /** @type {BlockModulesInFlattenTuples} */
262
+ (source.get(block));
263
+ let target = sourceModules;
264
+ for (let i = 0, len = sourceModules.length; i < len; i += 3) {
265
+ const state = getActiveStateOfConnections(
266
+ /** @type {ModuleGraphConnection[]} */ (sourceModules[i + 2]),
267
+ runtime
268
+ );
269
+ if (target === sourceModules) {
270
+ if (state === sourceModules[i + 1]) continue;
271
+ // states diverged, copy (states before i are identical)
272
+ target = [...sourceModules];
273
+ }
274
+ target[i + 1] = state;
275
+ }
276
+ blockModulesMap.set(block, target);
277
+ for (const b of block.blocks) {
278
+ queue.push(b);
279
+ }
280
+ }
281
+ };
282
+
244
283
  /**
245
284
  * Processes the provided logger.
246
285
  * @param {Logger} logger a logger
@@ -267,8 +306,10 @@ const visitModules = (
267
306
  /** @type {Map<RuntimeSpec, BlockModulesMap>} */
268
307
  const blockModulesRuntimeMap = new Map();
269
308
 
270
- /** @type {BlockModulesMap | undefined} */
271
- let blockModulesMap;
309
+ // map containing the first extraction per root module,
310
+ // other runtimes derive their result from it
311
+ /** @type {Map<Module, BlockModulesMap>} */
312
+ const firstBlockModulesMapByModule = new Map();
272
313
 
273
314
  /** @type {Map<Module, number>} */
274
315
  const ordinalByModule = new Map();
@@ -302,7 +343,7 @@ const visitModules = (
302
343
  * @returns {BlockModulesInFlattenTuples | undefined} block modules in flatten tuples
303
344
  */
304
345
  const getBlockModules = (block, runtime) => {
305
- blockModulesMap = blockModulesRuntimeMap.get(runtime);
346
+ let blockModulesMap = blockModulesRuntimeMap.get(runtime);
306
347
  if (blockModulesMap === undefined) {
307
348
  /** @type {BlockModulesMap} */
308
349
  blockModulesMap = new Map();
@@ -320,18 +361,33 @@ const visitModules = (
320
361
  () => {
321
362
  logger.time("visitModules: prepare");
322
363
  const map = new Map();
323
- extractBlockModules(module, moduleGraph, runtime, map);
364
+ const source = firstBlockModulesMapByModule.get(module);
365
+ if (source !== undefined) {
366
+ deriveBlockModules(module, source, runtime, map);
367
+ } else {
368
+ extractBlockModules(module, moduleGraph, runtime, map);
369
+ }
324
370
  logger.timeAggregate("visitModules: prepare");
325
371
  return map;
326
372
  }
327
373
  );
374
+ // allow other runtimes to derive from a memCache hit too
375
+ if (!firstBlockModulesMapByModule.has(module)) {
376
+ firstBlockModulesMapByModule.set(module, map);
377
+ }
328
378
  for (const [block, blockModules] of map) {
329
379
  blockModulesMap.set(block, blockModules);
330
380
  }
331
381
  return map.get(block);
332
382
  }
333
383
  logger.time("visitModules: prepare");
334
- extractBlockModules(module, moduleGraph, runtime, blockModulesMap);
384
+ const source = firstBlockModulesMapByModule.get(module);
385
+ if (source !== undefined) {
386
+ deriveBlockModules(module, source, runtime, blockModulesMap);
387
+ } else {
388
+ extractBlockModules(module, moduleGraph, runtime, blockModulesMap);
389
+ firstBlockModulesMapByModule.set(module, blockModulesMap);
390
+ }
335
391
  blockModules =
336
392
  /** @type {BlockModulesInFlattenTuples} */
337
393
  (blockModulesMap.get(block));
@@ -581,7 +637,27 @@ const visitModules = (
581
637
  }
582
638
  } else {
583
639
  entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup);
584
- // TODO merge entryOptions
640
+ // Fill in options the existing entrypoint hasn't set yet. We never
641
+ // overwrite: blocks that dedupe to one entrypoint (e.g. several
642
+ // workers pointing at the same module) legitimately carry distinct
643
+ // values such as `runtime`, so the first block to create the
644
+ // entrypoint wins and later ones only contribute missing keys.
645
+ // `name` is excluded: it is the entrypoint's identity, fixed at
646
+ // creation (and used to key namedChunkGroups), so back-filling it
647
+ // from a block that deduped in via its module would leave
648
+ // `entrypoint.name` out of sync and make module codegen
649
+ // order-dependent, which breaks persistent caching.
650
+ const existingOptions = entrypoint.options;
651
+ for (const key_ of Object.keys(entryOptions)) {
652
+ const key =
653
+ /** @type {keyof EntryOptions} */
654
+ (key_);
655
+ if (key === "name") continue;
656
+ if (entryOptions[key] === undefined) continue;
657
+ if (existingOptions[key] !== undefined) continue;
658
+ /** @type {EntryOptions[keyof EntryOptions]} */
659
+ (existingOptions[key]) = entryOptions[key];
660
+ }
585
661
  entrypoint.addOrigin(
586
662
  module,
587
663
  /** @type {DependencyLocation} */ (b.loc),
@@ -733,7 +809,6 @@ const visitModules = (
733
809
  continue;
734
810
  }
735
811
 
736
- const refOrdinal = /** @type {number} */ getModuleOrdinal(refModule);
737
812
  const activeState = /** @type {ConnectionState} */ (
738
813
  blockModules[i + 1]
739
814
  );
@@ -744,7 +819,10 @@ const visitModules = (
744
819
  skipConnectionBuffer.push([refModule, connections]);
745
820
  // We skip inactive connections
746
821
  if (activeState === false) continue;
747
- } else if (isOrdinalSetInMask(minAvailableModules, refOrdinal)) {
822
+ } else if (
823
+ // assigning ordinals lazily here keeps masks small
824
+ isOrdinalSetInMask(minAvailableModules, getModuleOrdinal(refModule))
825
+ ) {
748
826
  // already in parent chunks, skip it for now
749
827
  skipBuffer.push(refModule);
750
828
  continue;
@@ -1290,7 +1368,8 @@ const connectChunkGroups = (
1290
1368
  // connections and modules can only create one version
1291
1369
  // TODO maybe decide this per runtime
1292
1370
  if (
1293
- // TODO is this needed?
1371
+ // Blocks with nested blocks must stay connected — skipping orphans the
1372
+ // nested block's chunk group from this block's chunk group parent.
1294
1373
  !blocksWithNestedBlocks.has(block) &&
1295
1374
  connections.every(({ chunkGroup, originChunkGroupInfo }) =>
1296
1375
  areModulesAvailable(
@@ -0,0 +1,48 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author sheo13666q @sheo13666q
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const ExternalsPlugin = require("../ExternalsPlugin");
9
+ const NodeTargetPlugin = require("../node/NodeTargetPlugin");
10
+
11
+ /** @typedef {import("../Compiler")} Compiler */
12
+
13
+ // Bun exposes the node.js core modules; externalize them with the `node:`
14
+ // specifier (Bun resolves both forms) like the deno target.
15
+ // cspell:word pnpapi
16
+ const coreModules = new Set(
17
+ NodeTargetPlugin.builtins.filter(
18
+ (builtin) => typeof builtin === "string" && builtin !== "pnpapi"
19
+ )
20
+ );
21
+
22
+ // Bun's own built-in modules (`bun`, `bun:sqlite`, ...) are provided by the
23
+ // runtime, never bundled.
24
+ const BUN_BUILTINS = /^bun(?::|$)/;
25
+
26
+ class BunTargetPlugin {
27
+ /**
28
+ * Applies the plugin by registering its hooks on the compiler.
29
+ * @param {Compiler} compiler the compiler instance
30
+ * @returns {void}
31
+ */
32
+ apply(compiler) {
33
+ new ExternalsPlugin(
34
+ (dependency) =>
35
+ dependency.category === "commonjs" ? "node-commonjs" : "module-import",
36
+ ({ request }, callback) => {
37
+ if (!request) return callback();
38
+ if (request.startsWith("node:") || BUN_BUILTINS.test(request)) {
39
+ return callback(null, request);
40
+ }
41
+ if (coreModules.has(request)) return callback(null, `node:${request}`);
42
+ callback();
43
+ }
44
+ ).apply(compiler);
45
+ }
46
+ }
47
+
48
+ module.exports = BunTargetPlugin;
@@ -15,6 +15,7 @@ class AddBuildDependenciesPlugin {
15
15
  * @param {Iterable<string>} buildDependencies list of build dependencies
16
16
  */
17
17
  constructor(buildDependencies) {
18
+ /** @type {Set<string>} */
18
19
  this.buildDependencies = new Set(buildDependencies);
19
20
  }
20
21
 
@@ -15,8 +15,11 @@ class AddManagedPathsPlugin {
15
15
  * @param {Iterable<string | RegExp>} unmanagedPaths list of unmanaged paths
16
16
  */
17
17
  constructor(managedPaths, immutablePaths, unmanagedPaths) {
18
+ /** @type {Set<string | RegExp>} */
18
19
  this.managedPaths = new Set(managedPaths);
20
+ /** @type {Set<string | RegExp>} */
19
21
  this.immutablePaths = new Set(immutablePaths);
22
+ /** @type {Set<string | RegExp>} */
20
23
  this.unmanagedPaths = new Set(unmanagedPaths);
21
24
  }
22
25
 
@@ -28,9 +28,13 @@ class IdleFileCachePlugin {
28
28
  idleTimeoutForInitialStore,
29
29
  idleTimeoutAfterLargeChanges
30
30
  ) {
31
+ /** @type {PackFileCacheStrategy} */
31
32
  this.strategy = strategy;
33
+ /** @type {number} */
32
34
  this.idleTimeout = idleTimeout;
35
+ /** @type {number} */
33
36
  this.idleTimeoutForInitialStore = idleTimeoutForInitialStore;
37
+ /** @type {number} */
34
38
  this.idleTimeoutAfterLargeChanges = idleTimeoutAfterLargeChanges;
35
39
  }
36
40
 
@@ -25,6 +25,7 @@ class MemoryWithGcCachePlugin {
25
25
  * @param {MemoryWithGcCachePluginOptions} options options
26
26
  */
27
27
  constructor({ maxGenerations }) {
28
+ /** @type {number} */
28
29
  this._maxGenerations = maxGenerations;
29
30
  }
30
31
 
@@ -710,6 +710,7 @@ class PackContentItems {
710
710
  * @param {Content} map items
711
711
  */
712
712
  constructor(map) {
713
+ /** @type {Content} */
713
714
  this.map = map;
714
715
  }
715
716
 
@@ -36,7 +36,9 @@ class CacheEntry {
36
36
  * @param {Snapshot} snapshot snapshot
37
37
  */
38
38
  constructor(result, snapshot) {
39
+ /** @type {ResolveRequest} */
39
40
  this.result = result;
41
+ /** @type {Snapshot} */
40
42
  this.snapshot = snapshot;
41
43
  }
42
44
 
@@ -25,7 +25,7 @@ class LazyHashedEtag {
25
25
  * @param {HashFunction} hashFunction the hash function to use
26
26
  */
27
27
  constructor(obj, hashFunction = DEFAULTS.HASH_FUNCTION) {
28
- /** @type {HashableObject} */
28
+ /** @type {HashableObject | undefined} */
29
29
  this._obj = obj;
30
30
  /** @type {undefined | string} */
31
31
  this._hash = undefined;
@@ -40,8 +40,15 @@ class LazyHashedEtag {
40
40
  toString() {
41
41
  if (this._hash === undefined) {
42
42
  const hash = createHash(this._hashFunction);
43
- this._obj.updateHash(hash);
43
+ /** @type {HashableObject} */
44
+ (this._obj).updateHash(hash);
44
45
  this._hash = hash.digest("base64");
46
+ // Drop the captured object once the hash is memoized. The hash is
47
+ // never reset, so we never need `_obj` again — and many callers
48
+ // (e.g. `SourceMapDevToolPlugin`, `RealContentHashPlugin`) capture
49
+ // a heavy `CachedSource` here that would otherwise stay reachable
50
+ // through this etag for the lifetime of the compilation cache.
51
+ this._obj = undefined;
45
52
  }
46
53
  return this._hash;
47
54
  }
@@ -14,7 +14,9 @@ class MergedEtag {
14
14
  * @param {Etag} b second
15
15
  */
16
16
  constructor(a, b) {
17
+ /** @type {Etag} */
17
18
  this.a = a;
19
+ /** @type {Etag} */
18
20
  this.b = b;
19
21
  }
20
22
 
package/lib/cli.js CHANGED
@@ -17,15 +17,15 @@ const webpackSchema =
17
17
  /** @typedef {JSONSchema4 | JSONSchema6 | JSONSchema7} JSONSchema */
18
18
  /** @typedef {JSONSchema & { absolutePath: boolean, instanceof: string, cli: { helper?: boolean, exclude?: boolean, description?: string, negatedDescription?: string, resetDescription?: string } }} Schema */
19
19
 
20
- // TODO add originPath to PathItem for better errors
21
20
  /**
22
21
  * Defines the path item type used by this module.
23
22
  * @typedef {object} PathItem
24
23
  * @property {Schema} schema the part of the schema
25
24
  * @property {string} path the path in the config
25
+ * @property {string} segment the JSON pointer segment of this schema part (absolute when starting with "#")
26
26
  */
27
27
 
28
- /** @typedef {"unknown-argument" | "unexpected-non-array-in-path" | "unexpected-non-object-in-path" | "multiple-values-unexpected" | "invalid-value"} ProblemType */
28
+ /** @typedef {"unknown-argument" | "unexpected-non-array-in-path" | "unexpected-non-object-in-path" | "prototype-pollution-in-path" | "multiple-values-unexpected" | "invalid-value"} ProblemType */
29
29
 
30
30
  /** @typedef {string | number | boolean | RegExp} Value */
31
31
 
@@ -181,6 +181,12 @@ const getArguments = (schema = webpackSchema) => {
181
181
  values: schemaPart.enum
182
182
  };
183
183
  }
184
+ if (schemaPart.const !== undefined) {
185
+ return {
186
+ type: "enum",
187
+ values: [schemaPart.const]
188
+ };
189
+ }
184
190
  switch (schemaPart.type) {
185
191
  case "number":
186
192
  return {
@@ -233,6 +239,20 @@ const getArguments = (schema = webpackSchema) => {
233
239
  };
234
240
  };
235
241
 
242
+ /**
243
+ * Joins the per-item segments into a JSON pointer (built only when needed).
244
+ * @param {PathItem[]} path full path in schema (deepest item first)
245
+ * @returns {string} JSON pointer to the deepest schema part
246
+ */
247
+ const getOriginPath = (path) => {
248
+ let origin = "";
249
+ for (let i = path.length - 1; i >= 0; i--) {
250
+ const { segment } = path[i];
251
+ origin = segment[0] === "#" ? segment : origin + segment;
252
+ }
253
+ return origin;
254
+ };
255
+
236
256
  /**
237
257
  * Adds the provided path to this object.
238
258
  * @param {PathItem[]} path full path in schema
@@ -283,7 +303,11 @@ const getArguments = (schema = webpackSchema) => {
283
303
  ) {
284
304
  if (multiple) {
285
305
  throw new Error(
286
- `Conflicting schema for ${path[0].path} with ${argConfig.type} type (array type must be before single item type)`
306
+ `Conflicting schema for ${path[0].path} (${getOriginPath(
307
+ path
308
+ )}) with ${
309
+ argConfig.type
310
+ } type (array type must be before single item type)`
287
311
  );
288
312
  }
289
313
  return 0;
@@ -294,18 +318,25 @@ const getArguments = (schema = webpackSchema) => {
294
318
  return 1;
295
319
  };
296
320
 
297
- // TODO support `not` and `if/then/else`
298
- // TODO support `const`, but we don't use it on our schema
321
+ // TODO support `not`
299
322
  /**
300
323
  * Returns added arguments.
301
324
  * @param {Schema} schemaPart the current schema
302
- * @param {string} schemaPath the current path in the schema
325
+ * @param {string} schemaPath the current path in the config
303
326
  * @param {PathItem[]} path all previous visited schemaParts
304
327
  * @param {string | null} inArray if inside of an array, the path to the array
328
+ * @param {string} segment the JSON pointer segment of the current schema
305
329
  * @returns {number} added arguments
306
330
  */
307
- const traverse = (schemaPart, schemaPath = "", path = [], inArray = null) => {
331
+ const traverse = (
332
+ schemaPart,
333
+ schemaPath = "",
334
+ path = [],
335
+ inArray = null,
336
+ segment = "#"
337
+ ) => {
308
338
  while (schemaPart.$ref) {
339
+ segment = schemaPart.$ref;
309
340
  schemaPart = getSchemaPart(schemaPart.$ref);
310
341
  }
311
342
 
@@ -320,12 +351,33 @@ const getArguments = (schema = webpackSchema) => {
320
351
  if (schemaPart.cli && schemaPart.cli.exclude) return 0;
321
352
 
322
353
  /** @type {PathItem[]} */
323
- const fullPath = [{ schema: schemaPart, path: schemaPath }, ...path];
354
+ const fullPath = [
355
+ { schema: schemaPart, path: schemaPath, segment },
356
+ ...path
357
+ ];
324
358
 
325
359
  let addedArguments = 0;
326
360
 
327
361
  addedArguments += addFlag(fullPath, Boolean(inArray));
328
362
 
363
+ // Collect flags from both branches of a conditional schema.
364
+ const conditional = /** @type {JSONSchema7} */ (schemaPart);
365
+ if (conditional.if) {
366
+ for (const key of /** @type {const} */ (["if", "then", "else"])) {
367
+ const subSchema = conditional[key];
368
+ if (subSchema && typeof subSchema === "object") {
369
+ addedArguments += traverse(
370
+ /** @type {Schema} */
371
+ (subSchema),
372
+ schemaPath,
373
+ fullPath,
374
+ inArray,
375
+ `/${key}`
376
+ );
377
+ }
378
+ }
379
+ }
380
+
329
381
  if (schemaPart.type === "object") {
330
382
  if (schemaPart.properties) {
331
383
  for (const property of Object.keys(schemaPart.properties)) {
@@ -334,7 +386,8 @@ const getArguments = (schema = webpackSchema) => {
334
386
  (schemaPart.properties[property]),
335
387
  schemaPath ? `${schemaPath}.${property}` : property,
336
388
  fullPath,
337
- inArray
389
+ inArray,
390
+ `/properties/${property}`
338
391
  );
339
392
  }
340
393
  }
@@ -354,7 +407,8 @@ const getArguments = (schema = webpackSchema) => {
354
407
  (item),
355
408
  `${schemaPath}.${i}`,
356
409
  fullPath,
357
- schemaPath
410
+ schemaPath,
411
+ `/items/${i}`
358
412
  );
359
413
  }
360
414
 
@@ -366,7 +420,8 @@ const getArguments = (schema = webpackSchema) => {
366
420
  (schemaPart.items),
367
421
  `${schemaPath}[]`,
368
422
  fullPath,
369
- schemaPath
423
+ schemaPath,
424
+ "/items"
370
425
  );
371
426
 
372
427
  if (addedArguments > 0) {
@@ -377,10 +432,16 @@ const getArguments = (schema = webpackSchema) => {
377
432
  return addedArguments;
378
433
  }
379
434
 
380
- const maybeOf = schemaPart.oneOf || schemaPart.anyOf || schemaPart.allOf;
435
+ const ofKey = schemaPart.oneOf
436
+ ? "oneOf"
437
+ : schemaPart.anyOf
438
+ ? "anyOf"
439
+ : schemaPart.allOf
440
+ ? "allOf"
441
+ : undefined;
381
442
 
382
- if (maybeOf) {
383
- const items = maybeOf;
443
+ if (ofKey) {
444
+ const items = /** @type {Schema[]} */ (schemaPart[ofKey]);
384
445
 
385
446
  for (let i = 0; i < items.length; i++) {
386
447
  addedArguments += traverse(
@@ -388,7 +449,8 @@ const getArguments = (schema = webpackSchema) => {
388
449
  (items[i]),
389
450
  schemaPath,
390
451
  fullPath,
391
- inArray
452
+ inArray,
453
+ `/${ofKey}/${i}`
392
454
  );
393
455
  }
394
456
 
@@ -449,6 +511,14 @@ const cliAddedItems = new WeakMap();
449
511
 
450
512
  /** @typedef {string | number} Property */
451
513
 
514
+ /**
515
+ * Whether a path segment would walk into the prototype chain.
516
+ * @param {string} name path segment
517
+ * @returns {boolean} true when the segment is unsafe to write through
518
+ */
519
+ const isUnsafeKey = (name) =>
520
+ name === "__proto__" || name === "constructor" || name === "prototype";
521
+
452
522
  /**
453
523
  * Gets object and property.
454
524
  * @param {ObjectConfiguration} config configuration
@@ -465,6 +535,14 @@ const getObjectAndProperty = (config, schemaPath, index = 0) => {
465
535
  for (const part of parts) {
466
536
  const isArray = part.endsWith("[]");
467
537
  const name = isArray ? part.slice(0, -2) : part;
538
+ if (isUnsafeKey(name)) {
539
+ return {
540
+ problem: {
541
+ type: "prototype-pollution-in-path",
542
+ path: parts.slice(0, i).join(".")
543
+ }
544
+ };
545
+ }
468
546
  let value = current[name];
469
547
  if (isArray) {
470
548
  if (value === undefined) {
@@ -511,6 +589,14 @@ const getObjectAndProperty = (config, schemaPath, index = 0) => {
511
589
  current = value;
512
590
  i++;
513
591
  }
592
+ if (isUnsafeKey(property.endsWith("[]") ? property.slice(0, -2) : property)) {
593
+ return {
594
+ problem: {
595
+ type: "prototype-pollution-in-path",
596
+ path: parts.join(".")
597
+ }
598
+ };
599
+ }
514
600
  const value = current[property];
515
601
  if (property.endsWith("[]")) {
516
602
  const name = property.slice(0, -2);
@@ -748,16 +834,20 @@ const processArguments = (args, config, values) => {
748
834
  const isColorSupported = () => {
749
835
  const { env = {}, argv = [], platform = "" } = process;
750
836
 
751
- const isDisabled = "NO_COLOR" in env || argv.includes("--no-color");
752
- const isForced = "FORCE_COLOR" in env || argv.includes("--color");
837
+ // Read values instead of using `in`: Deno's and Bun's `process.env` honor
838
+ // property access but not the `in`/`has` trap, so `"X" in env` is unreliable.
839
+ const isDisabled = env.NO_COLOR !== undefined || argv.includes("--no-color");
840
+ const isForced = env.FORCE_COLOR !== undefined || argv.includes("--color");
753
841
  const isWindows = platform === "win32";
754
842
  const isDumbTerminal = env.TERM === "dumb";
755
843
 
756
844
  const isCompatibleTerminal = tty.isatty(1) && env.TERM && !isDumbTerminal;
757
845
 
758
846
  const isCI =
759
- "CI" in env &&
760
- ("GITHUB_ACTIONS" in env || "GITLAB_CI" in env || "CIRCLECI" in env);
847
+ env.CI !== undefined &&
848
+ (env.GITHUB_ACTIONS !== undefined ||
849
+ env.GITLAB_CI !== undefined ||
850
+ env.CIRCLECI !== undefined);
761
851
 
762
852
  return (
763
853
  !isDisabled &&
@@ -120,6 +120,44 @@ const resolve = (browsers) => {
120
120
  kaios: [2, 5],
121
121
  node: [6, 0]
122
122
  }),
123
+ let: rawChecker({
124
+ chrome: 49,
125
+ and_chr: 49,
126
+ edge: 12,
127
+ firefox: 44,
128
+ and_ff: 44,
129
+ // ie: Not supported
130
+ opera: 36,
131
+ op_mob: 36,
132
+ safari: [10, 0],
133
+ ios_saf: [10, 0],
134
+ samsung: [5, 0],
135
+ android: 49,
136
+ and_qq: [10, 4],
137
+ baidu: [13, 18],
138
+ and_uc: [12, 12],
139
+ kaios: [2, 5],
140
+ node: [6, 0]
141
+ }),
142
+ logicalAssignment: rawChecker({
143
+ chrome: 85,
144
+ and_chr: 85,
145
+ edge: 85,
146
+ firefox: 79,
147
+ and_ff: 79,
148
+ // ie: Not supported,
149
+ opera: 71,
150
+ op_mob: 60,
151
+ safari: 14,
152
+ ios_saf: 14,
153
+ samsung: [14, 0],
154
+ android: 85,
155
+ and_qq: [14, 9],
156
+ baidu: [13, 52],
157
+ and_uc: [15, 5],
158
+ kaios: [3, 0],
159
+ node: [15, 0]
160
+ }),
123
161
  methodShorthand: rawChecker({
124
162
  chrome: 47,
125
163
  and_chr: 47,
@@ -317,6 +355,62 @@ const resolve = (browsers) => {
317
355
  kaios: [3, 0],
318
356
  node: 14
319
357
  }),
358
+ symbol: rawChecker({
359
+ chrome: 38,
360
+ and_chr: 38,
361
+ edge: 12,
362
+ firefox: 36,
363
+ and_ff: 36,
364
+ // ie: Not supported,
365
+ opera: 25,
366
+ op_mob: 25,
367
+ safari: 9,
368
+ ios_saf: 9,
369
+ samsung: [3, 0],
370
+ android: 38,
371
+ and_qq: [10, 4],
372
+ and_uc: [12, 12],
373
+ kaios: [2, 5],
374
+ node: [0, 12]
375
+ }),
376
+ hasOwn: rawChecker({
377
+ chrome: 93,
378
+ and_chr: 93,
379
+ edge: 93,
380
+ firefox: 92,
381
+ and_ff: 92,
382
+ // ie: Not supported,
383
+ opera: 79,
384
+ op_mob: 66,
385
+ safari: [15, 4],
386
+ ios_saf: [15, 4],
387
+ samsung: 17,
388
+ android: 93,
389
+ // and_qq: Not supported
390
+ // baidu: Not supported
391
+ // and_uc: Not supported
392
+ // kaios: Not supported
393
+ node: [16, 9]
394
+ }),
395
+ spread: rawChecker({
396
+ chrome: 60,
397
+ and_chr: 60,
398
+ edge: 79,
399
+ firefox: 55,
400
+ and_ff: 55,
401
+ // ie: Not supported,
402
+ opera: 47,
403
+ op_mob: 44,
404
+ safari: [11, 1],
405
+ ios_saf: [11, 3],
406
+ samsung: [8, 2],
407
+ android: 60,
408
+ and_qq: [13, 1],
409
+ // baidu: Not supported
410
+ and_uc: [15, 5],
411
+ kaios: [3, 0],
412
+ node: [8, 3]
413
+ }),
320
414
  templateLiteral: rawChecker({
321
415
  chrome: 41,
322
416
  and_chr: 41,
@@ -380,6 +474,11 @@ const resolve = (browsers) => {
380
474
  rawChecker({
381
475
  node: [22, 16]
382
476
  }),
477
+ nodeBuiltinModuleGetter:
478
+ nodeProperty &&
479
+ rawChecker({
480
+ node: [22, 3]
481
+ }),
383
482
  require: nodeProperty
384
483
  };
385
484
  };