diff --git a/.changeset/history-solid2-migration.md b/.changeset/history-solid2-migration.md new file mode 100644 index 000000000..ca308a778 --- /dev/null +++ b/.changeset/history-solid2-migration.md @@ -0,0 +1,17 @@ +--- +"@solid-primitives/history": major +--- + +Migrate to Solid.js v2.0 (beta.10) + +## Breaking Changes + +**Peer dependency**: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10` are now required. + +### `@solid-primitives/history` + +- `isServer` import moved from `solid-js/web` to `@solidjs/web` +- `batch()` removed from `undo()` and `redo()` — Solid 2.0 batches signal updates automatically; call `flush()` before reading `canUndo()`/`canRedo()` in tests or non-reactive (non-render) contexts +- Internal count signal uses `{ pureWrite: true }` for Solid 2.0 signal semantics +- `createMemo` initial state is now managed via an explicit `initialState` reference — Solid 2.0's `createMemo` passes `undefined` as `prev` on the first call, unlike Solid 1.x which passed the `init` argument +- Added SSR test coverage (`test/server.test.ts`) diff --git a/packages/history/CHANGELOG.md b/packages/history/CHANGELOG.md index abd42ba6f..dc41d65dd 100644 --- a/packages/history/CHANGELOG.md +++ b/packages/history/CHANGELOG.md @@ -1,5 +1,19 @@ # @solid-primitives/history +## 0.3.0 + +### Minor Changes + +- Migrate to Solid.js v2.0 (beta.10) + +### Breaking Changes + +- **Peer dependency**: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10` are now required. +- `isServer` import moved from `solid-js/web` to `@solidjs/web`. +- `batch()` removed from `undo()` and `redo()` — Solid 2.0 batches signal updates automatically. Call `flush()` before reading `canUndo()`/`canRedo()` in tests or non-reactive contexts. +- Internal count signal uses `{ pureWrite: true }` for Solid 2.0 signal semantics. +- `createMemo` initial value handled via an explicit `initialState` reference to accommodate Solid 2.0's `undefined`-prev first-call behavior. + ## 0.2.3 ### Patch Changes diff --git a/packages/history/README.md b/packages/history/README.md index 5627c50d3..916cb0b76 100644 --- a/packages/history/README.md +++ b/packages/history/README.md @@ -118,11 +118,10 @@ const history = createUndoHistory(() => { }; }); -// set them both at the same time, to only create one point in history -batch(() => { - setA(1); - setB(1); -}); +// Note: updates are batched by default in Solid 2.0 — both +// changes create a single history entry +setA(1); +setB(1); ``` ### Observing multiple independent sources diff --git a/packages/history/package.json b/packages/history/package.json index e1e1e037e..761b4ac51 100644 --- a/packages/history/package.json +++ b/packages/history/package.json @@ -54,13 +54,15 @@ "test:ssr": "pnpm run vitest --mode ssr" }, "peerDependencies": { - "solid-js": "^1.6.12" + "@solidjs/web": "^2.0.0-beta.10", + "solid-js": "^2.0.0-beta.10" }, "dependencies": { "@solid-primitives/utils": "workspace:^" }, "devDependencies": { "@solid-primitives/deep": "workspace:^", - "solid-js": "^1.9.7" + "@solidjs/web": "2.0.0-beta.10", + "solid-js": "2.0.0-beta.10" } } diff --git a/packages/history/src/index.ts b/packages/history/src/index.ts index 0037eaf96..c6dc236e9 100644 --- a/packages/history/src/index.ts +++ b/packages/history/src/index.ts @@ -1,6 +1,6 @@ import { type Many, createMicrotask, falseFn, noop } from "@solid-primitives/utils"; -import { type Accessor, type Signal, batch, createMemo, createSignal, untrack } from "solid-js"; -import { isServer } from "solid-js/web"; +import { type Accessor, type Signal, createMemo, createSignal, untrack } from "solid-js"; +import { isServer } from "@solidjs/web"; /** * Configuration object for {@link createUndoHistory}. @@ -43,6 +43,8 @@ export type UndoHistoryReturn = { redo: VoidFunction; }; +type HistoryState = { count: Signal; list: VoidFunction[][] }; + /** * Creates an undo history from a reactive source for going back and forth between state snapshots. * @@ -88,29 +90,31 @@ export function createUndoHistory( const limit = options?.limit ?? 100, sources = Array.isArray(source) ? source.map(s => createMemo(s)) : [source], clearIgnore = createMicrotask(() => (ignoreNext = false)), - history = createMemo<{ count: Signal; list: VoidFunction[][] }>( - p => { - // always track the sources - const setters: VoidFunction[] = []; - for (const s of sources) { - const setter = s(); - if (setter) setters.push(setter); - } + // Initial state lives outside the memo so Solid 2.0's undefined-prev first-call is handled + initialCount = createSignal(0, { pureWrite: true }), + initialState: HistoryState = { list: [], count: initialCount }, + history = createMemo(p => { + const prev = p ?? initialState; - if (ignoreNext || !setters.length) { - ignoreNext = false; - return p; - } + // always track the sources + const setters: VoidFunction[] = []; + for (const s of sources) { + const setter = s(); + if (setter) setters.push(setter); + } - const count = untrack(p.count[0]), - newLength = p.list.length - count, - newHistory = p.list.slice(Math.max(0, newLength - limit), newLength); - newHistory.push(setters); + if (ignoreNext || !setters.length) { + ignoreNext = false; + return prev; + } - return { count: count ? createSignal(0) : p.count, list: newHistory }; - }, - { list: [], count: createSignal(0) }, - ), + const count = untrack(prev.count[0]), + newLength = prev.list.length - count, + newHistory = prev.list.slice(Math.max(0, newLength - limit), newLength); + newHistory.push(setters); + + return { count: count ? createSignal(0, { pureWrite: true }) : prev.count, list: newHistory }; + }), canUndo = createMemo(() => { const h = history(); return h.list.length - h.count[0]() > 1; @@ -134,10 +138,10 @@ export function createUndoHistory( canUndo, canRedo, undo() { - untrack(() => canUndo() && batch(() => move(1))); + untrack(() => canUndo() && move(1)); }, redo() { - untrack(() => canRedo() && batch(() => move(-1))); + untrack(() => canRedo() && move(-1)); }, }; } diff --git a/packages/history/test/index.test.ts b/packages/history/test/index.test.ts index 8bf9e0529..c520c5ace 100644 --- a/packages/history/test/index.test.ts +++ b/packages/history/test/index.test.ts @@ -1,146 +1,163 @@ import { describe, test, expect } from "vitest"; -import { batch, createRoot, createSignal } from "solid-js"; +import { createRoot, createSignal, flush } from "solid-js"; import { createUndoHistory } from "../src/index.js"; describe("createUndoHistory", () => { - test("single source", () => - createRoot(dispose => { - const [a, setA] = createSignal(0); + test("single source", () => { + const [a, setA] = createSignal(0); - const history = createUndoHistory(() => { + const { history, dispose } = createRoot(dispose => ({ + history: createUndoHistory(() => { const v = a(); return () => setA(v); - }); + }), + dispose, + })); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); - setA(1); + setA(1); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(0); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(0); - history.redo(); + history.redo(); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - expect(a()).toBe(1); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + expect(a()).toBe(1); - setA(2); + setA(2); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(1); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(1); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(0); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(0); - setA(3); + setA(3); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(0); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(0); - dispose(); - })); + dispose(); + }); test("going over limit", () => { - createRoot(dispose => { - const [a, setA] = createSignal(0); + const [a, setA] = createSignal(0); - const history = createUndoHistory( + const { history, dispose } = createRoot(dispose => ({ + history: createUndoHistory( () => { const v = a(); return () => setA(v); }, { limit: 0 }, - ); + ), + dispose, + })); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); - setA(1); + setA(1); + flush(); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); - dispose(); - }); + dispose(); }); test("combined single source", () => { - createRoot(dispose => { - const [a, setA] = createSignal(0), - [b, setB] = createSignal(0); + const [a, setA] = createSignal(0), + [b, setB] = createSignal(0); - const history = createUndoHistory(() => { + const { history, dispose } = createRoot(dispose => ({ + history: createUndoHistory(() => { const aValue = a(); const bValue = b(); return () => { setA(aValue); setB(bValue); }; - }); + }), + dispose, + })); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); - setA(1); + setA(1); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); - setB(1); + setB(1); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(1); - expect(b()).toBe(0); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(1); + expect(b()).toBe(0); - history.undo(); + history.undo(); + flush(); - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(a()).toBe(0); - expect(b()).toBe(0); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(a()).toBe(0); + expect(b()).toBe(0); - dispose(); - }); + dispose(); }); test("multiple sources", () => { - createRoot(dispose => { - const [a, setA] = createSignal(0), - [b, setB] = createSignal(0); + const [a, setA] = createSignal(0), + [b, setB] = createSignal(0); - let aCount = 0, - bCount = 0; + let aCount = 0, + bCount = 0; - const history = createUndoHistory([ + const { history, dispose } = createRoot(dispose => ({ + history: createUndoHistory([ () => { const v = a(); return () => { @@ -155,136 +172,153 @@ describe("createUndoHistory", () => { setB(v); }; }, - ]); - - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(false); - expect(aCount).toBe(0); - expect(bCount).toBe(0); - - setA(1); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - expect(aCount).toBe(0); - expect(bCount).toBe(0); - - setB(1); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - expect(aCount).toBe(0); - expect(bCount).toBe(0); - - history.undo(); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(aCount).toBe(0); - expect(bCount).toBe(1); - expect(a()).toBe(1); - expect(b()).toBe(0); - - history.undo(); - - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(aCount).toBe(1); - expect(bCount).toBe(1); - expect(a()).toBe(0); - expect(b()).toBe(0); - - history.redo(); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(aCount).toBe(2); - expect(bCount).toBe(1); - expect(a()).toBe(1); - expect(b()).toBe(0); - - batch(() => { - setA(2); - setB(2); - }); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - expect(aCount).toBe(2); - expect(bCount).toBe(1); - - history.undo(); - - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(aCount).toBe(3); - expect(bCount).toBe(2); - expect(a()).toBe(1); - expect(b()).toBe(0); - - history.undo(); - - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(aCount).toBe(4); - expect(bCount).toBe(2); - expect(a()).toBe(0); - expect(b()).toBe(0); - - dispose(); - }); + ]), + dispose, + })); + + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); + expect(aCount).toBe(0); + expect(bCount).toBe(0); + + setA(1); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + expect(aCount).toBe(0); + expect(bCount).toBe(0); + + setB(1); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + expect(aCount).toBe(0); + expect(bCount).toBe(0); + + history.undo(); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(aCount).toBe(0); + expect(bCount).toBe(1); + expect(a()).toBe(1); + expect(b()).toBe(0); + + history.undo(); + flush(); + + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(aCount).toBe(1); + expect(bCount).toBe(1); + expect(a()).toBe(0); + expect(b()).toBe(0); + + history.redo(); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(aCount).toBe(2); + expect(bCount).toBe(1); + expect(a()).toBe(1); + expect(b()).toBe(0); + + // updates are batched by default — both changes create a single history entry + setA(2); + setB(2); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + expect(aCount).toBe(2); + expect(bCount).toBe(1); + + history.undo(); + flush(); + + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(aCount).toBe(3); + expect(bCount).toBe(2); + expect(a()).toBe(1); + expect(b()).toBe(0); + + history.undo(); + flush(); + + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(aCount).toBe(4); + expect(bCount).toBe(2); + expect(a()).toBe(0); + expect(b()).toBe(0); + + dispose(); }); test("pausing tracking", () => { - createRoot(dispose => { - const [count, setCount] = createSignal(0); - const [track, setTrack] = createSignal(true); + const [count, setCount] = createSignal(0); + const [track, setTrack] = createSignal(true); - const history = createUndoHistory(() => { + const { history, dispose } = createRoot(dispose => ({ + history: createUndoHistory(() => { if (track()) { const v = count(); return () => setCount(v); } - }); - - setCount(1); - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - - setTrack(false); // disable tracking - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - - setCount(2); // will NOT create a point in history - setCount(3); // will NOT create a point in history - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - - setTrack(true); // enable tracking, and create a point in history for the last change - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - - history.undo(); // will set count to 1 - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(count()).toBe(1); - - history.undo(); // will set count to 0 - expect(history.canUndo()).toBe(false); - expect(history.canRedo()).toBe(true); - expect(count()).toBe(0); - - history.redo(); // will set count to 1 - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(true); - expect(count()).toBe(1); - - history.redo(); // will set count to 3 - expect(history.canUndo()).toBe(true); - expect(history.canRedo()).toBe(false); - expect(count()).toBe(3); - - dispose(); - }); + }), + dispose, + })); + + setCount(1); + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + + setTrack(false); // disable tracking + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + + setCount(2); // will NOT create a point in history + setCount(3); // will NOT create a point in history + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + + setTrack(true); // enable tracking, and create a point in history for the last change + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + + history.undo(); // will set count to 1 + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(count()).toBe(1); + + history.undo(); // will set count to 0 + flush(); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(true); + expect(count()).toBe(0); + + history.redo(); // will set count to 1 + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(true); + expect(count()).toBe(1); + + history.redo(); // will set count to 3 + flush(); + expect(history.canUndo()).toBe(true); + expect(history.canRedo()).toBe(false); + expect(count()).toBe(3); + + dispose(); }); }); diff --git a/packages/history/test/server.test.ts b/packages/history/test/server.test.ts new file mode 100644 index 000000000..ee2910869 --- /dev/null +++ b/packages/history/test/server.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, test } from "vitest"; +import { createUndoHistory } from "../src/index.js"; + +describe("createUndoHistory - SSR", () => { + test("returns no-op stubs on server", () => { + const history = createUndoHistory(() => () => {}); + expect(history.canUndo()).toBe(false); + expect(history.canRedo()).toBe(false); + history.undo(); + history.redo(); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 726871879..ed3469716 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -414,9 +414,12 @@ importers: '@solid-primitives/deep': specifier: workspace:^ version: link:../deep + '@solidjs/web': + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10 packages/i18n: devDependencies: @@ -2366,36 +2369,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.3.0': resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} @@ -2506,36 +2515,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} @@ -2672,56 +2687,67 @@ packages: resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.43.0': resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.43.0': resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.43.0': resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.43.0': resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.43.0': resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.43.0': resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.43.0': resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.43.0': resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.43.0': resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.43.0': resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} @@ -5208,24 +5234,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}