chore(deps): consolidate Dependabot updates - #100
Conversation
Folds Dependabot PRs #96, #97, #98 and #99 into one change: transitive-only security patches to nanoid (3.3.6 -> 3.3.18), brace-expansion (1.1.11 -> 1.1.18 and nested 2.0.1 -> 2.1.4), @babel/helpers and @babel/runtime (7.23.2 -> 7.29.7). No package.json declares any of these, so no manifest was edited. Each lockfile was updated with `npm update <pkg> --package-lock-only --lockfile-version=<existing>`, preserving lockfileVersion 3 in step0 and 2 in step1-step5. Dependabot raised each bump against a single step directory, but step0-step5 are six copies of the same app and all six carried the vulnerable versions, so the patch is applied to all six (same approach as #93 took for js-yaml). slides/package-lock.json is untouched: it already resolves all of these at or above target on main, which makes #95 moot. The Expo SDK 49 -> 54 and React Native 0.72 -> 0.82 PRs are still deliberately left open; see #94. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SociableSteve
left a comment
There was a problem hiding this comment.
Approving. Applying each advisory across all six step projects rather than the one directory Dependabot happened to raise it against is the right call, and the diff shows it was done uniformly: step1 through step5 carry identical version changes, and step0 carries the same set minus the legacy mirror it does not have.
I confirmed the scope claim directly. The diff is six package-lock.json files and nothing else, no package.json anywhere is touched, and slides/ is left alone. Since no manifest in the repo declares any of the five bumped packages, they are genuinely transitive-only and there is no manifest-versus-lock skew available to get wrong. lockfileVersion is preserved as claimed, 3 in step0 and 2 in step1 to step5, and for the v2 files both the packages tree and the legacy dependencies mirror moved together, so an npm 6-era reader sees the same tree.
The advisory coverage holds: nanoid 3.3.18, brace-expansion 1.1.18 and nested 2.1.4, and both Babel packages at 7.29.7 are each well past their advisories' fixed versions. The pruning leaves nothing dangling: to-fast-properties has no remaining reference, and regenerator-runtime survives only as react-native's own nested 0.13.11, which its ^0.13.2 range requires. There is no prior review history, so nothing carries forward.
The native-side trap does not apply here, which is worth stating rather than leaving implied: there is no ios/ or android/ directory in any step, these are managed-workflow Expo apps, and nothing in this diff bumps expo or react-native. Nothing here implies a Podfile or gradle change.
No findings, and nothing I want changed. One thing to hand back as evidence rather than as a request: your body says the Metro node_modules transform is the residual risk and that "nothing in this repo can run headlessly". It can. During the review pass npx expo export --platform android produced a full production bundle at head for both step0 and step5, Hermes bytecode included, at 826 kB and 1.23 MB. So the mixed Babel tree, with helpers, types, parser and template at 7.29.x against core, traverse and generator at 7.22 to 7.23, survives a real bundle and not just an app-source transform. That was the review pass's execution rather than mine, but it closes the gap you flagged, and it is worth knowing the check exists for next time.
Context for whoever lands this: the repo defines no test or lint script in any of its seven projects and has no CI on pull requests, so there is no green tick standing behind this beyond npm ci resolving. That is a pre-existing shape rather than anything this PR changes, and your body says so accurately.
Consolidates the open Dependabot PRs listed below into a single reviewable change.
Lockfiles were regenerated so the dependency graph stays coherent.
All four Dependabot PRs carry transitive-only security patches (five package
instances) — no
package.jsonin this repo declares any of them, so no manifest wasedited. Each lockfile was updated with
npm update <pkg> --package-lock-only --lockfile-version=<existing>, preserving eachproject's original
lockfileVersion(3 instep0, 2 instep1–step5).Included updates (npm)
nanoid/step5)brace-expansion/step5)brace-expansion(nested underbabel-plugin-module-resolver)/step5)@babel/helpers/step4)@babel/runtime/step5)Applied to every step project, not just the one Dependabot picked
Dependabot raised each of these against a single directory, but
step0–step5are sixcopies of the same workshop app and all six carried the identical vulnerable versions.
Patching only
/step4and/step5would leave the same advisories open in the otherfour, so all six lockfiles were updated. This matches how the previous consolidation
(#93) handled
js-yaml.Transitive packages that moved with them
Pulling
@babel/helpers/@babel/runtimeup to 7.29.7 moves the Babel internals theyrequire, and nothing else moved. The complete set of resolved-version changes, identical
in all six lockfiles:
slides/package-lock.jsonis deliberately untouched — see "Already current onmain".Verification
Run locally with Node 20.20.2 (the deploy workflow pins
node-version: 20).n/ameansthe project defines no such step. A baseline run of
npm ciand the slides build onmainpassed too, so nothing here is masking or absorbing a pre-existing failure.npm ci, lock resolves): ✅ in all seven projects —slides,step0–step5npm run slides:build -- --base /react-native-workshop/inslides.step0–step5define no build script (onlystart/android/ios/web) → n/anpm cionly proves the lockfile resolves; it does not exercise the bumped Babelpackages. So each step app's own sources were additionally transformed through that
project's
babel.config.js(babel-preset-expo+react-native-reanimated/plugin)using its installed
@babel/core. All 11 app source files acrossstep0–step5compiled to non-empty output, and every
@babel/runtimehelper path the transformemitted (
helpers/interopRequireDefault,helpers/slicedToArray) was checked to resolveon disk against the installed 7.29.7 — none missing. This covers the app sources only;
Metro also transforms
node_modulesat bundle time, which nothing in this repo can runheadlessly.
The
slidesbuild output is unchanged from the baseline — identical file set and sizes(68 files, 1,371,263 bytes) — which is expected, since
slidesis not modified.Security impact
npm auditper step project: 55 → 51 (step5: 54 → 50). The cleared entries areexactly
nanoid,brace-expansion,@babel/helpersand@babel/runtime; no newadvisory appeared.
Of the ~51 that remain, 35 are ones npm reports as needing a semver-major of
expo(23) or
react-native(12) — those are the SDK migration tracked in #94. The other15–16 (
form-data,shell-quote,cross-spawn,minimatch,micromatch,picomatch,tmp,@babel/core,@babel/plugin-transform-modules-systemjs,yaml,joi,compression,serve-static,on-headers,@expo/devcert,braces) are markedin-range fixable, but Dependabot has not raised PRs for them and they are outside this
consolidation's scope — see "Known and accepted".
slidesholds 21 advisories, unchanged base-to-head (it is not modified here); 15 ofthose need a
@slidev/climajor.Already current on
mainnanoid3.3.7 → 3.3.18 in/slides.slides/package-lock.jsononmainalready resolves
nanoidto 3.3.18; the previous consolidation (chore(deps): consolidate Dependabot updates #93) picked it upwhen it refreshed the slides toolchain. This PR needs no change for it, and Bump nanoid from 3.3.7 to 3.3.18 in /slides #95 is
closed as already applied.
Left open — Expo SDK / React Native migration (tracked in #94)
Not consolidation work; these need a human with a simulator. Unchanged from the
assessment in #94, and if anything the gap has widened since:
/step1, Bump tar and expo in /step2 #82/step2, Bump tar and expo in /step3 #91/step3, Bump tar and expo in /step4 #92/step4, Bump tar and expo in /step5 #88/step5—tar6.2.1 → 7.5.5/7.5.7 by way of
expo49.0.16 → 54.0.31/54.0.32.taris not a directdependency; the only route to it is the Expo SDK major —
@expo/cli@0.10.17, whichExpo 49's final release (49.0.23) pins, still declares
tar ^6.0.5, so there is noin-line patch. Upstream
expois now at 57.0.17, making Dependabot's 54 targetitself two SDK generations stale; the migration should target a current SDK, not 54.
Note also that the
taradvisory range now extends to<=7.5.20, so Dependabot's own7.5.5/7.5.7 target would not clear it either.
/step1, Bump @react-native-community/cli and react-native in /step2 #71/step2—react-native0.72.6 → 0.82.1 plus@react-native-community/cli. Upstreamreact-nativeis now at 0.87.1; samereasoning as above.
Expo 49 → a supported SDK pulls React 18 → 19,
@types/react,react-native-reanimated,react-native-safe-area-contextand the Babel config with it,expo install --fixpicks those versions per SDK, andstep0–step5have no automatedtest signal at all — every step has to be run on a device or simulator. The workshop
slides also teach against SDK 49 APIs. See #94.
Known and accepted
.github/workflows/deploy.ymlis the onlyworkflow and triggers on
pushtomainonly, so this PR will show no checks. Theverification above is the only signal available; the
slidesbuild it runs is the samecommand the deploy workflow runs — and
slidesis untouched here, so CI behaviour aftermerge is unchanged.
@babel/helpers,types,parser,templateandcode-frameland on 7.29.x while@babel/core,traverse,generatorand the
@babel/plugin-*set stay at 7.22–7.23. This is exactly the tree Dependabot'sown Bump @babel/helpers from 7.23.2 to 7.29.7 in /step4 #98/Bump @babel/runtime from 7.23.2 to 7.29.7 in /step5 #99 produce — neither raises
@babel/core— and the transform smoke test abovewas run specifically to confirm the skew compiles. Aligning
@babel/coreis in range(
^7.20.0) and would also clear two of the advisories listed above, but it is not partof any Dependabot PR and is left for a separate change rather than widened into this one.
not raised by Dependabot, clearing them would move packages this PR has no mandate over,
and mixing them in would make the lockfile diff hard to audit against the four PRs being
folded in. They are worth a follow-up PR of their own.