Skip to content

fix: replace DefinePlugin undefined member access with undefined#21040

Merged
alexander-akait merged 10 commits into
mainfrom
claude/verify-issue-15562-zISLD
May 26, 2026
Merged

fix: replace DefinePlugin undefined member access with undefined#21040
alexander-akait merged 10 commits into
mainfrom
claude/verify-issue-15562-zISLD

Conversation

@alexander-akait

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

Copy link
Copy Markdown
Member

Summary

DefinePlugin inlined the entire object definition when code accessed a property that was not defined on it (e.g. OBJECT.UNKNOWN emitted ({...}).UNKNOWN), which bloated output and could leak unrelated/secret values from the same object.

This resolves such undefined member accesses to undefined instead, via the expressionMemberChain and callMemberChain parser hooks, keyed by the chain root so it also covers:

  • dotted object keys ("config.env": { ... }config.env.MISSING);
  • optional and computed access (a?.b, a?.["b"]);
  • calls — a.MISSING() stays a throwing call and a.MISSING?.() short-circuits, neither inlining the object; call arguments are still substituted;
  • import.meta.* object keys.

A value dependency is recorded for every consulted define key (including dotted siblings such as OBJECT.SUB2) so persistent caching invalidates correctly.

Closes #15559.

What kind of change does this PR introduce?

fix

Did you add tests for your changes?

Yes:

  • test/configCases/plugins/define-plugin — undefined member access and non-optional calls (runs on all Node versions);
  • test/configCases/plugins/define-plugin-optional-chaining — optional chaining / optional calls, gated by the supportsOptionalChaining test filter (the emitted ?. is not parseable on Node 10/12);
  • test/configCases/plugins/define-plugin-import-metaimport.meta.* object key in an ESM build.

Does this PR introduce a breaking change?

No. Direct undefined member access resolved to undefined at runtime before (via the inlined object) and still does. The only difference for the common case is the emitted code (no object inlined). One edge-case nuance: a chain that read further through an undefined member (e.g. OBJECT.SUB1.UNKNOWN.deep) previously threw a TypeError at runtime and now evaluates to undefined.

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

n/a

Use of AI

This change was implemented with the assistance of Claude (Claude Code). AI was used to investigate the relevant JavascriptParser hooks, implement the fix in lib/DefinePlugin.js, write the test cases, and address review feedback. All output was reviewed and verified locally by running the affected test suites (ConfigTestCases) and tsc/lint.

When a member chain accessed a property that was not defined on a
DefinePlugin object, the whole object was inlined (e.g. `({...}).MISSING`),
leaking the entire definition. Resolve such accesses to `undefined` via the
expressionMemberChain hook instead. Closes #15559.
Replace EXPECTED_ANY with the precise CodeValue type for the resolved
member-chain value.
Shorten to the project's one/two-line comment style and stop over-claiming
that dotted-key object definitions are covered.
Key the undefined-member resolution on the chain root so dotted object
keys (e.g. `"config.env"`) are covered, and tap callMemberChain so calling
an undefined member replaces only the callee instead of inlining the
object: `x.MISSING()` stays a throwing call and `x.MISSING?.()`
short-circuits. Optional and computed access are covered too. Refs #15559.
Copilot AI review requested due to automatic review settings May 25, 2026 21:01
@changeset-bot

changeset-bot Bot commented May 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f250764

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 25, 2026

Copy link
Copy Markdown
Contributor

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

Install it locally:

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

@codecov

codecov Bot commented May 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.66%. Comparing base (c7d8a3a) to head (f250764).
⚠️ Report is 10 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff             @@
##             main   #21040       +/-   ##
===========================================
+ Coverage   37.94%   91.66%   +53.71%     
===========================================
  Files         423      573      +150     
  Lines       48945    59912    +10967     
  Branches    13475    16169     +2694     
===========================================
+ Hits        18574    54917    +36343     
+ Misses      30371     4995    -25376     
Flag Coverage Δ
integration 89.57% <100.00%> (?)
test262 45.33% <11.36%> (?)
unit 38.04% <11.36%> (+0.09%) ⬆️

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.

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

This PR fixes a DefinePlugin behavior where accessing an undefined property on an object definition could inline the entire object (potentially leaking secrets), by resolving unknown member-chain accesses to undefined via JavascriptParser’s expressionMemberChain/callMemberChain hooks (issue #15559).

Changes:

  • Add expressionMemberChain/callMemberChain handling in DefinePlugin to substitute unknown object-member accesses with undefined (and avoid inlining the whole object).
  • Add config-case coverage for unknown member access (including dotted keys, optional chaining, and calls).
  • Add a changeset entry for a patch release note.

Reviewed changes

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

File Description
lib/DefinePlugin.js Implements undefined-member-chain handling for object definitions and refactors object-definition detection.
test/configCases/plugins/define-plugin/webpack.config.js Extends DefinePlugin test configuration with nested and dotted object keys to reproduce the issue.
test/configCases/plugins/define-plugin/index.js Adds assertions covering unknown member access, optional chaining, and call-chain behavior.
.changeset/define-plugin-undefined-member.md Documents the behavioral fix as a patch change.

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

Comment thread lib/DefinePlugin.js
Comment on lines +805 to +814
// a leaf with members left is a real property access on a value
if (!isObjectDefinition(value)) return false;
const member = members[i];
const nextPath = `${path}.${member}`;
if (member in value) {
value = value[member];
} else if (nextPath in definitions) {
// defined via a dotted sibling key, e.g. `OBJECT.SUB2`
value = definitions[nextPath];
} else {

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.

For the definitions-map lookup I switched to Object.prototype.hasOwnProperty.call(...) as suggested.

For member in value I kept the in operator on purpose: a define like OBJECT: { SUB: 1 } means OBJECT is that object literal, so inherited members must keep working — OBJECT.toString() should evaluate to the object's toString, not undefined. Switching to an own-property check would rewrite OBJECT.toString/OBJECT.hasOwnProperty to undefined and break those calls. Genuinely-absent properties (typos, missing secrets) are not on Object.prototype, so in already returns false for them and the object is not inlined. Accessing an actual inherited member inherently requires materializing the object, so there's no extra leak beyond what that access implies.


Generated by Claude Code

Comment thread lib/DefinePlugin.js
Comment on lines +821 to +827
parser.hooks.expressionMemberChain
.for(chainRoot)
.tap(PLUGIN_NAME, (expr, members) => {
if (!isUndefinedMemberAccess(members)) return;
addValueDependency(key);
return toConstantDependency(parser, "undefined")(expr);
});

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.

Good catch. isUndefinedMemberAccess now collects every define key it consults (including dotted siblings resolved via definitions[nextPath]), and both the expressionMemberChain and callMemberChain handlers call addValueDependency for each before substituting — so changing OBJECT.SUB2 invalidates modules whose output depended on it. Fixed in 372f6e2 (covers the callMemberChain case in the sibling comment too).


Generated by Claude Code

Comment thread lib/DefinePlugin.js
Comment on lines +831 to +841
parser.hooks.callMemberChain
.for(chainRoot)
.tap(PLUGIN_NAME, (expr, members) => {
if (!isUndefinedMemberAccess(members)) return;
addValueDependency(key);
toConstantDependency(
parser,
"undefined"
)(/** @type {Expression} */ (expr.callee));
parser.walkExpressions(expr.arguments);
return true;
@codspeed-hq

codspeed-hq Bot commented May 25, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 25.31%

⚡ 5 improved benchmarks
❌ 7 regressed benchmarks
✅ 132 untouched benchmarks
⏩ 72 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "devtool-eval", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 404.5 KB 697.4 KB -42.01%
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development","mode":"development"}' 1.6 MB 2.5 MB -36.62%
Memory benchmark "concatenate-modules", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 150.8 KB 125.3 KB +20.37%
Memory benchmark "many-chunks-esm", scenario '{"name":"mode-production","mode":"production"}' 9.2 MB 7.3 MB +25.85%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 277.9 KB 198.8 KB +39.76%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-production","mode":"production"}' 7.7 MB 9.9 MB -22.11%
Memory benchmark "asset-modules-source", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 173.4 KB 3,722.6 KB -95.34%
Memory benchmark "cache-filesystem", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 493.9 KB 699.6 KB -29.4%
Memory benchmark "asset-modules-bytes", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 139.3 KB 322 KB -56.74%
Memory benchmark "many-modules-esm", scenario '{"name":"mode-development","mode":"development"}' 1.3 MB 1.1 MB +23.32%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-production","mode":"production"}' 6.9 MB 9.4 MB -26.69%
Memory benchmark "wasm-modules-async", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1,545.6 KB 399.9 KB ×3.9

Tip

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


Comparing claude/verify-issue-15562-zISLD (f250764) with main (224f3ee)2

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.

  2. No successful run was found on main (169b511) during the generation of this report, so 224f3ee was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

…access

`import.meta` is a single MetaProperty chain root, not two members, so
`key.split(".")` mis-rooted it on `import`. Detect the `import.meta`
prefix when computing the chain root so undefined member access on an
`import.meta.*` object define resolves to `undefined` instead of inlining
the object. Refs #15559.
…alChaining

The bundle emits `?.` syntax, which Node 10/12 cannot parse, so move the
optional-chaining and optional-call assertions into separate config cases
guarded by a supportsOptionalChaining test.filter. The main define-plugin
case keeps only non-optional syntax so it still runs on all Node versions.
Copilot AI review requested due to automatic review settings May 26, 2026 10:03
… access

When an undefined member access resolves through a dotted sibling define
(e.g. `OBJECT.SUB2.b` via `definitions["OBJECT.SUB2"]`), record a value
dependency on every consulted key so the persistent cache invalidates when
the sibling definition changes. Use an own-property check for the
definitions-map lookup.

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 10 changed files in this pull request and generated 3 comments.

Comment thread lib/DefinePlugin.js
Comment on lines +809 to +814
/** @type {CodeValue} */
let value = /** @type {CodeValue} */ (obj);
let path = key;
for (let i = chainPrefix.length; i < members.length; i++) {
// a leaf with members left is a real property access on a value
if (!isObjectDefinition(value)) return false;

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.

Keeping in here intentionally. A define like OBJECT: { SUB: 1 } means OBJECT is that object literal, so inherited members must keep working: today OBJECT.SUB.toString() compiles to ({"a":1}).toString() and returns "[object Object]". Switching to hasOwnProperty would rewrite the callee to undefined, so OBJECT.SUB.toString() becomes undefined() and throws — a regression versus current behavior. Genuinely-absent properties (typos / missing secrets) are not on Object.prototype, so in already returns false for them and the object is not inlined. Accessing a real inherited member inherently requires materializing the object, so in does not leak anything beyond what that access already implies. (The definitions-map lookup does use hasOwnProperty, since config keys are own properties.)


Generated by Claude Code

Comment thread lib/DefinePlugin.js
Comment on lines +813 to +817
// a leaf with members left is a real property access on a value
if (!isObjectDefinition(value)) return false;
const member = members[i];
const nextPath = `${path}.${member}`;
if (member in value) {

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.

This is consistent with how the plugin already works: every instance processes its own this.definitions throughout (walkDefinitions, the expression/typeof/evaluate hooks, etc.), and the hooks.definitions waterfall is exposed for external observers rather than consumed internally. So an instance that only defines OBJECT has never resolved a sibling OBJECT.SUB2 contributed by a different instance — the member-chain lookup just follows that same per-instance scope. Making member-chain resolution operate on the merged compilation-wide definitions would be a larger, cross-cutting change (the registration side keys handlers per instance too), so I'd prefer to keep it consistent here and treat cross-instance object-key merging as a separate enhancement if it's wanted. Happy to open a follow-up if you'd like it addressed.


Generated by Claude Code

Comment thread lib/DefinePlugin.js Outdated
const createHash = require("./util/createHash");

/** @typedef {import("estree").Expression} Expression */
/** @typedef {import("estree").CallExpression} CallExpression */

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 10 changed files in this pull request and generated 2 comments.

Comment thread lib/DefinePlugin.js Outdated
const createHash = require("./util/createHash");

/** @typedef {import("estree").Expression} Expression */
/** @typedef {import("estree").CallExpression} CallExpression */
Comment thread lib/DefinePlugin.js
Comment on lines +145 to +154
/**
* Whether a value is a nested definition (plain object/array) to recurse into.
* @param {CodeValue} code code value
* @returns {code is Definitions} true for a plain object or array
*/
const isObjectDefinition = (code) =>
Boolean(code) &&
typeof code === "object" &&
!(code instanceof RuntimeValue) &&
!(code instanceof RegExp);
…lution

Adds a case for `OBJECT.SUB1.toString` so the walk-through branch and the
fully-resolved return are exercised, and asserts inherited members stay
reachable (the `in` behavior).

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 10 changed files in this pull request and generated no new comments.

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging claude/verify-issue-15562-zISLD into main will be
98.97%
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%381, 427
   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.78%100%100%98.78%409, 411, 415
   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%1301, 1306, 1366, 1380, 1442, 1451
   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.46%100%100%98.46%10, 119, 471, 503, 545, 815
   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.29%100%100%99.29%1426–1428, 1436, 271, 274, 279, 283
   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 merged commit f8537a2 into main May 26, 2026
58 checks passed
@alexander-akait alexander-akait deleted the claude/verify-issue-15562-zISLD branch May 26, 2026 15:36
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.

DefinePlugin inserts entire object when desired object property is missing

2 participants