Skip to content

chore(deps): update dependencies to latest - #847

Merged
chybisov merged 8 commits into
mainfrom
chore/update-dependencies
Aug 20, 2026
Merged

chore(deps): update dependencies to latest#847
chybisov merged 8 commits into
mainfrom
chore/update-dependencies

Conversation

@chybisov

@chybisov chybisov commented Aug 20, 2026

Copy link
Copy Markdown
Member

Which Linear task is linked to this PR?

Routine dependency maintenance — no Linear task.

Why was it implemented this way?

Ran pnpm up -r -L across the workspace, then reverted the classes of change that a blanket
--latest sweep gets wrong, added one security floor, and finished with pnpm regen.

Reverted from the blanket sweep

>= floor ranges kept as floors. pnpm up -L rewrites viem: ">=2.52.0""^2.55.19",
etc. Those floors are deliberate — they pair with the pnpm.overrides entries in
pnpm-workspace.yaml that enforce the single-copy invariants in CLAUDE.md, and narrowing them
narrows what dedupes against a consumer's own copy. Restoring them also reverted two majors that
would otherwise have ridden in unannounced, because the overrides already resolve them high:

  • bs58 >=4.0.1^6.0.0 (2 sites)
  • @react-native-async-storage/async-storage >=2.2.0^3.1.1 (root optionalDependencies)

next left alone^16 in examples/nextjs and ^15 in examples/nextjs15.

ioredis left at ^5.11.1. The root optionalDependencies entry exists only to satisfy
unstorage / nitropack, and unstorage@1.17.5 declares the optional peer as ioredis: ^5.10.1.
Moving to 6.0.0 buys a peer mismatch and a second copy.

@changesets/cli / @changesets/changelog-github left at v2 / v0.7 — the v3 migration needs
changesets/action@v2 in lockstep and lands in a separate PR.

vite-plugin-node-polyfills held at 0.26.0 (13 declarations). 0.28.0 broke the Vite dev
server — see below. Caught by the Dev smoke CI check on this PR.

peerDependencies were not touched by the sweep (verified — pnpm up does not rewrite them), so
no consumer-facing peer range was tightened.

Added: a sharp security floor

Aikido flagged sharp@0.34.5 (GHSA-f88m-g3jw-g9cj, HIGH) — libvips flaws affecting anything
that decodes untrusted GIF/TIFF/VIPS input. next@15.5.23 in examples/nextjs15 still resolves
the 0.34.x line while @dynamic-labs already pulled 0.35.x, so the tree carried three copies.

Added sharp: ">=0.35.0" to pnpm.overrides, matching how the other security floors in that file
are expressed (axios, zod, abitype). That collapses all three to a single sharp@0.35.3
— the version the advisory recommends. pnpm audit advisories drop 36 → 35 with the sharp entry
gone, and examples/nextjs15 (the affected consumer) still builds and renders 3/3.

Majors taken

Dep From → To Where
motion 12 → 13.1.0 packages/widget, packages/widget-checkout
react-intersection-observer 10 → 11.0.0 packages/widget
@dynamic-labs/* (7 pkgs) 4.92.3 → 5.3.1 examples/dynamic
typescript 6.0.3 → 7.0.2 examples/nextjs only

Motion 13's only breaking change is dropping the optional @emotion/is-prop-valid integration;
the repo has no styled(m.*) components, so there was nothing to migrate.
react-intersection-observer 11 is an internal observer-lifecycle rewrite with no useInView
API change.

TypeScript 7 held back in three examples

TS 7 was intended for all four examples still on TS 6, but it breaks three of them:

  • sveltesvelte-preprocess calls ts.convertCompilerOptionsFromJson, removed in TS 7
  • vuevue-tsc resolves typescript/lib/tsc, no longer exported in TS 7
  • nextjs15 — Next 15 cannot read the @/* tsconfig path alias under TS 7

examples/nextjs runs Next 16 and builds cleanly on TS 7, so it takes the bump. The other three
stay on ^6.0.3.

vite-plugin-node-polyfills 0.28.0 breaks dev mode

The first CI run on this PR failed exactly one check — Dev smoke — with 63 of these:

[vite] (client) Pre-transform error: Failed to resolve import
"vite-plugin-node-polyfills/shims/process" from
"../widget/src/pages/TransactionDetailsPage/TransactionDetailsPage.tsx". Does the file exist?

0.28.0 injects the bare specifier vite-plugin-node-polyfills/shims/process into source files of
packages/widget, packages/widget-checkout and packages/widget-provider-transak — none of
which declare the plugin. Under pnpm's isolated layout it is not resolvable from those packages,
so the dev server serves a broken app and all four dev smoke tests fail.

Bisected: the export maps, shim files, and dependencies are byte-identical between 0.26.0 and
0.28.0, and the emitted specifier is the same, so this is a behavioural regression in the plugin.
Holding Vite at the new 8.2.1 and moving only the plugin back to 0.26.0 gives 0 pre-transform
errors, which isolates the plugin as the cause.

Production builds are unaffected — which is why Build playground and all 17 E2E example jobs
stayed green while dev mode was broken. That is precisely the gap e2e-playground-dev.yml exists
to cover.

pnpm regen

packageManager moves pnpm@11.17.0pnpm@11.22.0 — that is corepack use pnpm@latest
inside pnpm regen, not a hand edit. CI resolves pnpm from that field via pnpm/action-setup,
so it follows automatically.

pnpm regen regenerates the lockfile from the existing ranges — it does not move ^15 to
^16. examples/nextjs15 therefore stays on Next 15.

Single-copy invariants (CLAUDE.md)

pnpm dedupe collapsed a wagmi 3.7.4 / 3.7.6 split that the bump introduced via peer
resolution on packages/widget-provider-ethereum:

Dep Result
wagmi 1 version in the 3.x line (3.7.6). 2.19.5 remains as a pre-existing transitive via @privy-io/react-authx402, also present on main.
@lifi/sdk 1 version (4.4.0)
@lifi/types 1 version (18.2.0)
viem 1 version (2.55.19)

Visual showcase (Screenshots or Videos)

All 17 status: active examples in e2e/examples.json build, serve, and pass the Playwright
widget-smoke suite (widget container renders with the Exchange heading, Settings view opens,
From/To tokens are selectable).

Not covered by render: dynamic, deposit-flow, and nuxt are status: broken in the
registry at baseline and are skipped by the harness. So the @dynamic-labs/* v5 major is
verified by check:types and a clean vite build only, not by a render.

dynamic stays broken, but its brokenReason is now correct. The old note blamed
vite-plugin-env-compatible and prescribed swapping in vite-plugin-node-polyfills; that no
longer works under Vite 8. The plugin advertises a Vite 8 peer range but aliases its own shims by
bare specifier, and its exports map still carries legacy trailing-slash keys that resolve to
files, which rolldown rejects with Expecting folder to folder mapping. Reproduced on both
0.26.0 and 0.28.0 (their exports maps are identical), in vite build and again in dev dependency
pre-bundling. Upstream fixes are open but unreleased —
#161 and
#154, with
#158 and
#140 reporting this
exact error. Dropping the plugin gets the example to build once buffer is a real dependency (the
SDK's own polyfills.js assigns window.global/window.Buffer), but the free process global
is still undefined at runtime. The v5 upgrade itself is sound; only the browser polyfill setup is
blocked.

Verification

Gate Result
pnpm build pass
pnpm check (Biome) pass
pnpm check:types pass
pnpm check:circular-deps pass
pnpm dedupe --check pass
pnpm install --frozen-lockfile pass
pnpm test:examples 17 / 17 active examples pass
pnpm e2e:dev (dev-mode smoke) 4 / 4 pass; dev server reports 0 pre-transform errors
pnpm auditsharp advisory cleared (36 → 35 advisories)
@lifi/widget tests 71 / 71 pass
@lifi/widget-provider tests 17 / 17 pass
@lifi/widget-provider-tron tests 9 / 9 pass

Pre-existing, not from this PR

  • @lifi/widget-checkout: 38 failing tests (7 files). Byte-identical on clean origin/main
    — same count, same TypeError: Cannot read properties of undefined (reading 'setItem') from
    the zustand persist middleware, at zustand@5.0.14 there and 5.0.15 here. Verified in a
    separate baseline worktree at 7a6dfb204.
  • @lifi/widget-light has no test files, so vitest run exits 1 there. Documented in
    CLAUDE.md.
  • changeset status name-collision warnings (connectkit, vue, react-router example
    packages shadowing their own deps) — identical on main, only the version strings differ.

Checklist before requesting a review

  • I have performed a self-review and testing of my code.
  • This pull request is focused and addresses a single problem.
  • If this PR modifies the Widget API or adds new features that require documentation, I have updated the documentation in the public-docs repository.

TypeScript 7 breaks the build in these three examples:

- svelte: svelte-preprocess calls ts.convertCompilerOptionsFromJson,
  which TS 7 no longer exposes.
- vue: vue-tsc resolves typescript/lib/tsc, which TS 7 does not export.
- nextjs15: Next 15 cannot read the "@/*" tsconfig path alias under TS 7.

examples/nextjs runs Next 16 and builds fine on TS 7, so it keeps it.
@changeset-bot

changeset-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a814018

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
@lifi/widget-checkout Patch
@lifi/wallet-management Patch
@lifi/widget-provider Patch
@lifi/widget-provider-bitcoin Patch
@lifi/widget-provider-ethereum Patch
@lifi/widget-provider-mesh Patch
@lifi/widget-provider-solana Patch
@lifi/widget-provider-sui Patch
@lifi/widget-provider-tron Patch
@lifi/widget Patch
connectkit Patch
dynamic Patch
nft-checkout Patch
privy-ethers-example Patch
privy Patch
rainbowkit Patch
reown Patch
vite-iframe Patch
vite-project Patch
@lifi/widget-provider-transak Patch
deposit-flow Patch
nextjs Patch
nextjs15 Patch
nuxt-app Patch
react-router Patch
remix Patch
svelte Patch
tanstack-router-example Patch
vue Patch
zustand-widget-config Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

✅ E2E Dev Smoke — passing

Check Result
Dev server start (pnpm dev) ✅ started
Smoke tests ✅ passed

4 passed · 0 failed · 0 skipped · 28s

View run

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

E2E Examples — all passed

All examples passed in the latest run.

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

E2E Playground results

passed  158 passed

Details

stats  158 tests across 10 suites
duration  1 minute, 60 seconds
commit  a814018

📥 Download full HTML report (open the run → Artifacts → playwright-report)

chybisov and others added 4 commits August 20, 2026 13:04
0.28.0 breaks the Vite dev server. It injects the bare specifier
"vite-plugin-node-polyfills/shims/process" into source files of
packages/widget, packages/widget-checkout and packages/widget-provider-transak,
none of which declare the plugin, so pnpm's isolated layout cannot resolve it:

  [vite] (client) Pre-transform error: Failed to resolve import
  "vite-plugin-node-polyfills/shims/process" from
  "../widget/src/pages/TransactionDetailsPage/TransactionDetailsPage.tsx".

63 such errors, and all four dev smoke tests fail. Production builds are
unaffected, which is why the playground build and every example E2E job stayed
green while dev mode was broken.

The export maps, shim files and declared dependencies are identical between
0.26.0 and 0.28.0, and both emit the same specifier, so this is a behavioural
regression in the plugin. Keeping Vite at 8.2.1 and moving only the plugin back
to 0.26.0 gives zero pre-transform errors, which isolates the cause.
Aikido flagged sharp@0.34.5 (GHSA-f88m-g3jw-g9cj, HIGH): libvips flaws
affecting anything that decodes untrusted GIF/TIFF/VIPS input. next@15.5.23
in examples/nextjs15 still resolves the 0.34.x line, while @dynamic-labs
already pulled 0.35.x, so the tree carried three copies.

The floor collapses all of them to a single sharp@0.35.3 — the version the
advisory recommends — and matches how the other security floors in this file
are expressed (axios, zod, abitype).
The old note said vite-plugin-env-compatible was the problem and that swapping
in vite-plugin-node-polyfills would fix it. That is no longer true under Vite 8.

The Dynamic SDK reads a bare `process` global (nextTick/versions/emit) and
imports `buffer/index.js`, so it does need Node shims. But
vite-plugin-node-polyfills, while advertising a Vite 8 peer range, aliases its
own shims by bare specifier, and its exports map still carries legacy
trailing-slash keys that resolve to files. Rolldown rejects those:

  Expecting folder to folder mapping.
  ".../vite-plugin-node-polyfills/package.json" should end with "/"

Verified on both 0.26.0 and 0.28.0 (identical exports maps), in `vite build`
and again in dev dependency pre-bundling. Upstream fixes are open but
unreleased: davidmyersdev/vite-plugin-node-polyfills#161 and #154, with #158
and #140 reporting this exact error.

Dropping the plugin entirely gets the example to build once `buffer` is a real
dependency — the SDK's own polyfills.js assigns window.global/window.Buffer —
but the free `process` global remains undefined at runtime.

The @dynamic-labs v5 upgrade itself is sound: it type-checks and bundles. Only
the browser polyfill setup is blocked.
@chybisov
chybisov merged commit 874158c into main Aug 20, 2026
29 checks passed
@chybisov
chybisov deleted the chore/update-dependencies branch August 20, 2026 12:20
@github-actions github-actions Bot mentioned this pull request Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant