Skip to content

feat(css): make the printer's mode reachable and support beautifying - #21660

Merged
alexander-akait merged 4 commits into
mainfrom
feat/source-processor-print-modes
Aug 10, 2026
Merged

feat(css): make the printer's mode reachable and support beautifying#21660
alexander-akait merged 4 commits into
mainfrom
feat/source-processor-print-modes

Conversation

@alexander-akait

Copy link
Copy Markdown
Member

Summary

PrintOptions.mode has always been typed "minify" | "beautify" and both the CSS and HTML printers branch on it throughout, but SourceProcessor.process() hardcoded "minify", so half of that code was unreachable. process(src, { mode }) now selects it; minimize: true keeps working as the shorthand for mode: "minify" it reads as, so no caller changes.

Beautifying re-serializes rather than rewrites — the authored #ff0000, 1px 2px 1px 2px, attribute quoting and comments stay as written. It is deliberately still ugly (no indentation, top-level items run together); what it must not be is lossy, and two things were: kept license comments (/*!, @license, @preserve) were only collected when minifying, and a custom property's value claimed them from the writer only on the minifying path, so each was emitted twice. Both are fixed here.

Also adds css-printer-tailwind-unit, which benchmarks serialization — the parser case stops at the parse, so nothing measured it. Each fixture runs in all three modes, so minify - beautify isolates what the value and shorthand transforms cost on top of serializing: on flat rules, 40 ms to serialize and 63 ms more to transform.

What kind of change does this PR introduce?

feat

Did you add tests for your changes?

Yes — CssSyntax — print modes in test/CssSyntax.unittest.js (6 cases, covering both spellings of the mode, the comment parity and the custom-property duplication). Verified beyond that with two properties over the 844-file css/html fixture corpus plus 24,000 random inputs: minify output is byte-identical to main, and minify(beautify(x)) === minify(x) holds everywhere minify is itself idempotent (the handful of files where it is not diverge at the same byte offset under plain minify(minify(x)), so they are pre-existing and not beautify's).

Does this PR introduce a breaking change?

No. minimize: true behaves exactly as before and minified output is unchanged byte-for-byte; mode is additive.

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

n/a — webpack.css.syntax.SourceProcessor is marked experimental/unstable, and the option is documented in its JSDoc.

Use of AI

Claude Code was used to implement this change, to write the differential and round-trip harnesses, and to run the measurements quoted above. Every number here is from runs on this branch against main; the design decisions and the correctness checks were reviewed by a human before each commit.


Generated by Claude Code

`css-parser-tailwind-unit` stops at the parse, so nothing measured
serialization or the source map it resolves — the half this branch changes.
This covers both paths a nested block can take (streamed as its children
finish, or buffered and printed whole), the shapes they cost differently on,
and the two pieces only a streamed block reaches: a declaration a later one
overrides, and an opener held back so an empty block can still be dropped.

Against this branch's merge base:

  tailwind                345.6 -> 257.0 ms
  streamed block          113.1 ->  82.1 ms
  buffered blocks          94.6 ->  83.4 ms
  flat rules              109.0 -> 104.0 ms
  deep nesting             10.5 ->  11.1 ms
  retracted declarations   99.1 ->  77.4 ms
  dropped empty blocks     34.1 ->  21.8 ms

Deep nesting is the run-to-run spread, not a cost: alternating the two arms
interleaves them (before 10.80/11.17/11.11, after 10.96/10.85/11.06).
A build that is not minimizing still parses and walks, and that pass is the
floor the printer sits on. Running every fixture both ways makes the pair the
measurement: the difference is what printing and the source map cost on that
shape, which neither number shows alone. It is a far bigger share here than
in HTML — the CSS walk skips most of what the printer then has to serialize.

  fixture                  walk    minify
  tailwind                36.1 -> 266.7 ms
  streamed block           9.7 ->  87.7 ms
  buffered blocks          8.5 ->  84.4 ms
  flat rules              11.1 -> 112.6 ms
  deep nesting             2.3 ->  12.2 ms
  retracted declarations  10.1 ->  90.3 ms
  dropped empty blocks     6.7 ->  23.4 ms

The fixtures move to a table so the two modes cannot drift apart; the
`minify (...)` names are unchanged, so their history carries over. Their
absolute values shift against the previous commit because the walk arms now
share the process — compare within a run, not across.
`PrintOptions.mode` has always been typed `"minify" | "beautify"` and both
printers branch on it, but `process()` hardcoded `"minify"`, so half of it
was unreachable. `process(src, { mode })` now selects it; `minimize: true`
keeps working as the shorthand for `mode: "minify"` it reads as.

Beautifying re-serializes without the transforms — the authored `#ff0000`,
`1px 2px 1px 2px` and comment placement stay as written, one declaration per
line. It is deliberately still ugly in places (no indentation, top-level
items run together); what it must not be is lossy, and two things were:

- kept comments (`/*!`, `@license`, `@preserve`) were only collected when
  minifying, so beautifying dropped every license banner;
- a custom property's value prints straight from source, comments included,
  but only the minifying path claimed them from the writer, so beautifying
  emitted each one twice.

Minify output is unchanged, byte-for-byte, over the 840-file css/html
fixture corpus and 24,000 random inputs. On the same corpus
`minify(beautify(x)) === minify(x)` holds everywhere minify is itself
idempotent.
@changeset-bot

changeset-bot Bot commented Aug 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f030f3f

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

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@alexander-akait, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 21 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 0afe2f4a-ff60-471a-8b03-d36a66da3407

📥 Commits

Reviewing files that changed from the base of the PR and between e3f177c and f030f3f.

⛔ Files ignored due to path filters (1)
  • types.d.ts is excluded by !types.d.ts
📒 Files selected for processing (5)
  • .changeset/068-source-processor-print-modes.md
  • lib/css/syntax.js
  • lib/util/SourceProcessor.js
  • test/CssSyntax.unittest.js
  • test/benchmarkCases/css-printer-tailwind-unit/index.bench.mjs

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key: "tools"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added area: css CSS support (lib/css) area: types types.d.ts, JSDoc annotations, hand-maintained declarations area: build-perf Build time and memory of webpack itself labels Aug 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging feat/source-processor-print-modes into main will be
99.27%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.82%100%100%98.82%103
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%214, 234
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.43%100%100%98.43%1673, 1992, 1999, 2007, 2029, 2032, 2971, 3450–3451, 3483, 4192, 4222, 4275–4276, 4280, 4285, 4301–4302, 4316–4317, 4322–4323, 4843, 4869, 549, 554, 5679, 5711, 5728, 5746, 5762, 5777, 5802–5803, 5805, 6139, 6144, 6150, 6153, 6160, 6172, 6174, 6178, 6196, 6211, 6245, 6301, 6325, 6441, 801–802
   Compiler.js99.56%100%100%99.56%1168–1169, 1177
   ConcatenationScope.js99.12%100%100%99.12%300
   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.08%100%100%99.08%1080, 176–177, 193, 212, 286
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.51%100%100%98.51%480, 527
   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.67%100%100%98.67%1220, 1223, 519–523, 525, 671
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.53%100%100%99.53%186, 2454–2455, 2458, 2469, 2480, 2491, 284, 3928, 3943, 3967
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.36%100%100%98.36%504, 513, 516, 520, 532
   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.51%100%100%98.51%1303, 1308, 1368, 1382, 1444, 1453
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.90%100%100%98.90%111, 113
   ModuleGraph.js99.78%100%100%99.78%1170
   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.72%100%100%99.72%721
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.99%100%100%97.99%1027, 1030, 1047, 1064, 1312, 1346, 1362, 1817, 2114, 2119–2129, 29
   NormalModuleFactory.js98.77%100%100%98.77%1142, 1410, 1421, 1431, 1482–1484, 1491, 536, 548
   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%690
   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.js95.70%100%100%95.70%319, 375, 384, 387, 411, 429, 450–451, 474, 494–495, 531–532, 555, 568–569, 641, 654, 675, 694
   RuntimeTemplate.js99.90%100%100%99.90%119
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js98.63%100%100%98.63%220, 224, 226, 420, 431, 890
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js99.47%100%100%99.47%352–353
   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%376
   cli.js98.63%100%100%98.63%10, 119, 549, 581, 631, 905
   index.js99.73%100%100%99.73%184
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.12%100%100%97.12%10, 267, 289, 291
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModule.js100%100%100%100%
   AssetModulesPlugin.js98.03%100%100%98.03%324, 348, 351, 43, 48, 481
   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.js92%100%100%92%34, 43
   MemoryWithGcCachePlugin.js93.42%100%100%93.42%108, 122–123, 132, 90
   PackFileCacheStrategy.js96.52%100%100%96.52%1310, 1410, 1414, 1476, 1712, 1796, 1819, 1851, 675, 694, 704–706, 708, 724–725, 730, 733, 735, 740, 745, 770, 776, 810,

@codecov

codecov Bot commented Aug 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.51%. Comparing base (e3f177c) to head (f030f3f).

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #21660   +/-   ##
=======================================
  Coverage   94.50%   94.51%           
=======================================
  Files         630      630           
  Lines       81568    81570    +2     
  Branches    24113    24112    -1     
=======================================
+ Hits        77083    77093   +10     
+ Misses       4485     4477    -8     
Flag Coverage Δ
css-parsing 26.20% <44.44%> (-0.01%) ⬇️
html5lib 30.78% <100.00%> (ø)
integration 88.32% <66.66%> (+<0.01%) ⬆️
test262 50.55% <ø> (ø)
unit 54.31% <100.00%> (+<0.01%) ⬆️

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.

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

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

Install it locally:

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

@github-actions

Copy link
Copy Markdown
Contributor

Generated code size

Comparing f030f3f against e3f177c. Merging this PR will not change the code webpack generates.

Changed New Deleted Unchanged Raw change
Cases 0 0 0 1533
Assets 0 0 0 5993
Runtimes 0 0 0 1889

No asset changed size.

No runtime gained or lost a runtime module.

Built test/configCases with the defaults a user gets: 1533 case(s), 5993 asset(s), 40 emitted nothing.

@codspeed-hq

codspeed-hq Bot commented Aug 10, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 3.33%

⚠️ 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

⚡ 2 improved benchmarks
❌ 2 regressed benchmarks
✅ 216 untouched benchmarks
🆕 42 new benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 649.5 KB 1,370.6 KB -52.61%
Simulation benchmark "wasm-modules-sync", scenario '{"name":"mode-development","mode":"development"}' 1.1 s 1.4 s -24.18%
Memory benchmark "devtool-eval", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 957.6 KB 482.1 KB +98.63%
Memory benchmark "css-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 921.5 KB 753 KB +22.39%
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (buffered blocks) N/A 688.5 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (deep nesting) N/A 273.9 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (dropped empty blocks) N/A 736.5 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (flat rules) N/A 990 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (retracted declarations) N/A 832.1 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (streamed block) N/A 727.8 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", beautify (tailwind) N/A 2.5 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (buffered blocks) N/A 1.9 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (deep nesting) N/A 399.4 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (dropped empty blocks) N/A 810.8 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (flat rules) N/A 3 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (retracted declarations) N/A 2 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (streamed block) N/A 2 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", minify (tailwind) N/A 5.3 s N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", walk (buffered blocks) N/A 265.3 ms N/A
🆕 Simulation unit benchmark "css-printer-tailwind-unit", walk (deep nesting) N/A 81.6 ms N/A
... ... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing feat/source-processor-print-modes (f030f3f) with main (e3f177c)

Open in CodSpeed

@alexander-akait
alexander-akait merged commit 78a4227 into main Aug 10, 2026
65 checks passed
@alexander-akait
alexander-akait deleted the feat/source-processor-print-modes branch August 10, 2026 09:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build-perf Build time and memory of webpack itself area: css CSS support (lib/css) area: types types.d.ts, JSDoc annotations, hand-maintained declarations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Sponsor
SponsoredKunjungi sekarang
Promo