From 5fdc953311f5ec1a68a3071115d7c8586d1bf53a Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 2 Mar 2025 10:41:01 +0800
Subject: [PATCH 01/36] fix(runtime-vapor): prevent passing an empty string to
classList.add
---
.../__tests__/componentAttrs.spec.ts | 39 +++++++++++++++++++
packages/runtime-vapor/src/dom/prop.ts | 4 +-
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/packages/runtime-vapor/__tests__/componentAttrs.spec.ts b/packages/runtime-vapor/__tests__/componentAttrs.spec.ts
index e4076855c..fc6fae5f0 100644
--- a/packages/runtime-vapor/__tests__/componentAttrs.spec.ts
+++ b/packages/runtime-vapor/__tests__/componentAttrs.spec.ts
@@ -322,4 +322,43 @@ describe('attribute fallthrough', () => {
expect(el.getAttribute('aria-x')).toBe(parentVal.value)
expect(el.getAttribute('aria-y')).toBe(parentVal.value)
})
+
+ it('empty string should not be passed to classList.add', async () => {
+ const t0 = template('
', true /* root */)
+ const Child = defineVaporComponent({
+ setup() {
+ const n = t0() as Element
+ renderEffect(() => {
+ setClass(n, {
+ foo: false,
+ })
+ })
+ return n
+ },
+ })
+
+ const Parent = defineVaporComponent({
+ setup() {
+ return createComponent(
+ Child,
+ {
+ class: () => ({
+ bar: false,
+ }),
+ },
+ null,
+ true,
+ )
+ },
+ })
+
+ const { host } = define({
+ setup() {
+ return createComponent(Parent)
+ },
+ }).render()
+
+ const el = host.children[0]
+ expect(el.classList.length).toBe(0)
+ })
})
diff --git a/packages/runtime-vapor/src/dom/prop.ts b/packages/runtime-vapor/src/dom/prop.ts
index f464a2f62..8c42ad766 100644
--- a/packages/runtime-vapor/src/dom/prop.ts
+++ b/packages/runtime-vapor/src/dom/prop.ts
@@ -122,7 +122,9 @@ function setClassIncremental(el: any, value: any): void {
const prev = el[cacheKey]
if ((value = el[cacheKey] = normalizeClass(value)) !== prev) {
const nextList = value.split(/\s+/)
- el.classList.add(...nextList)
+ if (value) {
+ el.classList.add(...nextList)
+ }
if (prev) {
for (const cls of prev.split(/\s+/)) {
if (!nextList.includes(cls)) el.classList.remove(cls)
From 1e71009effffe76cdb9286b61c646bcca138cbb2 Mon Sep 17 00:00:00 2001
From: daiwei
Date: Mon, 10 Mar 2025 16:18:02 +0800
Subject: [PATCH 02/36] fix(runtime-vapor): properly mount component when using
setInsertionState
---
.../runtime-vapor/__tests__/component.spec.ts | 25 +++++++++++++++++++
packages/runtime-vapor/src/component.ts | 2 +-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/packages/runtime-vapor/__tests__/component.spec.ts b/packages/runtime-vapor/__tests__/component.spec.ts
index 5fdff8eaf..22294b1e7 100644
--- a/packages/runtime-vapor/__tests__/component.spec.ts
+++ b/packages/runtime-vapor/__tests__/component.spec.ts
@@ -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('hi
')()
+ },
+ })
+
+ const { host } = define({
+ setup() {
+ const n2 = template('', true)()
+ setInsertionState(n2 as any)
+ createComponent(Comp)
+ return n2
+ },
+ }).render()
+
+ expect(host.innerHTML).toBe('hi
')
+ expect(spy).toHaveBeenCalledTimes(1)
+ })
+
it('unmount component', async () => {
const { host, app, instance } = define(() => {
const count = ref(0)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..57e79f05d 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -270,7 +270,7 @@ export function createComponent(
onScopeDispose(() => unmountComponent(instance), true)
if (!isHydrating && _insertionParent) {
- insert(instance.block, _insertionParent, _insertionAnchor)
+ mountComponent(instance, _insertionParent, _insertionAnchor)
}
return instance
From 704fee955eb12f4e8f21fd6d1eccee46c54d27d9 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 16 Mar 2025 13:17:05 +0800
Subject: [PATCH 03/36] feat(compiler-vapor): support custom generate operation
---
packages/compiler-vapor/src/generate.ts | 10 +++++++++-
packages/compiler-vapor/src/generators/operation.ts | 5 +++++
packages/compiler-vapor/src/generators/text.ts | 9 ++++-----
packages/compiler-vapor/src/generators/utils.ts | 2 ++
packages/compiler-vapor/src/index.ts | 8 +-------
packages/compiler-vapor/src/ir/index.ts | 1 -
6 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/packages/compiler-vapor/src/generate.ts b/packages/compiler-vapor/src/generate.ts
index 193a0f5da..469e55a70 100644
--- a/packages/compiler-vapor/src/generate.ts
+++ b/packages/compiler-vapor/src/generate.ts
@@ -19,7 +19,14 @@ import {
} from './generators/utils'
import { setTemplateRefIdent } from './generators/templateRef'
-export type CodegenOptions = Omit
+type CustomGenOperation = (
+ opers: any,
+ context: CodegenContext,
+) => CodeFragment[] | void
+
+export type CodegenOptions = Omit & {
+ customGenOperation?: CustomGenOperation | null
+}
export class CodegenContext {
options: Required
@@ -87,6 +94,7 @@ export class CodegenContext {
inline: false,
bindingMetadata: {},
expressionPlugins: [],
+ customGenOperation: null,
}
this.options = extend(defaultOptions, options)
this.block = ir.block
diff --git a/packages/compiler-vapor/src/generators/operation.ts b/packages/compiler-vapor/src/generators/operation.ts
index 4247bc6fe..2ca8f6a5c 100644
--- a/packages/compiler-vapor/src/generators/operation.ts
+++ b/packages/compiler-vapor/src/generators/operation.ts
@@ -88,6 +88,11 @@ export function genOperation(
case IRNodeTypes.GET_TEXT_CHILD:
return genGetTextChild(oper, context)
default:
+ if (context.options.customGenOperation) {
+ const result = context.options.customGenOperation(oper, context)
+ if (result) return result
+ }
+
const exhaustiveCheck: never = oper
throw new Error(
`Unhandled operation type in genOperation: ${exhaustiveCheck}`,
diff --git a/packages/compiler-vapor/src/generators/text.ts b/packages/compiler-vapor/src/generators/text.ts
index 89e3167c6..700297b3b 100644
--- a/packages/compiler-vapor/src/generators/text.ts
+++ b/packages/compiler-vapor/src/generators/text.ts
@@ -10,8 +10,8 @@ export function genSetText(
context: CodegenContext,
): CodeFragment[] {
const { helper } = context
- const { element, values, generated, jsx } = oper
- const texts = combineValues(values, context, jsx)
+ const { element, values, generated } = oper
+ const texts = combineValues(values, context)
return [
NEWLINE,
...genCall(helper('setText'), `${generated ? 'x' : 'n'}${element}`, texts),
@@ -21,16 +21,15 @@ export function genSetText(
function combineValues(
values: SimpleExpressionNode[],
context: CodegenContext,
- jsx?: boolean,
): CodeFragment[] {
return values.flatMap((value, i) => {
let exp = genExpression(value, context)
- if (!jsx && getLiteralExpressionValue(value) == null) {
+ if (getLiteralExpressionValue(value) == null) {
// dynamic, wrap with toDisplayString
exp = genCall(context.helper('toDisplayString'), exp)
}
if (i > 0) {
- exp.unshift(jsx ? ', ' : ' + ')
+ exp.unshift(' + ')
}
return exp
})
diff --git a/packages/compiler-vapor/src/generators/utils.ts b/packages/compiler-vapor/src/generators/utils.ts
index 904b3dc87..46d8e5250 100644
--- a/packages/compiler-vapor/src/generators/utils.ts
+++ b/packages/compiler-vapor/src/generators/utils.ts
@@ -10,6 +10,8 @@ import {
import { isArray, isString } from '@vue/shared'
import type { CodegenContext } from '../generate'
+export { genExpression } from './expression'
+
export const NEWLINE: unique symbol = Symbol(__DEV__ ? `newline` : ``)
/** increase offset but don't push actual code */
export const LF: unique symbol = Symbol(__DEV__ ? `line feed` : ``)
diff --git a/packages/compiler-vapor/src/index.ts b/packages/compiler-vapor/src/index.ts
index 6eda10210..7594f8355 100644
--- a/packages/compiler-vapor/src/index.ts
+++ b/packages/compiler-vapor/src/index.ts
@@ -13,13 +13,7 @@ export {
type CodegenOptions,
type VaporCodegenResult,
} from './generate'
-export {
- genCall,
- genMulti,
- buildCodeFragment,
- codeFragmentToString,
- type CodeFragment,
-} from './generators/utils'
+export * from './generators/utils'
export {
wrapTemplate,
compile,
diff --git a/packages/compiler-vapor/src/ir/index.ts b/packages/compiler-vapor/src/ir/index.ts
index da6361132..88c235a0f 100644
--- a/packages/compiler-vapor/src/ir/index.ts
+++ b/packages/compiler-vapor/src/ir/index.ts
@@ -124,7 +124,6 @@ export interface SetTextIRNode extends BaseIRNode {
element: number
values: SimpleExpressionNode[]
generated?: boolean // whether this is a generated empty text node by `processTextLikeContainer`
- jsx?: boolean
}
export type KeyOverride = [find: string, replacement: string]
From efaa5b156779da4f2358bc04ba2c2f599b24fb1a Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Mon, 17 Mar 2025 17:57:51 +0800
Subject: [PATCH 04/36] feat(compiler-vapor): support keys and nonKeys modifier
for component event
---
.../transformElement.spec.ts.snap | 30 ++++++++
.../transforms/transformElement.spec.ts | 72 +++++++++++++++++++
.../src/generators/component.ts | 2 +-
.../compiler-vapor/src/generators/prop.ts | 7 +-
packages/compiler-vapor/src/transform.ts | 3 +-
packages/compiler-vapor/src/transforms/vOn.ts | 6 +-
6 files changed, 114 insertions(+), 6 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap
index 69527c0b1..a37264011 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap
@@ -224,6 +224,36 @@ export function render(_ctx) {
}"
`;
+exports[`compiler: element transform > component event with keys modifier 1`] = `
+"import { resolveComponent as _resolveComponent, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onKeyup: () => _withKeys(_ctx.bar, ["enter"]) }, null, true)
+ return n0
+}"
+`;
+
+exports[`compiler: element transform > component event with multiple modifiers and event options 1`] = `
+"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onFooCaptureOnce: () => _withKeys(_withModifiers(_ctx.bar, ["stop","prevent"]), ["enter"]) }, null, true)
+ return n0
+}"
+`;
+
+exports[`compiler: element transform > component event with nonKeys modifier 1`] = `
+"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onFoo: () => _withModifiers(_ctx.bar, ["stop","prevent"]) }, null, true)
+ return n0
+}"
+`;
+
exports[`compiler: element transform > component event with once modifier 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
diff --git a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
index adaad182c..ca64729e0 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
@@ -878,6 +878,78 @@ describe('compiler: element transform', () => {
})
})
+ test('component event with keys modifier', () => {
+ const { code, ir } = compileWithElementTransform(
+ ``,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'keyup' },
+ handler: true,
+ handlerModifiers: {
+ keys: ['enter'],
+ nonKeys: [],
+ options: [],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
+ test('component event with nonKeys modifier', () => {
+ const { code, ir } = compileWithElementTransform(
+ ``,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'foo' },
+ handler: true,
+ handlerModifiers: {
+ keys: [],
+ nonKeys: ['stop', 'prevent'],
+ options: [],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
+ test('component event with multiple modifiers and event options', () => {
+ const { code, ir } = compileWithElementTransform(
+ ``,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'foo' },
+ handler: true,
+ handlerModifiers: {
+ keys: ['enter'],
+ nonKeys: ['stop', 'prevent'],
+ options: ['capture', 'once'],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
test('component with dynamic event arguments', () => {
const { code, ir } = compileWithElementTransform(
``,
diff --git a/packages/compiler-vapor/src/generators/component.ts b/packages/compiler-vapor/src/generators/component.ts
index 7c232db75..2f7e6cd50 100644
--- a/packages/compiler-vapor/src/generators/component.ts
+++ b/packages/compiler-vapor/src/generators/component.ts
@@ -211,7 +211,7 @@ function genProp(prop: IRProp, context: CodegenContext, isStatic?: boolean) {
? genEventHandler(
context,
prop.values[0],
- undefined,
+ prop.handlerModifiers,
true /* wrap handlers passed to components */,
)
: isStatic
diff --git a/packages/compiler-vapor/src/generators/prop.ts b/packages/compiler-vapor/src/generators/prop.ts
index 62fca087e..a873f1fed 100644
--- a/packages/compiler-vapor/src/generators/prop.ts
+++ b/packages/compiler-vapor/src/generators/prop.ts
@@ -114,9 +114,10 @@ export function genPropKey(
): CodeFragment[] {
const { helper } = context
- const handlerModifierPostfix = handlerModifiers
- ? handlerModifiers.map(capitalize).join('')
- : ''
+ const handlerModifierPostfix =
+ handlerModifiers && handlerModifiers.options
+ ? handlerModifiers.options.map(capitalize).join('')
+ : ''
// static arg was transformed by v-bind transformer
if (node.isStatic) {
// only quote keys if necessary
diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts
index 76563899d..b3963124e 100644
--- a/packages/compiler-vapor/src/transform.ts
+++ b/packages/compiler-vapor/src/transform.ts
@@ -23,6 +23,7 @@ import {
type IRSlots,
type OperationNode,
type RootIRNode,
+ type SetEventIRNode,
type VaporDirectiveNode,
} from './ir'
import { isConstantExpression, isStaticExpression } from './utils'
@@ -45,7 +46,7 @@ export interface DirectiveTransformResult {
modifier?: '.' | '^'
runtimeCamelize?: boolean
handler?: boolean
- handlerModifiers?: string[]
+ handlerModifiers?: SetEventIRNode['modifiers']
model?: boolean
modelModifiers?: string[]
}
diff --git a/packages/compiler-vapor/src/transforms/vOn.ts b/packages/compiler-vapor/src/transforms/vOn.ts
index fcbfc265d..fe63ece0a 100644
--- a/packages/compiler-vapor/src/transforms/vOn.ts
+++ b/packages/compiler-vapor/src/transforms/vOn.ts
@@ -65,7 +65,11 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
key: arg,
value: handler,
handler: true,
- handlerModifiers: eventOptionModifiers,
+ handlerModifiers: {
+ keys: keyModifiers,
+ nonKeys: nonKeyModifiers,
+ options: eventOptionModifiers,
+ },
}
}
From c50fb0e951f6d3e0c979f6722c3f7834c7a4ef31 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 18 Mar 2025 00:04:29 +0800
Subject: [PATCH 05/36] fix(compiler-vapor): move setInsertionState to the end
to prevent nthChild mismatch
---
.../__tests__/__snapshots__/compile.spec.ts.snap | 8 ++++----
.../__snapshots__/transformChildren.spec.ts.snap | 4 ++--
.../__tests__/transforms/__snapshots__/vFor.spec.ts.snap | 4 ++--
.../__tests__/transforms/__snapshots__/vOnce.spec.ts.snap | 4 ++--
.../__tests__/transforms/transformChildren.spec.ts | 4 ++--
packages/compiler-vapor/src/generators/operation.ts | 2 +-
6 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap b/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
index e56676d87..7614fc3c4 100644
--- a/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
@@ -26,7 +26,7 @@ export function render(_ctx) {
`;
exports[`compile > custom directive > component 1`] = `
-"import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, withVaporDirectives as _withVaporDirectives, createIf as _createIf, template as _template } from 'vue';
+"import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, createComponentWithFallback as _createComponentWithFallback, withVaporDirectives as _withVaporDirectives, setInsertionState as _setInsertionState, createIf as _createIf, template as _template } from 'vue';
const t0 = _template("")
export function render(_ctx) {
@@ -38,9 +38,9 @@ export function render(_ctx) {
"default": () => {
const n0 = _createIf(() => (true), () => {
const n3 = t0()
- _setInsertionState(n3)
const n2 = _createComponentWithFallback(_component_Bar)
_withVaporDirectives(n2, [[_directive_hello, void 0, void 0, { world: true }]])
+ _setInsertionState(n3)
return n3
})
return n0
@@ -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, createComponentWithFallback as _createComponentWithFallback, setInsertionState as _setInsertionState, child as _child, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("{{ bar }}
")
const t1 = _template("
")
@@ -157,8 +157,8 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
const _component_Comp = _resolveComponent("Comp")
const n0 = t0()
const n3 = t1()
- _setInsertionState(n3, 0)
const n1 = _createComponentWithFallback(_component_Comp)
+ _setInsertionState(n3, 0)
const n2 = _child(n3)
_renderEffect(() => {
_setText(n2, _toDisplayString(_ctx.bar))
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
index 5ae8a94f5..884fb633a 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
@@ -1,18 +1,18 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`compiler: children transform > anchor insertion in middle 1`] = `
-"import { child as _child, next as _next, setInsertionState as _setInsertionState, createIf as _createIf, template as _template } from 'vue';
+"import { child as _child, next as _next, createIf as _createIf, setInsertionState as _setInsertionState, template as _template } from 'vue';
const t0 = _template("")
const t1 = _template("", true)
export function render(_ctx) {
const n4 = t1()
const n3 = _next(_child(n4))
- _setInsertionState(n4, n3)
const n0 = _createIf(() => (1), () => {
const n2 = t0()
return n2
}, null, true)
+ _setInsertionState(n4, n3)
return n4
}"
`;
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
index cb14f56af..dbb0ddb3f 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
@@ -65,20 +65,20 @@ export function render(_ctx) {
`;
exports[`compiler: v-for > nested v-for 1`] = `
-"import { setInsertionState as _setInsertionState, child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
+"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, setInsertionState as _setInsertionState, template as _template } from 'vue';
const t0 = _template(" ")
const t1 = _template("", true)
export function render(_ctx) {
const n0 = _createFor(() => (_ctx.list), (_for_item0) => {
const n5 = t1()
- _setInsertionState(n5)
const n2 = _createFor(() => (_for_item0.value), (_for_item1) => {
const n4 = t0()
const x4 = _child(n4)
_renderEffect(() => _setText(x4, _toDisplayString(_for_item1.value+_for_item0.value)))
return n4
}, null, 1)
+ _setInsertionState(n5)
return n5
})
return n0
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
index ab3ade45b..bb35b44e3 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
@@ -36,14 +36,14 @@ export function render(_ctx) {
`;
exports[`compiler: v-once > on component 1`] = `
-"import { resolveComponent as _resolveComponent, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
+"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, setInsertionState as _setInsertionState, template as _template } from 'vue';
const t0 = _template("", true)
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n1 = t0()
- _setInsertionState(n1)
const n0 = _createComponentWithFallback(_component_Comp, { id: () => (_ctx.foo) }, null, null, true)
+ _setInsertionState(n1)
return n1
}"
`;
diff --git a/packages/compiler-vapor/__tests__/transforms/transformChildren.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformChildren.spec.ts
index e65631235..2d8ae8c96 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformChildren.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformChildren.spec.ts
@@ -69,8 +69,8 @@ describe('compiler: children transform', () => {
`,
)
// ensure the insertion anchor is generated before the insertion statement
- expect(code).toMatch(`const n3 = _next(_child(n4))
- _setInsertionState(n4, n3)`)
+ expect(code).toMatch(`const n3 = _next(_child(n4))`)
+ expect(code).toMatch(`_setInsertionState(n4, n3)`)
expect(code).toMatchSnapshot()
})
})
diff --git a/packages/compiler-vapor/src/generators/operation.ts b/packages/compiler-vapor/src/generators/operation.ts
index 4247bc6fe..8b0bc90c3 100644
--- a/packages/compiler-vapor/src/generators/operation.ts
+++ b/packages/compiler-vapor/src/generators/operation.ts
@@ -43,10 +43,10 @@ export function genOperationWithInsertionState(
context: CodegenContext,
): CodeFragment[] {
const [frag, push] = buildCodeFragment()
+ push(...genOperation(oper, context))
if (isBlockOperation(oper) && oper.parent) {
push(...genInsertionstate(oper, context))
}
- push(...genOperation(oper, context))
return frag
}
From 015e1eed26a7b815ac402ab1ca10a52d771b6743 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 18 Mar 2025 12:32:24 +0800
Subject: [PATCH 06/36] fix(compiler-vapor): move `next`, `child` and
`nthChild` before the setInsertionState
---
.../__snapshots__/compile.spec.ts.snap | 34 ++++++++++++++++---
.../compiler-vapor/__tests__/compile.spec.ts | 17 ++++++++++
.../transformChildren.spec.ts.snap | 4 +--
.../__snapshots__/vFor.spec.ts.snap | 4 +--
.../__snapshots__/vOnce.spec.ts.snap | 4 +--
.../compiler-vapor/src/generators/block.ts | 2 +-
.../src/generators/operation.ts | 2 +-
.../compiler-vapor/src/generators/template.ts | 13 +++----
8 files changed, 61 insertions(+), 19 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap b/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
index 7614fc3c4..d4a8b6827 100644
--- a/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap
@@ -26,7 +26,7 @@ export function render(_ctx) {
`;
exports[`compile > custom directive > component 1`] = `
-"import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, createComponentWithFallback as _createComponentWithFallback, withVaporDirectives as _withVaporDirectives, setInsertionState as _setInsertionState, createIf as _createIf, template as _template } from 'vue';
+"import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, withVaporDirectives as _withVaporDirectives, createIf as _createIf, template as _template } from 'vue';
const t0 = _template("")
export function render(_ctx) {
@@ -38,9 +38,9 @@ export function render(_ctx) {
"default": () => {
const n0 = _createIf(() => (true), () => {
const n3 = t0()
+ _setInsertionState(n3)
const n2 = _createComponentWithFallback(_component_Bar)
_withVaporDirectives(n2, [[_directive_hello, void 0, void 0, { world: true }]])
- _setInsertionState(n3)
return n3
})
return n0
@@ -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, createComponentWithFallback as _createComponentWithFallback, setInsertionState as _setInsertionState, 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, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("{{ bar }}
")
const t1 = _template("
")
@@ -157,9 +157,9 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
const _component_Comp = _resolveComponent("Comp")
const n0 = t0()
const n3 = t1()
- const n1 = _createComponentWithFallback(_component_Comp)
- _setInsertionState(n3, 0)
const n2 = _child(n3)
+ _setInsertionState(n3, 0)
+ const n1 = _createComponentWithFallback(_component_Comp)
_renderEffect(() => {
_setText(n2, _toDisplayString(_ctx.bar))
_setProp(n3, "id", _ctx.foo)
@@ -230,6 +230,30 @@ export function render(_ctx) {
}"
`;
+exports[`compile > setInsertionState > next, child and nthChild should be above the setInsertionState 1`] = `
+"import { resolveComponent as _resolveComponent, child as _child, next as _next, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, nthChild as _nthChild, createIf as _createIf, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("")
+const t1 = _template("", true)
+
+export function render(_ctx) {
+ const _component_Comp = _resolveComponent("Comp")
+ const n6 = t1()
+ const n5 = _next(_child(n6))
+ const n7 = _nthChild(n6, 3)
+ const p0 = _next(n7)
+ const n4 = _child(p0)
+ _setInsertionState(n6, n5)
+ const n0 = _createComponentWithFallback(_component_Comp)
+ _setInsertionState(n6, n7)
+ const n1 = _createIf(() => (true), () => {
+ const n3 = t0()
+ return n3
+ })
+ _renderEffect(() => _setProp(n4, "disabled", _ctx.foo))
+ return n6
+}"
+`;
+
exports[`compile > static + dynamic root 1`] = `
"import { toDisplayString as _toDisplayString, setText as _setText, template as _template } from 'vue';
const t0 = _template(" ")
diff --git a/packages/compiler-vapor/__tests__/compile.spec.ts b/packages/compiler-vapor/__tests__/compile.spec.ts
index 33f399caa..3a2ce41f0 100644
--- a/packages/compiler-vapor/__tests__/compile.spec.ts
+++ b/packages/compiler-vapor/__tests__/compile.spec.ts
@@ -220,4 +220,21 @@ describe('compile', () => {
expect(code).matchSnapshot()
})
})
+
+ describe('setInsertionState', () => {
+ test('next, child and nthChild should be above the setInsertionState', () => {
+ const code = compile(`
+
+ `)
+ expect(code).toMatchSnapshot()
+ })
+ })
})
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
index 884fb633a..5ae8a94f5 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformChildren.spec.ts.snap
@@ -1,18 +1,18 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`compiler: children transform > anchor insertion in middle 1`] = `
-"import { child as _child, next as _next, createIf as _createIf, setInsertionState as _setInsertionState, template as _template } from 'vue';
+"import { child as _child, next as _next, setInsertionState as _setInsertionState, createIf as _createIf, template as _template } from 'vue';
const t0 = _template("")
const t1 = _template("", true)
export function render(_ctx) {
const n4 = t1()
const n3 = _next(_child(n4))
+ _setInsertionState(n4, n3)
const n0 = _createIf(() => (1), () => {
const n2 = t0()
return n2
}, null, true)
- _setInsertionState(n4, n3)
return n4
}"
`;
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
index dbb0ddb3f..cb14f56af 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
@@ -65,20 +65,20 @@ export function render(_ctx) {
`;
exports[`compiler: v-for > nested v-for 1`] = `
-"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, setInsertionState as _setInsertionState, template as _template } from 'vue';
+"import { setInsertionState as _setInsertionState, child as _child, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, createFor as _createFor, template as _template } from 'vue';
const t0 = _template(" ")
const t1 = _template("", true)
export function render(_ctx) {
const n0 = _createFor(() => (_ctx.list), (_for_item0) => {
const n5 = t1()
+ _setInsertionState(n5)
const n2 = _createFor(() => (_for_item0.value), (_for_item1) => {
const n4 = t0()
const x4 = _child(n4)
_renderEffect(() => _setText(x4, _toDisplayString(_for_item1.value+_for_item0.value)))
return n4
}, null, 1)
- _setInsertionState(n5)
return n5
})
return n0
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
index bb35b44e3..ab3ade45b 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
@@ -36,14 +36,14 @@ export function render(_ctx) {
`;
exports[`compiler: v-once > on component 1`] = `
-"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, setInsertionState as _setInsertionState, template as _template } from 'vue';
+"import { resolveComponent as _resolveComponent, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, template as _template } from 'vue';
const t0 = _template("", true)
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n1 = t0()
- const n0 = _createComponentWithFallback(_component_Comp, { id: () => (_ctx.foo) }, null, null, true)
_setInsertionState(n1)
+ const n0 = _createComponentWithFallback(_component_Comp, { id: () => (_ctx.foo) }, null, null, true)
return n1
}"
`;
diff --git a/packages/compiler-vapor/src/generators/block.ts b/packages/compiler-vapor/src/generators/block.ts
index b161b8f45..48e4b5cb8 100644
--- a/packages/compiler-vapor/src/generators/block.ts
+++ b/packages/compiler-vapor/src/generators/block.ts
@@ -52,7 +52,7 @@ export function genBlockContent(
push(...genSelf(child, context))
}
for (const child of dynamic.children) {
- push(...genChildren(child, context, `n${child.id!}`))
+ push(...genChildren(child, context, push, `n${child.id!}`))
}
push(...genOperations(operation, context))
diff --git a/packages/compiler-vapor/src/generators/operation.ts b/packages/compiler-vapor/src/generators/operation.ts
index 8b0bc90c3..4247bc6fe 100644
--- a/packages/compiler-vapor/src/generators/operation.ts
+++ b/packages/compiler-vapor/src/generators/operation.ts
@@ -43,10 +43,10 @@ export function genOperationWithInsertionState(
context: CodegenContext,
): CodeFragment[] {
const [frag, push] = buildCodeFragment()
- push(...genOperation(oper, context))
if (isBlockOperation(oper) && oper.parent) {
push(...genInsertionstate(oper, context))
}
+ push(...genOperation(oper, context))
return frag
}
diff --git a/packages/compiler-vapor/src/generators/template.ts b/packages/compiler-vapor/src/generators/template.ts
index 356c1ccbe..5a066b09e 100644
--- a/packages/compiler-vapor/src/generators/template.ts
+++ b/packages/compiler-vapor/src/generators/template.ts
@@ -41,6 +41,7 @@ export function genSelf(
export function genChildren(
dynamic: IRDynamicInfo,
context: CodegenContext,
+ pushBlock: (...items: CodeFragment[]) => number,
from: string = `n${dynamic.id}`,
): CodeFragment[] {
const { helper } = context
@@ -72,17 +73,17 @@ export function genChildren(
// p for "placeholder" variables that are meant for possible reuse by
// other access paths
const variable = id === undefined ? `p${context.block.tempId++}` : `n${id}`
- push(NEWLINE, `const ${variable} = `)
+ pushBlock(NEWLINE, `const ${variable} = `)
if (prev) {
if (elementIndex - prev[1] === 1) {
- push(...genCall(helper('next'), prev[0]))
+ pushBlock(...genCall(helper('next'), prev[0]))
} else {
- push(...genCall(helper('nthChild'), from, String(elementIndex)))
+ pushBlock(...genCall(helper('nthChild'), from, String(elementIndex)))
}
} else {
if (elementIndex === 0) {
- push(...genCall(helper('child'), from))
+ pushBlock(...genCall(helper('child'), from))
} else {
// check if there's a node that we can reuse from
let init = genCall(helper('child'), from)
@@ -91,7 +92,7 @@ export function genChildren(
} else if (elementIndex > 1) {
init = genCall(helper('nthChild'), from, String(elementIndex))
}
- push(...init)
+ pushBlock(...init)
}
}
@@ -109,7 +110,7 @@ export function genChildren(
if (childrenToGen.length) {
for (const [child, from] of childrenToGen) {
- push(...genChildren(child, context, from))
+ push(...genChildren(child, context, pushBlock, from))
}
}
From 13f3ab1cf45eb02e7cbbe8cce39735a7225f0a1a Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 18 Mar 2025 12:44:00 +0800
Subject: [PATCH 07/36] feat: remove __BROWSER__ flag
---
packages/compiler-core/src/babelUtils.ts | 8 --------
1 file changed, 8 deletions(-)
diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts
index 6ede6bd03..342050dc4 100644
--- a/packages/compiler-core/src/babelUtils.ts
+++ b/packages/compiler-core/src/babelUtils.ts
@@ -30,10 +30,6 @@ export function walkIdentifiers(
parentStack: Node[] = [],
knownIds: Record = Object.create(null),
): void {
- if (__BROWSER__) {
- return
- }
-
const rootExp =
root.type === 'Program'
? root.body[0].type === 'ExpressionStatement' && root.body[0].expression
@@ -110,10 +106,6 @@ export function isReferencedIdentifier(
parent: Node | null,
parentStack: Node[],
): boolean {
- if (__BROWSER__) {
- return false
- }
-
if (!parent) {
return true
}
From 8dda0b1b5aa8fa64081e7e8959f6f444b627f081 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 19 Mar 2025 19:55:11 +0800
Subject: [PATCH 08/36] feat(runtime-core): expose pauseTracking and
enableTracking
---
packages/runtime-core/src/index.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts
index c7150e38e..b336170fe 100644
--- a/packages/runtime-core/src/index.ts
+++ b/packages/runtime-core/src/index.ts
@@ -30,6 +30,8 @@ export {
stop,
getCurrentWatcher,
onWatcherCleanup,
+ pauseTracking,
+ enableTracking,
ReactiveEffect,
// effect scope
effectScope,
From 361c7d47188acd330f0ab25b9b1ddf0f0a2fe0ff Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 19 Mar 2025 21:14:05 +0800
Subject: [PATCH 09/36] feat: export resetTracking
---
packages/runtime-core/src/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts
index b336170fe..7daec1030 100644
--- a/packages/runtime-core/src/index.ts
+++ b/packages/runtime-core/src/index.ts
@@ -31,7 +31,7 @@ export {
getCurrentWatcher,
onWatcherCleanup,
pauseTracking,
- enableTracking,
+ resetTracking,
ReactiveEffect,
// effect scope
effectScope,
From 8b7a035d1472fa5aa0bd27acdcba855dc2325c26 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 19 Mar 2025 17:59:02 +0800
Subject: [PATCH 10/36] fix: use modelValueModifiers intead of modelModifiers
---
.../__tests__/transforms/vModel.spec.ts | 6 +++---
.../compiler-core/src/transforms/vModel.ts | 2 +-
.../__snapshots__/defineModel.spec.ts.snap | 20 +++++++++----------
.../compileScript/defineModel.spec.ts | 2 +-
.../compiler-sfc/src/script/defineModel.ts | 4 +---
.../__tests__/componentEmits.spec.ts | 10 +++++-----
packages/runtime-core/src/helpers/useModel.ts | 10 +++++-----
7 files changed, 26 insertions(+), 28 deletions(-)
diff --git a/packages/compiler-core/__tests__/transforms/vModel.spec.ts b/packages/compiler-core/__tests__/transforms/vModel.spec.ts
index 82dd4909f..d092e7201 100644
--- a/packages/compiler-core/__tests__/transforms/vModel.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/vModel.spec.ts
@@ -449,7 +449,7 @@ describe('compiler: transform v-model', () => {
expect(codegen.dynamicProps).toBe(`["modelValue", "onUpdate:modelValue"]`)
})
- test('should generate modelModifiers for component v-model', () => {
+ test('should generate modelValueModifiers for component v-model', () => {
const root = parseWithVModel('', {
prefixIdentifiers: true,
})
@@ -461,7 +461,7 @@ describe('compiler: transform v-model', () => {
{ key: { content: `modelValue` } },
{ key: { content: `onUpdate:modelValue` } },
{
- key: { content: 'modelModifiers' },
+ key: { content: 'modelValueModifiers' },
value: {
content: `{ trim: true, "bar-baz": true }`,
isStatic: false,
@@ -469,7 +469,7 @@ describe('compiler: transform v-model', () => {
},
],
})
- // should NOT include modelModifiers in dynamicPropNames because it's never
+ // should NOT include modelValueModifiers in dynamicPropNames because it's never
// gonna change
expect(vnodeCall.dynamicProps).toBe(`["modelValue", "onUpdate:modelValue"]`)
})
diff --git a/packages/compiler-core/src/transforms/vModel.ts b/packages/compiler-core/src/transforms/vModel.ts
index 598c1ea43..c75ef1c3e 100644
--- a/packages/compiler-core/src/transforms/vModel.ts
+++ b/packages/compiler-core/src/transforms/vModel.ts
@@ -138,7 +138,7 @@ export const transformModel: DirectiveTransform = (dir, node, context) => {
? isStaticExp(arg)
? `${arg.content}Modifiers`
: createCompoundExpression([arg, ' + "Modifiers"'])
- : `modelModifiers`
+ : `modelValueModifiers`
props.push(
createObjectProperty(
modifiersKey,
diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap
index 12462dcf4..cdf710768 100644
--- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap
+++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap
@@ -6,7 +6,7 @@ exports[`defineModel() > basic usage 1`] = `
export default {
props: {
"modelValue": { required: true },
- "modelModifiers": {},
+ "modelValueModifiers": {},
"count": {},
"countModifiers": {},
"toString": { type: Function },
@@ -34,7 +34,7 @@ export default /*@__PURE__*/_defineComponent({
"modelValue": {
required: true
},
- "modelModifiers": {},
+ "modelValueModifiers": {},
},
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
@@ -60,7 +60,7 @@ export default /*@__PURE__*/_defineComponent({
default: 0,
required: true,
},
- "modelModifiers": {},
+ "modelValueModifiers": {},
},
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
@@ -86,7 +86,7 @@ export default /*@__PURE__*/_defineComponent({
}, {
"modelValue": {
},
- "modelModifiers": {},
+ "modelValueModifiers": {},
}),
emits: ["update:modelValue"],
setup(__props: any, { expose: __expose }) {
@@ -109,7 +109,7 @@ exports[`defineModel() > w/ Boolean And Function types, production mode 1`] = `
export default /*@__PURE__*/_defineComponent({
props: {
"modelValue": { type: [Boolean, String] },
- "modelModifiers": {},
+ "modelValueModifiers": {},
},
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
@@ -150,7 +150,7 @@ exports[`defineModel() > w/ defineProps and defineEmits 1`] = `
export default {
props: /*@__PURE__*/_mergeModels({ foo: String }, {
"modelValue": { default: 0 },
- "modelModifiers": {},
+ "modelValueModifiers": {},
}),
emits: /*@__PURE__*/_mergeModels(['change'], ["update:modelValue"]),
setup(__props, { expose: __expose }) {
@@ -172,7 +172,7 @@ exports[`defineModel() > w/ types, basic usage 1`] = `
export default /*@__PURE__*/_defineComponent({
props: {
"modelValue": { type: [Boolean, String] },
- "modelModifiers": {},
+ "modelValueModifiers": {},
"count": { type: Number },
"countModifiers": {},
"disabled": { type: Number, ...{ required: false } },
@@ -201,7 +201,7 @@ exports[`defineModel() > w/ types, production mode 1`] = `
export default /*@__PURE__*/_defineComponent({
props: {
"modelValue": { type: Boolean },
- "modelModifiers": {},
+ "modelValueModifiers": {},
"fn": {},
"fnModifiers": {},
"fnWithDefault": { type: Function, ...{ default: () => null } },
@@ -233,7 +233,7 @@ exports[`defineModel() > w/ types, production mode, boolean + multiple types 1`]
export default /*@__PURE__*/_defineComponent({
props: {
"modelValue": { type: [Boolean, String, Object] },
- "modelModifiers": {},
+ "modelValueModifiers": {},
},
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
@@ -253,7 +253,7 @@ exports[`defineModel() > w/ types, production mode, function + runtime opts + mu
export default /*@__PURE__*/_defineComponent({
props: {
"modelValue": { type: [Number, Function], ...{ default: () => 1 } },
- "modelModifiers": {},
+ "modelValueModifiers": {},
},
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts
index 5d696a95d..210c18dda 100644
--- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts
+++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts
@@ -94,7 +94,7 @@ describe('defineModel()', () => {
)
assertCode(content)
expect(content).toMatch('"modelValue": { type: [Boolean, String] }')
- expect(content).toMatch('"modelModifiers": {}')
+ expect(content).toMatch('"modelValueModifiers": {}')
expect(content).toMatch('"count": { type: Number }')
expect(content).toMatch(
'"disabled": { type: Number, ...{ required: false } }',
diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts
index 050828002..9c8f254fe 100644
--- a/packages/compiler-sfc/src/script/defineModel.ts
+++ b/packages/compiler-sfc/src/script/defineModel.ts
@@ -167,9 +167,7 @@ export function genModelProps(ctx: ScriptCompileContext) {
modelPropsDecl += `\n ${JSON.stringify(name)}: ${decl},`
// also generate modifiers prop
- const modifierPropName = JSON.stringify(
- name === 'modelValue' ? `modelModifiers` : `${name}Modifiers`,
- )
+ const modifierPropName = JSON.stringify(`${name}Modifiers`)
modelPropsDecl += `\n ${modifierPropName}: {},`
}
return `{${modelPropsDecl}\n }`
diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts
index dc82c0491..c79343392 100644
--- a/packages/runtime-core/__tests__/componentEmits.spec.ts
+++ b/packages/runtime-core/__tests__/componentEmits.spec.ts
@@ -325,7 +325,7 @@ describe('component: emit', () => {
const Comp = () =>
h(Foo, {
modelValue: null,
- modelModifiers: { number: true },
+ modelValueModifiers: { number: true },
'onUpdate:modelValue': fn1,
foo: null,
@@ -356,7 +356,7 @@ describe('component: emit', () => {
const Comp = () =>
h(Foo, {
modelValue: null,
- modelModifiers: { trim: true },
+ modelValueModifiers: { trim: true },
'onUpdate:modelValue': fn1,
foo: null,
@@ -410,7 +410,7 @@ describe('component: emit', () => {
const Comp = () =>
h(Foo, {
modelValue: null,
- modelModifiers: { trim: true },
+ modelValueModifiers: { trim: true },
'onUpdate:modelValue': fn1,
firstName: null,
@@ -464,7 +464,7 @@ describe('component: emit', () => {
const Comp = () =>
h(Foo, {
modelValue: null,
- modelModifiers: { trim: true, number: true },
+ modelValueModifiers: { trim: true, number: true },
'onUpdate:modelValue': fn1,
foo: null,
@@ -492,7 +492,7 @@ describe('component: emit', () => {
const Comp = () =>
h(Foo, {
modelValue: null,
- modelModifiers: { trim: true },
+ modelValueModifiers: { trim: true },
'onUpdate:modelValue': fn,
})
diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts
index e85edc6e9..603a7bf6e 100644
--- a/packages/runtime-core/src/helpers/useModel.ts
+++ b/packages/runtime-core/src/helpers/useModel.ts
@@ -145,9 +145,9 @@ export const getModelModifiers = (
modelName: string,
getter: (props: Record, key: string) => any,
): Record | undefined => {
- return modelName === 'modelValue' || modelName === 'model-value'
- ? getter(props, 'modelModifiers')
- : getter(props, `${modelName}Modifiers`) ||
- getter(props, `${camelize(modelName)}Modifiers`) ||
- getter(props, `${hyphenate(modelName)}Modifiers`)
+ return (
+ getter(props, `${modelName}Modifiers`) ||
+ getter(props, `${camelize(modelName)}Modifiers`) ||
+ getter(props, `${hyphenate(modelName)}Modifiers`)
+ )
}
From 9df9281b506451667e0d5cc5e67420028a091224 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Thu, 20 Mar 2025 10:35:30 +0800
Subject: [PATCH 11/36] feat: use for vapor
---
.../transforms/__snapshots__/vModel.spec.ts.snap | 4 ++--
.../compiler-vapor/__tests__/transforms/vModel.spec.ts | 4 ++--
packages/compiler-vapor/src/generators/component.ts | 4 +---
packages/runtime-vapor/__tests__/componentEmits.spec.ts | 8 ++++----
4 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap
index 5ef064974..14330e578 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap
@@ -1,13 +1,13 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`compiler: vModel transform > component > v-model for component should generate modelModifiers 1`] = `
+exports[`compiler: vModel transform > component > v-model for component should generate modelValueModifiers 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
export function render(_ctx) {
const _component_Comp = _resolveComponent("Comp")
const n0 = _createComponentWithFallback(_component_Comp, { modelValue: () => (_ctx.foo),
"onUpdate:modelValue": () => _value => (_ctx.foo = _value),
- modelModifiers: () => ({ trim: true, "bar-baz": true }) }, null, true)
+ modelValueModifiers: () => ({ trim: true, "bar-baz": true }) }, null, true)
return n0
}"
`;
diff --git a/packages/compiler-vapor/__tests__/transforms/vModel.spec.ts b/packages/compiler-vapor/__tests__/transforms/vModel.spec.ts
index 51eaa9e02..bed60ff63 100644
--- a/packages/compiler-vapor/__tests__/transforms/vModel.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/vModel.spec.ts
@@ -266,13 +266,13 @@ describe('compiler: vModel transform', () => {
})
})
- test('v-model for component should generate modelModifiers', () => {
+ test('v-model for component should generate modelValueModifiers', () => {
const { code, ir } = compileWithVModel(
'',
)
expect(code).toMatchSnapshot()
expect(code).contain(
- `modelModifiers: () => ({ trim: true, "bar-baz": true })`,
+ `modelValueModifiers: () => ({ trim: true, "bar-baz": true })`,
)
expect(ir.block.dynamic.children[0].operation).toMatchObject({
type: IRNodeTypes.CREATE_COMPONENT_NODE,
diff --git a/packages/compiler-vapor/src/generators/component.ts b/packages/compiler-vapor/src/generators/component.ts
index 7c232db75..1c251928c 100644
--- a/packages/compiler-vapor/src/generators/component.ts
+++ b/packages/compiler-vapor/src/generators/component.ts
@@ -240,9 +240,7 @@ function genModelModifiers(
if (!modelModifiers || !modelModifiers.length) return []
const modifiersKey = key.isStatic
- ? key.content === 'modelValue'
- ? [`modelModifiers`]
- : [`${key.content}Modifiers`]
+ ? [`${key.content}Modifiers`]
: ['[', ...genExpression(key, context), ' + "Modifiers"]']
const modifiersVal = genDirectiveModifiers(modelModifiers)
diff --git a/packages/runtime-vapor/__tests__/componentEmits.spec.ts b/packages/runtime-vapor/__tests__/componentEmits.spec.ts
index 8c8a56085..6b542bbf6 100644
--- a/packages/runtime-vapor/__tests__/componentEmits.spec.ts
+++ b/packages/runtime-vapor/__tests__/componentEmits.spec.ts
@@ -265,7 +265,7 @@ describe('component: emit', () => {
const fn2 = vi.fn()
render({
modelValue: () => null,
- modelModifiers: () => ({ number: true }),
+ modelValueModifiers: () => ({ number: true }),
['onUpdate:modelValue']: () => fn1,
foo: () => null,
fooModifiers: () => ({ number: true }),
@@ -291,7 +291,7 @@ describe('component: emit', () => {
modelValue() {
return null
},
- modelModifiers() {
+ modelValueModifiers() {
return { trim: true }
},
['onUpdate:modelValue']() {
@@ -327,7 +327,7 @@ describe('component: emit', () => {
modelValue() {
return null
},
- modelModifiers() {
+ modelValueModifiers() {
return { trim: true, number: true }
},
['onUpdate:modelValue']() {
@@ -361,7 +361,7 @@ describe('component: emit', () => {
modelValue() {
return null
},
- modelModifiers() {
+ modelValueModifiers() {
return { trim: true }
},
['onUpdate:modelValue']() {
From f264ceb89230f89a25de39d160341bb57364dea7 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 25 Mar 2025 10:40:01 +0800
Subject: [PATCH 12/36] feat(runtime-vapor): support HMR for setup
---
packages/runtime-vapor/src/component.ts | 55 ++++++++++++++++---------
1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..9d1beb7fb 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -182,6 +182,14 @@ export function createComponent(
appContext,
)
+ // HMR
+ if (__DEV__ && component.__hmrId) {
+ registerHMR(instance)
+ instance.isSingleRoot = isSingleRoot
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
+
if (__DEV__) {
pushWarningContext(instance)
startMeasure(instance, `init`)
@@ -221,14 +229,6 @@ export function createComponent(
// TODO make the proxy warn non-existent property access during dev
instance.setupState = proxyRefs(setupResult)
devRender(instance)
-
- // HMR
- if (component.__hmrId) {
- registerHMR(instance)
- instance.isSingleRoot = isSingleRoot
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
- }
}
} else {
// component has a render function but no setup function
@@ -283,18 +283,33 @@ export let isApplyingFallthroughProps = false
*/
export function devRender(instance: VaporComponentInstance): void {
instance.block =
- callWithErrorHandling(
- instance.type.render!,
- instance,
- ErrorCodes.RENDER_FUNCTION,
- [
- instance.setupState,
- instance.props,
- instance.emit,
- instance.attrs,
- instance.slots,
- ],
- ) || []
+ (instance.type.render
+ ? callWithErrorHandling(
+ instance.type.render,
+ instance,
+ ErrorCodes.RENDER_FUNCTION,
+ [
+ instance.setupState,
+ instance.props,
+ instance.emit,
+ instance.attrs,
+ instance.slots,
+ ],
+ )
+ : callWithErrorHandling(
+ isFunction(instance.type) ? instance.type : instance.type.setup!,
+ instance,
+ ErrorCodes.SETUP_FUNCTION,
+ [
+ instance.props,
+ {
+ slots: instance.slots,
+ attrs: instance.attrs,
+ emit: instance.emit,
+ expose: instance.expose,
+ },
+ ],
+ )) || []
}
const emptyContext: GenericAppContext = {
From 9ab8e4c0c98087fe2758380c194259aebcb3f765 Mon Sep 17 00:00:00 2001
From: daiwei
Date: Tue, 1 Apr 2025 21:03:42 +0800
Subject: [PATCH 13/36] chore: update lockfile
---
pnpm-lock.yaml | 582 +++++++++++++++++++++++++++----------------------
1 file changed, 323 insertions(+), 259 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bc4e5a164..c72eaa1ab 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,8 +13,8 @@ catalogs:
specifier: ^7.26.10
version: 7.26.10
'@vitejs/plugin-vue':
- specifier: ^5.2.3
- version: 5.2.3
+ specifier: https://pkg.pr.new/@vitejs/plugin-vue@c156992
+ version: 5.2.1
estree-walker:
specifier: ^2.0.2
version: 2.0.2
@@ -25,8 +25,8 @@ catalogs:
specifier: ^1.2.1
version: 1.2.1
vite:
- specifier: ^5.4.14
- version: 5.4.14
+ specifier: ^6.1.0
+ version: 6.2.4
importers:
@@ -69,14 +69,14 @@ importers:
specifier: ^6.1.4
version: 6.1.4
'@vitest/coverage-v8':
- specifier: ^3.0.2
- version: 3.0.2(vitest@3.0.2)
+ specifier: ^3.0.9
+ version: 3.0.9(vitest@3.0.9)
'@vitest/eslint-plugin':
- specifier: ^1.1.25
- version: 1.1.25(@typescript-eslint/utils@8.20.0(eslint@9.18.0)(typescript@5.6.2))(eslint@9.18.0)(typescript@5.6.2)(vitest@3.0.2)
+ specifier: ^1.1.38
+ version: 1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.23.0)(typescript@5.6.2))(eslint@9.23.0)(typescript@5.6.2)(vitest@3.0.9)
'@vitest/ui':
specifier: ^3.0.2
- version: 3.0.4(vitest@3.0.2)
+ version: 3.1.1(vitest@3.0.9)
'@vue/consolidate':
specifier: 1.0.0
version: 1.0.0
@@ -178,16 +178,16 @@ importers:
version: 8.27.0(eslint@9.23.0)(typescript@5.6.2)
vite:
specifier: 'catalog:'
- version: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
vitest:
- specifier: ^3.0.2
- version: 3.0.2(@types/node@22.10.7)(@vitest/ui@3.0.4)(jsdom@26.0.0)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ specifier: ^3.0.9
+ version: 3.0.9(@types/node@22.13.13)(@vitest/ui@3.1.1)(jsdom@26.0.0)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
packages-private/benchmark:
dependencies:
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))(vue@3.5.13(typescript@5.6.2))
+ version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.2))
connect:
specifier: ^3.7.0
version: 3.7.0
@@ -196,7 +196,7 @@ importers:
version: 2.0.4
vite:
specifier: 'catalog:'
- version: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
devDependencies:
'@types/connect':
specifier: ^3.4.38
@@ -227,26 +227,26 @@ importers:
dependencies:
'@vueuse/core':
specifier: ^11.1.0
- version: 11.1.0(vue@packages+vue)
+ version: 11.3.0(vue@packages+vue)
vue:
specifier: workspace:*
version: link:../../packages/vue
devDependencies:
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))(vue@packages+vue)
+ version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@packages+vue)
'@vue/compiler-sfc':
specifier: workspace:*
version: link:../../packages/compiler-sfc
vite:
specifier: 'catalog:'
- version: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
vite-hyper-config:
specifier: ^0.4.0
- version: 0.4.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))
+ version: 0.4.1(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))
vite-plugin-inspect:
specifier: ^0.8.7
- version: 0.8.7(rollup@4.31.0)(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))
+ version: 0.8.7(rollup@4.37.0)(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))
packages-private/sfc-playground:
dependencies:
@@ -265,10 +265,10 @@ importers:
devDependencies:
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))(vue@packages+vue)
+ version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@packages+vue)
vite:
specifier: 'catalog:'
- version: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
packages-private/template-explorer:
dependencies:
@@ -289,7 +289,7 @@ importers:
version: 3.4.38
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1))(vue@packages+vue)
+ version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@packages+vue)
connect:
specifier: ^3.7.0
version: 3.7.0
@@ -298,7 +298,7 @@ importers:
version: 2.0.4
vite:
specifier: 'catalog:'
- version: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
vue:
specifier: workspace:*
version: link:../../packages/vue
@@ -307,10 +307,10 @@ importers:
devDependencies:
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: 5.2.3(vite@5.4.14(@types/node@22.13.13)(sass@1.86.0))(vue@packages+vue)
+ version: https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@packages+vue)
vite:
specifier: 'catalog:'
- version: 5.4.14(@types/node@22.13.13)(sass@1.86.0)
+ version: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
vue:
specifier: workspace:*
version: link:../../packages/vue
@@ -1115,6 +1115,9 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
'@puppeteer/browsers@2.8.0':
resolution: {integrity: sha512-yTwt2KWRmCQAfhvbCRjebaSX8pV1//I0Y3g+A7f/eS7gf0l4eRJoUCvcYdVtboeU4CTOZQuqYbZNS8aBYb8ROQ==}
engines: {node: '>=18'}
@@ -1183,100 +1186,53 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.34.2':
- resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==}
- cpu: [arm]
- os: [android]
-
'@rollup/rollup-android-arm-eabi@4.37.0':
resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.34.2':
- resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==}
- cpu: [arm64]
- os: [android]
-
'@rollup/rollup-android-arm64@4.37.0':
resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.34.2':
- resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==}
- cpu: [arm64]
- os: [darwin]
-
'@rollup/rollup-darwin-arm64@4.37.0':
resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.34.2':
- resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==}
- cpu: [x64]
- os: [darwin]
-
'@rollup/rollup-darwin-x64@4.37.0':
resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.34.2':
- resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==}
- cpu: [arm64]
- os: [freebsd]
-
'@rollup/rollup-freebsd-arm64@4.37.0':
resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.34.2':
- resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==}
- cpu: [x64]
- os: [freebsd]
-
'@rollup/rollup-freebsd-x64@4.37.0':
resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.34.2':
- resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==}
- cpu: [arm]
- os: [linux]
-
'@rollup/rollup-linux-arm-gnueabihf@4.37.0':
resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==}
cpu: [arm]
os: [linux]
-
- '@rollup/rollup-linux-arm-musleabihf@4.34.2':
- resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==}
- cpu: [arm]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.37.0':
resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==}
cpu: [arm]
os: [linux]
-
- '@rollup/rollup-linux-arm64-gnu@4.34.2':
- resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==}
- cpu: [arm64]
- os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.37.0':
resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==}
cpu: [arm64]
os: [linux]
-
- '@rollup/rollup-linux-arm64-musl@4.34.2':
- resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==}
- cpu: [arm64]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.37.0':
resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==}
@@ -1284,96 +1240,58 @@ packages:
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-loongarch64-gnu@4.34.2':
- resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==}
- cpu: [loong64]
- os: [linux]
-
'@rollup/rollup-linux-loongarch64-gnu@4.37.0':
resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==}
cpu: [loong64]
os: [linux]
-
- '@rollup/rollup-linux-powerpc64le-gnu@4.34.2':
- resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==}
- cpu: [ppc64]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==}
cpu: [ppc64]
os: [linux]
-
- '@rollup/rollup-linux-riscv64-gnu@4.34.2':
- resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==}
- cpu: [riscv64]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.37.0':
resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.37.0':
resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==}
cpu: [riscv64]
os: [linux]
-
- '@rollup/rollup-linux-s390x-gnu@4.34.2':
- resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==}
- cpu: [s390x]
- os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.37.0':
resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==}
cpu: [s390x]
os: [linux]
-
- '@rollup/rollup-linux-x64-gnu@4.34.2':
- resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==}
- cpu: [x64]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.37.0':
resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==}
cpu: [x64]
os: [linux]
-
- '@rollup/rollup-linux-x64-musl@4.34.2':
- resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==}
- cpu: [x64]
- os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.37.0':
resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==}
cpu: [x64]
os: [linux]
-
- '@rollup/rollup-win32-arm64-msvc@4.34.2':
- resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==}
- cpu: [arm64]
- os: [win32]
+ libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.37.0':
resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.34.2':
- resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==}
- cpu: [ia32]
- os: [win32]
-
'@rollup/rollup-win32-ia32-msvc@4.37.0':
resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.34.2':
- resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==}
- cpu: [x64]
- os: [win32]
-
'@rollup/rollup-win32-x64-msvc@4.37.0':
resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==}
cpu: [x64]
@@ -1464,6 +1382,9 @@ packages:
'@tybys/wasm-util@0.9.0':
resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
'@types/doctrine@0.0.9':
resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
@@ -1571,21 +1492,25 @@ packages:
resolution: {integrity: sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2':
resolution: {integrity: sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2':
resolution: {integrity: sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2':
resolution: {integrity: sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2':
resolution: {integrity: sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==}
@@ -1602,8 +1527,9 @@ packages:
cpu: [x64]
os: [win32]
- '@vitejs/plugin-vue@5.2.3':
- resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==}
+ '@vitejs/plugin-vue@https://pkg.pr.new/@vitejs/plugin-vue@c156992':
+ resolution: {tarball: https://pkg.pr.new/@vitejs/plugin-vue@c156992}
+ version: 5.2.1
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0 || ^6.0.0
@@ -1648,6 +1574,9 @@ packages:
'@vitest/pretty-format@3.0.9':
resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==}
+ '@vitest/pretty-format@3.1.1':
+ resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==}
+
'@vitest/runner@3.0.9':
resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==}
@@ -1657,11 +1586,16 @@ packages:
'@vitest/spy@3.0.9':
resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==}
+ '@vitest/ui@3.1.1':
+ resolution: {integrity: sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==}
+ peerDependencies:
+ vitest: 3.1.1
+
'@vitest/utils@3.0.9':
resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==}
- '@vitest/utils@3.0.4':
- resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==}
+ '@vitest/utils@3.1.1':
+ resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==}
'@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
@@ -1679,9 +1613,35 @@ packages:
resolution: {integrity: sha512-oTyUE+QHIzLw2PpV14GD/c7EohDyP64xCniWTcqcEmTd699eFqTIwOmtDYjcO1j3QgdXoJEoWv1/cCdLrRoOfg==}
engines: {node: '>= 0.12.0'}
+ '@vue/reactivity@3.5.13':
+ resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
+
'@vue/repl@4.5.1':
resolution: {integrity: sha512-YYXvFue2GOrZ6EWnoA8yQVKzdCIn45+tpwJHzMof1uwrgyYAVY9ynxCsDYeAuWcpaAeylg/nybhFuqiFy2uvYA==}
+ '@vue/runtime-core@3.5.13':
+ resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
+
+ '@vue/runtime-dom@3.5.13':
+ resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
+
+ '@vue/server-renderer@3.5.13':
+ resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+ peerDependencies:
+ vue: 3.5.13
+
+ '@vue/shared@3.5.13':
+ resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+ '@vueuse/core@11.3.0':
+ resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==}
+
+ '@vueuse/metadata@11.3.0':
+ resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==}
+
+ '@vueuse/shared@11.3.0':
+ resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==}
+
'@zeit/schemas@2.36.0':
resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==}
@@ -1825,6 +1785,13 @@ packages:
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
@@ -2396,8 +2363,8 @@ packages:
flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
- flatted@3.3.2:
- resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
foreground-child@3.3.0:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
@@ -3098,6 +3065,9 @@ packages:
path-to-regexp@3.3.0:
resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -3167,10 +3137,6 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.5.1:
- resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
- engines: {node: ^10 || ^12 || >=14}
-
postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
@@ -3351,11 +3317,6 @@ packages:
peerDependencies:
rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
- rollup@4.34.2:
- resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
rollup@4.37.0:
resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -3367,6 +3328,10 @@ packages:
rspack-resolver@1.2.2:
resolution: {integrity: sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==}
+ run-applescript@7.0.0:
+ resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
+ engines: {node: '>=18'}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -3437,8 +3402,8 @@ packages:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
- sirv@3.0.0:
- resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
+ sirv@3.0.1:
+ resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
engines: {node: '>=18'}
slice-ansi@5.0.0:
@@ -3596,8 +3561,8 @@ packages:
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
- tinyglobby@0.2.10:
- resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
+ tinyglobby@0.2.12:
+ resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
engines: {node: '>=12.0.0'}
tinypool@1.0.2:
@@ -3699,6 +3664,10 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
unplugin-utils@0.2.4:
resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
engines: {node: '>=18.12.0'}
@@ -3723,15 +3692,67 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
+ vite-hyper-config@0.4.1:
+ resolution: {integrity: sha512-w9D4g0+5Km8XCgkBY/BZrXZAl8FF2q1UpDXT/Fsm6VLEU5tkkzDCko8fjLPOaSbvirUJgbY5OsD5wuuZ6581Fg==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ vite: ^4.0.0 || ^5.0.0 || ^6.0.0
+
+ vite-node@2.1.9:
+ resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
vite-node@3.0.9:
resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
+ vite-plugin-inspect@0.8.7:
+ resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': '*'
+ vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+
vite@5.4.14:
resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vite@6.2.4:
+ resolution: {integrity: sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
jiti: '>=1.21.0'
@@ -4355,6 +4376,8 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@polka/url@1.0.0-next.28': {}
+
'@puppeteer/browsers@2.8.0':
dependencies:
debug: 4.4.0
@@ -4422,120 +4445,63 @@ snapshots:
optionalDependencies:
rollup: 4.37.0
- '@rollup/rollup-android-arm-eabi@4.34.2':
- optional: true
-
'@rollup/rollup-android-arm-eabi@4.37.0':
optional: true
- '@rollup/rollup-android-arm64@4.34.2':
- optional: true
-
'@rollup/rollup-android-arm64@4.37.0':
optional: true
- '@rollup/rollup-darwin-arm64@4.34.2':
- optional: true
-
'@rollup/rollup-darwin-arm64@4.37.0':
optional: true
- '@rollup/rollup-darwin-x64@4.34.2':
- optional: true
-
'@rollup/rollup-darwin-x64@4.37.0':
optional: true
- '@rollup/rollup-freebsd-arm64@4.34.2':
- optional: true
-
'@rollup/rollup-freebsd-arm64@4.37.0':
optional: true
- '@rollup/rollup-freebsd-x64@4.34.2':
- optional: true
-
'@rollup/rollup-freebsd-x64@4.37.0':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.34.2':
- optional: true
-
'@rollup/rollup-linux-arm-gnueabihf@4.37.0':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.34.2':
- optional: true
-
'@rollup/rollup-linux-arm-musleabihf@4.37.0':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-arm64-gnu@4.37.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.34.2':
- optional: true
-
'@rollup/rollup-linux-arm64-musl@4.37.0':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-loongarch64-gnu@4.37.0':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-riscv64-gnu@4.37.0':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.37.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-s390x-gnu@4.37.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.34.2':
- optional: true
-
'@rollup/rollup-linux-x64-gnu@4.37.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.34.2':
- optional: true
-
'@rollup/rollup-linux-x64-musl@4.37.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.34.2':
- optional: true
-
'@rollup/rollup-win32-arm64-msvc@4.37.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.34.2':
- optional: true
-
'@rollup/rollup-win32-ia32-msvc@4.37.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.34.2':
- optional: true
-
'@rollup/rollup-win32-x64-msvc@4.37.0':
optional: true
@@ -4598,6 +4564,10 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 22.13.13
+
'@types/doctrine@0.0.9': {}
'@types/estree@1.0.6': {}
@@ -4741,12 +4711,17 @@ snapshots:
'@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2':
optional: true
- '@vitejs/plugin-vue@5.2.3(vite@5.4.14(@types/node@22.13.13)(sass@1.86.0))(vue@packages+vue)':
+ '@vitejs/plugin-vue@https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.2))':
dependencies:
- vite: 5.4.14(@types/node@22.13.13)(sass@1.86.0)
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
+ vue: 3.5.13(typescript@5.6.2)
+
+ '@vitejs/plugin-vue@https://pkg.pr.new/@vitejs/plugin-vue@c156992(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))(vue@packages+vue)':
+ dependencies:
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
vue: link:packages/vue
- '@vitest/coverage-v8@3.0.9(vitest@3.0.9(@types/node@22.13.13)(jsdom@26.0.0)(sass@1.86.0))':
+ '@vitest/coverage-v8@3.0.9(vitest@3.0.9)':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
@@ -4760,17 +4735,17 @@ snapshots:
std-env: 3.8.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
- vitest: 3.0.9(@types/node@22.13.13)(jsdom@26.0.0)(sass@1.86.0)
+ vitest: 3.0.9(@types/node@22.13.13)(@vitest/ui@3.1.1)(jsdom@26.0.0)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
- '@vitest/eslint-plugin@1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.23.0)(typescript@5.6.2))(eslint@9.23.0)(typescript@5.6.2)(vitest@3.0.9(@types/node@22.13.13)(jsdom@26.0.0)(sass@1.86.0))':
+ '@vitest/eslint-plugin@1.1.38(@typescript-eslint/utils@8.27.0(eslint@9.23.0)(typescript@5.6.2))(eslint@9.23.0)(typescript@5.6.2)(vitest@3.0.9)':
dependencies:
'@typescript-eslint/utils': 8.27.0(eslint@9.23.0)(typescript@5.6.2)
eslint: 9.23.0
optionalDependencies:
typescript: 5.6.2
- vitest: 3.0.9(@types/node@22.13.13)(jsdom@26.0.0)(sass@1.86.0)
+ vitest: 3.0.9(@types/node@22.13.13)(@vitest/ui@3.1.1)(jsdom@26.0.0)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
'@vitest/expect@3.0.9':
dependencies:
@@ -4779,18 +4754,22 @@ snapshots:
chai: 5.2.0
tinyrainbow: 2.0.0
- '@vitest/mocker@3.0.9(vite@5.4.14(@types/node@22.13.13)(sass@1.86.0))':
+ '@vitest/mocker@3.0.9(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))':
dependencies:
'@vitest/spy': 3.0.9
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
- vite: 5.4.14(@types/node@22.13.13)(sass@1.86.0)
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
'@vitest/pretty-format@3.0.9':
dependencies:
tinyrainbow: 2.0.0
+ '@vitest/pretty-format@3.1.1':
+ dependencies:
+ tinyrainbow: 2.0.0
+
'@vitest/runner@3.0.9':
dependencies:
'@vitest/utils': 3.0.9
@@ -4806,21 +4785,32 @@ snapshots:
dependencies:
tinyspy: 3.0.2
+ '@vitest/ui@3.1.1(vitest@3.0.9)':
+ dependencies:
+ '@vitest/utils': 3.1.1
+ fflate: 0.8.2
+ flatted: 3.3.3
+ pathe: 2.0.3
+ sirv: 3.0.1
+ tinyglobby: 0.2.12
+ tinyrainbow: 2.0.0
+ vitest: 3.0.9(@types/node@22.13.13)(@vitest/ui@3.1.1)(jsdom@26.0.0)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
+
'@vitest/utils@3.0.9':
dependencies:
'@vitest/pretty-format': 3.0.9
loupe: 3.1.3
tinyrainbow: 2.0.0
- '@vitest/utils@3.0.4':
+ '@vitest/utils@3.1.1':
dependencies:
- '@vitest/pretty-format': 3.0.4
- loupe: 3.1.2
+ '@vitest/pretty-format': 3.1.1
+ loupe: 3.1.3
tinyrainbow: 2.0.0
'@vue/compiler-core@3.5.13':
dependencies:
- '@babel/parser': 7.26.2
+ '@babel/parser': 7.26.10
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
@@ -4833,14 +4823,14 @@ snapshots:
'@vue/compiler-sfc@3.5.13':
dependencies:
- '@babel/parser': 7.26.2
+ '@babel/parser': 7.26.10
'@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.17
- postcss: 8.5.1
+ postcss: 8.5.3
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.13':
@@ -4850,8 +4840,51 @@ snapshots:
'@vue/consolidate@1.0.0': {}
+ '@vue/reactivity@3.5.13':
+ dependencies:
+ '@vue/shared': 3.5.13
+
'@vue/repl@4.5.1': {}
+ '@vue/runtime-core@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/runtime-dom@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/runtime-core': 3.5.13
+ '@vue/shared': 3.5.13
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.2))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ vue: 3.5.13(typescript@5.6.2)
+
+ '@vue/shared@3.5.13': {}
+
+ '@vueuse/core@11.3.0(vue@packages+vue)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 11.3.0
+ '@vueuse/shared': 11.3.0(vue@packages+vue)
+ vue-demi: 0.14.10(vue@packages+vue)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@11.3.0': {}
+
+ '@vueuse/shared@11.3.0(vue@packages+vue)':
+ dependencies:
+ vue-demi: 0.14.10(vue@packages+vue)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
'@zeit/schemas@2.36.0': {}
accepts@1.3.8:
@@ -4988,6 +5021,13 @@ snapshots:
buffer-crc32@0.2.13: {}
+ buffer-from@1.1.2:
+ optional: true
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.0.0
+
bytes@3.0.0: {}
cac@6.7.14: {}
@@ -5636,7 +5676,7 @@ snapshots:
flatted@3.3.1: {}
- flatted@3.3.2: {}
+ flatted@3.3.3: {}
foreground-child@3.3.0:
dependencies:
@@ -6326,6 +6366,8 @@ snapshots:
path-to-regexp@3.3.0: {}
+ pathe@1.1.2: {}
+
pathe@2.0.3: {}
pathval@2.0.0: {}
@@ -6387,12 +6429,6 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.5.1:
- dependencies:
- nanoid: 3.3.8
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
postcss@8.5.3:
dependencies:
nanoid: 3.3.8
@@ -6634,31 +6670,6 @@ snapshots:
'@rollup/plugin-inject': 5.0.5(rollup@4.37.0)
rollup: 4.37.0
- rollup@4.34.2:
- dependencies:
- '@types/estree': 1.0.6
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.34.2
- '@rollup/rollup-android-arm64': 4.34.2
- '@rollup/rollup-darwin-arm64': 4.34.2
- '@rollup/rollup-darwin-x64': 4.34.2
- '@rollup/rollup-freebsd-arm64': 4.34.2
- '@rollup/rollup-freebsd-x64': 4.34.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.34.2
- '@rollup/rollup-linux-arm-musleabihf': 4.34.2
- '@rollup/rollup-linux-arm64-gnu': 4.34.2
- '@rollup/rollup-linux-arm64-musl': 4.34.2
- '@rollup/rollup-linux-loongarch64-gnu': 4.34.2
- '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2
- '@rollup/rollup-linux-riscv64-gnu': 4.34.2
- '@rollup/rollup-linux-s390x-gnu': 4.34.2
- '@rollup/rollup-linux-x64-gnu': 4.34.2
- '@rollup/rollup-linux-x64-musl': 4.34.2
- '@rollup/rollup-win32-arm64-msvc': 4.34.2
- '@rollup/rollup-win32-ia32-msvc': 4.34.2
- '@rollup/rollup-win32-x64-msvc': 4.34.2
- fsevents: 2.3.3
-
rollup@4.37.0:
dependencies:
'@types/estree': 1.0.6
@@ -6701,6 +6712,8 @@ snapshots:
'@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.2.2
'@unrs/rspack-resolver-binding-win32-x64-msvc': 1.2.2
+ run-applescript@7.0.0: {}
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
@@ -6780,13 +6793,13 @@ snapshots:
sirv@2.0.4:
dependencies:
- '@polka/url': 1.0.0-next.25
+ '@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
- sirv@3.0.0:
+ sirv@3.0.1:
dependencies:
- '@polka/url': 1.0.0-next.25
+ '@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
@@ -6953,7 +6966,7 @@ snapshots:
tinyexec@0.3.2: {}
- tinyglobby@0.2.10:
+ tinyglobby@0.2.12:
dependencies:
fdir: 6.4.3(picomatch@4.0.2)
picomatch: 4.0.2
@@ -7027,6 +7040,8 @@ snapshots:
universalify@2.0.1: {}
+ unpipe@1.0.0: {}
+
unplugin-utils@0.2.4:
dependencies:
pathe: 2.0.3
@@ -7052,13 +7067,48 @@ snapshots:
vary@1.1.2: {}
- vite-node@3.0.9(@types/node@22.13.13)(sass@1.86.0):
+ vite-hyper-config@0.4.1(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)):
+ dependencies:
+ cac: 6.7.14
+ picocolors: 1.1.1
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
+ vite-node: 2.1.9(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-node@2.1.9(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.0
+ es-module-lexer: 1.6.0
+ pathe: 1.1.2
+ vite: 5.4.14(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-node@3.0.9(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0):
dependencies:
cac: 6.7.14
debug: 4.4.0
es-module-lexer: 1.6.0
pathe: 2.0.3
- vite: 5.4.14(@types/node@22.13.13)(sass@1.86.0)
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
transitivePeerDependencies:
- '@types/node'
- jiti
@@ -7073,10 +7123,10 @@ snapshots:
- tsx
- yaml
- vite-plugin-inspect@0.8.7(rollup@4.31.0)(vite@6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)):
+ vite-plugin-inspect@0.8.7(rollup@4.37.0)(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)):
dependencies:
'@antfu/utils': 0.7.10
- '@rollup/pluginutils': 5.1.0(rollup@4.31.0)
+ '@rollup/pluginutils': 5.1.0(rollup@4.37.0)
debug: 4.4.0
error-stack-parser-es: 0.1.5
fs-extra: 11.2.0
@@ -7084,25 +7134,38 @@ snapshots:
perfect-debounce: 1.0.0
picocolors: 1.1.1
sirv: 2.0.4
- vite: 6.1.0(@types/node@22.10.7)(sass@1.83.4)(terser@5.33.0)(yaml@2.6.1)
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
- supports-color
- vite@5.4.14(@types/node@22.13.13)(sass@1.86.0):
+ vite@5.4.14(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0):
dependencies:
- esbuild: 0.24.2
- postcss: 8.5.1
- rollup: 4.34.2
+ esbuild: 0.21.5
+ postcss: 8.5.3
+ rollup: 4.37.0
optionalDependencies:
'@types/node': 22.13.13
fsevents: 2.3.3
sass: 1.86.0
+ terser: 5.33.0
- vitest@3.0.9(@types/node@22.13.13)(jsdom@26.0.0)(sass@1.86.0):
+ vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0):
+ dependencies:
+ esbuild: 0.25.1
+ postcss: 8.5.3
+ rollup: 4.37.0
+ optionalDependencies:
+ '@types/node': 22.13.13
+ fsevents: 2.3.3
+ sass: 1.86.0
+ terser: 5.33.0
+ yaml: 2.7.0
+
+ vitest@3.0.9(@types/node@22.13.13)(@vitest/ui@3.1.1)(jsdom@26.0.0)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0):
dependencies:
'@vitest/expect': 3.0.9
- '@vitest/mocker': 3.0.9(vite@5.4.14(@types/node@22.13.13)(sass@1.86.0))
+ '@vitest/mocker': 3.0.9(vite@6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0))
'@vitest/pretty-format': 3.0.9
'@vitest/runner': 3.0.9
'@vitest/snapshot': 3.0.9
@@ -7118,11 +7181,12 @@ snapshots:
tinyexec: 0.3.2
tinypool: 1.0.2
tinyrainbow: 2.0.0
- vite: 5.4.14(@types/node@22.13.13)(sass@1.86.0)
- vite-node: 3.0.9(@types/node@22.13.13)(sass@1.86.0)
+ vite: 6.2.4(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
+ vite-node: 3.0.9(@types/node@22.13.13)(sass@1.86.0)(terser@5.33.0)(yaml@2.7.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.13.13
+ '@vitest/ui': 3.1.1(vitest@3.0.9)
jsdom: 26.0.0
transitivePeerDependencies:
- jiti
From 09bc0006fe5aab4e497a688a93e97c8a1f11cd18 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 25 Mar 2025 10:40:01 +0800
Subject: [PATCH 14/36] feat(runtime-vapor): support HMR for setup
---
packages/runtime-vapor/src/component.ts | 55 ++++++++++++++++---------
1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..9d1beb7fb 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -182,6 +182,14 @@ export function createComponent(
appContext,
)
+ // HMR
+ if (__DEV__ && component.__hmrId) {
+ registerHMR(instance)
+ instance.isSingleRoot = isSingleRoot
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
+
if (__DEV__) {
pushWarningContext(instance)
startMeasure(instance, `init`)
@@ -221,14 +229,6 @@ export function createComponent(
// TODO make the proxy warn non-existent property access during dev
instance.setupState = proxyRefs(setupResult)
devRender(instance)
-
- // HMR
- if (component.__hmrId) {
- registerHMR(instance)
- instance.isSingleRoot = isSingleRoot
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
- }
}
} else {
// component has a render function but no setup function
@@ -283,18 +283,33 @@ export let isApplyingFallthroughProps = false
*/
export function devRender(instance: VaporComponentInstance): void {
instance.block =
- callWithErrorHandling(
- instance.type.render!,
- instance,
- ErrorCodes.RENDER_FUNCTION,
- [
- instance.setupState,
- instance.props,
- instance.emit,
- instance.attrs,
- instance.slots,
- ],
- ) || []
+ (instance.type.render
+ ? callWithErrorHandling(
+ instance.type.render,
+ instance,
+ ErrorCodes.RENDER_FUNCTION,
+ [
+ instance.setupState,
+ instance.props,
+ instance.emit,
+ instance.attrs,
+ instance.slots,
+ ],
+ )
+ : callWithErrorHandling(
+ isFunction(instance.type) ? instance.type : instance.type.setup!,
+ instance,
+ ErrorCodes.SETUP_FUNCTION,
+ [
+ instance.props,
+ {
+ slots: instance.slots,
+ attrs: instance.attrs,
+ emit: instance.emit,
+ expose: instance.expose,
+ },
+ ],
+ )) || []
}
const emptyContext: GenericAppContext = {
From 950bd8418392cade0d6ee54978a6928c75d060a3 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 26 Apr 2025 21:57:31 +0800
Subject: [PATCH 15/36] fix(compiler-vapor): prevent caching variables in
function expression
---
.../transformTemplateRef.spec.ts.snap | 13 ++++++
.../__snapshots__/vBind.spec.ts.snap | 22 ++++++++++
.../transforms/transformTemplateRef.spec.ts | 34 +++++++++++++++
.../__tests__/transforms/vBind.spec.ts | 8 ++++
.../src/generators/expression.ts | 43 +++++++------------
5 files changed, 92 insertions(+), 28 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
index f2eade4bc..4a691056a 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
@@ -13,6 +13,19 @@ export function render(_ctx) {
}"
`;
+exports[`compiler: template ref transform > function ref 1`] = `
+"import { createTemplateRefSetter as _createTemplateRefSetter, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("", true)
+
+export function render(_ctx) {
+ const _setTemplateRef = _createTemplateRefSetter()
+ const n0 = t0()
+ let r0
+ _renderEffect(() => r0 = _setTemplateRef(n0, bar => _ctx.foo = bar, r0))
+ return n0
+}"
+`;
+
exports[`compiler: template ref transform > ref + v-for 1`] = `
"import { createTemplateRefSetter as _createTemplateRefSetter, createFor as _createFor, template as _template } from 'vue';
const t0 = _template("", true)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
index 6e7d4229d..7e8072383 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
@@ -75,6 +75,17 @@ export function render(_ctx) {
}"
`;
+exports[`cache multiple access > not cache variable in function expression 1`] = `
+"import { setDynamicProps as _setDynamicProps, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("", true)
+
+export function render(_ctx) {
+ const n0 = t0()
+ _renderEffect(() => _setDynamicProps(n0, [{ foo: bar => _ctx.foo = bar }], true))
+ return n0
+}"
+`;
+
exports[`cache multiple access > not cache variable only used in property shorthand 1`] = `
"import { setStyle as _setStyle, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("", true)
@@ -86,6 +97,17 @@ export function render(_ctx) {
}"
`;
+exports[`cache multiple access > not cache variable with inline function 1`] = `
+"import { setDynamicProps as _setDynamicProps, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("", true)
+
+export function render(_ctx) {
+ const n0 = t0()
+ _renderEffect(() => _setDynamicProps(n0, [{ foo: bar => _ctx.foo = bar }], true))
+ return n0
+}"
+`;
+
exports[`cache multiple access > object property chain access 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("")
diff --git a/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
index 6be8f1877..f026675e4 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
@@ -81,6 +81,40 @@ describe('compiler: template ref transform', () => {
expect(code).contains('_setTemplateRef(n0, _ctx.foo, r0)')
})
+ test('function ref', () => {
+ const { ir, code } = compileWithTransformRef(
+ ``,
+ )
+ expect(ir.block.dynamic.children[0]).toMatchObject({
+ id: 0,
+ flags: DynamicFlag.REFERENCED,
+ })
+ expect(ir.template).toEqual([''])
+ expect(ir.block.operation).toMatchObject([
+ {
+ type: IRNodeTypes.DECLARE_OLD_REF,
+ id: 0,
+ },
+ ])
+ expect(ir.block.effect).toMatchObject([
+ {
+ operations: [
+ {
+ type: IRNodeTypes.SET_TEMPLATE_REF,
+ element: 0,
+ value: {
+ content: 'bar => foo = bar',
+ isStatic: false,
+ },
+ },
+ ],
+ },
+ ])
+ expect(code).toMatchSnapshot()
+ expect(code).contains('const _setTemplateRef = _createTemplateRefSetter()')
+ expect(code).contains('_setTemplateRef(n0, bar => _ctx.foo = bar, r0)')
+ })
+
test('ref + v-if', () => {
const { ir, code } = compileWithTransformRef(
``,
diff --git a/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts b/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
index 9a5f6ab69..60c3ebf0c 100644
--- a/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
@@ -809,4 +809,12 @@ describe('cache multiple access', () => {
expect(code).matchSnapshot()
expect(code).not.contains('const _bar = _ctx.bar')
})
+
+ test('not cache variable in function expression', () => {
+ const { code } = compileWithVBind(`
+
+ `)
+ expect(code).matchSnapshot()
+ expect(code).not.contains('const _bar = _ctx.bar')
+ })
})
diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts
index eedaeeb38..b5e25d8f6 100644
--- a/packages/compiler-vapor/src/generators/expression.ts
+++ b/packages/compiler-vapor/src/generators/expression.ts
@@ -20,7 +20,6 @@ import type { Identifier, Node } from '@babel/types'
import type { CodegenContext } from '../generate'
import { isConstantExpression } from '../utils'
import { type CodeFragment, NEWLINE, buildCodeFragment } from './utils'
-import { walk } from 'estree-walker'
import { type ParserOptions, parseExpression } from '@babel/parser'
export function genExpression(
@@ -295,33 +294,15 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
continue
}
- walk(exp.ast, {
- enter(currentNode: Node, parent: Node | null) {
- if (currentNode.type === 'MemberExpression') {
- const memberExp = extractMemberExpression(
- currentNode,
- (name: string) => {
- registerVariable(name, exp, true)
- },
- )
- registerVariable(memberExp, exp, false)
- return this.skip()
- }
-
- // skip shorthand or non-computed property keys
- if (
- parent &&
- parent.type === 'ObjectProperty' &&
- parent.key === currentNode &&
- (parent.shorthand || !parent.computed)
- ) {
- return this.skip()
- }
-
- if (currentNode.type === 'Identifier') {
- registerVariable(currentNode.name, exp, true)
- }
- },
+ walkIdentifiers(exp.ast, (currentNode, parent, parentStack) => {
+ if (parent && isMemberExpression(parent)) {
+ const memberExp = extractMemberExpression(parent, name => {
+ registerVariable(name, exp, true)
+ })
+ registerVariable(memberExp, exp, false)
+ } else if (!parentStack.find(isMemberExpression)) {
+ registerVariable(currentNode.name, exp, true)
+ }
})
}
@@ -580,3 +561,9 @@ function extractMemberExpression(
return ''
}
}
+
+const isMemberExpression = (node: Node) => {
+ return (
+ node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression'
+ )
+}
From 73dc7edd22efb4638e01c023d09c41f3c6427e8b Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 26 Apr 2025 22:04:53 +0800
Subject: [PATCH 16/36] chore: revert
---
packages/runtime-vapor/src/component.ts | 55 +++++++++----------------
1 file changed, 20 insertions(+), 35 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 9d1beb7fb..548babebf 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -182,14 +182,6 @@ export function createComponent(
appContext,
)
- // HMR
- if (__DEV__ && component.__hmrId) {
- registerHMR(instance)
- instance.isSingleRoot = isSingleRoot
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
- }
-
if (__DEV__) {
pushWarningContext(instance)
startMeasure(instance, `init`)
@@ -229,6 +221,14 @@ export function createComponent(
// TODO make the proxy warn non-existent property access during dev
instance.setupState = proxyRefs(setupResult)
devRender(instance)
+
+ // HMR
+ if (component.__hmrId) {
+ registerHMR(instance)
+ instance.isSingleRoot = isSingleRoot
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
}
} else {
// component has a render function but no setup function
@@ -283,33 +283,18 @@ export let isApplyingFallthroughProps = false
*/
export function devRender(instance: VaporComponentInstance): void {
instance.block =
- (instance.type.render
- ? callWithErrorHandling(
- instance.type.render,
- instance,
- ErrorCodes.RENDER_FUNCTION,
- [
- instance.setupState,
- instance.props,
- instance.emit,
- instance.attrs,
- instance.slots,
- ],
- )
- : callWithErrorHandling(
- isFunction(instance.type) ? instance.type : instance.type.setup!,
- instance,
- ErrorCodes.SETUP_FUNCTION,
- [
- instance.props,
- {
- slots: instance.slots,
- attrs: instance.attrs,
- emit: instance.emit,
- expose: instance.expose,
- },
- ],
- )) || []
+ callWithErrorHandling(
+ instance.type.render!,
+ instance,
+ ErrorCodes.RENDER_FUNCTION,
+ [
+ instance.setupState,
+ instance.props,
+ instance.emit,
+ instance.attrs,
+ instance.slots,
+ ],
+ ) || []
}
const emptyContext: GenericAppContext = {
From 2582521b09cb0a678db8e99d6e67760759cfc59e Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 27 Apr 2025 09:01:10 +0800
Subject: [PATCH 17/36] chore: use some
---
packages/compiler-vapor/src/generators/expression.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts
index b5e25d8f6..eab50c625 100644
--- a/packages/compiler-vapor/src/generators/expression.ts
+++ b/packages/compiler-vapor/src/generators/expression.ts
@@ -300,7 +300,7 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
registerVariable(name, exp, true)
})
registerVariable(memberExp, exp, false)
- } else if (!parentStack.find(isMemberExpression)) {
+ } else if (!parentStack.some(isMemberExpression)) {
registerVariable(currentNode.name, exp, true)
}
})
From 97254c344aa1afc755228d870f67905033ecac6a Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 29 Apr 2025 16:37:39 +0800
Subject: [PATCH 18/36] chore: update snapshot
---
.../transforms/__snapshots__/vBind.spec.ts.snap | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
index 7e8072383..9ffac2fb9 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
@@ -97,17 +97,6 @@ export function render(_ctx) {
}"
`;
-exports[`cache multiple access > not cache variable with inline function 1`] = `
-"import { setDynamicProps as _setDynamicProps, renderEffect as _renderEffect, template as _template } from 'vue';
-const t0 = _template("", true)
-
-export function render(_ctx) {
- const n0 = t0()
- _renderEffect(() => _setDynamicProps(n0, [{ foo: bar => _ctx.foo = bar }], true))
- return n0
-}"
-`;
-
exports[`cache multiple access > object property chain access 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("")
From d1c4d84e962631417d71ace5b0b607f65fda8cd6 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 7 May 2025 15:34:00 +0800
Subject: [PATCH 19/36] feat(runtime-vapor): add normalizeNode to support
non-block nodes
---
.../runtime-vapor/__tests__/component.spec.ts | 26 +++++++++++--------
.../runtime-vapor/__tests__/dom/node.spec.ts | 25 ++++++++++++++++++
.../__tests__/errorHandling.spec.ts | 1 -
packages/runtime-vapor/src/component.ts | 23 ++++++----------
packages/runtime-vapor/src/dom/node.ts | 24 +++++++++++++++++
5 files changed, 72 insertions(+), 27 deletions(-)
create mode 100644 packages/runtime-vapor/__tests__/dom/node.spec.ts
diff --git a/packages/runtime-vapor/__tests__/component.spec.ts b/packages/runtime-vapor/__tests__/component.spec.ts
index 5fdff8eaf..e876d6961 100644
--- a/packages/runtime-vapor/__tests__/component.spec.ts
+++ b/packages/runtime-vapor/__tests__/component.spec.ts
@@ -306,25 +306,29 @@ describe('component', () => {
__DEV__ = true
})
- it('warn if functional vapor component not return a block', () => {
- define(() => {
- return () => {}
+ it('functional vapor component return a object', () => {
+ const { host } = define(() => {
+ return {}
}).render()
- expect(
- 'Functional vapor component must return a block directly',
- ).toHaveBeenWarned()
+ expect(host.textContent).toBe(`[object Object]`)
})
- it('warn if setup return a function and no render function', () => {
- define({
+ it('functional vapor component return a function', () => {
+ const { host } = define(() => {
+ return () => ({})
+ }).render()
+
+ expect(host.textContent).toBe(`() => ({})`)
+ })
+
+ it('setup return a function and no render function', () => {
+ const { host } = define({
setup() {
return () => []
},
}).render()
- expect(
- 'Vapor component setup() returned non-block value, and has no render function',
- ).toHaveBeenWarned()
+ expect(host.textContent).toBe(`() => []`)
})
})
diff --git a/packages/runtime-vapor/__tests__/dom/node.spec.ts b/packages/runtime-vapor/__tests__/dom/node.spec.ts
new file mode 100644
index 000000000..89995406d
--- /dev/null
+++ b/packages/runtime-vapor/__tests__/dom/node.spec.ts
@@ -0,0 +1,25 @@
+import { createTextNode, normalizeNode } from '../../src/dom/node'
+import { VaporFragment } from '../../src'
+
+describe('dom node', () => {
+ test('normalizeNode', () => {
+ // null / undefined -> Comment
+ expect(normalizeNode(null)).toBeInstanceOf(Comment)
+ expect(normalizeNode(undefined)).toBeInstanceOf(Comment)
+
+ // boolean -> Comment
+ expect(normalizeNode(true)).toBeInstanceOf(Comment)
+ expect(normalizeNode(false)).toBeInstanceOf(Comment)
+
+ // array -> Fragment
+ expect(normalizeNode(['foo'])).toBeInstanceOf(VaporFragment)
+
+ // VNode -> VNode
+ const vnode = createTextNode('div')
+ expect(normalizeNode(vnode)).toBe(vnode)
+
+ // primitive types
+ expect(normalizeNode('foo')).toMatchObject(createTextNode('foo'))
+ expect(normalizeNode(1)).toMatchObject(createTextNode('1'))
+ })
+})
diff --git a/packages/runtime-vapor/__tests__/errorHandling.spec.ts b/packages/runtime-vapor/__tests__/errorHandling.spec.ts
index 87a79614d..a8e55482a 100644
--- a/packages/runtime-vapor/__tests__/errorHandling.spec.ts
+++ b/packages/runtime-vapor/__tests__/errorHandling.spec.ts
@@ -182,7 +182,6 @@ describe('error handling', () => {
define(Comp).render()
expect(fn).toHaveBeenCalledWith(err, 'setup function')
- expect(`returned non-block value`).toHaveBeenWarned()
})
test('in render function', () => {
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..48f106cab 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -23,9 +23,8 @@ import {
simpleSetCurrentInstance,
startMeasure,
unregisterHMR,
- warn,
} from '@vue/runtime-dom'
-import { type Block, insert, isBlock, remove } from './block'
+import { type Block, insert, remove } from './block'
import {
type ShallowRef,
markRaw,
@@ -60,6 +59,7 @@ import {
import { hmrReload, hmrRerender } from './hmr'
import { isHydrating, locateHydrationNode } from './dom/hydration'
import { insertionAnchor, insertionParent } from './insertionState'
+import { normalizeNode } from './dom/node'
export { currentInstance } from '@vue/runtime-dom'
@@ -204,18 +204,12 @@ export function createComponent(
? callWithErrorHandling(setupFn, instance, ErrorCodes.SETUP_FUNCTION, [
instance.props,
instance,
- ]) || EMPTY_OBJ
- : EMPTY_OBJ
+ ]) || []
+ : []
- if (__DEV__ && !isBlock(setupResult)) {
- if (isFunction(component)) {
- warn(`Functional vapor component must return a block directly.`)
- instance.block = []
- } else if (!component.render) {
- warn(
- `Vapor component setup() returned non-block value, and has no render function.`,
- )
- instance.block = []
+ if (__DEV__) {
+ if (isFunction(component) || !component.render) {
+ instance.block = normalizeNode(setupResult)
} else {
instance.devtoolsRawSetupState = setupResult
// TODO make the proxy warn non-existent property access during dev
@@ -240,8 +234,7 @@ export function createComponent(
ErrorCodes.RENDER_FUNCTION,
)
} else {
- // in prod result can only be block
- instance.block = setupResult as Block
+ instance.block = normalizeNode(setupResult)
}
}
diff --git a/packages/runtime-vapor/src/dom/node.ts b/packages/runtime-vapor/src/dom/node.ts
index 83bc32c57..608aba627 100644
--- a/packages/runtime-vapor/src/dom/node.ts
+++ b/packages/runtime-vapor/src/dom/node.ts
@@ -1,3 +1,6 @@
+import { type Block, VaporFragment, isBlock } from '../block'
+import { isArray } from '@vue/shared'
+
/*! #__NO_SIDE_EFFECTS__ */
export function createTextNode(value = ''): Text {
return document.createTextNode(value)
@@ -27,3 +30,24 @@ export function nthChild(node: Node, i: number): Node {
export function next(node: Node): Node {
return node.nextSibling!
}
+
+type NodeChildAtom = Node | string | number | boolean | null | undefined | void
+
+export type NodeArrayChildren = Array
+
+export type NodeChild = NodeChildAtom | NodeArrayChildren
+
+export function normalizeNode(node: NodeChild): Block {
+ if (node == null || typeof node === 'boolean') {
+ // empty placeholder
+ return createComment('')
+ } else if (isArray(node) && node.length) {
+ // fragment
+ return new VaporFragment(node.map(normalizeNode))
+ } else if (isBlock(node)) {
+ return node
+ } else {
+ // strings and numbers
+ return createTextNode(String(node))
+ }
+}
From 26845461a39fba992bcd55016f0b216f9299b4f5 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 7 May 2025 15:57:45 +0800
Subject: [PATCH 20/36] chore: revert docs
---
packages/runtime-vapor/src/component.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 48f106cab..97677fbf6 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -234,6 +234,7 @@ export function createComponent(
ErrorCodes.RENDER_FUNCTION,
)
} else {
+ // in prod result can only be block
instance.block = normalizeNode(setupResult)
}
}
From 172df6a2f15f71a22e7b2a466bc6b0634aacb121 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Tue, 25 Mar 2025 10:40:01 +0800
Subject: [PATCH 21/36] feat(runtime-vapor): support HMR for setup
---
packages/runtime-vapor/src/component.ts | 55 ++++++++++++++++---------
1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..9d1beb7fb 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -182,6 +182,14 @@ export function createComponent(
appContext,
)
+ // HMR
+ if (__DEV__ && component.__hmrId) {
+ registerHMR(instance)
+ instance.isSingleRoot = isSingleRoot
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
+
if (__DEV__) {
pushWarningContext(instance)
startMeasure(instance, `init`)
@@ -221,14 +229,6 @@ export function createComponent(
// TODO make the proxy warn non-existent property access during dev
instance.setupState = proxyRefs(setupResult)
devRender(instance)
-
- // HMR
- if (component.__hmrId) {
- registerHMR(instance)
- instance.isSingleRoot = isSingleRoot
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
- }
}
} else {
// component has a render function but no setup function
@@ -283,18 +283,33 @@ export let isApplyingFallthroughProps = false
*/
export function devRender(instance: VaporComponentInstance): void {
instance.block =
- callWithErrorHandling(
- instance.type.render!,
- instance,
- ErrorCodes.RENDER_FUNCTION,
- [
- instance.setupState,
- instance.props,
- instance.emit,
- instance.attrs,
- instance.slots,
- ],
- ) || []
+ (instance.type.render
+ ? callWithErrorHandling(
+ instance.type.render,
+ instance,
+ ErrorCodes.RENDER_FUNCTION,
+ [
+ instance.setupState,
+ instance.props,
+ instance.emit,
+ instance.attrs,
+ instance.slots,
+ ],
+ )
+ : callWithErrorHandling(
+ isFunction(instance.type) ? instance.type : instance.type.setup!,
+ instance,
+ ErrorCodes.SETUP_FUNCTION,
+ [
+ instance.props,
+ {
+ slots: instance.slots,
+ attrs: instance.attrs,
+ emit: instance.emit,
+ expose: instance.expose,
+ },
+ ],
+ )) || []
}
const emptyContext: GenericAppContext = {
From 41ad10cbcd64f728c75b8bb0b199cbac4b7a2e37 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 26 Apr 2025 22:04:53 +0800
Subject: [PATCH 22/36] chore: revert
---
packages/runtime-vapor/src/component.ts | 55 +++++++++----------------
1 file changed, 20 insertions(+), 35 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 9d1beb7fb..548babebf 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -182,14 +182,6 @@ export function createComponent(
appContext,
)
- // HMR
- if (__DEV__ && component.__hmrId) {
- registerHMR(instance)
- instance.isSingleRoot = isSingleRoot
- instance.hmrRerender = hmrRerender.bind(null, instance)
- instance.hmrReload = hmrReload.bind(null, instance)
- }
-
if (__DEV__) {
pushWarningContext(instance)
startMeasure(instance, `init`)
@@ -229,6 +221,14 @@ export function createComponent(
// TODO make the proxy warn non-existent property access during dev
instance.setupState = proxyRefs(setupResult)
devRender(instance)
+
+ // HMR
+ if (component.__hmrId) {
+ registerHMR(instance)
+ instance.isSingleRoot = isSingleRoot
+ instance.hmrRerender = hmrRerender.bind(null, instance)
+ instance.hmrReload = hmrReload.bind(null, instance)
+ }
}
} else {
// component has a render function but no setup function
@@ -283,33 +283,18 @@ export let isApplyingFallthroughProps = false
*/
export function devRender(instance: VaporComponentInstance): void {
instance.block =
- (instance.type.render
- ? callWithErrorHandling(
- instance.type.render,
- instance,
- ErrorCodes.RENDER_FUNCTION,
- [
- instance.setupState,
- instance.props,
- instance.emit,
- instance.attrs,
- instance.slots,
- ],
- )
- : callWithErrorHandling(
- isFunction(instance.type) ? instance.type : instance.type.setup!,
- instance,
- ErrorCodes.SETUP_FUNCTION,
- [
- instance.props,
- {
- slots: instance.slots,
- attrs: instance.attrs,
- emit: instance.emit,
- expose: instance.expose,
- },
- ],
- )) || []
+ callWithErrorHandling(
+ instance.type.render!,
+ instance,
+ ErrorCodes.RENDER_FUNCTION,
+ [
+ instance.setupState,
+ instance.props,
+ instance.emit,
+ instance.attrs,
+ instance.slots,
+ ],
+ ) || []
}
const emptyContext: GenericAppContext = {
From 6550188fd5967573ec0bf805d2d1979ed95ea170 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 11 May 2025 09:57:49 +0800
Subject: [PATCH 23/36] chore: update deps
---
pnpm-lock.yaml | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8c6f99cae..7b393fa0b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1059,30 +1059,35 @@ packages:
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-arm64-glibc@2.4.1':
resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-arm64-musl@2.4.1':
resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@parcel/watcher-linux-x64-glibc@2.4.1':
resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@parcel/watcher-linux-x64-musl@2.4.1':
resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@parcel/watcher-win32-arm64@2.4.1':
resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==}
@@ -1215,56 +1220,67 @@ packages:
resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.38.0':
resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==}
cpu: [arm]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.38.0':
resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.38.0':
resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-loongarch64-gnu@4.38.0':
resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==}
cpu: [loong64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.38.0':
resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.38.0':
resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.38.0':
resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.38.0':
resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.38.0':
resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.38.0':
resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.38.0':
resolution: {integrity: sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==}
@@ -1304,24 +1320,28 @@ packages:
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@swc/core-linux-arm64-musl@1.11.13':
resolution: {integrity: sha512-+ukuB8RHD5BHPCUjQwuLP98z+VRfu+NkKQVBcLJGgp0/+w7y0IkaxLY/aKmrAS5ofCNEGqKL+AOVyRpX1aw+XA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@swc/core-linux-x64-gnu@1.11.13':
resolution: {integrity: sha512-q9H3WI3U3dfJ34tdv60zc8oTuWvSd5fOxytyAO9Pc5M82Hic3jjWaf2xBekUg07ubnMZpyfnv+MlD+EbUI3Llw==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@swc/core-linux-x64-musl@1.11.13':
resolution: {integrity: sha512-9aaZnnq2pLdTbAzTSzy/q8dr7Woy3aYIcQISmw1+Q2/xHJg5y80ZzbWSWKYca/hKonDMjIbGR6dp299I5J0aeA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@swc/core-win32-arm64-msvc@1.11.13':
resolution: {integrity: sha512-n3QZmDewkHANcoHvtwvA6yJbmS4XJf0MBMmwLZoKDZ2dOnC9D/jHiXw7JOohEuzYcpLoL5tgbqmjxa3XNo9Oow==}
@@ -1480,31 +1500,37 @@ packages:
resolution: {integrity: sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.3.3':
resolution: {integrity: sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.3.3':
resolution: {integrity: sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-s390x-gnu@1.3.3':
resolution: {integrity: sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.3.3':
resolution: {integrity: sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.3.3':
resolution: {integrity: sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.3.3':
resolution: {integrity: sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==}
@@ -7334,4 +7360,4 @@ snapshots:
yocto-queue@0.1.0: {}
- zod@3.24.1: {}
+ zod@3.24.1: {}
\ No newline at end of file
From 912b7dc22bf395337c945e3afc82ddbe8977b568 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 11 May 2025 09:58:57 +0800
Subject: [PATCH 24/36] chore: update deps
---
pnpm-lock.yaml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7b393fa0b..35d2d3eec 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7360,4 +7360,5 @@ snapshots:
yocto-queue@0.1.0: {}
- zod@3.24.1: {}
\ No newline at end of file
+ zod@3.24.1: {}
+
\ No newline at end of file
From bb083de70832b1b51ae2817a923f4d9aad1620d9 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 11 May 2025 10:11:40 +0800
Subject: [PATCH 25/36] chore: update deps
---
pnpm-lock.yaml | 1 -
1 file changed, 1 deletion(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 35d2d3eec..f0414906a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7361,4 +7361,3 @@ snapshots:
yocto-queue@0.1.0: {}
zod@3.24.1: {}
-
\ No newline at end of file
From f5caae03e3c14277aa7ab75a2eaf581b73a9d866 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 11 May 2025 17:01:56 +0800
Subject: [PATCH 26/36] feat(runtime-vapor): expose isVaporComponent
---
packages/runtime-vapor/src/index.ts | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/runtime-vapor/src/index.ts b/packages/runtime-vapor/src/index.ts
index 682532fa4..7a8aea5a0 100644
--- a/packages/runtime-vapor/src/index.ts
+++ b/packages/runtime-vapor/src/index.ts
@@ -7,7 +7,11 @@ export type { VaporDirective } from './directives/custom'
// compiler-use only
export { insert, prepend, remove, isFragment, VaporFragment } from './block'
export { setInsertionState } from './insertionState'
-export { createComponent, createComponentWithFallback } from './component'
+export {
+ createComponent,
+ createComponentWithFallback,
+ isVaporComponent,
+} from './component'
export { renderEffect } from './renderEffect'
export { createSlot } from './componentSlots'
export { template } from './dom/template'
From 08396b3833ecf52cf4b2a19da0a08bb329af921b Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 17 May 2025 16:47:48 +0800
Subject: [PATCH 27/36] fix(compiler-vapor): prevent process UpdateExpression
---
.../__snapshots__/expression.spec.ts.snap | 22 +++++++++++
.../__tests__/transforms/expression.spec.ts | 20 +++++++++-
.../src/generators/expression.ts | 39 ++++++++++++++++---
3 files changed, 73 insertions(+), 8 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/expression.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/expression.spec.ts.snap
index 518c2a5fe..454e50e9c 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/expression.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/expression.spec.ts.snap
@@ -32,3 +32,25 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
return n0
}"
`;
+
+exports[`compiler: expression > update expression 1`] = `
+"import { child as _child, toDisplayString as _toDisplayString, setText as _setText, setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
+const t0 = _template("
", true)
+
+export function render(_ctx) {
+ const n1 = t0()
+ const n0 = _child(n1)
+ const x1 = _child(n1)
+ _renderEffect(() => {
+ const _String = String
+ const _foo = _ctx.foo
+
+ _setText(n0, _toDisplayString(_String(_foo.id++)) + " " + _toDisplayString(_foo) + " " + _toDisplayString(_ctx.bar))
+ _setText(x1, _toDisplayString(_String(_foo.id++)) + " " + _toDisplayString(_foo) + " " + _toDisplayString(_ctx.bar))
+ _setProp(n1, "id", _String(_foo.id++))
+ _setProp(n1, "foo", _foo)
+ _setProp(n1, "bar", _ctx.bar++)
+ })
+ return n1
+}"
+`;
diff --git a/packages/compiler-vapor/__tests__/transforms/expression.spec.ts b/packages/compiler-vapor/__tests__/transforms/expression.spec.ts
index c97decd9d..5983bde67 100644
--- a/packages/compiler-vapor/__tests__/transforms/expression.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/expression.spec.ts
@@ -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(`
+
+ {{ String(foo.id++) }} {{ foo }} {{ bar }}
+
+ `)
+ expect(code).toMatchSnapshot()
+ expect(code).contains(`_String(_foo.id++)`)
+ })
})
diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts
index eab50c625..1baa85535 100644
--- a/packages/compiler-vapor/src/generators/expression.ts
+++ b/packages/compiler-vapor/src/generators/expression.ts
@@ -244,8 +244,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 +260,7 @@ export function processExpressions(
variableToExpMap,
expToVariableMap,
seenIdentifier,
+ updatedVariable,
)
// process duplicate expressions after identifier and member expression handling.
@@ -263,6 +269,8 @@ export function processExpressions(
context,
expressions,
varDeclarations,
+ updatedVariable,
+ expToVariableMap,
)
return genDeclarations([...varDeclarations, ...expDeclarations], context)
@@ -273,11 +281,13 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
const variableToExpMap = new Map>()
const expToVariableMap = new Map()
const seenIdentifier = new Set()
+ const updatedVariable = new Set()
const registerVariable = (
name: string,
exp: SimpleExpressionNode,
isIdentifier: boolean,
+ parentStack: Node[] = [],
) => {
if (isIdentifier) seenIdentifier.add(name)
seenVariable[name] = (seenVariable[name] || 0) + 1
@@ -286,6 +296,8 @@ 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'))
+ updatedVariable.add(name)
}
for (const exp of expressions) {
@@ -299,14 +311,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 +333,11 @@ function processRepeatedVariables(
variableToExpMap: Map>,
expToVariableMap: Map,
seenIdentifier: Set,
+ updatedVariable: Set,
): 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 +429,19 @@ function processRepeatedExpressions(
context: CodegenContext,
expressions: SimpleExpressionNode[],
varDeclarations: DeclarationValue[],
+ updatedVariable: Set,
+ expToVariableMap: Map,
): 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
From 38348081b3bd23f1a533e18eed9cb9c9d7adc700 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 21 May 2025 14:10:33 +0800
Subject: [PATCH 28/36] feat(vapor): add vapor flag for createVaporApp
---
packages/runtime-core/src/apiCreateApp.ts | 1 +
packages/runtime-vapor/src/apiCreateApp.ts | 1 +
2 files changed, 2 insertions(+)
diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts
index 5bdd204cf..205ac1d9a 100644
--- a/packages/runtime-core/src/apiCreateApp.ts
+++ b/packages/runtime-core/src/apiCreateApp.ts
@@ -35,6 +35,7 @@ import { ErrorCodes, callWithAsyncErrorHandling } from './errorHandling'
import type { DefineComponent } from './apiDefineComponent'
export interface App {
+ vapor?: boolean
version: string
config: AppConfig
diff --git a/packages/runtime-vapor/src/apiCreateApp.ts b/packages/runtime-vapor/src/apiCreateApp.ts
index 834437ee3..ee4c00c88 100644
--- a/packages/runtime-vapor/src/apiCreateApp.ts
+++ b/packages/runtime-vapor/src/apiCreateApp.ts
@@ -100,6 +100,7 @@ function postPrepareApp(app: App) {
)
}
+ app.vapor = true
const mount = app.mount
app.mount = (container, ...args: any[]) => {
container = normalizeContainer(container) as ParentNode
From 6dbc57ccec30d4dc33ab7f409f254d7915cd802f Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 21 May 2025 22:44:33 +0800
Subject: [PATCH 29/36] chore(compiler-vapor): use compiler-dom instead of
compiler-core
---
.../__tests__/transforms/transformElement.spec.ts | 2 +-
.../__tests__/transforms/transformSlotOutlet.spec.ts | 2 +-
packages/compiler-vapor/__tests__/transforms/vIf.spec.ts | 2 +-
packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts | 2 +-
packages/compiler-vapor/src/generators/component.ts | 2 +-
packages/compiler-vapor/src/generators/prop.ts | 2 +-
packages/compiler-vapor/src/transforms/transformSlotOutlet.ts | 2 +-
packages/compiler-vapor/src/transforms/vSlot.ts | 2 +-
8 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
index adaad182c..f0f5140db 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts
@@ -12,7 +12,7 @@ import {
type BindingMetadata,
BindingTypes,
NodeTypes,
-} from '@vue/compiler-core'
+} from '@vue/compiler-dom'
const compileWithElementTransform = makeCompile({
nodeTransforms: [transformElement, transformChildren, transformText],
diff --git a/packages/compiler-vapor/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformSlotOutlet.spec.ts
index 599351132..389c665a1 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformSlotOutlet.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformSlotOutlet.spec.ts
@@ -1,4 +1,4 @@
-import { ErrorCodes, NodeTypes } from '@vue/compiler-core'
+import { ErrorCodes, NodeTypes } from '@vue/compiler-dom'
import {
IRNodeTypes,
transformChildren,
diff --git a/packages/compiler-vapor/__tests__/transforms/vIf.spec.ts b/packages/compiler-vapor/__tests__/transforms/vIf.spec.ts
index 66cdf7b93..ab2902a2e 100644
--- a/packages/compiler-vapor/__tests__/transforms/vIf.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/vIf.spec.ts
@@ -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: [
diff --git a/packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts b/packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts
index 84ddb2e5d..8cb1a3ac4 100644
--- a/packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/vSlot.spec.ts
@@ -1,4 +1,4 @@
-import { ErrorCodes, NodeTypes } from '@vue/compiler-core'
+import { ErrorCodes, NodeTypes } from '@vue/compiler-dom'
import {
IRNodeTypes,
IRSlotType,
diff --git a/packages/compiler-vapor/src/generators/component.ts b/packages/compiler-vapor/src/generators/component.ts
index 7c232db75..10705a2c7 100644
--- a/packages/compiler-vapor/src/generators/component.ts
+++ b/packages/compiler-vapor/src/generators/component.ts
@@ -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'
diff --git a/packages/compiler-vapor/src/generators/prop.ts b/packages/compiler-vapor/src/generators/prop.ts
index 62fca087e..42f063331 100644
--- a/packages/compiler-vapor/src/generators/prop.ts
+++ b/packages/compiler-vapor/src/generators/prop.ts
@@ -2,7 +2,7 @@ import {
NewlineType,
type SimpleExpressionNode,
isSimpleIdentifier,
-} from '@vue/compiler-core'
+} from '@vue/compiler-dom'
import type { CodegenContext } from '../generate'
import {
IRDynamicPropsKind,
diff --git a/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts b/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts
index 83b4aa2d2..e76fcdde6 100644
--- a/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts
+++ b/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts
@@ -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,
diff --git a/packages/compiler-vapor/src/transforms/vSlot.ts b/packages/compiler-vapor/src/transforms/vSlot.ts
index d1bf1c6b0..4eca2ff0e 100644
--- a/packages/compiler-vapor/src/transforms/vSlot.ts
+++ b/packages/compiler-vapor/src/transforms/vSlot.ts
@@ -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 {
From 84f9f5effcfaa4edf044940dce7eed2fc58cd2fe Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Wed, 21 May 2025 23:05:40 +0800
Subject: [PATCH 30/36] chore: revert #13016
---
packages/compiler-core/src/babelUtils.ts | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts
index 342050dc4..6ede6bd03 100644
--- a/packages/compiler-core/src/babelUtils.ts
+++ b/packages/compiler-core/src/babelUtils.ts
@@ -30,6 +30,10 @@ export function walkIdentifiers(
parentStack: Node[] = [],
knownIds: Record = Object.create(null),
): void {
+ if (__BROWSER__) {
+ return
+ }
+
const rootExp =
root.type === 'Program'
? root.body[0].type === 'ExpressionStatement' && root.body[0].expression
@@ -106,6 +110,10 @@ export function isReferencedIdentifier(
parent: Node | null,
parentStack: Node[],
): boolean {
+ if (__BROWSER__) {
+ return false
+ }
+
if (!parent) {
return true
}
From 61fb892a1446280dc2c625b2fad9b98543f10f98 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Mon, 26 May 2025 09:02:53 +0800
Subject: [PATCH 31/36] fix: prevent AssignmentExpression
---
.../__snapshots__/transformTemplateRef.spec.ts.snap | 9 ++++++++-
.../transforms/transformTemplateRef.spec.ts | 13 ++++++++++---
.../compiler-vapor/src/generators/expression.ts | 7 ++++++-
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
index 4a691056a..cb520a4b2 100644
--- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
+++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformTemplateRef.spec.ts.snap
@@ -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
}"
`;
diff --git a/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
index f026675e4..b6bc479a0 100644
--- a/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
+++ b/packages/compiler-vapor/__tests__/transforms/transformTemplateRef.spec.ts
@@ -83,7 +83,11 @@ describe('compiler: template ref transform', () => {
test('function ref', () => {
const { ir, code } = compileWithTransformRef(
- ``,
+ ``,
)
expect(ir.block.dynamic.children[0]).toMatchObject({
id: 0,
@@ -103,7 +107,6 @@ describe('compiler: template ref transform', () => {
type: IRNodeTypes.SET_TEMPLATE_REF,
element: 0,
value: {
- content: 'bar => foo = bar',
isStatic: false,
},
},
@@ -112,7 +115,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', () => {
diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts
index 1baa85535..76b04f58d 100644
--- a/packages/compiler-vapor/src/generators/expression.ts
+++ b/packages/compiler-vapor/src/generators/expression.ts
@@ -296,8 +296,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'))
+ if (
+ parentStack.some(
+ p => p.type === 'UpdateExpression' || p.type === 'AssignmentExpression',
+ )
+ ) {
updatedVariable.add(name)
+ }
}
for (const exp of expressions) {
From 7874664d298413c6a9f9037b15bf6f11aab358bb Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Mon, 26 May 2025 09:06:29 +0800
Subject: [PATCH 32/36] feat: support browser for walkIdentifiers
---
packages/compiler-core/src/babelUtils.ts | 8 --------
1 file changed, 8 deletions(-)
diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts
index 6ede6bd03..342050dc4 100644
--- a/packages/compiler-core/src/babelUtils.ts
+++ b/packages/compiler-core/src/babelUtils.ts
@@ -30,10 +30,6 @@ export function walkIdentifiers(
parentStack: Node[] = [],
knownIds: Record = Object.create(null),
): void {
- if (__BROWSER__) {
- return
- }
-
const rootExp =
root.type === 'Program'
? root.body[0].type === 'ExpressionStatement' && root.body[0].expression
@@ -110,10 +106,6 @@ export function isReferencedIdentifier(
parent: Node | null,
parentStack: Node[],
): boolean {
- if (__BROWSER__) {
- return false
- }
-
if (!parent) {
return true
}
From 398c16f05ef0e492b1b038a1b5ad82ba8cea0dc3 Mon Sep 17 00:00:00 2001
From: daiwei
Date: Mon, 26 May 2025 14:11:04 +0800
Subject: [PATCH 33/36] fix(vapor): special handling vapor props in vdom
interop
---
packages-private/vapor-e2e-test/interop/VaporComp.vue | 5 +++--
packages/runtime-vapor/src/vdomInterop.ts | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/packages-private/vapor-e2e-test/interop/VaporComp.vue b/packages-private/vapor-e2e-test/interop/VaporComp.vue
index 88a60c782..f01565449 100644
--- a/packages-private/vapor-e2e-test/interop/VaporComp.vue
+++ b/packages-private/vapor-e2e-test/interop/VaporComp.vue
@@ -27,7 +27,8 @@ const slotProp = ref('slot prop')
change slot prop
- #default:
+ #default:
+
#test:
fallback content
@@ -40,7 +41,7 @@ const slotProp = ref('slot prop')
>
Toggle default slot to vdom
-
+
slot prop: {{ foo }}
component prop: {{ msg }}
diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts
index 77228fd72..31f462e94 100644
--- a/packages/runtime-vapor/src/vdomInterop.ts
+++ b/packages/runtime-vapor/src/vdomInterop.ts
@@ -151,7 +151,7 @@ function createVDOMComponent(
const frag = new VaporFragment([])
const vnode = createVNode(
component,
- rawProps && new Proxy(rawProps, rawPropsProxyHandlers),
+ rawProps && extend({}, new Proxy(rawProps, rawPropsProxyHandlers)),
)
const wrapper = new VaporComponentInstance(
{ props: component.props },
From d2c6e2d5b596aa1af4ca8b55565fe2ae6ce9827b Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Mon, 26 May 2025 20:08:55 +0800
Subject: [PATCH 34/36] fix(runtime-vapor): prevent mounting functional
components as virtual DOM
---
packages/runtime-vapor/src/component.ts | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts
index 548babebf..00120eba6 100644
--- a/packages/runtime-vapor/src/component.ts
+++ b/packages/runtime-vapor/src/component.ts
@@ -144,8 +144,9 @@ export function createComponent(
locateHydrationNode()
}
+ const isFnComponent = isFunction(component)
// vdom interop enabled and component is not an explicit vapor component
- if (appContext.vapor && !component.__vapor) {
+ if (appContext.vapor && !isFnComponent && !component.__vapor) {
const frag = appContext.vapor.vdomMount(
component as any,
rawProps,
@@ -199,7 +200,7 @@ export function createComponent(
setupPropsValidation(instance)
}
- const setupFn = isFunction(component) ? component : component.setup
+ const setupFn = isFnComponent ? component : component.setup
const setupResult = setupFn
? callWithErrorHandling(setupFn, instance, ErrorCodes.SETUP_FUNCTION, [
instance.props,
@@ -208,7 +209,7 @@ export function createComponent(
: EMPTY_OBJ
if (__DEV__ && !isBlock(setupResult)) {
- if (isFunction(component)) {
+ if (isFnComponent) {
warn(`Functional vapor component must return a block directly.`)
instance.block = []
} else if (!component.render) {
From 7d84f7d85f9694f34a86afa8053966936aaaab42 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Thu, 29 May 2025 11:40:09 +0800
Subject: [PATCH 35/36] feat(runtime-core): add generic option for
getCurrentInstance
---
.../src/componentCurrentInstance.ts | 21 ++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/packages/runtime-core/src/componentCurrentInstance.ts b/packages/runtime-core/src/componentCurrentInstance.ts
index c091b9c69..22e55610b 100644
--- a/packages/runtime-core/src/componentCurrentInstance.ts
+++ b/packages/runtime-core/src/componentCurrentInstance.ts
@@ -16,10 +16,25 @@ export let currentInstance: GenericComponentInstance | null = null
export const getCurrentGenericInstance: () => GenericComponentInstance | null =
() => currentInstance || currentRenderingInstance
-export const getCurrentInstance: () => ComponentInternalInstance | null = () =>
- currentInstance && !currentInstance.vapor
- ? (currentInstance as ComponentInternalInstance)
+/**
+ * Retrieves the current component instance.
+ *
+ * @param generic - A boolean flag indicating whether to return a generic component instance.
+ * If `true`, returns a `GenericComponentInstance` including vapor instance.
+ * If `false` or unset, returns a `ComponentInternalInstance` if available.
+ * @returns The current component instance, or `null` if no instance is active.
+ */
+export function getCurrentInstance(
+ generic: true,
+): GenericComponentInstance | null
+export function getCurrentInstance(
+ generic?: boolean,
+): ComponentInternalInstance | null
+export function getCurrentInstance(generic?: boolean) {
+ return currentInstance && (generic || !currentInstance.vapor)
+ ? currentInstance
: currentRenderingInstance
+}
export let isInSSRComponentSetup = false
From 280bc48e41f8844f9732fa3f35bac77c5b011d13 Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 31 May 2025 09:38:12 +0800
Subject: [PATCH 36/36] chore: remove pauseTracking
---
packages/runtime-core/src/index.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts
index d90895e6a..e309554f2 100644
--- a/packages/runtime-core/src/index.ts
+++ b/packages/runtime-core/src/index.ts
@@ -30,8 +30,6 @@ export {
stop,
getCurrentWatcher,
onWatcherCleanup,
- pauseTracking,
- resetTracking,
ReactiveEffect,
// effect scope
effectScope,