Skip to content

feat: add pure parser option for css/module and css/auto#20946

Merged
alexander-akait merged 3 commits into
mainfrom
claude/css-modules-pure-option-dFJZj
May 12, 2026
Merged

feat: add pure parser option for css/module and css/auto#20946
alexander-akait merged 3 commits into
mainfrom
claude/css-modules-pure-option-dFJZj

Conversation

@alexander-akait
Copy link
Copy Markdown
Member

Mirrors the pure mode from css-loader / icss-utils: every selector must
contain at least one local class or id, otherwise webpack emits a build
error. Not exposed for css/global since pure is the opposite of the
global-by-default semantic of that type.

https://claude.ai/code/session_014jWnrU38fbFtCwKGtnnBig

Copilot AI review requested due to automatic review settings May 11, 2026 16:28
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 11, 2026

🦋 Changeset detected

Latest commit: 8ed650f

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a new parser.pure option for css/module and css/auto module types to enforce “pure selector” semantics (every selector must include at least one local class or id), aligning webpack’s built-in CSS Modules behavior with postcss-modules-local-by-default pure mode.

Changes:

  • Add pure parser option support in lib/css/CssParser.js, including error emission and comment-based opt-outs (cssmodules-pure-ignore, cssmodules-pure-no-check).
  • Extend public typings and JSON schemas to expose/validate the new option for css/module and css/auto.
  • Add/adjust config-case tests to cover pure-mode behavior and expected errors.

Reviewed changes

Copilot reviewed 18 out of 22 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
lib/css/CssParser.js Implements pure-mode selector tracking, opt-out comments, and build errors for impure selectors.
lib/css/CssModulesPlugin.js Switches css/module + css/auto parser option validation to the new schema/type that includes pure.
schemas/WebpackOptions.json Adds CssParserPure and CssAutoOrModuleParserOptions schema definitions; wires them into parser options by module type.
schemas/plugins/css/CssAutoOrModuleParserOptions.json Adds plugin schema entry for the new parser-options shape.
schemas/plugins/css/CssAutoOrModuleParserOptions.check.js Generated runtime validator for the new schema.
schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts Typings for the generated validator.
declarations/WebpackOptions.d.ts Adds CssAutoOrModuleParserOptions + CssParserPure to public declarations.
types.d.ts Updates generated top-level typings to expose pure for css/auto and css/module.
test/configCases/css/pure-parser-options/webpack.config.js New test case enabling parser.pure for css/module.
test/configCases/css/pure-parser-options/index.js Asserts locals exports for pure-compliant modules and file-level no-check behavior.
test/configCases/css/pure-parser-options/valid.module.css Pure-compliant selector fixtures, including ignore-comment coverage.
test/configCases/css/pure-parser-options/no-check.module.css Fixture for file-leading cssmodules-pure-no-check.
test/configCases/css/pure-parser-options/invalid.module.css Fixture containing impure selectors expected to error.
test/configCases/css/pure-parser-options/errors.js Expected error patterns for the new config case.
test/configCases/css/postcss-modules-plugins/webpack.config.js Enables parser.pure for the existing “pure” fixture in this config case.
test/configCases/css/postcss-modules-plugins/postcss-modules-local-by-default.pure.modules.css Removes an outdated “TODO not implemented yet” comment.
test/configCases/css/postcss-modules-plugins/errors.js Adds expected pure-mode error patterns for this config case.
test/configCases/css/postcss-modules-plugins/__snapshots__/ConfigTest.snap Snapshot update reflecting removal of the TODO comment.
test/configCases/css/postcss-modules-plugins/__snapshots__/ConfigCacheTest.snap Cache snapshot update reflecting removal of the TODO comment.
cspell.json Adds spellchecker allowlist entries for cssmodules and PCSL.
.changeset/css-modules-pure-parser-option.md Adds a changeset documenting the new parser option and comment semantics.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/css/CssParser.js Outdated
Comment on lines +2508 to +2513
pureBlockStack.push({
ignored: pureIgnorePending,
skipOwn: inheritedSkip,
skipChildren: nextBlockChildrenSkip || inheritedSkip,
treatAsLeaf: nextBlockTreatAsLeaf,
ancestorHadLocal: parentEffectivePure() || lastSelectorHadLocal,
Comment thread lib/css/CssParser.js Outdated
Comment on lines 2696 to 2698
}
inAtRulePrelude = false;
isNextRulePrelude = isNextNestedSyntax(input, end);
Comment thread lib/css/CssParser.js
Comment on lines +882 to +891
if (pureMode) {
if (PURE_IGNORE_RE.test(value)) {
pureIgnorePending = true;
} else if (
PURE_NO_CHECK_RE.test(value) &&
scope === CSS_MODE_TOP_LEVEL &&
!seenTopLevelRule
) {
pureNoCheck = true;
}
Comment thread lib/css/CssParser.js Outdated
Comment on lines +2502 to +2525
const isRulePrelude = isNextRulePrelude;
const lastSelectorHadLocal = currentSelectorHasLocal;
if (isRulePrelude) finalizeSelector();
const top = pureTop();
if (top) top.hasNestedBlock = true;
const inheritedSkip = top ? top.skipChildren : false;
pureBlockStack.push({
ignored: pureIgnorePending,
skipOwn: inheritedSkip,
skipChildren: nextBlockChildrenSkip || inheritedSkip,
treatAsLeaf: nextBlockTreatAsLeaf,
ancestorHadLocal: parentEffectivePure() || lastSelectorHadLocal,
impure: isRulePrelude && currentRuleHasImpureSelector,
hasDirectDecl: false,
hasNestedBlock: false,
isRulePrelude,
preludeStart: currentRulePreludeStart,
preludeEnd: start
});
pureIgnorePending = false;
nextBlockChildrenSkip = false;
nextBlockTreatAsLeaf = false;
currentRuleHasImpureSelector = false;
currentSelectorHasLocal = false;
Implements postcss-modules-local-by-default (PCSL) v4.2.0 pure-mode
semantics in webpack's built-in CSS modules parser:

- Every selector must contain at least one local class or id, otherwise
  the rule errors at build. Available on `css/module` and `css/auto`
  parser options; not exposed for `css/global` since pure mode is the
  opposite of the global-by-default semantic of that type.
- `/* cssmodules-pure-ignore */` directly before a rule suppresses
  that rule's check (per-rule only; does NOT propagate to nested rules).
- `/* cssmodules-pure-no-check */` placed among the leading comments
  of the file (before any rule or at-rule) disables the check for the
  whole file.
- Nested rules inside a local-bearing ancestor are treated as pure-
  compliant; `&` resolves to the parent rule's overall purity.
- `@keyframes` / `@counter-style` body contents are exempt; the at-rule
  itself still errors when its identifier is `:global(...)`.
- Rules whose body contains only nested rules don't trigger the check
  (children carry it instead, matching PCSL's `isNodeWithoutDeclarations`).
- At-rules' preludes (e.g. `min-width` inside `@media (...)`) aren't
  mistaken for declarations.

Addresses Copilot review feedback on PR #20946:
- #1: `ancestorHadLocal` now derives from "this rule is fully pure"
  (no impure comma-segment) rather than "last selector had a local",
  so `:global(.a), .b { span { ... } }` correctly throws on `span`.
- #2: `currentRulePreludeStart` now advances on top-level `;` and on
  at-rules that consume their own `;` (e.g. `@import`), so a later
  impure rule's reported selector doesn't include the preceding text.
- #3: `seenTopLevelRule` is set on any non-comment top-level node
  (including `;`-terminated at-rules), matching PCSL's
  `isPureCheckDisabled` leading-comments rule.
- #4: All pure-mode bookkeeping (stack push/pop, `currentSelectorHasLocal`
  writes, etc.) is gated behind `pureMode`, so CSS modules without
  `parser.pure` pay no overhead.

Test coverage: dedicated `test/configCases/css/pure-parser-options/`
plus the existing `postcss-modules-plugins` PCSL fixture enabled with
`parser: { pure: true }` and a full `errors.js` (43 expected throws).

https://claude.ai/code/session_014jWnrU38fbFtCwKGtnnBig
@alexander-akait alexander-akait force-pushed the claude/css-modules-pure-option-dFJZj branch from fcfdab3 to b2fea1e Compare May 12, 2026 14:02
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 12, 2026

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

Install it locally:

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

@codecov
Copy link
Copy Markdown

codecov Bot commented May 12, 2026

Codecov Report

❌ Patch coverage is 95.00000% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.37%. Comparing base (0053c9f) to head (8ed650f).

Files with missing lines Patch % Lines
lib/css/CssParser.js 96.02% 7 Missing ⚠️
lib/css/CssModulesPlugin.js 50.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #20946      +/-   ##
==========================================
- Coverage   91.37%   91.37%   -0.01%     
==========================================
  Files         569      569              
  Lines       56993    57129     +136     
  Branches    15174    15233      +59     
==========================================
+ Hits        52075    52199     +124     
- Misses       4918     4930      +12     
Flag Coverage Δ
integration 90.32% <95.00%> (+<0.01%) ⬆️
test262 45.42% <0.55%> (-0.14%) ⬇️
unit 36.20% <0.55%> (-0.11%) ⬇️

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

☔ View full report in Codecov by Sentry.
📢 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.

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented May 12, 2026

Merging this PR will degrade performance by 60.74%

⚡ 6 improved benchmarks
❌ 5 regressed benchmarks
✅ 133 untouched benchmarks
⏩ 72 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "many-chunks-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 172.9 KB 252.4 KB -31.51%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-production","mode":"production"}' 9 MB 7.4 MB +22.08%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 169.8 KB 398.4 KB -57.38%
Memory benchmark "context-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 663.4 KB 179.8 KB ×3.7
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 272 KB 204.4 KB +33.06%
Memory benchmark "many-modules-esm", scenario '{"name":"mode-development","mode":"development"}' 1,102.3 KB 845.6 KB +30.36%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development","mode":"development"}' 3,780.7 KB 507.5 KB ×7.4
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 462.2 KB 135.1 KB ×3.4
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development","mode":"development"}' 789.3 KB 1,111.9 KB -29.02%
Memory benchmark "json-modules", scenario '{"name":"mode-development","mode":"development"}' 578 KB 842 KB -31.35%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 173.7 KB 442.4 KB -60.74%

Comparing claude/css-modules-pure-option-dFJZj (8ed650f) with main (0053c9f)

Open in CodSpeed

Footnotes

  1. 72 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 18 out of 23 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • schemas/plugins/css/CssAutoOrModuleParserOptions.check.js: Language not supported

parser: {
pure: true
},
type: "css/module"
- `RegExp.prototype.exec` returns `RegExpExecArray | null`; cast to the
  non-null form so `lint:types` is clean (the regex always matches an
  empty string, so the result is non-null).
- `getArguments()` snapshot now includes the new `module.parser.css/auto.pure`
  and `module.parser.css/module.pure` CLI flags.

https://claude.ai/code/session_014jWnrU38fbFtCwKGtnnBig
Addresses Copilot review on b2fea1e: the `pure` parser option is
documented for both `css/module` and `css/auto`, but the config-case
only exercised `css/module`. Adds three fixtures matched by the same
`type: "css/auto"` rule:

- `auto-pure.module.css` — `.module.css` filename → treated as a CSS
  module → pure check applies → passes (only a local class).
- `auto-impure.module.css` — `.module.css` filename → pure check
  applies → throws on `body`.
- `auto-non-module.css` — no `.module.` in the filename → `css/auto`
  treats it as plain CSS → pure check must NOT apply, even though the
  rule sets `pure: true`. Verified via the absence of throws on
  `body`/`:global(.global-only)`.

`errors.js` adds the expected `body` throw under `auto-impure.module.css`;
`index.js` adds an assertion that the local from `auto-pure.module.css`
is exported under the auto-resolved CSS-module name.

https://claude.ai/code/session_014jWnrU38fbFtCwKGtnnBig
@github-actions
Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging claude/css-modules-pure-option-dFJZj into main will be
98.94%
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.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   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-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%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%379, 425
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 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.96%100%100%98.96%424–428, 576
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.50%100%100%99.50%182, 2252–2253, 2256, 2267, 2278, 2289, 278, 3694, 3709, 3733
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   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%
   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%1304, 1309, 1370, 1384, 1446, 1455
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.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.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1074, 1383, 473, 485
   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.js98.85%100%100%98.85%519–520, 525, 527, 591
   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.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   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%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.15%100%100%99.15%1327–1329, 1337, 271, 274, 279, 283, 472
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   RemoteRuntimeModule.js100%100%100%100%
   

@alexander-akait alexander-akait merged commit d689afd into main May 12, 2026
60 of 61 checks passed
@alexander-akait alexander-akait deleted the claude/css-modules-pure-option-dFJZj branch May 12, 2026 18:44
alexander-akait pushed a commit to webpack/webpack.js.org that referenced this pull request May 18, 2026
Webpack 5.107 adds a new pure parser option for css/module and css/auto
that mirrors postcss-modules-local-by-default's pure mode. Every
selector must contain at least one local class or id, otherwise the
build fails. Documents the option, plus the two opt-out comments
(/* cssmodules-pure-ignore */ per-rule and /* cssmodules-pure-no-check */
per-file) and the constructs that are exempt by design.

Refs: webpack/webpack#20946
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.

2 participants