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