From d3795dde205a75de9e3d0c8b7d595371b44f88b6 Mon Sep 17 00:00:00 2001 From: pawelblaszczyk5 Date: Fri, 30 Jun 2023 11:21:12 +0200 Subject: [PATCH 1/4] chore: add failing test --- .../valid/has-slot-types-with-alias01-input.svelte | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/fixtures/rules/experimental-require-slot-types/valid/has-slot-types-with-alias01-input.svelte diff --git a/tests/fixtures/rules/experimental-require-slot-types/valid/has-slot-types-with-alias01-input.svelte b/tests/fixtures/rules/experimental-require-slot-types/valid/has-slot-types-with-alias01-input.svelte new file mode 100644 index 000000000..66477ad5b --- /dev/null +++ b/tests/fixtures/rules/experimental-require-slot-types/valid/has-slot-types-with-alias01-input.svelte @@ -0,0 +1,7 @@ + + + From dd88ff44bbbf9fc0e57163b5af39788e02f05c9a Mon Sep 17 00:00:00 2001 From: pawelblaszczyk5 Date: Fri, 30 Jun 2023 11:25:26 +0200 Subject: [PATCH 2/4] fix: handle type alias for $$Slots --- src/rules/experimental-require-slot-types.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/rules/experimental-require-slot-types.ts b/src/rules/experimental-require-slot-types.ts index 32f31ae5c..937c96bfd 100644 --- a/src/rules/experimental-require-slot-types.ts +++ b/src/rules/experimental-require-slot-types.ts @@ -1,6 +1,8 @@ import { createRule } from "../utils" import { getLangValue } from "../utils/ast-utils" +const SLOTS_TYPE_NAME = "$$Slots" + export default createRule("experimental-require-slot-types", { meta: { docs: { @@ -18,7 +20,7 @@ export default createRule("experimental-require-slot-types", { create(context) { let isTs = false let hasSlot = false - let hasInterface = false + let hasDeclaredSlots = false return { SvelteScriptElement(node) { const lang = getLangValue(node)?.toLowerCase() @@ -30,12 +32,17 @@ export default createRule("experimental-require-slot-types", { } }, TSInterfaceDeclaration(node) { - if (node.id.name === "$$Slots") { - hasInterface = true + if (node.id.name === SLOTS_TYPE_NAME) { + hasDeclaredSlots = true + } + }, + TSTypeAliasDeclaration(node) { + if (node.id.name === SLOTS_TYPE_NAME) { + hasDeclaredSlots = true } }, "Program:exit"() { - if (isTs && hasSlot && !hasInterface) { + if (isTs && hasSlot && !hasDeclaredSlots) { context.report({ loc: { line: 1, From b8437ccd4d22feaa1c52fce8ebfb589c150aedab Mon Sep 17 00:00:00 2001 From: pawelblaszczyk5 Date: Fri, 30 Jun 2023 11:25:34 +0200 Subject: [PATCH 3/4] chore: add failing test --- .../valid/has-events-type-alias01-input.svelte | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 tests/fixtures/rules/experimental-require-strict-events/valid/has-events-type-alias01-input.svelte diff --git a/tests/fixtures/rules/experimental-require-strict-events/valid/has-events-type-alias01-input.svelte b/tests/fixtures/rules/experimental-require-strict-events/valid/has-events-type-alias01-input.svelte new file mode 100644 index 000000000..791f6ca7f --- /dev/null +++ b/tests/fixtures/rules/experimental-require-strict-events/valid/has-events-type-alias01-input.svelte @@ -0,0 +1,3 @@ + From 81c5363a89c5d9b48a6105f17be58d681d98ee26 Mon Sep 17 00:00:00 2001 From: pawelblaszczyk5 Date: Fri, 30 Jun 2023 11:25:39 +0200 Subject: [PATCH 4/4] fix: handle type alias for $$Events --- .changeset/light-boats-press.md | 5 +++++ src/rules/experimental-require-strict-events.ts | 15 +++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 .changeset/light-boats-press.md diff --git a/.changeset/light-boats-press.md b/.changeset/light-boats-press.md new file mode 100644 index 000000000..293bd6e36 --- /dev/null +++ b/.changeset/light-boats-press.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-svelte": patch +--- + +fix: handle type aliases for $$Events and $$Slots declarations diff --git a/src/rules/experimental-require-strict-events.ts b/src/rules/experimental-require-strict-events.ts index 192e1d1c5..0ebe50907 100644 --- a/src/rules/experimental-require-strict-events.ts +++ b/src/rules/experimental-require-strict-events.ts @@ -3,6 +3,8 @@ import type { AST } from "svelte-eslint-parser" import { createRule } from "../utils" import { findAttribute, getLangValue } from "../utils/ast-utils" +const EVENTS_TYPE_NAME = "$$Events" + export default createRule("experimental-require-strict-events", { meta: { docs: { @@ -19,7 +21,7 @@ export default createRule("experimental-require-strict-events", { create(context) { let isTs = false let hasAttribute = false - let hasInterface = false + let hasDeclaredEvents = false let scriptNode: AST.SvelteScriptElement return { SvelteScriptElement(node) { @@ -29,12 +31,17 @@ export default createRule("experimental-require-strict-events", { scriptNode = node }, TSInterfaceDeclaration(node) { - if (node.id.name === "$$Events") { - hasInterface = true + if (node.id.name === EVENTS_TYPE_NAME) { + hasDeclaredEvents = true + } + }, + TSTypeAliasDeclaration(node) { + if (node.id.name === EVENTS_TYPE_NAME) { + hasDeclaredEvents = true } }, "Program:exit"() { - if (isTs && !hasAttribute && !hasInterface) { + if (isTs && !hasAttribute && !hasDeclaredEvents) { context.report({ node: scriptNode, messageId: "missingStrictEvents",