Repository navigation
fix(deps): resolve audit findings in root, docsite and examples - #46
Merged
Merged
Conversation
Bump vitest and @vitest/browser-playwright to 4.1.12 and the vite catalog entry to 8.3.4. In the docsite, move @tanstack/react-start to 1.169.3, @tanstack/react-router to 1.170.45 and @tanstack/router-plugin to 1.168.47 together, and refresh wrangler and @cloudflare/vite-plugin. Refresh esbuild, js-yaml, brace-expansion, browserslist, baseline-browser-mapping and source-map-js in the lockfile. The new TanStack Start renamed createServerFn().inputValidator() to .validator() (checked against the installed start-client-core types and the start compiler), so the docs route uses the new name. routeTree.gen.ts is the router-plugin 1.168.47 output. pnpm audit now reports no known vulnerabilities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TkHa1BVnm277qEiEuipG6n
Bump the vulnerable direct dependencies in the examples: - backend-node, backend-node-cjs: hono 4.13.13, @hono/node-server 2.1.5 - backend-bun(-cjs), backend-deno(-cjs), worker-cloudflare: hono 4.13.13 - worker-cloudflare: wrangler 4.151.1 - edge-nextjs: next 16.4.2 - spa-vite-dynamic, spa-vite-plugin: vite 8.3.4 - ssr-react-router: react-router and @react-router/* 7.18.4, vite 8.3.4 - ssr-tanstack-start: @tanstack/react-start 1.169.3, @tanstack/react-router 1.170.45, @tanstack/router-plugin 1.168.47, vite 8.3.4 Refresh js-yaml, brace-expansion and source-map-js (via @rrlab/*) and the other vulnerable transitives in each lockfile with targeted updates. In ssr-react-router this includes express 4.22.3 (qs 6.16), proxy-addr, compression, morgan, body-parser, and vite 7.3.7 under vite-node so esbuild can move to 0.28.2. The bun.lock entries for brace-expansion, js-yaml and source-map-js were rewritten to the fixed versions (same dependencies, registry integrity), because bun 1.2.4 re-resolves the whole tree when entries are dropped and `bun update` adds them as direct dependencies. `bun install --frozen-lockfile` accepts the result. The packed @variablelab/env tarball changed, so its integrity line in each pnpm lockfile moved. next-env.d.ts is what next dev 16.4 writes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TkHa1BVnm277qEiEuipG6n
Dependabot opens security PRs only (version updates stay off) for the root workspace and the eight pnpm examples. The bun examples are left out because Dependabot has no security updates for bun.lock. The weekly dependency audit runs pnpm audit on the root lockfile and on each pnpm example's own lockfile, and bun audit on the four bun.lock files. bun audit needs bun >= 1.2.15 while those examples pin 1.2.4, and mise's locked mode refuses an unlocked bun, so it runs bun 1.4.3 from npm through the root pnpm (registry integrity and minimumReleaseAge) from inside each example. zizmor's dependabot-cooldown rule is set to one day to match pnpm's minimumReleaseAge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TkHa1BVnm277qEiEuipG6n
|
Contributor
Preview releaseLatest commit: Some packages have been released:
Note Use the PR number as tag to install any package. For instance: |
`pnpm dlx` does not read minimumReleaseAge from pnpm-workspace.yaml, so the dependency audit's `pnpm dlx bun@1.4.3` ran without the cooldown its comment claimed. Pass --config.minimum-release-age=1440 explicitly: a bun canary published the same day is now refused, and bun 1.4.3 still runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TkHa1BVnm277qEiEuipG6n
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.
Summary
Every lockfile in the repo now audits clean (13 lockfiles: the root, 8 pnpm examples, 4 bun examples). A weekly audit and Dependabot security updates keep it that way.
@variablelab/envitself was never affected: it only depends on@standard-schema/specanddefu, and its builtdistis byte-identical before and after.The remaining transitive fixes are targeted refreshes (
pnpm update --depth Infinity <pkg>), with no lockfile regenerated.What was vulnerable
"Dev" is tooling, tests or a build step. "Deployed" is the docsite on Cloudflare. In the examples, "runtime" means the example app's own server code. The examples are never published.
Root workspace (
pnpm-lock.yaml: 78 → 0)@vitest/browser4.1.0package>@vitest/browser-playwright@vitest/browser-playwright4.1.12@tanstack/react-start1.167.65,@tanstack/start-server-core1.167.30docsiteseroval1.5.4docsite>@tanstack/router-corebraces3.0.3 (no fix upstream)docsite>@tanstack/router-plugin>chokidar3vite8.0.11,postcss8.5.15,nanoid3.3.12viteundici7.24/7.26,ws8.20.1,sharp0.34.5docsite>@cloudflare/vite-plugin>miniflarebrowserslist4.28.2,baseline-browser-mapping2.10.32docsite>router-plugin>@babel/corejs-yaml4.1.1,brace-expansion5.0.6,source-map-js1.2.1@rrlab/biome-plugin,@rrlab/clivitest,@vitest/mocker4.1.0esbuild0.27.3/0.28.0docsite> vite, wrangler, fumadocs-mdxExamples
next16.2.6 (+ itspostcss8.4.31,sharp,nanoid,baseline-browser-mapping)proxy-addr2.0.7@react-router/serve>express@tanstack/react-start,start-server-core,seroval,braces,undicihono4.12.18react-router7.15.0compression1.8.1,qs6.15.1,morgan1.10.1,body-parser1.20.5@react-router/servevite7.3.3,esbuild0.27.7,valibot1.4.0,@babel/core7.29.0@react-router/dev(>vite-node)undici,ws,sharp,esbuildwranglervite8.0.11,postcss,nanoid@hono/node-server2.0.2js-yaml,brace-expansion,source-map-js@rrlab/cli,@rrlab/biome-pluginNotes for reviewers
--ignore-workspacestops pnpm from readingminimumReleaseAgeinpnpm-workspace.yaml, so the examples were installed withnpm_config_minimum_release_age=1440. Then every new version in all 13 lockfiles was checked againstnpm view <pkg> time: none is younger than 24 h.bun update <pkg>adds the package as a direct dependency, and dropping lock entries re-resolves the whole tree. So thebrace-expansion,js-yamlandsource-map-jsentries were rewritten to the fixed versions with the registry integrity (their dependencies are unchanged).bun install --frozen-lockfileaccepts the result, and a plainbun installleaves it unchanged.vite-node's lockedvite7.3.3 even underpnpm update --depth Infinity vite, so those two lock entries were dropped and re-resolved (vite 7.3.7). That let esbuild move to 0.28.2.docsite/src/routeTree.gen.tsis the router-plugin 1.168.47 output (it only reorders routes).examples/edge-nextjs/next-env.d.tsis whatnext dev16.4 writes (it adds one import).package/package.jsonchanged, so the packed@variablelab/envtarball changed too, and itsintegrityline moved in each example's pnpm lockfile. The pnpm install forces that change.srvx0.11.15 (its direct dependency, used byserve.js) alongside 1.0.5 (a build-time dependency ofstart-plugin-core). e2e passes.Overrides and changesets
None. No pnpm or npm
overrides. No changeset: the published package'sdependenciesandpeerDependenciesare unchanged, andpackage/distis byte-identical before and after (diff -ron arr packbuild).Maintenance files
.github/dependabot.yml: security updates only (open-pull-requests-limit: 0,cooldown.default-days: 1, onesecuritygroup). Thenpmentry covers/plus the 8 pnpm examples, andgithub-actionscovers/. The bun examples are left out with a comment, because Dependabot has no security updates forbun.lock. The weekly audit covers them instead..github/workflows/dependency-audit.yml: the shared template. Only theREPO-SPECIFIClines differ:pnpm auditfor the root.pnpm -C examples/<x> audit --ignore-workspacefor each pnpm example, which audits the example's own lockfile.bun auditfor each bun example. It needs bun ≥ 1.2.15, but those examples pin 1.2.4, and mise's locked mode refusesmise x bun@<other>. So the step runspnpm dlx bun@1.4.3 auditfrom inside each example, through the root pnpm. The version is exact, checked against the registry integrity and subject tominimumReleaseAge..github/zizmor.yml: adds thedependabot-cooldownrule (1 day, matchingminimumReleaseAge).The org admin enables the dependency graph and Dependabot security updates for this repo separately. These files do nothing until both are on.
Evidence
pnpm audit(root):78 vulnerabilities found (12 low | 27 moderate | 33 high | 6 critical). Per example (pnpm audit --ignore-workspace/bun audit): backend-node 33, backend-node-cjs 33, edge-nextjs 38, spa-vite-dynamic 17, spa-vite-plugin 17, ssr-react-router 40, ssr-tanstack-start 47, worker-cloudflare 58, each bun example 31.After: all 13 lockfiles audit clean (
No known vulnerabilities found/No vulnerabilities found).node_modulesandMISE_LOCKED=1, and printedfound=falsewithout touching any file. In the negative control, the same clone withorigin/main'sexamples/backend-node/pnpm-lock.yamlandexamples/backend-deno-cjs/bun.lockprintedfound=true, and the report listed both labels.pnpm install --frozen-lockfile,mise run check,mise run lib:test(93 passed),mise run lib:build, and the docsite build (pnpm --filter docsite build: exit 0, docs pages prerendered through the renamed server function).rr checkpasses in all 12. e2e passes locally in all 12, including the three*-cjsexamples thate2e.ymldoesn't cover: backend-node 6, backend-node-cjs 6, backend-bun 6, backend-bun-cjs 6, backend-deno 6, backend-deno-cjs 6, worker-cloudflare 2, edge-nextjs 2, spa-vite-dynamic 3, spa-vite-plugin 5, ssr-react-router 4, ssr-tanstack-start 5.next buildfor edge-nextjs passes withDATABASE_URLset (without it, env validation fails the build, as intended).pipx run --spec zizmor==1.30.1 zizmor --offline .reports no findings.Merge Danger
Door: two-way
Dependency bumps and new CI files. Reverting the PR restores everything.
Blast Radius: docsite
The docsite is the only deployed surface. It takes a TanStack Start minor (1.167 → 1.169), including the
inputValidator→validatorrename. The build and the prerender pass locally. Consumers of@variablelab/envare unaffected (identicaldist, unchanged dependencies). The new audit workflow runs only on its schedule or on manual dispatch. It never runs on PRs, so it can't block them.🤖 Generated with Claude Code
https://claude.ai/code/session_01TkHa1BVnm277qEiEuipG6n