From 342657b717a8e1de7792fde6c418bfa5eb5245cd Mon Sep 17 00:00:00 2001 From: edison Date: Mon, 26 Aug 2024 18:08:46 +0800 Subject: [PATCH 001/211] chore: correct the issue number (#11715) [ci skip] --- packages/runtime-core/src/apiDefineComponent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index 0dde68f88..760689eeb 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -297,7 +297,7 @@ export function defineComponent( extraOptions?: ComponentOptions, ) { return isFunction(options) - ? // #8326: extend call and options.name access are considered side-effects + ? // #8236: extend call and options.name access are considered side-effects // by Rollup, so we have to wrap it in a pure-annotated IIFE. /*#__PURE__*/ (() => extend({ name: options.name }, extraOptions, { setup: options }))() From 42e8df62030e7f2c287d9103f045e67b34a63e3b Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 28 Aug 2024 15:00:23 +0800 Subject: [PATCH 002/211] fix(types): GlobalDirective / GlobalComponents should not be records --- packages/runtime-core/src/component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 46608ae2d..fe1b340c5 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -150,7 +150,7 @@ export interface ComponentCustomProps {} * } * ``` */ -export interface GlobalDirectives extends Record {} +export interface GlobalDirectives {} /** * For globally defined Components @@ -167,7 +167,7 @@ export interface GlobalDirectives extends Record {} * } * ``` */ -export interface GlobalComponents extends Record { +export interface GlobalComponents { Teleport: DefineComponent Suspense: DefineComponent KeepAlive: DefineComponent From d875de54e9e03e0768fe550aa4c4886a4baf3bd7 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 28 Aug 2024 17:37:39 +0800 Subject: [PATCH 003/211] fix(runtime-dom): setting innerHTML when patching props should go through trusted types --- packages/runtime-dom/src/modules/props.ts | 13 +++++++------ packages/runtime-dom/src/nodeOps.ts | 5 ++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/runtime-dom/src/modules/props.ts b/packages/runtime-dom/src/modules/props.ts index 7b7b700e0..4dfcee6ae 100644 --- a/packages/runtime-dom/src/modules/props.ts +++ b/packages/runtime-dom/src/modules/props.ts @@ -1,9 +1,6 @@ -// __UNSAFE__ -// Reason: potentially setting innerHTML. -// This can come from explicit usage of v-html or innerHTML as a prop in render - import { DeprecationTypes, compatUtils, warn } from '@vue/runtime-core' import { includeBooleanAttr } from '@vue/shared' +import { unsafeToTrustedHTML } from '../nodeOps' // functions. The user is responsible for using them with only trusted content. export function patchDOMProp( @@ -12,11 +9,15 @@ export function patchDOMProp( value: any, parentComponent: any, ): void { + // __UNSAFE__ + // Reason: potentially setting innerHTML. + // This can come from explicit usage of v-html or innerHTML as a prop in render if (key === 'innerHTML' || key === 'textContent') { // null value case is handled in renderer patchElement before patching // children - if (value == null) return - el[key] = value + if (value != null) { + el[key] = key === 'innerHTML' ? unsafeToTrustedHTML(value) : value + } return } diff --git a/packages/runtime-dom/src/nodeOps.ts b/packages/runtime-dom/src/nodeOps.ts index 8ed70c7d3..d7422bf61 100644 --- a/packages/runtime-dom/src/nodeOps.ts +++ b/packages/runtime-dom/src/nodeOps.ts @@ -31,9 +31,8 @@ if (tt) { // This function merely perform a type-level trusted type conversion // for use in `innerHTML` assignment, etc. // Be careful of whatever value passed to this function. -const unsafeToTrustedHTML: (value: string) => TrustedHTML | string = policy - ? val => policy.createHTML(val) - : val => val +export const unsafeToTrustedHTML: (value: string) => TrustedHTML | string = + policy ? val => policy.createHTML(val) : val => val export const svgNS = 'http://www.w3.org/2000/svg' export const mathmlNS = 'http://www.w3.org/1998/Math/MathML' From d6ccce9049e41932550f25c327c85b5dc761b2fe Mon Sep 17 00:00:00 2001 From: Rudy Date: Wed, 28 Aug 2024 17:48:10 +0800 Subject: [PATCH 004/211] test(types): component type check when props is an empty object (#7419) ref #4051 ref #8825 --- .../dts-test/defineComponent.test-d.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages-private/dts-test/defineComponent.test-d.tsx b/packages-private/dts-test/defineComponent.test-d.tsx index 79ce6d695..0124a8b15 100644 --- a/packages-private/dts-test/defineComponent.test-d.tsx +++ b/packages-private/dts-test/defineComponent.test-d.tsx @@ -480,6 +480,26 @@ describe('type inference w/ options API', () => { }) }) +// #4051 +describe('type inference w/ empty prop object', () => { + const MyComponent = defineComponent({ + props: {}, + setup(props) { + return {} + }, + render() {}, + }) + expectType() + // AllowedComponentProps + expectType() + // ComponentCustomProps + expectType() + // VNodeProps + expectType() + // @ts-expect-error + expectError() +}) + describe('with mixins', () => { const MixinA = defineComponent({ emits: ['bar'], From 334d47ddf3fc0c94fe364cbd5a9e4a5d9334b82d Mon Sep 17 00:00:00 2001 From: Paul Werner <52678724+paulwer@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:49:33 +0200 Subject: [PATCH 005/211] dx(compiler-sfc): improve error message for missing template and script tag in vue file (#11723) --- packages/compiler-sfc/src/parse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index 01a4bec6e..32c26d3ac 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -235,7 +235,7 @@ export function parse( if (!descriptor.template && !descriptor.script && !descriptor.scriptSetup) { errors.push( new SyntaxError( - `At least one