chore: batch dependency updates and fix brace-expansion advisory - #393
Conversation
Consolidates the mergeable Dependabot PRs into a single lockfile-consistent change, and resolves GHSA-mh99-v99m-4gvg (CVE-2026-14257). Dependency updates (supersedes #384, #385, #386, #387): - xmlbuilder2 3.1.1 -> 4.0.3 - @release-it/conventional-changelog 10.0.1 -> 12.0.0 (all packages) - @babel/preset-env 7.26.9 -> 8.0.2 (examples/jest) - @typescript-eslint/parser 8.0.0 -> 8.65.0 Security fix: brace-expansion had 9 nested copies still on vulnerable 1.1.16/2.1.2 even after the top-level bump in #382, which is why the alert stayed open. Each major line has its own backport, so per-major overrides patch every copy without forcing a breaking jest-config major. Verified: xmlbuilder2 3.x and 4.x produce byte-identical JUnit XML for this codebase's usage (unicode, XML escaping, CDATA, "]]>" sequences). The advisory PoC ('{a,b}'.repeat(1500)), which crashed the process with an uncatchable OOM, now returns bounded output on all three major lines. Excludes @babel/code-frame 8.0.0 (#383, #389): v8 changed `column` from 1-based to 0-based. error.ts parses columns from V8 stack traces, which are 1-based, so the bump shifts every code-frame caret one column right. Needs a compensating fix, so it is left for a separate change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
📝 WalkthroughSummary by CodeRabbit
WalkthroughUpdated dependency declarations across the repository. The root manifest adds Suggested reviewers: 🚥 Pre-merge checks | ✅ 3 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed: dependency version conflict. Check your lock file or package.json. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@package.json`:
- Around line 32-37: Update the brace-expansion entries in the package.json
overrides object to patched versions newer than 1.1.18, 2.1.4, and 5.0.7,
covering every listed major version and ensuring the lockfile resolves only
non-vulnerable releases for GHSA-mh99-v99m-4gvg.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: bc70d56c-bc2c-4257-aec5-5f09b5d83ea6
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json,!package-lock.json
📒 Files selected for processing (5)
examples/jest/package.jsonpackage.jsonpackages/cmd/package.jsonpackages/jest/package.jsonpackages/node-test-reporter/package.json
|
Thanks — I dug into this, but I don't think the finding holds. 1.1.18 and 2.1.4 are the patched releases for their major lines, so no change is needed here. Why
|
| version | published |
|---|---|
| 5.0.7 (vulnerable) | 2026-06-29 |
| 5.0.9 | 2026-07-30 10:00:32Z |
| 2.1.4 | 2026-07-30 10:15:01Z |
| 1.1.18 | 2026-07-30 10:17:06Z |
Verified behaviourally
The advisory's own PoC — expand('{a,b}'.repeat(1500)), which kills a vulnerable process with an uncatchable OOM that try/catch cannot trap — returns bounded output on all three lines:
v1.1.18 -> PoC bounded: 2666 results in 382ms | correctness: ["a1","a2","b1","b2"]
v2.1.4 -> PoC bounded: 2666 results in 262ms | correctness: ["a1","a2","b1","b2"]
v5.0.9 -> PoC bounded: 2666 results in 256ms | correctness: ["a1","a2","b1","b2"]
The suggested fix doesn't change the result
I tested collapsing the overrides to a single "brace-expansion": "^5.0.9". npm still resolves 1.1.18 and 2.1.4 for the nested copies, because ^5.0.9 cannot satisfy dependents that require ^1.0.0/^2.0.0:
5.0.9 node_modules/brace-expansion
1.1.18 node_modules/glob/node_modules/brace-expansion <- unchanged
2.1.4 node_modules/archiver-utils/node_modules/brace-expansion <- unchanged
The only override that would force 5.x everywhere is one that breaks those dependents' declared ranges. The per-major form is what actually pins each line to its patched release, and it documents that intent explicitly.
Keeping the overrides as-is. Happy to revisit if the advisory is later amended with explicit 1.x/2.x ranges.
User description
Consolidates the mergeable Dependabot PRs into a single lockfile-consistent change and resolves the one open Dependabot alert.
Dependency updates
Supersedes #384, #385, #386, #387 — same bumps, one regenerated lockfile:
xmlbuilder2@release-it/conventional-changelog@babel/preset-env@typescript-eslint/parserSecurity fix — GHSA-mh99-v99m-4gvg / CVE-2026-14257 (high)
The top-level bump in #382 left 9 nested copies on vulnerable 1.1.16/2.1.2, which is why alert #170 stayed open. Each major line has its own backport, so per-major
overridespatch every copy without forcing a breakingjest-configmajor.All 10 copies now resolve to 1.1.18 / 2.1.4 / 5.0.9.
Verification
npm cisucceeds — lockfile and manifests in syncprettier --checkunchanged vsmain(same 7 pre-existing warnings)main— no incidental drift]]>sequences'{a,b}'.repeat(1500)), which crashed the process with an uncatchable OOM, returns bounded output on all three major linesexamples/jestresults identical tomain(the one failure is an intentional[failed]fixture)Excluded:
@babel/code-frame8.0.0 (#383, #389)Not included — it is a silent output regression. v8 changed
columnfrom 1-based to 0-based:packages/jest/src/lib/error.ts:45parses the column from a V8 stack trace, and V8 stack columns are 1-based. Feeding that to v8 shifts every code-frame caret one column right:The jest package has no tests, so this would have merged unnoticed. It needs a compensating
column - 1, which belongs in its own reviewed change.Suggested follow-ups
packages/jestandpackages/node-test-reporterhave no tests, and CI only runspackages/cmd— the two packages carrying runtime deps are unexercisedpackages/node-test-reporterdeclares notypescriptdevDependency, so it floats to whatever is hoisted (it picks up TS 6 and fails to build on a fresh lockfile resolution)🤖 Generated with Claude Code
Generated description
Below is a concise technical summary of the changes proposed in this PR:
Batch the workspace dependency bumps across the release, lint, and example test flows, updating the affected package manifests and regenerating the lockfile. Patch
brace-expansionwith rootoverridessopackages/jestandpackages/node-test-reporterresolve only fixed nested copies.package-lock.jsonto keep everything lockfile-consistent.Modified files (6)
Latest Contributors(2)
overridesto force allbrace-expansionmajors onto patched releases and clear the open advisory.Modified files (2)
Latest Contributors(2)