From e695d3dcf48ea5ea4d38c7cf25e3d436ec967871 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 3 Sep 2024 10:34:52 +0200 Subject: [PATCH] declare keyword --- .../phases/1-parse/remove_typescript_nodes.js | 19 +++++++++++++++++-- .../samples/typescript/main.svelte | 13 ++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js b/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js index a614590230..872b71a4df 100644 --- a/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js +++ b/packages/svelte/src/compiler/phases/1-parse/remove_typescript_nodes.js @@ -105,12 +105,27 @@ const visitors = { }, FunctionExpression: remove_this_param, FunctionDeclaration: remove_this_param, + TSDeclareFunction() { + return b.empty; + }, + ClassDeclaration(node, context) { + if (node.declare) { + return b.empty; + } + return context.next(); + }, + VariableDeclaration(node, context) { + if (node.declare) { + return b.empty; + } + return context.next(); + }, TSModuleDeclaration(node, context) { if (!node.body) return b.empty; // namespaces can contain non-type nodes - const cleaned = context.visit(node.body.body); - if (cleaned.length !== 0) { + const cleaned = /** @type {any[]} */ (node.body.body).map((entry) => context.visit(entry)); + if (cleaned.some((entry) => entry !== b.empty)) { e.typescript_invalid_feature(node, 'namespaces with non-type nodes'); } diff --git a/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte b/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte index 549e0f91e5..d1c4f361ba 100644 --- a/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/typescript/main.svelte @@ -9,7 +9,18 @@ } class Foo { - constructor(public readonly name: string) {} + constructor(readonly name: string) {} + } + + declare const declared_const: number; + declare function declared_fn(): void; + declare class declared_class { + foo: number; + } + + declare module 'foobar' {} + namespace SomeNamespace { + export type Foo = true } export type { Hello };