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-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, 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", 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 @@ + + + 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 @@ +