Migration: v14 to v15 (@vueuse/integrations)
Baseline: 14.3.0 → target: 15.0.0. Facts verified against the prepared v15.0.0 source and cited release notes.
v15.0.0
Release: https://github.com/vueuse/vueuse/releases/tag/v15.0.0 (2026-09-16)
BREAKING: useIDBKeyval returns an object and syncs across tabs
PR: https://github.com/vueuse/vueuse/pull/5338 (labeled BREAKING CHANGE, milestone 15.0). Verified in dist/useIDBKeyval.d.ts:46-51 and dist/useIDBKeyval.js:83-89.
Before (v14):
const count = useIDBKeyval('my-count', 0) // ref with merged set()
count.value = 10
await count.set(10)After (v15):
const { data: count, set } = useIDBKeyval('my-count', 0)
count.value = 10
await set(10)Migration steps:
- Replace
const x = useIDBKeyval(...)withconst { data: x, set } = useIDBKeyval(...). - Change
await x.set(v)toawait set(v). - Deleting still works by assignment:
x.value = null. - New return members:
isFinished(initial read done),isSupported(BroadcastChannel available).
New option listenToStorageChanges (default true) syncs every useIDBKeyval on the same key across tabs via BroadcastChannel named vueuse-idb-<key>; it uses BroadcastChannel, not the StorageEvent, despite the option name matching useStorage. Pass listenToStorageChanges: false when cross-tab echo is unwanted (dist/useIDBKeyval.js:60-76).
BREAKING: Node.js 20 dropped
engines.node is >=22 (package.json:52-54; release note "Drop support for Node.js 20", https://github.com/vueuse/vueuse/pull/5553). Upgrade CI images and Lambda runtimes before upgrading.
drauu peer range aligned
useDrauu accepts drauu@^1 || ^0.4 (package.json:59; https://github.com/vueuse/vueuse/pull/5595). v14 pinned ^0.4; either major now resolves. The API surface used (createDrauu, Brush, Options) is identical in both.
Other notes for this window (v14.4.0)
useFusenow callstriggerRefaftersetCollection, so refs holding thefuseinstance update whendatachanges (https://github.com/vueuse/vueuse/pull/5479, dist/useFuse.js:16-19).
Carried constraints still in force
- Vue
^3.5.0peer required (since v14.0.0, https://github.com/vueuse/vueuse/releases/tag/v14.0.0; package.json:68). - ESM-only; the CommonJS build was removed in v13.0.0 (https://github.com/vueuse/vueuse/releases/tag/v13.0.0). Jest users need
transformIgnorePatternsallowing@vueuse/integrations. - Alias exports deprecated since v14.0.0 (https://github.com/vueuse/vueuse/issues/5009); import original names only.
- Dist layout from tsdown (since v14.0.0): per-function entry files plus
<fn>/component.jssubpaths (package.json:24-43). Deep imports like@vueuse/integrations/useAxiosare stable public API. useSortable.watchElementoption available since v14.2.0 (https://github.com/vueuse/vueuse/issues/5189).useFocusTrappeer rangefocus-trap@^7 || ^8since v14.2.0 (https://github.com/vueuse/vueuse/issues/5270).
Upgrade checklist
- Node >= 22 everywhere the package installs or builds.
useIDBKeyvalcall sites: destructuredata, switch.set()calls (type errors surface immediately because the return type changed).- Review any code relying on cross-tab silence from
useIDBKeyval; opt out withlistenToStorageChanges: false. - Confirm each wrapper's peer dependency is installed; v15 widened only
drauu. - Keep submodule imports (
@vueuse/integrations/useX) for tree-shaking; remove any deprecated alias usage.