fix(deps): clear GHSA-mw96-cpmx-2vgc by upgrading rollup - #12
Merged
Conversation
rollup was held at 4.52.5 because 4.53.0 and above panic — `called Option::unwrap() on a None value` — on input scripts/escapes.test.js feeds the parser, and the patched version for this advisory is 4.59.0. Mapping the panic showed it is far narrower than the note claimed. It needs all three of: a directive prologue, holding an escape *sequence* rather than a raw code unit, that is a lone surrogate. A raw surrogate parses. The same escape in a variable initializer, an object value, a property key, an import specifier or a template literal parses. Only `"\\uD800";` as the first statement does not, which is not a shape a bundler emits. So the pin bought nothing that mattered and cost a High advisory. rollup is now 4.62.4 and `pnpm audit` reports no known vulnerabilities. The parser is now called through a wrapper that turns a failure into the same refusal as anything else this module cannot handle. That is the existing design — refuse rather than emit an artifact the upload would reject — and it means an unreadable bundle fails closed with a legible message instead of an unexplained Rust panic. The directive-prologue case was already destined for a refusal, since a directive is not a value position; only which check gets there first has changed, so its test now asserts the guarantee rather than the wording. Also removes the renovate rule that disabled rollup updates entirely, which would otherwise have held it at a vulnerable version forever. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
| CVE | Package | Version |
|---|---|---|
| CVE-2026-27606 | rollup |
4.52.5 |
View full analysis in Upwind Console
Scan completed in 40s
Scan history (1 scan)
| Commit | Scanned at | New | Resolved | Net |
|---|---|---|---|---|
38ed5d8 < |
2026-08-17 01:15 UTC | 0 | -1 | -1 |
Last scanned: 38ed5d8 · 2026-08-17 01:15 UTC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
pnpm audit: 1 high → no known vulnerabilities.The pin was protecting against something narrower than we thought
rollup was held at
4.52.5because ≥4.53.0 panics —called Option::unwrap() on a None value— on inputscripts/escapes.test.jsfeeds the parser, and the fix for this advisory lands in4.59.0.Rather than take that on faith, I mapped the panic on 4.59.0. It needs all three of:
"\uD800";as the first statementlet x; "\uD800";(not a directive)A directive prologue holding a lone-surrogate escape is not a shape a bundler emits — real ones are
"use strict". So the pin was buying nothing that mattered and costing a High advisory.What changed
4.52.5→4.62.4.pnpm why rollupshows a single version, used byvite@7.3.6.parseAstis now called through a wrapper that turns a parser failure into the same refusal as anything else this module cannot handle. That is the module's existing contract — refuse rather than emit an artifact the upload would reject — so an unreadable bundle fails closed with a legible message instead of an unexplained Rust panic.Verified
pnpm audit→ no known vulnerabilities · 381/381 tests ·biome ciclean ·tsc --noEmitclean · renovate config validates.And the thing
escapes.jsexists for, checked on the new parser rather than assumed — a real single-file render, read back throughfindUnspellable:🤖 Generated with Claude Code