diff --git a/package.json b/package.json index 62dcb91d42d..2518d496d89 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "pug": "^3.0.3", "puppeteer": "~24.16.2", "rimraf": "^6.0.1", - "rollup": "^4.46.4", + "rollup": "4.46.4", "rollup-plugin-dts": "^6.2.3", "rollup-plugin-esbuild": "^6.2.1", "rollup-plugin-polyfill-node": "^0.13.0", diff --git a/packages/runtime-vapor/__tests__/componentSlots.spec.ts b/packages/runtime-vapor/__tests__/componentSlots.spec.ts index ff7aa56d055..54e754e5483 100644 --- a/packages/runtime-vapor/__tests__/componentSlots.spec.ts +++ b/packages/runtime-vapor/__tests__/componentSlots.spec.ts @@ -1,7 +1,9 @@ // NOTE: This test is implemented based on the case of `runtime-core/__test__/componentSlots.spec.ts`. import { + child, createComponent, + createFor, createForSlots, createIf, createSlot, @@ -13,10 +15,15 @@ import { setInsertionState, template, } from '../src' -import { currentInstance, nextTick, ref } from '@vue/runtime-dom' +import { + currentInstance, + nextTick, + ref, + toDisplayString, +} from '@vue/runtime-dom' import { makeRender } from './_utils' import type { DynamicSlot } from '../src/componentSlots' -import { setElementText } from '../src/dom/prop' +import { setElementText, setText } from '../src/dom/prop' const define = makeRender() @@ -533,5 +540,219 @@ describe('component: slots', () => { ``, ) }) + + test('render fallback when slot content is not valid', async () => { + const Child = { + setup() { + return createSlot('default', null, () => + document.createTextNode('fallback'), + ) + }, + } + + const { html } = define({ + setup() { + return createComponent(Child, null, { + default: () => { + return template('')() + }, + }) + }, + }).render() + + expect(html()).toBe('fallback') + }) + + test('render fallback when v-if condition is false', async () => { + const Child = { + setup() { + return createSlot('default', null, () => + document.createTextNode('fallback'), + ) + }, + } + + const toggle = ref(false) + + const { html } = define({ + setup() { + return createComponent(Child, null, { + default: () => { + return createIf( + () => toggle.value, + () => { + return document.createTextNode('content') + }, + ) + }, + }) + }, + }).render() + + expect(html()).toBe('fallback') + + toggle.value = true + await nextTick() + expect(html()).toBe('content') + + toggle.value = false + await nextTick() + expect(html()).toBe('fallback') + }) + + test('render fallback with nested v-if', async () => { + const Child = { + setup() { + return createSlot('default', null, () => + document.createTextNode('fallback'), + ) + }, + } + + const outerShow = ref(false) + const innerShow = ref(false) + + const { html } = define({ + setup() { + return createComponent(Child, null, { + default: () => { + return createIf( + () => outerShow.value, + () => { + return createIf( + () => innerShow.value, + () => { + return document.createTextNode('content') + }, + ) + }, + ) + }, + }) + }, + }).render() + + expect(html()).toBe('fallback') + + outerShow.value = true + await nextTick() + expect(html()).toBe('fallback') + + innerShow.value = true + await nextTick() + expect(html()).toBe('content') + + innerShow.value = false + await nextTick() + expect(html()).toBe('fallback') + + outerShow.value = false + await nextTick() + expect(html()).toBe('fallback') + + outerShow.value = true + await nextTick() + expect(html()).toBe('fallback') + + innerShow.value = true + await nextTick() + expect(html()).toBe('content') + }) + + test('render fallback with v-for', async () => { + const Child = { + setup() { + return createSlot('default', null, () => + document.createTextNode('fallback'), + ) + }, + } + + const items = ref([1]) + const { html } = define({ + setup() { + return createComponent(Child, null, { + default: () => { + const n2 = createFor( + () => items.value, + for_item0 => { + const n4 = template(' ')() as any + const x4 = child(n4) as any + renderEffect(() => + setText(x4, toDisplayString(for_item0.value)), + ) + return n4 + }, + ) + return n2 + }, + }) + }, + }).render() + + expect(html()).toBe('1') + + items.value.pop() + await nextTick() + expect(html()).toBe('fallback') + + items.value.pop() + await nextTick() + expect(html()).toBe('fallback') + + items.value.push(2) + await nextTick() + expect(html()).toBe('2') + }) + + test('render fallback with v-for (empty source)', async () => { + const Child = { + setup() { + return createSlot('default', null, () => + document.createTextNode('fallback'), + ) + }, + } + + const items = ref([]) + const { html } = define({ + setup() { + return createComponent(Child, null, { + default: () => { + const n2 = createFor( + () => items.value, + for_item0 => { + const n4 = template(' ')() as any + const x4 = child(n4) as any + renderEffect(() => + setText(x4, toDisplayString(for_item0.value)), + ) + return n4 + }, + ) + return n2 + }, + }) + }, + }).render() + + expect(html()).toBe('fallback') + + items.value.push(1) + await nextTick() + expect(html()).toBe('1') + + items.value.pop() + await nextTick() + expect(html()).toBe('fallback') + + items.value.pop() + await nextTick() + expect(html()).toBe('fallback') + + items.value.push(2) + await nextTick() + expect(html()).toBe('2') + }) }) }) diff --git a/packages/runtime-vapor/src/apiCreateFor.ts b/packages/runtime-vapor/src/apiCreateFor.ts index bdd2af7b348..617cbaf57b0 100644 --- a/packages/runtime-vapor/src/apiCreateFor.ts +++ b/packages/runtime-vapor/src/apiCreateFor.ts @@ -15,8 +15,10 @@ import { isArray, isObject, isString } from '@vue/shared' import { createComment, createTextNode } from './dom/node' import { type Block, + ForFragment, VaporFragment, insert, + remove, remove as removeBlock, } from './block' import { warn } from '@vue/runtime-dom' @@ -77,7 +79,7 @@ export const createFor = ( setup?: (_: { createSelector: (source: () => any) => (cb: () => void) => void }) => void, -): VaporFragment => { +): ForFragment => { const _insertionParent = insertionParent const _insertionAnchor = insertionAnchor if (isHydrating) { @@ -94,7 +96,7 @@ export const createFor = ( let currentKey: any // TODO handle this in hydration const parentAnchor = __DEV__ ? createComment('for') : createTextNode() - const frag = new VaporFragment(oldBlocks) + const frag = new ForFragment(oldBlocks) const instance = currentInstance! const canUseFastRemove = !!(flags & VaporVForFlags.FAST_REMOVE) const isComponent = !!(flags & VaporVForFlags.IS_COMPONENT) @@ -112,6 +114,7 @@ export const createFor = ( const newLength = source.values.length const oldLength = oldBlocks.length newBlocks = new Array(newLength) + let isFallback = false const prevSub = setActiveSub() @@ -123,6 +126,11 @@ export const createFor = ( } else { parent = parent || parentAnchor!.parentNode if (!oldLength) { + // remove fallback nodes + if (frag.fallback && (frag.nodes[0] as Block[]).length > 0) { + remove(frag.nodes[0], parent!) + } + // fast path for all new for (let i = 0; i < newLength; i++) { mount(source, i) @@ -140,6 +148,12 @@ export const createFor = ( parent!.textContent = '' parent!.appendChild(parentAnchor) } + + // render fallback nodes + if (frag.fallback) { + insert((frag.nodes[0] = frag.fallback()), parent!, parentAnchor) + isFallback = true + } } else if (!getKey) { // unkeyed fast path const commonLength = Math.min(newLength, oldLength) @@ -339,11 +353,12 @@ export const createFor = ( } } - frag.nodes = [(oldBlocks = newBlocks)] - if (parentAnchor) { - frag.nodes.push(parentAnchor) + if (!isFallback) { + frag.nodes = [(oldBlocks = newBlocks)] + if (parentAnchor) frag.nodes.push(parentAnchor) + } else { + oldBlocks = [] } - setActiveSub(prevSub) } diff --git a/packages/runtime-vapor/src/block.ts b/packages/runtime-vapor/src/block.ts index ba84161a71b..03ee4bd1e46 100644 --- a/packages/runtime-vapor/src/block.ts +++ b/packages/runtime-vapor/src/block.ts @@ -18,17 +18,24 @@ export type Block = export type BlockFn = (...args: any[]) => Block -export class VaporFragment { - nodes: Block +export class VaporFragment { + nodes: T anchor?: Node insert?: (parent: ParentNode, anchor: Node | null) => void remove?: (parent?: ParentNode) => void + fallback?: BlockFn - constructor(nodes: Block) { + constructor(nodes: T) { this.nodes = nodes } } +export class ForFragment extends VaporFragment { + constructor(nodes: Block[]) { + super(nodes) + } +} + export class DynamicFragment extends VaporFragment { anchor: Node scope: EffectScope | undefined @@ -65,18 +72,75 @@ export class DynamicFragment extends VaporFragment { this.nodes = [] } - if (this.fallback && !isValidBlock(this.nodes)) { - parent && remove(this.nodes, parent) - this.nodes = - (this.scope || (this.scope = new EffectScope())).run(this.fallback) || - [] - parent && insert(this.nodes, parent, this.anchor) + if (this.fallback) { + // set fallback for nested fragments + const hasNestedFragment = isFragment(this.nodes) + if (hasNestedFragment) { + setFragmentFallback(this.nodes as VaporFragment, this.fallback) + } + + const invalidFragment = findInvalidFragment(this) + if (invalidFragment) { + parent && remove(this.nodes, parent) + const scope = this.scope || (this.scope = new EffectScope()) + scope.run(() => { + // for nested fragments, render invalid fragment's fallback + if (hasNestedFragment) { + renderFragmentFallback(invalidFragment) + } else { + this.nodes = this.fallback!() || [] + } + }) + parent && insert(this.nodes, parent, this.anchor) + } } setActiveSub(prevSub) } } +export function setFragmentFallback( + fragment: VaporFragment, + fallback: BlockFn, +): void { + if (fragment.fallback) { + const originalFallback = fragment.fallback + // if the original fallback also renders invalid blocks, + // this ensures proper fallback chaining + fragment.fallback = () => { + const fallbackNodes = originalFallback() + if (isValidBlock(fallbackNodes)) { + return fallbackNodes + } + return fallback() + } + } else { + fragment.fallback = fallback + } + + if (isFragment(fragment.nodes)) { + setFragmentFallback(fragment.nodes, fragment.fallback) + } +} + +function renderFragmentFallback(fragment: VaporFragment): void { + if (fragment instanceof ForFragment) { + fragment.nodes[0] = [fragment.fallback!() || []] as Block[] + } else if (fragment instanceof DynamicFragment) { + fragment.update(fragment.fallback) + } else { + // vdom slots + } +} + +function findInvalidFragment(fragment: VaporFragment): VaporFragment | null { + if (isValidBlock(fragment.nodes)) return null + + return isFragment(fragment.nodes) + ? findInvalidFragment(fragment.nodes) || fragment + : fragment +} + export function isFragment(val: NonNullable): val is VaporFragment { return val instanceof VaporFragment } @@ -96,7 +160,7 @@ export function isValidBlock(block: Block): boolean { } else if (isVaporComponent(block)) { return isValidBlock(block.block) } else if (isArray(block)) { - return block.length > 0 && block.every(isValidBlock) + return block.length > 0 && block.some(isValidBlock) } else { // fragment return isValidBlock(block.nodes) diff --git a/packages/runtime-vapor/src/componentSlots.ts b/packages/runtime-vapor/src/componentSlots.ts index 100c99cdb8a..036cf670e40 100644 --- a/packages/runtime-vapor/src/componentSlots.ts +++ b/packages/runtime-vapor/src/componentSlots.ts @@ -126,18 +126,10 @@ export function createSlot( const renderSlot = () => { const slot = getSlot(rawSlots, isFunction(name) ? name() : name) if (slot) { + fragment.fallback = fallback // create and cache bound version of the slot to make it stable // so that we avoid unnecessary updates if it resolves to the same slot - fragment.update( - slot._bound || - (slot._bound = () => { - const slotContent = slot(slotProps) - if (slotContent instanceof DynamicFragment) { - slotContent.fallback = fallback - } - return slotContent - }), - ) + fragment.update(slot._bound || (slot._bound = () => slot(slotProps))) } else { fragment.update(fallback) } diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts index adc54526175..239e2805b9c 100644 --- a/packages/runtime-vapor/src/vdomInterop.ts +++ b/packages/runtime-vapor/src/vdomInterop.ts @@ -158,7 +158,7 @@ function createVDOMComponent( rawProps?: LooseRawProps | null, rawSlots?: LooseRawSlots | null, ): VaporFragment { - const frag = new VaporFragment([]) + const frag = new VaporFragment([] as Block[]) const vnode = createVNode( component, rawProps && new Proxy(rawProps, rawPropsProxyHandlers), @@ -217,7 +217,7 @@ function createVDOMComponent( ) } - frag.nodes = vnode.el as Block + frag.nodes = [vnode.el] as Block[] } frag.remove = unmount diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efe0d86a09a..ccae9ecf902 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,19 +40,19 @@ importers: version: 7.28.2 '@rollup/plugin-alias': specifier: ^5.1.1 - version: 5.1.1(rollup@4.47.0) + version: 5.1.1(rollup@4.46.4) '@rollup/plugin-commonjs': specifier: ^28.0.6 - version: 28.0.6(rollup@4.47.0) + version: 28.0.6(rollup@4.46.4) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.47.0) + version: 6.1.0(rollup@4.46.4) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.1(rollup@4.47.0) + version: 16.0.1(rollup@4.46.4) '@rollup/plugin-replace': specifier: 5.0.4 - version: 5.0.4(rollup@4.47.0) + version: 5.0.4(rollup@4.46.4) '@swc/core': specifier: ^1.13.3 version: 1.13.3 @@ -141,17 +141,17 @@ importers: specifier: ^6.0.1 version: 6.0.1 rollup: - specifier: ^4.46.4 - version: 4.47.0 + specifier: 4.46.4 + version: 4.46.4 rollup-plugin-dts: specifier: ^6.2.3 - version: 6.2.3(rollup@4.47.0)(typescript@5.6.3) + version: 6.2.3(rollup@4.46.4)(typescript@5.6.3) rollup-plugin-esbuild: specifier: ^6.2.1 - version: 6.2.1(esbuild@0.25.9)(rollup@4.47.0) + version: 6.2.1(esbuild@0.25.9)(rollup@4.46.4) rollup-plugin-polyfill-node: specifier: ^0.13.0 - version: 0.13.0(rollup@4.47.0) + version: 0.13.0(rollup@4.46.4) semver: specifier: ^7.7.2 version: 7.7.2 @@ -1200,112 +1200,223 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.46.4': + resolution: {integrity: sha512-B2wfzCJ+ps/OBzRjeds7DlJumCU3rXMxJJS1vzURyj7+KBHGONm7c9q1TfdBl4vCuNMkDvARn3PBl2wZzuR5mw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm-eabi@4.47.0': resolution: {integrity: sha512-Weap5hVbZs/yIvUZcFpAmIso8rLmwkO1LesddNjeX28tIhQkAKjRuVgAJ2xpj8wXTny7IZro9aBIgGov0qsL4A==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm64@4.46.4': + resolution: {integrity: sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-android-arm64@4.47.0': resolution: {integrity: sha512-XcnlqvG5riTJByKX7bZ1ehe48GiF+eNkdnzV0ziLp85XyJ6tLPfhkXHv3e0h3cpZESTQa8IB+ZHhV/r02+8qKw==} cpu: [arm64] os: [android] + '@rollup/rollup-darwin-arm64@4.46.4': + resolution: {integrity: sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.47.0': resolution: {integrity: sha512-kZzTIzmzAUOKteh688kN88HNaL7wxwTz9XB5dDK94AQdf9nD+lxm/H5uPKQaawUFS+klBEowqPMUPjBRKGbo/g==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-x64@4.46.4': + resolution: {integrity: sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.47.0': resolution: {integrity: sha512-WaMrgHRbFspYjvycbsbqheBmlsQBLwfZVWv/KFsT212Yz/RjEQ/9KEp1/p0Ef3ZNwbWsylmgf69St66D9NQNHw==} cpu: [x64] os: [darwin] + '@rollup/rollup-freebsd-arm64@4.46.4': + resolution: {integrity: sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.47.0': resolution: {integrity: sha512-umfYslurvSmAK5MEyOcOGooQ6EBB2pYePQaTVlrOkIfG6uuwu9egYOlxr35lwsp6XG0NzmXW0/5o150LUioMkQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.46.4': + resolution: {integrity: sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.47.0': resolution: {integrity: sha512-EFXhIykAl8//4ihOjGNirF89HEUbOB8ev2aiw8ST8wFGwDdIPARh3enDlbp8aFnScl4CDK4DZLQYXaM6qpxzZw==} cpu: [x64] os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': + resolution: {integrity: sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm-gnueabihf@4.47.0': resolution: {integrity: sha512-EwkC5N61ptruQ9wNkYfLgUWEGh+F3JZSGHkUWhaK2ISAK0d0xmiMKF0trFhRqPQFov5d9DmFiFIhWB5IC79OUA==} cpu: [arm] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm-musleabihf@4.46.4': + resolution: {integrity: sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==} + cpu: [arm] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm-musleabihf@4.47.0': resolution: {integrity: sha512-Iz/g1X94vIjppA4H9hN3VEedw4ObC+u+aua2J/VPJnENEJ0GeCAPBN15nJc5pS5M8JPlUhOd3oqhOWX6Un4RHA==} cpu: [arm] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm64-gnu@4.46.4': + resolution: {integrity: sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm64-gnu@4.47.0': resolution: {integrity: sha512-eYEYHYjFo/vb6k1l5uq5+Af9yuo9WaST/z+/8T5gkee+A0Sfx1NIPZtKMEQOLjm/oaeHFGpWaAO97gTPhouIfQ==} cpu: [arm64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm64-musl@4.46.4': + resolution: {integrity: sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm64-musl@4.47.0': resolution: {integrity: sha512-LX2x0/RszFEmDfjzL6kG/vihD5CkpJ+0K6lcbqX0jAopkkXeY2ZjStngdFMFW+BK7pyrqryJgy6Jt3+oyDxrSA==} cpu: [arm64] os: [linux] libc: [musl] + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': + resolution: {integrity: sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-loongarch64-gnu@4.47.0': resolution: {integrity: sha512-0U+56rJmJvqBCwlPFz/BcxkvdiRdNPamBfuFHrOGQtGajSMJ2OqzlvOgwj5vReRQnSA6XMKw/JL1DaBhceil+g==} cpu: [loong64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-ppc64-gnu@4.46.4': + resolution: {integrity: sha512-YMdz2phOTFF+Z66dQfGf0gmeDSi5DJzY5bpZyeg9CPBkV9QDzJ1yFRlmi/j7WWRf3hYIWrOaJj5jsfwgc8GTHQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-ppc64-gnu@4.47.0': resolution: {integrity: sha512-2VKOsnNyvS05HFPKtmAWtef+nZyKCot/V3Jh/A5sYMhUvtthNjp6CjakYTtc5xZ8J8Fp5FKrUWGxptVtZ2OzEA==} cpu: [ppc64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-riscv64-gnu@4.46.4': + resolution: {integrity: sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-riscv64-gnu@4.47.0': resolution: {integrity: sha512-uY5UP7YZM4DMQiiP9Fl4/7O3UbT2p3uI0qvqLXZSGWBfyYuqi2DYQ48ExylgBN3T8AJork+b+mLGq6VXsxBfuw==} cpu: [riscv64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-riscv64-musl@4.46.4': + resolution: {integrity: sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-riscv64-musl@4.47.0': resolution: {integrity: sha512-qpcN2+/ivq3TcrXtZoHrS9WZplV3Nieh0gvnGb+SFZg7h/YkWsOXINJnjJRWHp9tEur7T8lMnMeQMPS7s9MjUg==} cpu: [riscv64] os: [linux] libc: [musl] + '@rollup/rollup-linux-s390x-gnu@4.46.4': + resolution: {integrity: sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-s390x-gnu@4.47.0': resolution: {integrity: sha512-XfuI+o7a2/KA2tBeP+J1CT3siyIQyjpGEL6fFvtUdoHJK1k5iVI3qeGT2i5y6Bb+xQu08AHKBsUGJ2GsOZzXbQ==} cpu: [s390x] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.46.4': + resolution: {integrity: sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.47.0': resolution: {integrity: sha512-ylkLO6G7oUiN28mork3caDmgXHqRuopAxjYDaOqs4CoU9pkfR0R/pGQb2V1x2Zg3tlFj4b/DvxZroxC3xALX6g==} cpu: [x64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-musl@4.46.4': + resolution: {integrity: sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==} + cpu: [x64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-x64-musl@4.47.0': resolution: {integrity: sha512-1L72a+ice8xKqJ2afsAVW9EfECOhNMAOC1jH65TgghLaHSFwNzyEdeye+1vRFDNy52OGKip/vajj0ONtX7VpAg==} cpu: [x64] os: [linux] libc: [musl] + '@rollup/rollup-win32-arm64-msvc@4.46.4': + resolution: {integrity: sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.47.0': resolution: {integrity: sha512-wluhdd1uNLk/S+ex2Yj62WFw3un2cZo2ZKXy9cOuoti5IhaPXSDSvxT3os+SJ1cjNorE1PwAOfiJU7QUH6n3Zw==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.46.4': + resolution: {integrity: sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.47.0': resolution: {integrity: sha512-0SMTA6AeG7u2rfwdkKSo6aZD/obmA7oyhR+4ePwLzlwxNE8sfSI9zmjZXtchvBAZmtkVQNt/lZ6RxSl9wBj4pw==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.46.4': + resolution: {integrity: sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.47.0': resolution: {integrity: sha512-mw1/7kAGxLcfzoG7DIKFHvKr2ZUQasKOPCgT2ubkNZPgIDZOJPymqThtRWEeAlXBoipehP4BUFpBAZIrPhFg8Q==} cpu: [x64] @@ -3339,6 +3450,11 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + rollup@4.46.4: + resolution: {integrity: sha512-YbxoxvoqNg9zAmw4+vzh1FkGAiZRK+LhnSrbSrSXMdZYsRPDWoshcSd/pldKRO6lWzv/e9TiJAVQyirYIeSIPQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.47.0: resolution: {integrity: sha512-jZVxJwlAptA83ftdZK1kjLZfi0f6o+vVX7ub3HaRzkehLO3l4VB4vYpMHyunhBt1sawv9fiRWPA8Qi/sbg9Kcw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4375,13 +4491,13 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rollup/plugin-alias@5.1.1(rollup@4.47.0)': + '@rollup/plugin-alias@5.1.1(rollup@4.46.4)': optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 - '@rollup/plugin-commonjs@28.0.6(rollup@4.47.0)': + '@rollup/plugin-commonjs@28.0.6(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -4389,38 +4505,46 @@ snapshots: magic-string: 0.30.17 picomatch: 4.0.3 optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 - '@rollup/plugin-inject@5.0.5(rollup@4.47.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 - '@rollup/plugin-json@6.1.0(rollup@4.47.0)': + '@rollup/plugin-json@6.1.0(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.47.0)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 - '@rollup/plugin-replace@5.0.4(rollup@4.47.0)': + '@rollup/plugin-replace@5.0.4(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) magic-string: 0.30.17 optionalDependencies: - rollup: 4.47.0 + rollup: 4.46.4 + + '@rollup/pluginutils@5.2.0(rollup@4.46.4)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.46.4 '@rollup/pluginutils@5.2.0(rollup@4.47.0)': dependencies: @@ -4430,63 +4554,123 @@ snapshots: optionalDependencies: rollup: 4.47.0 + '@rollup/rollup-android-arm-eabi@4.46.4': + optional: true + '@rollup/rollup-android-arm-eabi@4.47.0': optional: true + '@rollup/rollup-android-arm64@4.46.4': + optional: true + '@rollup/rollup-android-arm64@4.47.0': optional: true + '@rollup/rollup-darwin-arm64@4.46.4': + optional: true + '@rollup/rollup-darwin-arm64@4.47.0': optional: true + '@rollup/rollup-darwin-x64@4.46.4': + optional: true + '@rollup/rollup-darwin-x64@4.47.0': optional: true + '@rollup/rollup-freebsd-arm64@4.46.4': + optional: true + '@rollup/rollup-freebsd-arm64@4.47.0': optional: true + '@rollup/rollup-freebsd-x64@4.46.4': + optional: true + '@rollup/rollup-freebsd-x64@4.47.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.47.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.46.4': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.47.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.47.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.46.4': + optional: true + '@rollup/rollup-linux-arm64-musl@4.47.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.47.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.47.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.47.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.46.4': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.47.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.47.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.46.4': + optional: true + '@rollup/rollup-linux-x64-gnu@4.47.0': optional: true + '@rollup/rollup-linux-x64-musl@4.46.4': + optional: true + '@rollup/rollup-linux-x64-musl@4.47.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.46.4': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.47.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.46.4': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.47.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.46.4': + optional: true + '@rollup/rollup-win32-x64-msvc@4.47.0': optional: true @@ -6612,29 +6796,55 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup-plugin-dts@6.2.3(rollup@4.47.0)(typescript@5.6.3): + rollup-plugin-dts@6.2.3(rollup@4.46.4)(typescript@5.6.3): dependencies: magic-string: 0.30.17 - rollup: 4.47.0 + rollup: 4.46.4 typescript: 5.6.3 optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-esbuild@6.2.1(esbuild@0.25.9)(rollup@4.47.0): + rollup-plugin-esbuild@6.2.1(esbuild@0.25.9)(rollup@4.46.4): dependencies: debug: 4.4.1 es-module-lexer: 1.7.0 esbuild: 0.25.9 get-tsconfig: 4.10.1 - rollup: 4.47.0 + rollup: 4.46.4 unplugin-utils: 0.2.5 transitivePeerDependencies: - supports-color - rollup-plugin-polyfill-node@0.13.0(rollup@4.47.0): + rollup-plugin-polyfill-node@0.13.0(rollup@4.46.4): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.47.0) - rollup: 4.47.0 + '@rollup/plugin-inject': 5.0.5(rollup@4.46.4) + rollup: 4.46.4 + + rollup@4.46.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.4 + '@rollup/rollup-android-arm64': 4.46.4 + '@rollup/rollup-darwin-arm64': 4.46.4 + '@rollup/rollup-darwin-x64': 4.46.4 + '@rollup/rollup-freebsd-arm64': 4.46.4 + '@rollup/rollup-freebsd-x64': 4.46.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.4 + '@rollup/rollup-linux-arm-musleabihf': 4.46.4 + '@rollup/rollup-linux-arm64-gnu': 4.46.4 + '@rollup/rollup-linux-arm64-musl': 4.46.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.4 + '@rollup/rollup-linux-ppc64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-musl': 4.46.4 + '@rollup/rollup-linux-s390x-gnu': 4.46.4 + '@rollup/rollup-linux-x64-gnu': 4.46.4 + '@rollup/rollup-linux-x64-musl': 4.46.4 + '@rollup/rollup-win32-arm64-msvc': 4.46.4 + '@rollup/rollup-win32-ia32-msvc': 4.46.4 + '@rollup/rollup-win32-x64-msvc': 4.46.4 + fsevents: 2.3.3 rollup@4.47.0: dependencies: @@ -6661,6 +6871,7 @@ snapshots: '@rollup/rollup-win32-ia32-msvc': 4.47.0 '@rollup/rollup-win32-x64-msvc': 4.47.0 fsevents: 2.3.3 + optional: true rrweb-cssom@0.8.0: {} @@ -7092,7 +7303,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.47.0 + rollup: 4.46.4 optionalDependencies: '@types/node': 22.17.2 fsevents: 2.3.3 @@ -7104,7 +7315,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.47.0 + rollup: 4.46.4 tinyglobby: 0.2.14 optionalDependencies: '@types/node': 22.17.2