From 359b3ecf8c89fec657e44909b1513ce65383e06c Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sat, 25 Sep 2021 23:51:32 +0200 Subject: [PATCH 01/16] [feat] add convenience SvelteComponentConstructor type Eases typing "this is a variable that expects a Svelte component constructor (of a certain shape)". Removes the need for SvelteComponentTyped to be an extra type so it can be deprecated in v4 and removed in v5, and SvelteComponent(Dev) can receive the same generic typings as SvelteComponetTyped in v4. --- CHANGELOG.md | 4 ++++ src/runtime/index.ts | 3 ++- src/runtime/internal/dev.ts | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54a678accb8..278de466505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Svelte changelog +## Unreleased + +* Add `SvelteComponentConstructor` convenience type ([#6770](https://github.com/sveltejs/svelte/pull/6770)) + ## 3.43.0 * Use export map to expose no-op versions of lifecycle functions for SSR ([#6743](https://github.com/sveltejs/svelte/pull/6743)) diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 8e12f9f0eeb..31d77d15ac9 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -12,5 +12,6 @@ export { tick, createEventDispatcher, SvelteComponentDev as SvelteComponent, - SvelteComponentTyped + SvelteComponentTyped, + SvelteComponentConstructor } from 'svelte/internal'; diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 76d68086c84..3590a9a7cd2 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -247,6 +247,22 @@ export class SvelteComponentTyped< } } +/** + * Convenience-type to represent a Svelte component constructor. + * + * Example: + * ```ts + import ASvelteComponent from './ASvelteComponent.svelte'; + const ComponentClass: SvelteComponentConstructor = ASvelteComponent; + new ComponentClass(..); + ``` + */ +export type SvelteComponentConstructor< + Props extends Record = any, + Events extends Record = any, + Slots extends Record = any +> = new (options: IComponentOptions) => SvelteComponentTyped; + export function loop_guard(timeout) { const start = Date.now(); return () => { From 5fb01cce3cc321737577af215599643a6a2521e9 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sun, 26 Sep 2021 00:07:19 +0200 Subject: [PATCH 02/16] separate type export --- src/runtime/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 31d77d15ac9..ca611685be3 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -12,6 +12,6 @@ export { tick, createEventDispatcher, SvelteComponentDev as SvelteComponent, - SvelteComponentTyped, - SvelteComponentConstructor + SvelteComponentTyped } from 'svelte/internal'; +export type { SvelteComponentConstructor } from 'svelte/internal'; From 3bd31074348704977a35d433bf4867fa3305e45b Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sun, 26 Sep 2021 16:41:00 +0200 Subject: [PATCH 03/16] bump ts to 4.0, ensure no new type syntax --- package-lock.json | 15 ++++++++------- package.json | 4 ++-- post-typegen.js | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 post-typegen.js diff --git a/package-lock.json b/package-lock.json index 4bc3337e32a..12dd6587ebd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "svelte", "version": "3.43.0", "license": "MIT", "devDependencies": { @@ -45,7 +46,7 @@ "sourcemap-codec": "^1.4.8", "tiny-glob": "^0.2.6", "tslib": "^2.0.3", - "typescript": "^3.7.5" + "typescript": "~4.0.0" }, "engines": { "node": ">= 8" @@ -5543,9 +5544,9 @@ "dev": true }, "node_modules/typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", + "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10298,9 +10299,9 @@ "dev": true }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", + "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index e6991fd5c0b..66decce07a7 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "pretest": "npm run build", "posttest": "agadoo internal/index.mjs", "prepublishOnly": "node check_publish_env.js && npm run lint && npm test", - "tsd": "tsc -p src/compiler --emitDeclarationOnly && tsc -p src/runtime --emitDeclarationOnly", + "tsd": "tsc -p src/compiler --emitDeclarationOnly && tsc -p src/runtime --emitDeclarationOnly && node ./post-typegen.js", "lint": "eslint \"{src,test}/**/*.{ts,js}\"" }, "repository": { @@ -140,7 +140,7 @@ "sourcemap-codec": "^1.4.8", "tiny-glob": "^0.2.6", "tslib": "^2.0.3", - "typescript": "^3.7.5" + "typescript": "~4.0.0" }, "nyc": { "include": [ diff --git a/post-typegen.js b/post-typegen.js new file mode 100644 index 00000000000..08d932d0904 --- /dev/null +++ b/post-typegen.js @@ -0,0 +1,14 @@ +// Svelte 3 types are generated using TS 3.7 . Using newer type syntax is therefore technically a breaking change. +// `export type` / `import type` was introduced later, and needed now in one of the files. +// Replace `export type` with `export` in the `d.ts` file as it doesn't make a difference in `d.ts` files. +// This keeps backwards-compatibility + +const fs = require('fs'); + +const path = 'types/runtime/index.d.ts'; +const content = fs.readFileSync(path, 'utf8'); +const replaced = content.replace('export type', 'export'); +if (content === replaced) { + throw new Error('types/runtime/index.d.ts changed. Update post-typegen.js') +} +fs.writeFileSync(path, replaced); From a8e616be7803f1aeec0a9a0a7cd4655edb1b69c3 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 28 Jun 2022 12:20:08 +0200 Subject: [PATCH 04/16] Adjust way of adding types to output, add more convenience types Closes #7584 --- package-lock.json | 14 +++++------ package.json | 2 +- post-typegen.js | 14 ----------- src/runtime/index.ts | 4 +-- src/runtime/internal/dev.ts | 49 ++++++++++++++++++++++++++----------- tsd.js | 13 ++++++++++ 6 files changed, 58 insertions(+), 38 deletions(-) delete mode 100644 post-typegen.js create mode 100644 tsd.js diff --git a/package-lock.json b/package-lock.json index fedd7ad74a0..83d963b827e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "sourcemap-codec": "^1.4.8", "tiny-glob": "^0.2.6", "tslib": "^2.0.3", - "typescript": "~4.0.0" + "typescript": "^3.7.5" }, "engines": { "node": ">= 8" @@ -4402,9 +4402,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", - "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8096,9 +8096,9 @@ "dev": true }, "typescript": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", - "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index 0e377450632..000f4cd2e7a 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "pretest": "npm run build", "posttest": "agadoo internal/index.mjs", "prepublishOnly": "node check_publish_env.js && npm run lint && npm test", - "tsd": "tsc -p src/compiler --emitDeclarationOnly && tsc -p src/runtime --emitDeclarationOnly && node ./post-typegen.js", + "tsd": "node ./tsd.js", "lint": "eslint \"{src,test}/**/*.{ts,js}\"" }, "repository": { diff --git a/post-typegen.js b/post-typegen.js deleted file mode 100644 index 08d932d0904..00000000000 --- a/post-typegen.js +++ /dev/null @@ -1,14 +0,0 @@ -// Svelte 3 types are generated using TS 3.7 . Using newer type syntax is therefore technically a breaking change. -// `export type` / `import type` was introduced later, and needed now in one of the files. -// Replace `export type` with `export` in the `d.ts` file as it doesn't make a difference in `d.ts` files. -// This keeps backwards-compatibility - -const fs = require('fs'); - -const path = 'types/runtime/index.d.ts'; -const content = fs.readFileSync(path, 'utf8'); -const replaced = content.replace('export type', 'export'); -if (content === replaced) { - throw new Error('types/runtime/index.d.ts changed. Update post-typegen.js') -} -fs.writeFileSync(path, replaced); diff --git a/src/runtime/index.ts b/src/runtime/index.ts index ca611685be3..39bf7a9496d 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -12,6 +12,6 @@ export { tick, createEventDispatcher, SvelteComponentDev as SvelteComponent, - SvelteComponentTyped + SvelteComponentTyped, + // additional exports added through post-typegen.js } from 'svelte/internal'; -export type { SvelteComponentConstructor } from 'svelte/internal'; diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 0dba0ec1fa8..d6987990c60 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -128,7 +128,7 @@ export interface SvelteComponentDev { $destroy(): void; [accessor: string]: any; } -interface IComponentOptions = Record> { +export interface ComponentConstructorParams = Record> { target: Element | ShadowRoot; anchor?: Element; props?: Props; @@ -164,7 +164,7 @@ export class SvelteComponentDev extends SvelteComponent { */ $$slot_def: any; - constructor(options: IComponentOptions) { + constructor(options: ComponentConstructorParams) { if (!options || (!options.target && !options.$$inline)) { throw new Error("'target' is a required option"); } @@ -256,26 +256,47 @@ export class SvelteComponentTyped< */ $$slot_def: Slots; - constructor(options: IComponentOptions) { + constructor(options: ComponentConstructorParams) { super(options); } } /** - * Convenience-type to represent a Svelte component constructor. + * Convenience type to get the type of a Svelte component. Useful for example in combination with + * dynamic components and ``. * * Example: - * ```ts - import ASvelteComponent from './ASvelteComponent.svelte'; - const ComponentClass: SvelteComponentConstructor = ASvelteComponent; - new ComponentClass(..); - ``` + * ```html + * + * + * + * + * ``` */ -export type SvelteComponentConstructor< - Props extends Record = any, - Events extends Record = any, - Slots extends Record = any -> = new (options: IComponentOptions) => SvelteComponentTyped; +export type ComponentType> = + new (p: ComponentConstructorParams ? X : any>) => T; + +/** + * Convenience type to get the properties the given component expects. Example: + * ```html + * + * ``` + */ +export type ComponentProps = T extends SvelteComponentTyped + ? Props + : unknown; export function loop_guard(timeout) { const start = Date.now(); diff --git a/tsd.js b/tsd.js new file mode 100644 index 00000000000..ad3e74f95c2 --- /dev/null +++ b/tsd.js @@ -0,0 +1,13 @@ +// This script generates the TypeScript definitions + +const { execSync } = require('child_process'); +const { readFileSync, writeFileSync } = require('fs'); + +execSync('tsc -p src/compiler --emitDeclarationOnly && tsc -p src/runtime --emitDeclarationOnly'); + +// We need to add these types to the index.d.ts here because if we add them before building, the build will fail, +// because the TS->JS transformation doesn't know these exports are types and produces code that fails at runtime. +// We can't use `export type` syntax either because the TS version we're on doesn't have this feature yet. +const path = 'types/runtime/index.d.ts'; +const content = readFileSync(path, 'utf8'); +writeFileSync(path, content.replace('SvelteComponentTyped', 'SvelteComponentTyped, ComponentType, ComponentConstructorParams, ComponentProps')); From 59026682549f6264bf316294020132086db68e35 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 28 Jun 2022 12:26:13 +0200 Subject: [PATCH 05/16] lint --- src/runtime/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 39bf7a9496d..08b25ba2ca4 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -12,6 +12,6 @@ export { tick, createEventDispatcher, SvelteComponentDev as SvelteComponent, - SvelteComponentTyped, + SvelteComponentTyped // additional exports added through post-typegen.js } from 'svelte/internal'; From 6940665ffd03e6513fcf550cf5cbe1ec117d3d8a Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 28 Jun 2022 22:47:46 +0200 Subject: [PATCH 06/16] Update src/runtime/internal/dev.ts Co-authored-by: Hofer Ivan --- src/runtime/internal/dev.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index d6987990c60..c3d76a80f2f 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -287,7 +287,7 @@ export type ComponentType - * import { ComponentProps } from 'svelte'; + * import type { ComponentProps } from 'svelte'; * import Component from './Component.svelte'; * * const props: ComponentProps = { foo: 'bar' }; // Errors if these aren't the correct props From 59638bb2e385bb9fa0ffcdb8157d79c7a40e57b2 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 28 Jun 2022 22:47:53 +0200 Subject: [PATCH 07/16] Update src/runtime/internal/dev.ts Co-authored-by: Hofer Ivan --- src/runtime/internal/dev.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index c3d76a80f2f..cd7c12831d6 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -273,7 +273,7 @@ export class SvelteComponentTyped< * import Component2 from './Component2.svelte'; * * const component: ComponentType = someLogic() ? Component1 : Component2; - * const componentOfCertainSubType: ComponentType> = someLogic() ? Component1 : Component2; + * const componentOfCertainSubType: ComponentType> = someLogic() ? Component1 : Component2; * * * From df48d977ff86e86cf24dbee634dc515ca123cfbe Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 28 Jun 2022 22:48:07 +0200 Subject: [PATCH 08/16] Update src/runtime/internal/dev.ts Co-authored-by: Hofer Ivan --- src/runtime/internal/dev.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index cd7c12831d6..c2ba22c1fa6 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -268,7 +268,7 @@ export class SvelteComponentTyped< * Example: * ```html * * - * - * + * + * * ``` */ export type ComponentType> = From 13cc53cdc358b10a2cf8d13b62c47c9a4e7395d3 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Jun 2022 10:31:46 +0200 Subject: [PATCH 13/16] rename interfcace, rename file, better generic names, never instead of unknown --- tsd.js => generate-type-definitions.js | 2 +- package.json | 2 +- src/runtime/internal/dev.ts | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) rename tsd.js => generate-type-definitions.js (90%) diff --git a/tsd.js b/generate-type-definitions.js similarity index 90% rename from tsd.js rename to generate-type-definitions.js index ad3e74f95c2..6cad31807f0 100644 --- a/tsd.js +++ b/generate-type-definitions.js @@ -10,4 +10,4 @@ execSync('tsc -p src/compiler --emitDeclarationOnly && tsc -p src/runtime --emit // We can't use `export type` syntax either because the TS version we're on doesn't have this feature yet. const path = 'types/runtime/index.d.ts'; const content = readFileSync(path, 'utf8'); -writeFileSync(path, content.replace('SvelteComponentTyped', 'SvelteComponentTyped, ComponentType, ComponentConstructorParams, ComponentProps')); +writeFileSync(path, content.replace('SvelteComponentTyped', 'SvelteComponentTyped, ComponentType, ComponentConstructorOptions, ComponentProps')); diff --git a/package.json b/package.json index 000f4cd2e7a..a1c9ae9a5d9 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "pretest": "npm run build", "posttest": "agadoo internal/index.mjs", "prepublishOnly": "node check_publish_env.js && npm run lint && npm test", - "tsd": "node ./tsd.js", + "tsd": "node ./generate-type-definitions.js", "lint": "eslint \"{src,test}/**/*.{ts,js}\"" }, "repository": { diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index d6987990c60..afc8f261bf8 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -128,7 +128,7 @@ export interface SvelteComponentDev { $destroy(): void; [accessor: string]: any; } -export interface ComponentConstructorParams = Record> { +export interface ComponentConstructorOptions = Record> { target: Element | ShadowRoot; anchor?: Element; props?: Props; @@ -164,7 +164,7 @@ export class SvelteComponentDev extends SvelteComponent { */ $$slot_def: any; - constructor(options: ComponentConstructorParams) { + constructor(options: ComponentConstructorOptions) { if (!options || (!options.target && !options.$$inline)) { throw new Error("'target' is a required option"); } @@ -256,7 +256,7 @@ export class SvelteComponentTyped< */ $$slot_def: Slots; - constructor(options: ComponentConstructorParams) { + constructor(options: ComponentConstructorOptions) { super(options); } } @@ -280,8 +280,8 @@ export class SvelteComponentTyped< * * ``` */ -export type ComponentType> = - new (p: ComponentConstructorParams ? X : any>) => T; +export type ComponentType> = + new (p: ComponentConstructorOptions ? Props : any>) => Component; /** * Convenience type to get the properties the given component expects. Example: @@ -294,9 +294,9 @@ export type ComponentType * ``` */ -export type ComponentProps = T extends SvelteComponentTyped +export type ComponentProps = Component extends SvelteComponentTyped ? Props - : unknown; + : never; export function loop_guard(timeout) { const start = Date.now(); From 472c5a146795f1d000734da981a6519d3545a79f Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Jun 2022 10:32:55 +0200 Subject: [PATCH 14/16] p->options --- src/runtime/internal/dev.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 472d6bd4319..11bef956ca1 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -281,7 +281,7 @@ export class SvelteComponentTyped< * ``` */ export type ComponentType> = - new (p: ComponentConstructorOptions ? Props : any>) => Component; + new (options: ComponentConstructorOptions ? Props : any>) => Component; /** * Convenience type to get the props the given component expects. Example: From 1f4190c0485c0801779fdde256c8959e602a6b68 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 1 Jul 2022 14:31:13 +0200 Subject: [PATCH 15/16] Update src/runtime/internal/dev.ts Co-authored-by: Ignatius Bagus --- src/runtime/internal/dev.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 11bef956ca1..5b00e7dc5b4 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -280,8 +280,11 @@ export class SvelteComponentTyped< * * ``` */ -export type ComponentType> = - new (options: ComponentConstructorOptions ? Props : any>) => Component; +export type ComponentType = new ( + options: ComponentConstructorOptions< + Component extends SvelteComponentTyped ? Props : Record + > +) => Component; /** * Convenience type to get the props the given component expects. Example: From a4143c662508a14172b5feed52bc0a457543c7c7 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 1 Jul 2022 14:40:40 +0200 Subject: [PATCH 16/16] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c085a2be20..b5bc4858d8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ * Faster SSR ([#5701](https://github.com/sveltejs/svelte/pull/5701)) * Fix `class:` directive updates with `` ([#7521](https://github.com/sveltejs/svelte/issues/7521), [#7571](https://github.com/sveltejs/svelte/issues/7571)) * Harden attribute escaping during ssr ([#7530](https://github.com/sveltejs/svelte/pull/7530)) -* Add `ComponentType` convenience type ([#6770](https://github.com/sveltejs/svelte/pull/6770)) +* Add `ComponentType` and `ComponentProps` convenience types ([#6770](https://github.com/sveltejs/svelte/pull/6770)) ## 3.48.0