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 - +