From 4e7b36f5c3ee72cb9554982dd174f1989d5488f6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 3 May 2022 08:46:24 +0800 Subject: [PATCH 0001/1523] chore: update sponsor img link [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f1c76bcd8a..0742b381303 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Please follow the documentation at [vuejs.org](https://vuejs.org/)! Vue.js is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome [backers](https://github.com/vuejs/core/blob/main/BACKERS.md). If you'd like to join them, please consider [ sponsor Vue's development](https://vuejs.org/sponsor/).

- + sponsors

From 67099fe20299a51f9974f0e2f9ef19ca05efe92b Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 6 May 2022 16:49:15 +0800 Subject: [PATCH 0002/1523] fix(runtime-core): ensure consistent behavior between dev/prod on invalid v-for range close #5867 --- packages/runtime-core/__tests__/helpers/renderList.spec.ts | 4 +++- packages/runtime-core/src/helpers/renderList.ts | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/helpers/renderList.spec.ts b/packages/runtime-core/__tests__/helpers/renderList.spec.ts index 06d2825df36..ae487b6be23 100644 --- a/packages/runtime-core/__tests__/helpers/renderList.spec.ts +++ b/packages/runtime-core/__tests__/helpers/renderList.spec.ts @@ -22,7 +22,9 @@ describe('renderList', () => { }) it('should warn when given a non-integer N', () => { - renderList(3.1, () => {}) + try { + renderList(3.1, () => {}) + } catch (e) {} expect( `The v-for range expect an integer value but got 3.1.` ).toHaveBeenWarned() diff --git a/packages/runtime-core/src/helpers/renderList.ts b/packages/runtime-core/src/helpers/renderList.ts index 9fbf967a8ca..1655d555fb3 100644 --- a/packages/runtime-core/src/helpers/renderList.ts +++ b/packages/runtime-core/src/helpers/renderList.ts @@ -67,7 +67,6 @@ export function renderList( } else if (typeof source === 'number') { if (__DEV__ && !Number.isInteger(source)) { warn(`The v-for range expect an integer value but got ${source}.`) - return [] } ret = new Array(source) for (let i = 0; i < source; i++) { From 32e53bfd478af895dd090ea6c8766fa043e179e4 Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Fri, 6 May 2022 10:07:49 +0100 Subject: [PATCH 0003/1523] fix(types): keep the original type when unwrapping `markRaw` (#3791) --- packages/reactivity/src/reactive.ts | 6 +++-- packages/reactivity/src/ref.ts | 2 ++ test-dts/index.d.ts | 6 ++--- test-dts/reactivity.test-d.ts | 42 +++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index f160b21110d..ce689012da8 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -11,7 +11,7 @@ import { shallowCollectionHandlers, shallowReadonlyCollectionHandlers } from './collectionHandlers' -import { UnwrapRefSimple, Ref } from './ref' +import { UnwrapRefSimple, Ref, RawSymbol } from './ref' export const enum ReactiveFlags { SKIP = '__v_skip', @@ -241,7 +241,9 @@ export function toRaw(observed: T): T { return raw ? toRaw(raw) : observed } -export function markRaw(value: T): T { +export function markRaw( + value: T +): T & { [RawSymbol]?: true } { def(value, ReactiveFlags.SKIP, true) return value } diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 22dd432b945..2a3b3732e0e 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -12,6 +12,7 @@ import { CollectionTypes } from './collectionHandlers' import { createDep, Dep } from './dep' declare const RefSymbol: unique symbol +export declare const RawSymbol: unique symbol export interface Ref { value: T @@ -291,6 +292,7 @@ export type UnwrapRefSimple = T extends | BaseTypes | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] + | { [RawSymbol]?: true } ? T : T extends Array ? { [K in keyof T]: UnwrapRefSimple } diff --git a/test-dts/index.d.ts b/test-dts/index.d.ts index 59eadcb92d9..d0eeb6a7b65 100644 --- a/test-dts/index.d.ts +++ b/test-dts/index.d.ts @@ -9,9 +9,9 @@ export function expectType(value: T): void export function expectError(value: T): void export function expectAssignable(value: T2): void -export type IsUnion = (T extends any - ? (U extends T ? false : true) - : never) extends false +export type IsUnion = ( + T extends any ? (U extends T ? false : true) : never +) extends false ? false : true diff --git a/test-dts/reactivity.test-d.ts b/test-dts/reactivity.test-d.ts index 4c22765e742..0499c6da287 100644 --- a/test-dts/reactivity.test-d.ts +++ b/test-dts/reactivity.test-d.ts @@ -1,5 +1,14 @@ -import { shallowReadonly } from '@vue/reactivity' -import { ref, readonly, describe, expectError, expectType, Ref } from './index' +import { + ref, + readonly, + shallowReadonly, + describe, + expectError, + expectType, + Ref, + reactive, + markRaw +} from './index' describe('should support DeepReadonly', () => { const r = readonly({ obj: { k: 'v' } }) @@ -15,6 +24,35 @@ describe('readonly ref', () => { expectType(r) }) +describe('should support markRaw', () => { + class Test { + item = {} as Ref + } + const test = new Test() + const plain = { + ref: ref(1) + } + + const r = reactive({ + class: { + raw: markRaw(test), + reactive: test + }, + plain: { + raw: markRaw(plain), + reactive: plain + } + }) + + expectType>(r.class.raw) + // @ts-expect-error it should unwrap + expectType>(r.class.reactive) + + expectType>(r.plain.raw.ref) + // @ts-expect-error it should unwrap + expectType>(r.plain.reactive.ref) +}) + describe('shallowReadonly ref unwrap', () => { const r = shallowReadonly({ count: { n: ref(1) } }) // @ts-expect-error From 98b821d94a0a0fb4d7701809da6bec331a47e6e5 Mon Sep 17 00:00:00 2001 From: Zclhlmgqzc <31752986+Zclhlmgqzc@users.noreply.github.com> Date: Fri, 6 May 2022 17:44:05 +0800 Subject: [PATCH 0004/1523] fix(types): preserve and expose original options on defineComponent return type (#5416) fix #3796 --- .../runtime-core/src/apiAsyncComponent.ts | 2 +- .../runtime-core/src/apiDefineComponent.ts | 155 +++++++++----- packages/runtime-core/src/componentOptions.ts | 26 ++- .../src/componentPublicInstance.ts | 20 +- test-dts/defineComponent.test-d.tsx | 195 ++++++++++-------- 5 files changed, 242 insertions(+), 156 deletions(-) diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index 8825eefa5c6..dc92b90d722 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -111,7 +111,7 @@ export function defineAsyncComponent< ) } - return defineComponent({ + return defineComponent<{}>({ name: 'AsyncComponentWrapper', __asyncLoader: load, diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index 83446346fab..f0f69af34f6 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -6,7 +6,8 @@ import { ComponentOptionsWithObjectProps, ComponentOptionsMixin, RenderFunction, - ComponentOptionsBase + ComponentOptionsBase, + ComponentProvideOptions } from './componentOptions' import { SetupContext, @@ -40,6 +41,8 @@ export type DefineComponent< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, + RawOptions extends {} = {}, PP = PublicProps, Props = Readonly< PropsOrPropOptions extends ComponentPropsOptions @@ -48,22 +51,23 @@ export type DefineComponent< > & ({} extends E ? {} : EmitsToProps), Defaults = ExtractDefaultPropTypes -> = ComponentPublicInstanceConstructor< - CreateComponentPublicInstance< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - PP & Props, - Defaults, - true +> = RawOptions & + ComponentPublicInstanceConstructor< + CreateComponentPublicInstance< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + PP & Props, + Defaults, + true + > & + Props > & - Props -> & ComponentOptionsBase< Props, RawBindings, @@ -74,7 +78,8 @@ export type DefineComponent< Extends, E, EE, - Defaults + Defaults, + Provide > & PP @@ -104,20 +109,36 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, - EE extends string = string + EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, + Options extends {} = {} >( - options: ComponentOptionsWithoutProps< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE - > -): DefineComponent + options: Options & + ComponentOptionsWithoutProps< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > +): DefineComponent< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide, + Options +> // overload 3: object format with array props declaration // props inferred as { [key in PropNames]?: any } @@ -131,19 +152,23 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, - EE extends string = string + EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, + Options extends {} = {} >( - options: ComponentOptionsWithArrayProps< - PropNames, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE - > + options: Options & + ComponentOptionsWithArrayProps< + PropNames, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > ): DefineComponent< Readonly<{ [key in PropNames]?: any }>, RawBindings, @@ -153,7 +178,9 @@ export function defineComponent< Mixin, Extends, E, - EE + EE, + Provide, + Options > // overload 4: object format with object props declaration @@ -169,20 +196,36 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, - EE extends string = string + EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, + Options extends {} = {} >( - options: ComponentOptionsWithObjectProps< - PropsOptions, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE - > -): DefineComponent + options: Options & + ComponentOptionsWithObjectProps< + PropsOptions, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide + > +): DefineComponent< + PropsOptions, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + EE, + Provide, + Options +> // implementation, close to no-op export function defineComponent(options: unknown) { diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index e8fa676a25c..b4fd4790543 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -117,8 +117,9 @@ export interface ComponentOptionsBase< Extends extends ComponentOptionsMixin, E extends EmitsOptions, EE extends string = string, - Defaults = {} -> extends LegacyOptions, + Defaults = {}, + Provide extends ComponentProvideOptions = ComponentProvideOptions +> extends LegacyOptions, ComponentInternalOptions, ComponentCustomOptions { setup?: ( @@ -224,6 +225,7 @@ export type ComponentOptionsWithoutProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, PE = Props & EmitsToProps > = ComponentOptionsBase< PE, @@ -235,7 +237,8 @@ export type ComponentOptionsWithoutProps< Extends, E, EE, - {} + {}, + Provide > & { props?: undefined } & ThisType< @@ -252,6 +255,7 @@ export type ComponentOptionsWithArrayProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, Props = Readonly<{ [key in PropNames]?: any }> & EmitsToProps > = ComponentOptionsBase< Props, @@ -263,7 +267,8 @@ export type ComponentOptionsWithArrayProps< Extends, E, EE, - {} + {}, + Provide > & { props: PropNames[] } & ThisType< @@ -289,6 +294,7 @@ export type ComponentOptionsWithObjectProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, + Provide extends ComponentProvideOptions = ComponentProvideOptions, Props = Readonly> & EmitsToProps, Defaults = ExtractDefaultPropTypes > = ComponentOptionsBase< @@ -301,7 +307,8 @@ export type ComponentOptionsWithObjectProps< Extends, E, EE, - Defaults + Defaults, + Provide > & { props: PropsOptions & ThisType } & ThisType< @@ -384,6 +391,10 @@ type ComponentWatchOptionItem = WatchOptionItem | WatchOptionItem[] type ComponentWatchOptions = Record +export type ComponentProvideOptions = ObjectProvideOptions | Function + +type ObjectProvideOptions = Record + type ComponentInjectOptions = string[] | ObjectInjectOptions type ObjectInjectOptions = Record< @@ -397,7 +408,8 @@ interface LegacyOptions< C extends ComputedOptions, M extends MethodOptions, Mixin extends ComponentOptionsMixin, - Extends extends ComponentOptionsMixin + Extends extends ComponentOptionsMixin, + Provide extends ComponentProvideOptions = ComponentProvideOptions > { compatConfig?: CompatConfig @@ -431,7 +443,7 @@ interface LegacyOptions< computed?: C methods?: M watch?: ComponentWatchOptions - provide?: Data | Function + provide?: Provide inject?: ComponentInjectOptions // assets diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 03ee0e0e9a8..faae5312d30 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -34,7 +34,8 @@ import { OptionTypesKeys, resolveMergedOptions, shouldCacheAccess, - MergedComponentOptionsOverride + MergedComponentOptionsOverride, + ComponentProvideOptions } from './componentOptions' import { EmitsOptions, EmitFn } from './componentEmits' import { Slots } from './componentSlots' @@ -150,7 +151,8 @@ export type CreateComponentPublicInstance< PublicM extends MethodOptions = UnwrapMixinsType & EnsureNonVoid, PublicDefaults = UnwrapMixinsType & - EnsureNonVoid + EnsureNonVoid, + Provide extends ComponentProvideOptions = ComponentProvideOptions > = ComponentPublicInstance< PublicP, PublicB, @@ -161,7 +163,19 @@ export type CreateComponentPublicInstance< PublicProps, PublicDefaults, MakeDefaultsOptional, - ComponentOptionsBase + ComponentOptionsBase< + P, + B, + D, + C, + M, + Mixin, + Extends, + E, + string, + Defaults, + Provide + > > // public properties exposed on the proxy, which is used as the render context diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index 031b4a13eb8..3c4e9cb3936 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -49,96 +49,98 @@ describe('with object props', () => { type GT = string & { __brand: unknown } - const MyComponent = defineComponent({ - props: { - a: Number, - // required should make property non-void - b: { - type: String, - required: true - }, - e: Function, - h: Boolean, - j: Function as PropType string | undefined)>, - // default value should infer type and make it non-void - bb: { - default: 'hello' - }, - bbb: { - // Note: default function value requires arrow syntax + explicit - // annotation - default: (props: any) => (props.bb as string) || 'foo' - }, - bbbb: { - type: String, - default: undefined - }, - bbbbb: { - type: String, - default: () => undefined - }, - // explicit type casting - cc: Array as PropType, - // required + type casting - dd: { - type: Object as PropType<{ n: 1 }>, - required: true - }, - // return type - ee: Function as PropType<() => string>, - // arguments + object return - ff: Function as PropType<(a: number, b: string) => { a: boolean }>, - // explicit type casting with constructor - ccc: Array as () => string[], - // required + constructor type casting - ddd: { - type: Array as () => string[], - required: true - }, - // required + object return - eee: { - type: Function as PropType<() => { a: string }>, - required: true - }, - // required + arguments + object return - fff: { - type: Function as PropType<(a: number, b: string) => { a: boolean }>, - required: true - }, - hhh: { - type: Boolean, - required: true - }, - // default + type casting - ggg: { - type: String as PropType<'foo' | 'bar'>, - default: 'foo' - }, - // default + function - ffff: { - type: Function as PropType<(a: number, b: string) => { a: boolean }>, - default: (a: number, b: string) => ({ a: a > +b }) - }, - // union + function with different return types - iii: Function as PropType<(() => string) | (() => number)>, - // union + function with different args & same return type - jjj: { - type: Function as PropType< - ((arg1: string) => string) | ((arg1: string, arg2: string) => string) - >, - required: true - }, - kkk: null, - validated: { - type: String, - // validator requires explicit annotation - validator: (val: unknown) => val !== '' - }, - date: Date, - l: [Date], - ll: [Date, Number], - lll: [String, Number] + const props = { + a: Number, + // required should make property non-void + b: { + type: String, + required: true as true + }, + e: Function, + h: Boolean, + j: Function as PropType string | undefined)>, + // default value should infer type and make it non-void + bb: { + default: 'hello' + }, + bbb: { + // Note: default function value requires arrow syntax + explicit + // annotation + default: (props: any) => (props.bb as string) || 'foo' + }, + bbbb: { + type: String, + default: undefined + }, + bbbbb: { + type: String, + default: () => undefined + }, + // explicit type casting + cc: Array as PropType, + // required + type casting + dd: { + type: Object as PropType<{ n: 1 }>, + required: true as true + }, + // return type + ee: Function as PropType<() => string>, + // arguments + object return + ff: Function as PropType<(a: number, b: string) => { a: boolean }>, + // explicit type casting with constructor + ccc: Array as () => string[], + // required + constructor type casting + ddd: { + type: Array as () => string[], + required: true as true + }, + // required + object return + eee: { + type: Function as PropType<() => { a: string }>, + required: true as true + }, + // required + arguments + object return + fff: { + type: Function as PropType<(a: number, b: string) => { a: boolean }>, + required: true as true + }, + hhh: { + type: Boolean, + required: true as true + }, + // default + type casting + ggg: { + type: String as PropType<'foo' | 'bar'>, + default: 'foo' }, + // default + function + ffff: { + type: Function as PropType<(a: number, b: string) => { a: boolean }>, + default: (a: number, b: string) => ({ a: a > +b }) + }, + // union + function with different return types + iii: Function as PropType<(() => string) | (() => number)>, + // union + function with different args & same return type + jjj: { + type: Function as PropType< + ((arg1: string) => string) | ((arg1: string, arg2: string) => string) + >, + required: true as true + }, + kkk: null, + validated: { + type: String, + // validator requires explicit annotation + validator: (val: unknown) => val !== '' + }, + date: Date, + l: [Date], + ll: [Date, Number], + lll: [String, Number] + } + + const MyComponent = defineComponent({ + props, setup(props) { // type assertion. See https://github.com/SamVerschueren/tsd expectType(props.a) @@ -188,6 +190,9 @@ describe('with object props', () => { }) } }, + provide() { + return {} + }, render() { const props = this.$props expectType(props.a) @@ -258,6 +263,18 @@ describe('with object props', () => { expectType(MyComponent) + expectType(MyComponent.props) + // @ts-expect-error it should be an object and not any + expectError<[]>(MyComponent.props) + + expectType<() => {}>(MyComponent.provide) + // @ts-expect-error + expectError<[]>(MyComponent.provide) + + expectType<() => null>(MyComponent.render) + + expectType(defineComponent({}).render) + // Test TSX expectType( Date: Fri, 6 May 2022 18:42:22 +0800 Subject: [PATCH 0005/1523] refactor(reactivity): make some expression simpler (#5131) --- packages/reactivity/src/baseHandlers.ts | 5 ++--- packages/reactivity/src/collectionHandlers.ts | 16 ++++++++++------ packages/runtime-core/src/renderer.ts | 5 ++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 81dce9b9657..7e564f29def 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -125,9 +125,8 @@ function createGetter(isReadonly = false, shallow = false) { } if (isRef(res)) { - // ref unwrapping - does not apply for Array + integer key. - const shouldUnwrap = !targetIsArray || !isIntegerKey(key) - return shouldUnwrap ? res.value : res + // ref unwrapping - skip unwrap for Array + integer key. + return targetIsArray && isIntegerKey(key) ? res : res.value } if (isObject(res)) { diff --git a/packages/reactivity/src/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 0e9e19e824c..09365f96021 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -26,10 +26,12 @@ function get( target = (target as any)[ReactiveFlags.RAW] const rawTarget = toRaw(target) const rawKey = toRaw(key) - if (key !== rawKey) { - !isReadonly && track(rawTarget, TrackOpTypes.GET, key) + if (!isReadonly) { + if (key !== rawKey) { + track(rawTarget, TrackOpTypes.GET, key) + } + track(rawTarget, TrackOpTypes.GET, rawKey) } - !isReadonly && track(rawTarget, TrackOpTypes.GET, rawKey) const { has } = getProto(rawTarget) const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive if (has.call(rawTarget, key)) { @@ -47,10 +49,12 @@ function has(this: CollectionTypes, key: unknown, isReadonly = false): boolean { const target = (this as any)[ReactiveFlags.RAW] const rawTarget = toRaw(target) const rawKey = toRaw(key) - if (key !== rawKey) { - !isReadonly && track(rawTarget, TrackOpTypes.HAS, key) + if (!isReadonly) { + if (key !== rawKey) { + track(rawTarget, TrackOpTypes.HAS, key) + } + track(rawTarget, TrackOpTypes.HAS, rawKey) } - !isReadonly && track(rawTarget, TrackOpTypes.HAS, rawKey) return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey) diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index ed698d21f7b..33fe7a23d5a 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1544,11 +1544,11 @@ function baseCreateRenderer( // create reactive effect for rendering const effect = (instance.effect = new ReactiveEffect( componentUpdateFn, - () => queueJob(instance.update), + () => queueJob(update), instance.scope // track it in component's effect scope )) - const update = (instance.update = effect.run.bind(effect) as SchedulerJob) + const update: SchedulerJob = (instance.update = () => effect.run()) update.id = instance.uid // allowRecurse // #1801, #2043 component render effects should allow recursive updates @@ -1561,7 +1561,6 @@ function baseCreateRenderer( effect.onTrigger = instance.rtg ? e => invokeArrayFns(instance.rtg!, e) : void 0 - // @ts-ignore (for scheduler) update.ownerInstance = instance } From 292ce6943940049afe79d4f20b1047b4651b9b04 Mon Sep 17 00:00:00 2001 From: qinxiaosen_ccc <33564028+senmu-a@users.noreply.github.com> Date: Fri, 6 May 2022 18:44:28 +0800 Subject: [PATCH 0006/1523] chore: remove outdated type comment (#5103) --- packages/runtime-core/src/apiCreateApp.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 8b437f2bfd1..6b2093141bd 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -345,9 +345,8 @@ export function createAppAPI( `It will be overwritten with the new value.` ) } - // TypeScript doesn't allow symbols as index type - // https://github.com/Microsoft/TypeScript/issues/24587 - context.provides[key as string] = value + + context.provides[key as string | symbol] = value return app } From 0683a022ec83694e29636f64aaf3c04012e9a7f0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 7 May 2022 10:37:07 +0800 Subject: [PATCH 0007/1523] types(reactivity-transform): improve type readability for reactive variables --- packages/vue/macros.d.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/vue/macros.d.ts b/packages/vue/macros.d.ts index a0a9f54d306..41aefd77d7f 100644 --- a/packages/vue/macros.d.ts +++ b/packages/vue/macros.d.ts @@ -16,17 +16,21 @@ export declare const enum RefTypes { WritableComputedRef = 3 } -type RefValue = T extends null | undefined - ? T - : T & { [RefType]?: RefTypes.Ref } +type RefValue = T extends null | undefined ? T : ReactiveVariable -type ComputedRefValue = T extends null | undefined - ? T - : T & { [RefType]?: RefTypes.ComputedRef } +type ReactiveVariable = T & { [RefType]?: RefTypes.Ref } + +type ComputedRefValue = T extends null | undefined ? T : ComputedVariable + +type ComputedVariable = T & { [RefType]?: RefTypes.ComputedRef } type WritableComputedRefValue = T extends null | undefined ? T - : T & { [RefType]?: RefTypes.WritableComputedRef } + : WritableComputedVariable + +type WritableComputedVariable = T & { + [RefType]?: RefTypes.WritableComputedRef +} type NormalObject = T & { [RefType]?: never } From 7dfe146096487a98ba1733598c44407bc89a1b9f Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 08:39:27 +0800 Subject: [PATCH 0008/1523] fix(compiler-sfc): fix object default values for reactive props destructure --- .../compileScriptPropsTransform.spec.ts.snap | 8 ++++---- .../__tests__/compileScriptPropsTransform.spec.ts | 8 ++++---- packages/compiler-sfc/src/compileScript.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap index 7105dfe3864..8a7359420bb 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptPropsTransform.spec.ts.snap @@ -65,7 +65,7 @@ exports[`sfc props transform default values w/ runtime declaration 1`] = ` export default { props: _mergeDefaults(['foo', 'bar'], { foo: 1, - bar: () => {} + bar: () => ({}) }), setup(__props) { @@ -83,7 +83,7 @@ exports[`sfc props transform default values w/ type declaration 1`] = ` export default /*#__PURE__*/_defineComponent({ props: { foo: { type: Number, required: false, default: 1 }, - bar: { type: Object, required: false, default: () => {} } + bar: { type: Object, required: false, default: () => ({}) } }, setup(__props: any) { @@ -101,11 +101,11 @@ exports[`sfc props transform default values w/ type declaration, prod mode 1`] = export default /*#__PURE__*/_defineComponent({ props: { foo: { default: 1 }, - bar: { default: () => {} }, + bar: { default: () => ({}) }, baz: null, boola: { type: Boolean }, boolb: { type: [Boolean, Number] }, - func: { type: Function, default: () => () => {} } + func: { type: Function, default: () => (() => {}) } }, setup(__props: any) { diff --git a/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts b/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts index 140dbec2e6b..e7fbb31c344 100644 --- a/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScriptPropsTransform.spec.ts @@ -59,7 +59,7 @@ describe('sfc props transform', () => { // function expect(content).toMatch(`props: _mergeDefaults(['foo', 'bar'], { foo: 1, - bar: () => {} + bar: () => ({}) })`) assertCode(content) }) @@ -74,7 +74,7 @@ describe('sfc props transform', () => { // function expect(content).toMatch(`props: { foo: { type: Number, required: false, default: 1 }, - bar: { type: Object, required: false, default: () => {} } + bar: { type: Object, required: false, default: () => ({}) } }`) assertCode(content) }) @@ -92,11 +92,11 @@ describe('sfc props transform', () => { // function expect(content).toMatch(`props: { foo: { default: 1 }, - bar: { default: () => {} }, + bar: { default: () => ({}) }, baz: null, boola: { type: Boolean }, boolb: { type: [Boolean, Number] }, - func: { type: Function, default: () => () => {} } + func: { type: Function, default: () => (() => {}) } }`) assertCode(content) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index f70faeaf02b..3a3a260332e 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -735,7 +735,7 @@ export function compileScript( destructured.default.end! ) const isLiteral = destructured.default.type.endsWith('Literal') - return isLiteral ? value : `() => ${value}` + return isLiteral ? value : `() => (${value})` } } From 16939241b0f64cefea254b024a9b5a25caea93d9 Mon Sep 17 00:00:00 2001 From: ygj6 <7699524+ygj6@users.noreply.github.com> Date: Tue, 10 May 2022 09:16:28 +0800 Subject: [PATCH 0009/1523] fix(compiler-sfc): automatically infer component name from filename when using script setup (#4997) close #4993 --- .../__snapshots__/compileScript.spec.ts.snap | 43 +++++++++++++++ .../__tests__/compileScript.spec.ts | 55 +++++++++++++++++++ packages/compiler-sfc/__tests__/utils.ts | 12 +++- packages/compiler-sfc/src/compileScript.ts | 28 +++++++++- packages/compiler-sfc/src/parse.ts | 4 +- 5 files changed, 137 insertions(+), 5 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index de223bf91d8..cbe274ef9e8 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -1,5 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`SFC analyze + `, + undefined, + { + filename: 'FooBar.vue' + } + ) + expect(content).toMatch(`export default { + name: 'FooBar'`) + assertCode(content) + }) + + test('do not overwrite manual name (object)', () => { + const { content } = compile( + ` + + `, + undefined, + { + filename: 'FooBar.vue' + } + ) + expect(content).not.toMatch(`name: 'FooBar'`) + expect(content).toMatch(`name: 'Baz'`) + assertCode(content) + }) + + test('do not overwrite manual name (call)', () => { + const { content } = compile( + ` + + `, + undefined, + { + filename: 'FooBar.vue' + } + ) + expect(content).not.toMatch(`name: 'FooBar'`) + expect(content).toMatch(`name: 'Baz'`) + assertCode(content) + }) + }) }) diff --git a/packages/compiler-sfc/__tests__/utils.ts b/packages/compiler-sfc/__tests__/utils.ts index 206ff3681dd..ffa12652c83 100644 --- a/packages/compiler-sfc/__tests__/utils.ts +++ b/packages/compiler-sfc/__tests__/utils.ts @@ -1,13 +1,19 @@ -import { parse, SFCScriptCompileOptions, compileScript } from '../src' +import { + parse, + SFCScriptCompileOptions, + compileScript, + SFCParseOptions +} from '../src' import { parse as babelParse } from '@babel/parser' export const mockId = 'xxxxxxxx' export function compileSFCScript( src: string, - options?: Partial + options?: Partial, + parseOptions?: SFCParseOptions ) { - const { descriptor } = parse(src) + const { descriptor } = parse(src, parseOptions) return compileScript(descriptor, { ...options, id: mockId diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 3a3a260332e..7c84f29b3b3 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -11,7 +11,7 @@ import { isFunctionType, walkIdentifiers } from '@vue/compiler-dom' -import { SFCDescriptor, SFCScriptBlock } from './parse' +import { DEFAULT_FILENAME, SFCDescriptor, SFCScriptBlock } from './parse' import { parse as _parse, ParserOptions, ParserPlugin } from '@babel/parser' import { camelize, capitalize, generateCodeFrame, makeMap } from '@vue/shared' import { @@ -263,6 +263,7 @@ export function compileScript( let hasDefinePropsCall = false let hasDefineEmitCall = false let hasDefineExposeCall = false + let hasDefaultExportName = false let propsRuntimeDecl: Node | undefined let propsRuntimeDefaults: ObjectExpression | undefined let propsDestructureDecl: Node | undefined @@ -811,6 +812,25 @@ export function compileScript( } else if (node.type === 'ExportDefaultDeclaration') { // export default defaultExport = node + + // check if user has manually specified `name` option in export default + // if yes, skip infer later + let optionProperties + if (defaultExport.declaration.type === 'ObjectExpression') { + optionProperties = defaultExport.declaration.properties + } else if ( + defaultExport.declaration.type === 'CallExpression' && + defaultExport.declaration.arguments[0].type === 'ObjectExpression' + ) { + optionProperties = defaultExport.declaration.arguments[0].properties + } + hasDefaultExportName = !!optionProperties?.some( + s => + s.type === 'ObjectProperty' && + s.key.type === 'Identifier' && + s.key.name === 'name' + ) + // export default { ... } --> const __default__ = { ... } const start = node.start! + scriptStartOffset! const end = node.declaration.start! + scriptStartOffset! @@ -1364,6 +1384,12 @@ export function compileScript( // 11. finalize default export let runtimeOptions = `` + if (!hasDefaultExportName && filename && filename !== DEFAULT_FILENAME) { + const match = filename.match(/([^/\\]+)\.\w+$/) + if (match) { + runtimeOptions += `\n name: '${match[1]}',` + } + } if (hasInlinedSsrRenderFn) { runtimeOptions += `\n __ssrInlineRender: true,` } diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index ed44e536829..cc7873c29a8 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -13,6 +13,8 @@ import { parseCssVars } from './cssVars' import { createCache } from './cache' import { hmrShouldReload, ImportBinding } from './compileScript' +export const DEFAULT_FILENAME = 'anonymous.vue' + export interface SFCParseOptions { filename?: string sourceMap?: boolean @@ -95,7 +97,7 @@ export function parse( source: string, { sourceMap = true, - filename = 'anonymous.vue', + filename = DEFAULT_FILENAME, sourceRoot = '', pad = false, ignoreEmpty = true, From 7d7a2410e58d3ae59ca3fcf619f332699209fc96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=88=98=28liulinboyi=29?= <814921718@qq.com> Date: Tue, 10 May 2022 09:20:18 +0800 Subject: [PATCH 0010/1523] fix(compiler-sfc): remove the jsx from the babelParserPlugins when not match the case of adding jsx (#5846) fix #5845 --- packages/compiler-sfc/src/compileScript.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 7c84f29b3b3..7c16bcc8f37 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -172,6 +172,12 @@ export function compileScript( const plugins: ParserPlugin[] = [] if (!isTS || scriptLang === 'tsx' || scriptSetupLang === 'tsx') { plugins.push('jsx') + } else { + // If don't match the case of adding jsx, should remove the jsx from the babelParserPlugins + if (options.babelParserPlugins) + options.babelParserPlugins = options.babelParserPlugins.filter( + n => n !== 'jsx' + ) } if (options.babelParserPlugins) plugins.push(...options.babelParserPlugins) if (isTS) plugins.push('typescript', 'decorators-legacy') From 0abcb2b80db1e9294b07838aa3eb2a19fe96b038 Mon Sep 17 00:00:00 2001 From: Damon Muma Date: Mon, 9 May 2022 21:30:50 -0400 Subject: [PATCH 0011/1523] chore: update reference to transformExpressions (#2682) [ci skip] --- packages/compiler-dom/src/transforms/stringifyStatic.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-dom/src/transforms/stringifyStatic.ts b/packages/compiler-dom/src/transforms/stringifyStatic.ts index e257e3254fe..d2d0b6fe078 100644 --- a/packages/compiler-dom/src/transforms/stringifyStatic.ts +++ b/packages/compiler-dom/src/transforms/stringifyStatic.ts @@ -330,7 +330,7 @@ function stringifyElement( // here, e.g. `{{ 1 }}` or `{{ 'foo' }}` // in addition, constant exps bail on presence of parens so you can't even // run JSFuck in here. But we mark it unsafe for security review purposes. -// (see compiler-core/src/transformExpressions) +// (see compiler-core/src/transforms/transformExpression) function evaluateConstant(exp: ExpressionNode): string { if (exp.type === NodeTypes.SIMPLE_EXPRESSION) { return new Function(`return ${exp.content}`)() From 7540a3ff1d893e377fd8bb1e5b96de0600ea4578 Mon Sep 17 00:00:00 2001 From: tarunama Date: Tue, 10 May 2022 10:37:00 +0900 Subject: [PATCH 0012/1523] chore(server renderer): readable warn message (#2890) --- packages/server-renderer/src/render.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts index 3a08163f927..17b5609f16b 100644 --- a/packages/server-renderer/src/render.ts +++ b/packages/server-renderer/src/render.ts @@ -188,11 +188,8 @@ function renderComponentSubTree( slotScopeId ) } else { - warn( - `Component ${ - comp.name ? `${comp.name} ` : `` - } is missing template or render function.` - ) + const componentName = comp.name || comp.__file || `` + warn(`Component ${componentName} is missing template or render function.`) push(``) } } From decad9df57d456676ca0c0425a5b498f56310986 Mon Sep 17 00:00:00 2001 From: edison Date: Tue, 10 May 2022 09:37:59 +0800 Subject: [PATCH 0013/1523] types(compiler-sfc): export SFCParseResult type (#2923) close #2921 --- packages/compiler-sfc/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/compiler-sfc/src/index.ts b/packages/compiler-sfc/src/index.ts index bf89c5de454..4df1b7f26f5 100644 --- a/packages/compiler-sfc/src/index.ts +++ b/packages/compiler-sfc/src/index.ts @@ -29,6 +29,7 @@ export { // Types export { SFCParseOptions, + SFCParseResult, SFCDescriptor, SFCBlock, SFCTemplateBlock, From 762a9e99ce43831c7b9da027de271aaa39f3924b Mon Sep 17 00:00:00 2001 From: edison Date: Tue, 10 May 2022 09:40:19 +0800 Subject: [PATCH 0014/1523] chore(runtime-core): use `getGlobalThis` when installing HMR API (#3217) --- packages/runtime-core/src/hmr.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime-core/src/hmr.ts b/packages/runtime-core/src/hmr.ts index 3c3f5208bcc..1ea1dd01bcc 100644 --- a/packages/runtime-core/src/hmr.ts +++ b/packages/runtime-core/src/hmr.ts @@ -9,6 +9,7 @@ import { } from './component' import { queueJob, queuePostFlushCb } from './scheduler' import { extend, getGlobalThis } from '@vue/shared' +import { warn } from './warning' type HMRComponent = ComponentOptions | ClassComponent From 2a44225446d98781f935a5b07ee4f8ed6057fe85 Mon Sep 17 00:00:00 2001 From: edison Date: Tue, 10 May 2022 09:42:41 +0800 Subject: [PATCH 0015/1523] chore(runtime-core): Remove duplicate variable assignments (#3700) --- packages/runtime-core/src/renderer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 33fe7a23d5a..47a566e73e6 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1288,7 +1288,6 @@ function baseCreateRenderer( } } else { // no update needed. just copy over properties - n2.component = n1.component n2.el = n1.el instance.vnode = n2 } From 29e454d4d143b7473ed7cb7e4292fa3cd9d7e3e8 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 09:50:12 +0800 Subject: [PATCH 0016/1523] chore: fix duplicate export --- packages/compiler-sfc/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/index.ts b/packages/compiler-sfc/src/index.ts index 4df1b7f26f5..b99aeafbb47 100644 --- a/packages/compiler-sfc/src/index.ts +++ b/packages/compiler-sfc/src/index.ts @@ -34,8 +34,7 @@ export { SFCBlock, SFCTemplateBlock, SFCScriptBlock, - SFCStyleBlock, - SFCParseResult + SFCStyleBlock } from './parse' export { TemplateCompiler, From 16a0b232d7900c58d5f24a381f1844ced098ba2f Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 09:58:28 +0800 Subject: [PATCH 0017/1523] chore: remove unused import due to merge conflict resolve mistake --- packages/runtime-core/src/hmr.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/runtime-core/src/hmr.ts b/packages/runtime-core/src/hmr.ts index 1ea1dd01bcc..3c3f5208bcc 100644 --- a/packages/runtime-core/src/hmr.ts +++ b/packages/runtime-core/src/hmr.ts @@ -9,7 +9,6 @@ import { } from './component' import { queueJob, queuePostFlushCb } from './scheduler' import { extend, getGlobalThis } from '@vue/shared' -import { warn } from './warning' type HMRComponent = ComponentOptions | ClassComponent From e58277f6eaeaec84cf05b34126bec01b619a1b90 Mon Sep 17 00:00:00 2001 From: Julian Hundeloh Date: Tue, 10 May 2022 03:58:51 +0200 Subject: [PATCH 0018/1523] fix(runtime-dom): "el._assign is not a function" in compat mode (#4121) --- packages/runtime-dom/src/directives/vModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index 6ca363a937c..b3e10a2a1c2 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -18,7 +18,7 @@ import { type AssignerFn = (value: any) => void const getModelAssigner = (vnode: VNode): AssignerFn => { - const fn = vnode.props!['onUpdate:modelValue'] + const fn = vnode.props!['onUpdate:modelValue'] || (__COMPAT__ && vnode.props!['onModelCompat:input']) return isArray(fn) ? value => invokeArrayFns(fn, value) : fn } From 30c33af839ab33b3c45d5f9fca2a610e438cd14d Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 10:02:41 +0800 Subject: [PATCH 0019/1523] chore: use explicit type import to avoid Rollup warning --- packages/reactivity/src/reactive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index ce689012da8..ac45059708d 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -11,7 +11,7 @@ import { shallowCollectionHandlers, shallowReadonlyCollectionHandlers } from './collectionHandlers' -import { UnwrapRefSimple, Ref, RawSymbol } from './ref' +import type { UnwrapRefSimple, Ref, RawSymbol } from './ref' export const enum ReactiveFlags { SKIP = '__v_skip', From c355c4b78451708b04e17a7c50680dee507f0c40 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 10:04:56 +0800 Subject: [PATCH 0020/1523] fix(ssr): implement empty read() on node stream fix #3846 close #3867 --- packages/server-renderer/src/renderToStream.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server-renderer/src/renderToStream.ts b/packages/server-renderer/src/renderToStream.ts index 0644fb0a05a..749fb54db24 100644 --- a/packages/server-renderer/src/renderToStream.ts +++ b/packages/server-renderer/src/renderToStream.ts @@ -100,7 +100,7 @@ export function renderToNodeStream( context: SSRContext = {} ): Readable { const stream: Readable = __NODE_JS__ - ? new (require('stream').Readable)() + ? new (require('stream').Readable)({ read() {} }) : null if (!stream) { From 0aeb4bc9bf68c0006b496142bb5aeb3f06689b7c Mon Sep 17 00:00:00 2001 From: netcon Date: Tue, 10 May 2022 10:15:26 +0800 Subject: [PATCH 0021/1523] fix(shared): missed Symbol judge in looseEqual (#3553) --- packages/shared/__tests__/looseEqual.spec.ts | 12 ++++++++++++ packages/shared/src/looseEqual.ts | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/shared/__tests__/looseEqual.spec.ts b/packages/shared/__tests__/looseEqual.spec.ts index 75bb25058b7..24bd48c1015 100644 --- a/packages/shared/__tests__/looseEqual.spec.ts +++ b/packages/shared/__tests__/looseEqual.spec.ts @@ -49,6 +49,18 @@ describe('utils/looseEqual', () => { expect(looseEqual(date1, date4)).toBe(false) }) + test('compares symbols correctly', () => { + const symbol1 = Symbol('a') + const symbol2 = Symbol('a') + const symbol3 = Symbol('b') + const notSymbol = 0 + + expect(looseEqual(symbol1, symbol1)).toBe(true) + expect(looseEqual(symbol1, symbol2)).toBe(false) + expect(looseEqual(symbol1, symbol3)).toBe(false) + expect(looseEqual(symbol1, notSymbol)).toBe(false) + }) + test('compares files correctly', () => { const date1 = new Date(2019, 1, 2, 3, 4, 5, 6) const date2 = new Date(2019, 1, 2, 3, 4, 5, 7) diff --git a/packages/shared/src/looseEqual.ts b/packages/shared/src/looseEqual.ts index 030f0338b30..387150535c7 100644 --- a/packages/shared/src/looseEqual.ts +++ b/packages/shared/src/looseEqual.ts @@ -1,4 +1,4 @@ -import { isArray, isDate, isObject } from './' +import { isArray, isDate, isObject, isSymbol } from './' function looseCompareArrays(a: any[], b: any[]) { if (a.length !== b.length) return false @@ -16,6 +16,11 @@ export function looseEqual(a: any, b: any): boolean { if (aValidType || bValidType) { return aValidType && bValidType ? a.getTime() === b.getTime() : false } + aValidType = isSymbol(a) + bValidType = isSymbol(b) + if (aValidType || bValidType) { + return a === b + } aValidType = isArray(a) bValidType = isArray(b) if (aValidType || bValidType) { From 392ca5dd8807d16ea52225accbdabd0084250ddf Mon Sep 17 00:00:00 2001 From: huangcheng <1530844743@qq.com> Date: Tue, 10 May 2022 10:43:35 +0800 Subject: [PATCH 0022/1523] chore: fix eslint error (#5876) --- packages/runtime-core/src/devtools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/devtools.ts b/packages/runtime-core/src/devtools.ts index 6bbd3db6e75..36c5763dcf1 100644 --- a/packages/runtime-core/src/devtools.ts +++ b/packages/runtime-core/src/devtools.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-restricted-globals */ import { App } from './apiCreateApp' import { Fragment, Text, Comment, Static } from './vnode' import { ComponentInternalInstance } from './component' @@ -53,7 +54,6 @@ export function setDevtoolsHook(hook: DevtoolsHook, target: any) { // handle late devtools injection - only do this if we are in an actual // browser environment to avoid the timer handle stalling test runner exit // (#4815) - // eslint-disable-next-line no-restricted-globals typeof window !== 'undefined' && // some envs mock window but not fully window.HTMLElement && From 83aaa9b5469072f43314b11388e5985b77597acd Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 10:43:07 +0800 Subject: [PATCH 0023/1523] workflow: update eslint config to allow spread usage --- .eslintrc.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 4c667f90216..71acd8dd898 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,10 +16,11 @@ module.exports = { // most of the codebase are expected to be env agnostic 'no-restricted-globals': ['error', ...DOMGlobals, ...NodeGlobals], // since we target ES2015 for baseline support, we need to forbid object - // rest spread usage (both assign and destructure) + // rest spread usage in destructure as it compiles into a verbose helper. + // TS now compiles assignment spread into Object.assign() calls so that + // is allowed. 'no-restricted-syntax': [ 'error', - 'ObjectExpression > SpreadElement', 'ObjectPattern > RestElement', 'AwaitExpression' ] From 1414f17490165d8d170afa651ee9866294d971f6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 10:47:32 +0800 Subject: [PATCH 0024/1523] ci: run lint during ci --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e02bfc6627..f4b51a822d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - name: Run unit tests run: pnpm run test - test-dts: + lint-and-test-dts: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -46,6 +46,9 @@ jobs: - run: pnpm install + - name: Run eslint + run: pnpm run lint + - name: Run type declaration tests run: pnpm run test-dts From 9bcfcac993e25d53a47e875b1dbcf00e68253f4b Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 10 May 2022 10:47:45 +0800 Subject: [PATCH 0025/1523] chore: bump typescript deps --- package.json | 6 +-- pnpm-lock.yaml | 101 +++++++++++++++++++++++++++---------------------- 2 files changed, 59 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 14f9ed5d517..633f97f66fc 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/jest": "^27.0.1", "@types/node": "^16.4.7", "@types/puppeteer": "^5.0.0", - "@typescript-eslint/parser": "^4.1.1", + "@typescript-eslint/parser": "^5.23.0", "@vue/reactivity": "workspace:*", "@vue/runtime-core": "workspace:*", "@vue/runtime-dom": "workspace:*", @@ -89,8 +89,8 @@ "serve": "^12.0.0", "todomvc-app-css": "^2.3.0", "ts-jest": "^27.0.5", - "tslib": "^2.3.1", - "typescript": "^4.2.2", + "tslib": "^2.4.0", + "typescript": "^4.6.4", "vite": "^2.9.0", "vue": "workspace:*", "yorkie": "^2.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee3e6b5c6d8..5ae77169249 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: '@types/jest': ^27.0.1 '@types/node': ^16.4.7 '@types/puppeteer': ^5.0.0 - '@typescript-eslint/parser': ^4.1.1 + '@typescript-eslint/parser': ^5.23.0 '@vue/reactivity': workspace:* '@vue/runtime-core': workspace:* '@vue/runtime-dom': workspace:* @@ -46,8 +46,8 @@ importers: serve: ^12.0.0 todomvc-app-css: ^2.3.0 ts-jest: ^27.0.5 - tslib: ^2.3.1 - typescript: ^4.2.2 + tslib: ^2.4.0 + typescript: ^4.6.4 vite: ^2.9.0 vue: workspace:* yorkie: ^2.0.0 @@ -63,7 +63,7 @@ importers: '@types/jest': 27.0.3 '@types/node': 16.11.12 '@types/puppeteer': 5.4.4 - '@typescript-eslint/parser': 4.33.0_eslint@7.32.0+typescript@4.5.3 + '@typescript-eslint/parser': 5.23.0_eslint@7.32.0+typescript@4.6.4 '@vue/reactivity': link:packages/reactivity '@vue/runtime-core': link:packages/runtime-core '@vue/runtime-dom': link:packages/runtime-dom @@ -89,13 +89,13 @@ importers: rollup-plugin-node-globals: 1.4.0 rollup-plugin-polyfill-node: 0.6.2_rollup@2.38.5 rollup-plugin-terser: 7.0.2_rollup@2.38.5 - rollup-plugin-typescript2: 0.27.3_rollup@2.38.5+typescript@4.5.3 + rollup-plugin-typescript2: 0.27.3_rollup@2.38.5+typescript@4.6.4 semver: 7.3.5 serve: 12.0.1 todomvc-app-css: 2.4.1 - ts-jest: 27.1.1_044236483439d51e55e98a1311368c5f - tslib: 2.3.1 - typescript: 4.5.3 + ts-jest: 27.1.1_2afc78609cda1ff8b69f87fc5df4898b + tslib: 2.4.0 + typescript: 4.6.4 vite: 2.9.1 vue: link:packages/vue yorkie: 2.0.0 @@ -1207,66 +1207,66 @@ packages: dev: true optional: true - /@typescript-eslint/parser/4.33.0_eslint@7.32.0+typescript@4.5.3: - resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/parser/5.23.0_eslint@7.32.0+typescript@4.6.4: + resolution: {integrity: sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.33.0 - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.5.3 + '@typescript-eslint/scope-manager': 5.23.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/typescript-estree': 5.23.0_typescript@4.6.4 debug: 4.3.3 eslint: 7.32.0 - typescript: 4.5.3 + typescript: 4.6.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/4.33.0: - resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/scope-manager/5.23.0: + resolution: {integrity: sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/visitor-keys': 5.23.0 dev: true - /@typescript-eslint/types/4.33.0: - resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/types/5.23.0: + resolution: {integrity: sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.5.3: - resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/typescript-estree/5.23.0_typescript@4.6.4: + resolution: {integrity: sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 + '@typescript-eslint/types': 5.23.0 + '@typescript-eslint/visitor-keys': 5.23.0 debug: 4.3.3 globby: 11.0.4 is-glob: 4.0.3 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.5.3 - typescript: 4.5.3 + tsutils: 3.21.0_typescript@4.6.4 + typescript: 4.6.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/4.33.0: - resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/visitor-keys/5.23.0: + resolution: {integrity: sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 4.33.0 - eslint-visitor-keys: 2.1.0 + '@typescript-eslint/types': 5.23.0 + eslint-visitor-keys: 3.3.0 dev: true /@vitejs/plugin-vue/1.10.2_vite@2.7.1: @@ -1367,7 +1367,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.1 + debug: 4.3.3 transitivePeerDependencies: - supports-color dev: true @@ -3018,6 +3018,11 @@ packages: engines: {node: '>=10'} dev: true + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -6170,7 +6175,7 @@ packages: - acorn dev: true - /rollup-plugin-typescript2/0.27.3_rollup@2.38.5+typescript@4.5.3: + /rollup-plugin-typescript2/0.27.3_rollup@2.38.5+typescript@4.6.4: resolution: {integrity: sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==} peerDependencies: rollup: '>=1.26.3' @@ -6182,7 +6187,7 @@ packages: resolve: 1.17.0 rollup: 2.38.5 tslib: 2.0.1 - typescript: 4.5.3 + typescript: 4.6.4 dev: true /rollup-pluginutils/2.8.2: @@ -6807,7 +6812,7 @@ packages: engines: {node: '>=8'} dev: true - /ts-jest/27.1.1_044236483439d51e55e98a1311368c5f: + /ts-jest/27.1.1_2afc78609cda1ff8b69f87fc5df4898b: resolution: {integrity: sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -6838,7 +6843,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.5 - typescript: 4.5.3 + typescript: 4.6.4 yargs-parser: 20.2.9 dev: true @@ -6854,18 +6859,18 @@ packages: resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} dev: true - /tslib/2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true - /tsutils/3.21.0_typescript@4.5.3: + /tsutils/3.21.0_typescript@4.6.4: 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: 4.5.3 + typescript: 4.6.4 dev: true /type-check/0.3.2: @@ -6932,6 +6937,12 @@ packages: hasBin: true dev: true + /typescript/4.6.4: + resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /uglify-js/3.14.4: resolution: {integrity: sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==} engines: {node: '>=0.8.0'} From 908ffb4fd4b0a87b24a613b8bc2481507fc4fcb4 Mon Sep 17 00:00:00 2001 From: Leon Si Date: Mon, 9 May 2022 22:49:14 -0400 Subject: [PATCH 0026/1523] chore: typo (#5732) [ci skip] --- packages/vue/macros.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue/macros.d.ts b/packages/vue/macros.d.ts index 41aefd77d7f..9df3f107cb2 100644 --- a/packages/vue/macros.d.ts +++ b/packages/vue/macros.d.ts @@ -55,7 +55,7 @@ type DestructureRefs = { } /** - * Vue ref transform macro for accessing underlying refs of reactive varaibles. + * Vue ref transform macro for accessing underlying refs of reactive variables. */ export declare function $$(arg: NormalObject): ToRawRefs export declare function $$(value: RefValue): Ref From 181872f744537b75a4cec8c4e49b2c7c4d4f81ff Mon Sep 17 00:00:00 2001 From: Khinenw Date: Tue, 10 May 2022 11:50:49 +0900 Subject: [PATCH 0027/1523] types(runtime-dom): fix typo in jsx type autosave (#5638) --- packages/runtime-dom/types/jsx.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-dom/types/jsx.d.ts b/packages/runtime-dom/types/jsx.d.ts index ab34e299de6..9423a755631 100644 --- a/packages/runtime-dom/types/jsx.d.ts +++ b/packages/runtime-dom/types/jsx.d.ts @@ -276,7 +276,7 @@ export interface HTMLAttributes extends AriaAttributes, EventHandlers { // Non-standard Attributes autocapitalize?: string autocorrect?: string - autocave?: string + autosave?: string color?: string itemprop?: string itemscope?: Booleanish From 6042ab0f2f6141fff82ad3775c7de716d6d97d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=A3=E9=87=8C=E5=A5=BD=E8=84=8F=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5?= <453491931@qq.com> Date: Tue, 10 May 2022 10:51:51 +0800 Subject: [PATCH 0028/1523] chore: type [ci skip] --- packages/compiler-core/__tests__/parse.spec.ts | 2 +- .../__tests__/transforms/transformElement.spec.ts | 2 +- .../__snapshots__/warnTransitionChildren.spec.ts.snap | 2 +- .../__tests__/transforms/warnTransitionChildren.spec.ts | 2 +- packages/compiler-sfc/__tests__/compileScript.spec.ts | 4 ++-- packages/compiler-sfc/src/cssVars.ts | 6 +++--- .../__snapshots__/reactivityTransform.spec.ts.snap | 4 ++-- .../__tests__/reactivityTransform.spec.ts | 2 +- packages/reactivity/__tests__/effectScope.spec.ts | 4 ++-- packages/reactivity/__tests__/readonly.spec.ts | 4 ++-- packages/reactivity/src/effectScope.ts | 2 +- packages/runtime-core/__tests__/components/Suspense.spec.ts | 4 ++-- packages/runtime-core/__tests__/errorHandling.spec.ts | 2 +- packages/runtime-core/__tests__/helpers/withMemo.spec.ts | 2 +- .../runtime-core/__tests__/rendererOptimizedMode.spec.ts | 2 +- packages/runtime-core/src/component.ts | 2 +- packages/runtime-core/src/componentOptions.ts | 4 ++-- packages/runtime-dom/__tests__/directives/vModel.spec.ts | 2 +- packages/runtime-dom/__tests__/patchProps.spec.ts | 2 +- packages/shared/__tests__/toDisplayString.spec.ts | 4 ++-- packages/vue-compat/README.md | 2 +- test-dts/component.test-d.ts | 4 ++-- 22 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index f1869739cf4..5d5e4056636 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -2023,7 +2023,7 @@ foo isPreTag: tag => tag === 'pre' }) const elementAfterPre = ast.children[1] as ElementNode - // should not affect the and condense its whitepsace inside + // should not affect the and condense its whitespace inside expect((elementAfterPre.children[0] as TextNode).content).toBe(` foo bar`) }) diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index e7a95622d1a..a9edc9870de 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -80,7 +80,7 @@ describe('compiler: element transform', () => { expect(root.components).toContain(`Foo`) }) - test('resolve implcitly self-referencing component', () => { + test('resolve implicitly self-referencing component', () => { const { root } = parseWithElementTransform(``, { filename: `/foo/bar/Example.vue?vue&type=template` }) diff --git a/packages/compiler-dom/__tests__/transforms/__snapshots__/warnTransitionChildren.spec.ts.snap b/packages/compiler-dom/__tests__/transforms/__snapshots__/warnTransitionChildren.spec.ts.snap index 5787b08ffda..2b39b25fa3f 100644 --- a/packages/compiler-dom/__tests__/transforms/__snapshots__/warnTransitionChildren.spec.ts.snap +++ b/packages/compiler-dom/__tests__/transforms/__snapshots__/warnTransitionChildren.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`the v-if/else-if/else branchs in Transition should ignore comments 1`] = ` +exports[`the v-if/else-if/else branches in Transition should ignore comments 1`] = ` "const _Vue = Vue return function render(_ctx, _cache) { diff --git a/packages/compiler-dom/__tests__/transforms/warnTransitionChildren.spec.ts b/packages/compiler-dom/__tests__/transforms/warnTransitionChildren.spec.ts index 3cccdfffc88..b037af8e6f1 100644 --- a/packages/compiler-dom/__tests__/transforms/warnTransitionChildren.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/warnTransitionChildren.spec.ts @@ -139,7 +139,7 @@ describe('compiler warnings', () => { }) }) -test('the v-if/else-if/else branchs in Transition should ignore comments', () => { +test('the v-if/else-if/else branches in Transition should ignore comments', () => { expect( compile(` diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 51ef6c9e7ec..f87a326c82f 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -64,7 +64,7 @@ const bar = 1 `) // should generate working code assertCode(content) - // should anayze bindings + // should analyze bindings expect(bindings).toStrictEqual({ foo: BindingTypes.PROPS, bar: BindingTypes.SETUP_CONST, @@ -403,7 +403,7 @@ defineExpose({ foo: 123 }) assertCode(content) }) - // #4340 interpolations in tempalte strings + // #4340 interpolations in template strings test('js template string interpolations', () => { const { content } = compile(` + + `) + expect(content).toMatch(`return { a, b, Baz }`) + assertCode(content) + }) }) describe('inlineTemplate mode', () => { diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 9c9c7ffbf82..509934d6d91 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -12,7 +12,12 @@ import { walkIdentifiers } from '@vue/compiler-dom' import { DEFAULT_FILENAME, SFCDescriptor, SFCScriptBlock } from './parse' -import { parse as _parse, ParserOptions, ParserPlugin } from '@babel/parser' +import { + parse as _parse, + parseExpression, + ParserOptions, + ParserPlugin +} from '@babel/parser' import { camelize, capitalize, generateCodeFrame, makeMap } from '@vue/shared' import { Node, @@ -348,14 +353,23 @@ export function compileScript( local: string, imported: string | false, isType: boolean, - isFromSetup: boolean + isFromSetup: boolean, + needTemplateUsageCheck: boolean ) { if (source === 'vue' && imported) { userImportAlias[imported] = local } - let isUsedInTemplate = true - if (isTS && sfc.template && !sfc.template.src && !sfc.template.lang) { + // template usage check is only needed in non-inline mode, so we can skip + // the work if inlineTemplate is true. + let isUsedInTemplate = needTemplateUsageCheck + if ( + needTemplateUsageCheck && + isTS && + sfc.template && + !sfc.template.src && + !sfc.template.lang + ) { isUsedInTemplate = isImportUsed(local, sfc) } @@ -813,7 +827,8 @@ export function compileScript( node.importKind === 'type' || (specifier.type === 'ImportSpecifier' && specifier.importKind === 'type'), - false + false, + !options.inlineTemplate ) } } else if (node.type === 'ExportDefaultDeclaration') { @@ -1027,7 +1042,8 @@ export function compileScript( node.importKind === 'type' || (specifier.type === 'ImportSpecifier' && specifier.importKind === 'type'), - true + true, + !options.inlineTemplate ) } } @@ -2051,14 +2067,14 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { code += `,v${capitalize(camelize(prop.name))}` } if (prop.exp) { - code += `,${stripStrings( + code += `,${processExp( (prop.exp as SimpleExpressionNode).content )}` } } } } else if (node.type === NodeTypes.INTERPOLATION) { - code += `,${stripStrings( + code += `,${processExp( (node.content as SimpleExpressionNode).content )}` } @@ -2071,6 +2087,19 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { return code } +function processExp(exp: string) { + if (/ as \w|<.*>/.test(exp)) { + let ret = '' + // has potential type cast or generic arguments that uses types + const ast = parseExpression(exp, { plugins: ['typescript'] }) + walkIdentifiers(ast, node => { + ret += `,` + node.name + }) + return ret + } + return stripStrings(exp) +} + function stripStrings(exp: string) { return exp .replace(/'[^']*'|"[^"]*"/g, '') From 8c51c6514f99b4c70183f4c1a0eaabd482f88d5b Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 12 May 2022 18:39:17 +0800 Subject: [PATCH 0066/1523] fix(v-model): exclude range from lazy guard logic fix #5875 --- packages/runtime-dom/src/directives/vModel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index b3e10a2a1c2..3d05e9fa47f 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -18,7 +18,9 @@ import { type AssignerFn = (value: any) => void const getModelAssigner = (vnode: VNode): AssignerFn => { - const fn = vnode.props!['onUpdate:modelValue'] || (__COMPAT__ && vnode.props!['onModelCompat:input']) + const fn = + vnode.props!['onUpdate:modelValue'] || + (__COMPAT__ && vnode.props!['onModelCompat:input']) return isArray(fn) ? value => invokeArrayFns(fn, value) : fn } @@ -78,7 +80,7 @@ export const vModelText: ModelDirective< el._assign = getModelAssigner(vnode) // avoid clearing unresolved text. #2302 if ((el as any).composing) return - if (document.activeElement === el) { + if (document.activeElement === el && el.type !== 'range') { if (lazy) { return } From 8a123ac34fd30fc36ac9e0c252dd345d6d7c7f50 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 12 May 2022 18:56:54 +0800 Subject: [PATCH 0067/1523] fix(compiler-sfc): fix treeshaking of namespace import when used in template fix #5209 --- .../__tests__/__snapshots__/compileScript.spec.ts.snap | 4 +++- packages/compiler-sfc/__tests__/compileScript.spec.ts | 4 ++++ packages/compiler-sfc/src/compileScript.ts | 9 +++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 757b153411d..55ed14aa741 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -777,6 +777,7 @@ exports[`SFC compile + + `) + expect(content).toMatch(`x = __props["foo.bar"]`) + expect(content).toMatch(`toDisplayString(__props["foo.bar"])`) + assertCode(content) + expect(bindings).toStrictEqual({ + x: BindingTypes.SETUP_LET, + 'foo.bar': BindingTypes.PROPS, + fooBar: BindingTypes.PROPS_ALIASED, + __propsAliases: { + fooBar: 'foo.bar' + } + }) + }) + test('rest spread', () => { const { content, bindings } = compile(` + + `) + assertCode(content) + }) + describe(' `) expect(content).toMatch(`return { a, b, Baz }`) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 74c89e88d47..ca82dc909bd 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -65,7 +65,7 @@ const WITH_DEFAULTS = 'withDefaults' const DEFAULT_VAR = `__default__` const isBuiltInDir = makeMap( - `once,memo,if,else,else-if,slot,text,html,on,bind,model,show,cloak,is` + `once,memo,if,for,else,else-if,slot,text,html,on,bind,model,show,cloak,is` ) export interface SFCScriptCompileOptions { @@ -2103,7 +2103,8 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { } if (prop.exp) { code += `,${processExp( - (prop.exp as SimpleExpressionNode).content + (prop.exp as SimpleExpressionNode).content, + prop.name )}` } } @@ -2122,8 +2123,19 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) { return code } -function processExp(exp: string) { - if (/ as \w|<.*>/.test(exp)) { +const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/ + +function processExp(exp: string, dir?: string): string { + if (/ as\s+\w|<.*>|:/.test(exp)) { + if (dir === 'slot') { + exp = `(${exp})=>{}` + } else if (dir === 'for') { + const inMatch = exp.match(forAliasRE) + if (inMatch) { + const [, LHS, RHS] = inMatch + return processExp(`(${LHS})=>{}`) + processExp(RHS) + } + } let ret = '' // has potential type cast or generic arguments that uses types const ast = parseExpression(exp, { plugins: ['typescript'] }) From 8071ef47b5adcd5fcd9d0d2ea2cefff5c34ce095 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 21 May 2022 00:53:46 +0800 Subject: [PATCH 0137/1523] fix(types): restore DefineComponent argument order This is necessary for compatibility w/ tsc-generated component types using DefineComponent. revert #5416 reopen #3796 fix #5967 --- .../runtime-core/src/apiAsyncComponent.ts | 2 +- .../runtime-core/src/apiDefineComponent.ts | 173 ++++-------------- packages/runtime-core/src/componentOptions.ts | 22 +-- .../src/componentPublicInstance.ts | 20 +- test-dts/defineComponent.test-d.tsx | 33 ++-- 5 files changed, 64 insertions(+), 186 deletions(-) diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index c9b96607b5f..41ccd94a744 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -111,7 +111,7 @@ export function defineAsyncComponent< ) } - return defineComponent<{}>({ + return defineComponent({ name: 'AsyncComponentWrapper', __asyncLoader: load, diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index a086704762a..83446346fab 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -6,8 +6,7 @@ import { ComponentOptionsWithObjectProps, ComponentOptionsMixin, RenderFunction, - ComponentOptionsBase, - ComponentProvideOptions + ComponentOptionsBase } from './componentOptions' import { SetupContext, @@ -41,8 +40,6 @@ export type DefineComponent< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, - RawOptions extends {} = {}, PP = PublicProps, Props = Readonly< PropsOrPropOptions extends ComponentPropsOptions @@ -51,23 +48,22 @@ export type DefineComponent< > & ({} extends E ? {} : EmitsToProps), Defaults = ExtractDefaultPropTypes -> = RawOptions & - ComponentPublicInstanceConstructor< - CreateComponentPublicInstance< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - PP & Props, - Defaults, - true - > & - Props +> = ComponentPublicInstanceConstructor< + CreateComponentPublicInstance< + Props, + RawBindings, + D, + C, + M, + Mixin, + Extends, + E, + PP & Props, + Defaults, + true > & + Props +> & ComponentOptionsBase< Props, RawBindings, @@ -78,8 +74,7 @@ export type DefineComponent< Extends, E, EE, - Defaults, - Provide + Defaults > & PP @@ -109,20 +104,9 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, - EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends ComponentOptionsWithoutProps< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > = ComponentOptionsWithoutProps< + EE extends string = string +>( + options: ComponentOptionsWithoutProps< Props, RawBindings, D, @@ -131,36 +115,9 @@ export function defineComponent< Mixin, Extends, E, - EE, - Provide + EE > ->( - options: Options & - ComponentOptionsWithoutProps< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > -): DefineComponent< - Props, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide, - Options -> +): DefineComponent // overload 3: object format with array props declaration // props inferred as { [key in PropNames]?: any } @@ -174,20 +131,9 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, - EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends ComponentOptionsWithArrayProps< - PropNames, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > = ComponentOptionsWithArrayProps< + EE extends string = string +>( + options: ComponentOptionsWithArrayProps< PropNames, RawBindings, D, @@ -196,23 +142,8 @@ export function defineComponent< Mixin, Extends, E, - EE, - Provide + EE > ->( - options: Options & - ComponentOptionsWithArrayProps< - PropNames, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > ): DefineComponent< Readonly<{ [key in PropNames]?: any }>, RawBindings, @@ -222,9 +153,7 @@ export function defineComponent< Mixin, Extends, E, - EE, - Provide, - Options + EE > // overload 4: object format with object props declaration @@ -240,20 +169,9 @@ export function defineComponent< Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, - EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, - Options extends ComponentOptionsWithObjectProps< - PropsOptions, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > = ComponentOptionsWithObjectProps< + EE extends string = string +>( + options: ComponentOptionsWithObjectProps< PropsOptions, RawBindings, D, @@ -262,36 +180,9 @@ export function defineComponent< Mixin, Extends, E, - EE, - Provide + EE > ->( - options: Options & - ComponentOptionsWithObjectProps< - PropsOptions, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide - > -): DefineComponent< - PropsOptions, - RawBindings, - D, - C, - M, - Mixin, - Extends, - E, - EE, - Provide, - Options -> +): DefineComponent // implementation, close to no-op export function defineComponent(options: unknown) { diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index c482d051965..0d47e18c4af 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -118,9 +118,8 @@ export interface ComponentOptionsBase< Extends extends ComponentOptionsMixin, E extends EmitsOptions, EE extends string = string, - Defaults = {}, - Provide extends ComponentProvideOptions = ComponentProvideOptions -> extends LegacyOptions, + Defaults = {} +> extends LegacyOptions, ComponentInternalOptions, ComponentCustomOptions { setup?: ( @@ -226,7 +225,6 @@ export type ComponentOptionsWithoutProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, PE = Props & EmitsToProps > = ComponentOptionsBase< PE, @@ -238,8 +236,7 @@ export type ComponentOptionsWithoutProps< Extends, E, EE, - {}, - Provide + {} > & { props?: undefined } & ThisType< @@ -256,7 +253,6 @@ export type ComponentOptionsWithArrayProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, Props = Readonly<{ [key in PropNames]?: any }> & EmitsToProps > = ComponentOptionsBase< Props, @@ -268,8 +264,7 @@ export type ComponentOptionsWithArrayProps< Extends, E, EE, - {}, - Provide + {} > & { props: PropNames[] } & ThisType< @@ -295,7 +290,6 @@ export type ComponentOptionsWithObjectProps< Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = EmitsOptions, EE extends string = string, - Provide extends ComponentProvideOptions = ComponentProvideOptions, Props = Readonly> & EmitsToProps, Defaults = ExtractDefaultPropTypes > = ComponentOptionsBase< @@ -308,8 +302,7 @@ export type ComponentOptionsWithObjectProps< Extends, E, EE, - Defaults, - Provide + Defaults > & { props: PropsOptions & ThisType } & ThisType< @@ -409,8 +402,7 @@ interface LegacyOptions< C extends ComputedOptions, M extends MethodOptions, Mixin extends ComponentOptionsMixin, - Extends extends ComponentOptionsMixin, - Provide extends ComponentProvideOptions = ComponentProvideOptions + Extends extends ComponentOptionsMixin > { compatConfig?: CompatConfig @@ -444,7 +436,7 @@ interface LegacyOptions< computed?: C methods?: M watch?: ComponentWatchOptions - provide?: Provide + provide?: ComponentProvideOptions inject?: ComponentInjectOptions // assets diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 986a2e79b55..1d913673123 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -34,8 +34,7 @@ import { OptionTypesKeys, resolveMergedOptions, shouldCacheAccess, - MergedComponentOptionsOverride, - ComponentProvideOptions + MergedComponentOptionsOverride } from './componentOptions' import { EmitsOptions, EmitFn } from './componentEmits' import { Slots } from './componentSlots' @@ -151,8 +150,7 @@ export type CreateComponentPublicInstance< PublicM extends MethodOptions = UnwrapMixinsType & EnsureNonVoid, PublicDefaults = UnwrapMixinsType & - EnsureNonVoid, - Provide extends ComponentProvideOptions = ComponentProvideOptions + EnsureNonVoid > = ComponentPublicInstance< PublicP, PublicB, @@ -163,19 +161,7 @@ export type CreateComponentPublicInstance< PublicProps, PublicDefaults, MakeDefaultsOptional, - ComponentOptionsBase< - P, - B, - D, - C, - M, - Mixin, - Extends, - E, - string, - Defaults, - Provide - > + ComponentOptionsBase > // public properties exposed on the proxy, which is used as the render context diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index 7412d6db36f..30d25436201 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -264,18 +264,6 @@ describe('with object props', () => { expectType(MyComponent) - expectType(MyComponent.props) - // @ts-expect-error it should be an object and not any - expectError<[]>(MyComponent.props) - - expectType<() => {}>(MyComponent.provide) - // @ts-expect-error - expectError<[]>(MyComponent.provide) - - expectType<() => null>(MyComponent.render) - - expectType(defineComponent({}).render) - // Test TSX expectType( JSX.Element, + {}, + {}, + {}, + import('vue').ComponentOptionsMixin, + import('vue').ComponentOptionsMixin, + import('vue').EmitsOptions, + string, + import('vue').VNodeProps & + import('vue').AllowedComponentProps & + import('vue').ComponentCustomProps, + Readonly>, + {} +> + +; From 0c7fd13ea628a2f1b72c6f4150c0dba32da4468e Mon Sep 17 00:00:00 2001 From: Carlos Rodrigues Date: Fri, 20 May 2022 17:59:29 +0100 Subject: [PATCH 0138/1523] fix(types): fix typescript error when spreading `$props`(#5968) --- packages/runtime-core/src/index.ts | 2 +- packages/runtime-core/src/vnode.ts | 6 +++++- packages/runtime-dom/types/jsx.d.ts | 6 +----- test-dts/componentTypeExtensions.test-d.tsx | 1 + test-dts/defineComponent.test-d.tsx | 19 +++++++++++++++++++ 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 6e85afe4db5..12a2dee2773 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -86,7 +86,7 @@ export { h } from './h' // Advanced render function utilities export { createVNode, cloneVNode, mergeProps, isVNode } from './vnode' // VNode types -export { Fragment, Text, Comment, Static } from './vnode' +export { Fragment, Text, Comment, Static, VNodeRef } from './vnode' // Built-in components export { Teleport, TeleportProps } from './components/Teleport' export { Suspense, SuspenseProps } from './components/Suspense' diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 0a2543a70e7..b2c52ac7e2e 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -43,6 +43,7 @@ import { convertLegacyComponent } from './compat/component' import { convertLegacyVModelProps } from './compat/componentVModel' import { defineLegacyVNodeProperties } from './compat/renderFn' import { callWithAsyncErrorHandling, ErrorCodes } from './errorHandling' +import { ComponentPublicInstance } from './componentPublicInstance' export const Fragment = Symbol(__DEV__ ? 'Fragment' : undefined) as any as { __isFragment: true @@ -68,7 +69,10 @@ export type VNodeTypes = export type VNodeRef = | string | Ref - | ((ref: object | null, refs: Record) => void) + | (( + ref: Element | ComponentPublicInstance | null, + refs: Record + ) => void) export type VNodeNormalizedRefAtom = { i: ComponentInternalInstance diff --git a/packages/runtime-dom/types/jsx.d.ts b/packages/runtime-dom/types/jsx.d.ts index 38a7b5e77fd..6120f77715a 100644 --- a/packages/runtime-dom/types/jsx.d.ts +++ b/packages/runtime-dom/types/jsx.d.ts @@ -40,7 +40,6 @@ export interface CSSProperties * For examples and more information, visit: * https://github.com/frenic/csstype#what-should-i-do-when-i-get-type-errors */ - [v: `--${string}`]: string | number | undefined } @@ -1311,10 +1310,7 @@ import * as RuntimeCore from '@vue/runtime-core' type ReservedProps = { key?: string | number | symbol - ref?: - | string - | RuntimeCore.Ref - | ((ref: Element | RuntimeCore.ComponentPublicInstance | null) => void) + ref?: RuntimeCore.VNodeRef ref_for?: boolean ref_key?: string } diff --git a/test-dts/componentTypeExtensions.test-d.tsx b/test-dts/componentTypeExtensions.test-d.tsx index 32a72f844e6..3ff5b7addb0 100644 --- a/test-dts/componentTypeExtensions.test-d.tsx +++ b/test-dts/componentTypeExtensions.test-d.tsx @@ -44,6 +44,7 @@ export const Custom = defineComponent({ expectType() expectType() expectType() +expectType() // @ts-expect-error expectType() diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index 30d25436201..f5941b4341e 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -1144,6 +1144,25 @@ describe('DefineComponent should infer correct types when assigning to Component expectType(component) }) +// #5969 +describe('should allow to assign props', () => { + const Child = defineComponent({ + props: { + bar: String + } + }) + + const Parent = defineComponent({ + props: { + ...Child.props, + foo: String + } + }) + + const child = new Child() + expectType() +}) + // check if defineComponent can be exported export default { // function components From ae1fd539b7bf9d83e30783cdacb468f204c1dad6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 21 May 2022 01:10:18 +0800 Subject: [PATCH 0139/1523] chore: fix dts test --- test-dts/defineComponent.test-d.tsx | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index f5941b4341e..2c4076b9b2d 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -1183,22 +1183,30 @@ export default { }) } +import { + DefineComponent, + ComponentOptionsMixin, + EmitsOptions, + VNodeProps, + AllowedComponentProps, + ComponentCustomProps, + ExtractPropTypes +} from './index' + // code generated by tsc / vue-tsc, make sure this continues to work // so we don't accidentally change the args order of DefineComponent -declare const MyButton: import('vue').DefineComponent< +declare const MyButton: DefineComponent< {}, () => JSX.Element, {}, {}, {}, - import('vue').ComponentOptionsMixin, - import('vue').ComponentOptionsMixin, - import('vue').EmitsOptions, + ComponentOptionsMixin, + ComponentOptionsMixin, + EmitsOptions, string, - import('vue').VNodeProps & - import('vue').AllowedComponentProps & - import('vue').ComponentCustomProps, - Readonly>, + VNodeProps & AllowedComponentProps & ComponentCustomProps, + Readonly>, {} > From a0c577692f9595758cc5c873f9ffef11498a7a1b Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 21 May 2022 01:16:26 +0800 Subject: [PATCH 0140/1523] release: v3.2.35 --- CHANGELOG.md | 11 +++++ package.json | 2 +- packages/compiler-core/package.json | 4 +- packages/compiler-dom/package.json | 6 +-- packages/compiler-sfc/package.json | 12 ++--- packages/compiler-ssr/package.json | 6 +-- packages/reactivity-transform/package.json | 6 +-- packages/reactivity/package.json | 4 +- packages/runtime-core/package.json | 6 +-- packages/runtime-dom/package.json | 6 +-- packages/runtime-test/package.json | 6 +-- packages/server-renderer/package.json | 8 ++-- packages/sfc-playground/package.json | 4 +- packages/shared/package.json | 2 +- packages/size-check/package.json | 2 +- packages/template-explorer/package.json | 2 +- packages/vue-compat/package.json | 4 +- packages/vue/package.json | 12 ++--- pnpm-lock.yaml | 54 +++++++++++----------- 19 files changed, 84 insertions(+), 73 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87df134826b..e83d08b0443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [3.2.35](https://github.com/vuejs/core/compare/v3.2.34...v3.2.35) (2022-05-20) + + +### Bug Fixes + +* **compiler-sfc:** fix usage detection for types in v-for/v-slot expressions ([583b625](https://github.com/vuejs/core/commit/583b6259870211c32efee0bb4a60b342799d80f7)), closes [#5959](https://github.com/vuejs/core/issues/5959) +* **types:** fix typescript error when spreading `$props`([#5968](https://github.com/vuejs/core/issues/5968)) ([0c7fd13](https://github.com/vuejs/core/commit/0c7fd13ea628a2f1b72c6f4150c0dba32da4468e)) +* **types:** restore DefineComponent argument order ([8071ef4](https://github.com/vuejs/core/commit/8071ef47b5adcd5fcd9d0d2ea2cefff5c34ce095)), closes [#5416](https://github.com/vuejs/core/issues/5416) [#3796](https://github.com/vuejs/core/issues/3796) [#5967](https://github.com/vuejs/core/issues/5967) + + + ## [3.2.34](https://github.com/vuejs/core/compare/v3.2.34-beta.1...v3.2.34) (2022-05-19) diff --git a/package.json b/package.json index 46c8f0cc53c..9e99734d90b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.2.34", + "version": "3.2.35", "packageManager": "pnpm@7.1.0", "scripts": { "dev": "node scripts/dev.js", diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index ca154fc2e35..56cafa9eecb 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme", "dependencies": { - "@vue/shared": "3.2.34", + "@vue/shared": "3.2.35", "@babel/parser": "^7.16.4", "estree-walker": "^2.0.2", "source-map": "^0.6.1" diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index a7a466b6b40..3b0787c2b8c 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/compiler-core": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.35" } } diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index c43031a826a..eb17295f2a2 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", @@ -33,11 +33,11 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.34", - "@vue/compiler-dom": "3.2.34", - "@vue/compiler-ssr": "3.2.34", - "@vue/reactivity-transform": "3.2.34", - "@vue/shared": "3.2.34", + "@vue/compiler-core": "3.2.35", + "@vue/compiler-dom": "3.2.35", + "@vue/compiler-ssr": "3.2.35", + "@vue/reactivity-transform": "3.2.35", + "@vue/shared": "3.2.35", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "source-map": "^0.6.1", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index 369c73f9fa8..e8d27031291 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", @@ -28,7 +28,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/compiler-dom": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/compiler-dom": "3.2.35" } } diff --git a/packages/reactivity-transform/package.json b/packages/reactivity-transform/package.json index a6d6b426941..07cf64395ff 100644 --- a/packages/reactivity-transform/package.json +++ b/packages/reactivity-transform/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity-transform", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/reactivity-transform", "main": "dist/reactivity-transform.cjs.js", "files": [ @@ -29,8 +29,8 @@ "homepage": "https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.34", - "@vue/shared": "3.2.34", + "@vue/compiler-core": "3.2.35", + "@vue/shared": "3.2.35", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index e33ac841e8f..94cebd18df0 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", @@ -36,6 +36,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/reactivity#readme", "dependencies": { - "@vue/shared": "3.2.34" + "@vue/shared": "3.2.35" } } diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index ff471d18921..e173b9c5c51 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-core#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/reactivity": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/reactivity": "3.2.35" } } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index af84ef7cb9c..d9c1065c629 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", @@ -35,8 +35,8 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/runtime-core": "3.2.34", + "@vue/shared": "3.2.35", + "@vue/runtime-core": "3.2.35", "csstype": "^2.6.8" } } diff --git a/packages/runtime-test/package.json b/packages/runtime-test/package.json index b51a1fec1c0..7456427b66b 100644 --- a/packages/runtime-test/package.json +++ b/packages/runtime-test/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-test", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/runtime-test", "private": true, "main": "index.js", @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-test#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/runtime-core": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/runtime-core": "3.2.35" } } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 4e3c18d07b2..bbc0f7f4dcb 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.2.34", + "version": "3.2.35", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", @@ -31,10 +31,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme", "peerDependencies": { - "vue": "3.2.34" + "vue": "3.2.35" }, "dependencies": { - "@vue/shared": "3.2.34", - "@vue/compiler-ssr": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/compiler-ssr": "3.2.35" } } diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index db838212b6a..ef162aeec86 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -1,6 +1,6 @@ { "name": "@vue/sfc-playground", - "version": "3.2.34", + "version": "3.2.35", "private": true, "scripts": { "dev": "vite", @@ -12,7 +12,7 @@ "vite": "^2.9.8" }, "dependencies": { - "vue": "3.2.34", + "vue": "3.2.35", "@vue/repl": "^1.1.2", "file-saver": "^2.0.5", "jszip": "^3.6.0" diff --git a/packages/shared/package.json b/packages/shared/package.json index 447ff8b8c1b..3dc432764bf 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.2.34", + "version": "3.2.35", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/size-check/package.json b/packages/size-check/package.json index f5d47d36946..f573b45c5e4 100644 --- a/packages/size-check/package.json +++ b/packages/size-check/package.json @@ -1,6 +1,6 @@ { "name": "@vue/size-check", - "version": "3.2.34", + "version": "3.2.35", "private": true, "scripts": { "build": "vite build" diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index 73a66f40b12..ee5283f236c 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/template-explorer", - "version": "3.2.34", + "version": "3.2.35", "private": true, "buildOptions": { "formats": [ diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index f253d8b40e1..9c36a4637e4 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.2.34", + "version": "3.2.35", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -38,6 +38,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue-compat#readme", "peerDependencies": { - "vue": "3.2.34" + "vue": "3.2.35" } } diff --git a/packages/vue/package.json b/packages/vue/package.json index 10a455ffcec..2d4a16f2b20 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.2.34", + "version": "3.2.35", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -66,10 +66,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue#readme", "dependencies": { - "@vue/shared": "3.2.34", - "@vue/compiler-dom": "3.2.34", - "@vue/runtime-dom": "3.2.34", - "@vue/compiler-sfc": "3.2.34", - "@vue/server-renderer": "3.2.34" + "@vue/shared": "3.2.35", + "@vue/compiler-dom": "3.2.35", + "@vue/runtime-dom": "3.2.35", + "@vue/compiler-sfc": "3.2.35", + "@vue/server-renderer": "3.2.35" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 564c62eb8cf..1e2f81f1f25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: specifiers: '@babel/parser': ^7.16.4 '@babel/types': ^7.16.0 - '@vue/shared': 3.2.34 + '@vue/shared': 3.2.35 estree-walker: ^2.0.2 source-map: ^0.6.1 dependencies: @@ -119,8 +119,8 @@ importers: packages/compiler-dom: specifiers: - '@vue/compiler-core': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/compiler-core': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/compiler-core': link:../compiler-core '@vue/shared': link:../shared @@ -131,12 +131,12 @@ importers: '@babel/types': ^7.16.0 '@types/estree': ^0.0.48 '@types/lru-cache': ^5.1.0 - '@vue/compiler-core': 3.2.34 - '@vue/compiler-dom': 3.2.34 - '@vue/compiler-ssr': 3.2.34 + '@vue/compiler-core': 3.2.35 + '@vue/compiler-dom': 3.2.35 + '@vue/compiler-ssr': 3.2.35 '@vue/consolidate': ^0.17.3 - '@vue/reactivity-transform': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/reactivity-transform': 3.2.35 + '@vue/shared': 3.2.35 estree-walker: ^2.0.2 hash-sum: ^2.0.0 lru-cache: ^5.1.1 @@ -174,15 +174,15 @@ importers: packages/compiler-ssr: specifiers: - '@vue/compiler-dom': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/compiler-dom': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/shared': link:../shared packages/reactivity: specifiers: - '@vue/shared': 3.2.34 + '@vue/shared': 3.2.35 dependencies: '@vue/shared': link:../shared @@ -191,8 +191,8 @@ importers: '@babel/core': ^7.16.0 '@babel/parser': ^7.16.4 '@babel/types': ^7.16.0 - '@vue/compiler-core': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/compiler-core': 3.2.35 + '@vue/shared': 3.2.35 estree-walker: ^2.0.2 magic-string: ^0.25.7 dependencies: @@ -207,16 +207,16 @@ importers: packages/runtime-core: specifiers: - '@vue/reactivity': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/reactivity': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/reactivity': link:../reactivity '@vue/shared': link:../shared packages/runtime-dom: specifiers: - '@vue/runtime-core': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/runtime-core': 3.2.35 + '@vue/shared': 3.2.35 csstype: ^2.6.8 dependencies: '@vue/runtime-core': link:../runtime-core @@ -225,16 +225,16 @@ importers: packages/runtime-test: specifiers: - '@vue/runtime-core': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/runtime-core': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/runtime-core': link:../runtime-core '@vue/shared': link:../shared packages/server-renderer: specifiers: - '@vue/compiler-ssr': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/compiler-ssr': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/compiler-ssr': link:../compiler-ssr '@vue/shared': link:../shared @@ -246,7 +246,7 @@ importers: file-saver: ^2.0.5 jszip: ^3.6.0 vite: ^2.9.8 - vue: 3.2.34 + vue: 3.2.35 dependencies: '@vue/repl': 1.1.2_vue@packages+vue file-saver: 2.0.5 @@ -272,11 +272,11 @@ importers: packages/vue: specifiers: - '@vue/compiler-dom': 3.2.34 - '@vue/compiler-sfc': 3.2.34 - '@vue/runtime-dom': 3.2.34 - '@vue/server-renderer': 3.2.34 - '@vue/shared': 3.2.34 + '@vue/compiler-dom': 3.2.35 + '@vue/compiler-sfc': 3.2.35 + '@vue/runtime-dom': 3.2.35 + '@vue/server-renderer': 3.2.35 + '@vue/shared': 3.2.35 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/compiler-sfc': link:../compiler-sfc From dddbd96dfe69292cee401f72d2703e8fb3708a14 Mon Sep 17 00:00:00 2001 From: edison Date: Mon, 23 May 2022 08:02:15 +0800 Subject: [PATCH 0141/1523] fix(transition): fix cancel leave regression (#5974) fix #5973 --- packages/runtime-dom/src/components/Transition.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/runtime-dom/src/components/Transition.ts b/packages/runtime-dom/src/components/Transition.ts index f33d4136755..0c1a30f6b95 100644 --- a/packages/runtime-dom/src/components/Transition.ts +++ b/packages/runtime-dom/src/components/Transition.ts @@ -174,9 +174,11 @@ export function resolveTransitionProps( done && done() } - let isLeaving = false - const finishLeave = (el: Element, done?: () => void) => { - isLeaving = false + const finishLeave = ( + el: Element & { _isLeaving?: boolean }, + done?: () => void + ) => { + el._isLeaving = false removeTransitionClass(el, leaveFromClass) removeTransitionClass(el, leaveToClass) removeTransitionClass(el, leaveActiveClass) @@ -223,8 +225,8 @@ export function resolveTransitionProps( }, onEnter: makeEnterHook(false), onAppear: makeEnterHook(true), - onLeave(el, done) { - isLeaving = true + onLeave(el: Element & { _isLeaving?: boolean }, done) { + el._isLeaving = true const resolve = () => finishLeave(el, done) addTransitionClass(el, leaveFromClass) if (__COMPAT__ && legacyClassEnabled) { @@ -234,7 +236,7 @@ export function resolveTransitionProps( forceReflow() addTransitionClass(el, leaveActiveClass) nextFrame(() => { - if (!isLeaving) { + if (!el._isLeaving) { // cancelled return } From b5462822d6c0a43866deef2b3437bbe3bbfb3625 Mon Sep 17 00:00:00 2001 From: Alex Kozack Date: Mon, 23 May 2022 03:28:39 +0300 Subject: [PATCH 0142/1523] fix(sfc/types): allow use default factory for primitive types in `withDefaults` (#5939) fix #5938 --- packages/runtime-core/src/apiSetupHelpers.ts | 2 +- test-dts/setupHelpers.test-d.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 155c8cd19cc..a8b7fcdef31 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -139,7 +139,7 @@ type InferDefault = T extends | boolean | symbol | Function - ? T + ? T | ((props: P) => T) : (props: P) => T type PropsWithDefaults = Base & { diff --git a/test-dts/setupHelpers.test-d.ts b/test-dts/setupHelpers.test-d.ts index 155ba337dcf..6b9c67b2897 100644 --- a/test-dts/setupHelpers.test-d.ts +++ b/test-dts/setupHelpers.test-d.ts @@ -28,12 +28,14 @@ describe('defineProps w/ type declaration + withDefaults', () => { obj?: { x: number } fn?: (e: string) => void x?: string + genStr?: string }>(), { number: 123, arr: () => [], obj: () => ({ x: 123 }), - fn: () => {} + fn: () => {}, + genStr: () => '' } ) @@ -43,6 +45,7 @@ describe('defineProps w/ type declaration + withDefaults', () => { res.fn('hi') // @ts-expect-error res.x.slice() + res.genStr.slice() }) describe('defineProps w/ union type declaration + withDefaults', () => { @@ -51,11 +54,13 @@ describe('defineProps w/ union type declaration + withDefaults', () => { union1?: number | number[] | { x: number } union2?: number | number[] | { x: number } union3?: number | number[] | { x: number } + union4?: number | number[] | { x: number } }>(), { union1: 123, union2: () => [123], - union3: () => ({ x: 123 }) + union3: () => ({ x: 123 }), + union4: () => 123, } ) }) From 0cd21ba77cafe0900c43f0b13335694cc2d9f80f Mon Sep 17 00:00:00 2001 From: Jinesh Patel Date: Mon, 23 May 2022 05:59:15 +0530 Subject: [PATCH 0143/1523] chore: remove unnecessary optional check (#5958) --- packages/compiler-sfc/src/rewriteDefault.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/rewriteDefault.ts b/packages/compiler-sfc/src/rewriteDefault.ts index 53db1798b72..da7c3a042e9 100644 --- a/packages/compiler-sfc/src/rewriteDefault.ts +++ b/packages/compiler-sfc/src/rewriteDefault.ts @@ -66,7 +66,7 @@ export function rewriteDefault( `import { ${input.slice( specifier.local.start!, specifier.local.end! - )} } from '${node.source?.value}'\n` + )} } from '${node.source.value}'\n` ) s.overwrite(specifier.start!, end, ``) s.append(`\nconst ${as} = ${specifier.local.name}`) From 3bdc41dff305422cb5334a64353c314bce1202a4 Mon Sep 17 00:00:00 2001 From: zhangenming <282126346@qq.com> Date: Mon, 23 May 2022 08:36:57 +0800 Subject: [PATCH 0144/1523] perf: improve the performance of getNow (#5944) --- packages/runtime-dom/src/modules/events.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-dom/src/modules/events.ts b/packages/runtime-dom/src/modules/events.ts index a4cb61e88fe..bd2279cf5f2 100644 --- a/packages/runtime-dom/src/modules/events.ts +++ b/packages/runtime-dom/src/modules/events.ts @@ -25,7 +25,7 @@ const [_getNow, skipTimestampCheck] = /*#__PURE__*/ (() => { // if the low-res timestamp which is bigger than the event timestamp // (which is evaluated AFTER) it means the event is using a hi-res timestamp, // and we need to use the hi-res version for event listeners as well. - _getNow = () => performance.now() + _getNow = performance.now.bind(performance) } // #3485: Firefox <= 53 has incorrect Event.timeStamp implementation // and does not fire microtasks in between event propagation, so safe to exclude. From 7fbc933f4d80c0259ee24872ba790681cf3cbe76 Mon Sep 17 00:00:00 2001 From: Travis Date: Mon, 23 May 2022 09:40:53 +0800 Subject: [PATCH 0145/1523] fix(compiler-core): fix svg with directives being incorrectly hoisted (#5919) fix #5289 --- .../__snapshots__/hoistStatic.spec.ts.snap | 24 +++++++++++++++++++ .../__tests__/transforms/hoistStatic.spec.ts | 6 +++++ .../src/transforms/hoistStatic.ts | 9 +++++++ 3 files changed, 39 insertions(+) diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap index 73c714d837e..15b5cf4c309 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap @@ -211,6 +211,30 @@ return function render(_ctx, _cache) { }" `; +exports[`compiler: hoistStatic transform prefixIdentifiers should NOT hoist SVG with directives 1`] = ` +"const _Vue = Vue +const { createElementVNode: _createElementVNode } = _Vue + +const _hoisted_1 = /*#__PURE__*/_createElementVNode(\\"path\\", { d: \\"M2,3H5.5L12\\" }, null, -1 /* HOISTED */) +const _hoisted_2 = [ + _hoisted_1 +] + +return function render(_ctx, _cache) { + with (_ctx) { + const { createElementVNode: _createElementVNode, resolveDirective: _resolveDirective, openBlock: _openBlock, createElementBlock: _createElementBlock, withDirectives: _withDirectives } = _Vue + + const _directive_foo = _resolveDirective(\\"foo\\") + + return (_openBlock(), _createElementBlock(\\"div\\", null, [ + _withDirectives((_openBlock(), _createElementBlock(\\"svg\\", null, _hoisted_2)), [ + [_directive_foo] + ]) + ])) + } +}" +`; + exports[`compiler: hoistStatic transform prefixIdentifiers should NOT hoist elements with cached handlers + other bindings 1`] = ` "import { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \\"vue\\" diff --git a/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts b/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts index 0cbd4910a30..2c4421aeb3b 100644 --- a/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts +++ b/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts @@ -616,5 +616,11 @@ describe('compiler: hoistStatic transform', () => { expect(root.hoists.length).toBe(0) expect(generate(root).code).toMatchSnapshot() }) + + test('should NOT hoist SVG with directives', () => { + const root = transformWithHoist(`
`) + expect(root.hoists.length).toBe(2) + expect(generate(root).code).toMatchSnapshot() + }) }) }) diff --git a/packages/compiler-core/src/transforms/hoistStatic.ts b/packages/compiler-core/src/transforms/hoistStatic.ts index ae95eadb683..848052581ed 100644 --- a/packages/compiler-core/src/transforms/hoistStatic.ts +++ b/packages/compiler-core/src/transforms/hoistStatic.ts @@ -230,6 +230,15 @@ export function getConstantType( // static then they don't need to be blocks since there will be no // nested updates. if (codegenNode.isBlock) { + // except set custom directives. + for (let i = 0; i < node.props.length; i++) { + const p = node.props[i] + if (p.type === NodeTypes.DIRECTIVE) { + constantCache.set(node, ConstantTypes.NOT_CONSTANT) + return ConstantTypes.NOT_CONSTANT + } + } + context.removeHelper(OPEN_BLOCK) context.removeHelper( getVNodeBlockHelper(context.inSSR, codegenNode.isComponent) From 7fb57327b9d0e4d9eb675149f167d915fb0d59fa Mon Sep 17 00:00:00 2001 From: Alex Van Liew Date: Sun, 22 May 2022 18:41:39 -0700 Subject: [PATCH 0146/1523] fix(compat): fix app-level asset registration affecting other local apps (#5979) --- packages/runtime-core/src/compat/global.ts | 5 +++-- packages/vue-compat/__tests__/global.spec.ts | 22 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index e0fc699fa5f..1cde73bd48a 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -381,9 +381,10 @@ function installLegacyAPIs(app: App) { function applySingletonAppMutations(app: App) { // copy over asset registries and deopt flag - ;['mixins', 'components', 'directives', 'filters', 'deopt'].forEach(key => { + app._context.mixins = [...singletonApp._context.mixins] + ;['components', 'directives', 'filters'].forEach(key => { // @ts-ignore - app._context[key] = singletonApp._context[key] + app._context[key] = Object.create(singletonApp._context[key]) }) // copy over global config mutations diff --git a/packages/vue-compat/__tests__/global.spec.ts b/packages/vue-compat/__tests__/global.spec.ts index e4cd30074da..0bc18a5d588 100644 --- a/packages/vue-compat/__tests__/global.spec.ts +++ b/packages/vue-compat/__tests__/global.spec.ts @@ -448,3 +448,25 @@ test('global asset registration should affect apps created via createApp', () => expect(vm.$el.textContent).toBe('foo') delete singletonApp._context.components.foo }) + +test('post-facto global asset registration should affect apps created via createApp', () => { + const app = createApp({ + template: '' + }) + Vue.component('foo', { template: 'foo' }) + const vm = app.mount(document.createElement('div')) as any; + expect(vm.$el.textContent).toBe('foo') + delete singletonApp._context.components.foo +}) + +test('local asset registration should not affect other local apps', () => { + const app1 = createApp({}); + const app2 = createApp({}); + + app1.component('foo', {}); + app2.component('foo', {}); + + expect( + `Component "foo" has already been registered in target app` + ).not.toHaveBeenWarned() +}) \ No newline at end of file From 108474e2bb9bc3732b4c55e1e8678ce2475cdb64 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 23 May 2022 09:12:13 +0800 Subject: [PATCH 0147/1523] workflow: fix dev script for compat build --- scripts/dev.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/dev.js b/scripts/dev.js index a197ea21d8c..81efc5c6903 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -26,7 +26,9 @@ const postfix = format.endsWith('-runtime') const outfile = resolve( __dirname, - `../packages/${target}/dist/${target}.${postfix}.js` + `../packages/${target}/dist/${ + target === 'vue-compat' ? `vue` : target + }.${postfix}.js` ) const relativeOutfile = relative(process.cwd(), outfile) @@ -92,7 +94,7 @@ build({ __ESM_BROWSER__: String(format.includes('esm-browser')), __NODE_JS__: String(format === 'cjs'), __SSR__: String(format === 'cjs' || format.includes('esm-bundler')), - __COMPAT__: `false`, + __COMPAT__: String(target === 'vue-compat'), __FEATURE_SUSPENSE__: `true`, __FEATURE_OPTIONS_API__: `true`, __FEATURE_PROD_DEVTOOLS__: `false` From 2f07e3460bf51bc1b083f3d03b3d192e042d2d75 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 23 May 2022 09:46:00 +0800 Subject: [PATCH 0148/1523] fix(compat): fix globalProperties pollution in v3 mode fix #5699 --- packages/runtime-core/src/compat/global.ts | 2 +- packages/vue-compat/__tests__/global.spec.ts | 46 +++++++++++++++++--- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 1cde73bd48a..823181d23a7 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -399,7 +399,7 @@ function applySingletonAppMutations(app: App) { } const val = singletonApp.config[key as keyof AppConfig] // @ts-ignore - app.config[key] = val + app.config[key] = isObject(val) ? Object.create(val) : val // compat for runtime ignoredElements -> isCustomElement if ( diff --git a/packages/vue-compat/__tests__/global.spec.ts b/packages/vue-compat/__tests__/global.spec.ts index 0bc18a5d588..eda08d3026e 100644 --- a/packages/vue-compat/__tests__/global.spec.ts +++ b/packages/vue-compat/__tests__/global.spec.ts @@ -1,6 +1,6 @@ import Vue from '@vue/compat' import { effect, isReactive } from '@vue/reactivity' -import { nextTick } from '@vue/runtime-core' +import { h, nextTick } from '@vue/runtime-core' import { DeprecationTypes, deprecationData, @@ -454,19 +454,51 @@ test('post-facto global asset registration should affect apps created via create template: '' }) Vue.component('foo', { template: 'foo' }) - const vm = app.mount(document.createElement('div')) as any; + const vm = app.mount(document.createElement('div')) as any expect(vm.$el.textContent).toBe('foo') delete singletonApp._context.components.foo }) test('local asset registration should not affect other local apps', () => { - const app1 = createApp({}); - const app2 = createApp({}); + const app1 = createApp({}) + const app2 = createApp({}) - app1.component('foo', {}); - app2.component('foo', {}); + app1.component('foo', {}) + app2.component('foo', {}) expect( `Component "foo" has already been registered in target app` ).not.toHaveBeenWarned() -}) \ No newline at end of file +}) + +test('local app-level mixin registration should not affect other local apps', () => { + const app1 = createApp({ render: () => h('div') }) + const app2 = createApp({}) + + const mixin = { created: jest.fn() } + app1.mixin(mixin) + app2.mixin(mixin) + + expect(`Mixin has already been applied`).not.toHaveBeenWarned() + + app1.mount(document.createElement('div')) + expect(mixin.created).toHaveBeenCalledTimes(1) +}) + +// #5699 +test('local app config should not affect other local apps in v3 mode', () => { + Vue.configureCompat({ MODE: 3 }) + const app1 = createApp({ + render: () => h('div'), + provide() { + return { + test: 123 + } + } + }) + app1.config.globalProperties.test = () => {} + app1.mount(document.createElement('div')) + + const app2 = createApp({}) + expect(app2.config.globalProperties.test).toBe(undefined) +}) From 160d5df34ae35c282fa48226842631584402d9fe Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 23 May 2022 10:04:12 +0800 Subject: [PATCH 0149/1523] release: v3.2.36 --- CHANGELOG.md | 18 ++++++++ package.json | 2 +- packages/compiler-core/package.json | 4 +- packages/compiler-dom/package.json | 6 +-- packages/compiler-sfc/package.json | 12 ++--- packages/compiler-ssr/package.json | 6 +-- packages/reactivity-transform/package.json | 6 +-- packages/reactivity/package.json | 4 +- packages/runtime-core/package.json | 6 +-- packages/runtime-dom/package.json | 6 +-- packages/runtime-test/package.json | 6 +-- packages/server-renderer/package.json | 8 ++-- packages/sfc-playground/package.json | 4 +- packages/shared/package.json | 2 +- packages/size-check/package.json | 2 +- packages/template-explorer/package.json | 2 +- packages/vue-compat/package.json | 4 +- packages/vue/package.json | 12 ++--- pnpm-lock.yaml | 54 +++++++++++----------- 19 files changed, 91 insertions(+), 73 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e83d08b0443..d28a577059a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +## [3.2.36](https://github.com/vuejs/core/compare/v3.2.35...v3.2.36) (2022-05-23) + + +### Bug Fixes + +* **compat:** fix app-level asset registration affecting other local apps ([#5979](https://github.com/vuejs/core/issues/5979)) ([7fb5732](https://github.com/vuejs/core/commit/7fb57327b9d0e4d9eb675149f167d915fb0d59fa)) +* **compat:** fix globalProperties pollution in v3 mode ([2f07e34](https://github.com/vuejs/core/commit/2f07e3460bf51bc1b083f3d03b3d192e042d2d75)), closes [#5699](https://github.com/vuejs/core/issues/5699) +* **compiler-core:** fix svg with directives being incorrectly hoisted ([#5919](https://github.com/vuejs/core/issues/5919)) ([7fbc933](https://github.com/vuejs/core/commit/7fbc933f4d80c0259ee24872ba790681cf3cbe76)), closes [#5289](https://github.com/vuejs/core/issues/5289) +* **sfc/types:** allow use default factory for primitive types in `withDefaults` ([#5939](https://github.com/vuejs/core/issues/5939)) ([b546282](https://github.com/vuejs/core/commit/b5462822d6c0a43866deef2b3437bbe3bbfb3625)), closes [#5938](https://github.com/vuejs/core/issues/5938) +* **transition:** fix cancel leave regression ([#5974](https://github.com/vuejs/core/issues/5974)) ([dddbd96](https://github.com/vuejs/core/commit/dddbd96dfe69292cee401f72d2703e8fb3708a14)), closes [#5973](https://github.com/vuejs/core/issues/5973) + + +### Performance Improvements + +* improve the performance of getNow ([#5944](https://github.com/vuejs/core/issues/5944)) ([3bdc41d](https://github.com/vuejs/core/commit/3bdc41dff305422cb5334a64353c314bce1202a4)) + + + ## [3.2.35](https://github.com/vuejs/core/compare/v3.2.34...v3.2.35) (2022-05-20) diff --git a/package.json b/package.json index 9e99734d90b..00887995a7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.2.35", + "version": "3.2.36", "packageManager": "pnpm@7.1.0", "scripts": { "dev": "node scripts/dev.js", diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 56cafa9eecb..6315a32721b 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme", "dependencies": { - "@vue/shared": "3.2.35", + "@vue/shared": "3.2.36", "@babel/parser": "^7.16.4", "estree-walker": "^2.0.2", "source-map": "^0.6.1" diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index 3b0787c2b8c..2a0a3880a18 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/compiler-core": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/compiler-core": "3.2.36" } } diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index eb17295f2a2..6fda58f4fd8 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", @@ -33,11 +33,11 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-sfc#readme", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/compiler-dom": "3.2.35", - "@vue/compiler-ssr": "3.2.35", - "@vue/reactivity-transform": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/compiler-dom": "3.2.36", + "@vue/compiler-ssr": "3.2.36", + "@vue/reactivity-transform": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "source-map": "^0.6.1", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index e8d27031291..b517363198e 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", @@ -28,7 +28,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/compiler-dom": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/compiler-dom": "3.2.36" } } diff --git a/packages/reactivity-transform/package.json b/packages/reactivity-transform/package.json index 07cf64395ff..0ffa0654197 100644 --- a/packages/reactivity-transform/package.json +++ b/packages/reactivity-transform/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity-transform", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/reactivity-transform", "main": "dist/reactivity-transform.cjs.js", "files": [ @@ -29,8 +29,8 @@ "homepage": "https://github.com/vuejs/core/tree/dev/packages/reactivity-transform#readme", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index 94cebd18df0..c976fade149 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", @@ -36,6 +36,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/reactivity#readme", "dependencies": { - "@vue/shared": "3.2.35" + "@vue/shared": "3.2.36" } } diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index e173b9c5c51..dc597ebd835 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-core#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/reactivity": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/reactivity": "3.2.36" } } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index d9c1065c629..15d6eed948c 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", @@ -35,8 +35,8 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-dom#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/runtime-core": "3.2.35", + "@vue/shared": "3.2.36", + "@vue/runtime-core": "3.2.36", "csstype": "^2.6.8" } } diff --git a/packages/runtime-test/package.json b/packages/runtime-test/package.json index 7456427b66b..e8b7c34c475 100644 --- a/packages/runtime-test/package.json +++ b/packages/runtime-test/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-test", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/runtime-test", "private": true, "main": "index.js", @@ -25,7 +25,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/runtime-test#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/runtime-core": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/runtime-core": "3.2.36" } } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index bbc0f7f4dcb..8b6ceb4b3e3 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.2.35", + "version": "3.2.36", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", @@ -31,10 +31,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme", "peerDependencies": { - "vue": "3.2.35" + "vue": "3.2.36" }, "dependencies": { - "@vue/shared": "3.2.35", - "@vue/compiler-ssr": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/compiler-ssr": "3.2.36" } } diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index ef162aeec86..afe5a79aa13 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -1,6 +1,6 @@ { "name": "@vue/sfc-playground", - "version": "3.2.35", + "version": "3.2.36", "private": true, "scripts": { "dev": "vite", @@ -12,7 +12,7 @@ "vite": "^2.9.8" }, "dependencies": { - "vue": "3.2.35", + "vue": "3.2.36", "@vue/repl": "^1.1.2", "file-saver": "^2.0.5", "jszip": "^3.6.0" diff --git a/packages/shared/package.json b/packages/shared/package.json index 3dc432764bf..d36e34d05e5 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.2.35", + "version": "3.2.36", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/size-check/package.json b/packages/size-check/package.json index f573b45c5e4..5e1f6f36930 100644 --- a/packages/size-check/package.json +++ b/packages/size-check/package.json @@ -1,6 +1,6 @@ { "name": "@vue/size-check", - "version": "3.2.35", + "version": "3.2.36", "private": true, "scripts": { "build": "vite build" diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index ee5283f236c..b4b3ab75c69 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/template-explorer", - "version": "3.2.35", + "version": "3.2.36", "private": true, "buildOptions": { "formats": [ diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index 9c36a4637e4..59eafbe031d 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.2.35", + "version": "3.2.36", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -38,6 +38,6 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue-compat#readme", "peerDependencies": { - "vue": "3.2.35" + "vue": "3.2.36" } } diff --git a/packages/vue/package.json b/packages/vue/package.json index 2d4a16f2b20..b7cad088021 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.2.35", + "version": "3.2.36", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -66,10 +66,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/vue#readme", "dependencies": { - "@vue/shared": "3.2.35", - "@vue/compiler-dom": "3.2.35", - "@vue/runtime-dom": "3.2.35", - "@vue/compiler-sfc": "3.2.35", - "@vue/server-renderer": "3.2.35" + "@vue/shared": "3.2.36", + "@vue/compiler-dom": "3.2.36", + "@vue/runtime-dom": "3.2.36", + "@vue/compiler-sfc": "3.2.36", + "@vue/server-renderer": "3.2.36" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e2f81f1f25..ee6700a1a89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: specifiers: '@babel/parser': ^7.16.4 '@babel/types': ^7.16.0 - '@vue/shared': 3.2.35 + '@vue/shared': 3.2.36 estree-walker: ^2.0.2 source-map: ^0.6.1 dependencies: @@ -119,8 +119,8 @@ importers: packages/compiler-dom: specifiers: - '@vue/compiler-core': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/compiler-core': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/compiler-core': link:../compiler-core '@vue/shared': link:../shared @@ -131,12 +131,12 @@ importers: '@babel/types': ^7.16.0 '@types/estree': ^0.0.48 '@types/lru-cache': ^5.1.0 - '@vue/compiler-core': 3.2.35 - '@vue/compiler-dom': 3.2.35 - '@vue/compiler-ssr': 3.2.35 + '@vue/compiler-core': 3.2.36 + '@vue/compiler-dom': 3.2.36 + '@vue/compiler-ssr': 3.2.36 '@vue/consolidate': ^0.17.3 - '@vue/reactivity-transform': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/reactivity-transform': 3.2.36 + '@vue/shared': 3.2.36 estree-walker: ^2.0.2 hash-sum: ^2.0.0 lru-cache: ^5.1.1 @@ -174,15 +174,15 @@ importers: packages/compiler-ssr: specifiers: - '@vue/compiler-dom': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/compiler-dom': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/shared': link:../shared packages/reactivity: specifiers: - '@vue/shared': 3.2.35 + '@vue/shared': 3.2.36 dependencies: '@vue/shared': link:../shared @@ -191,8 +191,8 @@ importers: '@babel/core': ^7.16.0 '@babel/parser': ^7.16.4 '@babel/types': ^7.16.0 - '@vue/compiler-core': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/compiler-core': 3.2.36 + '@vue/shared': 3.2.36 estree-walker: ^2.0.2 magic-string: ^0.25.7 dependencies: @@ -207,16 +207,16 @@ importers: packages/runtime-core: specifiers: - '@vue/reactivity': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/reactivity': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/reactivity': link:../reactivity '@vue/shared': link:../shared packages/runtime-dom: specifiers: - '@vue/runtime-core': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/runtime-core': 3.2.36 + '@vue/shared': 3.2.36 csstype: ^2.6.8 dependencies: '@vue/runtime-core': link:../runtime-core @@ -225,16 +225,16 @@ importers: packages/runtime-test: specifiers: - '@vue/runtime-core': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/runtime-core': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/runtime-core': link:../runtime-core '@vue/shared': link:../shared packages/server-renderer: specifiers: - '@vue/compiler-ssr': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/compiler-ssr': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/compiler-ssr': link:../compiler-ssr '@vue/shared': link:../shared @@ -246,7 +246,7 @@ importers: file-saver: ^2.0.5 jszip: ^3.6.0 vite: ^2.9.8 - vue: 3.2.35 + vue: 3.2.36 dependencies: '@vue/repl': 1.1.2_vue@packages+vue file-saver: 2.0.5 @@ -272,11 +272,11 @@ importers: packages/vue: specifiers: - '@vue/compiler-dom': 3.2.35 - '@vue/compiler-sfc': 3.2.35 - '@vue/runtime-dom': 3.2.35 - '@vue/server-renderer': 3.2.35 - '@vue/shared': 3.2.35 + '@vue/compiler-dom': 3.2.36 + '@vue/compiler-sfc': 3.2.36 + '@vue/runtime-dom': 3.2.36 + '@vue/server-renderer': 3.2.36 + '@vue/shared': 3.2.36 dependencies: '@vue/compiler-dom': link:../compiler-dom '@vue/compiler-sfc': link:../compiler-sfc From d4d3319c1be16dc9a046b2c5521096debc205f25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20L=C3=BCnborg?= Date: Tue, 24 May 2022 14:30:40 +0200 Subject: [PATCH 0150/1523] fix(ssr): ensure app can be unmounted when created with createSSRApp() (#5992) fix #5990 --- .../runtime-core/__tests__/hydration.spec.ts | 31 ++++++++++++++++++- packages/runtime-core/src/hydration.ts | 4 ++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 34e76100ee4..c3976a8f076 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -922,7 +922,9 @@ describe('SSR hydration', () => { ]) } } - const { container, vnode } = mountWithHydration('', () => h(Comp)) + const { container, vnode } = mountWithHydration('', () => + h(Comp) + ) expect(container.childNodes.length).toBe(3) const text = container.childNodes[1] expect(text.nodeType).toBe(3) @@ -931,6 +933,33 @@ describe('SSR hydration', () => { expect((vnode as any).component?.subTree.children[0].el).toBe(text) }) + test('app.unmount()', async () => { + const container = document.createElement('DIV') + container.innerHTML = '' + const App = defineComponent({ + setup(_, { expose }) { + const count = ref(0) + + expose({ count }) + + return () => + h('button', { + onClick: () => count.value++ + }) + } + }) + + const app = createSSRApp(App) + const vm = app.mount(container) + await nextTick() + expect((container as any)._vnode).toBeDefined() + // @ts-expect-error - expose()'d properties are not available on vm type + expect(vm.count).toBe(0) + + app.unmount() + expect((container as any)._vnode).toBe(null) + }) + describe('mismatch handling', () => { test('text node', () => { const { container } = mountWithHydration(`foo`, () => 'bar') diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index 61644184dee..3637a09b2aa 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -27,7 +27,7 @@ import { isAsyncWrapper } from './apiAsyncComponent' export type RootHydrateFunction = ( vnode: VNode, - container: Element | ShadowRoot + container: (Element | ShadowRoot) & { _vnode?: VNode } ) => void const enum DOMNodeTypes { @@ -75,11 +75,13 @@ export function createHydrationFunctions( ) patch(null, vnode, container) flushPostFlushCbs() + container._vnode = vnode return } hasMismatch = false hydrateNode(container.firstChild!, vnode, null, null, null) flushPostFlushCbs() + container._vnode = vnode if (hasMismatch && !__TEST__) { // this error should show up in production console.error(`Hydration completed but contains mismatches.`) From 109751abdd37ba66622cace0e9d889d21c6795ea Mon Sep 17 00:00:00 2001 From: Phan An Date: Wed, 25 May 2022 00:33:57 +0200 Subject: [PATCH 0151/1523] chore(sfc-playground): style improvements (#6000) --- packages/sfc-playground/src/Header.vue | 81 +++++++++++-------- .../sfc-playground/src/icons/Download.vue | 4 +- packages/sfc-playground/src/icons/GitHub.vue | 5 +- packages/sfc-playground/src/icons/Moon.vue | 2 +- packages/sfc-playground/src/icons/Share.vue | 2 +- packages/sfc-playground/src/icons/Sun.vue | 18 ++--- 6 files changed, 63 insertions(+), 49 deletions(-) diff --git a/packages/sfc-playground/src/Header.vue b/packages/sfc-playground/src/Header.vue index 8cf4966c56d..03a683f2a75 100644 --- a/packages/sfc-playground/src/Header.vue +++ b/packages/sfc-playground/src/Header.vue @@ -94,7 +94,8 @@ async function fetchVersions(): Promise {