Skip to content

fix: substitute [fullhash] in url() public paths for inlined CSS export types#21054

Merged
alexander-akait merged 6 commits into
mainfrom
claude/css-modules-export-hash-qFsY7
May 29, 2026
Merged

fix: substitute [fullhash] in url() public paths for inlined CSS export types#21054
alexander-akait merged 6 commits into
mainfrom
claude/css-modules-export-hash-qFsY7

Conversation

@alexander-akait

@alexander-akait alexander-akait commented May 28, 2026

Copy link
Copy Markdown
Member

Summary

Inlined CSS export types (style, text, css-style-sheet) embed CSS into JS at code-generation time, before the compilation hash exists, so renderModule left the __WEBPACK_CSS_PUBLIC_PATH_FULL_HASH_ placeholder unsubstituted in url() public paths that use [fullhash]/[hash] — shipping a broken URL. The link type was unaffected (it substitutes the real hash at render time).

The fix splices __webpack_require__.h() into the JS string literal so the hash resolves at runtime, mirroring renderModule's build-time substitution for the link path. The PR also includes follow-on cleanups: a shared walkFullHashPlaceholders scanner, a per-source placeholder-offset cache in CssModulesPlugin (avoids re-materializing/re-scanning module sources), analogous dedup of redundant HTML render work, and moving the public-path placeholder constants to lib/util/publicPathPlaceholder.js (they were a cross-cutting protocol parked on CssUrlDependency). Placeholder string values are unchanged.

What kind of change does this PR introduce?

fix (with related refactor/perf cleanups)

Did you add tests for your changes?

Yes — test/configCases/css/export-type-fullhash-publicpath/ covers all three inlined export types across [fullhash] and [fullhash:8] public paths. Existing CSS/HTML/asset suites (snapshots byte-identical) cover the refactors.

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?

n/a

Use of AI

AI (Claude) was used to investigate the bug, write the reproduction test, implement the fix, and perform the follow-on refactor/perf work; all changes were reviewed and verified against the test suites.

…rt types

Inlined CSS export types (style, text, css-style-sheet) leave the
__WEBPACK_CSS_PUBLIC_PATH_FULL_HASH_ placeholder unsubstituted in url()
because renderModule is called without the compilation hash.
Copilot AI review requested due to automatic review settings May 28, 2026 18:15
@changeset-bot

changeset-bot Bot commented May 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 4630f27

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

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

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

github-actions Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

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

Install it locally:

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

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.

Pull request overview

Adds a configCases test that reproduces a bug where [fullhash] in output.publicPath is not substituted in url() references for CSS modules using inlined exportTypes (text, css-style-sheet, style). The CSS placeholder __WEBPACK_CSS_PUBLIC_PATH_FULL_HASH_ remains in the rendered output because renderModule is invoked without the compilation hash for these export types. No production code fix is included.

Changes:

  • New test/configCases/css/export-type-fullhash-publicpath fixture with webpack.config.js enabling experiments.css, three CSS files mapped to the three inlined exportTypes, and a shared image asset.
  • index.js containing three it(...) assertions that the rendered CSS for each exportType contains the substituted public path and not the raw placeholder.
  • test.config.js selecting bundle0.js as the bundle under test.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
test/configCases/css/export-type-fullhash-publicpath/webpack.config.js Configures [fullhash] publicPath and three exportType rules.
test/configCases/css/export-type-fullhash-publicpath/text.css CSS fixture with url() for the text exportType.
test/configCases/css/export-type-fullhash-publicpath/sheet.css CSS fixture with url() for the css-style-sheet exportType.
test/configCases/css/export-type-fullhash-publicpath/inject.css CSS fixture with url() for the style exportType.
test/configCases/css/export-type-fullhash-publicpath/index.js Assertions that the [fullhash] placeholder is resolved across all three exportTypes.
test/configCases/css/export-type-fullhash-publicpath/test.config.js findBundle returning the JS bundle to execute.

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

Comment on lines +7 to +28
it("should substitute [fullhash] in url() for text exportType", () => {
expect(textCss).toContain("https://example.com/");
expect(textCss).not.toContain(PLACEHOLDER);
});

it("should substitute [fullhash] in url() for css-style-sheet exportType", () => {
expect(sheet).toBeInstanceOf(CSSStyleSheet);
const cssText = Array.from(sheet.cssRules)
.map(r => r.cssText)
.join("\n");
expect(cssText).toContain("https://example.com/");
expect(cssText).not.toContain(PLACEHOLDER);
});

it("should substitute [fullhash] in url() for style exportType", () => {
if (typeof document === "undefined") return;
const styles = document.getElementsByTagName("style");
const allStyleText = Array.from(styles)
.map(s => s.textContent)
.join("\n");
expect(allStyleText).toContain("https://example.com/");
expect(allStyleText).not.toContain(PLACEHOLDER);

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

The fix landed in this same PR (runtime __webpack_require__.h() substitution in CssGenerator._cssToJsLiteral), so these assertions now pass and the suite stays green. Title/description updated to reflect that the fix is included.


Generated by Claude Code

@codecov

codecov Bot commented May 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.89474% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.73%. Comparing base (c076bec) to head (4630f27).
⚠️ Report is 6 commits behind head on main.

Files with missing lines Patch % Lines
lib/util/publicPathPlaceholder.js 92.30% 2 Missing ⚠️

❌ Your changes status has failed because you have indirect coverage changes. Learn more about Unexpected Coverage Changes and reasons for indirect coverage changes.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #21054      +/-   ##
==========================================
+ Coverage   89.69%   91.73%   +2.04%     
==========================================
  Files         577      581       +4     
  Lines       60361    60658     +297     
  Branches    16321    16411      +90     
==========================================
+ Hits        54139    55647    +1508     
+ Misses       6222     5011    -1211     
Flag Coverage Δ
integration 89.63% <97.89%> (+0.01%) ⬆️
test262 45.72% <14.49%> (-0.03%) ⬇️
unit 38.25% <14.49%> (?)

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

codspeed-hq Bot commented May 28, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 20.23%

⚡ 4 improved benchmarks
❌ 4 regressed benchmarks
✅ 118 untouched benchmarks
⏩ 90 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "side-effects-reexport", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1.2 MB 1 MB +20.54%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-production","mode":"production"}' 10 MB 7.3 MB +36.35%
Memory benchmark "context-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 985 KB 661.1 KB +48.98%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 183.8 KB 452.4 KB -59.37%
Memory benchmark "context-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 138.8 KB 174 KB -20.27%
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development","mode":"development"}' 2.5 MB 1.6 MB +54.71%
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 216.7 KB 1,196.1 KB -81.89%
Memory benchmark "future-defaults", scenario '{"name":"mode-production","mode":"production"}' 8.4 MB 11.4 MB -26.26%

Tip

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


Comparing claude/css-modules-export-hash-qFsY7 (4630f27) with main (4fbec23)

Open in CodSpeed

Footnotes

  1. 90 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.

…types

Inlined CSS export types (style, text, css-style-sheet) embed CSS into JS
at code generation time, before the compilation hash exists, so renderModule
left the PUBLIC_PATH_FULL_HASH placeholder unresolved in url() public paths.
Splice __webpack_require__.h() into the JS literal so the hash resolves at
runtime, matching renderModule's build-time substitution for the link path.
Both renderModule (build-time hash) and CssGenerator._cssToJsLiteral
(runtime __webpack_require__.h()) parsed the PUBLIC_PATH_FULL_HASH
placeholder with duplicated logic. Move the scan into
CssUrlDependency.walkFullHashPlaceholders and have both callers supply
their own substitution via a callback.
Copilot AI review requested due to automatic review settings May 29, 2026 12:30

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.

Pull request overview

Copilot reviewed 10 out of 11 changed files in this pull request and generated 1 comment.

"webpack": patch
---

Resolve `[fullhash]` in `url()` public paths for inlined CSS export types (`style`/`text`/`css-style-sheet`) at runtime.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Correct — the fix is included. Updated the PR title to fix: and rewrote the description to cover the fix plus the related refactor/perf cleanups.


Generated by Claude Code

renderModule re-materialized and re-scanned each module source for
PUBLIC_PATH_AUTO / PUBLIC_PATH_FULL_HASH placeholders on every cache miss
(distinct undoPath/hash/inheritance/runtime). The offsets are invariant for
a given source, so compute them once into a weakly-keyed plan and reuse it,
and skip the ReplaceSource wrapper entirely when a module has no placeholders.
HtmlGenerator._renderHtml ran the full dependency-template pass twice for
extracted modules (once per HTML and JS source type), even though the passes
differ only in the [webpack/auto] substitution. Cache the raw render per
codeGeneration() call (keyed by its shared runtimeRequirements Set) and reuse
it. Also memoize HtmlModulesPlugin.renderManifest's sentinel resolution and
intermediate content hash per source, so a module landing in multiple chunks
resolves its chunk-URL sentinels once instead of per (chunk, module).
Copilot AI review requested due to automatic review settings May 29, 2026 14:13

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.

Pull request overview

Copilot reviewed 14 out of 15 changed files in this pull request and generated 1 comment.

Comment on lines +1 to +5
---
"webpack": patch
---

Resolve `[fullhash]` in `url()` public paths for inlined CSS export types (`style`/`text`/`css-style-sheet`) at runtime.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Title and description updated to accurately describe the fix and the related caching/refactor work. Keeping it as one PR since the refactors (shared scanner, placeholder-offset cache, placeholder relocation) directly follow from the fix and share the same test coverage.


Generated by Claude Code

The PUBLIC_PATH_AUTO / PUBLIC_PATH_FULL_HASH placeholders and the
walkFullHashPlaceholders scanner lived on CssUrlDependency, but they are a
cross-cutting code-generation protocol: AssetGenerator and the HTML
generator/plugin imported the CSS dependency only to reach them. Move them to
lib/util/publicPathPlaceholder.js and import from there, so asset/css/html no
longer couple to CssUrlDependency for this. Placeholder string values are
unchanged.
@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging claude/css-modules-export-hash-qFsY7 into main will be
98.98%
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.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-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%
   CleanPlugin.js99.15%100%100%99.15%206, 226
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.48%100%100%98.48%1576, 1872, 1879, 1887, 1909, 2805, 3230, 3894, 3923, 3976–3977, 3981, 3986, 4002–4003, 4017–4018, 4023–4024, 4501, 4527, 511, 516, 5335, 5367, 5384, 5400, 5416, 5431, 5456–5457, 5459, 5787, 5792, 5798, 5801, 5813, 5815, 5819, 5835, 5850, 5882, 5936, 5960, 6074, 730–731
   Compiler.js99.56%100%100%99.56%1135–1136, 1144
   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.40%100%100%97.40%258, 395, 418, 420, 424, 433–434
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js99%100%100%99%170–171, 187, 206, 280
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%384, 430
   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.97%100%100%98.97%425–429, 577
   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.85%100%100%98.85%434, 436, 440
   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.49%100%100%98.49%1304, 1309, 1369, 1383, 1445, 1454
   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%
   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.69%100%100%99.69%659
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js98.12%100%100%98.12%1212, 1215, 1232, 1249, 1496, 1530, 1546, 1633, 2257, 2262–2272, 569
   NormalModuleFactory.js99.47%100%100%99.47%1083, 1392, 486, 498
   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.js98.62%100%100%98.62%220, 224, 226, 419, 430, 891
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%136–137
   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%326
   cli.js98.50%100%100%98.50%10, 119, 487, 519, 569, 839
   index.js99.72%100%100%99.72%165
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js96.33%100%100%96.33%10, 198, 220, 222
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.32%100%100%97.32%283, 307, 310, 36, 362, 41
   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.30%100%100%99.30%1427–1429, 1437, 272, 275, 280, 284
   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%
   

@alexander-akait alexander-akait changed the title test: add failing repro for [fullhash] publicPath in inlined CSS export types fix: substitute [fullhash] in url() public paths for inlined CSS export types May 29, 2026
@alexander-akait alexander-akait requested a review from Copilot May 29, 2026 15: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.

Pull request overview

Copilot reviewed 16 out of 17 changed files in this pull request and generated no new comments.

@alexander-akait alexander-akait merged commit 66f71f8 into main May 29, 2026
59 of 62 checks passed
@alexander-akait alexander-akait deleted the claude/css-modules-export-hash-qFsY7 branch May 29, 2026 16:15
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