Skip to content

Css loader tests#20694

Merged
alexander-akait merged 19 commits intomainfrom
css-loader-tests
Mar 24, 2026
Merged

Css loader tests#20694
alexander-akait merged 19 commits intomainfrom
css-loader-tests

Conversation

@alexander-akait
Copy link
Copy Markdown
Member

Summary

tests from css-loader + more configuration for CSS modules

What kind of change does this PR introduce?

feat and test

Did you add tests for your changes?

Yes

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?

Nothing

Use of AI

No

Copilot AI review requested due to automatic review settings March 24, 2026 02:08
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Mar 24, 2026

🦋 Changeset detected

Latest commit: 2d5728c

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 24, 2026

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

Install it locally:

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

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

Adds css-loader-derived test coverage and extends CSS Modules generator configuration to support a configurable hash function and functional localIdentName generation.

Changes:

  • Added a new localIdentHashFunction option and allowed localIdentName to be a function (types + schema + defaults).
  • Added/updated CSS config cases (incl. new css-loader suite) and snapshots.
  • Updated internal templated-path handling by exporting interpolate and using it for CSS local ident generation.

Reviewed changes

Copilot reviewed 44 out of 55 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
types.d.ts Extends public TS types for CSS module generator options (localIdentHashFunction, function localIdentName) and PathData.local.
test/test262-cases Updates the test262 submodule reference used by the test suite.
test/configCases/css/exports-convention/webpack.config.js Adds a new CSS module rule variant to test namedExports: false behavior with exportsConvention.
test/configCases/css/exports-convention/test.config.js Includes the new bundle in the expected outputs list.
test/configCases/css/exports-convention/index.js Updates assertions/snapshots for the new variant and adjusted module count.
test/configCases/css/exports-convention/snapshots/ConfigTest.snap Adds snapshots for the new upper-no-named-exports scenario.
test/configCases/css/exports-convention/snapshots/ConfigCacheTest.snap Adds cache-mode snapshots for the new upper-no-named-exports scenario.
test/configCases/css/css-loader/webpack.config.js Introduces a new css-loader-style config case covering many CSS Modules behaviors and localIdentName variants.
test/configCases/css/css-loader/tilde.module.css CSS fixture to test ~ resolution behavior.
test/configCases/css/css-loader/test.config.js Loads emitted CSS via a <link> tag in the test runtime.
test/configCases/css/css-loader/secondary-button.css CSS fixture for composes dedup tests.
test/configCases/css/css-loader/scope-at-rule.module.css Fixture to exercise @scope handling in CSS modules.
test/configCases/css/css-loader/resolving-from-node_modules.module.css Fixture to validate resolving stylesheet paths from node_modules.
test/configCases/css/css-loader/remove-source-map-url-loader.js Adds a helper loader to strip sourceMappingURL comments for stable snapshots.
test/configCases/css/css-loader/primary-button.css CSS fixture for composes dedup tests.
test/configCases/css/css-loader/prefer-relative.module.css Fixture to test prefer-relative resolving vs node_modules.
test/configCases/css/css-loader/package/one.css Fixture for prefer-relative test case.
test/configCases/css/css-loader/order.module.css Fixture to test composes import ordering.
test/configCases/css/css-loader/order-2.css Fixture for ordering test case.
test/configCases/css/css-loader/order-1.css Fixture for ordering test case.
test/configCases/css/css-loader/nesting.module.css Fixture to test CSS nesting + composes interactions.
test/configCases/css/css-loader/local-Ident-name.module.css Fixture to test many edge-case selector names for local ident generation.
test/configCases/css/css-loader/index.js Adds the runtime test that imports all fixtures and snapshots exports + emitted CSS.
test/configCases/css/css-loader/icss.module.css Fixture to test ICSS :export/:import behaviors.
test/configCases/css/css-loader/foo.less Fixture to test composing from LESS.
test/configCases/css/css-loader/dedup.module.css Fixture to test deduping composed classes.
test/configCases/css/css-loader/composes-multiple.module.css Fixture to test complex composes syntax (multiple, aliases, global).
test/configCases/css/css-loader/composes-global.module.css Fixture for global composition behavior.
test/configCases/css/css-loader/composes-from-less.module.css Fixture for composing from a LESS file.
test/configCases/css/css-loader/classes.module.css Fixture to test reserved names like default/module.
test/configCases/css/css-loader/button.css Fixture for composed base class.
test/configCases/css/css-loader/basic.module.css Fixture covering many CSS Modules parsing/transform cases.
test/configCases/css/css-loader/at-sign-in-package-name.module.css Fixture to test @scope package name path rewriting/escaping.
test/configCases/css/css-loader/animation-name.module.css Fixture to test animation-name rewriting.
test/configCases/css/css-loader/alias.css Fixture to test import aliasing in composes.
test/configCases/css/css-loader/alias-1.css Fixture to test multi-alias composition.
test/configCases/css/css-loader/snapshots/ConfigTest.snap Adds snapshots for the new css-loader config case (non-cache).
test/configCases/css/css-loader/snapshots/ConfigCacheTest.snap Adds snapshots for the new css-loader config case (cache).
schemas/plugins/css/CssModuleGeneratorOptions.check.js Regenerates schema validator to include localIdentHashFunction and function localIdentName.
schemas/WebpackOptions.json Updates JSON schema to allow function CssGeneratorLocalIdentName and add localIdentHashFunction.
lib/dependencies/CssIcssExportDependency.js Implements functional localIdentName, uses interpolate, adds localIdentHashFunction, and allows @ during ID sanitization.
lib/config/defaults.js Wires defaults for localIdentHashFunction to module generator options; adjusts related typedefs/docs.
lib/TemplatedPathPlugin.js Renames internal helper to interpolate, uses it in assetPath, and exports it for reuse.
lib/Compilation.js Documents PathData.local support in JSDoc.
declarations/WebpackOptions.d.ts Updates public declarations for function localIdentName and adds localIdentHashFunction.
.changeset/hip-flies-rescue.md Declares a minor release for the new CSS Modules generator options.
Comments suppressed due to low confidence (1)

test/configCases/css/css-loader/webpack.config.js:1

  • test: /.css$/ treats . as “any character”, so it’s broader than intended. Use an escaped dot (/\.css$/) to only match .css file extensions (applies to the other .css rules in this file too).

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

const css = [];

// Skip first because import it by default
for (const link of links.slice(1)) {
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

document.getElementsByTagName("link") returns an HTMLCollection (not an Array), so links.slice(1) will throw at runtime in standard DOM implementations. Convert it to an array first (e.g., Array.from(links).slice(1)) before iterating.

Suggested change
for (const link of links.slice(1)) {
for (const link of Array.from(links).slice(1)) {

Copilot uses AI. Check for mistakes.
const { hashFunction } = runtimeTemplate.outputOptions;
const hashFunction =
/** @type {HashFunction} */
(generator.options.localIdentHashFunction);
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

localIdentHashFunction is optional, but this code assumes it is always present and passes it directly to createHash. To make this robust (and preserve prior behavior), fall back to runtimeTemplate.outputOptions.hashFunction when generator.options.localIdentHashFunction is undefined.

Suggested change
(generator.options.localIdentHashFunction);
(generator.options.localIdentHashFunction ||
runtimeTemplate.outputOptions.hashFunction);

Copilot uses AI. Check for mistakes.
Comment thread lib/dependencies/CssIcssExportDependency.js Outdated
Comment thread lib/config/defaults.js Outdated
Comment thread lib/dependencies/CssIcssExportDependency.js Outdated
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Mar 24, 2026

Merging this PR will degrade performance by 61.08%

⚡ 1 improved benchmark
❌ 3 regressed benchmarks
✅ 140 untouched benchmarks

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

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "context-esm", scenario '{"name":"mode-production","mode":"production"}' 8.5 MB 11 MB -23.31%
Memory benchmark "future-defaults", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 332.9 KB 687.6 KB -51.59%
Memory benchmark "react", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 863.2 KB 652.7 KB +32.24%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 264.9 KB 680.7 KB -61.08%

Comparing css-loader-tests (2d5728c) with main (d9e1148)

Open in CodSpeed

@github-actions
Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging css-loader-tests 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%
lib
   APIPlugin.js100%100%100%100%
   AbstractMethodError.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AsyncDependencyToInitialChunkError.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%87
   CacheFacade.js100%100%100%100%
   CaseSensitiveModulesWarning.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkRenderError.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%196, 216, 371
   CodeGenerationError.js100%100%100%100%
   CodeGenerationResults.js100%100%100%100%
   CommentCompilationWarning.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.54%100%100%98.54%1511, 1800, 1807, 1815, 1837, 2713, 3131, 3779, 3808, 3860–3861, 3865, 3870, 3886–3887, 3901–3902, 3907–3908, 4370, 4396, 470, 475, 5079, 5159, 5174, 5199–5200, 5202, 5518, 5523, 5529, 5532, 5544, 5546, 5550, 5566, 5581, 5612, 5666, 5690, 5800, 681–682
   Compiler.js99.56%100%100%99.56%1091–1092, 1100
   ConcatenationScope.js98.59%100%100%98.59%166
   ConcurrentCompilationError.js100%100%100%100%
   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%253, 385, 410, 435, 439, 450
   ContextReplacementPlugin.js100%100%100%100%
   CssModule.js81.32%100%100%81.32%152, 157–172
   DefinePlugin.js98.92%100%100%98.92%153–154, 170, 189, 263
   DelegatedModule.js95.24%100%100%95.24%240–244
   DelegatedModuleFactoryPlugin.js98.15%100%100%98.15%103
   DelegatedPlugin.js100%100%100%100%
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.13%100%100%98.13%351, 381
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DllEntryPlugin.js100%100%100%100%
   DllModule.js100%100%100%100%
   DllModuleFactory.js100%100%100%100%
   DllPlugin.js100%100%100%100%
   DllReferencePlugin.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%235, 375, 388–389
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentNotSupportAsyncWarning.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%48
   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.89%100%100%98.89%385–389, 526
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FalseIIFEUmdWarning.js100%100%100%100%
   FileSystemInfo.js99.49%100%100%99.49%168, 2142–2143, 2146, 2157, 2168, 2179, 261, 3497, 3512, 3536
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%396, 398, 402
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   GraphHelpers.js100%100%100%100%
   HarmonyLinkingError.js100%100%100%100%
   HookWebpackError.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnoreErrorModuleFactory.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   InvalidDependenciesModuleWarning.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibManifestPlugin.js97.14%100%100%97.14%114, 117
   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%1186, 1191, 1249, 1262, 1319, 1327
   ModuleBuildError.js100%100%100%100%
   ModuleDependencyError.js100%100%100%100%
   ModuleDependencyWarning.js100%100%100%100%
   ModuleError.js100%100%100%100%
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%105, 107
   ModuleGraph.js99.73%100%100%99.73%942
   ModuleGraphConnection.js100%100%100%100%
   ModuleHashingError.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   ModuleParseError.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleRestoreError.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleStoreError.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   ModuleWarning.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%619
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NoModeWarning.js100%100%100%100%
   NodeStuffInWebError.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1032, 1048, 1135, 1765, 1770–1780, 214, 722, 740, 757, 998
   NormalModuleFactory.js99.46%100%100%99.46%1032, 1337, 447, 459
   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.75%100%100%98.75%431–432, 437, 439, 503
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   RequireJsStuffPlugin.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%
   SizeFormatHelpers.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%265–266, 608
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.85%100%100%98.85%128–129
   UnhandledSchemeError.js100%100%100%100%
   UnsupportedFeatureWarning.js100%100%100%100%
   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.js96.97%100%100%96.97%43
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%317
   cli.js98.71%100%100%98.71%109, 453, 485, 527, 785
   formatLocation.js100%100%100%100%
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%86, 88, 97, 99
   webpack.js97.22%100%100%97.22%186, 208, 210
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%282, 306, 309, 361, 39
   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%70, 82, 90
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%104, 111–112, 120, 87
   PackFileCacheStrategy.js96.40%100%100%96.40%1225,

@alexander-akait alexander-akait merged commit 72598ef into main Mar 24, 2026
55 of 56 checks passed
@alexander-akait alexander-akait deleted the css-loader-tests branch March 24, 2026 12:34
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