Repository navigation
Deps: refresh vulnerable transitives, eslint 9 in the bare example - #185
Conversation
…example Move body-parser, joi, launch-editor, node-forge, undici, fast-uri and qs to patched versions inside their parents' ranges (one lock refresh instead of seven Dependabot PRs), and take the bare example from eslint 8 to 9, which @react-native/eslint-config supports (it does not support 10). That removes the @humanwhocodes, rimraf 3 and eslint 8 advisories. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters: 1
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including
|
|
Claude finished @krassx's task in 32s —— View job Review of PR #185: deps security refresh
What I checked:
What I did not do: I did not run FindingsOne P3, posted inline on Summary
|
| languageName: node | ||
| linkType: hard | ||
|
|
||
| "@stryker-mutator/core@npm:^10.0.0": |
There was a problem hiding this comment.
Severity: P3 Low
Problem: The lock refresh also moves the whole Stryker family (core, api, instrumenter, jest-runner, util) from 10.0.0 to 10.1.1. The PR description lists only the security transitives and the eslint change, so this bump isn't called out.
Impact: The repo has mutation gates (see the mutate:* scripts and the sharded cost-balancing in 2ca6a48). A tool bump can shift mutant counts, timeouts or scores, so a mutation-gate failure after merge would be hard to attribute to this "deps-only" PR.
Scenario: The next mutation CI run reports different scores or shard timing, and the cause isn't obvious because the PR text says nothing about Stryker.
Fix: Either mention the Stryker bump in the PR description (it is within ^10.0.0), or confirm the mutation gates are green on this branch before merging. I did not run them.
There was a problem hiding this comment.
Fixed in the latest push: I regenerated yarn.lock from main and redid only the intended refresh, so @stryker-mutator/* stays at 10.0.0 (it had floated to 10.1.1 as a side effect).
There was a problem hiding this comment.
Stale comment
Deep review (c94e96a)
Overall risk: Low
Merge recommendation: Approve — no P0–P3 findings. GitHub CI (including mutation, becauseyarn.lockis an all-gates trigger) was still in flight at review time; locallyyarn install --immutable,yarn lint, andyarn testalready pass.Intent
One lock refresh for the vulnerable transitives (instead of Dependabot #167, #179, #180, #181, #183, #184) plus taking the bare example off eslint 8, which
@react-native/eslint-config0.87.1 does not allow to go to 10 (#171/#175).These packages are not in the published
@bugsee/react-nativeruntime. They sit under RN CLI / Metro, Expo CLI, node-gyp, Stryker, and leftover example-dev tooling.What I checked against callers, not just the diff
Package Lock Parent range Advisory / note body-parser 2.4.0 cli-server-api ^2.2.2GHSA-27r3-jxmh-p828 (CVE-2026-111181) qs (body-parser copy) 6.17.1 body-parser ^6.16.1closes GHSA-6pq8 on that copy (6.16.0 was still in range) joi 17.13.9 RN CLI ^17.2.1GHSA-4528-x5fx-h6hg launch-editor 2.14.2 cli-tools ^2.9.1GHSA-587h / GHSA-698v / GHSA-r825 (Windows) node-forge 1.4.2 Expo ^1.3.31.4.1 is the security floor; 1.4.2 restores pem.decode(Buffer)which 1.4.1 brokeundici 8.12.3 node-gyp ^8.4.18.10.2 was still open to the 8.12.2 TLS/cache/Content-Encoding set fast-uri 3.1.9 ajv 8.20.0 ^3.0.1GHSA-w74x / GHSA-wjr9 / GHSA-xhq7 / GHSA-333x eslint (bare example) 9.39.5 @react-native/eslint-configpeers^8 || ^9drops @humanwhocodes/config-array,rimraf@3, espree 9Root lint is eslint 10 via
eslint.config.mjs(nmHoistingLimits: workspaces), so the example’s eslint 9 does not replace it. The example has no lint script and no RN.eslintrc/ flat config; the root config already lintsexamples/**.Unmentioned lock float:
@stryker-mutator/*10.0.0 → 10.1.1 (root^10.0.0). 10.1.1 is the provenance re-release of 10.1.0. Jest-relevant change is the runner shared-cache race fix; no listed breaking change. Mutation plan vs shard counts are computed from the same instrumenter, so a 10.0→10.1 mutant-count shift would not fail the merge equality check — onlybreak: 95could, and there is no evidence it will.Verification I actually ran
yarn install --immutable— success (warnings below).yarn lint— success (root eslint 10).yarn test— 163 suites passed, 1 skipped; 4639 tests passed, 19 skipped.yarn npm audit --all --recursive— claimed packages are gone. Remaining set matches the PR body (qs 6.15.1 viatyped-rest-client@2.3.1, zod/glob/decode-uri-component/uuid/jsdom stack, deepmerge, inflight/minimatch).Residuals (not blocking)
- New
YN0060:examples/bareprovides eslint 9.39.5, which does not satisfyeslint-plugin-ft-flow@2.0.3’s peer^8.1.0(the rest of@react-native/eslint-config0.87.1 does accept 9). Yarn still exits 0; CI install will too. The example never loads that config. I ranyarn workspace bugsee-example-bare exec eslint .: eslint 9.39.5 walks up to rooteslint.config.mjsand reports 124 files / 0 errors. Dropping the unusedeslint+@react-native/eslint-configpair from the example would also drop the eslint 8/9 advisory chain and this warning; keeping them as RN-template leftovers is consistent with the PR’s stated choice.qs@6.15.1remains an exact pin oftyped-rest-client@2.3.1(Stryker only). Documented.- Audit still flags zod 4.6.5 (
<4.6.6) via Stryker’smutation-server-protocol@0.4.1(^4.1.12) in addition to Expo’s 3.25.76. Pre-existing range; not introduced uniquely by this refresh.- eslint 9 itself still appears as an npm “no longer supported” deprecation. That is why 10 is the root, and why 9 is the ceiling for the example.
Positive
Lockfile matches the claimed patched versions; parents’ declared ranges hold; eslint 8 internals are actually gone; node-forge landed on 1.4.2 rather than stopping at 1.4.1; remaining issues are listed instead of claimed fixed. Avoiding Dependabot’s eslint 10 for the example is the right call given the RN config peer.
Most important issues to fix: none for merge. Optional follow-up: drop the unused eslint /
@react-native/eslint-configpair fromexamples/bareif you do not intend to lint there with the RN config.Sent by Cursor Automation: Bugsee code review
The lock refresh floated @stryker-mutator/* to 10.1.1 as a side effect. Regenerate the lock from main so only the security transitives and eslint 9 move. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
Claude finished @krassx's task in 24s —— View job Re-review of PR #185 after
|
There was a problem hiding this comment.
Deep review (5dc6f2d)
Overall risk: Low
Merge recommendation: Approve — no P0–P3 findings.
Re-review after 5dc6f2d (Deps: keep Stryker at 10.0.0). The previous look at c94e96a had no blocking issues; the only residual was the lockfile also floating @stryker-mutator/* 10.0.0 → 10.1.1. That commit regenerates the lock from main and re-applies only the intended refresh. Diff vs c94e96a is only those five Stryker packages back to 10.0.0. Every claimed security pin is still present.
Intent
One lock refresh for the vulnerable transitives (instead of Dependabot #167, #179, #180, #181, #183, #184) plus taking the bare example off eslint 8, which @react-native/eslint-config 0.87.1 does not allow to go to 10 (#171/#175).
These packages are not in the published @bugsee/react-native runtime. They sit under RN CLI / Metro, Expo CLI, node-gyp, Stryker, and leftover example-dev tooling.
What I checked against callers, not just the diff
| Package | Lock | Parent range | Advisory / note |
|---|---|---|---|
| body-parser | 2.4.0 | cli-server-api ^2.2.2 |
GHSA-27r3-jxmh-p828 (CVE-2026-111181). 2.3.0→2.4.0 is the gzip trailing-bytes crash fix, not a v1→v2 break; Metro already sat on 2.x |
| qs (body-parser copy) | 6.17.1 | body-parser ^6.16.1 |
closes GHSA-6pq8 on that copy (6.16.0 was still in range) |
| joi | 17.13.9 | RN CLI ^17.2.1 |
GHSA-4528-x5fx-h6hg — linear split for email({ multiple: true }); split results unchanged |
| launch-editor | 2.14.2 | cli-tools ^2.9.1 |
GHSA-587h / GHSA-698v / GHSA-r825 (Windows) |
| node-forge | 1.4.2 | Expo ^1.3.3 |
1.4.1 is the security floor; 1.4.2 restores pem.decode(Buffer) which 1.4.1 broke and which Expo certs use |
| undici | 8.12.3 | node-gyp ^8.4.1 |
8.10.2 was still open to the 8.12.2 TLS/cache/Content-Encoding set |
| fast-uri | 3.1.9 | ajv 8.20.0 ^3.0.1 |
GHSA-w74x / GHSA-wjr9 / GHSA-xhq7 / GHSA-333x |
| eslint (bare example) | 9.39.5 | @react-native/eslint-config peers ^8 || ^9 |
drops @humanwhocodes/config-array, rimraf@3, espree 9 |
Root lint is eslint 10 via eslint.config.mjs (nmHoistingLimits: workspaces), so the example’s eslint 9 does not replace it. The example has no lint script and no RN .eslintrc / flat config; the root config already lints examples/**.
Stryker stays 10.0.0 (root ^10.0.0). Mutation plan vs shard counts are therefore the same instrumenter main already runs.
Verification I actually ran
yarn install --immutable— success (warnings below).yarn lint— success (root eslint 10.10.0).yarn typecheck— success.yarn test— 163 suites passed, 1 skipped; 4639 tests passed, 19 skipped.yarn workspace bugsee-example-bare exec eslint . --max-warnings=0— eslint 9.39.5, exit 0 (walks up to rooteslint.config.mjs).yarn npm audit --all --recursive— claimed packages are gone. Remaining set matches the PR body (qs 6.15.1 viatyped-rest-client@2.3.1, zod/glob/decode-uri-component/uuid/jsdom stack, deepmerge, inflight/minimatch).
GitHub CI on this SHA already green for lint/typecheck/unit, expo prebuild, pack install (0.81–0.87), rn compat, playground JS, CodeQL, and mutation scope. Mutation shards and native/playground builds were still running at review time (yarn.lock is an all-gates trigger). Prior c94e96a mutation was 50/50 SUCCESS on Stryker 10.1.1; this SHA restores 10.0.0.
Residuals (not blocking)
YN0060:examples/bareprovides eslint 9.39.5, which does not satisfyeslint-plugin-ft-flow@2.0.3’s peer^8.1.0. Combined requested range collapses to^8.57.0because ft-flow does not allow 9, even though@react-native/eslint-config0.87.1 itself peers^8 \|\| ^9. Yarn still exits 0; CI install did too. The example never loads that config. Dropping the unusedeslint+@react-native/eslint-configpair from the example would also drop the eslint 8/9 advisory chain and this warning; keeping them as RN-template leftovers is consistent with the PR’s stated choice.qs@6.15.1remains an exact pin oftyped-rest-client@2.3.1(Stryker only). Documented. The PR body still names the parent as 10.1.1; it is 10.0.0 again. The advisory itself is unchanged.- Audit still flags zod 4.6.5 (
<4.6.6) via Stryker’smutation-server-protocol@0.4.1(^4.1.12) in addition to Expo’s 3.25.76. Pre-existing range; not introduced uniquely by this refresh. - eslint 9 itself still appears as an npm “no longer supported” deprecation. That is why 10 is the root, and why 9 is the ceiling for the example.
Positive
Lockfile matches the claimed patched versions; parents’ declared ranges hold; eslint 8 internals are actually gone; node-forge landed on 1.4.2 rather than stopping at 1.4.1; Stryker was put back so this is not an unmentioned mutation-tool bump; remaining issues are listed instead of claimed fixed. Avoiding Dependabot’s eslint 10 for the example is the right call given the RN config peer.
Most important issues to fix: none for merge. Optional follow-up: drop the unused eslint / @react-native/eslint-config pair from examples/bare if you do not intend to lint there with the RN config.
Sent by Cursor Automation: Bugsee code review


Summary
One lock refresh for the vulnerable transitives, instead of seven separate Dependabot PRs, plus a root fix for the eslint 8 chain.
body-parser2.4.0,joi17.13.9,launch-editor2.14.2,node-forge1.4.2,undici8.12.3,fast-uri3.1.9,qs(body-parser's copy) 6.17.1. All inside their parents' declared ranges;@react-native-community/cli20.2.0 is already the latest, so there is no newer root to take.examples/bare:eslint8 → 9.@react-native/eslint-configpeers^8 || ^9, so 10 (Dependabot Build(deps-dev): bump eslint from 9.39.5 to 10.14.0 #171/Build(deps-dev): bump eslint from 9.39.5 to 10.14.0 in /examples/bare #175) is not an option there. This drops@humanwhocodes/*,rimraf3 and the eslint 8 advisories.Supersedes Dependabot #167, #179, #180, #181, #183, #184.
Audit (
yarn npm audit --all --recursive)21 advisory packages before, 12 after. Fixed: body-parser, joi, launch-editor, node-forge, undici, fast-uri, @humanwhocodes/*, rimraf 3, eslint 8.
Still open, needs a major root bump
zod3.25.76 (high) andglob13.0.6:@expo/cli57 (latest 57.x) pins them; Expo SDK 58 is the fix.decode-uri-component0.2.2 (high):expo-router57 →query-string7.abab,domexception,whatwg-encoding:jest-expo57.0.6 →jest-environment-jsdom29.uuid7.0.3:xcode3.0.1 via@expo/config-plugins57.qs6.15.1:@stryker-mutator/core10.1.1 (latest) →typed-rest-client2.3.1 pins it.glob7 /minimatch3 /inflight: Jest 29 toolchain.deepmerge: no patched release.Testing
yarn install --immutable, Jest (4640 passed), typecheck, lint: pass locally. CI will cover the example builds.🤖 Generated with Claude Code