Repository navigation
Take the patched dev tools in #37: vite, undici, shell-quote, source-map-js - #39
Conversation
…map-js Lockfile only, each within the range its parent already asks for: vite 8.3.0 -> 8.3.5, both vite 7.3.6 copies (Vitest, vite-node) -> 7.3.7, undici 6.28.1 -> 6.29.1 and 7.29.1 -> 7.30.1, shell-quote 1.10.0 -> 1.11.0, source-map-js 1.2.1 -> 1.2.2. vite 8.3.5 needs rolldown ~1.2.14 and postcss ^8.5.30; this takes those minimums (rolldown 1.2.14, published 14 October, rather than 1.2.16, published the day of this change), with nanoid 3.3.20 for postcss. package.json is untouched. None of these packages is bundled, but vite builds dist, and the build does change: rolldown and its minifier (oxc 0.150 -> 0.154) shape the same code differently. Built without minifying, the two bundles differ only in two blank loop bodies' spacing and in how one CommonJS module's top-level `this` is passed (rolldown 1.2.14's fix), which is the same object. THIRD_PARTY_LICENSES.md and the .d.ts files are identical. Checked: lint, typecheck, 105,720 tests, 60 browser tests (1 skipped, as on any local run). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Try it: https://digitalcredentials.github.io/verifier-plugin/pr-39/ Updates on every push to this PR, and goes away when it closes. The browser tests run against this copy too. |
Smoke testThe live demo (main at 713b8b4, built with vite 8.3.0 / rolldown 1.2.9) against this PR's preview (pr-39 at 8c3b15d, which is main plus d9c3d71). The preview's bundle carries rolldown 1.2.14's CommonJS helper ( Expected, written before running: no case differs. Automated, with a local compare script at phone width, comparing every line the verifier-plugin box shows:
CI's browser tests against the published preview: 58 passed, 3 skipped, on Node 24. Chromium only; Safari and Firefox weren't run. By hand: all 12 demo buttons, live against pr-39 side by side in Chrome (Details tab): the same headline, rows and log code on every one. |
|
Post-merge check (2 November 2026): the live demo now, against the last build before this PR. All expectations, written down before running, were met: no change in behaviour, speed or size.
Method: both builds were served at the real address from gh-pages history (the built plugin refuses local addresses), each round opened both fresh and alternated which went first, and timings were taken inside the page. The timings come from one Mac; Firefox wasn't run; the wallet isn't covered until its verifier-plugin pin is bumped. |
In the wallet: lcw-sandbox.org (9 November 2026)All clear. This PR has now reached the wallet. James deployed lcw-sandbox.org with lcw-front-end
|
Part of #37 (PR 2 of 3). It leaves #37 open: the
@stablelib/ed25519alert waits on digitalcredentials/verifier-core#84, and the Vitest alerts are PR 3.What changes
package-lock.jsononly;package.jsonis untouched. Each package moves to a fixed version within the range its parent already asks for:^8.2.0)vite 8.3.5 needs newer rolldown (
~1.2.14) and postcss (^8.5.30), so those move too: rolldown 1.2.9 → 1.2.14 with its 15 per-platform binaries and@oxc-project/types0.150.0 → 0.154.0, postcss 8.5.28 → 8.5.30, and nanoid 3.3.19 → 3.3.20 for postcss. These are the minimum versions vite allows, not the latest: rolldown 1.2.16 was published on the day of this change, and a build tool that fresh isn't worth the risk.Every new version was published by the same project or maintainer as the one it replaces (vite, undici, rolldown, postcss and nanoid by their GitHub Actions, with npm provenance; shell-quote and source-map-js by their usual maintainers). Every changed entry's checksum matches the npm registry.
This should close 22 alerts: vite #9–#19, shell-quote #8, source-map-js #7, undici #29, #30, #32–#38. Six stay open:
@stablelib/ed25519#1, and Vitest,@vitest/mockerand tinypool #2, #3, #5, #6, #20 (PR 3).None of these ship, but the build that ships changes (verified)
None of these packages is bundled into
dist/:THIRD_PARTY_LICENSES.mdis byte-identical, as is every.d.ts. But vite buildsdist/, and the shipped JavaScript does change:dist/index.js: about 1,200 lines across 97 places;distribution-*.js): 3 places in its options-merge loop;Where it comes from. Built without minifying, the two bundles are the same code except for three harmless details: the spacing of two empty loop bodies in pako, and how rolldown 1.2.14 passes a CommonJS module's top-level
thisto ed2curve (still the same object; rolldown/rolldown#11135). Everything else is the minifier, oxc 0.150 → 0.154, which now writes the same logic differently (continuein a loop becomesif … else, different short names). Minifying is meant never to change behaviour, so the question is whether the new oxc keeps that promise on our code.Behaviour, side by side. Both builds'
verify()ran in one Node process on the same credentials, with the clock frozen and the network recorded once and replayed, so each saw identical inputs. Each run compared the full result and what every exported reader makes of it (summarise,listChecks,issuerIdentity,schemaFinding, and so on):3,810 runs, 0 differences:
Each was run with registry lookups on and off.
The harness catches a real fault: with one step deleted from the new build's frame code, the did:web cases flip from verified to not verified (16 differences).
Coverage: node's own coverage shows 42 of the 97 changed places in
index.jsran, including jsonld (expand, frame and compact), theajvschema check, pako's decompression (status lists) and verifier-core's checks.Places that never ran:
toRDF.|0on values that are already 32-bit integers, and& 4294967295written as| 0.credentialsetter;In every case, a removed
continueorreturnwas the last thing in its loop or function, with no labels orfinallyblocks, and the renamed variables shadow nothing new.Limits:
<verifier-credential>element on a page.What was exposed
These are tools on developer machines and in CI. Nothing here reaches earners or the wallet. Each advisory names its conditions. Read against our setup (reasoned from the advisories and our config; not tested):
server.hostnor--host.checkServerIdentityfunction; the cache poisoning needs undici's shared cache composed with redirects. Checked: our two HTTP clients use undici only to turn a caller'sagentoption into an undici dispatcher, and nothing in our code ornode_modulesoutside undici mentionscheckServerIdentityor undici's cache or redirect interceptors.quote()called on attacker-controlled text. It arrives through React Native's developer tools, which nothing here runs.Checks
npm ci. The builds are byte-identical to the author's, and identical on Node 24.npm ciinstalls exactly the lockfile's 482 packages.util.inspect, soundefinedand key order count. It also compares requests and console output and calls all 14 exports, in both load orders. The reviewer ran it on the first 3,722 runs and I ran it on the did:web and ECDSA 88. All are identical, and the broken frame code is caught.localhost. So CI's browser tests against this PR's preview are the first real-browser run of the new minified code.Result: to be filled in after the preview is up.
Reaching the wallet
Nothing changes in the wallet until its verifier-plugin pin is bumped (it pins release commit a4ca3e6). When it is, it gets a
dist/minified by the new oxc, which is what the side-by-side run and the smoke test cover.🤖 Generated with Claude Code