Skip to content

chore(deps-dev): bump vue 3.5.33 → 3.5.35 (clean lockfile regen, single hoisted family) — supersedes #81#102

Merged
Goosterhof merged 2 commits into
mainfrom
medic/supersede-81-vue-family-lockstep
Jun 1, 2026
Merged

chore(deps-dev): bump vue 3.5.33 → 3.5.35 (clean lockfile regen, single hoisted family) — supersedes #81#102
Goosterhof merged 2 commits into
mainfrom
medic/supersede-81-vue-family-lockstep

Conversation

@Goosterhof
Copy link
Copy Markdown
Contributor

@Goosterhof Goosterhof commented Jun 1, 2026

Supersedes Dependabot #81

Dependabot PR #81 (bump vue 3.5.33 → 3.5.35) is RED on CI: npm run test:coverage fails in packages/toast/tests/toast.spec.ts with "expected Mock to be called 1 times, but got 0 times" — components render empty. This PR supersedes #81 with a clean lockfile regeneration.

Root cause — Vue-family version split

Dependabot did a surgical lockfile edit: per-package vue bumped to 3.5.35 with a second @vue/compiler-* family nested at 3.5.35 under sub-packages, while the hoisted root vue / @vue/server-renderer / @vue/runtime-core stayed at 3.5.33. Two copies of vue in one tree → severed reactivity → the test renderer mounts a component wired to a different reactivity runtime than the test's reactive state → updates never propagate → empty renders → Mock called 0 times. npm dedupe does not fix it; only a clean lockfile regeneration does.

Fix — clean lockfile regen (lockfile-only)

rm -rf node_modules package-lock.json && npm install

No package.json range edits — the ^3.5.33 carets already permit 3.5.35. Single hoisted vue@3.5.35 across the whole npm-workspaces monorepo. Diff is package-lock.json only.

Lockfile grep proof (single hoisted family)

grep -nE '"(node_modules|packages/[^/]+/node_modules)/(vue|@vue/(server-renderer|runtime-core|compiler-core))"' package-lock.json

Before (main): split — hoisted root 3.5.33 + nested packages/router family 3.5.35:

node_modules/vue                  => 3.5.33   (+ @vue/{compiler-core,runtime-core,server-renderer} 3.5.33)
packages/router/node_modules/vue  => 3.5.35   (+ nested @vue/* 3.5.35)

After (this PR): single hoisted family, zero nested copies:

node_modules/vue                  => 3.5.35   (+ @vue/{compiler-core,runtime-core,server-renderer} 3.5.35)

grep -cE '"packages/[^/]+/node_modules/' package-lock.json0 (whole workspace fully hoisted).

Audit-gate preservation (transitive regression the regen exposed)

A naive clean regen floated Stryker's transitive typed-rest-client 2.3.0 → 2.3.1 (both within ~2.3.0). 2.3.1 exact-pins the vulnerable qs@6.15.1 (GHSA-q8mj-m7cp-5q26), clobbering the curation PR #100 landed on main (which holds typed-rest-client@2.3.0qs@^6.14.1 → patched 6.15.2) and turning the npm audit CI gate RED.

Held typed-rest-client@2.3.0 via npm audit fix (lockfile-only, no package.json change), restoring qs@6.15.2 and npm audit = 0 vulnerabilities. The vue bump and #100's qs curation now coexist. (npm ci installs strictly from the lockfile, so CI cannot re-float the pin.)

Gate matrix

Gate Result Notes
npm audit ✅ PASS 0 vulnerabilities (qs@6.15.2; typed-rest-client held at 2.3.0)
format:check ✅ PASS 145 files
lint ✅ PASS oxlint clean
build ✅ PASS all packages
typecheck ✅ PASS tsc --noEmit all packages
test:coverage PASS 520/520 — flips RED→GREEN vs #81; toast.spec.ts 27/27
lint:pkg ⚠️ FAIL (11) pre-existing baseline — publint "sideEffects" fail-on-suggestion across 11 packages; identical (11) count on main's lockfile (verified via stash); decoupled from the lockfile (driven by scripts/lint-pkg.mjs text gate, not dependency versions). Documented standing item (queue #63 / #70).

test:coverage toast.spec.ts: RED on #81 (Mock called 0 times) → GREEN here (27/27).

Stryker mutation skipped per Medic SOP — a lockfile-only dev-dep bump does not move the mutation surface.

🤖 Generated with Claude Code

@Goosterhof Goosterhof added the Agent Review Requested Requesting review of specialized AI review agents. label Jun 1, 2026
@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Jun 1, 2026

Deploying fs-packages with  Cloudflare Pages  Cloudflare Pages

Latest commit: 9808496
Status: ✅  Deploy successful!
Preview URL: https://d10dbe56.fs-packages.pages.dev
Branch Preview URL: https://medic-supersede-81-vue-famil.fs-packages.pages.dev

View logs

@Goosterhof
Copy link
Copy Markdown
Contributor Author

⚠️ CI blocker surfaced by the clean regen — npm audit gate (NOT the vue fix)

The vue-family fix is sound: test:coverage is GREEN (520/520, toast.spec.ts 27/27), single hoisted vue@3.5.35 family confirmed. However, the same clean lockfile regen tripped a different CI gate — npm audit — and this PR is currently RED on it. Flagging for a doctrine/scope call before this merges; I did not patch it (it requires crossing the lockfile-only boundary set in my orders).

Root cause (a second, independent transitive regression)

  • @stryker-mutator/core@9.6.1 requires typed-rest-client: ~2.3.0 (tilde — permits 2.3.0 and 2.3.1).
  • Main's lockfile pinned typed-rest-client@2.3.0, which declares "qs": "^6.14.1" (caret) → resolves to qs@6.15.2 (patched, outside advisory) → npm audit = 0 vulnerabilities.
  • This clean regen floated to the newer typed-rest-client@2.3.1, which downgraded its qs dep to an exact pin "qs": "6.15.1" → forced qs@6.15.1 (vulnerable, GHSA-q8mj-m7cp-5q26) → npm audit = 2 moderate, CI red.

Verified by restoring main's lockfile (qs@6.15.2, audit clean) vs this PR's (qs@6.15.1, audit red).

Why I did not fix it here

  • qs@6.15.1 is an exact pin inside typed-rest-client@2.3.1npm audit fix cannot move it.
  • The only fixes (an overrides block forcing qs@6.15.2 or typed-rest-client@2.3.0) are package.json edits, explicitly out of scope for this lockfile-only mission.

Recommended follow-up (General's call)

Add to root package.json an override so the clean-regen tree stays patched, e.g.:

"overrides": { "typed-rest-client": "2.3.0" }   // or: "qs": "6.15.2"

This is latent on main too — main is one rm -rf node_modules package-lock.json && npm install away from the same red audit. Worth a standalone hardening PR regardless of this one. Could be folded into this PR if the General lifts the lockfile-only constraint, or shipped separately and rebased under this.

The vue fix itself is correct and durable; this is a separable supply-chain finding the regen exposed.

…ingle hoisted family) — supersedes #81

Dependabot #81 did a surgical lockfile edit that nested @vue/compiler-* at
3.5.35 under sub-packages while the hoisted root vue/@VUE stayed at 3.5.33.
Two copies of vue in one tree severs reactivity → empty renders → toast.spec.ts
"Mock called 0 times" failures on test:coverage.

This regenerates package-lock.json from scratch (rm -rf node_modules
package-lock.json && npm install), yielding a single hoisted vue family at
3.5.35 across the whole workspace. No package.json range edits — the ^3.5.33
carets already permit 3.5.35. Lockfile-only.

The clean regen also collapses a pre-existing packages/router nested 3.5.35
split present on main; the regenerated tree has zero packages/*/node_modules
entries.

Audit-gate preservation: the naive regen floated Stryker's transitive
typed-rest-client 2.3.0 → 2.3.1, which exact-pins the vulnerable qs@6.15.1
(GHSA-q8mj-m7cp-5q26) — clobbering the curation PR #100 landed on main. Held
typed-rest-client at 2.3.0 (its ^6.14.1 qs range resolves to patched 6.15.2)
via npm audit fix, lockfile-only, restoring `npm audit` = 0 vulnerabilities.
No package.json change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Goosterhof Goosterhof force-pushed the medic/supersede-81-vue-family-lockstep branch from 33bebc1 to 303f468 Compare June 1, 2026 09:40
@Goosterhof
Copy link
Copy Markdown
Contributor Author

Resolved in the amended commit (303f468) — held typed-rest-client@2.3.0 via npm audit fix (lockfile-only, no package.json change), restoring qs@6.15.2 and npm audit = 0 vulnerabilities, while keeping the single-hoisted vue@3.5.35 family. The vue fix and #100's qs curation now coexist. Both npm audit and test:coverage are green; the only remaining red is the pre-existing lint:pkg publint baseline (matches main). See updated PR body for the full matrix.

Copy link
Copy Markdown
Contributor

@jasperboerhof jasperboerhof left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — reviewed, no blockers.

@Goosterhof Goosterhof merged commit b5a3336 into main Jun 1, 2026
2 checks passed
@Goosterhof Goosterhof deleted the medic/supersede-81-vue-family-lockstep branch June 1, 2026 10:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Agent Review Requested Requesting review of specialized AI review agents.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants