chore: Merge branch 'vapor' into edison/testVapor

This commit is contained in:
daiwei 2025-06-20 09:35:45 +08:00
commit a253aa6935
35 changed files with 743 additions and 275 deletions

View File

@ -149,7 +149,7 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
`;
exports[`compile > directives > v-pre > should not affect siblings after it 1`] = `
"import { resolveComponent as _resolveComponent, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, child as _child, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
"import { resolveComponent as _resolveComponent, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, child as _child, setProp as _setProp, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div :id=\\"foo\\"><Comp></Comp>{{ bar }}</div>")
const t1 = _template("<div> </div>")
@ -161,8 +161,8 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
_setInsertionState(n3, 0)
const n1 = _createComponentWithFallback(_component_Comp)
_renderEffect(() => {
_setText(n2, _toDisplayString(_ctx.bar))
_setProp(n3, "id", _ctx.foo)
_setText(n2, _toDisplayString(_ctx.bar))
})
return [n0, n3]
}"
@ -180,7 +180,7 @@ export function render(_ctx) {
`;
exports[`compile > dynamic root nodes and interpolation 1`] = `
"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, delegateEvents as _delegateEvents, template as _template } from 'vue';
"import { child as _child, setProp as _setProp, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, delegateEvents as _delegateEvents, template as _template } from 'vue';
const t0 = _template("<button> </button>", true)
_delegateEvents("click")
@ -190,13 +190,47 @@ export function render(_ctx) {
n0.$evtclick = e => _ctx.handleClick(e)
_renderEffect(() => {
const _count = _ctx.count
_setText(x0, _toDisplayString(_count) + "foo" + _toDisplayString(_count) + "foo" + _toDisplayString(_count))
_setProp(n0, "id", _count)
_setText(x0, _toDisplayString(_count) + "foo" + _toDisplayString(_count) + "foo" + _toDisplayString(_count))
})
return n0
}"
`;
exports[`compile > execution order > basic 1`] = `
"import { child as _child, setProp as _setProp, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div> </div>", true)
export function render(_ctx) {
const n0 = t0()
const x0 = _child(n0)
_renderEffect(() => {
_setProp(n0, "id", _ctx.foo)
_setText(x0, _toDisplayString(_ctx.bar))
})
return n0
}"
`;
exports[`compile > execution order > with v-once 1`] = `
"import { child as _child, next as _next, nthChild as _nthChild, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div><span> </span> <br> </div>", true)
export function render(_ctx) {
const n3 = t0()
const n0 = _child(n3)
const n1 = _next(n0)
const n2 = _nthChild(n3, 3)
const x0 = _child(n0)
_setText(x0, _toDisplayString(_ctx.foo))
_renderEffect(() => {
_setText(n1, " " + _toDisplayString(_ctx.bar))
_setText(n2, " " + _toDisplayString(_ctx.baz))
})
return n3
}"
`;
exports[`compile > expression parsing > interpolation 1`] = `
"
const n0 = t0()

View File

@ -237,4 +237,29 @@ describe('compile', () => {
expect(code).toMatchSnapshot()
})
})
describe('execution order', () => {
test('basic', () => {
const code = compile(`<div :id="foo">{{ bar }}</div>`)
expect(code).matchSnapshot()
expect(code).contains(
`_setProp(n0, "id", _ctx.foo)
_setText(x0, _toDisplayString(_ctx.bar))`,
)
})
test('with v-once', () => {
const code = compile(
`<div>
<span v-once>{{ foo }}</span>
{{ bar }}<br>
{{ baz }}
</div>`,
)
expect(code).matchSnapshot()
expect(code).contains(
`_setText(n1, " " + _toDisplayString(_ctx.bar))
_setText(n2, " " + _toDisplayString(_ctx.baz))`,
)
})
})
})

View File

@ -32,3 +32,24 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
return n0
}"
`;
exports[`compiler: expression > update expression 1`] = `
"import { child as _child, setProp as _setProp, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div> </div>", true)
export function render(_ctx) {
const n1 = t0()
const n0 = _child(n1)
const x1 = _child(n1)
_renderEffect(() => {
const _String = String
const _foo = _ctx.foo
_setProp(n1, "id", _String(_foo.id++))
_setProp(n1, "foo", _foo)
_setProp(n1, "bar", _ctx.bar++)
_setText(n0, _toDisplayString(_String(_foo.id++)) + " " + _toDisplayString(_foo) + " " + _toDisplayString(_ctx.bar))
_setText(x1, _toDisplayString(_String(_foo.id++)) + " " + _toDisplayString(_foo) + " " + _toDisplayString(_ctx.bar))
})
return n1
}"
`;

View File

@ -67,7 +67,6 @@ export function render(_ctx) {
const x2 = _child(n2)
_renderEffect(() => {
const _msg = _ctx.msg
_setText(x0, _toDisplayString(_msg))
_setText(x1, _toDisplayString(_msg))
_setText(x2, _toDisplayString(_msg))

View File

@ -188,6 +188,18 @@ export function render(_ctx) {
}"
`;
exports[`compiler: element transform > component > v-for on component should not mark as single root 1`] = `
"import { createComponent as _createComponent, createFor as _createFor } from 'vue';
export function render(_ctx, $props, $emit, $attrs, $slots) {
const n0 = _createFor(() => (_ctx.items), (_for_item0) => {
const n2 = _createComponent(_ctx.Comp)
return n2
}, (item) => (item), 2)
return n0
}"
`;
exports[`compiler: element transform > component > v-on expression is a function call 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';

View File

@ -21,7 +21,14 @@ export function render(_ctx) {
const _setTemplateRef = _createTemplateRefSetter()
const n0 = t0()
let r0
_renderEffect(() => r0 = _setTemplateRef(n0, bar => _ctx.foo = bar, r0))
_renderEffect(() => {
const _foo = _ctx.foo
r0 = _setTemplateRef(n0, bar => {
_foo.value = bar
;({ baz: _ctx.baz } = bar)
console.log(_foo.value, _ctx.baz)
}, r0)
})
return n0
}"
`;

View File

@ -55,7 +55,6 @@ export function render(_ctx) {
const _foo = _ctx.foo
const _bar = _ctx.bar
const _foo_bar_baz = _foo[_bar(_ctx.baz)]
_setProp(n0, "id", _foo_bar_baz)
_setProp(n1, "id", _foo_bar_baz)
_setProp(n2, "id", _bar() + _foo)
@ -107,7 +106,6 @@ export function render(_ctx) {
_renderEffect(() => {
const _obj = _ctx.obj
const _obj_foo_baz_obj_bar = _obj['foo']['baz'] + _obj.bar
_setProp(n0, "id", _obj_foo_baz_obj_bar)
_setProp(n1, "id", _obj_foo_baz_obj_bar)
})
@ -126,7 +124,6 @@ export function render(_ctx) {
_renderEffect(() => {
const _foo = _ctx.foo
const _foo_bar = _foo + _ctx.bar
_setProp(n0, "id", _foo_bar)
_setProp(n1, "id", _foo_bar)
_setProp(n2, "id", _foo + _foo_bar)
@ -144,7 +141,6 @@ export function render(_ctx) {
const n1 = t0()
_renderEffect(() => {
const _foo_bar = _ctx.foo + _ctx.bar
_setProp(n0, "id", _foo_bar)
_setProp(n1, "id", _foo_bar)
})
@ -177,7 +173,6 @@ export function render(_ctx) {
const n1 = t0()
_renderEffect(() => {
const _foo = _ctx.foo
_setClass(n0, _foo)
_setClass(n1, _foo)
})
@ -498,15 +493,13 @@ export function render(_ctx) {
_setAttr(n0, "form", _ctx.form)
_setAttr(n1, "list", _ctx.list)
_setAttr(n2, "type", _ctx.type)
_setAttr(n3, "width", _width)
_setAttr(n4, "width", _width)
_setAttr(n5, "width", _width)
_setAttr(n6, "width", _width)
_setAttr(n3, "height", _height)
_setAttr(n4, "width", _width)
_setAttr(n4, "height", _height)
_setAttr(n5, "width", _width)
_setAttr(n5, "height", _height)
_setAttr(n6, "width", _width)
_setAttr(n6, "height", _height)
})
return [n0, n1, n2, n3, n4, n5, n6]

View File

@ -123,6 +123,18 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
}"
`;
exports[`v-on > expression with type 1`] = `
"import { delegateEvents as _delegateEvents, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
_delegateEvents("click")
export function render(_ctx, $props, $emit, $attrs, $slots) {
const n0 = t0()
n0.$evtclick = e => _ctx.handleClick(e)
return n0
}"
`;
exports[`v-on > function expression w/ prefixIdentifiers: true 1`] = `
"import { delegateEvents as _delegateEvents, template as _template } from 'vue';
const t0 = _template("<div></div>", true)

View File

@ -365,3 +365,68 @@ export function render(_ctx) {
return n6
}"
`;
exports[`compiler: transform slot > with whitespace: 'preserve' > implicit default slot 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
const t0 = _template(" Header ")
const t1 = _template(" ")
const t2 = _template("<p></p>")
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n4 = _createComponentWithFallback(_component_Comp, null, {
"header": () => {
const n0 = t0()
return n0
},
"default": () => {
const n2 = t1()
const n3 = t2()
return [n2, n3]
}
}, true)
return n4
}"
`;
exports[`compiler: transform slot > with whitespace: 'preserve' > named default slot + implicit whitespace content 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
const t0 = _template(" Header ")
const t1 = _template(" Default ")
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n5 = _createComponentWithFallback(_component_Comp, null, {
"header": () => {
const n0 = t0()
return n0
},
"default": () => {
const n3 = t1()
return n3
}
}, true)
return n5
}"
`;
exports[`compiler: transform slot > with whitespace: 'preserve' > should not generate whitespace only default slot 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
const t0 = _template(" Header ")
const t1 = _template(" Footer ")
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n5 = _createComponentWithFallback(_component_Comp, null, {
"header": () => {
const n0 = t0()
return n0
},
"footer": () => {
const n3 = t1()
return n3
}
}, true)
return n5
}"
`;

View File

@ -1,9 +1,15 @@
import { BindingTypes } from '@vue/compiler-dom'
import { transformChildren, transformText } from '../../src'
import {
transformChildren,
transformElement,
transformText,
transformVBind,
} from '../../src'
import { makeCompile } from './_utils'
const compileWithExpression = makeCompile({
nodeTransforms: [transformChildren, transformText],
nodeTransforms: [transformElement, transformChildren, transformText],
directiveTransforms: { bind: transformVBind },
})
describe('compiler: expression', () => {
@ -31,4 +37,14 @@ describe('compiler: expression', () => {
expect(code).toMatchSnapshot()
expect(code).contains(`$props['bar']`)
})
test('update expression', () => {
const { code } = compileWithExpression(`
<div :id="String(foo.id++)" :foo="foo" :bar="bar++">
{{ String(foo.id++) }} {{ foo }} {{ bar }}
</div>
`)
expect(code).toMatchSnapshot()
expect(code).contains(`_String(_foo.id++)`)
})
})

View File

@ -6,16 +6,22 @@ import {
transformElement,
transformText,
transformVBind,
transformVFor,
transformVOn,
} from '../../src'
import {
type BindingMetadata,
BindingTypes,
NodeTypes,
} from '@vue/compiler-core'
} from '@vue/compiler-dom'
const compileWithElementTransform = makeCompile({
nodeTransforms: [transformElement, transformChildren, transformText],
nodeTransforms: [
transformVFor,
transformElement,
transformChildren,
transformText,
],
directiveTransforms: {
bind: transformVBind,
on: transformVOn,
@ -170,6 +176,17 @@ describe('compiler: element transform', () => {
expect(code).contains('_createComponent(_ctx.Comp)')
})
test('v-for on component should not mark as single root', () => {
const { code } = compileWithElementTransform(
`<Comp v-for="item in items" :key="item"/>`,
{
bindingMetadata: { Comp: BindingTypes.SETUP_CONST },
},
)
expect(code).toMatchSnapshot()
expect(code).contains('_createComponent(_ctx.Comp)')
})
test('static props', () => {
const { code, ir } = compileWithElementTransform(
`<Foo id="foo" class="bar" />`,

View File

@ -1,4 +1,4 @@
import { ErrorCodes, NodeTypes } from '@vue/compiler-core'
import { ErrorCodes, NodeTypes } from '@vue/compiler-dom'
import {
IRNodeTypes,
transformChildren,

View File

@ -94,7 +94,11 @@ describe('compiler: template ref transform', () => {
test('function ref', () => {
const { ir, code } = compileWithTransformRef(
`<div :ref="bar => foo = bar" />`,
`<div :ref="bar => {
foo.value = bar
;({ baz } = bar)
console.log(foo.value, baz)
}" />`,
)
expect(ir.block.dynamic.children[0]).toMatchObject({
id: 0,
@ -114,7 +118,6 @@ describe('compiler: template ref transform', () => {
type: IRNodeTypes.SET_TEMPLATE_REF,
element: 0,
value: {
content: 'bar => foo = bar',
isStatic: false,
},
},
@ -123,7 +126,11 @@ describe('compiler: template ref transform', () => {
])
expect(code).toMatchSnapshot()
expect(code).contains('const _setTemplateRef = _createTemplateRefSetter()')
expect(code).contains('_setTemplateRef(n0, bar => _ctx.foo = bar, r0)')
expect(code).contains(`_setTemplateRef(n0, bar => {
_foo.value = bar
;({ baz: _ctx.baz } = bar)
console.log(_foo.value, _ctx.baz)
}, r0)`)
})
test('ref + v-if', () => {

View File

@ -10,7 +10,7 @@ import {
transformVOnce,
transformVText,
} from '../../src'
import { NodeTypes } from '@vue/compiler-core'
import { NodeTypes } from '@vue/compiler-dom'
const compileWithVIf = makeCompile({
nodeTransforms: [

View File

@ -682,4 +682,17 @@ describe('v-on', () => {
'_delegate(n0, "click", _withModifiers(e => _ctx.test(e), ["stop"]))',
)
})
test('expression with type', () => {
const { code } = compileWithVOn(
`<div @click="(<number>handleClick as any)"></div>`,
{
bindingMetadata: {
handleClick: BindingTypes.SETUP_CONST,
},
},
)
expect(code).matchSnapshot()
expect(code).include('n0.$evtclick = e => _ctx.handleClick(e)')
})
})

View File

@ -1,4 +1,4 @@
import { ErrorCodes, NodeTypes } from '@vue/compiler-core'
import { ErrorCodes, NodeTypes } from '@vue/compiler-dom'
import {
IRNodeTypes,
IRSlotType,
@ -538,4 +538,60 @@ describe('compiler: transform slot', () => {
})
})
})
describe(`with whitespace: 'preserve'`, () => {
test('named default slot + implicit whitespace content', () => {
const source = `
<Comp>
<template #header> Header </template>
<template #default> Default </template>
</Comp>
`
const { code } = compileWithSlots(source, {
whitespace: 'preserve',
})
expect(
`Extraneous children found when component already has explicitly named default slot.`,
).not.toHaveBeenWarned()
expect(code).toMatchSnapshot()
})
test('implicit default slot', () => {
const source = `
<Comp>
<template #header> Header </template>
<p/>
</Comp>
`
const { code } = compileWithSlots(source, {
whitespace: 'preserve',
})
expect(
`Extraneous children found when component already has explicitly named default slot.`,
).not.toHaveBeenWarned()
expect(code).toMatchSnapshot()
})
test('should not generate whitespace only default slot', () => {
const source = `
<Comp>
<template #header> Header </template>
<template #footer> Footer </template>
</Comp>
`
const { code, ir } = compileWithSlots(source, {
whitespace: 'preserve',
})
const slots = (ir.block.dynamic.children[0].operation as any).slots[0]
.slots
// should be: header, footer (no default)
expect(Object.keys(slots).length).toBe(2)
expect(!!slots['default']).toBe(false)
expect(code).toMatchSnapshot()
})
})
})

View File

@ -83,8 +83,8 @@ export function getBaseTransformPreset(): TransformPreset {
transformVFor,
transformSlotOutlet,
transformTemplateRef,
transformText,
transformElement,
transformText,
transformVSlot,
transformComment,
transformChildren,

View File

@ -34,7 +34,7 @@ import {
isMemberExpression,
toValidAssetId,
walkIdentifiers,
} from '@vue/compiler-core'
} from '@vue/compiler-dom'
import { genEventHandler } from './event'
import { genDirectiveModifiers, genDirectivesForElement } from './directive'
import { genBlock } from './block'

View File

@ -10,6 +10,7 @@ import {
NewlineType,
type SimpleExpressionNode,
type SourceLocation,
TS_NODE_TYPES,
advancePositionWithClone,
createSimpleExpression,
isInDestructureAssignment,
@ -63,6 +64,7 @@ export function genExpression(
let hasMemberExpression = false
if (ids.length) {
const [frag, push] = buildCodeFragment()
const isTSNode = ast && TS_NODE_TYPES.includes(ast.type)
ids
.sort((a, b) => a.start! - b.start!)
.forEach((id, i) => {
@ -71,8 +73,10 @@ export function genExpression(
const end = id.end! - 1
const last = ids[i - 1]
const leadingText = content.slice(last ? last.end! - 1 : 0, start)
if (leadingText.length) push([leadingText, NewlineType.Unknown])
if (!(isTSNode && i === 0)) {
const leadingText = content.slice(last ? last.end! - 1 : 0, start)
if (leadingText.length) push([leadingText, NewlineType.Unknown])
}
const source = content.slice(start, end)
const parentStack = parentStackMap.get(id)!
@ -99,7 +103,7 @@ export function genExpression(
),
)
if (i === ids.length - 1 && end < content.length) {
if (i === ids.length - 1 && end < content.length && !isTSNode) {
push([content.slice(end), NewlineType.Unknown])
}
})
@ -244,8 +248,13 @@ export function processExpressions(
expressions: SimpleExpressionNode[],
): DeclarationResult {
// analyze variables
const { seenVariable, variableToExpMap, expToVariableMap, seenIdentifier } =
analyzeExpressions(expressions)
const {
seenVariable,
variableToExpMap,
expToVariableMap,
seenIdentifier,
updatedVariable,
} = analyzeExpressions(expressions)
// process repeated identifiers and member expressions
// e.g., `foo[baz]` will be transformed into `foo_baz`
@ -255,6 +264,7 @@ export function processExpressions(
variableToExpMap,
expToVariableMap,
seenIdentifier,
updatedVariable,
)
// process duplicate expressions after identifier and member expression handling.
@ -263,6 +273,8 @@ export function processExpressions(
context,
expressions,
varDeclarations,
updatedVariable,
expToVariableMap,
)
return genDeclarations([...varDeclarations, ...expDeclarations], context)
@ -273,11 +285,13 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
const variableToExpMap = new Map<string, Set<SimpleExpressionNode>>()
const expToVariableMap = new Map<SimpleExpressionNode, string[]>()
const seenIdentifier = new Set<string>()
const updatedVariable = new Set<string>()
const registerVariable = (
name: string,
exp: SimpleExpressionNode,
isIdentifier: boolean,
parentStack: Node[] = [],
) => {
if (isIdentifier) seenIdentifier.add(name)
seenVariable[name] = (seenVariable[name] || 0) + 1
@ -286,6 +300,13 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
(variableToExpMap.get(name) || new Set()).add(exp),
)
expToVariableMap.set(exp, (expToVariableMap.get(exp) || []).concat(name))
if (
parentStack.some(
p => p.type === 'UpdateExpression' || p.type === 'AssignmentExpression',
)
) {
updatedVariable.add(name)
}
}
for (const exp of expressions) {
@ -299,14 +320,20 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
const memberExp = extractMemberExpression(parent, name => {
registerVariable(name, exp, true)
})
registerVariable(memberExp, exp, false)
registerVariable(memberExp, exp, false, parentStack)
} else if (!parentStack.some(isMemberExpression)) {
registerVariable(currentNode.name, exp, true)
registerVariable(currentNode.name, exp, true, parentStack)
}
})
}
return { seenVariable, seenIdentifier, variableToExpMap, expToVariableMap }
return {
seenVariable,
seenIdentifier,
variableToExpMap,
expToVariableMap,
updatedVariable,
}
}
function processRepeatedVariables(
@ -315,9 +342,11 @@ function processRepeatedVariables(
variableToExpMap: Map<string, Set<SimpleExpressionNode>>,
expToVariableMap: Map<SimpleExpressionNode, string[]>,
seenIdentifier: Set<string>,
updatedVariable: Set<string>,
): DeclarationValue[] {
const declarations: DeclarationValue[] = []
for (const [name, exps] of variableToExpMap) {
if (updatedVariable.has(name)) continue
if (seenVariable[name] > 1 && exps.size > 0) {
const isIdentifier = seenIdentifier.has(name)
const varName = isIdentifier ? name : genVarName(name)
@ -409,12 +438,19 @@ function processRepeatedExpressions(
context: CodegenContext,
expressions: SimpleExpressionNode[],
varDeclarations: DeclarationValue[],
updatedVariable: Set<string>,
expToVariableMap: Map<SimpleExpressionNode, string[]>,
): DeclarationValue[] {
const declarations: DeclarationValue[] = []
const seenExp = expressions.reduce(
(acc, exp) => {
const variables = expToVariableMap.get(exp)
// only handle expressions that are not identifiers
if (exp.ast && exp.ast.type !== 'Identifier') {
if (
exp.ast &&
exp.ast.type !== 'Identifier' &&
!(variables && variables.some(v => updatedVariable.has(v)))
) {
acc[exp.content] = (acc[exp.content] || 0) + 1
}
return acc

View File

@ -99,10 +99,8 @@ export function genEffects(
effects: IREffect[],
context: CodegenContext,
): CodeFragment[] {
const {
helper,
block: { expressions },
} = context
const { helper } = context
const expressions = effects.flatMap(effect => effect.expressions)
const [frag, push, unshift] = buildCodeFragment()
let operationsCount = 0
const { ids, frag: declarationFrags } = processExpressions(

View File

@ -2,7 +2,7 @@ import {
NewlineType,
type SimpleExpressionNode,
isSimpleIdentifier,
} from '@vue/compiler-core'
} from '@vue/compiler-dom'
import type { CodegenContext } from '../generate'
import {
IRDynamicPropsKind,

View File

@ -54,7 +54,6 @@ export interface BlockIRNode extends BaseIRNode {
tempId: number
effect: IREffect[]
operation: OperationNode[]
expressions: SimpleExpressionNode[]
returns: number[]
hasDeferredVShow: boolean
}

View File

@ -141,8 +141,10 @@ export class TransformContext<T extends AllNode = AllNode> {
registerEffect(
expressions: SimpleExpressionNode[],
...operations: OperationNode[]
operation: OperationNode | OperationNode[],
getIndex = (): number => this.block.effect.length,
): void {
const operations = [operation].flat()
expressions = expressions.filter(exp => !isConstantExpression(exp))
if (
this.inVOnce ||
@ -154,26 +156,10 @@ export class TransformContext<T extends AllNode = AllNode> {
return this.registerOperation(...operations)
}
this.block.expressions.push(...expressions)
const existing = this.block.effect.find(e =>
isSameExpression(e.expressions, expressions),
)
if (existing) {
existing.operations.push(...operations)
} else {
this.block.effect.push({
expressions,
operations,
})
}
function isSameExpression(
a: SimpleExpressionNode[],
b: SimpleExpressionNode[],
) {
if (a.length !== b.length) return false
return a.every((exp, i) => exp.content === b[i].content)
}
this.block.effect.splice(getIndex(), 0, {
expressions,
operations,
})
}
registerOperation(...node: OperationNode[]): void {

View File

@ -44,6 +44,8 @@ export const isReservedProp: (key: string) => boolean = /*#__PURE__*/ makeMap(
)
export const transformElement: NodeTransform = (node, context) => {
let effectIndex = context.block.effect.length
const getEffectIndex = () => effectIndex++
return function postTransformElement() {
;({ node } = context)
if (
@ -62,6 +64,7 @@ export const transformElement: NodeTransform = (node, context) => {
context as TransformContext<ElementNode>,
isComponent,
isDynamicComponent,
getEffectIndex,
)
let { parent } = context
@ -78,13 +81,23 @@ export const transformElement: NodeTransform = (node, context) => {
parent.node.children.filter(child => child.type !== NodeTypes.COMMENT)
.length === 1
;(isComponent ? transformComponentElement : transformNativeElement)(
node as any,
propsResult,
singleRoot,
context as TransformContext<ElementNode>,
isDynamicComponent,
)
if (isComponent) {
transformComponentElement(
node as ComponentNode,
propsResult,
singleRoot,
context,
isDynamicComponent,
)
} else {
transformNativeElement(
node as PlainElementNode,
propsResult,
singleRoot,
context,
getEffectIndex,
)
}
}
}
@ -143,7 +156,7 @@ function transformComponentElement(
tag,
props: propsResult[0] ? propsResult[1] : [propsResult[1]],
asset,
root: singleRoot,
root: singleRoot && !context.inVFor,
slots: [...context.slots],
once: context.inVOnce,
dynamic: dynamicComponent,
@ -189,7 +202,8 @@ function transformNativeElement(
node: PlainElementNode,
propsResult: PropsResult,
singleRoot: boolean,
context: TransformContext<ElementNode>,
context: TransformContext,
getEffectIndex: () => number,
) {
const { tag } = node
const { scopeId } = context.options
@ -202,12 +216,16 @@ function transformNativeElement(
const dynamicProps: string[] = []
if (propsResult[0] /* dynamic props */) {
const [, dynamicArgs, expressions] = propsResult
context.registerEffect(expressions, {
type: IRNodeTypes.SET_DYNAMIC_PROPS,
element: context.reference(),
props: dynamicArgs,
root: singleRoot,
})
context.registerEffect(
expressions,
{
type: IRNodeTypes.SET_DYNAMIC_PROPS,
element: context.reference(),
props: dynamicArgs,
root: singleRoot,
},
getEffectIndex,
)
} else {
for (const prop of propsResult[1]) {
const { key, values } = prop
@ -216,13 +234,17 @@ function transformNativeElement(
if (values[0].content) template += `="${values[0].content}"`
} else {
dynamicProps.push(key.content)
context.registerEffect(values, {
type: IRNodeTypes.SET_PROP,
element: context.reference(),
prop,
root: singleRoot,
tag,
})
context.registerEffect(
values,
{
type: IRNodeTypes.SET_PROP,
element: context.reference(),
prop,
root: singleRoot,
tag,
},
getEffectIndex,
)
}
}
}
@ -259,6 +281,7 @@ export function buildProps(
context: TransformContext<ElementNode>,
isComponent: boolean,
isDynamicComponent?: boolean,
getEffectIndex?: () => number,
): PropsResult {
const props = node.props as (VaporDirectiveNode | AttributeNode)[]
if (props.length === 0) return [false, []]
@ -305,12 +328,12 @@ export function buildProps(
} else {
context.registerEffect(
[prop.exp],
{
type: IRNodeTypes.SET_DYNAMIC_EVENTS,
element: context.reference(),
event: prop.exp,
},
getEffectIndex,
)
}
} else {

View File

@ -9,7 +9,7 @@ import {
createSimpleExpression,
isStaticArgOf,
isStaticExp,
} from '@vue/compiler-core'
} from '@vue/compiler-dom'
import type { NodeTransform, TransformContext } from '../transform'
import {
type BlockIRNode,

View File

@ -23,6 +23,13 @@ const seen = new WeakMap<
WeakSet<TemplateChildNode | RootNode>
>()
export function markNonTemplate(
node: TemplateChildNode,
context: TransformContext,
): void {
seen.get(context.root)!.add(node)
}
export const transformText: NodeTransform = (node, context) => {
if (!seen.has(context.root)) seen.set(context.root, new WeakSet())
if (seen.get(context.root)!.has(node)) {
@ -68,7 +75,7 @@ export const transformText: NodeTransform = (node, context) => {
prev.type === NodeTypes.TEXT
) {
// mark leading text node for skipping
seen.get(context.root)!.add(prev)
markNonTemplate(prev, context)
}
}
}
@ -143,7 +150,7 @@ function processTextContainer(
}
function createTextLikeExpression(node: TextLike, context: TransformContext) {
seen.get(context.root)!.add(node)
markNonTemplate(node, context)
if (node.type === NodeTypes.TEXT) {
return createSimpleExpression(node.content, true, node.loc)
} else {

View File

@ -30,7 +30,6 @@ export const newBlock = (node: BlockIRNode['node']): BlockIRNode => ({
effect: [],
operation: [],
returns: [],
expressions: [],
tempId: 0,
hasDeferredVShow: false,
})

View File

@ -8,7 +8,7 @@ import {
createCompilerError,
isTemplateNode,
isVSlot,
} from '@vue/compiler-core'
} from '@vue/compiler-dom'
import type { NodeTransform, TransformContext } from '../transform'
import { newBlock } from './utils'
import {
@ -29,6 +29,7 @@ import {
isTransitionNode,
resolveExpression,
} from '../utils'
import { markNonTemplate } from './transformText'
export const transformVSlot: NodeTransform = (node, context) => {
if (node.type !== NodeTypes.ELEMENT) return
@ -71,14 +72,23 @@ function transformComponentSlot(
) {
const { children } = node
const arg = dir && dir.arg
const nonSlotTemplateChildren = children.filter(
n =>
isNonWhitespaceContent(node) &&
!(n.type === NodeTypes.ELEMENT && n.props.some(isVSlot)),
)
// whitespace: 'preserve'
const emptyTextNodes: TemplateChildNode[] = []
const nonSlotTemplateChildren = children.filter(n => {
if (isNonWhitespaceContent(n)) {
return !(n.type === NodeTypes.ELEMENT && n.props.some(isVSlot))
} else {
emptyTextNodes.push(n)
}
})
if (!nonSlotTemplateChildren.length) {
emptyTextNodes.forEach(n => {
markNonTemplate(n, context)
})
}
let slotKey
if (isTransitionNode(node)) {
if (isTransitionNode(node) && nonSlotTemplateChildren.length) {
const keyProp = findProp(
nonSlotTemplateChildren[0] as ElementNode,
'key',

View File

@ -570,3 +570,7 @@ export { performTransitionEnter, performTransitionLeave } from './renderer'
* @internal
*/
export { ensureVaporSlotFallback } from './helpers/renderSlot'
/**
* @internal
*/
export { createInternalObject } from './internalObject'

View File

@ -3,6 +3,7 @@ import { nextTick, resolveDynamicComponent } from '@vue/runtime-dom'
import {
createComponentWithFallback,
createDynamicComponent,
defineVaporComponent,
renderEffect,
setHtml,
setInsertionState,
@ -79,4 +80,52 @@ describe('api: createDynamicComponent', () => {
mount()
expect(html()).toBe('<div><button>hi</button></div>')
})
test('switch dynamic component children', async () => {
const CompA = defineVaporComponent({
setup() {
return template('<div>A</div>')()
},
})
const CompB = defineVaporComponent({
setup() {
return template('<div>B</div>')()
},
})
const current = shallowRef(CompA)
const { html } = define({
setup() {
const t1 = template('<div></div>')
const n2 = t1() as any
setInsertionState(n2)
createDynamicComponent(() => current.value)
return n2
},
}).render()
expect(html()).toBe('<div><div>A</div><!--dynamic-component--></div>')
current.value = CompB
await nextTick()
expect(html()).toBe('<div><div>B</div><!--dynamic-component--></div>')
})
test('render fallback with insertionState', async () => {
const { html, mount } = define({
setup() {
const html = ref('hi')
const n1 = template('<div></div>', true)() as any
setInsertionState(n1)
const n0 = createComponentWithFallback(
resolveDynamicComponent('button') as any,
) as any
renderEffect(() => setHtml(n0, html.value))
return n1
},
}).create()
mount()
expect(html()).toBe('<div><button>hi</button></div>')
})
})

View File

@ -2,6 +2,7 @@ import {
type Ref,
inject,
nextTick,
onMounted,
onUpdated,
provide,
ref,
@ -13,6 +14,7 @@ import {
createIf,
createTextNode,
renderEffect,
setInsertionState,
template,
} from '../src'
import { makeRender } from './_utils'
@ -266,6 +268,29 @@ describe('component', () => {
expect(spy).toHaveBeenCalledTimes(2)
})
it('properly mount child component when using setInsertionState', async () => {
const spy = vi.fn()
const { component: Comp } = define({
setup() {
onMounted(spy)
return template('<h1>hi</h1>')()
},
})
const { host } = define({
setup() {
const n2 = template('<div></div>', true)()
setInsertionState(n2 as any)
createComponent(Comp)
return n2
},
}).render()
expect(host.innerHTML).toBe('<div><h1>hi</h1></div>')
expect(spy).toHaveBeenCalledTimes(1)
})
it('unmount component', async () => {
const { host, app, instance } = define(() => {
const count = ref(0)

View File

@ -1,4 +1,11 @@
import { type Ref, nextTick, ref } from '@vue/runtime-dom'
import {
type Ref,
createApp,
defineComponent,
h,
nextTick,
ref,
} from '@vue/runtime-dom'
import {
createComponent,
createDynamicComponent,
@ -10,6 +17,7 @@ import {
setProp,
setStyle,
template,
vaporInteropPlugin,
} from '../src'
import { makeRender } from './_utils'
import { stringifyStyle } from '@vue/shared'
@ -399,4 +407,42 @@ describe('attribute fallthrough', () => {
const el = host.children[0]
expect(el.classList.length).toBe(0)
})
it('should not fallthrough emit handlers to vdom child', () => {
const VDomChild = defineComponent({
emits: ['click'],
setup(_, { emit }) {
return () => h('button', { onClick: () => emit('click') }, 'click me')
},
})
const fn = vi.fn()
const VaporChild = defineVaporComponent({
emits: ['click'],
setup() {
return createComponent(
VDomChild as any,
{ onClick: () => fn },
null,
true,
)
},
})
const App = {
setup() {
return () => h(VaporChild as any)
},
}
const root = document.createElement('div')
createApp(App).use(vaporInteropPlugin).mount(root)
expect(root.innerHTML).toBe('<button>click me</button>')
const button = root.querySelector('button')!
button.dispatchEvent(new Event('click'))
// fn should be called once
expect(fn).toHaveBeenCalledTimes(1)
})
})

View File

@ -9,8 +9,8 @@ import {
insertionParent,
resetInsertionState,
} from './insertionState'
import { isHydrating } from './dom/hydration'
import { DYNAMIC_COMPONENT_ANCHOR_LABEL } from '@vue/shared'
import { isHydrating, locateHydrationNode } from './dom/hydration'
export function createDynamicComponent(
getter: () => any,
@ -20,12 +20,17 @@ export function createDynamicComponent(
): VaporFragment {
const _insertionParent = insertionParent
const _insertionAnchor = insertionAnchor
if (!isHydrating) resetInsertionState()
if (isHydrating) {
locateHydrationNode()
} else {
resetInsertionState()
}
const frag =
isHydrating || __DEV__
? new DynamicFragment(DYNAMIC_COMPONENT_ANCHOR_LABEL)
: new DynamicFragment()
renderEffect(() => {
const value = getter()
const appContext =

View File

@ -13,11 +13,13 @@ import {
type TransitionHooks,
type VNode,
type VaporInteropInterface,
createInternalObject,
createVNode,
currentInstance,
ensureHydrationRenderer,
ensureRenderer,
ensureVaporSlotFallback,
isEmitListener,
isVNode,
onScopeDispose,
renderSlot,
@ -238,7 +240,14 @@ function createVDOMComponent(
//
// Without reactivity, Vue will warn in DEV about non-reactive watch sources
instance.props = shallowReactive(wrapper.props)
instance.attrs = wrapper.attrs
const attrs = (instance.attrs = createInternalObject())
for (const key in wrapper.attrs) {
if (!isEmitListener(instance.emitsOptions, key)) {
attrs[key] = wrapper.attrs[key]
}
}
instance.slots =
wrapper.slots === EMPTY_OBJ
? EMPTY_OBJ

View File

@ -40,22 +40,22 @@ importers:
version: 7.27.6
'@rollup/plugin-alias':
specifier: ^5.1.1
version: 5.1.1(rollup@4.43.0)
version: 5.1.1(rollup@4.44.0)
'@rollup/plugin-commonjs':
specifier: ^28.0.3
version: 28.0.6(rollup@4.43.0)
version: 28.0.6(rollup@4.44.0)
'@rollup/plugin-json':
specifier: ^6.1.0
version: 6.1.0(rollup@4.43.0)
version: 6.1.0(rollup@4.44.0)
'@rollup/plugin-node-resolve':
specifier: ^16.0.1
version: 16.0.1(rollup@4.43.0)
version: 16.0.1(rollup@4.44.0)
'@rollup/plugin-replace':
specifier: 5.0.4
version: 5.0.4(rollup@4.43.0)
version: 5.0.4(rollup@4.44.0)
'@swc/core':
specifier: ^1.11.24
version: 1.12.1
version: 1.12.3
'@types/hash-sum':
specifier: ^1.0.2
version: 1.0.2
@ -142,16 +142,16 @@ importers:
version: 6.0.1
rollup:
specifier: ^4.40.2
version: 4.43.0
version: 4.44.0
rollup-plugin-dts:
specifier: ^6.2.1
version: 6.2.1(rollup@4.43.0)(typescript@5.6.3)
version: 6.2.1(rollup@4.44.0)(typescript@5.6.3)
rollup-plugin-esbuild:
specifier: ^6.2.1
version: 6.2.1(esbuild@0.25.5)(rollup@4.43.0)
version: 6.2.1(esbuild@0.25.5)(rollup@4.44.0)
rollup-plugin-polyfill-node:
specifier: ^0.13.0
version: 0.13.0(rollup@4.43.0)
version: 0.13.0(rollup@4.44.0)
semver:
specifier: ^7.7.1
version: 7.7.2
@ -246,7 +246,7 @@ importers:
version: 0.4.1(@types/node@22.15.32)(sass@1.89.2)(vite@6.3.5(@types/node@22.15.32)(sass@1.89.2)(yaml@2.8.0))
vite-plugin-inspect:
specifier: ^0.8.7
version: 0.8.9(rollup@4.43.0)(vite@6.3.5(@types/node@22.15.32)(sass@1.89.2)(yaml@2.8.0))
version: 0.8.9(rollup@4.44.0)(vite@6.3.5(@types/node@22.15.32)(sass@1.89.2)(yaml@2.8.0))
packages-private/sfc-playground:
dependencies:
@ -1188,168 +1188,168 @@ packages:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.43.0':
resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==}
'@rollup/rollup-android-arm-eabi@4.44.0':
resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.43.0':
resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==}
'@rollup/rollup-android-arm64@4.44.0':
resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.43.0':
resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==}
'@rollup/rollup-darwin-arm64@4.44.0':
resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.43.0':
resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==}
'@rollup/rollup-darwin-x64@4.44.0':
resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.43.0':
resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==}
'@rollup/rollup-freebsd-arm64@4.44.0':
resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.43.0':
resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==}
'@rollup/rollup-freebsd-x64@4.44.0':
resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.43.0':
resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==}
'@rollup/rollup-linux-arm-gnueabihf@4.44.0':
resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.43.0':
resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==}
'@rollup/rollup-linux-arm-musleabihf@4.44.0':
resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.43.0':
resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==}
'@rollup/rollup-linux-arm64-gnu@4.44.0':
resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.43.0':
resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==}
'@rollup/rollup-linux-arm64-musl@4.44.0':
resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.43.0':
resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==}
'@rollup/rollup-linux-loongarch64-gnu@4.44.0':
resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-powerpc64le-gnu@4.43.0':
resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==}
'@rollup/rollup-linux-powerpc64le-gnu@4.44.0':
resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.43.0':
resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==}
'@rollup/rollup-linux-riscv64-gnu@4.44.0':
resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.43.0':
resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==}
'@rollup/rollup-linux-riscv64-musl@4.44.0':
resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.43.0':
resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==}
'@rollup/rollup-linux-s390x-gnu@4.44.0':
resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.43.0':
resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==}
'@rollup/rollup-linux-x64-gnu@4.44.0':
resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.43.0':
resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==}
'@rollup/rollup-linux-x64-musl@4.44.0':
resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==}
cpu: [x64]
os: [linux]
'@rollup/rollup-win32-arm64-msvc@4.43.0':
resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==}
'@rollup/rollup-win32-arm64-msvc@4.44.0':
resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.43.0':
resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==}
'@rollup/rollup-win32-ia32-msvc@4.44.0':
resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.43.0':
resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==}
'@rollup/rollup-win32-x64-msvc@4.44.0':
resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==}
cpu: [x64]
os: [win32]
'@swc/core-darwin-arm64@1.12.1':
resolution: {integrity: sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA==}
'@swc/core-darwin-arm64@1.12.3':
resolution: {integrity: sha512-QCV9vQ/s27AMxm8j8MTDL/nDoiEMrANiENRrWnb0Fxvz/O39CajPVShp/W7HlOkzt1GYtUXPdQJpSKylugfrWw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
'@swc/core-darwin-x64@1.12.1':
resolution: {integrity: sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w==}
'@swc/core-darwin-x64@1.12.3':
resolution: {integrity: sha512-LylCMfzGhdvl5tyKaTT9ePetHUX7wSsST7hxWiHzS+cUMj7FnhcfdEr6kcNVT7y1RJn3fCvuv7T98ZB+T2q3HA==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
'@swc/core-linux-arm-gnueabihf@1.12.1':
resolution: {integrity: sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA==}
'@swc/core-linux-arm-gnueabihf@1.12.3':
resolution: {integrity: sha512-DQODb7S+q+pwQY41Azcavwb2rb4rGxP70niScRDxB9X68hHOM9D0w9fxzC+Nr3AHcPSmVJUYUIiq5h38O5hVgQ==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
'@swc/core-linux-arm64-gnu@1.12.1':
resolution: {integrity: sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ==}
'@swc/core-linux-arm64-gnu@1.12.3':
resolution: {integrity: sha512-nTxtJSq78AjeaQBueYImoFBs5j7qXbgOxtirpyt8jE29NQBd0VFzDzRBhkr6I9jq0hNiChgMkqBN4eUkEQjytg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
'@swc/core-linux-arm64-musl@1.12.1':
resolution: {integrity: sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ==}
'@swc/core-linux-arm64-musl@1.12.3':
resolution: {integrity: sha512-lBGvC5UgPSxqLr/y1NZxQhyRQ7nXy3/Ec1Z47YNXtqtpKiG1EcOGPyS0UZgwiYQkXqq8NBFMHnyHmpKnXTvRDA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
'@swc/core-linux-x64-gnu@1.12.1':
resolution: {integrity: sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA==}
'@swc/core-linux-x64-gnu@1.12.3':
resolution: {integrity: sha512-61wZ8hwxNYzBY9MCWB50v90ICzdIhOuPk1O1qXswz9AXw5O6iQStEBHQ1rozPkfQ/rmhepk0pOf/6LCwssJOwg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
'@swc/core-linux-x64-musl@1.12.1':
resolution: {integrity: sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA==}
'@swc/core-linux-x64-musl@1.12.3':
resolution: {integrity: sha512-NNeBiTpCgWt80vumTKVoaj6Fa/ZjUcaNQNM7np3PIgB8EbuXfyztboV7vUxpkmD/lUgsk8GlEFYViHvo6VMefQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
'@swc/core-win32-arm64-msvc@1.12.1':
resolution: {integrity: sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg==}
'@swc/core-win32-arm64-msvc@1.12.3':
resolution: {integrity: sha512-fxraM7exaPb1/W0CoHW45EFNOQUQh0nonBEcNFm2iv095mziBwttyxZyQBoDkQocpkd5NtsZw3xW5FTBPnn+Vw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
'@swc/core-win32-ia32-msvc@1.12.1':
resolution: {integrity: sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw==}
'@swc/core-win32-ia32-msvc@1.12.3':
resolution: {integrity: sha512-FFIhMPXIDjRcewomwbYGPvem7Fj76AsuzbRahnAyp+OzJwrrtxVmra/kyUCfj4kix7vdGByY0WvVfiVCf5b7Mg==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
'@swc/core-win32-x64-msvc@1.12.1':
resolution: {integrity: sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw==}
'@swc/core-win32-x64-msvc@1.12.3':
resolution: {integrity: sha512-Sf4iSg+IYT5AzFSDDmii08DfeKcvtkVxIuo+uS8BJMbiLjFNjgMkkVlBthknGyJcSK15ncg9248XjnM4jU8DZA==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
'@swc/core@1.12.1':
resolution: {integrity: sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA==}
'@swc/core@1.12.3':
resolution: {integrity: sha512-c4NeXW8P3gPqcFwtm+4aH+F2Cj5KJLMiLaKhSj3mpv19glq+jmekomdktAw/VHyjsXlsmouOeNWrk8rVlkCRsg==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '>=0.5.17'
@ -1378,9 +1378,6 @@ packages:
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
'@types/estree@1.0.7':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@ -3329,8 +3326,8 @@ packages:
peerDependencies:
rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
rollup@4.43.0:
resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==}
rollup@4.44.0:
resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@ -4370,13 +4367,13 @@ snapshots:
- bare-buffer
- supports-color
'@rollup/plugin-alias@5.1.1(rollup@4.43.0)':
'@rollup/plugin-alias@5.1.1(rollup@4.44.0)':
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/plugin-commonjs@28.0.6(rollup@4.43.0)':
'@rollup/plugin-commonjs@28.0.6(rollup@4.44.0)':
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
commondir: 1.0.1
estree-walker: 2.0.2
fdir: 6.4.6(picomatch@4.0.2)
@ -4384,152 +4381,152 @@ snapshots:
magic-string: 0.30.17
picomatch: 4.0.2
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/plugin-inject@5.0.5(rollup@4.43.0)':
'@rollup/plugin-inject@5.0.5(rollup@4.44.0)':
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
estree-walker: 2.0.2
magic-string: 0.30.17
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/plugin-json@6.1.0(rollup@4.43.0)':
'@rollup/plugin-json@6.1.0(rollup@4.44.0)':
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/plugin-node-resolve@16.0.1(rollup@4.43.0)':
'@rollup/plugin-node-resolve@16.0.1(rollup@4.44.0)':
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.10
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/plugin-replace@5.0.4(rollup@4.43.0)':
'@rollup/plugin-replace@5.0.4(rollup@4.44.0)':
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
magic-string: 0.30.17
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/pluginutils@5.2.0(rollup@4.43.0)':
'@rollup/pluginutils@5.2.0(rollup@4.44.0)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.43.0
rollup: 4.44.0
'@rollup/rollup-android-arm-eabi@4.43.0':
'@rollup/rollup-android-arm-eabi@4.44.0':
optional: true
'@rollup/rollup-android-arm64@4.43.0':
'@rollup/rollup-android-arm64@4.44.0':
optional: true
'@rollup/rollup-darwin-arm64@4.43.0':
'@rollup/rollup-darwin-arm64@4.44.0':
optional: true
'@rollup/rollup-darwin-x64@4.43.0':
'@rollup/rollup-darwin-x64@4.44.0':
optional: true
'@rollup/rollup-freebsd-arm64@4.43.0':
'@rollup/rollup-freebsd-arm64@4.44.0':
optional: true
'@rollup/rollup-freebsd-x64@4.43.0':
'@rollup/rollup-freebsd-x64@4.44.0':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.43.0':
'@rollup/rollup-linux-arm-gnueabihf@4.44.0':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.43.0':
'@rollup/rollup-linux-arm-musleabihf@4.44.0':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.43.0':
'@rollup/rollup-linux-arm64-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-arm64-musl@4.43.0':
'@rollup/rollup-linux-arm64-musl@4.44.0':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.43.0':
'@rollup/rollup-linux-loongarch64-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.43.0':
'@rollup/rollup-linux-powerpc64le-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.43.0':
'@rollup/rollup-linux-riscv64-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.43.0':
'@rollup/rollup-linux-riscv64-musl@4.44.0':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.43.0':
'@rollup/rollup-linux-s390x-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-x64-gnu@4.43.0':
'@rollup/rollup-linux-x64-gnu@4.44.0':
optional: true
'@rollup/rollup-linux-x64-musl@4.43.0':
'@rollup/rollup-linux-x64-musl@4.44.0':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.43.0':
'@rollup/rollup-win32-arm64-msvc@4.44.0':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.43.0':
'@rollup/rollup-win32-ia32-msvc@4.44.0':
optional: true
'@rollup/rollup-win32-x64-msvc@4.43.0':
'@rollup/rollup-win32-x64-msvc@4.44.0':
optional: true
'@swc/core-darwin-arm64@1.12.1':
'@swc/core-darwin-arm64@1.12.3':
optional: true
'@swc/core-darwin-x64@1.12.1':
'@swc/core-darwin-x64@1.12.3':
optional: true
'@swc/core-linux-arm-gnueabihf@1.12.1':
'@swc/core-linux-arm-gnueabihf@1.12.3':
optional: true
'@swc/core-linux-arm64-gnu@1.12.1':
'@swc/core-linux-arm64-gnu@1.12.3':
optional: true
'@swc/core-linux-arm64-musl@1.12.1':
'@swc/core-linux-arm64-musl@1.12.3':
optional: true
'@swc/core-linux-x64-gnu@1.12.1':
'@swc/core-linux-x64-gnu@1.12.3':
optional: true
'@swc/core-linux-x64-musl@1.12.1':
'@swc/core-linux-x64-musl@1.12.3':
optional: true
'@swc/core-win32-arm64-msvc@1.12.1':
'@swc/core-win32-arm64-msvc@1.12.3':
optional: true
'@swc/core-win32-ia32-msvc@1.12.1':
'@swc/core-win32-ia32-msvc@1.12.3':
optional: true
'@swc/core-win32-x64-msvc@1.12.1':
'@swc/core-win32-x64-msvc@1.12.3':
optional: true
'@swc/core@1.12.1':
'@swc/core@1.12.3':
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.23
optionalDependencies:
'@swc/core-darwin-arm64': 1.12.1
'@swc/core-darwin-x64': 1.12.1
'@swc/core-linux-arm-gnueabihf': 1.12.1
'@swc/core-linux-arm64-gnu': 1.12.1
'@swc/core-linux-arm64-musl': 1.12.1
'@swc/core-linux-x64-gnu': 1.12.1
'@swc/core-linux-x64-musl': 1.12.1
'@swc/core-win32-arm64-msvc': 1.12.1
'@swc/core-win32-ia32-msvc': 1.12.1
'@swc/core-win32-x64-msvc': 1.12.1
'@swc/core-darwin-arm64': 1.12.3
'@swc/core-darwin-x64': 1.12.3
'@swc/core-linux-arm-gnueabihf': 1.12.3
'@swc/core-linux-arm64-gnu': 1.12.3
'@swc/core-linux-arm64-musl': 1.12.3
'@swc/core-linux-x64-gnu': 1.12.3
'@swc/core-linux-x64-musl': 1.12.3
'@swc/core-win32-arm64-msvc': 1.12.3
'@swc/core-win32-ia32-msvc': 1.12.3
'@swc/core-win32-x64-msvc': 1.12.3
'@swc/counter@0.1.3': {}
@ -4554,8 +4551,6 @@ snapshots:
'@types/deep-eql@4.0.2': {}
'@types/estree@1.0.7': {}
'@types/estree@1.0.8': {}
'@types/hash-sum@1.0.2': {}
@ -6623,54 +6618,54 @@ snapshots:
glob: 11.0.3
package-json-from-dist: 1.0.1
rollup-plugin-dts@6.2.1(rollup@4.43.0)(typescript@5.6.3):
rollup-plugin-dts@6.2.1(rollup@4.44.0)(typescript@5.6.3):
dependencies:
magic-string: 0.30.17
rollup: 4.43.0
rollup: 4.44.0
typescript: 5.6.3
optionalDependencies:
'@babel/code-frame': 7.27.1
rollup-plugin-esbuild@6.2.1(esbuild@0.25.5)(rollup@4.43.0):
rollup-plugin-esbuild@6.2.1(esbuild@0.25.5)(rollup@4.44.0):
dependencies:
debug: 4.4.1
es-module-lexer: 1.7.0
esbuild: 0.25.5
get-tsconfig: 4.10.1
rollup: 4.43.0
rollup: 4.44.0
unplugin-utils: 0.2.4
transitivePeerDependencies:
- supports-color
rollup-plugin-polyfill-node@0.13.0(rollup@4.43.0):
rollup-plugin-polyfill-node@0.13.0(rollup@4.44.0):
dependencies:
'@rollup/plugin-inject': 5.0.5(rollup@4.43.0)
rollup: 4.43.0
'@rollup/plugin-inject': 5.0.5(rollup@4.44.0)
rollup: 4.44.0
rollup@4.43.0:
rollup@4.44.0:
dependencies:
'@types/estree': 1.0.7
'@types/estree': 1.0.8
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.43.0
'@rollup/rollup-android-arm64': 4.43.0
'@rollup/rollup-darwin-arm64': 4.43.0
'@rollup/rollup-darwin-x64': 4.43.0
'@rollup/rollup-freebsd-arm64': 4.43.0
'@rollup/rollup-freebsd-x64': 4.43.0
'@rollup/rollup-linux-arm-gnueabihf': 4.43.0
'@rollup/rollup-linux-arm-musleabihf': 4.43.0
'@rollup/rollup-linux-arm64-gnu': 4.43.0
'@rollup/rollup-linux-arm64-musl': 4.43.0
'@rollup/rollup-linux-loongarch64-gnu': 4.43.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.43.0
'@rollup/rollup-linux-riscv64-gnu': 4.43.0
'@rollup/rollup-linux-riscv64-musl': 4.43.0
'@rollup/rollup-linux-s390x-gnu': 4.43.0
'@rollup/rollup-linux-x64-gnu': 4.43.0
'@rollup/rollup-linux-x64-musl': 4.43.0
'@rollup/rollup-win32-arm64-msvc': 4.43.0
'@rollup/rollup-win32-ia32-msvc': 4.43.0
'@rollup/rollup-win32-x64-msvc': 4.43.0
'@rollup/rollup-android-arm-eabi': 4.44.0
'@rollup/rollup-android-arm64': 4.44.0
'@rollup/rollup-darwin-arm64': 4.44.0
'@rollup/rollup-darwin-x64': 4.44.0
'@rollup/rollup-freebsd-arm64': 4.44.0
'@rollup/rollup-freebsd-x64': 4.44.0
'@rollup/rollup-linux-arm-gnueabihf': 4.44.0
'@rollup/rollup-linux-arm-musleabihf': 4.44.0
'@rollup/rollup-linux-arm64-gnu': 4.44.0
'@rollup/rollup-linux-arm64-musl': 4.44.0
'@rollup/rollup-linux-loongarch64-gnu': 4.44.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.44.0
'@rollup/rollup-linux-riscv64-gnu': 4.44.0
'@rollup/rollup-linux-riscv64-musl': 4.44.0
'@rollup/rollup-linux-s390x-gnu': 4.44.0
'@rollup/rollup-linux-x64-gnu': 4.44.0
'@rollup/rollup-linux-x64-musl': 4.44.0
'@rollup/rollup-win32-arm64-msvc': 4.44.0
'@rollup/rollup-win32-ia32-msvc': 4.44.0
'@rollup/rollup-win32-x64-msvc': 4.44.0
fsevents: 2.3.3
rrweb-cssom@0.8.0: {}
@ -7086,10 +7081,10 @@ snapshots:
- tsx
- yaml
vite-plugin-inspect@0.8.9(rollup@4.43.0)(vite@6.3.5(@types/node@22.15.32)(sass@1.89.2)(yaml@2.8.0)):
vite-plugin-inspect@0.8.9(rollup@4.44.0)(vite@6.3.5(@types/node@22.15.32)(sass@1.89.2)(yaml@2.8.0)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.2.0(rollup@4.43.0)
'@rollup/pluginutils': 5.2.0(rollup@4.44.0)
debug: 4.4.1
error-stack-parser-es: 0.1.5
fs-extra: 11.3.0
@ -7106,7 +7101,7 @@ snapshots:
dependencies:
esbuild: 0.21.5
postcss: 8.5.6
rollup: 4.43.0
rollup: 4.44.0
optionalDependencies:
'@types/node': 22.15.32
fsevents: 2.3.3
@ -7118,7 +7113,7 @@ snapshots:
fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
postcss: 8.5.6
rollup: 4.43.0
rollup: 4.44.0
tinyglobby: 0.2.14
optionalDependencies:
'@types/node': 22.15.32