Skip to content

Commit c584404

Browse files
fix: handle type aliases for $$Slots and $$Events related rules (#530)
1 parent 55cbc42 commit c584404

File tree

5 files changed

+37
-8
lines changed

5 files changed

+37
-8
lines changed

.changeset/light-boats-press.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": patch
3+
---
4+
5+
fix: handle type aliases for $$Events and $$Slots declarations

src/rules/experimental-require-slot-types.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { createRule } from "../utils"
22
import { getLangValue } from "../utils/ast-utils"
33

4+
const SLOTS_TYPE_NAME = "$$Slots"
5+
46
export default createRule("experimental-require-slot-types", {
57
meta: {
68
docs: {
@@ -18,7 +20,7 @@ export default createRule("experimental-require-slot-types", {
1820
create(context) {
1921
let isTs = false
2022
let hasSlot = false
21-
let hasInterface = false
23+
let hasDeclaredSlots = false
2224
return {
2325
SvelteScriptElement(node) {
2426
const lang = getLangValue(node)?.toLowerCase()
@@ -30,12 +32,17 @@ export default createRule("experimental-require-slot-types", {
3032
}
3133
},
3234
TSInterfaceDeclaration(node) {
33-
if (node.id.name === "$$Slots") {
34-
hasInterface = true
35+
if (node.id.name === SLOTS_TYPE_NAME) {
36+
hasDeclaredSlots = true
37+
}
38+
},
39+
TSTypeAliasDeclaration(node) {
40+
if (node.id.name === SLOTS_TYPE_NAME) {
41+
hasDeclaredSlots = true
3542
}
3643
},
3744
"Program:exit"() {
38-
if (isTs && hasSlot && !hasInterface) {
45+
if (isTs && hasSlot && !hasDeclaredSlots) {
3946
context.report({
4047
loc: {
4148
line: 1,

src/rules/experimental-require-strict-events.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import type { AST } from "svelte-eslint-parser"
33
import { createRule } from "../utils"
44
import { findAttribute, getLangValue } from "../utils/ast-utils"
55

6+
const EVENTS_TYPE_NAME = "$$Events"
7+
68
export default createRule("experimental-require-strict-events", {
79
meta: {
810
docs: {
@@ -19,7 +21,7 @@ export default createRule("experimental-require-strict-events", {
1921
create(context) {
2022
let isTs = false
2123
let hasAttribute = false
22-
let hasInterface = false
24+
let hasDeclaredEvents = false
2325
let scriptNode: AST.SvelteScriptElement
2426
return {
2527
SvelteScriptElement(node) {
@@ -29,12 +31,17 @@ export default createRule("experimental-require-strict-events", {
2931
scriptNode = node
3032
},
3133
TSInterfaceDeclaration(node) {
32-
if (node.id.name === "$$Events") {
33-
hasInterface = true
34+
if (node.id.name === EVENTS_TYPE_NAME) {
35+
hasDeclaredEvents = true
36+
}
37+
},
38+
TSTypeAliasDeclaration(node) {
39+
if (node.id.name === EVENTS_TYPE_NAME) {
40+
hasDeclaredEvents = true
3441
}
3542
},
3643
"Program:exit"() {
37-
if (isTs && !hasAttribute && !hasInterface) {
44+
if (isTs && !hasAttribute && !hasDeclaredEvents) {
3845
context.report({
3946
node: scriptNode,
4047
messageId: "missingStrictEvents",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script lang="ts">
2+
type $$Slots = {
3+
defalt: Record<string, never>
4+
}
5+
</script>
6+
7+
<slot />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script lang="ts">
2+
type $$Events = {}
3+
</script>

0 commit comments

Comments
 (0)