Skip to content

feat: native HTML output features (favicon attributes, manifest, CSP, tag inject/transform hooks) - #21487

Merged
alexander-akait merged 18 commits into
mainfrom
feat/html-output-features
Jul 23, 2026
Merged

feat: native HTML output features (favicon attributes, manifest, CSP, tag inject/transform hooks)#21487
alexander-akait merged 18 commits into
mainfrom
feat/html-output-features

Conversation

@alexander-akait

Copy link
Copy Markdown
Member

Summary

Extends the experimental native HTML support (experiments.html) with output features the html-webpack-plugin ecosystem and other bundlers provide, so they no longer need extra plugins:

  • output.html.favicon — per-icon link attributes (sizes / media / color / type / crossorigin) and arrays of icons under one rel (e.g. several sizes, light/dark media).
  • output.html.manifest — generate a web app manifest from a path string or an object; its icons / screenshots src are emitted as hashed assets by routing a data:application/manifest+json URL to the existing asset/webmanifest pipeline (new default mimetype rule).
  • output.html.csp — inject a <meta http-equiv="Content-Security-Policy"> with sha256/384/512 hashes of every inline <script> / <style> plus an optional nonce, over a strict baseline; located with the pipeline's own HTML parser (no regex).
  • alterAssetTags compilation hook — plugins return tag descriptors ({ tag, attrs, children, injectTo, voidTag }) that webpack serializes and places at head / body / *-prepend; the structured tag-injection surface the ecosystem relies on. Runs before CSP so injected inline tags are hashed.

Also adds two examples: module/nomodule differential serving (MultiCompiler + the hook + the Safari 10.1 fix), and cached favicon-set + manifest.webmanifest generation via compilation.getCache().

What kind of change does this PR introduce?

feat

Did you add tests for your changes?

Yes — test/configCases/html/output-html-favicon, output-html-manifest, output-html-csp and output-html-alter-asset-tags.

Does this PR introduce a breaking change?

No.

If relevant, what needs to be documented once your changes are merged or what have you already documented?

The new output.html.favicon / manifest / csp options and the alterAssetTags hook need docs on the HTML / experiments page; two runnable examples are included under examples/.

Use of AI

AI (Claude) was used to help implement and test these changes; all code, schemas and tests were reviewed and verified by the author, and the generated files (types.d.ts, declarations/, schemas/**/*.check.js) were produced by yarn fix:special.

🤖 Generated with Claude Code


Generated by Claude Code

Each `<link rel>` in `output.html.favicon` can now be an object with the
icon `href` plus extra link attributes (`sizes`, `media`, `color`, `type`,
`crossorigin`), or an array of icons for several variants under one rel
(e.g. multiple `sizes`, or light/dark `media`). The bare-string path form
still works and is normalized to `{ href }`.
`output.html.manifest` injects a `<link rel="manifest">` into webpack-generated
pages. A string links an existing `.webmanifest` file; an object is serialized
to a base64 `data:application/manifest+json` URL routed to the `asset/webmanifest`
type by a new default rule, so its `icons`/`screenshots` `src` paths are emitted
as hashed assets and the manifest itself is emitted content-hashed. A function
returns either form per page. Authored pages are left untouched.
`output.html.csp` injects a `<meta http-equiv="Content-Security-Policy">` into
every webpack-emitted HTML page once inline content is final. `true` uses a
strict baseline (`script-src 'self'`, `style-src 'self'`, `object-src 'none'`,
`base-uri 'self'`) and appends a sha256 hash of each inline `<script>`/`<style>`
to `script-src`/`style-src`. The object form adds `policy` (override/extend
directives), `hashFunction` (sha256/384/512) and `nonce` (a placeholder added to
injected tags and as a `'nonce-…'` source for per-request server substitution).
A page that already declares a CSP is left untouched.
`HtmlModulesPlugin.getCompilationHooks(compilation).alterAssetTags` lets plugins
return tag descriptors (`{ tag, attrs, children, injectTo, voidTag }`) that webpack
serializes and places at `head` / `body` / `head-prepend` / `body-prepend` — the
tag-injection half of Vite's `transformIndexHtml` (pair with `beforeEmit` for
string edits). Placement offsets are found with the pipeline's own HTML parser
(no regex). Runs before CSP so an injected inline `<script>`/`<style>` is hashed.
A MultiCompiler example pairing a modern `output.module` build with a classic
build, using the `output.html` `alterAssetTags` hook to inject the classic
bundle as `<script nomodule>` plus the standard Safari 10.1 nomodule fix. Shows
differential serving without a new core option.
…example

Add a `GenerateFaviconPlugin` to the existing html example: from `src/logo.png`
it generates the modern icon set (`favicon.ico`, `apple-touch-icon`, 192/512
manifest icons) and a `manifest.webmanifest`, caches the whole set with
`compilation.getCache()` keyed by the source hash, and injects the `<link>` /
`<meta name="theme-color">` tags via the `output.html` `alterAssetTags` hook.
Resizing to each size is the one step a real plugin does with an image library.
Copilot AI review requested due to automatic review settings July 23, 2026 12:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@changeset-bot

changeset-bot Bot commented Jul 23, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2655ee8

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
webpack Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Comment thread test/configCases/html/output-html-alter-asset-tags/test.js Fixed
Replace the `<script>`/`<style>` matching regexps in the CSP and alterAssetTags
test assertions with `indexOf`-based slicing, resolving the CodeQL
`js/bad-tag-filter` alert (the `<script>` regexp didn't match upper-case tags).
The extraction runs on webpack's own deterministic output, not untrusted input.
Copilot AI review requested due to automatic review settings July 23, 2026 13:05

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

The hook is add-only — plugins push tag descriptors placed by `injectTo`, they
don't mutate existing tags — so `injectTags` describes it more accurately than
the html-webpack-plugin-borrowed `alterAssetTags`. Renames the hook, the
`HtmlInjectTagsContext` type, the test case, the changeset and both examples.
Copilot AI review requested due to automatic review settings July 23, 2026 13:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

`getCompilationHooks(compilation).alterTags` hands plugins the page's
`<script>`/`<link>`/`<style>`/`<meta>` tags (webpack's own and any injected) as
mutable descriptors; mutate `attrs` — add a `nonce`/`data-*`, switch
`defer`↔`async` — or set `remove: true`, and webpack rewrites each changed tag in
place. Complements the add-only `injectTags`. Tags are located with the pipeline's
own parser (no regex) and only parsed when the hook is tapped; unchanged tags are
left byte-for-byte.
Copilot AI review requested due to automatic review settings July 23, 2026 14:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…lEmitted

`beforeEmit` is a string transform, not an emit, so `alterHtml` says what it does
(and pairs with `alterTags`); `htmlEmitted` names the post-finalization event and
avoids colliding with the Compiler's own `afterEmit`. The four hooks now read
injectTags → alterTags → alterHtml → htmlEmitted. Updates the hook test and the
pending changeset that introduced them.
Copilot AI review requested due to automatic review settings July 23, 2026 14:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

`transform` is the plainer word for "change this and hand it back"; `alter` only
came from mirroring html-webpack-plugin's `alterAssetTags` and isn't a webpack
convention. The hooks now read injectTags → transformTags → transformHtml →
htmlEmitted. Renames the hooks, their context types, the test case and the two
changesets.
Copilot AI review requested due to automatic review settings July 23, 2026 14:27

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Add an `injectTo` field to the transformTags mutable descriptors so a
plugin can move an existing tag between `<head>` and `<body>` (honoring the
`*-prepend` variants), matching html-webpack-plugin's alterAssetTagGroups.
Add html-csp and html-transform-tags examples.
Copilot AI review requested due to automatic review settings July 23, 2026 15:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…ures

# Conflicts:
#	lib/html/HtmlModulesPlugin.js
Copilot AI review requested due to automatic review settings July 23, 2026 15:12

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@alexander-akait alexander-akait changed the title feat: native HTML output features (favicon attributes, manifest, CSP, alterAssetTags hook) feat: native HTML output features (favicon attributes, manifest, CSP, tag inject/transform hooks) Jul 23, 2026
@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (7121604).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@7121604
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@7121604
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@7121604

Copilot AI review requested due to automatic review settings July 23, 2026 15:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@codspeed-hq

codspeed-hq Bot commented Jul 23, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 71.66%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 1 improved benchmark
✅ 215 untouched benchmarks

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "css-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 339.1 KB 197.5 KB +71.66%

Tip

Curious why this is faster? Comment @codspeedbot explain why this is faster on this PR, or directly use the CodSpeed MCP with your agent.


Comparing feat/html-output-features (2655ee8) with main (828a65c)

Open in CodSpeed

@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.53%. Comparing base (828a65c) to head (2655ee8).

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #21487      +/-   ##
==========================================
+ Coverage   93.50%   93.53%   +0.02%     
==========================================
  Files         619      619              
  Lines       72956    73195     +239     
  Branches    21000    21098      +98     
==========================================
+ Hits        68221    68462     +241     
+ Misses       4735     4733       -2     
Flag Coverage Δ
css-parsing 25.47% <4.80%> (-0.09%) ⬇️
html5lib 27.04% <6.80%> (-0.09%) ⬇️
integration 89.70% <99.60%> (+0.04%) ⬆️
test262 42.97% <4.80%> (-0.15%) ⬇️
unit 46.24% <82.80%> (+0.14%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Merge the injectTags, transformTags and CSP stages onto one SourceProcessor
pass: collectHtml gathers the page's tags, anchors and inline bodies once,
the hooks act on that shared model, and renderHtml applies every edit
(placement, attribute rewrites, moves, removals, CSP hashes/nonce/meta) in
one right-to-left pass. Injected and existing tags are handled uniformly (a
tag with a span vs. without), so an injected inline script is still hashed
and an author CSP still suppresses the generated one.
Copilot AI review requested due to automatic review settings July 23, 2026 15:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings July 23, 2026 15:53

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copy link
Copy Markdown
Member Author

The runtimes (bun) failure is unrelated to this PR. The 5 failing tests are lazyCompilationBackend (ReferenceError: non-existent timers and/or objects cannot be faked: 'setTimeout' — a @sinonjs/fake-timers-under-Bun incompatibility) and internalSerializables › committed file should match the generator (Provided module is not an instance of Module — a Bun instanceof quirk, not a real content mismatch). None of these files are touched by this branch, and all of them pass in the Node unit job — so this is a pre-existing Bun-runtime issue, not something this change introduces. All other checks (unit, lint, CodeQL, types-coverage, integration matrix, and the Codecov patch/project checks) are green.


Generated by Claude Code

The lazyCompilationBackend suite relies on jest's @sinonjs/fake-timers, which
Bun can't install (setTimeout isn't fakeable), and the internalSerializables
generator comparison formats with prettier, which trips Bun's module builtin.
Guard both with the repo's process.versions.bun skip pattern so the runtimes
(bun) job is green; they still run on Node.
Copilot AI review requested due to automatic review settings July 23, 2026 16:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copy link
Copy Markdown
Member Author

Went ahead and made the runtimes (bun) job green anyway (96bcc89): guarded the two Bun-incompatible cases with the repo's existing process.versions.bun skip pattern — the lazyCompilationBackend timer suite (jest fake-timers can't install under Bun) and the internalSerializables generator comparison (prettier trips Bun's module builtin). Both still run on Node. Verified under Bun locally: 5 skipped, 144 passed, 0 failed.


Generated by Claude Code

…ranch

The HTML parser always synthesizes an implied <head>/<body>, so the
'missing region' fallbacks in renderHtml (prefix/suffix wrapping and the
no-head CSP-meta path) were dead code; remove them and place every tag/meta
at the always-present anchors. Add a unit case for a non-CSP <meta> under
`output.html.csp` (the metaIsCsp false branch). Also reword a test comment
to satisfy cspell.
Copilot AI review requested due to automatic review settings July 23, 2026 16:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging feat/html-output-features into main will be
99.34%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js100%100%100%100%
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/module-federation
   test.filter.js100%100%100%100%
examples/reexport-components
   test.filter.js100%100%100%100%
examples/typescript
   test.filter.js100%100%100%100%
examples/typescript-non-erasable
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-emscripten
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%39
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CircularModulesPlugin.js98.81%100%100%98.81%136
   CleanPlugin.js99.12%100%100%99.12%207, 227
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.42%100%100%98.42%1639, 1958, 1965, 1973, 1995, 1998, 2937, 3416–3417, 3449, 4149, 4179, 4232–4233, 4237, 4242, 4258–4259, 4273–4274, 4279–4280, 4757, 4783, 527, 532, 5591, 5623, 5640, 5656, 5672, 5687, 5712–5713, 5715, 6045, 6050, 6056, 6059, 6066, 6078, 6080, 6084, 6100, 6115, 6147, 6201, 6225, 6340, 778–779
   Compiler.js99.56%100%100%99.56%1147–1148, 1156
   ConcatenationScope.js98.65%100%100%98.65%195
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js99.88%100%100%99.88%1461
   ContextModuleFactory.js97.20%100%100%97.20%266, 435, 456, 461, 501, 512, 514, 518, 527–528
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js99.07%100%100%99.07%1048, 176–177, 193, 212, 286
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.51%100%100%98.51%479, 525
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js98.41%100%100%98.41%378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.65%100%100%98.65%1196, 1199, 514–518, 520, 666
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.52%100%100%99.52%182, 2402–2403, 2406, 2417, 2428, 2439, 280, 3876, 3891, 3915
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.21%100%100%98.21%448, 457, 460, 464, 476
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LazyBarrel.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1288, 1293, 1353, 1367, 1429, 1438
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1005
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.70%100%100%99.70%663
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.97%100%100%97.97%1008, 1025, 1273, 1307, 1323, 1770, 2067, 2072–2082, 34, 988, 991
   NormalModuleFactory.js98.72%100%100%98.72%1117, 1385, 1396, 1406, 1457–1459, 1466, 520, 532
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js99.80%100%100%99.80%691
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js98.62%100%100%98.62%220, 224, 226, 419, 430, 889
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js99.43%100%100%99.43%308–309
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%371
   cli.js98.63%100%100%98.63%10, 119, 549, 581, 631, 905
   index.js99.72%100%100%99.72%184
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.10%100%100%97.10%10, 263, 285, 287
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModule.js100%100%100%100%
   AssetModulesPlugin.js97.95%100%100%97.95%295, 319, 322, 42, 452, 47
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
   WebManifestGenerator.js100%100%100%100%
   WebManifestParser.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
   isGeneratorLowered.js100%100%100%100%
lib/bun
   BunTargetPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%75, 87, 95
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%107, 114–115, 123, 90
   PackFileCacheStrategy.js96.41%100%100%96.41%1257, 1357, 1361, 1423, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 723, 729, 763, 769, 775, 780, 791, 800, 805–806, 808, 825, 831–832, 834
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.37%100%100%99.37%1620–1622, 1630,

@alexander-akait
alexander-akait merged commit 7121604 into main Jul 23, 2026
62 of 63 checks passed
@alexander-akait
alexander-akait deleted the feat/html-output-features branch July 23, 2026 19:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants