From 4fa8da8576717c619e1e8c04d19038488c75fbea Mon Sep 17 00:00:00 2001 From: edison Date: Fri, 19 May 2023 07:45:28 +0800 Subject: [PATCH 001/128] fix(compiler-sfc): support resolve multiple re-export /w same source type name (#8365) close #8364 --- .../compileScript/resolveType.spec.ts | 19 +++++++++++++++++++ .../compiler-sfc/src/script/resolveType.ts | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index f671541977b..85d67e01cb8 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -615,6 +615,25 @@ describe('resolveType', () => { expect(deps && [...deps]).toStrictEqual(Object.keys(files)) }) + test('relative (re-export /w same source type name)', () => { + const files = { + '/foo.ts': `export default interface P { foo: string }`, + '/bar.ts': `export default interface PP { bar: number }`, + '/baz.ts': `export { default as X } from './foo'; export { default as XX } from './bar'; ` + } + const { props, deps } = resolve( + `import { X, XX } from './baz' + defineProps() + `, + files + ) + expect(props).toStrictEqual({ + foo: ['String'], + bar: ['Number'] + }) + expect(deps && [...deps]).toStrictEqual(['/baz.ts', '/foo.ts', '/bar.ts']) + }) + test('relative (dynamic import)', () => { const files = { '/foo.ts': `export type P = { foo: string, bar: import('./bar').N }`, diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index f4e1915255e..b2e47b08bea 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1117,7 +1117,7 @@ function recordTypes( const exported = getId(spec.exported) if (stmt.source) { // re-export, register an import + export as a type reference - imports[local] = { + imports[exported] = { source: stmt.source.value, imported: local } From 702711e771a90e52e8ffa3c3051fd114c71003da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 19 May 2023 07:46:39 +0800 Subject: [PATCH 002/128] chore(compiler-sfc): break in switch statement (#8347) --- packages/compiler-sfc/src/script/resolveType.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index b2e47b08bea..d30150a82d5 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -225,13 +225,16 @@ function innerResolveTypeElements( if (resolved) { return resolveTypeElements(ctx, resolved, resolved._ownerScope) } + break } - case 'TSTypeQuery': { - const resolved = resolveTypeReference(ctx, node, scope) - if (resolved) { - return resolveTypeElements(ctx, resolved, resolved._ownerScope) + case 'TSTypeQuery': + { + const resolved = resolveTypeReference(ctx, node, scope) + if (resolved) { + return resolveTypeElements(ctx, resolved, resolved._ownerScope) + } } - } + break } return ctx.error(`Unresolvable type: ${node.type}`, node, scope) } From 5ddeb45e82ad3bd930a8289bbdfec11abb28d56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 19 May 2023 07:47:23 +0800 Subject: [PATCH 003/128] chore: remove unused imports (#8327) --- packages/vue/jsx-runtime/index.d.ts | 7 +------ packages/vue/jsx.d.ts | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/vue/jsx-runtime/index.d.ts b/packages/vue/jsx-runtime/index.d.ts index a44382cfbb1..9d022dd0c05 100644 --- a/packages/vue/jsx-runtime/index.d.ts +++ b/packages/vue/jsx-runtime/index.d.ts @@ -1,9 +1,4 @@ -import type { - VNode, - IntrinsicElementAttributes, - ReservedProps, - NativeElements -} from '@vue/runtime-dom' +import type { VNode, ReservedProps, NativeElements } from '@vue/runtime-dom' /** * JSX namespace for usage with @jsxImportsSource directive diff --git a/packages/vue/jsx.d.ts b/packages/vue/jsx.d.ts index afc1039e46d..cec81c564d4 100644 --- a/packages/vue/jsx.d.ts +++ b/packages/vue/jsx.d.ts @@ -1,11 +1,6 @@ // global JSX namespace registration // somehow we have to copy=pase the jsx-runtime types here to make TypeScript happy -import type { - VNode, - IntrinsicElementAttributes, - ReservedProps, - NativeElements -} from '@vue/runtime-dom' +import type { VNode, ReservedProps, NativeElements } from '@vue/runtime-dom' declare global { namespace JSX { From 3798c5480b8ed186a279d21d3abe95d400cdbaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 19 May 2023 07:49:28 +0800 Subject: [PATCH 004/128] chore: remove unnecessary type assertions (#8311) --- packages/reactivity/src/ref.ts | 14 +++++++------- packages/runtime-core/src/apiAsyncComponent.ts | 4 ++-- packages/runtime-core/src/apiComputed.ts | 7 +++++-- packages/runtime-core/src/apiCreateApp.ts | 5 +---- packages/runtime-core/src/apiWatch.ts | 9 +++------ packages/runtime-core/src/component.ts | 2 +- packages/runtime-core/src/componentEmits.ts | 2 +- packages/runtime-core/src/componentOptions.ts | 4 ++-- .../runtime-core/src/componentPublicInstance.ts | 2 +- packages/runtime-core/src/hmr.ts | 2 +- 10 files changed, 24 insertions(+), 27 deletions(-) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index a5224d7f281..60de3ae2028 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -440,15 +440,15 @@ export function toRef( } } -function propertyToRef(source: object, key: string, defaultValue?: unknown) { - const val = (source as any)[key] +function propertyToRef( + source: Record, + key: string, + defaultValue?: unknown +) { + const val = source[key] return isRef(val) ? val - : (new ObjectRefImpl( - source as Record, - key, - defaultValue - ) as any) + : (new ObjectRefImpl(source, key, defaultValue) as any) } // corner case when use narrows type diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index 09a857bc08b..bd878a49442 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -198,11 +198,11 @@ export function defineAsyncComponent< if (loaded.value && resolvedComp) { return createInnerComp(resolvedComp, instance) } else if (error.value && errorComponent) { - return createVNode(errorComponent as ConcreteComponent, { + return createVNode(errorComponent, { error: error.value }) } else if (loadingComponent && !delayed.value) { - return createVNode(loadingComponent as ConcreteComponent) + return createVNode(loadingComponent) } } } diff --git a/packages/runtime-core/src/apiComputed.ts b/packages/runtime-core/src/apiComputed.ts index 3804531bd44..1cd9c2ec218 100644 --- a/packages/runtime-core/src/apiComputed.ts +++ b/packages/runtime-core/src/apiComputed.ts @@ -1,7 +1,10 @@ import { computed as _computed } from '@vue/reactivity' import { isInSSRComponentSetup } from './component' -export const computed = ((getterOrOptions: any, debugOptions?: any) => { +export const computed: typeof _computed = ( + getterOrOptions: any, + debugOptions?: any +) => { // @ts-ignore return _computed(getterOrOptions, debugOptions, isInSSRComponentSetup) -}) as typeof _computed +} diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 15f7766f323..ec45611ddf8 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -330,10 +330,7 @@ export function createAppAPI( ` you need to unmount the previous app by calling \`app.unmount()\` first.` ) } - const vnode = createVNode( - rootComponent as ConcreteComponent, - rootProps - ) + const vnode = createVNode(rootComponent, rootProps) // store app context on the root VNode. // this will be set on the root instance on initial mount. vnode.appContext = context diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 631299fdc57..1b85ba12d19 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -43,7 +43,6 @@ import { DeprecationTypes } from './compat/compatConfig' import { checkCompatEnabled, isCompatEnabled } from './compat/compatConfig' import { ObjectWatchOptionItem } from './componentOptions' import { useSSRContext } from '@vue/runtime-core' -import { SSRContext } from '@vue/server-renderer' export type WatchEffect = (onCleanup: OnCleanup) => void @@ -297,7 +296,7 @@ function doWatch( ]) } if (flush === 'sync') { - const ctx = useSSRContext() as SSRContext + const ctx = useSSRContext()! ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []) } else { return NOOP @@ -318,9 +317,7 @@ function doWatch( deep || forceTrigger || (isMultiSource - ? (newValue as any[]).some((v, i) => - hasChanged(v, (oldValue as any[])[i]) - ) + ? (newValue as any[]).some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || (__COMPAT__ && isArray(newValue) && @@ -461,7 +458,7 @@ export function traverse(value: unknown, seen?: Set) { }) } else if (isPlainObject(value)) { for (const key in value) { - traverse((value as any)[key], seen) + traverse(value[key], seen) } } return value diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 33229630e49..7048dc07685 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -161,7 +161,7 @@ export type ConcreteComponent< M extends MethodOptions = MethodOptions > = | ComponentOptions - | FunctionalComponent + | FunctionalComponent /** * A type used in public APIs where a component type is expected. diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index 7568741e24e..1bf122541d6 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -173,7 +173,7 @@ export function emit( const onceHandler = props[handlerName + `Once`] if (onceHandler) { if (!instance.emitted) { - instance.emitted = {} as Record + instance.emitted = {} } else if (instance.emitted[handlerName]) { return } diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 52768659635..de4d304448a 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -809,7 +809,7 @@ export function applyOptions(instance: ComponentInternalInstance) { if (isArray(hook)) { hook.forEach(_hook => register(_hook.bind(publicThis))) } else if (hook) { - register((hook as Function).bind(publicThis)) + register(hook.bind(publicThis)) } } @@ -885,7 +885,7 @@ export function resolveInjections( injectOptions = normalizeInject(injectOptions)! } for (const key in injectOptions) { - const opt = (injectOptions as ObjectInjectOptions)[key] + const opt = injectOptions[key] let injected: unknown if (isObject(opt)) { if ('default' in opt) { diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 79bcedda759..78a9acd147f 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -105,7 +105,7 @@ type ExtractMixin = { }[T extends ComponentOptionsMixin ? 'Mixin' : never] export type IntersectionMixin = IsDefaultMixinComponent extends true - ? OptionTypesType<{}, {}, {}, {}, {}> + ? OptionTypesType : UnionToIntersection> export type UnwrapMixinsType< diff --git a/packages/runtime-core/src/hmr.ts b/packages/runtime-core/src/hmr.ts index fe8ca132bc8..1ce66a3da1e 100644 --- a/packages/runtime-core/src/hmr.ts +++ b/packages/runtime-core/src/hmr.ts @@ -168,7 +168,7 @@ function updateComponentDef( extend(oldComp, newComp) for (const key in oldComp) { if (key !== '__file' && !(key in newComp)) { - delete (oldComp as any)[key] + delete oldComp[key] } } } From b01fc7ea848eea5f0e3a7aee3c0e31a79cd9a58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Fri, 19 May 2023 07:54:12 +0800 Subject: [PATCH 005/128] chore: remove unnecessary imports (#8262) --- packages/compiler-core/__tests__/parse.spec.ts | 1 - packages/compiler-core/__tests__/transform.spec.ts | 1 - .../compiler-core/__tests__/transforms/transformElement.spec.ts | 1 - .../__tests__/transforms/transformExpressions.spec.ts | 1 - .../__tests__/transforms/transformSlotOutlet.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vBind.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vFor.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vIf.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vModel.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vOn.spec.ts | 1 - packages/compiler-core/__tests__/transforms/vSlot.spec.ts | 1 - packages/compiler-dom/__tests__/transforms/Transition.spec.ts | 1 - packages/compiler-dom/__tests__/transforms/vHtml.spec.ts | 1 - packages/compiler-dom/__tests__/transforms/vModel.spec.ts | 1 - packages/compiler-dom/__tests__/transforms/vShow.spec.ts | 1 - packages/compiler-dom/__tests__/transforms/vText.spec.ts | 1 - packages/reactivity/__tests__/collections/Map.spec.ts | 1 - packages/reactivity/__tests__/collections/Set.spec.ts | 1 - packages/reactivity/__tests__/collections/WeakMap.spec.ts | 1 - packages/reactivity/__tests__/collections/WeakSet.spec.ts | 1 - packages/reactivity/__tests__/computed.spec.ts | 1 - packages/reactivity/__tests__/deferredComputed.spec.ts | 1 - packages/reactivity/__tests__/effect.spec.ts | 1 - packages/reactivity/__tests__/effectScope.spec.ts | 1 - packages/reactivity/__tests__/reactiveArray.spec.ts | 1 - packages/reactivity/__tests__/ref.spec.ts | 1 - packages/reactivity/__tests__/shallowReactive.spec.ts | 1 - packages/runtime-core/__tests__/apiAsyncComponent.spec.ts | 1 - packages/runtime-core/__tests__/apiCreateApp.spec.ts | 1 - packages/runtime-core/__tests__/apiLifecycle.spec.ts | 1 - packages/runtime-core/__tests__/apiSetupContext.spec.ts | 1 - packages/runtime-core/__tests__/apiSetupHelpers.spec.ts | 1 - packages/runtime-core/__tests__/apiWatch.spec.ts | 1 - packages/runtime-core/__tests__/componentEmits.spec.ts | 1 - packages/runtime-core/__tests__/componentProps.spec.ts | 2 +- packages/runtime-core/__tests__/componentPublicInstance.spec.ts | 1 - packages/runtime-core/__tests__/componentSlots.spec.ts | 1 - .../runtime-core/__tests__/components/BaseTransition.spec.ts | 1 - packages/runtime-core/__tests__/components/KeepAlive.spec.ts | 1 - packages/runtime-core/__tests__/components/Suspense.spec.ts | 2 +- packages/runtime-core/__tests__/components/Teleport.spec.ts | 2 +- packages/runtime-core/__tests__/directives.spec.ts | 1 - packages/runtime-core/__tests__/errorHandling.spec.ts | 1 - packages/runtime-core/__tests__/hmr.spec.ts | 1 - packages/runtime-core/__tests__/hydration.spec.ts | 2 +- .../runtime-core/__tests__/rendererAttrsFallthrough.spec.ts | 2 +- packages/runtime-core/__tests__/rendererComponent.spec.ts | 1 - packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts | 1 - packages/runtime-core/__tests__/rendererTemplateRef.spec.ts | 1 - packages/runtime-core/__tests__/scheduler.spec.ts | 1 - packages/runtime-core/__tests__/vnode.spec.ts | 1 - packages/runtime-core/__tests__/vnodeHooks.spec.ts | 1 - packages/runtime-dom/__tests__/createApp.spec.ts | 1 - packages/runtime-dom/__tests__/customElement.spec.ts | 1 - packages/runtime-dom/__tests__/directives/vModel.spec.ts | 1 - packages/runtime-dom/__tests__/directives/vOn.spec.ts | 1 - packages/runtime-dom/__tests__/patchEvents.spec.ts | 1 - packages/runtime-dom/__tests__/patchProps.spec.ts | 1 - packages/runtime-dom/__tests__/patchStyle.spec.ts | 1 - packages/server-renderer/__tests__/render.spec.ts | 1 - packages/server-renderer/__tests__/ssrComputed.spec.ts | 1 - packages/server-renderer/__tests__/ssrSuspense.spec.ts | 1 - packages/vue-compat/__tests__/compiler.spec.ts | 1 - packages/vue-compat/__tests__/globalConfig.spec.ts | 1 - packages/vue-compat/__tests__/misc.spec.ts | 1 - packages/vue-compat/__tests__/options.spec.ts | 1 - packages/vue/__tests__/customElementCasing.spec.ts | 1 - packages/vue/__tests__/e2e/Transition.spec.ts | 1 - packages/vue/__tests__/e2e/TransitionGroup.spec.ts | 1 - packages/vue/__tests__/index.spec.ts | 1 - 70 files changed, 5 insertions(+), 70 deletions(-) diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index 7a32f21a00a..8db4eeb8acb 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ParserOptions } from '../src/options' import { baseParse, TextModes } from '../src/parse' import { ErrorCodes } from '../src/errors' diff --git a/packages/compiler-core/__tests__/transform.spec.ts b/packages/compiler-core/__tests__/transform.spec.ts index 915ae7a60cd..042865efb4e 100644 --- a/packages/compiler-core/__tests__/transform.spec.ts +++ b/packages/compiler-core/__tests__/transform.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse } from '../src/parse' import { transform, NodeTransform } from '../src/transform' import { diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index 335a30704ad..a1ae013a830 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { CompilerOptions, baseParse as parse, diff --git a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts index 7614bc0f386..686794c23ab 100644 --- a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts index e3863f1edf9..72753d5237f 100644 --- a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { CompilerOptions, baseParse as parse, diff --git a/packages/compiler-core/__tests__/transforms/vBind.spec.ts b/packages/compiler-core/__tests__/transforms/vBind.spec.ts index ea5bdcf3d52..322cf9d1bde 100644 --- a/packages/compiler-core/__tests__/transforms/vBind.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vBind.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-core/__tests__/transforms/vFor.spec.ts b/packages/compiler-core/__tests__/transforms/vFor.spec.ts index b07272ef72b..1c7646e5e28 100644 --- a/packages/compiler-core/__tests__/transforms/vFor.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vFor.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse } from '../../src/parse' import { transform } from '../../src/transform' import { transformIf } from '../../src/transforms/vIf' diff --git a/packages/compiler-core/__tests__/transforms/vIf.spec.ts b/packages/compiler-core/__tests__/transforms/vIf.spec.ts index 1b42b20c7b8..5bc9bedd53b 100644 --- a/packages/compiler-core/__tests__/transforms/vIf.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vIf.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse } from '../../src/parse' import { transform } from '../../src/transform' import { transformIf } from '../../src/transforms/vIf' diff --git a/packages/compiler-core/__tests__/transforms/vModel.spec.ts b/packages/compiler-core/__tests__/transforms/vModel.spec.ts index df8f6e02416..ef3485fba05 100644 --- a/packages/compiler-core/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vModel.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index f61275b2f7f..218281ba762 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, CompilerOptions, diff --git a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts index d111aab6b4f..bb3d9d2cfa3 100644 --- a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { CompilerOptions, baseParse as parse, diff --git a/packages/compiler-dom/__tests__/transforms/Transition.spec.ts b/packages/compiler-dom/__tests__/transforms/Transition.spec.ts index 1711c1d2659..12eb280aa7b 100644 --- a/packages/compiler-dom/__tests__/transforms/Transition.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/Transition.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { compile } from '../../src' describe('Transition multi children warnings', () => { diff --git a/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts b/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts index 29478676857..af336523938 100644 --- a/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts index 75750a8ceb5..dce8f09b02c 100644 --- a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-dom/__tests__/transforms/vShow.spec.ts b/packages/compiler-dom/__tests__/transforms/vShow.spec.ts index 9fb53974deb..6d521c8e10d 100644 --- a/packages/compiler-dom/__tests__/transforms/vShow.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vShow.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/compiler-dom/__tests__/transforms/vText.spec.ts b/packages/compiler-dom/__tests__/transforms/vText.spec.ts index 5c500b31f1c..22db3ec05e2 100644 --- a/packages/compiler-dom/__tests__/transforms/vText.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vText.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { baseParse as parse, transform, diff --git a/packages/reactivity/__tests__/collections/Map.spec.ts b/packages/reactivity/__tests__/collections/Map.spec.ts index bac58134819..0cbe10fc201 100644 --- a/packages/reactivity/__tests__/collections/Map.spec.ts +++ b/packages/reactivity/__tests__/collections/Map.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { reactive, effect, toRaw, isReactive } from '../../src' describe('reactivity/collections', () => { diff --git a/packages/reactivity/__tests__/collections/Set.spec.ts b/packages/reactivity/__tests__/collections/Set.spec.ts index 1632d2175cc..ae74eb476ac 100644 --- a/packages/reactivity/__tests__/collections/Set.spec.ts +++ b/packages/reactivity/__tests__/collections/Set.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { reactive, effect, isReactive, toRaw } from '../../src' describe('reactivity/collections', () => { diff --git a/packages/reactivity/__tests__/collections/WeakMap.spec.ts b/packages/reactivity/__tests__/collections/WeakMap.spec.ts index b25306335d8..d7657a9f94c 100644 --- a/packages/reactivity/__tests__/collections/WeakMap.spec.ts +++ b/packages/reactivity/__tests__/collections/WeakMap.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { reactive, effect, toRaw, isReactive } from '../../src' describe('reactivity/collections', () => { diff --git a/packages/reactivity/__tests__/collections/WeakSet.spec.ts b/packages/reactivity/__tests__/collections/WeakSet.spec.ts index 5d3478f7b22..9ec30019756 100644 --- a/packages/reactivity/__tests__/collections/WeakSet.spec.ts +++ b/packages/reactivity/__tests__/collections/WeakSet.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { reactive, isReactive, effect, toRaw } from '../../src' describe('reactivity/collections', () => { diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 51157944355..055ad69cc7d 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { computed, reactive, diff --git a/packages/reactivity/__tests__/deferredComputed.spec.ts b/packages/reactivity/__tests__/deferredComputed.spec.ts index 51ee5a18be6..100f14ae358 100644 --- a/packages/reactivity/__tests__/deferredComputed.spec.ts +++ b/packages/reactivity/__tests__/deferredComputed.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { computed, deferredComputed, effect, ref } from '../src' describe('deferred computed', () => { diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 03509320782..69d24a76520 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, reactive, diff --git a/packages/reactivity/__tests__/effectScope.spec.ts b/packages/reactivity/__tests__/effectScope.spec.ts index a19aa0085fa..b26a90a09db 100644 --- a/packages/reactivity/__tests__/effectScope.spec.ts +++ b/packages/reactivity/__tests__/effectScope.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { nextTick, watch, watchEffect } from '@vue/runtime-core' import { reactive, diff --git a/packages/reactivity/__tests__/reactiveArray.spec.ts b/packages/reactivity/__tests__/reactiveArray.spec.ts index c76a0c94bec..808c5aa5529 100644 --- a/packages/reactivity/__tests__/reactiveArray.spec.ts +++ b/packages/reactivity/__tests__/reactiveArray.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { reactive, isReactive, toRaw } from '../src/reactive' import { ref, isRef } from '../src/ref' import { effect } from '../src/effect' diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 718b2bc61b8..b0ba9d9cb1c 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, effect, diff --git a/packages/reactivity/__tests__/shallowReactive.spec.ts b/packages/reactivity/__tests__/shallowReactive.spec.ts index 297f0dc33c9..bc49078029a 100644 --- a/packages/reactivity/__tests__/shallowReactive.spec.ts +++ b/packages/reactivity/__tests__/shallowReactive.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { isReactive, isShallow, diff --git a/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts b/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts index 9b37742a0d9..de9878b1181 100644 --- a/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts +++ b/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { defineAsyncComponent, h, diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts index 699d0be6d50..637167931d2 100644 --- a/packages/runtime-core/__tests__/apiCreateApp.spec.ts +++ b/packages/runtime-core/__tests__/apiCreateApp.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createApp, h, diff --git a/packages/runtime-core/__tests__/apiLifecycle.spec.ts b/packages/runtime-core/__tests__/apiLifecycle.spec.ts index 40cf0764453..b61632ae3fe 100644 --- a/packages/runtime-core/__tests__/apiLifecycle.spec.ts +++ b/packages/runtime-core/__tests__/apiLifecycle.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { onBeforeMount, h, diff --git a/packages/runtime-core/__tests__/apiSetupContext.spec.ts b/packages/runtime-core/__tests__/apiSetupContext.spec.ts index a7dbe3e03c0..e0ddd9c4da3 100644 --- a/packages/runtime-core/__tests__/apiSetupContext.spec.ts +++ b/packages/runtime-core/__tests__/apiSetupContext.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, reactive } from '@vue/reactivity' import { renderToString, diff --git a/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts b/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts index f15e03ff01f..e5bca1d9272 100644 --- a/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts +++ b/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ComponentInternalInstance, createApp, diff --git a/packages/runtime-core/__tests__/apiWatch.spec.ts b/packages/runtime-core/__tests__/apiWatch.spec.ts index 1b9f500da3c..21aae341021 100644 --- a/packages/runtime-core/__tests__/apiWatch.spec.ts +++ b/packages/runtime-core/__tests__/apiWatch.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { watch, watchEffect, diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index d8774b078b6..0019dd9eb97 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -1,7 +1,6 @@ // Note: emits and listener fallthrough is tested in // ./rendererAttrsFallthrough.spec.ts. -import { vi } from 'vitest' import { render, defineComponent, diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts index 071a24f138d..89112f2ad49 100644 --- a/packages/runtime-core/__tests__/componentProps.spec.ts +++ b/packages/runtime-core/__tests__/componentProps.spec.ts @@ -1,7 +1,7 @@ /** * @vitest-environment jsdom */ -import { vi } from 'vitest' + import { ComponentInternalInstance, getCurrentInstance, diff --git a/packages/runtime-core/__tests__/componentPublicInstance.spec.ts b/packages/runtime-core/__tests__/componentPublicInstance.spec.ts index 47605bfe2cc..4fe63861a7a 100644 --- a/packages/runtime-core/__tests__/componentPublicInstance.spec.ts +++ b/packages/runtime-core/__tests__/componentPublicInstance.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, render, diff --git a/packages/runtime-core/__tests__/componentSlots.spec.ts b/packages/runtime-core/__tests__/componentSlots.spec.ts index b5d00d06992..f08f1910cd4 100644 --- a/packages/runtime-core/__tests__/componentSlots.spec.ts +++ b/packages/runtime-core/__tests__/componentSlots.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, render, diff --git a/packages/runtime-core/__tests__/components/BaseTransition.spec.ts b/packages/runtime-core/__tests__/components/BaseTransition.spec.ts index 2622cf64bfe..f704025550b 100644 --- a/packages/runtime-core/__tests__/components/BaseTransition.spec.ts +++ b/packages/runtime-core/__tests__/components/BaseTransition.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { nodeOps, render, diff --git a/packages/runtime-core/__tests__/components/KeepAlive.spec.ts b/packages/runtime-core/__tests__/components/KeepAlive.spec.ts index 344fba156c3..ff8ea74b622 100644 --- a/packages/runtime-core/__tests__/components/KeepAlive.spec.ts +++ b/packages/runtime-core/__tests__/components/KeepAlive.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, TestElement, diff --git a/packages/runtime-core/__tests__/components/Suspense.spec.ts b/packages/runtime-core/__tests__/components/Suspense.spec.ts index 2942624dd10..065898048c3 100644 --- a/packages/runtime-core/__tests__/components/Suspense.spec.ts +++ b/packages/runtime-core/__tests__/components/Suspense.spec.ts @@ -1,7 +1,7 @@ /** * @vitest-environment jsdom */ -import { vi } from 'vitest' + import { h, ref, diff --git a/packages/runtime-core/__tests__/components/Teleport.spec.ts b/packages/runtime-core/__tests__/components/Teleport.spec.ts index 95fbf781671..57180ea139d 100644 --- a/packages/runtime-core/__tests__/components/Teleport.spec.ts +++ b/packages/runtime-core/__tests__/components/Teleport.spec.ts @@ -1,7 +1,7 @@ /** * @vitest-environment jsdom */ -import { vi } from 'vitest' + import { nodeOps, serializeInner, diff --git a/packages/runtime-core/__tests__/directives.spec.ts b/packages/runtime-core/__tests__/directives.spec.ts index 70578f94453..16aeb3ad4be 100644 --- a/packages/runtime-core/__tests__/directives.spec.ts +++ b/packages/runtime-core/__tests__/directives.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, withDirectives, diff --git a/packages/runtime-core/__tests__/errorHandling.spec.ts b/packages/runtime-core/__tests__/errorHandling.spec.ts index e3a2495f0f9..ebbfeb1d08e 100644 --- a/packages/runtime-core/__tests__/errorHandling.spec.ts +++ b/packages/runtime-core/__tests__/errorHandling.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { onMounted, onErrorCaptured, diff --git a/packages/runtime-core/__tests__/hmr.spec.ts b/packages/runtime-core/__tests__/hmr.spec.ts index b81a8b3af63..db713a3f276 100644 --- a/packages/runtime-core/__tests__/hmr.spec.ts +++ b/packages/runtime-core/__tests__/hmr.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { HMRRuntime } from '../src/hmr' import '../src/hmr' import { ComponentOptions, InternalRenderFunction } from '../src/component' diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index fece1a33f9d..d3cfd47c6be 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -1,7 +1,7 @@ /** * @vitest-environment jsdom */ -import { vi } from 'vitest' + import { createSSRApp, h, diff --git a/packages/runtime-core/__tests__/rendererAttrsFallthrough.spec.ts b/packages/runtime-core/__tests__/rendererAttrsFallthrough.spec.ts index 197e3f3acd1..1de05b67b44 100644 --- a/packages/runtime-core/__tests__/rendererAttrsFallthrough.spec.ts +++ b/packages/runtime-core/__tests__/rendererAttrsFallthrough.spec.ts @@ -2,7 +2,7 @@ * @vitest-environment jsdom */ // using DOM renderer because this case is mostly DOM-specific -import { vi } from 'vitest' + import { h, render, diff --git a/packages/runtime-core/__tests__/rendererComponent.spec.ts b/packages/runtime-core/__tests__/rendererComponent.spec.ts index 02d82376733..6f1d0288b21 100644 --- a/packages/runtime-core/__tests__/rendererComponent.spec.ts +++ b/packages/runtime-core/__tests__/rendererComponent.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, h, diff --git a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts index 492048173a4..c2073b966a7 100644 --- a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts +++ b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, Fragment, diff --git a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts index 74265939ed2..7d6279c5257 100644 --- a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts +++ b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { ref, nodeOps, diff --git a/packages/runtime-core/__tests__/scheduler.spec.ts b/packages/runtime-core/__tests__/scheduler.spec.ts index 48bc469716c..c06b9afb3e3 100644 --- a/packages/runtime-core/__tests__/scheduler.spec.ts +++ b/packages/runtime-core/__tests__/scheduler.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { queueJob, nextTick, diff --git a/packages/runtime-core/__tests__/vnode.spec.ts b/packages/runtime-core/__tests__/vnode.spec.ts index 130ea411b23..02774aafee4 100644 --- a/packages/runtime-core/__tests__/vnode.spec.ts +++ b/packages/runtime-core/__tests__/vnode.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createBlock, createVNode, diff --git a/packages/runtime-core/__tests__/vnodeHooks.spec.ts b/packages/runtime-core/__tests__/vnodeHooks.spec.ts index 4d6f4522738..15478bfd743 100644 --- a/packages/runtime-core/__tests__/vnodeHooks.spec.ts +++ b/packages/runtime-core/__tests__/vnodeHooks.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, render, diff --git a/packages/runtime-dom/__tests__/createApp.spec.ts b/packages/runtime-dom/__tests__/createApp.spec.ts index b8432f4723e..0857d7ab2c3 100644 --- a/packages/runtime-dom/__tests__/createApp.spec.ts +++ b/packages/runtime-dom/__tests__/createApp.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createApp, h } from '../src' describe('createApp for dom', () => { diff --git a/packages/runtime-dom/__tests__/customElement.spec.ts b/packages/runtime-dom/__tests__/customElement.spec.ts index 13f682c08eb..da3d1a3a557 100644 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { defineAsyncComponent, defineComponent, diff --git a/packages/runtime-dom/__tests__/directives/vModel.spec.ts b/packages/runtime-dom/__tests__/directives/vModel.spec.ts index eecbfcea777..73b8f18afc0 100644 --- a/packages/runtime-dom/__tests__/directives/vModel.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vModel.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { h, render, diff --git a/packages/runtime-dom/__tests__/directives/vOn.spec.ts b/packages/runtime-dom/__tests__/directives/vOn.spec.ts index 5a959a7eb42..8a608343d43 100644 --- a/packages/runtime-dom/__tests__/directives/vOn.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vOn.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { patchEvent } from '../../src/modules/events' import { withModifiers, withKeys } from '@vue/runtime-dom' diff --git a/packages/runtime-dom/__tests__/patchEvents.spec.ts b/packages/runtime-dom/__tests__/patchEvents.spec.ts index a207331ad56..d332977df96 100644 --- a/packages/runtime-dom/__tests__/patchEvents.spec.ts +++ b/packages/runtime-dom/__tests__/patchEvents.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { patchProp } from '../src/patchProp' const timeout = () => new Promise(r => setTimeout(r)) diff --git a/packages/runtime-dom/__tests__/patchProps.spec.ts b/packages/runtime-dom/__tests__/patchProps.spec.ts index 88cf916252b..bf6362e7a0c 100644 --- a/packages/runtime-dom/__tests__/patchProps.spec.ts +++ b/packages/runtime-dom/__tests__/patchProps.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { patchProp } from '../src/patchProp' import { render, h } from '../src' diff --git a/packages/runtime-dom/__tests__/patchStyle.spec.ts b/packages/runtime-dom/__tests__/patchStyle.spec.ts index 7c04cb6514a..eeb60fb7eac 100644 --- a/packages/runtime-dom/__tests__/patchStyle.spec.ts +++ b/packages/runtime-dom/__tests__/patchStyle.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { patchProp } from '../src/patchProp' describe(`runtime-dom: style patching`, () => { diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts index f18001a0ae4..b0c3a8236fe 100644 --- a/packages/server-renderer/__tests__/render.spec.ts +++ b/packages/server-renderer/__tests__/render.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createApp, h, diff --git a/packages/server-renderer/__tests__/ssrComputed.spec.ts b/packages/server-renderer/__tests__/ssrComputed.spec.ts index cbc2e4a5990..5c5850e006d 100644 --- a/packages/server-renderer/__tests__/ssrComputed.spec.ts +++ b/packages/server-renderer/__tests__/ssrComputed.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createSSRApp, defineComponent, h, computed, reactive } from 'vue' import { renderToString } from '../src/renderToString' diff --git a/packages/server-renderer/__tests__/ssrSuspense.spec.ts b/packages/server-renderer/__tests__/ssrSuspense.spec.ts index 0b31c4559f1..97984f61d94 100644 --- a/packages/server-renderer/__tests__/ssrSuspense.spec.ts +++ b/packages/server-renderer/__tests__/ssrSuspense.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createApp, h, Suspense } from 'vue' import { renderToString } from '../src/renderToString' diff --git a/packages/vue-compat/__tests__/compiler.spec.ts b/packages/vue-compat/__tests__/compiler.spec.ts index 88de3d20f3b..c20af972da2 100644 --- a/packages/vue-compat/__tests__/compiler.spec.ts +++ b/packages/vue-compat/__tests__/compiler.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import Vue from '@vue/compat' import { nextTick } from '@vue/runtime-core' import { CompilerDeprecationTypes } from '../../compiler-core/src' diff --git a/packages/vue-compat/__tests__/globalConfig.spec.ts b/packages/vue-compat/__tests__/globalConfig.spec.ts index 2a3adddba38..be7b87ea43c 100644 --- a/packages/vue-compat/__tests__/globalConfig.spec.ts +++ b/packages/vue-compat/__tests__/globalConfig.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import Vue from '@vue/compat' import { DeprecationTypes, diff --git a/packages/vue-compat/__tests__/misc.spec.ts b/packages/vue-compat/__tests__/misc.spec.ts index 5d16ae2907a..7c248e9ddd8 100644 --- a/packages/vue-compat/__tests__/misc.spec.ts +++ b/packages/vue-compat/__tests__/misc.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import Vue from '@vue/compat' import { nextTick } from '../../runtime-core/src/scheduler' import { diff --git a/packages/vue-compat/__tests__/options.spec.ts b/packages/vue-compat/__tests__/options.spec.ts index 75b5a440d3c..238f2e2d5ad 100644 --- a/packages/vue-compat/__tests__/options.spec.ts +++ b/packages/vue-compat/__tests__/options.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import Vue from '@vue/compat' import { nextTick } from '../../runtime-core/src/scheduler' import { diff --git a/packages/vue/__tests__/customElementCasing.spec.ts b/packages/vue/__tests__/customElementCasing.spec.ts index b08de351de1..cf3efd094e4 100644 --- a/packages/vue/__tests__/customElementCasing.spec.ts +++ b/packages/vue/__tests__/customElementCasing.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { createApp } from '../src' // https://github.com/vuejs/docs/pull/1890 diff --git a/packages/vue/__tests__/e2e/Transition.spec.ts b/packages/vue/__tests__/e2e/Transition.spec.ts index f283d82608c..50b3524fdb7 100644 --- a/packages/vue/__tests__/e2e/Transition.spec.ts +++ b/packages/vue/__tests__/e2e/Transition.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { E2E_TIMEOUT, setupPuppeteer } from './e2eUtils' import path from 'path' import { h, createApp, Transition, ref, nextTick } from 'vue' diff --git a/packages/vue/__tests__/e2e/TransitionGroup.spec.ts b/packages/vue/__tests__/e2e/TransitionGroup.spec.ts index a78f3912412..434735b5e9e 100644 --- a/packages/vue/__tests__/e2e/TransitionGroup.spec.ts +++ b/packages/vue/__tests__/e2e/TransitionGroup.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { E2E_TIMEOUT, setupPuppeteer } from './e2eUtils' import path from 'path' import { createApp, ref } from 'vue' diff --git a/packages/vue/__tests__/index.spec.ts b/packages/vue/__tests__/index.spec.ts index f11ea0f022c..d547627de54 100644 --- a/packages/vue/__tests__/index.spec.ts +++ b/packages/vue/__tests__/index.spec.ts @@ -1,4 +1,3 @@ -import { vi } from 'vitest' import { EMPTY_ARR } from '@vue/shared' import { createApp, ref, nextTick, reactive } from '../src' From f0691e4581f4ad6545bc5bfa42cb618c3d7b1aea Mon Sep 17 00:00:00 2001 From: Phentom Date: Fri, 19 May 2023 00:59:09 +0100 Subject: [PATCH 006/128] chore: typo (#8345) [ci skip] --- packages/runtime-core/src/apiSetupHelpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 76ad08cf63a..c00937981d9 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -236,7 +236,7 @@ export function defineSlots< * modelValue.value = "hello" * * // default model with options - * const modelValue = defineModel({ required: true }) + * const modelValue = defineModel({ required: true }) * * // with specified name (consumed via `v-model:count`) * const count = defineModel('count') From 372ec35482dbb80d7b6d39b129eb8db8af5286c3 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 19 May 2023 08:26:44 +0800 Subject: [PATCH 007/128] chore: mark reactivity transform apis as deprecated --- packages/compiler-sfc/src/index.ts | 2 ++ packages/reactivity-transform/src/reactivityTransform.ts | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/packages/compiler-sfc/src/index.ts b/packages/compiler-sfc/src/index.ts index 3821c255d52..76b4900d46d 100644 --- a/packages/compiler-sfc/src/index.ts +++ b/packages/compiler-sfc/src/index.ts @@ -7,6 +7,8 @@ export { compileStyle, compileStyleAsync } from './compileStyle' export { compileScript } from './compileScript' export { rewriteDefault, rewriteDefaultAST } from './rewriteDefault' export { resolveTypeElements, inferRuntimeType } from './script/resolveType' + +// TODO remove in 3.4 export { shouldTransform as shouldTransformRef, transform as transformRef, diff --git a/packages/reactivity-transform/src/reactivityTransform.ts b/packages/reactivity-transform/src/reactivityTransform.ts index 16cf88e5ac8..c0e2d1b6897 100644 --- a/packages/reactivity-transform/src/reactivityTransform.ts +++ b/packages/reactivity-transform/src/reactivityTransform.ts @@ -33,6 +33,9 @@ const IMPORT_SOURCE = 'vue/macros' const shorthands = ['ref', 'computed', 'shallowRef', 'toRef', 'customRef'] const transformCheckRE = /[^\w]\$(?:\$|ref|computed|shallowRef)?\s*(\(|\<)/ +/** + * @deprecated will be removed in 3.4 + */ export function shouldTransform(src: string): boolean { return transformCheckRE.test(src) } @@ -64,6 +67,9 @@ export interface ImportBinding { specifier: ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier } +/** + * @deprecated will be removed in 3.4 + */ export function transform( src: string, { @@ -112,6 +118,9 @@ export function transform( } } +/** + * @deprecated will be removed in 3.4 + */ export function transformAST( ast: Program, s: MagicString, From 020851e57d9a9f727c6ea07e9c1575430af02b73 Mon Sep 17 00:00:00 2001 From: Simon Johansson Date: Fri, 19 May 2023 03:09:21 +0200 Subject: [PATCH 008/128] fix(ssr): reset current instance if setting up options component errors (#7743) close #7733 --- packages/runtime-core/src/component.ts | 9 ++-- .../server-renderer/__tests__/render.spec.ts | 44 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 7048dc07685..e68a8560bff 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -903,9 +903,12 @@ export function finishComponentSetup( if (__FEATURE_OPTIONS_API__ && !(__COMPAT__ && skipOptions)) { setCurrentInstance(instance) pauseTracking() - applyOptions(instance) - resetTracking() - unsetCurrentInstance() + try { + applyOptions(instance) + } finally { + resetTracking() + unsetCurrentInstance() + } } // warn missing template/render diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts index b0c3a8236fe..0abaebf088e 100644 --- a/packages/server-renderer/__tests__/render.spec.ts +++ b/packages/server-renderer/__tests__/render.spec.ts @@ -793,6 +793,50 @@ function testRender(type: string, render: typeof renderToString) { } catch {} expect(getCurrentInstance()).toBe(prev) }) + + // #7733 + test('reset current instance after error in data', async () => { + const prev = getCurrentInstance() + expect(prev).toBe(null) + try { + await render( + createApp({ + data() { + throw new Error() + }, + template: `
hello
` + }) + ) + } catch {} + expect(getCurrentInstance()).toBe(null) + }) + }) + + // #7733 + test('reset current instance after error in errorCaptured', async () => { + const prev = getCurrentInstance() + + expect(prev).toBe(null) + + const Child = { + created() { + throw new Error() + } + } + try { + await render( + createApp({ + errorCaptured() { + throw new Error() + }, + render: () => h(Child) + }) + ) + } catch {} + expect( + 'Unhandled error during execution of errorCaptured hook' + ).toHaveBeenWarned() + expect(getCurrentInstance()).toBe(null) }) test('serverPrefetch', async () => { From a95e612b252ae59eaf56e0b8ddba66948d4ac20e Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 26 May 2023 11:07:13 -0500 Subject: [PATCH 009/128] chore: rename globals allow list close #8416 --- .../compiler-core/src/transforms/transformExpression.ts | 6 +++--- packages/runtime-core/src/componentPublicInstance.ts | 4 ++-- .../shared/src/{globalsWhitelist.ts => globalsAllowList.ts} | 4 ++-- packages/shared/src/index.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename packages/shared/src/{globalsWhitelist.ts => globalsAllowList.ts} (70%) diff --git a/packages/compiler-core/src/transforms/transformExpression.ts b/packages/compiler-core/src/transforms/transformExpression.ts index 3e75923d0d4..eab6b237f13 100644 --- a/packages/compiler-core/src/transforms/transformExpression.ts +++ b/packages/compiler-core/src/transforms/transformExpression.ts @@ -25,7 +25,7 @@ import { } from '../babelUtils' import { advancePositionWithClone, isSimpleIdentifier } from '../utils' import { - isGloballyWhitelisted, + isGloballyAllowed, makeMap, hasOwn, isString, @@ -225,7 +225,7 @@ export function processExpression( if (isSimpleIdentifier(rawExp)) { const isScopeVarReference = context.identifiers[rawExp] - const isAllowedGlobal = isGloballyWhitelisted(rawExp) + const isAllowedGlobal = isGloballyAllowed(rawExp) const isLiteral = isLiteralWhitelisted(rawExp) if (!asParams && !isScopeVarReference && !isAllowedGlobal && !isLiteral) { // const bindings exposed from setup can be skipped for patching but @@ -358,7 +358,7 @@ export function processExpression( function canPrefix(id: Identifier) { // skip whitelisted globals - if (isGloballyWhitelisted(id.name)) { + if (isGloballyAllowed(id.name)) { return false } // special case for webpack compilation diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 78a9acd147f..dc575aafff9 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -9,7 +9,7 @@ import { instanceWatch, WatchOptions, WatchStopHandle } from './apiWatch' import { EMPTY_OBJ, hasOwn, - isGloballyWhitelisted, + isGloballyAllowed, NOOP, extend, isString, @@ -511,7 +511,7 @@ export const RuntimeCompiledPublicInstanceProxyHandlers = /*#__PURE__*/ extend( return PublicInstanceProxyHandlers.get!(target, key, target) }, has(_: ComponentRenderContext, key: string) { - const has = key[0] !== '_' && !isGloballyWhitelisted(key) + const has = key[0] !== '_' && !isGloballyAllowed(key) if (__DEV__ && !has && PublicInstanceProxyHandlers.has!(_, key)) { warn( `Property ${JSON.stringify( diff --git a/packages/shared/src/globalsWhitelist.ts b/packages/shared/src/globalsAllowList.ts similarity index 70% rename from packages/shared/src/globalsWhitelist.ts rename to packages/shared/src/globalsAllowList.ts index 9485a41dafa..c303be11d4c 100644 --- a/packages/shared/src/globalsWhitelist.ts +++ b/packages/shared/src/globalsAllowList.ts @@ -1,8 +1,8 @@ import { makeMap } from './makeMap' -const GLOBALS_WHITE_LISTED = +const GLOBALS_ALLOWED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' + 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' + 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console' -export const isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED) +export const isGloballyAllowed = /*#__PURE__*/ makeMap(GLOBALS_ALLOWED) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 2e7292f0eac..11580a06435 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -3,7 +3,7 @@ export * from './general' export * from './patchFlags' export * from './shapeFlags' export * from './slotFlags' -export * from './globalsWhitelist' +export * from './globalsAllowList' export * from './codeframe' export * from './normalizeProp' export * from './domTagConfig' From 00e0766934cf8c9d145845b53514e532c84e32c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Sat, 10 Jun 2023 17:08:02 +0800 Subject: [PATCH 010/128] refactor(shared): merge if statements (#8394) --- packages/shared/src/normalizeProp.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/shared/src/normalizeProp.ts b/packages/shared/src/normalizeProp.ts index 6a1dd20e393..10d54c6b51a 100644 --- a/packages/shared/src/normalizeProp.ts +++ b/packages/shared/src/normalizeProp.ts @@ -19,9 +19,7 @@ export function normalizeStyle( } } return res - } else if (isString(value)) { - return value - } else if (isObject(value)) { + } else if (isString(value) || isObject(value)) { return value } } From e78c223b30fb0ca8241661df77630cb178ea4382 Mon Sep 17 00:00:00 2001 From: zqran <215244947@qq.com> Date: Sat, 10 Jun 2023 17:09:44 +0800 Subject: [PATCH 011/128] chore: fix typo (#8392) --- packages/dts-test/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dts-test/README.md b/packages/dts-test/README.md index 2ac0b80ab81..197005a5692 100644 --- a/packages/dts-test/README.md +++ b/packages/dts-test/README.md @@ -4,4 +4,4 @@ Tests Typescript types to ensure the types remain as expected. - This directory is included in the root `tsconfig.json`, where package imports are aliased to `src` directories, so in IDEs and the `pnpm check` script the types are validated against source code. -- When running `tsc` with `packages/dts-test/tsconfig.test.json`, packages are resolved using using normal `node` resolution, so the types are validated against actual **built** types. This requires the types to be built first via `pnpm build-types`. +- When running `tsc` with `packages/dts-test/tsconfig.test.json`, packages are resolved using normal `node` resolution, so the types are validated against actual **built** types. This requires the types to be built first via `pnpm build-types`. From 23c81691d9f722763ee0d74d4c0aa480ca973fbe Mon Sep 17 00:00:00 2001 From: Vadim Date: Sat, 10 Jun 2023 12:10:20 +0300 Subject: [PATCH 012/128] chore: fix typo (#7416) --- packages/compiler-sfc/src/compileScript.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 6f096ff3e04..2c15b7f496e 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -274,7 +274,7 @@ export function compileScript( const scriptAst = ctx.scriptAst const scriptSetupAst = ctx.scriptSetupAst! - // 1.1 walk import delcarations of diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 38916073af5..02039348235 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -12,7 +12,7 @@ "vite": "^4.3.0" }, "dependencies": { - "@vue/repl": "^1.5.0", + "@vue/repl": "^2.1.3", "file-saver": "^2.0.5", "jszip": "^3.6.0", "vue": "workspace:*" diff --git a/packages/sfc-playground/src/App.vue b/packages/sfc-playground/src/App.vue index f7db1b7951b..e21f7328e82 100644 --- a/packages/sfc-playground/src/App.vue +++ b/packages/sfc-playground/src/App.vue @@ -1,6 +1,7 @@ diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index b6bfb9b795d..76e6a014e7d 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -12,7 +12,7 @@ "vite": "^4.3.9" }, "dependencies": { - "@vue/repl": "^2.3.0", + "@vue/repl": "^2.4.0", "file-saver": "^2.0.5", "jszip": "^3.6.0", "vue": "workspace:*" diff --git a/packages/sfc-playground/src/App.vue b/packages/sfc-playground/src/App.vue index 3c850fec4e4..f9b77f47ea2 100644 --- a/packages/sfc-playground/src/App.vue +++ b/packages/sfc-playground/src/App.vue @@ -2,7 +2,7 @@ import Header from './Header.vue' import { Repl, ReplStore, SFCOptions } from '@vue/repl' import Monaco from '@vue/repl/monaco-editor' -import { ref, watchEffect } from 'vue' +import { ref, watchEffect, onMounted } from 'vue' const setVH = () => { document.documentElement.style.setProperty('--vh', window.innerHeight + `px`) @@ -72,6 +72,15 @@ function toggleSSR() { useSSRMode.value = !useSSRMode.value store.setFiles(store.getFiles()) } + +const theme = ref('dark') +function toggleTheme(isDark: boolean) { + theme.value = isDark ? 'dark' : 'light' +} +onMounted(() => { + const cls = document.documentElement.classList + toggleTheme(cls.contains('dark')) +}) @@ -302,12 +302,13 @@ h1 img { } .links button, -.links button a { +.links .github { + padding: 1px 6px; color: var(--btn); } .links button:hover, -.links button:hover a { +.links .github:hover { color: var(--highlight); } From 7121c925c5bcdd1d00f88d454049a7b5e30e1926 Mon Sep 17 00:00:00 2001 From: OrbisK <37191683+OrbisK@users.noreply.github.com> Date: Sun, 9 Jul 2023 07:05:18 +0200 Subject: [PATCH 046/128] types: update `TextareaHTMLAttributes` and `InputHTMLAttributes` (#6294) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * types: update `TextareaHTMLAttributes` and `InputHTMLAttributes` add `InputTypeHTMLAttribute` (from `@types/react`) to `InputHTMLAttributes['type' ]` * chore: format --------- Co-authored-by: 三咲智子 Kevin Deng --- packages/runtime-dom/src/jsx.ts | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts index d103278c6e6..3826c14faaf 100644 --- a/packages/runtime-dom/src/jsx.ts +++ b/packages/runtime-dom/src/jsx.ts @@ -464,6 +464,31 @@ export interface InsHTMLAttributes extends HTMLAttributes { datetime?: string } +export type InputTypeHTMLAttribute = + | 'button' + | 'checkbox' + | 'color' + | 'date' + | 'datetime-local' + | 'email' + | 'file' + | 'hidden' + | 'image' + | 'month' + | 'number' + | 'password' + | 'radio' + | 'range' + | 'reset' + | 'search' + | 'submit' + | 'tel' + | 'text' + | 'time' + | 'url' + | 'week' + | (string & {}) + export interface InputHTMLAttributes extends HTMLAttributes { accept?: string alt?: string @@ -495,7 +520,7 @@ export interface InputHTMLAttributes extends HTMLAttributes { size?: Numberish src?: string step?: Numberish - type?: string + type?: InputTypeHTMLAttribute value?: any // we support :value to be bound to anything w/ v-model width?: Numberish } @@ -677,7 +702,7 @@ export interface TextareaHTMLAttributes extends HTMLAttributes { minlength?: Numberish name?: string placeholder?: string - readonly?: boolean + readonly?: Booleanish required?: Booleanish rows?: Numberish value?: string | string[] | number From eee709081bc12c27ef93f471bd2a1f619198af1e Mon Sep 17 00:00:00 2001 From: qiang Date: Sun, 9 Jul 2023 19:37:32 +0800 Subject: [PATCH 047/128] refactor(types): improve capitalize types (#6212) --- packages/shared/src/general.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/shared/src/general.ts b/packages/shared/src/general.ts index b36ec89c65f..4138b2730e6 100644 --- a/packages/shared/src/general.ts +++ b/packages/shared/src/general.ts @@ -110,16 +110,17 @@ export const hyphenate = cacheStringFunction((str: string) => /** * @private */ -export const capitalize = cacheStringFunction( - (str: string) => str.charAt(0).toUpperCase() + str.slice(1) -) +export const capitalize = cacheStringFunction((str: T) => { + return (str.charAt(0).toUpperCase() + str.slice(1)) as Capitalize +}) /** * @private */ -export const toHandlerKey = cacheStringFunction((str: string) => - str ? `on${capitalize(str)}` : `` -) +export const toHandlerKey = cacheStringFunction((str: T) => { + const s = str ? `on${capitalize(str)}` : `` + return s as T extends '' ? '' : `on${Capitalize}` +}) // compare whether a value has changed, accounting for NaN. export const hasChanged = (value: any, oldValue: any): boolean => From 788527e29ca261c61c2bbc30ef86c4fe32a5245e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Mon, 10 Jul 2023 00:18:59 +0800 Subject: [PATCH 048/128] workflow: support custom TS version for playground (#8735) --- packages/sfc-playground/package.json | 4 +- packages/sfc-playground/src/App.vue | 2 +- packages/sfc-playground/src/Header.vue | 148 +++------- packages/sfc-playground/src/VersionSelect.vue | 114 ++++++++ packages/sfc-playground/vite.config.ts | 1 + pnpm-lock.yaml | 268 ++++++++++++++++-- 6 files changed, 404 insertions(+), 133 deletions(-) create mode 100644 packages/sfc-playground/src/VersionSelect.vue diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 76e6a014e7d..04752e39123 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -9,10 +9,10 @@ }, "devDependencies": { "@vitejs/plugin-vue": "^4.2.3", - "vite": "^4.3.9" + "vite": "^4.4.2" }, "dependencies": { - "@vue/repl": "^2.4.0", + "@vue/repl": "^2.5.4", "file-saver": "^2.0.5", "jszip": "^3.6.0", "vue": "workspace:*" diff --git a/packages/sfc-playground/src/App.vue b/packages/sfc-playground/src/App.vue index f9b77f47ea2..744cfd4d9c0 100644 --- a/packages/sfc-playground/src/App.vue +++ b/packages/sfc-playground/src/App.vue @@ -73,7 +73,7 @@ function toggleSSR() { store.setFiles(store.getFiles()) } -const theme = ref('dark') +const theme = ref<'dark' | 'light'>('dark') function toggleTheme(isDark: boolean) { theme.value = isDark ? 'dark' : 'light' } diff --git a/packages/sfc-playground/src/Header.vue b/packages/sfc-playground/src/Header.vue index d8271b8e528..e865a76a5fe 100644 --- a/packages/sfc-playground/src/Header.vue +++ b/packages/sfc-playground/src/Header.vue @@ -1,44 +1,35 @@ @@ -109,28 +60,28 @@ async function fetchVersions(): Promise { Vue SFC Playground \`) + }" + `) + }) + test('', () => { expect( compileWithWrapper(``).code diff --git a/packages/compiler-ssr/src/transforms/ssrVModel.ts b/packages/compiler-ssr/src/transforms/ssrVModel.ts index 589ef6a8650..bd587edcb9c 100644 --- a/packages/compiler-ssr/src/transforms/ssrVModel.ts +++ b/packages/compiler-ssr/src/transforms/ssrVModel.ts @@ -18,7 +18,8 @@ import { import { SSR_LOOSE_EQUAL, SSR_LOOSE_CONTAIN, - SSR_RENDER_DYNAMIC_MODEL + SSR_RENDER_DYNAMIC_MODEL, + SSR_INCLUDE_BOOLEAN_ATTR } from '../runtimeHelpers' import { DirectiveTransformResult } from 'packages/compiler-core/src/transform' @@ -129,8 +130,34 @@ export const ssrTransformModel: DirectiveTransform = (dir, node, context) => { checkDuplicatedValue() node.children = [createInterpolation(model, model.loc)] } else if (node.tag === 'select') { - // NOOP - // select relies on client-side directive to set initial selected state. + node.children.forEach(option => { + if (option.type === NodeTypes.ELEMENT) { + const plainNode = option as PlainElementNode + if (plainNode.props.findIndex(p => p.name === 'selected') === -1) { + const value = findValueBinding(plainNode) + plainNode.ssrCodegenNode!.elements.push( + createConditionalExpression( + createCallExpression(context.helper(SSR_INCLUDE_BOOLEAN_ATTR), [ + createConditionalExpression( + createCallExpression(`Array.isArray`, [model]), + createCallExpression(context.helper(SSR_LOOSE_CONTAIN), [ + model, + value + ]), + createCallExpression(context.helper(SSR_LOOSE_EQUAL), [ + model, + value + ]) + ) + ]), + createSimpleExpression(' selected', true), + createSimpleExpression('', true), + false /* no newline */ + ) + ) + } + } + }) } else { context.onError( createDOMCompilerError( diff --git a/packages/server-renderer/__tests__/ssrDirectives.spec.ts b/packages/server-renderer/__tests__/ssrDirectives.spec.ts index 102e95d5b27..e52ef2db69f 100644 --- a/packages/server-renderer/__tests__/ssrDirectives.spec.ts +++ b/packages/server-renderer/__tests__/ssrDirectives.spec.ts @@ -107,6 +107,30 @@ describe('ssr: directives', () => { ).toBe(``) }) + test('select', async () => { + expect( + await renderToString( + createApp({ + data: () => ({ model: 1 }), + template: `` + }) + ) + ).toBe( + `` + ) + + expect( + await renderToString( + createApp({ + data: () => ({ model: [0, 1] }), + template: `` + }) + ) + ).toBe( + `` + ) + }) + test('checkbox', async () => { expect( await renderToString( From 776ebf25b2e7570e78ac1c148fc45c823c21a542 Mon Sep 17 00:00:00 2001 From: vaakian X Date: Tue, 11 Jul 2023 17:26:31 +0800 Subject: [PATCH 058/128] fix(compiler-sfc): fix using imported ref as template ref during dev (#7593) close #7567 --- .../__snapshots__/compileScript.spec.ts.snap | 15 +++++++++++++++ .../__tests__/compileScript.spec.ts | 17 +++++++++++++++++ .../compiler-sfc/src/script/importUsageCheck.ts | 3 +++ 3 files changed, 35 insertions(+) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 18b5d90eaf6..de19ec5aaf2 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -775,6 +775,21 @@ return { get FooBaz() { return FooBaz }, get Last() { return Last } } })" `; +exports[`SFC compile + + `) + expect(content).toMatch( + 'return { get foo() { return foo }, get bar() { return bar }, get Baz() { return Baz } }' + ) + assertCode(content) + }) }) describe('inlineTemplate mode', () => { diff --git a/packages/compiler-sfc/src/script/importUsageCheck.ts b/packages/compiler-sfc/src/script/importUsageCheck.ts index b42397d573b..28456a45bba 100644 --- a/packages/compiler-sfc/src/script/importUsageCheck.ts +++ b/packages/compiler-sfc/src/script/importUsageCheck.ts @@ -57,6 +57,9 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { )}` } } + if (prop.type === NodeTypes.ATTRIBUTE && prop.name === 'ref' && prop.value?.content) { + code += `,${prop.value.content}` + } } } else if (node.type === NodeTypes.INTERPOLATION) { code += `,${processExp( From ceb0732e0b1bb4c8c505d80e97ff6fc89035fa90 Mon Sep 17 00:00:00 2001 From: Kid <44045911+kidonng@users.noreply.github.com> Date: Tue, 11 Jul 2023 17:30:01 +0800 Subject: [PATCH 059/128] fix(types/jsx): add `inert` attribute and missing `hidden` values (#8090) --- packages/runtime-dom/src/jsx.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts index f76c8d7fb17..d3c0332c7c3 100644 --- a/packages/runtime-dom/src/jsx.ts +++ b/packages/runtime-dom/src/jsx.ts @@ -248,8 +248,9 @@ export interface HTMLAttributes extends AriaAttributes, EventHandlers { contextmenu?: string dir?: string draggable?: Booleanish - hidden?: Booleanish + hidden?: Booleanish | '' | 'hidden' | 'until-found' id?: string + inert?: Booleanish lang?: string placeholder?: string spellcheck?: Booleanish From 140a89b833bceed60838182b875d2953c70af114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E9=9B=BE=E4=B8=89=E8=AF=AD?= <32354856+baiwusanyu-c@users.noreply.github.com> Date: Tue, 11 Jul 2023 17:36:26 +0800 Subject: [PATCH 060/128] fix(teleport): handle target change while disabled (#7837) close #7835 --- .../__tests__/components/Teleport.spec.ts | 53 +++++++++++++++++++ .../runtime-core/src/components/Teleport.ts | 7 +++ 2 files changed, 60 insertions(+) diff --git a/packages/runtime-core/__tests__/components/Teleport.spec.ts b/packages/runtime-core/__tests__/components/Teleport.spec.ts index 57180ea139d..7371f53f7b6 100644 --- a/packages/runtime-core/__tests__/components/Teleport.spec.ts +++ b/packages/runtime-core/__tests__/components/Teleport.spec.ts @@ -475,4 +475,57 @@ describe('renderer: teleport', () => { expect(dir.mounted).toHaveBeenCalledTimes(1) expect(dir.unmounted).toHaveBeenCalledTimes(1) }) + + // #7835 + test(`ensure that target changes when disabled are updated correctly when enabled`, async () => { + const root = nodeOps.createElement('div') + const target1 = nodeOps.createElement('div') + const target2 = nodeOps.createElement('div') + const target3 = nodeOps.createElement('div') + const target = ref(target1) + const disabled = ref(true) + + const App = { + setup() { + return () => + h(Fragment, [ + h( + Teleport, + { to: target.value, disabled: disabled.value }, + h('div', 'teleported') + ) + ]) + } + } + render(h(App), root) + disabled.value = false + await nextTick() + expect(serializeInner(target1)).toMatchInlineSnapshot( + `"
teleported
"` + ) + expect(serializeInner(target2)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target3)).toMatchInlineSnapshot(`""`) + + disabled.value = true + await nextTick() + target.value = target2 + await nextTick() + expect(serializeInner(target1)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target2)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target3)).toMatchInlineSnapshot(`""`) + + target.value = target3 + await nextTick() + expect(serializeInner(target1)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target2)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target3)).toMatchInlineSnapshot(`""`) + + disabled.value = false + await nextTick() + expect(serializeInner(target1)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target2)).toMatchInlineSnapshot(`""`) + expect(serializeInner(target3)).toMatchInlineSnapshot( + `"
teleported
"` + ) + }) }) diff --git a/packages/runtime-core/src/components/Teleport.ts b/packages/runtime-core/src/components/Teleport.ts index 6e66d0444f9..4f7d16bc7d1 100644 --- a/packages/runtime-core/src/components/Teleport.ts +++ b/packages/runtime-core/src/components/Teleport.ts @@ -186,6 +186,13 @@ export const TeleportImpl = { internals, TeleportMoveTypes.TOGGLE ) + } else { + // #7835 + // When `teleport` is disabled, `to` may change, making it always old, + // to ensure the correct `to` when enabled + if (n2.props && n1.props && n2.props.to !== n1.props.to) { + n2.props.to = n1.props.to + } } } else { // target changed From 701fa735fc412eb9c0007f1877e5e31ef8ee84a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E9=9B=BE=E4=B8=89=E8=AF=AD?= <32354856+baiwusanyu-c@users.noreply.github.com> Date: Tue, 11 Jul 2023 17:36:54 +0800 Subject: [PATCH 061/128] dx(compiler-sfc): enhance `:deep` warnings (#8328) close #8313 --- packages/compiler-sfc/src/style/pluginScoped.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/style/pluginScoped.ts b/packages/compiler-sfc/src/style/pluginScoped.ts index 1dcc248ad71..f6e9be2fde7 100644 --- a/packages/compiler-sfc/src/style/pluginScoped.ts +++ b/packages/compiler-sfc/src/style/pluginScoped.ts @@ -130,9 +130,10 @@ function rewriteSelector( // DEPRECATED usage // .foo ::v-deep .bar -> .foo[xxxxxxx] .bar warn( - `::v-deep usage as a combinator has ` + - `been deprecated. Use :deep() instead.` + `${value} usage as a combinator has been deprecated. ` + + `Use :deep() instead of ${value} .` ) + const prev = selector.at(selector.index(n) - 1) if (prev && isSpaceCombinator(prev)) { selector.removeChild(prev) From 7c2e44ff5f10e2d381b503979f6193f6c20fa4c1 Mon Sep 17 00:00:00 2001 From: zqran <215244947@qq.com> Date: Tue, 11 Jul 2023 17:37:56 +0800 Subject: [PATCH 062/128] test(reactivity): use vitest fn instead of counting manually (#8476) --- packages/reactivity/__tests__/ref.spec.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index b0ba9d9cb1c..0ee32866da8 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -28,19 +28,18 @@ describe('reactivity/ref', () => { it('should be reactive', () => { const a = ref(1) let dummy - let calls = 0 - effect(() => { - calls++ + const fn = vi.fn(() => { dummy = a.value }) - expect(calls).toBe(1) + effect(fn) + expect(fn).toHaveBeenCalledTimes(1) expect(dummy).toBe(1) a.value = 2 - expect(calls).toBe(2) + expect(fn).toHaveBeenCalledTimes(2) expect(dummy).toBe(2) // same value should not trigger a.value = 2 - expect(calls).toBe(2) + expect(fn).toHaveBeenCalledTimes(2) }) it('should make nested properties reactive', () => { From 736cf154cc27f422c58b10cd9e1fe20ceab0eb10 Mon Sep 17 00:00:00 2001 From: zqran <215244947@qq.com> Date: Tue, 11 Jul 2023 17:38:32 +0800 Subject: [PATCH 063/128] chore(test): replace deprecated `initEvent` (#8490) --- packages/runtime-dom/__tests__/directives/vOn.spec.ts | 6 ++++-- packages/vue-compat/__tests__/utils.ts | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/runtime-dom/__tests__/directives/vOn.spec.ts b/packages/runtime-dom/__tests__/directives/vOn.spec.ts index 8a608343d43..2a4b02478f5 100644 --- a/packages/runtime-dom/__tests__/directives/vOn.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vOn.spec.ts @@ -6,8 +6,10 @@ function triggerEvent( event: string, process?: (e: any) => any ) { - const e = document.createEvent('HTMLEvents') - e.initEvent(event, true, true) + const e = new Event(event, { + bubbles: true, + cancelable: true + }) if (event === 'click') { ;(e as any).button = 0 } diff --git a/packages/vue-compat/__tests__/utils.ts b/packages/vue-compat/__tests__/utils.ts index bcf72b296de..a7242122bcb 100644 --- a/packages/vue-compat/__tests__/utils.ts +++ b/packages/vue-compat/__tests__/utils.ts @@ -3,8 +3,10 @@ export function triggerEvent( event: string, process?: (e: any) => any ) { - const e = document.createEvent('HTMLEvents') - e.initEvent(event, true, true) + const e = new Event(event, { + bubbles: true, + cancelable: true + }) if (process) process(e) target.dispatchEvent(e) return e From 97b6fae6b477d5b1a95e94963667e171e16d5410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Tue, 11 Jul 2023 17:41:09 +0800 Subject: [PATCH 064/128] chore(shared): improve isPromise check in accordance with Promise A+ specification (#8506) --- packages/shared/src/general.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/general.ts b/packages/shared/src/general.ts index 4138b2730e6..59a1e911b6c 100644 --- a/packages/shared/src/general.ts +++ b/packages/shared/src/general.ts @@ -50,7 +50,11 @@ export const isObject = (val: unknown): val is Record => val !== null && typeof val === 'object' export const isPromise = (val: unknown): val is Promise => { - return isObject(val) && isFunction(val.then) && isFunction(val.catch) + return ( + (isObject(val) || isFunction(val)) && + isFunction(val.then) && + isFunction(val.catch) + ) } export const objectToString = Object.prototype.toString From 438027cf9ecb63260f59d3027e0b188717694795 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Tue, 11 Jul 2023 11:52:43 +0200 Subject: [PATCH 065/128] perf: mark `defineComponent` as side-effects-free (#8512) --- package.json | 2 +- .../runtime-core/src/apiAsyncComponent.ts | 1 + .../runtime-core/src/apiDefineComponent.ts | 1 + packages/runtime-dom/src/apiCustomElement.ts | 2 + pnpm-lock.yaml | 90 +++++++++---------- 5 files changed, 46 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 4310ae6368b..07caa03dbb5 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "prettier": "^2.7.1", "pug": "^3.0.1", "puppeteer": "~19.6.0", - "rollup": "^3.20.2", + "rollup": "^3.26.0", "rollup-plugin-dts": "^5.3.0", "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-polyfill-node": "^0.12.0", diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index bd878a49442..342339042ef 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -40,6 +40,7 @@ export interface AsyncComponentOptions { export const isAsyncWrapper = (i: ComponentInternalInstance | VNode): boolean => !!(i.type as ComponentOptions).__asyncLoader +/*! #__NO_SIDE_EFFECTS__ */ export function defineAsyncComponent< T extends Component = { new (): ComponentPublicInstance } >(source: AsyncComponentLoader | AsyncComponentOptions): T { diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index 76e9567fe2f..272bb548751 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -274,6 +274,7 @@ export function defineComponent< > // implementation, close to no-op +/*! #__NO_SIDE_EFFECTS__ */ export function defineComponent( options: unknown, extraOptions?: ComponentOptions diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 1e551cc05da..2add422586d 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -140,6 +140,7 @@ export function defineCustomElement(options: { new (...args: any[]): ComponentPublicInstance }): VueElementConstructor +/*! #__NO_SIDE_EFFECTS__ */ export function defineCustomElement( options: any, hydrate?: RootHydrateFunction @@ -155,6 +156,7 @@ export function defineCustomElement( return VueCustomElement } +/*! #__NO_SIDE_EFFECTS__ */ export const defineSSRCustomElement = ((options: any) => { // @ts-ignore return defineCustomElement(options, hydrate) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17029035c31..77ac98cc527 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,22 +16,22 @@ importers: version: 7.21.3 '@rollup/plugin-alias': specifier: ^4.0.3 - version: 4.0.4(rollup@3.20.2) + version: 4.0.4(rollup@3.26.2) '@rollup/plugin-commonjs': specifier: ^24.0.1 - version: 24.1.0(rollup@3.20.2) + version: 24.1.0(rollup@3.26.2) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.0(rollup@3.20.2) + version: 6.0.0(rollup@3.26.2) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.1.0(rollup@3.20.2) + version: 15.1.0(rollup@3.26.2) '@rollup/plugin-replace': specifier: ^5.0.2 - version: 5.0.2(rollup@3.20.2) + version: 5.0.2(rollup@3.26.2) '@rollup/plugin-terser': specifier: ^0.4.0 - version: 0.4.0(rollup@3.20.2) + version: 0.4.0(rollup@3.26.2) '@types/hash-sum': specifier: ^1.0.0 version: 1.0.0 @@ -105,17 +105,17 @@ importers: specifier: ~19.6.0 version: 19.6.3 rollup: - specifier: ^3.20.2 - version: 3.20.2 + specifier: ^3.26.0 + version: 3.26.2 rollup-plugin-dts: specifier: ^5.3.0 - version: 5.3.0(rollup@3.20.2)(typescript@5.0.2) + version: 5.3.0(rollup@3.26.2)(typescript@5.0.2) rollup-plugin-esbuild: specifier: ^5.0.0 - version: 5.0.0(esbuild@0.17.19)(rollup@3.20.2) + version: 5.0.0(esbuild@0.17.19)(rollup@3.26.2) rollup-plugin-polyfill-node: specifier: ^0.12.0 - version: 0.12.0(rollup@3.20.2) + version: 0.12.0(rollup@3.26.2) semver: specifier: ^7.3.2 version: 7.5.3 @@ -1130,7 +1130,7 @@ packages: fastq: 1.15.0 dev: true - /@rollup/plugin-alias@4.0.4(rollup@3.20.2): + /@rollup/plugin-alias@4.0.4(rollup@3.26.2): resolution: {integrity: sha512-0CaAY238SMtYAWEXXptWSR8iz8NYZnH7zNBKuJ14xFJSGwLtPgjvXYsoApAHfzYXXH1ejxpVw7WlHss3zhh9SQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1139,11 +1139,11 @@ packages: rollup: optional: true dependencies: - rollup: 3.20.2 + rollup: 3.26.2 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs@24.1.0(rollup@3.20.2): + /@rollup/plugin-commonjs@24.1.0(rollup@3.26.2): resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1152,16 +1152,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.20.2 + rollup: 3.26.2 dev: true - /@rollup/plugin-inject@5.0.3(rollup@3.20.2): + /@rollup/plugin-inject@5.0.3(rollup@3.26.2): resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1170,13 +1170,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) estree-walker: 2.0.2 magic-string: 0.27.0 - rollup: 3.20.2 + rollup: 3.26.2 dev: true - /@rollup/plugin-json@6.0.0(rollup@3.20.2): + /@rollup/plugin-json@6.0.0(rollup@3.26.2): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1185,11 +1185,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - rollup: 3.20.2 + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) + rollup: 3.26.2 dev: true - /@rollup/plugin-node-resolve@15.1.0(rollup@3.20.2): + /@rollup/plugin-node-resolve@15.1.0(rollup@3.26.2): resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1198,16 +1198,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) '@types/resolve': 1.20.2 deepmerge: 4.3.0 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.1 - rollup: 3.20.2 + rollup: 3.26.2 dev: true - /@rollup/plugin-replace@5.0.2(rollup@3.20.2): + /@rollup/plugin-replace@5.0.2(rollup@3.26.2): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1216,12 +1216,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) magic-string: 0.27.0 - rollup: 3.20.2 + rollup: 3.26.2 dev: true - /@rollup/plugin-terser@0.4.0(rollup@3.20.2): + /@rollup/plugin-terser@0.4.0(rollup@3.26.2): resolution: {integrity: sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1230,13 +1230,13 @@ packages: rollup: optional: true dependencies: - rollup: 3.20.2 + rollup: 3.26.2 serialize-javascript: 6.0.1 smob: 0.0.6 terser: 5.18.2 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.20.2): + /@rollup/pluginutils@5.0.2(rollup@3.26.2): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1248,7 +1248,7 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.20.2 + rollup: 3.26.2 dev: true /@tootallnate/once@2.0.0: @@ -4996,7 +4996,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-dts@5.3.0(rollup@3.20.2)(typescript@5.0.2): + /rollup-plugin-dts@5.3.0(rollup@3.26.2)(typescript@5.0.2): resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} engines: {node: '>=v14'} peerDependencies: @@ -5004,45 +5004,37 @@ packages: typescript: ^4.1 || ^5.0 dependencies: magic-string: 0.30.0 - rollup: 3.20.2 + rollup: 3.26.2 typescript: 5.0.2 optionalDependencies: '@babel/code-frame': 7.22.5 dev: true - /rollup-plugin-esbuild@5.0.0(esbuild@0.17.19)(rollup@3.20.2): + /rollup-plugin-esbuild@5.0.0(esbuild@0.17.19)(rollup@3.26.2): resolution: {integrity: sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} peerDependencies: esbuild: '>=0.10.1' rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.26.2) debug: 4.3.4 es-module-lexer: 1.1.0 esbuild: 0.17.19 joycon: 3.1.1 jsonc-parser: 3.2.0 - rollup: 3.20.2 + rollup: 3.26.2 transitivePeerDependencies: - supports-color dev: true - /rollup-plugin-polyfill-node@0.12.0(rollup@3.20.2): + /rollup-plugin-polyfill-node@0.12.0(rollup@3.26.2): resolution: {integrity: sha512-PWEVfDxLEKt8JX1nZ0NkUAgXpkZMTb85rO/Ru9AQ69wYW8VUCfDgP4CGRXXWYni5wDF0vIeR1UoF3Jmw/Lt3Ug==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 dependencies: - '@rollup/plugin-inject': 5.0.3(rollup@3.20.2) - rollup: 3.20.2 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 + '@rollup/plugin-inject': 5.0.3(rollup@3.26.2) + rollup: 3.26.2 dev: true /rollup@3.26.2: @@ -5808,7 +5800,7 @@ packages: '@types/node': 16.18.38 esbuild: 0.17.19 postcss: 8.4.21 - rollup: 3.20.2 + rollup: 3.26.2 terser: 5.18.2 optionalDependencies: fsevents: 2.3.2 From 6a22b1f6c287b60eda385df8a514335af8e040ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Tue, 11 Jul 2023 17:56:02 +0800 Subject: [PATCH 066/128] fix(types): ensure nextTick return type reflect correct Promise value (#8406) --- packages/runtime-core/__tests__/scheduler.spec.ts | 12 ++++++++++++ packages/runtime-core/src/scheduler.ts | 8 ++++---- packages/shared/src/typeUtils.ts | 9 +++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/runtime-core/__tests__/scheduler.spec.ts b/packages/runtime-core/__tests__/scheduler.spec.ts index c06b9afb3e3..6246a87e8f7 100644 --- a/packages/runtime-core/__tests__/scheduler.spec.ts +++ b/packages/runtime-core/__tests__/scheduler.spec.ts @@ -546,4 +546,16 @@ describe('scheduler', () => { await nextTick() expect(spy).toHaveBeenCalledTimes(1) }) + + it('nextTick should return promise', async () => { + const fn = vi.fn(() => { + return 1 + }) + + const p = nextTick(fn) + + expect(p).toBeInstanceOf(Promise) + expect(await p).toBe(1) + expect(fn).toHaveBeenCalledTimes(1) + }) }) diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index 923f3ec8251..64c70ab59ca 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -1,5 +1,5 @@ import { ErrorCodes, callWithErrorHandling } from './errorHandling' -import { isArray, NOOP } from '@vue/shared' +import { Awaited, isArray, NOOP } from '@vue/shared' import { ComponentInternalInstance, getComponentName } from './component' import { warn } from './warning' @@ -50,10 +50,10 @@ let currentFlushPromise: Promise | null = null const RECURSION_LIMIT = 100 type CountMap = Map -export function nextTick( +export function nextTick( this: T, - fn?: (this: T) => void -): Promise { + fn?: (this: T) => R +): Promise> { const p = currentFlushPromise || resolvedPromise return fn ? p.then(this ? fn.bind(this) : fn) : p } diff --git a/packages/shared/src/typeUtils.ts b/packages/shared/src/typeUtils.ts index 67fb47c23b3..1deb4729125 100644 --- a/packages/shared/src/typeUtils.ts +++ b/packages/shared/src/typeUtils.ts @@ -12,3 +12,12 @@ export type LooseRequired = { [P in keyof (T & Required)]: T[P] } // If the type T accepts type "any", output type Y, otherwise output type N. // https://stackoverflow.com/questions/49927523/disallow-call-with-any/49928360#49928360 export type IfAny = 0 extends 1 & T ? Y : N + +// To prevent users with TypeScript versions lower than 4.5 from encountering unsupported Awaited type, a copy has been made here. +export type Awaited = T extends null | undefined + ? T // special case for `null | undefined` when not in `--strictNullChecks` mode + : T extends object & { then(onfulfilled: infer F, ...args: infer _): any } // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped + ? F extends (value: infer V, ...args: infer _) => any // if the argument to `then` is callable, extracts the first argument + ? Awaited // recursively unwrap the value + : never // the argument to `then` was not callable + : T // non-object or non-thenable From f07cb18fedf9a446545aadf76bcdfb957c7ebcbd Mon Sep 17 00:00:00 2001 From: zqran <215244947@qq.com> Date: Tue, 11 Jul 2023 18:35:22 +0800 Subject: [PATCH 067/128] fix(types): correct withDefaults return type for boolean prop with undefined default value (#8602) --- packages/dts-test/setupHelpers.test-d.ts | 20 ++++++++++++++++++++ packages/runtime-core/src/apiSetupHelpers.ts | 8 +++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/dts-test/setupHelpers.test-d.ts b/packages/dts-test/setupHelpers.test-d.ts index 77342590dc6..934e6056d2d 100644 --- a/packages/dts-test/setupHelpers.test-d.ts +++ b/packages/dts-test/setupHelpers.test-d.ts @@ -134,6 +134,26 @@ describe('defineProps w/ generic type declaration + withDefaults', (res.bool) }) +describe('withDefaults w/ boolean type', () => { + const res1 = withDefaults( + defineProps<{ + bool?: boolean + }>(), + { bool: false } + ) + expectType(res1.bool) + + const res2 = withDefaults( + defineProps<{ + bool?: boolean + }>(), + { + bool: undefined + } + ) + expectType(res2.bool) +}) + describe('defineProps w/ runtime declaration', () => { // runtime declaration const props = defineProps({ diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index c00937981d9..93200667081 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -303,7 +303,13 @@ type PropsWithDefaults< ? T[K] : NotUndefined : never -} & { readonly [K in BKeys]-?: boolean } +} & { + readonly [K in BKeys]-?: K extends keyof Defaults + ? Defaults[K] extends undefined + ? boolean | undefined + : boolean + : boolean +} /** * Vue ` + + `) + expect(content).toMatch( + `return { get FooBar() { return FooBar }, get foo() { return foo }, ` + + `get bar() { return bar } }` + ) + assertCode(content) + }) + // https://github.com/vuejs/core/issues/4599 test('attribute expressions', () => { const { content } = compile(` diff --git a/packages/compiler-sfc/src/script/importUsageCheck.ts b/packages/compiler-sfc/src/script/importUsageCheck.ts index 28456a45bba..7019dcf2312 100644 --- a/packages/compiler-sfc/src/script/importUsageCheck.ts +++ b/packages/compiler-sfc/src/script/importUsageCheck.ts @@ -50,6 +50,12 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { if (!isBuiltInDirective(prop.name)) { code += `,v${capitalize(camelize(prop.name))}` } + if (prop.arg && !(prop.arg as SimpleExpressionNode).isStatic) { + code += `,${processExp( + (prop.arg as SimpleExpressionNode).content, + prop.name + )}` + } if (prop.exp) { code += `,${processExp( (prop.exp as SimpleExpressionNode).content, From 2a2810c716e7882a2dbd5ce2007973d5c14e81f5 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 11 Jul 2023 18:44:00 +0800 Subject: [PATCH 069/128] chore: upgrade to typescript 5.1 --- package.json | 2 +- packages/dts-test/defineComponent.test-d.tsx | 2 +- packages/shared/src/general.ts | 4 +- pnpm-lock.yaml | 51 +++++++++++--------- 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 07caa03dbb5..f14db16ddae 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "terser": "^5.15.1", "todomvc-app-css": "^2.3.0", "tslib": "^2.5.0", - "typescript": "^5.0.0", + "typescript": "^5.1.6", "vite": "^4.3.0", "vitest": "^0.30.1" } diff --git a/packages/dts-test/defineComponent.test-d.tsx b/packages/dts-test/defineComponent.test-d.tsx index edd8d17eb06..7466249e10f 100644 --- a/packages/dts-test/defineComponent.test-d.tsx +++ b/packages/dts-test/defineComponent.test-d.tsx @@ -1363,13 +1363,13 @@ describe('function syntax w/ runtime props', () => { } ) - // @ts-expect-error prop type mismatch defineComponent( (_props: { msg: string }) => { return () => {} }, { props: { + // @ts-expect-error prop type mismatch msg: Number } } diff --git a/packages/shared/src/general.ts b/packages/shared/src/general.ts index 59a1e911b6c..0117e67000d 100644 --- a/packages/shared/src/general.ts +++ b/packages/shared/src/general.ts @@ -52,8 +52,8 @@ export const isObject = (val: unknown): val is Record => export const isPromise = (val: unknown): val is Promise => { return ( (isObject(val) || isFunction(val)) && - isFunction(val.then) && - isFunction(val.catch) + isFunction((val as any).then) && + isFunction((val as any).catch) ) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77ac98cc527..62d5e18f419 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 16.18.38 '@typescript-eslint/parser': specifier: ^5.56.0 - version: 5.56.0(eslint@8.33.0)(typescript@5.0.2) + version: 5.56.0(eslint@8.33.0)(typescript@5.1.6) '@vitest/coverage-istanbul': specifier: ^0.29.7 version: 0.29.7(vitest@0.30.1) @@ -67,7 +67,7 @@ importers: version: 8.33.0 eslint-plugin-jest: specifier: ^27.2.1 - version: 27.2.2(eslint@8.33.0)(typescript@5.0.2) + version: 27.2.2(eslint@8.33.0)(typescript@5.1.6) estree-walker: specifier: ^2.0.2 version: 2.0.2 @@ -109,7 +109,7 @@ importers: version: 3.26.2 rollup-plugin-dts: specifier: ^5.3.0 - version: 5.3.0(rollup@3.26.2)(typescript@5.0.2) + version: 5.3.0(rollup@3.26.2)(typescript@5.1.6) rollup-plugin-esbuild: specifier: ^5.0.0 version: 5.0.0(esbuild@0.17.19)(rollup@3.26.2) @@ -135,8 +135,8 @@ importers: specifier: ^2.5.0 version: 2.6.0 typescript: - specifier: ^5.0.0 - version: 5.0.2 + specifier: ^5.1.6 + version: 5.1.6 vite: specifier: ^4.3.0 version: 4.3.1(@types/node@16.18.38)(terser@5.18.2) @@ -1318,7 +1318,7 @@ packages: dev: true optional: true - /@typescript-eslint/parser@5.56.0(eslint@8.33.0)(typescript@5.0.2): + /@typescript-eslint/parser@5.56.0(eslint@8.33.0)(typescript@5.1.6): resolution: {integrity: sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1330,10 +1330,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.56.0 '@typescript-eslint/types': 5.56.0 - '@typescript-eslint/typescript-estree': 5.56.0(typescript@5.0.2) + '@typescript-eslint/typescript-estree': 5.56.0(typescript@5.1.6) debug: 4.3.4 eslint: 8.33.0 - typescript: 5.0.2 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true @@ -1364,7 +1364,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.50.0(typescript@5.0.2): + /@typescript-eslint/typescript-estree@5.50.0(typescript@5.1.6): resolution: {integrity: sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1379,13 +1379,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.3 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@5.56.0(typescript@5.0.2): + /@typescript-eslint/typescript-estree@5.56.0(typescript@5.1.6): resolution: {integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1400,13 +1400,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.3 - tsutils: 3.21.0(typescript@5.0.2) - typescript: 5.0.2 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.50.0(eslint@8.33.0)(typescript@5.0.2): + /@typescript-eslint/utils@5.50.0(eslint@8.33.0)(typescript@5.1.6): resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1416,7 +1416,7 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.50.0 '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/typescript-estree': 5.50.0(typescript@5.0.2) + '@typescript-eslint/typescript-estree': 5.50.0(typescript@5.1.6) eslint: 8.33.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.33.0) @@ -2643,7 +2643,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-plugin-jest@27.2.2(eslint@8.33.0)(typescript@5.0.2): + /eslint-plugin-jest@27.2.2(eslint@8.33.0)(typescript@5.1.6): resolution: {integrity: sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2656,7 +2656,7 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/utils': 5.50.0(eslint@8.33.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.50.0(eslint@8.33.0)(typescript@5.1.6) eslint: 8.33.0 transitivePeerDependencies: - supports-color @@ -4996,7 +4996,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-dts@5.3.0(rollup@3.26.2)(typescript@5.0.2): + /rollup-plugin-dts@5.3.0(rollup@3.26.2)(typescript@5.1.6): resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} engines: {node: '>=v14'} peerDependencies: @@ -5005,7 +5005,7 @@ packages: dependencies: magic-string: 0.30.0 rollup: 3.26.2 - typescript: 5.0.2 + typescript: 5.1.6 optionalDependencies: '@babel/code-frame': 7.22.5 dev: true @@ -5599,14 +5599,14 @@ packages: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: true - /tsutils@3.21.0(typescript@5.0.2): + /tsutils@3.21.0(typescript@5.1.6): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.0.2 + typescript: 5.1.6 dev: true /type-check@0.3.2: @@ -5665,6 +5665,13 @@ packages: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true + dev: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true /ufo@1.1.1: resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} From 24db9516d8b4857182ec1a3af86cb7346691679b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Wed, 12 Jul 2023 11:03:14 +0800 Subject: [PATCH 070/128] fix(compiler-sfc): don't hoist props and emit (#8535) fix #7805 close #7812 --- .../__snapshots__/compileScript.spec.ts.snap | 87 ++++--------------- .../__tests__/compileScript.spec.ts | 76 ++++------------ .../__snapshots__/defineEmits.spec.ts.snap | 64 +++++++------- .../__snapshots__/defineProps.spec.ts.snap | 48 +++------- .../definePropsDestructure.spec.ts.snap | 59 ++++++++++++- .../compileScript/defineEmits.spec.ts | 6 +- .../definePropsDestructure.spec.ts | 52 +++++++++++ packages/compiler-sfc/src/compileScript.ts | 55 +++++++----- packages/compiler-sfc/src/script/context.ts | 7 +- .../compiler-sfc/src/script/defineEmits.ts | 5 +- .../compiler-sfc/src/script/defineProps.ts | 55 ++++++------ .../src/script/definePropsDestructure.ts | 1 - 12 files changed, 260 insertions(+), 255 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index b7925ada895..949c9946d9f 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -62,6 +62,24 @@ return { fn } })" `; +exports[`SFC compile - `) - assertCode(content) - expect(content).toMatch(`const a = 1;`) // test correct removal - expect(content).toMatch(`props: ['item'],`) - expect(content).toMatch(`emits: ['a'],`) - }) - - // #6757 - test('defineProps/defineEmits in multi-variable declaration fix #6757 ', () => { - const { content } = compile(` - - `) - assertCode(content) - expect(content).toMatch(`const a = 1;`) // test correct removal - expect(content).toMatch(`props: ['item'],`) - expect(content).toMatch(`emits: ['a'],`) - }) - - // #7422 - test('defineProps/defineEmits in multi-variable declaration fix #7422', () => { - const { content } = compile(` - - `) - assertCode(content) - expect(content).toMatch(`props: ['item'],`) - expect(content).toMatch(`emits: ['foo'],`) - expect(content).toMatch(`const a = 0,`) - expect(content).toMatch(`b = 0;`) - }) - - test('defineProps/defineEmits in multi-variable declaration (full removal)', () => { - const { content } = compile(` - - `) - assertCode(content) - expect(content).toMatch(`props: ['item'],`) - expect(content).toMatch(`emits: ['a'],`) - }) - describe(' + `) + assertCode(content) + + expect(content).toMatch(`console.log('test')`) + expect(content).toMatch(`const props = __props;`) + expect(content).toMatch(`const emit = __emit;`) + expect(content).toMatch(`(function () {})()`) + }) + test('script setup first, named default export', () => { const { content } = compile(` + `) + assertCode(content) + expect(content).toMatch(`const a = 1;`) + expect(content).toMatch(`props: ['item'],`) + }) + + // #6757 + test('multi-variable declaration fix #6757 ', () => { + const { content } = compile(` + + `) + assertCode(content) + expect(content).toMatch(`const a = 1;`) + expect(content).toMatch(`props: ['item'],`) + }) + + // #7422 + test('multi-variable declaration fix #7422', () => { + const { content } = compile(` + + `) + assertCode(content) + expect(content).toMatch(`const a = 0,`) + expect(content).toMatch(`b = 0;`) + expect(content).toMatch(`props: ['item'],`) + }) + + test('defineProps/defineEmits in multi-variable declaration (full removal)', () => { + const { content } = compile(` + + `) + assertCode(content) + expect(content).toMatch(`props: ['item'],`) + expect(content).toMatch(`emits: ['a'],`) + }) + describe('errors', () => { test('should error on deep destructure', () => { expect(() => diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 046797cfbe5..cfcc607c72d 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -552,7 +552,11 @@ export function compileScript( (processDefineSlots(ctx, init, decl.id) || processDefineModel(ctx, init, decl.id)) - if (isDefineProps || isDefineEmits) { + if ( + isDefineProps && + !ctx.propsDestructureRestId && + ctx.propsDestructureDecl + ) { if (left === 1) { ctx.s.remove(node.start! + startOffset, node.end! + startOffset) } else { @@ -570,6 +574,12 @@ export function compileScript( ctx.s.remove(start, end) left-- } + } else if (isDefineEmits) { + ctx.s.overwrite( + startOffset + init.start!, + startOffset + init.end!, + '__emit' + ) } else { lastNonRemoved = i } @@ -781,22 +791,29 @@ export function compileScript( // inject user assignment of props // we use a default __props so that template expressions referencing props // can use it directly - if (ctx.propsIdentifier) { - ctx.s.prependLeft( - startOffset, - `\nconst ${ctx.propsIdentifier} = __props;\n` - ) - } - if (ctx.propsDestructureRestId) { - ctx.s.prependLeft( - startOffset, - `\nconst ${ctx.propsDestructureRestId} = ${ctx.helper( - `createPropsRestProxy` - )}(__props, ${JSON.stringify( - Object.keys(ctx.propsDestructuredBindings) - )});\n` - ) + if (ctx.propsDecl) { + if (ctx.propsDestructureRestId) { + ctx.s.overwrite( + startOffset + ctx.propsCall!.start!, + startOffset + ctx.propsCall!.end!, + `${ctx.helper(`createPropsRestProxy`)}(__props, ${JSON.stringify( + Object.keys(ctx.propsDestructuredBindings) + )})` + ) + ctx.s.overwrite( + startOffset + ctx.propsDestructureDecl!.start!, + startOffset + ctx.propsDestructureDecl!.end!, + ctx.propsDestructureRestId + ) + } else if (!ctx.propsDestructureDecl) { + ctx.s.overwrite( + startOffset + ctx.propsCall!.start!, + startOffset + ctx.propsCall!.end!, + '__props' + ) + } } + // inject temp variables for async context preservation if (hasAwait) { const any = ctx.isTS ? `: any` : `` @@ -807,10 +824,8 @@ export function compileScript( ctx.hasDefineExposeCall || !options.inlineTemplate ? [`expose: __expose`] : [] - if (ctx.emitIdentifier) { - destructureElements.push( - ctx.emitIdentifier === `emit` ? `emit` : `emit: ${ctx.emitIdentifier}` - ) + if (ctx.emitDecl) { + destructureElements.push(`emit: __emit`) } if (destructureElements.length) { args += `, { ${destructureElements.join(', ')} }` diff --git a/packages/compiler-sfc/src/script/context.ts b/packages/compiler-sfc/src/script/context.ts index af2dee16568..5fe09d28a42 100644 --- a/packages/compiler-sfc/src/script/context.ts +++ b/packages/compiler-sfc/src/script/context.ts @@ -1,4 +1,4 @@ -import { Node, ObjectPattern, Program } from '@babel/types' +import { CallExpression, Node, ObjectPattern, Program } from '@babel/types' import { SFCDescriptor } from '../parse' import { generateCodeFrame } from '@vue/shared' import { parse as babelParse, ParserPlugin } from '@babel/parser' @@ -38,7 +38,8 @@ export class ScriptCompileContext { hasDefineModelCall = false // defineProps - propsIdentifier: string | undefined + propsCall: CallExpression | undefined + propsDecl: Node | undefined propsRuntimeDecl: Node | undefined propsTypeDecl: Node | undefined propsDestructureDecl: ObjectPattern | undefined @@ -49,7 +50,7 @@ export class ScriptCompileContext { // defineEmits emitsRuntimeDecl: Node | undefined emitsTypeDecl: Node | undefined - emitIdentifier: string | undefined + emitDecl: Node | undefined // defineModel modelDecls: Record = {} diff --git a/packages/compiler-sfc/src/script/defineEmits.ts b/packages/compiler-sfc/src/script/defineEmits.ts index a50cf91fc4a..02014d1b276 100644 --- a/packages/compiler-sfc/src/script/defineEmits.ts +++ b/packages/compiler-sfc/src/script/defineEmits.ts @@ -29,10 +29,7 @@ export function processDefineEmits( ctx.emitsTypeDecl = node.typeParameters.params[0] } - if (declId) { - ctx.emitIdentifier = - declId.type === 'Identifier' ? declId.name : ctx.getString(declId) - } + ctx.emitDecl = declId return true } diff --git a/packages/compiler-sfc/src/script/defineProps.ts b/packages/compiler-sfc/src/script/defineProps.ts index 1ae5a16e3d6..5004e314da1 100644 --- a/packages/compiler-sfc/src/script/defineProps.ts +++ b/packages/compiler-sfc/src/script/defineProps.ts @@ -77,15 +77,14 @@ export function processDefineProps( ctx.propsTypeDecl = node.typeParameters.params[0] } - if (declId) { - // handle props destructure - if (declId.type === 'ObjectPattern') { - processPropsDestructure(ctx, declId) - } else { - ctx.propsIdentifier = ctx.getString(declId) - } + // handle props destructure + if (declId && declId.type === 'ObjectPattern') { + processPropsDestructure(ctx, declId) } + ctx.propsCall = node + ctx.propsDecl = declId + return true } @@ -97,31 +96,33 @@ function processWithDefaults( if (!isCallOf(node, WITH_DEFAULTS)) { return false } - if (processDefineProps(ctx, node.arguments[0], declId)) { - if (ctx.propsRuntimeDecl) { - ctx.error( - `${WITH_DEFAULTS} can only be used with type-based ` + - `${DEFINE_PROPS} declaration.`, - node - ) - } - if (ctx.propsDestructureDecl) { - ctx.error( - `${WITH_DEFAULTS}() is unnecessary when using destructure with ${DEFINE_PROPS}().\n` + - `Prefer using destructure default values, e.g. const { foo = 1 } = defineProps(...).`, - node.callee - ) - } - ctx.propsRuntimeDefaults = node.arguments[1] - if (!ctx.propsRuntimeDefaults) { - ctx.error(`The 2nd argument of ${WITH_DEFAULTS} is required.`, node) - } - } else { + if (!processDefineProps(ctx, node.arguments[0], declId)) { ctx.error( `${WITH_DEFAULTS}' first argument must be a ${DEFINE_PROPS} call.`, node.arguments[0] || node ) } + + if (ctx.propsRuntimeDecl) { + ctx.error( + `${WITH_DEFAULTS} can only be used with type-based ` + + `${DEFINE_PROPS} declaration.`, + node + ) + } + if (ctx.propsDestructureDecl) { + ctx.error( + `${WITH_DEFAULTS}() is unnecessary when using destructure with ${DEFINE_PROPS}().\n` + + `Prefer using destructure default values, e.g. const { foo = 1 } = defineProps(...).`, + node.callee + ) + } + ctx.propsRuntimeDefaults = node.arguments[1] + if (!ctx.propsRuntimeDefaults) { + ctx.error(`The 2nd argument of ${WITH_DEFAULTS} is required.`, node) + } + ctx.propsCall = node + return true } diff --git a/packages/compiler-sfc/src/script/definePropsDestructure.ts b/packages/compiler-sfc/src/script/definePropsDestructure.ts index 5965262f3c3..5aa895bc7fe 100644 --- a/packages/compiler-sfc/src/script/definePropsDestructure.ts +++ b/packages/compiler-sfc/src/script/definePropsDestructure.ts @@ -28,7 +28,6 @@ export function processPropsDestructure( declId: ObjectPattern ) { if (!ctx.options.propsDestructure && !ctx.options.reactivityTransform) { - ctx.propsIdentifier = ctx.getString(declId) return } From 70c3ac746d584d20956628bec185d24e0e90cef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Wed, 12 Jul 2023 11:05:43 +0800 Subject: [PATCH 071/128] dx(compiler-sfc): warn when disabled defineModel (#8534) --- packages/compiler-sfc/src/script/defineModel.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 987e67fc147..432b8676fbd 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -24,7 +24,15 @@ export function processDefineModel( node: Node, declId?: LVal ): boolean { - if (!ctx.options.defineModel || !isCallOf(node, DEFINE_MODEL)) { + if (!isCallOf(node, DEFINE_MODEL)) { + return false + } + + if (!ctx.options.defineModel) { + warnOnce( + `defineModel() is an experimental feature and disabled by default.\n` + + `To enable it, follow the RFC at https://github.com/vuejs/rfcs/discussions/503.` + ) return false } From 24d98f03276de5b0fbced5a4c9d61b24e7d9d084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Wed, 12 Jul 2023 11:13:20 +0800 Subject: [PATCH 072/128] perf(custom-element): cancel `MutationObserver` listener when disconnected (#8666) --- packages/runtime-dom/src/apiCustomElement.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 2add422586d..5662b0b535b 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -178,7 +178,7 @@ export class VueElement extends BaseClass { private _resolved = false private _numberProps: Record | null = null private _styles?: HTMLStyleElement[] - + private _ob?: MutationObserver | null = null constructor( private _def: InnerComponentDef, private _props: Record = {}, @@ -215,6 +215,10 @@ export class VueElement extends BaseClass { disconnectedCallback() { this._connected = false + if (this._ob) { + this._ob.disconnect() + this._ob = null + } nextTick(() => { if (!this._connected) { render(null, this.shadowRoot!) @@ -235,11 +239,13 @@ export class VueElement extends BaseClass { } // watch future attr changes - new MutationObserver(mutations => { + this._ob = new MutationObserver(mutations => { for (const m of mutations) { this._setAttr(m.attributeName!) } - }).observe(this, { attributes: true }) + }) + + this._ob.observe(this, { attributes: true }) const resolve = (def: InnerComponentDef, isAsync = false) => { const { props, styles } = def From 37a14a5dae9999bbe684c6de400afc63658ffe90 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 12 Jul 2023 11:38:59 +0800 Subject: [PATCH 073/128] Revert "fix(types): propagate type parameter constraints for TypeScript 4.8 (#6351)" This reverts commit 516fabb725cdf29e948b8b83dd6db9b80fbd706d. --- packages/runtime-core/src/apiCreateApp.ts | 4 ++-- packages/runtime-core/src/directives.ts | 16 ++++------------ packages/runtime-core/src/renderer.ts | 8 ++++---- packages/runtime-core/src/vnode.ts | 4 ++-- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 971b406cf01..c5ac9d68a52 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -16,7 +16,7 @@ import { ComponentPublicInstance } from './componentPublicInstance' import { Directive, validateDirectiveName } from './directives' -import { RendererElement, RootRenderFunction } from './renderer' +import { RootRenderFunction } from './renderer' import { InjectionKey } from './apiInject' import { warn } from './warning' import { createVNode, cloneVNode, VNode } from './vnode' @@ -196,7 +196,7 @@ export type CreateAppFunction = ( let uid = 0 -export function createAppAPI( +export function createAppAPI( render: RootRenderFunction, hydrate?: RootHydrateFunction ): CreateAppFunction { diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index eb80cd495f6..18c3352b002 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -21,7 +21,6 @@ import { ComponentPublicInstance } from './componentPublicInstance' import { mapCompatDirectiveHook } from './compat/customDirective' import { pauseTracking, resetTracking } from '@vue/reactivity' import { traverse } from './apiWatch' -import { RendererElement } from './renderer' export interface DirectiveBinding { instance: ComponentPublicInstance | null @@ -32,11 +31,7 @@ export interface DirectiveBinding { dir: ObjectDirective } -export type DirectiveHook< - T extends RendererElement = any, - Prev = VNode | null, - V = any -> = ( +export type DirectiveHook | null, V = any> = ( el: T, binding: DirectiveBinding, vnode: VNode, @@ -48,7 +43,7 @@ export type SSRDirectiveHook = ( vnode: VNode ) => Data | undefined -export interface ObjectDirective { +export interface ObjectDirective { created?: DirectiveHook beforeMount?: DirectiveHook mounted?: DirectiveHook @@ -60,12 +55,9 @@ export interface ObjectDirective { deep?: boolean } -export type FunctionDirective< - T extends RendererElement = any, - V = any -> = DirectiveHook +export type FunctionDirective = DirectiveHook -export type Directive = +export type Directive = | ObjectDirective | FunctionDirective diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 3ab81cbf3ba..383e17fb0f5 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -90,7 +90,7 @@ export type RootRenderFunction = ( export interface RendererOptions< HostNode = RendererNode, - HostElement extends RendererElement = RendererElement + HostElement = RendererElement > { patchProp( el: HostElement, @@ -145,7 +145,7 @@ export interface RendererElement extends RendererNode {} // to optimize bundle size. export interface RendererInternals< HostNode = RendererNode, - HostElement extends RendererElement = RendererElement + HostElement = RendererElement > { p: PatchFn um: UnmountFn @@ -295,7 +295,7 @@ export const queuePostRenderEffect = __FEATURE_SUSPENSE__ */ export function createRenderer< HostNode = RendererNode, - HostElement extends RendererElement = RendererElement + HostElement = RendererElement >(options: RendererOptions) { return baseCreateRenderer(options) } @@ -312,7 +312,7 @@ export function createHydrationRenderer( // overload 1: no hydration function baseCreateRenderer< HostNode = RendererNode, - HostElement extends RendererElement = RendererElement + HostElement = RendererElement >(options: RendererOptions): Renderer // overload 2: with hydration diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 89242b94247..f8cf6652d31 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -133,7 +133,7 @@ export type VNodeNormalizedChildren = export interface VNode< HostNode = RendererNode, - HostElement extends RendererElement = RendererElement, + HostElement = RendererElement, ExtraProps = { [key: string]: any } > { /** @@ -613,7 +613,7 @@ export function guardReactiveProps(props: (Data & VNodeProps) | null) { : props } -export function cloneVNode( +export function cloneVNode( vnode: VNode, extraProps?: (Data & VNodeProps) | null, mergeRef = false From a3dddd62059f4a7a762046c1e7f01485b96e737d Mon Sep 17 00:00:00 2001 From: Shyam Chen Date: Wed, 19 Jul 2023 10:06:40 +0800 Subject: [PATCH 074/128] docs: correct pnpm version (#8807) --- .github/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/contributing.md b/.github/contributing.md index 43f3c532bfd..e728e4cc8eb 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -57,7 +57,7 @@ Hi! I'm really excited that you are interested in contributing to Vue.js. Before ## Development Setup -You will need [Node.js](https://nodejs.org) **version 16+**, and [PNPM](https://pnpm.io) **version 7+**. +You will need [Node.js](https://nodejs.org) **version 16+**, and [PNPM](https://pnpm.io) **version 8+**. We also recommend installing [ni](https://github.com/antfu/ni) to help switching between repos using different package managers. `ni` also provides the handy `nr` command which running npm scripts easier. From 3be4e3cbe34b394096210897c1be8deeb6d748d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:36:38 +0800 Subject: [PATCH 075/128] chore: bump word-wrap from 1.2.3 to 1.2.4 (#8821) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62d5e18f419..a4a711ef39b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4305,7 +4305,7 @@ packages: levn: 0.3.0 prelude-ls: 1.1.2 type-check: 0.3.2 - word-wrap: 1.2.3 + word-wrap: 1.2.4 dev: true /optionator@0.9.1: @@ -4317,7 +4317,7 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 + word-wrap: 1.2.4 dev: true /p-finally@1.0.0: @@ -6033,8 +6033,8 @@ packages: babel-walk: 3.0.0-canary-5 dev: true - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + /word-wrap@1.2.4: + resolution: {integrity: sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==} engines: {node: '>=0.10.0'} dev: true From 623ba514ec0f5adc897db90c0f986b1b6905e014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Fri, 11 Aug 2023 17:30:04 +0800 Subject: [PATCH 076/128] chore: format code --- package.json | 6 +++--- packages/compiler-sfc/src/script/importUsageCheck.ts | 6 +++++- packages/dts-test/setupHelpers.test-d.ts | 7 ++++--- packages/reactivity/src/ref.ts | 5 ++++- packages/runtime-core/__tests__/apiOptions.spec.ts | 2 +- .../runtime-core/__tests__/rendererTemplateRef.spec.ts | 2 +- packages/runtime-core/src/components/Teleport.ts | 2 +- pnpm-lock.yaml | 10 +++++----- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index f14db16ddae..d514ccd9190 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "size-baseline": "node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler && cd packages/size-check && vite build && node brotli", "check": "tsc --incremental --noEmit", "lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts", - "format": "prettier --write --cache --parser typescript \"**/*.[tj]s?(x)\"", - "format-check": "prettier --check --cache --parser typescript \"**/*.[tj]s?(x)\"", + "format": "prettier --write --cache \"**/*.[tj]s?(x)\"", + "format-check": "prettier --check --cache \"**/*.[tj]s?(x)\"", "test": "vitest", "test-unit": "vitest -c vitest.unit.config.ts", "test-e2e": "node scripts/build.js vue -f global -d && vitest -c vitest.e2e.config.ts", @@ -84,7 +84,7 @@ "marked": "^4.0.10", "minimist": "^1.2.0", "npm-run-all": "^4.1.5", - "prettier": "^2.7.1", + "prettier": "^3.0.1", "pug": "^3.0.1", "puppeteer": "~19.6.0", "rollup": "^3.26.0", diff --git a/packages/compiler-sfc/src/script/importUsageCheck.ts b/packages/compiler-sfc/src/script/importUsageCheck.ts index 7019dcf2312..f3c3932d829 100644 --- a/packages/compiler-sfc/src/script/importUsageCheck.ts +++ b/packages/compiler-sfc/src/script/importUsageCheck.ts @@ -63,7 +63,11 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { )}` } } - if (prop.type === NodeTypes.ATTRIBUTE && prop.name === 'ref' && prop.value?.content) { + if ( + prop.type === NodeTypes.ATTRIBUTE && + prop.name === 'ref' && + prop.value?.content + ) { code += `,${prop.value.content}` } } diff --git a/packages/dts-test/setupHelpers.test-d.ts b/packages/dts-test/setupHelpers.test-d.ts index 934e6056d2d..feb4085dea0 100644 --- a/packages/dts-test/setupHelpers.test-d.ts +++ b/packages/dts-test/setupHelpers.test-d.ts @@ -100,7 +100,8 @@ describe('defineProps w/ union type declaration + withDefaults', () => { ) }) -describe('defineProps w/ generic type declaration + withDefaults', () => { const res = withDefaults( @@ -117,10 +118,10 @@ describe('defineProps w/ generic type declaration + withDefaults', [123, 33] as T[], - generic2: () => ({ x: 123 } as { x: T }), + generic2: () => ({ x: 123 }) as { x: T }, generic3: () => 'test' as TString, - generic4: () => ({ a: 'test' } as TA) + generic4: () => ({ a: 'test' }) as TA } ) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index ef111fc1ff7..915f5760878 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -138,7 +138,10 @@ class RefImpl { public dep?: Dep = undefined public readonly __v_isRef = true - constructor(value: T, public readonly __v_isShallow: boolean) { + constructor( + value: T, + public readonly __v_isShallow: boolean + ) { this._rawValue = __v_isShallow ? value : toRaw(value) this._value = __v_isShallow ? value : toReactive(value) } diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts index a172196d3f7..ca712e0d3ac 100644 --- a/packages/runtime-core/__tests__/apiOptions.spec.ts +++ b/packages/runtime-core/__tests__/apiOptions.spec.ts @@ -382,7 +382,7 @@ describe('api: options', () => { render() { return this[injectedKey] } - } as any) + }) as any const ChildA = defineChild(['a'], 'a') const ChildB = defineChild({ b: 'a' }) diff --git a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts index 7d6279c5257..28d7a95eb0b 100644 --- a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts +++ b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts @@ -116,7 +116,7 @@ describe('api: template refs', () => { const toggle = ref(true) const Comp = defineComponent( - () => () => toggle.value ? h('div', { ref: fn }) : null + () => () => (toggle.value ? h('div', { ref: fn }) : null) ) render(h(Comp), root) expect(fn.mock.calls[0][0]).toBe(root.children[0]) diff --git a/packages/runtime-core/src/components/Teleport.ts b/packages/runtime-core/src/components/Teleport.ts index 4f7d16bc7d1..19ccbc5de27 100644 --- a/packages/runtime-core/src/components/Teleport.ts +++ b/packages/runtime-core/src/components/Teleport.ts @@ -400,7 +400,7 @@ function hydrateTeleport( // Force-casted public typing for h and TSX props inference export const Teleport = TeleportImpl as unknown as { __isTeleport: true - new(): { + new (): { $props: VNodeProps & TeleportProps $slots: { default(): VNode[] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4a711ef39b..378cc5749d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 prettier: - specifier: ^2.7.1 - version: 2.8.8 + specifier: ^3.0.1 + version: 3.0.1 pug: specifier: ^3.0.1 version: 3.0.2 @@ -4621,9 +4621,9 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + /prettier@3.0.1: + resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + engines: {node: '>=14'} hasBin: true dev: true From bd08f057fc568f15ca19bfae1a4e506f2bc48ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Mon, 14 Aug 2023 19:43:55 +0800 Subject: [PATCH 077/128] ci: enforce format check --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c52bbc06970..232c69b3b75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,8 +109,8 @@ jobs: - name: Run eslint run: pnpm run lint - # - name: Run prettier - # run: pnpm run format-check + - name: Run prettier + run: pnpm run format-check - name: Run type declaration tests run: pnpm run test-dts From 1b564052994d6aefbb2c091d7dbff6f1e11cebbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Mon, 21 Aug 2023 11:33:51 +0800 Subject: [PATCH 078/128] ci: improved size report (#8992) --- .eslintrc.cjs | 7 +- .github/contributing.md | 2 - .github/workflows/ci.yml | 20 ---- .github/workflows/size-report.yml | 61 +++++++++++ package.json | 12 ++- packages/size-check/README.md | 3 - packages/size-check/brotli.js | 6 -- packages/size-check/package.json | 11 -- packages/size-check/src/index.ts | 6 -- packages/size-check/vite.config.js | 15 --- pnpm-lock.yaml | 162 ++++++++++++++++++++++++----- scripts/aliases.js | 7 +- scripts/build.js | 50 ++++++--- scripts/size-report.ts | 105 +++++++++++++++++++ scripts/usage-size.ts | 99 ++++++++++++++++++ tsconfig.build.json | 1 - 16 files changed, 443 insertions(+), 124 deletions(-) create mode 100644 .github/workflows/size-report.yml delete mode 100644 packages/size-check/README.md delete mode 100644 packages/size-check/brotli.js delete mode 100644 packages/size-check/package.json delete mode 100644 packages/size-check/src/index.ts delete mode 100644 packages/size-check/vite.config.js create mode 100644 scripts/size-report.ts create mode 100644 scripts/usage-size.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ec05a113113..04ecf049ca9 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -74,12 +74,7 @@ module.exports = { }, // Node scripts { - files: [ - 'scripts/**', - '*.{js,ts}', - 'packages/**/index.js', - 'packages/size-check/**' - ], + files: ['scripts/**', '*.{js,ts}', 'packages/**/index.js'], rules: { 'no-restricted-globals': 'off', 'no-restricted-syntax': 'off' diff --git a/.github/contributing.md b/.github/contributing.md index e728e4cc8eb..0c6771ca0b4 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -248,8 +248,6 @@ This repository employs a [monorepo](https://en.wikipedia.org/wiki/Monorepo) set - `template-explorer`: A development tool for debugging compiler output, continuously deployed at https://template-explorer.vuejs.org/. To run it locally, run [`nr dev-compiler`](#nr-dev-compiler). - - `size-check`: Used for checking built bundle sizes on CI. - ### Importing Packages The packages can import each other directly using their package names. Note that when importing a package, the name listed in its `package.json` should be used. Most of the time the `@vue/` prefix is needed: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 232c69b3b75..8c08c9a935a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -114,23 +114,3 @@ jobs: - name: Run type declaration tests run: pnpm run test-dts - - size: - runs-on: ubuntu-latest - if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - env: - CI_JOB_NUMBER: 1 - steps: - - uses: actions/checkout@v3 - - - name: Install pnpm - uses: pnpm/action-setup@v2 - - - name: Set node version to 18 - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'pnpm' - - - run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install - - run: pnpm run size diff --git a/.github/workflows/size-report.yml b/.github/workflows/size-report.yml new file mode 100644 index 00000000000..87c6865927b --- /dev/null +++ b/.github/workflows/size-report.yml @@ -0,0 +1,61 @@ +name: size report + +on: + pull_request: + branches: + - main + +permissions: + contents: read + pull-requests: write + +jobs: + size: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + + - name: Set node version to LTS + uses: actions/setup-node@v3 + with: + node-version: lts/* + cache: pnpm + + - run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install + - run: pnpm run size + + - name: Download Previous Size Report + id: download-artifact + uses: dawidd6/action-download-artifact@v2 + with: + branch: main + name: size-report + path: temp/size-prev + if_no_artifact_found: warn + + - name: Upload Size Report + uses: actions/upload-artifact@v3 + with: + name: size-report + path: temp/size + + - name: Compare size + run: pnpm tsx scripts/size-report.ts > size.md + + - name: Read Size Markdown + id: size-markdown + uses: juliangruber/read-file-action@v1 + with: + path: ./size.md + + - name: Create Comment + uses: actions-cool/maintain-one-comment@v3 + with: + body: | + ${{steps.size-markdown.outputs.content}} + + body-include: '' diff --git a/package.json b/package.json index d514ccd9190..b4ee1b00082 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,10 @@ "dev": "node scripts/dev.js", "build": "node scripts/build.js", "build-dts": "tsc -p tsconfig.build.json && rollup -c rollup.dts.config.js", - "size": "run-s size-global size-baseline", - "size-global": "node scripts/build.js vue runtime-dom -f global -p", - "size-baseline": "node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler && cd packages/size-check && vite build && node brotli", + "size": "run-s \"size-*\" && tsx scripts/usage-size.ts", + "size-global": "node scripts/build.js vue runtime-dom -f global -p --size", + "size-esm-runtime": "node scripts/build.js vue -f esm-bundler-runtime", + "size-esm": "node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler", "check": "tsc --incremental --noEmit", "lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts", "format": "prettier --write --cache \"**/*.[tj]s?(x)\"", @@ -81,10 +82,12 @@ "lint-staged": "^10.2.10", "lodash": "^4.17.15", "magic-string": "^0.30.0", + "markdown-table": "^3.0.3", "marked": "^4.0.10", "minimist": "^1.2.0", "npm-run-all": "^4.1.5", "prettier": "^3.0.1", + "pretty-bytes": "^6.1.1", "pug": "^3.0.1", "puppeteer": "~19.6.0", "rollup": "^3.26.0", @@ -94,9 +97,10 @@ "semver": "^7.3.2", "serve": "^12.0.0", "simple-git-hooks": "^2.8.1", - "terser": "^5.15.1", + "terser": "^5.19.2", "todomvc-app-css": "^2.3.0", "tslib": "^2.5.0", + "tsx": "^3.12.7", "typescript": "^5.1.6", "vite": "^4.3.0", "vitest": "^0.30.1" diff --git a/packages/size-check/README.md b/packages/size-check/README.md deleted file mode 100644 index 23cf1899eaf..00000000000 --- a/packages/size-check/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Size Check - -This package is private and is used for checking the baseline runtime size after tree-shaking (with only the bare minimal code required to render something to the screen). diff --git a/packages/size-check/brotli.js b/packages/size-check/brotli.js deleted file mode 100644 index f9dedac0b1c..00000000000 --- a/packages/size-check/brotli.js +++ /dev/null @@ -1,6 +0,0 @@ -const { brotliCompressSync } = require('zlib') - -const file = require('fs').readFileSync('dist/index.js') -const compressed = brotliCompressSync(file) -const compressedSize = (compressed.length / 1024).toFixed(2) + 'kb' -console.log(`brotli: ${compressedSize}`) diff --git a/packages/size-check/package.json b/packages/size-check/package.json deleted file mode 100644 index 1f9fba88594..00000000000 --- a/packages/size-check/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@vue/size-check", - "version": "3.3.4", - "private": true, - "scripts": { - "build": "vite build" - }, - "dependencies": { - "vue": "workspace:*" - } -} diff --git a/packages/size-check/src/index.ts b/packages/size-check/src/index.ts deleted file mode 100644 index ad3b68a5cc1..00000000000 --- a/packages/size-check/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { h, createApp } from 'vue' - -// The bare minimum code required for rendering something to the screen -createApp({ - render: () => h('div', 'hello world!') -}).mount('#app') diff --git a/packages/size-check/vite.config.js b/packages/size-check/vite.config.js deleted file mode 100644 index 73721f95910..00000000000 --- a/packages/size-check/vite.config.js +++ /dev/null @@ -1,15 +0,0 @@ -export default { - define: { - __VUE_PROD_DEVTOOLS__: false, - __VUE_OPTIONS_API__: true - }, - build: { - rollupOptions: { - input: ['src/index.ts'], - output: { - entryFileNames: `[name].js` - } - }, - minify: 'terser' - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 378cc5749d4..7c6e2a198c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: magic-string: specifier: ^0.30.0 version: 0.30.0 + markdown-table: + specifier: ^3.0.3 + version: 3.0.3 marked: specifier: ^4.0.10 version: 4.3.0 @@ -98,6 +101,9 @@ importers: prettier: specifier: ^3.0.1 version: 3.0.1 + pretty-bytes: + specifier: ^6.1.1 + version: 6.1.1 pug: specifier: ^3.0.1 version: 3.0.2 @@ -126,23 +132,26 @@ importers: specifier: ^2.8.1 version: 2.8.1 terser: - specifier: ^5.15.1 - version: 5.18.2 + specifier: ^5.19.2 + version: 5.19.2 todomvc-app-css: specifier: ^2.3.0 version: 2.4.2 tslib: specifier: ^2.5.0 version: 2.6.0 + tsx: + specifier: ^3.12.7 + version: 3.12.7 typescript: specifier: ^5.1.6 version: 5.1.6 vite: specifier: ^4.3.0 - version: 4.3.1(@types/node@16.18.38)(terser@5.18.2) + version: 4.3.1(@types/node@16.18.38)(terser@5.19.2) vitest: specifier: ^0.30.1 - version: 0.30.1(jsdom@21.1.0)(terser@5.18.2) + version: 0.30.1(jsdom@21.1.0)(terser@5.19.2) packages/compiler-core: dependencies: @@ -354,12 +363,6 @@ importers: packages/shared: {} - packages/size-check: - dependencies: - vue: - specifier: workspace:* - version: link:../vue - packages/template-explorer: dependencies: monaco-editor: @@ -422,11 +425,12 @@ packages: '@babel/highlight': 7.22.5 dev: true - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.22.10 + chalk: 2.4.2 dev: true /@babel/compat-data@7.21.0: @@ -567,6 +571,15 @@ packages: - supports-color dev: true + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -587,7 +600,7 @@ packages: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.10 '@babel/parser': 7.21.3 '@babel/types': 7.21.3 dev: true @@ -596,7 +609,7 @@ packages: resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.10 '@babel/generator': 7.21.3 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 @@ -618,6 +631,27 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.7.0 + dev: true + + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.19 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.7.0 + dev: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -1078,11 +1112,25 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} @@ -1091,13 +1139,17 @@ packages: /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: @@ -1105,6 +1157,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jspm/core@2.0.1: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} dev: true @@ -1233,7 +1292,7 @@ packages: rollup: 3.26.2 serialize-javascript: 6.0.1 smob: 0.0.6 - terser: 5.18.2 + terser: 5.19.2 dev: true /@rollup/pluginutils@5.0.2(rollup@3.26.2): @@ -1464,7 +1523,7 @@ packages: istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 test-exclude: 6.0.0 - vitest: 0.30.1(jsdom@21.1.0)(terser@5.18.2) + vitest: 0.30.1(jsdom@21.1.0)(terser@5.19.2) transitivePeerDependencies: - supports-color dev: true @@ -1568,6 +1627,12 @@ packages: hasBin: true dev: true + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -3066,6 +3131,12 @@ packages: get-intrinsic: 1.2.0 dev: true + /get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} @@ -3991,6 +4062,10 @@ packages: engines: {node: '>=8'} dev: true + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true + /marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} @@ -4414,7 +4489,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.10 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4627,6 +4702,11 @@ packages: hasBin: true dev: true + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4963,6 +5043,10 @@ packages: engines: {node: '>=4'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -5007,7 +5091,7 @@ packages: rollup: 3.26.2 typescript: 5.1.6 optionalDependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.10 dev: true /rollup-plugin-esbuild@5.0.0(esbuild@0.17.19)(rollup@3.26.2): @@ -5492,6 +5576,17 @@ packages: source-map-support: 0.5.21 dev: true + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -5609,6 +5704,17 @@ packages: typescript: 5.1.6 dev: true + /tsx@3.12.7: + resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -5758,7 +5864,7 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node@0.30.1(@types/node@16.18.38)(terser@5.18.2): + /vite-node@0.30.1(@types/node@16.18.38)(terser@5.19.2): resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} engines: {node: '>=v14.18.0'} hasBin: true @@ -5768,7 +5874,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.1(@types/node@16.18.38)(terser@5.18.2) + vite: 4.3.1(@types/node@16.18.38)(terser@5.19.2) transitivePeerDependencies: - '@types/node' - less @@ -5779,7 +5885,7 @@ packages: - terser dev: true - /vite@4.3.1(@types/node@16.18.38)(terser@5.18.2): + /vite@4.3.1(@types/node@16.18.38)(terser@5.19.2): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -5808,7 +5914,7 @@ packages: esbuild: 0.17.19 postcss: 8.4.21 rollup: 3.26.2 - terser: 5.18.2 + terser: 5.19.2 optionalDependencies: fsevents: 2.3.2 dev: true @@ -5850,7 +5956,7 @@ packages: fsevents: 2.3.2 dev: true - /vitest@0.30.1(jsdom@21.1.0)(terser@5.18.2): + /vitest@0.30.1(jsdom@21.1.0)(terser@5.19.2): resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -5905,8 +6011,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.4.0 tinypool: 0.4.0 - vite: 4.3.1(@types/node@16.18.38)(terser@5.18.2) - vite-node: 0.30.1(@types/node@16.18.38)(terser@5.18.2) + vite: 4.3.1(@types/node@16.18.38)(terser@5.19.2) + vite-node: 0.30.1(@types/node@16.18.38)(terser@5.19.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/scripts/aliases.js b/scripts/aliases.js index 95e3016322c..34a7c643557 100644 --- a/scripts/aliases.js +++ b/scripts/aliases.js @@ -19,12 +19,7 @@ const entries = { '@vue/compat': resolveEntryForPkg('vue-compat') } -const nonSrcPackages = [ - 'sfc-playground', - 'size-check', - 'template-explorer', - 'dts-test' -] +const nonSrcPackages = ['sfc-playground', 'template-explorer', 'dts-test'] for (const dir of dirs) { const key = `@vue/${dir}` diff --git a/scripts/build.js b/scripts/build.js index 75a619046be..1f8af65017d 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -27,6 +27,7 @@ import { cpus } from 'node:os' import { createRequire } from 'node:module' import { targets as allTargets, fuzzyMatchTarget } from './utils.js' import { scanEnums } from './const-enum.js' +import prettyBytes from 'pretty-bytes' const require = createRequire(import.meta.url) const args = minimist(process.argv.slice(2)) @@ -38,18 +39,22 @@ const buildTypes = args.withTypes || args.t const sourceMap = args.sourcemap || args.s const isRelease = args.release const buildAllMatching = args.all || args.a +const writeSize = args.size const commit = execa.sync('git', ['rev-parse', 'HEAD']).stdout.slice(0, 7) +const sizeDir = path.resolve('temp/size') + run() async function run() { + if (writeSize) await fs.mkdir(sizeDir, { recursive: true }) const removeCache = scanEnums() try { const resolvedTargets = targets.length ? fuzzyMatchTarget(targets, buildAllMatching) : allTargets await buildAll(resolvedTargets) - checkAllSizes(resolvedTargets) + await checkAllSizes(resolvedTargets) if (buildTypes) { await execa( 'pnpm', @@ -129,39 +134,52 @@ async function build(target) { ) } -function checkAllSizes(targets) { +async function checkAllSizes(targets) { if (devOnly || (formats && !formats.includes('global'))) { return } console.log() for (const target of targets) { - checkSize(target) + await checkSize(target) } console.log() } -function checkSize(target) { +async function checkSize(target) { const pkgDir = path.resolve(`packages/${target}`) - checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`) + await checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`) if (!formats || formats.includes('global-runtime')) { - checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`) + await checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`) } } -function checkFileSize(filePath) { +async function checkFileSize(filePath) { if (!existsSync(filePath)) { return } - const file = readFileSync(filePath) - const minSize = (file.length / 1024).toFixed(2) + 'kb' + const file = await fs.readFile(filePath) + const fileName = path.basename(filePath) + const gzipped = gzipSync(file) - const gzippedSize = (gzipped.length / 1024).toFixed(2) + 'kb' - const compressed = brotliCompressSync(file) - // @ts-ignore - const compressedSize = (compressed.length / 1024).toFixed(2) + 'kb' + const brotli = brotliCompressSync(file) + console.log( - `${chalk.gray( - chalk.bold(path.basename(filePath)) - )} min:${minSize} / gzip:${gzippedSize} / brotli:${compressedSize}` + `${chalk.gray(chalk.bold(fileName))} min:${prettyBytes( + file.length + )} / gzip:${prettyBytes(gzipped.length)} / brotli:${prettyBytes( + brotli.length + )}` ) + + if (writeSize) + await fs.writeFile( + path.resolve(sizeDir, `${fileName}.json`), + JSON.stringify({ + file: fileName, + size: file.length, + gzip: gzipped.length, + brotli: brotli.length + }), + 'utf-8' + ) } diff --git a/scripts/size-report.ts b/scripts/size-report.ts new file mode 100644 index 00000000000..56e4491a19c --- /dev/null +++ b/scripts/size-report.ts @@ -0,0 +1,105 @@ +import path from 'node:path' +import { markdownTable } from 'markdown-table' +import prettyBytes from 'pretty-bytes' +import { readdir } from 'node:fs/promises' +import { existsSync } from 'node:fs' + +interface SizeResult { + size: number + gzip: number + brotli: number +} + +interface BundleResult extends SizeResult { + file: string +} + +type UsageResult = Record + +const currDir = path.resolve('temp/size') +const prevDir = path.resolve('temp/size-prev') +let output = '## Size Report\n\n' +const sizeHeaders = ['Size', 'Gzip', 'Brotli'] + +run() + +async function run() { + await renderFiles() + await renderUsages() + + process.stdout.write(output) +} + +async function renderFiles() { + const filterFiles = (files: string[]) => + files.filter(file => !file.startsWith('_')) + + const curr = filterFiles(await readdir(currDir)) + const prev = existsSync(prevDir) ? filterFiles(await readdir(prevDir)) : [] + const fileList = new Set([...curr, ...prev]) + + const rows: string[][] = [] + for (const file of fileList) { + const currPath = path.resolve(currDir, file) + const prevPath = path.resolve(prevDir, file) + + const curr = await importJSON(currPath) + const prev = await importJSON(prevPath) + const fileName = curr?.file || prev?.file || '' + + if (!curr) { + rows.push([`~~${fileName}~~`]) + } else + rows.push([ + fileName, + `${prettyBytes(curr.size)}${getDiff(curr.size, prev?.size)}`, + `${prettyBytes(curr.gzip)}${getDiff(curr.gzip, prev?.gzip)}`, + `${prettyBytes(curr.brotli)}${getDiff(curr.brotli, prev?.brotli)}` + ]) + } + + output += '### Bundles\n\n' + output += markdownTable([['File', ...sizeHeaders], ...rows]) + output += '\n\n' +} + +async function renderUsages() { + const curr = (await importJSON( + path.resolve(currDir, '_usages.json') + ))! + const prev = await importJSON( + path.resolve(prevDir, '_usages.json') + ) + output += '\n### Usages\n\n' + + const data = Object.values(curr) + .map(usage => { + const prevUsage = prev?.[usage.name] + const diffSize = getDiff(usage.size, prevUsage?.size) + const diffGzipped = getDiff(usage.gzip, prevUsage?.gzip) + const diffBrotli = getDiff(usage.brotli, prevUsage?.brotli) + + return [ + usage.name, + `${prettyBytes(usage.size)}${diffSize}`, + `${prettyBytes(usage.gzip)}${diffGzipped}`, + `${prettyBytes(usage.brotli)}${diffBrotli}` + ] + }) + .filter((usage): usage is string[] => !!usage) + + output += `${markdownTable([['Name', ...sizeHeaders], ...data])}\n\n` +} + +async function importJSON(path: string): Promise { + if (!existsSync(path)) return undefined + return (await import(path, { assert: { type: 'json' } })).default +} + +function getDiff(curr: number, prev?: number) { + if (prev === undefined) return '' + const diff = curr - prev + if (diff === 0) return '' + const sign = diff > 0 ? '+' : '' + return ` (**${sign}${prettyBytes(diff)}**)` +} diff --git a/scripts/usage-size.ts b/scripts/usage-size.ts new file mode 100644 index 00000000000..1a1013b7847 --- /dev/null +++ b/scripts/usage-size.ts @@ -0,0 +1,99 @@ +import { mkdir, writeFile } from 'fs/promises' +import path from 'node:path' +import { rollup } from 'rollup' +import nodeResolve from '@rollup/plugin-node-resolve' +import { minify } from 'terser' +import replace from '@rollup/plugin-replace' +import { brotliCompressSync, gzipSync } from 'node:zlib' + +const sizeDir = path.resolve('temp/size') +const entry = path.resolve('./packages/vue/dist/vue.runtime.esm-bundler.js') + +interface Preset { + name: string + imports: string[] +} + +const presets: Preset[] = [ + { name: 'createApp', imports: ['createApp'] }, + { name: 'createSSRApp', imports: ['createSSRApp'] }, + { name: 'defineCustomElement', imports: ['defineCustomElement'] }, + { + name: 'overall', + imports: [ + 'createApp', + 'ref', + 'watch', + 'Transition', + 'KeepAlive', + 'Suspense' + ] + } +] + +main() + +async function main() { + const tasks: ReturnType[] = [] + for (const preset of presets) { + tasks.push(generateBundle(preset)) + } + + const results = Object.fromEntries( + (await Promise.all(tasks)).map(r => [r.name, r]) + ) + + await mkdir(sizeDir, { recursive: true }) + await writeFile( + path.resolve(sizeDir, '_usages.json'), + JSON.stringify(results), + 'utf-8' + ) +} + +async function generateBundle(preset: Preset) { + const id = 'virtual:entry' + const content = `export { ${preset.imports.join(', ')} } from '${entry}'` + const result = await rollup({ + input: id, + plugins: [ + { + name: 'usage-size-plugin', + resolveId(_id) { + if (_id === id) return id + return null + }, + load(_id) { + if (_id === id) return content + } + }, + nodeResolve(), + replace({ + 'process.env.NODE_ENV': '"production"', + __VUE_PROD_DEVTOOLS__: 'false', + __VUE_OPTIONS_API__: 'true', + preventAssignment: true + }) + ] + }) + + const generated = await result.generate({}) + const bundled = generated.output[0].code + const minified = ( + await minify(bundled, { + module: true, + toplevel: true + }) + ).code! + + const size = minified.length + const gzip = gzipSync(minified).length + const brotli = brotliCompressSync(minified).length + + return { + name: preset.name, + size, + gzip, + brotli + } +} diff --git a/tsconfig.build.json b/tsconfig.build.json index 8b7749b858b..89aaa2278f4 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -9,7 +9,6 @@ "packages/runtime-test", "packages/template-explorer", "packages/sfc-playground", - "packages/size-check", "packages/dts-test" ] } From 61c3c8e86a47c2857195cc9115bf13e070c86764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Mon, 21 Aug 2023 11:44:43 +0800 Subject: [PATCH 079/128] ci: fix size report permissions --- .github/workflows/size-data.yml | 49 +++++++++++++++++++++++++ .github/workflows/size-report.yml | 61 ++++++++++++++++++++----------- 2 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/size-data.yml diff --git a/.github/workflows/size-data.yml b/.github/workflows/size-data.yml new file mode 100644 index 00000000000..647e029c578 --- /dev/null +++ b/.github/workflows/size-data.yml @@ -0,0 +1,49 @@ +name: size data + +on: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + upload: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + + - name: Set node version to LTS + uses: actions/setup-node@v3 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install + + - run: pnpm run size + + - name: Upload Size Data + uses: actions/upload-artifact@v3 + with: + name: size-data + path: temp/size + + - name: Save PR number + if: ${{github.event_name == 'pull_request'}} + run: echo ${{ github.event.number }} > ./pr.txt + + - uses: actions/upload-artifact@v2 + if: ${{github.event_name == 'pull_request'}} + with: + name: pr-number + path: pr.txt diff --git a/.github/workflows/size-report.yml b/.github/workflows/size-report.yml index 87c6865927b..4d7e49e523b 100644 --- a/.github/workflows/size-report.yml +++ b/.github/workflows/size-report.yml @@ -1,18 +1,22 @@ name: size report on: - pull_request: - branches: - - main + workflow_run: + workflows: ['size data'] + types: + - completed permissions: contents: read pull-requests: write + issues: write jobs: - size: + size-report: runs-on: ubuntu-latest - + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' steps: - uses: actions/checkout@v3 @@ -25,37 +29,52 @@ jobs: node-version: lts/* cache: pnpm - - run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install - - run: pnpm run size + - name: Install dependencies + run: PUPPETEER_SKIP_DOWNLOAD=1 pnpm install - - name: Download Previous Size Report - id: download-artifact + - name: Download PR number uses: dawidd6/action-download-artifact@v2 with: - branch: main - name: size-report - path: temp/size-prev - if_no_artifact_found: warn + name: pr-number + run_id: ${{ github.event.workflow_run.id }} + + - name: Read PR Number + id: pr-number + uses: juliangruber/read-file-action@v1 + with: + path: ./pr.txt - - name: Upload Size Report - uses: actions/upload-artifact@v3 + - name: Download Size Data + uses: dawidd6/action-download-artifact@v2 with: - name: size-report + name: size-data + run_id: ${{ github.event.workflow_run.id }} path: temp/size + - name: Download Previous Size Data + uses: dawidd6/action-download-artifact@v2 + with: + branch: main + workflow: size-data.yml + name: size-data + path: temp/size-prev + if_no_artifact_found: warn + - name: Compare size - run: pnpm tsx scripts/size-report.ts > size.md + run: pnpm tsx scripts/size-report.ts > size-report.md - - name: Read Size Markdown - id: size-markdown + - name: Read Size Report + id: size-report uses: juliangruber/read-file-action@v1 with: - path: ./size.md + path: ./size-report.md - name: Create Comment uses: actions-cool/maintain-one-comment@v3 with: + token: ${{ secrets.GITHUB_TOKEN }} + number: ${{ steps.pr-number.outputs.content }} body: | - ${{steps.size-markdown.outputs.content}} + ${{ steps.size-report.outputs.content }} body-include: '' From e7d5a41758013966c3d9ce47c01f13da7d8c395a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Mon, 21 Aug 2023 15:43:49 +0800 Subject: [PATCH 080/128] ci: fix get previous size data --- .github/workflows/size-report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/size-report.yml b/.github/workflows/size-report.yml index 4d7e49e523b..75c52f717b3 100644 --- a/.github/workflows/size-report.yml +++ b/.github/workflows/size-report.yml @@ -56,6 +56,7 @@ jobs: with: branch: main workflow: size-data.yml + event: push name: size-data path: temp/size-prev if_no_artifact_found: warn From 02c6924bcd29cb0ede9c3e049543b3c85a714346 Mon Sep 17 00:00:00 2001 From: Waleed Khaled Date: Tue, 22 Aug 2023 11:50:27 +0300 Subject: [PATCH 081/128] refactor(reactivity): encapsulate reactive handlers in class (#8586) reactive obj create has a huge positive impact (200% - 700%) get/set reactive obj props has a small negative impact (1% - 5%) --- packages/reactivity/src/baseHandlers.ts | 113 ++++++++++++------------ 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 45ecfa6d38a..259b44a1edc 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -26,7 +26,6 @@ import { hasChanged, isArray, isIntegerKey, - extend, makeMap } from '@vue/shared' import { isRef } from './ref' @@ -45,11 +44,6 @@ const builtInSymbols = new Set( .filter(isSymbol) ) -const get = /*#__PURE__*/ createGetter() -const shallowGet = /*#__PURE__*/ createGetter(false, true) -const readonlyGet = /*#__PURE__*/ createGetter(true) -const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true) - const arrayInstrumentations = /*#__PURE__*/ createArrayInstrumentations() function createArrayInstrumentations() { @@ -91,8 +85,15 @@ function hasOwnProperty(this: object, key: string) { return obj.hasOwnProperty(key) } -function createGetter(isReadonly = false, shallow = false) { - return function get(target: Target, key: string | symbol, receiver: object) { +class BaseReactiveHandler implements ProxyHandler { + constructor( + protected readonly _isReadonly = false, + protected readonly _shallow = false + ) {} + + get(target: Target, key: string | symbol, receiver: object) { + const isReadonly = this._isReadonly, + shallow = this._shallow if (key === ReactiveFlags.IS_REACTIVE) { return !isReadonly } else if (key === ReactiveFlags.IS_READONLY) { @@ -155,11 +156,12 @@ function createGetter(isReadonly = false, shallow = false) { } } -const set = /*#__PURE__*/ createSetter() -const shallowSet = /*#__PURE__*/ createSetter(true) +class MutableReactiveHandler extends BaseReactiveHandler { + constructor(shallow = false) { + super(false, shallow) + } -function createSetter(shallow = false) { - return function set( + set( target: object, key: string | symbol, value: unknown, @@ -169,7 +171,7 @@ function createSetter(shallow = false) { if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) { return false } - if (!shallow) { + if (!this._shallow) { if (!isShallow(value) && !isReadonly(value)) { oldValue = toRaw(oldValue) value = toRaw(value) @@ -197,42 +199,40 @@ function createSetter(shallow = false) { } return result } -} -function deleteProperty(target: object, key: string | symbol): boolean { - const hadKey = hasOwn(target, key) - const oldValue = (target as any)[key] - const result = Reflect.deleteProperty(target, key) - if (result && hadKey) { - trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) + deleteProperty(target: object, key: string | symbol): boolean { + const hadKey = hasOwn(target, key) + const oldValue = (target as any)[key] + const result = Reflect.deleteProperty(target, key) + if (result && hadKey) { + trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) + } + return result } - return result -} -function has(target: object, key: string | symbol): boolean { - const result = Reflect.has(target, key) - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, TrackOpTypes.HAS, key) + has(target: object, key: string | symbol): boolean { + const result = Reflect.has(target, key) + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, TrackOpTypes.HAS, key) + } + return result + } + ownKeys(target: object): (string | symbol)[] { + track( + target, + TrackOpTypes.ITERATE, + isArray(target) ? 'length' : ITERATE_KEY + ) + return Reflect.ownKeys(target) } - return result -} - -function ownKeys(target: object): (string | symbol)[] { - track(target, TrackOpTypes.ITERATE, isArray(target) ? 'length' : ITERATE_KEY) - return Reflect.ownKeys(target) } -export const mutableHandlers: ProxyHandler = { - get, - set, - deleteProperty, - has, - ownKeys -} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + constructor(shallow = false) { + super(true, shallow) + } -export const readonlyHandlers: ProxyHandler = { - get: readonlyGet, - set(target, key) { + set(target: object, key: string | symbol) { if (__DEV__) { warn( `Set operation on key "${String(key)}" failed: target is readonly.`, @@ -240,8 +240,9 @@ export const readonlyHandlers: ProxyHandler = { ) } return true - }, - deleteProperty(target, key) { + } + + deleteProperty(target: object, key: string | symbol) { if (__DEV__) { warn( `Delete operation on key "${String(key)}" failed: target is readonly.`, @@ -252,22 +253,18 @@ export const readonlyHandlers: ProxyHandler = { } } -export const shallowReactiveHandlers = /*#__PURE__*/ extend( - {}, - mutableHandlers, - { - get: shallowGet, - set: shallowSet - } +export const mutableHandlers: ProxyHandler = + /*#__PURE__*/ new MutableReactiveHandler() + +export const readonlyHandlers: ProxyHandler = + /*#__PURE__*/ new ReadonlyReactiveHandler() + +export const shallowReactiveHandlers = /*#__PURE__*/ new MutableReactiveHandler( + true ) // Props handlers are special in the sense that it should not unwrap top-level // refs (in order to allow refs to be explicitly passed down), but should // retain the reactivity of the normal readonly object. -export const shallowReadonlyHandlers = /*#__PURE__*/ extend( - {}, - readonlyHandlers, - { - get: shallowReadonlyGet - } -) +export const shallowReadonlyHandlers = + /*#__PURE__*/ new ReadonlyReactiveHandler(true) From 2ffe3d5b3e953b63d4743b1e2bc242d50916b545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Tue, 22 Aug 2023 16:57:15 +0800 Subject: [PATCH 082/128] refactor: use symbol for private properties (#8681) --- .../src/components/BaseTransition.ts | 31 ++++++++++--------- .../runtime-dom/__tests__/patchClass.spec.ts | 6 ++-- .../runtime-dom/src/components/Transition.ts | 12 ++++--- .../src/components/TransitionGroup.ts | 23 ++++++++------ packages/runtime-dom/src/directives/vModel.ts | 28 +++++++++-------- packages/runtime-dom/src/directives/vShow.ts | 8 +++-- packages/runtime-dom/src/modules/class.ts | 4 +-- packages/runtime-dom/src/modules/events.ts | 6 ++-- packages/runtime-dom/src/modules/style.ts | 3 +- packages/vue/__tests__/svgNamespace.spec.ts | 3 +- 10 files changed, 70 insertions(+), 54 deletions(-) diff --git a/packages/runtime-core/src/components/BaseTransition.ts b/packages/runtime-core/src/components/BaseTransition.ts index a4e862335eb..9cb80b94ef0 100644 --- a/packages/runtime-core/src/components/BaseTransition.ts +++ b/packages/runtime-core/src/components/BaseTransition.ts @@ -22,6 +22,9 @@ import { RendererElement } from '../renderer' type Hook void> = T | T[] +const leaveCbKey = Symbol('_leaveCb') +const enterCbKey = Symbol('_enterCb') + export interface BaseTransitionProps { mode?: 'in-out' | 'out-in' | 'default' appear?: boolean @@ -89,8 +92,8 @@ export interface TransitionElement { // in persisted mode (e.g. v-show), the same element is toggled, so the // pending enter/leave callbacks may need to be cancelled if the state is toggled // before it finishes. - _enterCb?: PendingCallback - _leaveCb?: PendingCallback + [enterCbKey]?: PendingCallback + [leaveCbKey]?: PendingCallback } export function useTransitionState(): TransitionState { @@ -259,9 +262,9 @@ const BaseTransitionImpl: ComponentOptions = { ) leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild // early removal callback - el._leaveCb = () => { + el[leaveCbKey] = () => { earlyRemove() - el._leaveCb = undefined + el[leaveCbKey] = undefined delete enterHooks.delayedLeave } enterHooks.delayedLeave = delayedLeave @@ -366,18 +369,18 @@ export function resolveTransitionHooks( } } // for same element (v-show) - if (el._leaveCb) { - el._leaveCb(true /* cancelled */) + if (el[leaveCbKey]) { + el[leaveCbKey](true /* cancelled */) } // for toggled element with same key (v-if) const leavingVNode = leavingVNodesCache[key] if ( leavingVNode && isSameVNodeType(vnode, leavingVNode) && - leavingVNode.el!._leaveCb + (leavingVNode.el as TransitionElement)[leaveCbKey] ) { // force early removal (not cancelled) - leavingVNode.el!._leaveCb() + ;(leavingVNode.el as TransitionElement)[leaveCbKey]!() } callHook(hook, [el]) }, @@ -396,7 +399,7 @@ export function resolveTransitionHooks( } } let called = false - const done = (el._enterCb = (cancelled?) => { + const done = (el[enterCbKey] = (cancelled?) => { if (called) return called = true if (cancelled) { @@ -407,7 +410,7 @@ export function resolveTransitionHooks( if (hooks.delayedLeave) { hooks.delayedLeave() } - el._enterCb = undefined + el[enterCbKey] = undefined }) if (hook) { callAsyncHook(hook, [el, done]) @@ -418,15 +421,15 @@ export function resolveTransitionHooks( leave(el, remove) { const key = String(vnode.key) - if (el._enterCb) { - el._enterCb(true /* cancelled */) + if (el[enterCbKey]) { + el[enterCbKey](true /* cancelled */) } if (state.isUnmounting) { return remove() } callHook(onBeforeLeave, [el]) let called = false - const done = (el._leaveCb = (cancelled?) => { + const done = (el[leaveCbKey] = (cancelled?) => { if (called) return called = true remove() @@ -435,7 +438,7 @@ export function resolveTransitionHooks( } else { callHook(onAfterLeave, [el]) } - el._leaveCb = undefined + el[leaveCbKey] = undefined if (leavingVNodesCache[key] === vnode) { delete leavingVNodesCache[key] } diff --git a/packages/runtime-dom/__tests__/patchClass.spec.ts b/packages/runtime-dom/__tests__/patchClass.spec.ts index a784c7d543f..c8da741677a 100644 --- a/packages/runtime-dom/__tests__/patchClass.spec.ts +++ b/packages/runtime-dom/__tests__/patchClass.spec.ts @@ -1,5 +1,5 @@ import { patchProp } from '../src/patchProp' -import { ElementWithTransition } from '../src/components/Transition' +import { ElementWithTransition, vtcKey } from '../src/components/Transition' import { svgNS } from '../src/nodeOps' describe('runtime-dom: class patching', () => { @@ -13,12 +13,12 @@ describe('runtime-dom: class patching', () => { test('transition class', () => { const el = document.createElement('div') as ElementWithTransition - el._vtc = new Set(['bar', 'baz']) + el[vtcKey] = new Set(['bar', 'baz']) patchProp(el, 'class', null, 'foo') expect(el.className).toBe('foo bar baz') patchProp(el, 'class', null, null) expect(el.className).toBe('bar baz') - delete el._vtc + delete el[vtcKey] patchProp(el, 'class', null, 'foo') expect(el.className).toBe('foo') }) diff --git a/packages/runtime-dom/src/components/Transition.ts b/packages/runtime-dom/src/components/Transition.ts index eebfdccca35..b0675213298 100644 --- a/packages/runtime-dom/src/components/Transition.ts +++ b/packages/runtime-dom/src/components/Transition.ts @@ -32,12 +32,14 @@ export interface TransitionProps extends BaseTransitionProps { leaveToClass?: string } +export const vtcKey = Symbol('_vtc') + export interface ElementWithTransition extends HTMLElement { // _vtc = Vue Transition Classes. // Store the temporarily-added transition classes on the element // so that we can avoid overwriting them if the element's class is patched // during the transition. - _vtc?: Set + [vtcKey]?: Set } // DOM Transition is a higher-order-component based on the platform-agnostic @@ -295,18 +297,18 @@ function NumberOf(val: unknown): number { export function addTransitionClass(el: Element, cls: string) { cls.split(/\s+/).forEach(c => c && el.classList.add(c)) ;( - (el as ElementWithTransition)._vtc || - ((el as ElementWithTransition)._vtc = new Set()) + (el as ElementWithTransition)[vtcKey] || + ((el as ElementWithTransition)[vtcKey] = new Set()) ).add(cls) } export function removeTransitionClass(el: Element, cls: string) { cls.split(/\s+/).forEach(c => c && el.classList.remove(c)) - const { _vtc } = el as ElementWithTransition + const _vtc = (el as ElementWithTransition)[vtcKey] if (_vtc) { _vtc.delete(cls) if (!_vtc!.size) { - ;(el as ElementWithTransition)._vtc = undefined + ;(el as ElementWithTransition)[vtcKey] = undefined } } } diff --git a/packages/runtime-dom/src/components/TransitionGroup.ts b/packages/runtime-dom/src/components/TransitionGroup.ts index 5c78be26d72..fc5d260b91e 100644 --- a/packages/runtime-dom/src/components/TransitionGroup.ts +++ b/packages/runtime-dom/src/components/TransitionGroup.ts @@ -6,7 +6,8 @@ import { getTransitionInfo, resolveTransitionProps, TransitionPropsValidators, - forceReflow + forceReflow, + vtcKey } from './Transition' import { Fragment, @@ -29,7 +30,8 @@ import { extend } from '@vue/shared' const positionMap = new WeakMap() const newPositionMap = new WeakMap() - +const moveCbKey = Symbol('_moveCb') +const enterCbKey = Symbol('_enterCb') export type TransitionGroupProps = Omit & { tag?: string moveClass?: string @@ -80,13 +82,13 @@ const TransitionGroupImpl: ComponentOptions = { const style = el.style addTransitionClass(el, moveClass) style.transform = style.webkitTransform = style.transitionDuration = '' - const cb = ((el as any)._moveCb = (e: TransitionEvent) => { + const cb = ((el as any)[moveCbKey] = (e: TransitionEvent) => { if (e && e.target !== el) { return } if (!e || /transform$/.test(e.propertyName)) { el.removeEventListener('transitionend', cb) - ;(el as any)._moveCb = null + ;(el as any)[moveCbKey] = null removeTransitionClass(el, moveClass) } }) @@ -162,11 +164,11 @@ export const TransitionGroup = TransitionGroupImpl as unknown as { function callPendingCbs(c: VNode) { const el = c.el as any - if (el._moveCb) { - el._moveCb() + if (el[moveCbKey]) { + el[moveCbKey]() } - if (el._enterCb) { - el._enterCb() + if (el[enterCbKey]) { + el[enterCbKey]() } } @@ -198,8 +200,9 @@ function hasCSSTransform( // all other transition classes applied to ensure only the move class // is applied. const clone = el.cloneNode() as HTMLElement - if (el._vtc) { - el._vtc.forEach(cls => { + const _vtc = el[vtcKey] + if (_vtc) { + _vtc.forEach(cls => { cls.split(/\s+/).forEach(c => c && clone.classList.remove(c)) }) } diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index 2cf5f4cfc16..89cd5f9d49f 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -36,7 +36,9 @@ function onCompositionEnd(e: Event) { } } -type ModelDirective = ObjectDirective +const assignKey = Symbol('_assign') + +type ModelDirective = ObjectDirective // We are exporting the v-model runtime directly as vnode hooks so that it can // be tree-shaken in case v-model is never used. @@ -44,7 +46,7 @@ export const vModelText: ModelDirective< HTMLInputElement | HTMLTextAreaElement > = { created(el, { modifiers: { lazy, trim, number } }, vnode) { - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) const castToNumber = number || (vnode.props && vnode.props.type === 'number') addEventListener(el, lazy ? 'change' : 'input', e => { @@ -56,7 +58,7 @@ export const vModelText: ModelDirective< if (castToNumber) { domValue = looseToNumber(domValue) } - el._assign(domValue) + el[assignKey](domValue) }) if (trim) { addEventListener(el, 'change', () => { @@ -78,7 +80,7 @@ export const vModelText: ModelDirective< el.value = value == null ? '' : value }, beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) { - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) // avoid clearing unresolved text. #2302 if ((el as any).composing) return if (document.activeElement === el && el.type !== 'range') { @@ -106,12 +108,12 @@ export const vModelCheckbox: ModelDirective = { // #4096 array checkboxes need to be deep traversed deep: true, created(el, _, vnode) { - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) addEventListener(el, 'change', () => { const modelValue = (el as any)._modelValue const elementValue = getValue(el) const checked = el.checked - const assign = el._assign + const assign = el[assignKey] if (isArray(modelValue)) { const index = looseIndexOf(modelValue, elementValue) const found = index !== -1 @@ -138,7 +140,7 @@ export const vModelCheckbox: ModelDirective = { // set initial checked on mount to wait for true-value/false-value mounted: setChecked, beforeUpdate(el, binding, vnode) { - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) setChecked(el, binding, vnode) } } @@ -163,13 +165,13 @@ function setChecked( export const vModelRadio: ModelDirective = { created(el, { value }, vnode) { el.checked = looseEqual(value, vnode.props!.value) - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) addEventListener(el, 'change', () => { - el._assign(getValue(el)) + el[assignKey](getValue(el)) }) }, beforeUpdate(el, { value, oldValue }, vnode) { - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) if (value !== oldValue) { el.checked = looseEqual(value, vnode.props!.value) } @@ -187,7 +189,7 @@ export const vModelSelect: ModelDirective = { .map((o: HTMLOptionElement) => number ? looseToNumber(getValue(o)) : getValue(o) ) - el._assign( + el[assignKey]( el.multiple ? isSetModel ? new Set(selectedVal) @@ -195,7 +197,7 @@ export const vModelSelect: ModelDirective = { : selectedVal[0] ) }) - el._assign = getModelAssigner(vnode) + el[assignKey] = getModelAssigner(vnode) }, // set value in mounted & updated because