Repository: sveltejs/eslint-plugin-svelte
Pull request #982 (2024-12-31 06:45:57)

feat!: updated the `html-self-closing` rule to follow Svelte5
close: https://github.com/sveltejs/eslint-plugin-svelte/issues/960
close: https://github.com/sveltejs/eslint-plugin-svelte/issues/950

changeset-bot[bot]: ###  🦋  Changeset detected

Latest commit: a23e23925ea1862b5fdc4b7f1c64b68c7f8cb640

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 1 package</summary>

  | Name                 | Type  |
| -------------------- | ----- |
| eslint-plugin-svelte | Major |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/sveltejs/eslint-plugin-svelte/new/fix/html-self-closing?filename=.changeset/nasty-olives-sell.md&value=---%0A%22eslint-plugin-svelte%22%3A%20patch%0A---%0A%0Afeat!%3A%20updated%20the%20%60html-self-closing%60%20rule%20to%20follow%20Svelte5%0A)


pkg-pr-new[bot]: 
[Open in Stackblitz](https://pkg.pr.new/template/928dab82-d900-45da-a08f-99b8feaad53a)


```
npm i https://pkg.pr.new/eslint-plugin-svelte@982
```


_commit: <a href="https://github.com/sveltejs/eslint-plugin-svelte/runs/35007812440"><code>a23e239</code></a>_


Patch:
diff --git a/.changeset/blue-swans-give.md b/.changeset/blue-swans-give.md
new file mode 100644
index 0000000..2d84a8c
--- /dev/null
+++ b/.changeset/blue-swans-give.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': minor
+---
+
+feat: Implement util to conditionally run lint based on Svelte version and SvelteKit routes etc
diff --git a/.changeset/cool-steaks-happen.md b/.changeset/cool-steaks-happen.md
new file mode 100644
index 0000000..8f6fc6f
--- /dev/null
+++ b/.changeset/cool-steaks-happen.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: upgrade `svelte-eslint-parser` to `1.0.0-next.8`
diff --git a/.changeset/eighty-trainers-push.md b/.changeset/eighty-trainers-push.md
new file mode 100644
index 0000000..8e8690a
--- /dev/null
+++ b/.changeset/eighty-trainers-push.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: add `:exit` for each node listener
diff --git a/.changeset/itchy-dragons-boil.md b/.changeset/itchy-dragons-boil.md
new file mode 100644
index 0000000..b87445b
--- /dev/null
+++ b/.changeset/itchy-dragons-boil.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: using svelte-eslint-parser for style selector parsing
diff --git a/.changeset/nice-clocks-buy.md b/.changeset/nice-clocks-buy.md
new file mode 100644
index 0000000..e7def69
--- /dev/null
+++ b/.changeset/nice-clocks-buy.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+fix: ignore `css_unused_selector` compile error if `<style>` tag has `global` attribute
diff --git a/.changeset/olive-spiders-type.md b/.changeset/olive-spiders-type.md
new file mode 100644
index 0000000..6365268
--- /dev/null
+++ b/.changeset/olive-spiders-type.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: update `svelte-eslint-parser` to `1.0.0-next.9`
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 0dd8e6e..2933e46 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -7,14 +7,18 @@
   },
   "changesets": [
     "blue-panthers-run",
+    "blue-swans-give",
     "cold-starfishes-doubt",
     "cool-rockets-allow",
+    "eighty-trainers-push",
     "fast-coins-fly",
     "fifty-parents-itch",
     "green-squids-compete",
     "hungry-grapes-shave",
+    "itchy-dragons-boil",
     "lazy-eyes-wait",
     "loud-zoos-kiss",
+    "nice-clocks-buy",
     "olive-melons-explain",
     "olive-wolves-travel",
     "quiet-toys-burn",
diff --git a/.changeset/soft-bears-hear.md b/.changeset/soft-bears-hear.md
new file mode 100644
index 0000000..d54cb5b
--- /dev/null
+++ b/.changeset/soft-bears-hear.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': major
+---
+
+feat!: Updated the `html-self-closing` rule to follow Svelte5
diff --git a/.changeset/thin-dryers-know.md b/.changeset/thin-dryers-know.md
new file mode 100644
index 0000000..b98f20f
--- /dev/null
+++ b/.changeset/thin-dryers-know.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': minor
+---
+
+fix!: rename `no-deprecated-raw-special-elements` to `no-raw-special-elements`
diff --git a/.changeset/two-students-pump.md b/.changeset/two-students-pump.md
new file mode 100644
index 0000000..c0e36c9
--- /dev/null
+++ b/.changeset/two-students-pump.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+fix: update method for extracting major version
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index f99c08e..810b1ca 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,5 +1,7 @@
 # These are supported funding model platforms
 
+open_collective: svelte
 github: [ota-meshi, JounQin]
-open_collective: rxts
 patreon: 1stG
+custom:
+  - https://opencollective.com/rxts
diff --git a/.github/workflows/NodeCI.yml b/.github/workflows/NodeCI.yml
index 6e24e93..7ac120e 100644
--- a/.github/workflows/NodeCI.yml
+++ b/.github/workflows/NodeCI.yml
@@ -139,31 +139,6 @@ jobs:
         run: pnpm run test
         working-directory: ${{ env.project_root_path }}
 
-  test-for-typescript-eslint-v5:
-    name: Test for typescript-eslint v5
-    runs-on: ${{ matrix.os }}
-    strategy:
-      matrix:
-        os: [ubuntu-latest]
-        node: [18]
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v4
-      - uses: pnpm/action-setup@v2
-      - name: Setup Node.js ${{ matrix.node }}
-        uses: actions/setup-node@v4
-        with:
-          node-version: ${{ matrix.node }}
-      - name: Install typescript-eslint v5
-        run: |
-          pnpm install -D -w @typescript-eslint/parser@5 @typescript-eslint/eslint-plugin@5
-          rm -rf node_modules
-      - name: Install Packages
-        run: pnpm install
-      - name: Test
-        run: pnpm run test
-        working-directory: ${{ env.project_root_path }}
-
   update-resources:
     runs-on: ubuntu-latest
     steps:
diff --git a/.gitignore b/.gitignore
index cf1b233..ca0ac50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -113,3 +113,5 @@ docs-svelte-kit/build
 /docs-svelte-kit/src/routes/*.md
 /docs-svelte-kit/src/routes/**/*.md
 packages/eslint-plugin-svelte/README.md
+
+**/.DS_Store
diff --git a/README.md b/README.md
index 35c16c8..5caad46 100644
--- a/README.md
+++ b/README.md
@@ -320,7 +320,6 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | Rule ID | Description |    |
 |:--------|:------------|:---|
 | [svelte/infinite-reactive-loop](https://sveltejs.github.io/eslint-plugin-svelte/rules/infinite-reactive-loop/) | Svelte runtime prevents calling the same reactive statement twice in a microtask. But between different microtask, it doesn't prevent. |  |
-| [svelte/no-deprecated-raw-special-elements](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-deprecated-raw-special-elements/) | Recommends not using raw special elements in Svelte versions previous to 5. | :wrench: |
 | [svelte/no-dom-manipulating](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dom-manipulating/) | disallow DOM manipulating |  |
 | [svelte/no-dupe-else-if-blocks](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-else-if-blocks/) | disallow duplicate conditions in `{#if}` / `{:else if}` chains | :star: |
 | [svelte/no-dupe-on-directives](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-on-directives/) | disallow duplicate `on:` directives |  |
@@ -330,6 +329,7 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | [svelte/no-export-load-in-svelte-module-in-kit-pages](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-export-load-in-svelte-module-in-kit-pages/) | disallow exporting load functions in `*.svelte` module in SvelteKit page components. |  |
 | [svelte/no-not-function-handler](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/) | disallow use of not function in event handler | :star: |
 | [svelte/no-object-in-text-mustaches](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-object-in-text-mustaches/) | disallow objects in text mustache interpolation | :star: |
+| [svelte/no-raw-special-elements](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-raw-special-elements/) | Checks for invalid raw HTML elements | :wrench: |
 | [svelte/no-reactive-reassign](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-reactive-reassign/) | disallow reassigning reactive values |  |
 | [svelte/no-shorthand-style-property-overrides](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-shorthand-style-property-overrides/) | disallow shorthand style properties that override related longhand properties | :star: |
 | [svelte/no-store-async](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-store-async/) | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features |  |
diff --git a/docs/rules.md b/docs/rules.md
index 047b2ab..73dcbdf 100644
--- a/docs/rules.md
+++ b/docs/rules.md
@@ -17,7 +17,6 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | Rule ID                                                                                                        | Description                                                                                                                            |                |
 | :------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :------------- |
 | [svelte/infinite-reactive-loop](./rules/infinite-reactive-loop.md)                                             | Svelte runtime prevents calling the same reactive statement twice in a microtask. But between different microtask, it doesn't prevent. |                |
-| [svelte/no-deprecated-raw-special-elements](./rules/no-deprecated-raw-special-elements.md)                     | Recommends not using raw special elements in Svelte versions previous to 5.                                                            | :wrench:       |
 | [svelte/no-dom-manipulating](./rules/no-dom-manipulating.md)                                                   | disallow DOM manipulating                                                                                                              |                |
 | [svelte/no-dupe-else-if-blocks](./rules/no-dupe-else-if-blocks.md)                                             | disallow duplicate conditions in `{#if}` / `{:else if}` chains                                                                         | :star:         |
 | [svelte/no-dupe-on-directives](./rules/no-dupe-on-directives.md)                                               | disallow duplicate `on:` directives                                                                                                    |                |
@@ -27,6 +26,7 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | [svelte/no-export-load-in-svelte-module-in-kit-pages](./rules/no-export-load-in-svelte-module-in-kit-pages.md) | disallow exporting load functions in `*.svelte` module in SvelteKit page components.                                                   |                |
 | [svelte/no-not-function-handler](./rules/no-not-function-handler.md)                                           | disallow use of not function in event handler                                                                                          | :star:         |
 | [svelte/no-object-in-text-mustaches](./rules/no-object-in-text-mustaches.md)                                   | disallow objects in text mustache interpolation                                                                                        | :star:         |
+| [svelte/no-raw-special-elements](./rules/no-raw-special-elements.md)                                           | Checks for invalid raw HTML elements                                                                                                   | :wrench:       |
 | [svelte/no-reactive-reassign](./rules/no-reactive-reassign.md)                                                 | disallow reassigning reactive values                                                                                                   |                |
 | [svelte/no-shorthand-style-property-overrides](./rules/no-shorthand-style-property-overrides.md)               | disallow shorthand style properties that override related longhand properties                                                          | :star:         |
 | [svelte/no-store-async](./rules/no-store-async.md)                                                             | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features                          |                |
diff --git a/docs/rules/html-self-closing.md b/docs/rules/html-self-closing.md
index 18c131b..0cb6231 100644
--- a/docs/rules/html-self-closing.md
+++ b/docs/rules/html-self-closing.md
@@ -14,10 +14,10 @@ since: 'v2.5.0'
 
 ## :book: Rule Details
 
-You can choose either two styles for elements without content
+You can choose either two styles for elements without content.
 
-- always: `<div />`
-- never: `<div></div>`
+- always: `<SomeComponent />`
+- never: `<SomeComponent></SomeComponent>`
 
 <!-- prettier-ignore-start -->
 <!--eslint-skip-->
@@ -28,18 +28,21 @@ You can choose either two styles for elements without content
 </script>
 
 <!-- ✓ GOOD -->
-<div />
 <p>Hello</p>
-<div><div /></div>
+<div></div>
 <img />
 <svelte:head />
+<svg><path /></svg>
+<math><msup></msup></math>
+<SomeComponent />
 
 <!-- ✗ BAD -->
-<div></div>
-<p> </p>
-<div><div></div></div>
-<img>
+<div />
+<div><div /></div>
 <svelte:body></svelte:body>
+<svg><path></path></svg>
+<math><msup /></math>
+<SomeComponent></SomeComponent>
 ```
 
 <!-- prettier-ignore-end -->
@@ -52,7 +55,7 @@ presets:
 {
   "svelte/html-self-closing": [
     "error",
-    "all" // or "html" or "none"
+    "default" // or "all" or "html" or "none"
   ]
 }
 ```
@@ -65,8 +68,9 @@ config object:
     "error",
     {
       "void": "always", // or "never" or "ignore"
-      "normal": "always", // or "never" or "ignore"
-      "foreign": "always", // or "never" or "ignore"
+      "normal": "never", // or "always" or "ignore"
+      "svg": "always", // or "never" or "ignore"
+      "never": "never", // or "always" or "ignore"
       "component": "always", // or "never" or "ignore"
       "svelte": "always" // or "never" or "ignore"
     }
@@ -76,23 +80,33 @@ config object:
 
 presets:
 
-- `all` - all elements should be self closing (unless they have children)
-- `html` - html-compliant - only void elements and svelte special elements should be self closing
-- `none` - no elements should be self closing
+- `default` - MathML and non-void HTML elements should have a closing tag; otherwise, they should be self-closing.
+- `all` - all elements should be self-closing (unless they have children)
+- `html` - html-compliant - only void elements and svelte special elements should be self-closing
+- `none` - no elements should be self-closing
+
+::: warning Note
+We recommend selecting `default` as the preset. Choosing any other option may result in settings that are inconsistent with the compiler when using Svelte5.
+:::
 
 config object:
 
 - `void` (`"always"` in default preset)... Style of HTML void elements
-- `foreign` (`"always"` in default preset)... Style of foreign elements (SVG and MathML)
+- `normal` (`"never"` in default preset)... Style of other elements
+- `svg` (`"always"` in default preset)... Style of SVG
+- `math` (`never` in default preset)... Style of MathML
 - `component` (`"always"` in default preset)... Style of svelte components
 - `svelte` (`"always"` in default preset)... Style of svelte special elements (`<svelte:head>`, `<svelte:self>`)
-- `normal` (`"always"` in default preset)... Style of other elements
 
-Every config oject option can be set to
+::: warning
+`foreign` is removed in `eslint-plugin-svelte` v3.
+:::
+
+Every config object option can be set to
 
-- "always" (`<div />`)
-- "never" (`<div></div>`)
-- "ignore" (either `<div />` or `<div></div>`)
+- "always" (`<SomeComponent />`)
+- "never" (`<SomeComponent></SomeComponent>`)
+- "ignore" (either `<SomeComponent />` or `<SomeComponent></SomeComponent>`)
 
 ## :rocket: Version
 
diff --git a/docs/rules/no-deprecated-raw-special-elements.md b/docs/rules/no-raw-special-elements.md
similarity index 58%
rename from docs/rules/no-deprecated-raw-special-elements.md
rename to docs/rules/no-raw-special-elements.md
index 31f1985..30d9653 100644
--- a/docs/rules/no-deprecated-raw-special-elements.md
+++ b/docs/rules/no-raw-special-elements.md
@@ -1,26 +1,26 @@
 ---
 pageClass: 'rule-details'
 sidebarDepth: 0
-title: 'svelte/no-deprecated-raw-special-elements'
-description: 'Recommends not using raw special elements in Svelte versions previous to 5.'
+title: 'svelte/no-raw-special-elements'
+description: 'Checks for invalid raw HTML elements'
 since: 'v3.0.0-next.1'
 ---
 
-# svelte/no-deprecated-raw-special-elements
+# svelte/no-raw-special-elements
 
-> Recommends not using raw special elements in Svelte versions previous to 5.
+> Checks for invalid raw HTML elements
 
 - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule.
 
 ## :book: Rule Details
 
-This rule reports the usage of `head`, `body`, `window`, `document`, `element` and `options` HTML elements. These elements were valid in in versions proior to 5, but since Svelte 5 they must be used with `svelte:`.
+This rule reports the usage of `head`, `body`, `window`, `document`, `element` and `options` HTML elements. These elements are not valid in Svelte, despite them working in versions previous to v5. Such elements must be prefixed with `svelte:`.
 
 <!--eslint-skip-->
 
 ```svelte
 <script>
-  /* eslint svelte/no-deprecated-raw-special-elements: "error" */
+  /* eslint svelte/no-raw-special-elements: "error" */
 </script>
 
 <!-- ✓ GOOD -->
@@ -48,5 +48,5 @@ This rule was introduced in eslint-plugin-svelte v3.0.0-next.1
 
 ## :mag: Implementation
 
-- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/no-deprecated-raw-special-elements.ts)
-- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-deprecated-raw-special-elements.ts)
+- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/no-raw-special-elements.ts)
+- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-raw-special-elements.ts)
diff --git a/package.json b/package.json
index d0cd91b..9ff2c1b 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
   "private": true,
   "license": "MIT",
   "funding": "https://github.com/sponsors/ota-meshi",
-  "packageManager": "pnpm@9.15.2",
+  "packageManager": "pnpm@9.15.3",
   "scripts": {
     "prerelease": "cd packages/eslint-plugin-svelte && pnpm clean && pnpm run build && cd ../.. && cp README.md packages/eslint-plugin-svelte",
     "release": "changeset publish",
@@ -24,7 +24,7 @@
     "@typescript-eslint/parser": "^8.16.0",
     "c8": "^10.1.2",
     "env-cmd": "^10.1.0",
-    "eslint": "~9.17.0",
+    "eslint": "~9.18.0",
     "eslint-config-prettier": "^9.1.0",
     "eslint-formatter-friendly": "^7.0.0",
     "eslint-plugin-eslint-plugin": "^6.3.2",
diff --git a/packages/eslint-plugin-svelte/CHANGELOG.md b/packages/eslint-plugin-svelte/CHANGELOG.md
index dc6c543..92707fd 100644
--- a/packages/eslint-plugin-svelte/CHANGELOG.md
+++ b/packages/eslint-plugin-svelte/CHANGELOG.md
@@ -1,5 +1,27 @@
 # eslint-plugin-svelte
 
+## 3.0.0-next.12
+
+### Patch Changes
+
+- [#990](https://github.com/sveltejs/eslint-plugin-svelte/pull/990) [`12049c0`](https://github.com/sveltejs/eslint-plugin-svelte/commit/12049c026f529feff6056e679ba62f07de948aa5) Thanks [@baseballyama](https://github.com/baseballyama)! - fix: ignore `css_unused_selector` compile error if `<style>` tag has `global` attribute
+
+## 3.0.0-next.11
+
+### Minor Changes
+
+- [#980](https://github.com/sveltejs/eslint-plugin-svelte/pull/980) [`0b28198`](https://github.com/sveltejs/eslint-plugin-svelte/commit/0b28198edd78513e5efc4cfb45e8f1120148435e) Thanks [@baseballyama](https://github.com/baseballyama)! - feat: Implement util to conditionally run lint based on Svelte version and SvelteKit routes etc
+
+### Patch Changes
+
+- [#993](https://github.com/sveltejs/eslint-plugin-svelte/pull/993) [`b97a13e`](https://github.com/sveltejs/eslint-plugin-svelte/commit/b97a13eb02f9c72346f29e64734f0a304890a197) Thanks [@baseballyama](https://github.com/baseballyama)! - chore: add `:exit` for each node listener
+
+## 3.0.0-next.10
+
+### Patch Changes
+
+- [#965](https://github.com/sveltejs/eslint-plugin-svelte/pull/965) [`47760ad`](https://github.com/sveltejs/eslint-plugin-svelte/commit/47760ad1b7f6b83d4c29380b3ef3cf09cde42dc8) Thanks [@marekdedic](https://github.com/marekdedic)! - chore: using svelte-eslint-parser for style selector parsing
+
 ## 3.0.0-next.9
 
 ### Minor Changes
diff --git a/packages/eslint-plugin-svelte/package.json b/packages/eslint-plugin-svelte/package.json
index e6c3b70..e03297c 100644
--- a/packages/eslint-plugin-svelte/package.json
+++ b/packages/eslint-plugin-svelte/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-plugin-svelte",
-  "version": "3.0.0-next.9",
+  "version": "3.0.0-next.12",
   "description": "ESLint plugin for Svelte using AST",
   "repository": "git+https://github.com/sveltejs/eslint-plugin-svelte.git",
   "homepage": "https://sveltejs.github.io/eslint-plugin-svelte",
@@ -64,9 +64,8 @@
     "postcss": "^8.4.49",
     "postcss-load-config": "^3.1.4",
     "postcss-safe-parser": "^7.0.0",
-    "postcss-selector-parser": "^7.0.0",
     "semver": "^7.6.3",
-    "svelte-eslint-parser": "^1.0.0-next.4"
+    "svelte-eslint-parser": "^1.0.0-next.9"
   },
   "devDependencies": {
     "@babel/core": "^7.26.0",
@@ -87,12 +86,13 @@
     "assert": "^2.1.0",
     "esbuild": "^0.24.0",
     "eslint-scope": "^8.2.0",
-    "eslint-typegen": "^0.3.2",
+    "eslint-typegen": "^1.0.0",
     "eslint-visitor-keys": "^4.2.0",
     "espree": "^10.3.0",
     "less": "^4.2.1",
     "mocha": "^11.0.0",
     "postcss-nested": "^7.0.2",
+    "postcss-selector-parser": "^7.0.0",
     "sass": "^1.81.0",
     "source-map-js": "^1.2.1",
     "stylus": "^0.64.0",
diff --git a/packages/eslint-plugin-svelte/src/meta.ts b/packages/eslint-plugin-svelte/src/meta.ts
index a16533a..483121c 100644
--- a/packages/eslint-plugin-svelte/src/meta.ts
+++ b/packages/eslint-plugin-svelte/src/meta.ts
@@ -2,4 +2,4 @@
 // This file has been automatically generated,
 // in order to update its content execute "pnpm run update"
 export const name = 'eslint-plugin-svelte';
-export const version = '3.0.0-next.9';
+export const version = '3.0.0-next.12';
diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts
index b07451a..3bc21b6 100644
--- a/packages/eslint-plugin-svelte/src/rule-types.ts
+++ b/packages/eslint-plugin-svelte/src/rule-types.ts
@@ -104,11 +104,6 @@ export interface RuleOptions {
    * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-at-html-tags/
    */
   'svelte/no-at-html-tags'?: Linter.RuleEntry<[]>
-  /**
-   * Recommends not using raw special elements in Svelte versions previous to 5.
-   * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-deprecated-raw-special-elements/
-   */
-  'svelte/no-deprecated-raw-special-elements'?: Linter.RuleEntry<[]>
   /**
    * disallow DOM manipulating
    * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dom-manipulating/
@@ -195,6 +190,11 @@ export interface RuleOptions {
    * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-object-in-text-mustaches/
    */
   'svelte/no-object-in-text-mustaches'?: Linter.RuleEntry<[]>
+  /**
+   * Checks for invalid raw HTML elements
+   * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-raw-special-elements/
+   */
+  'svelte/no-raw-special-elements'?: Linter.RuleEntry<[]>
   /**
    * it's not necessary to define functions in reactive statements
    * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-reactive-functions/
@@ -419,7 +419,8 @@ type SvelteHtmlQuotes = []|[{
 type SvelteHtmlSelfClosing = []|[({
   void?: ("never" | "always" | "ignore")
   normal?: ("never" | "always" | "ignore")
-  foreign?: ("never" | "always" | "ignore")
+  svg?: ("never" | "always" | "ignore")
+  math?: ("never" | "always" | "ignore")
   component?: ("never" | "always" | "ignore")
   svelte?: ("never" | "always" | "ignore")
 } | ("all" | "html" | "none"))]
diff --git a/packages/eslint-plugin-svelte/src/rules/html-self-closing.ts b/packages/eslint-plugin-svelte/src/rules/html-self-closing.ts
index 7e3d3ff..13c8e32 100644
--- a/packages/eslint-plugin-svelte/src/rules/html-self-closing.ts
+++ b/packages/eslint-plugin-svelte/src/rules/html-self-closing.ts
@@ -1,17 +1,23 @@
 import type { AST } from 'svelte-eslint-parser';
 import { createRule } from '../utils/index.js';
-import { getNodeName, isVoidHtmlElement, isForeignElement } from '../utils/ast-utils.js';
+import {
+	getNodeName,
+	isVoidHtmlElement,
+	isSvgElement,
+	isMathMLElement
+} from '../utils/ast-utils.js';
 import { getSourceCode } from '../utils/compat.js';
 
 const TYPE_MESSAGES = {
 	normal: 'HTML elements',
 	void: 'HTML void elements',
-	foreign: 'foreign (SVG or MathML) elements',
+	svg: 'SVG elements',
+	math: 'MathML elements',
 	component: 'Svelte custom components',
 	svelte: 'Svelte special elements'
 };
 
-type ElementTypes = 'normal' | 'void' | 'foreign' | 'component' | 'svelte';
+type ElementTypes = 'normal' | 'void' | 'svg' | 'math' | 'component' | 'svelte';
 
 export default createRule('html-self-closing', {
 	meta: {
@@ -38,7 +44,10 @@ export default createRule('html-self-closing', {
 							normal: {
 								enum: ['never', 'always', 'ignore']
 							},
-							foreign: {
+							svg: {
+								enum: ['never', 'always', 'ignore']
+							},
+							math: {
 								enum: ['never', 'always', 'ignore']
 							},
 							component: {
@@ -58,34 +67,49 @@ export default createRule('html-self-closing', {
 		]
 	},
 	create(context) {
+		// default
 		let options = {
 			void: 'always',
-			normal: 'always',
-			foreign: 'always',
+			normal: 'never',
+			svg: 'always',
+			math: 'never',
 			component: 'always',
 			svelte: 'always'
 		};
 
 		const option = context.options?.[0];
 		switch (option) {
-			case 'none':
+			case 'all':
 				options = {
-					void: 'never',
-					normal: 'never',
-					foreign: 'never',
-					component: 'never',
-					svelte: 'never'
+					void: 'always',
+					normal: 'always',
+					svg: 'always',
+					math: 'always',
+					component: 'always',
+					svelte: 'always'
 				};
 				break;
 			case 'html':
 				options = {
 					void: 'always',
 					normal: 'never',
-					foreign: 'always',
+					svg: 'always',
+					math: 'never',
 					component: 'never',
 					svelte: 'always'
 				};
 				break;
+			case 'none':
+				options = {
+					void: 'never',
+					normal: 'never',
+					svg: 'never',
+					math: 'never',
+					component: 'never',
+					svelte: 'never'
+				};
+				break;
+
 			default:
 				if (typeof option !== 'object' || option === null) break;
 
@@ -108,7 +132,8 @@ export default createRule('html-self-closing', {
 			if (node.kind === 'component') return 'component';
 			if (node.kind === 'special') return 'svelte';
 			if (isVoidHtmlElement(node)) return 'void';
-			if (isForeignElement(node)) return 'foreign';
+			if (isSvgElement(node)) return 'svg';
+			if (isMathMLElement(node)) return 'math';
 			return 'normal';
 		}
 
diff --git a/packages/eslint-plugin-svelte/src/rules/indent-helpers/index.ts b/packages/eslint-plugin-svelte/src/rules/indent-helpers/index.ts
index 9dabbb7..421d398 100644
--- a/packages/eslint-plugin-svelte/src/rules/indent-helpers/index.ts
+++ b/packages/eslint-plugin-svelte/src/rules/indent-helpers/index.ts
@@ -1,5 +1,4 @@
 import type { AST } from 'svelte-eslint-parser';
-import type { TSESTree } from '@typescript-eslint/types';
 import type { ASTNode, RuleContext, RuleListener } from '../../types.js';
 import * as SV from './svelte.js';
 import * as ES from './es.js';
@@ -244,7 +243,7 @@ export function defineVisitor(
 				offsets.ignore(node);
 			}
 		},
-		'Program:exit'(node: TSESTree.Program) {
+		'Program:exit'(node: AST.SvelteProgram) {
 			const calculator = offsets.getOffsetCalculator();
 
 			let prevToken: AnyToken | null = null;
diff --git a/packages/eslint-plugin-svelte/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts b/packages/eslint-plugin-svelte/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts
index 00871a9..3db86fe 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-export-load-in-svelte-module-in-kit-pages.ts
@@ -1,6 +1,5 @@
 import type { TSESTree } from '@typescript-eslint/types';
 import { createRule } from '../utils/index.js';
-import { isKitPageComponent } from '../utils/svelte-kit.js';
 
 export default createRule('no-export-load-in-svelte-module-in-kit-pages', {
 	meta: {
@@ -16,12 +15,14 @@ export default createRule('no-export-load-in-svelte-module-in-kit-pages', {
 			unexpected:
 				'disallow exporting load functions in `*.svelte` module in SvelteKit page components.'
 		},
-		type: 'problem'
+		type: 'problem',
+		conditions: [
+			{
+				svelteKitFileTypes: ['+page.svelte', '+error.svelte', '+layout.svelte']
+			}
+		]
 	},
 	create(context) {
-		if (!isKitPageComponent(context)) {
-			return {};
-		}
 		let isModule = false;
 		return {
 			// <script context="module">
diff --git a/packages/eslint-plugin-svelte/src/rules/no-deprecated-raw-special-elements.ts b/packages/eslint-plugin-svelte/src/rules/no-raw-special-elements.ts
similarity index 87%
rename from packages/eslint-plugin-svelte/src/rules/no-deprecated-raw-special-elements.ts
rename to packages/eslint-plugin-svelte/src/rules/no-raw-special-elements.ts
index 6d4d7bd..14fd963 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-deprecated-raw-special-elements.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-raw-special-elements.ts
@@ -4,10 +4,10 @@ import { createRule } from '../utils/index.js';
 const INVALID_HTML_ELEMENTS = ['head', 'body', 'window', 'document', 'element', 'options'];
 const VALID_PREFIX = 'svelte:';
 
-export default createRule('no-deprecated-raw-special-elements', {
+export default createRule('no-raw-special-elements', {
 	meta: {
 		docs: {
-			description: 'Recommends not using raw special elements in Svelte versions previous to 5.',
+			description: 'Checks for invalid raw HTML elements',
 			category: 'Possible Errors',
 			// TODO: Switch to recommended in the major version
 			recommended: false
diff --git a/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts b/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts
index 21e8888..9f58e53 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts
@@ -10,8 +10,9 @@ import type {
 	SvelteStyleDirective
 } from 'svelte-eslint-parser/lib/ast';
 import type { AnyNode } from 'postcss';
-import { default as selectorParser, type Node as SelectorNode } from 'postcss-selector-parser';
+import type { Node as SelectorNode } from 'postcss-selector-parser';
 import { getSourceCode } from '../utils/compat.js';
+import type { SourceCode } from '../types.js';
 
 export default createRule('no-unused-class-name', {
 	meta: {
@@ -61,7 +62,9 @@ export default createRule('no-unused-class-name', {
 					return;
 				}
 				const classesUsedInStyle =
-					styleContext.status === 'success' ? findClassesInPostCSSNode(styleContext.sourceAst) : [];
+					styleContext.status === 'success'
+						? findClassesInPostCSSNode(styleContext.sourceAst, sourceCode.parserServices)
+						: [];
 				for (const className in classesUsedInTemplate) {
 					if (!allowedClassNames.includes(className) && !classesUsedInStyle.includes(className)) {
 						context.report({
@@ -102,15 +105,17 @@ function findClassesInAttribute(
 /**
  * Extract all class names used in a PostCSS node.
  */
-function findClassesInPostCSSNode(node: AnyNode): string[] {
+function findClassesInPostCSSNode(
+	node: AnyNode,
+	parserServices: SourceCode['parserServices']
+): string[] {
 	if (node.type === 'rule') {
-		let classes = node.nodes.flatMap(findClassesInPostCSSNode);
-		const processor = selectorParser();
-		classes = classes.concat(findClassesInSelector(processor.astSync(node.selector)));
+		let classes = node.nodes.flatMap((node) => findClassesInPostCSSNode(node, parserServices));
+		classes = classes.concat(findClassesInSelector(parserServices.getStyleSelectorAST!(node)));
 		return classes;
 	}
 	if ((node.type === 'root' || node.type === 'atrule') && node.nodes !== undefined) {
-		return node.nodes.flatMap(findClassesInPostCSSNode);
+		return node.nodes.flatMap((node) => findClassesInPostCSSNode(node, parserServices));
 	}
 	return [];
 }
diff --git a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
index 74da079..53be2b7 100644
--- a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
+++ b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
@@ -2,6 +2,34 @@ import { createRule } from '../utils/index.js';
 import type { SvelteCompileWarnings, Warning } from '../shared/svelte-compile-warns/index.js';
 import { getSvelteCompileWarnings } from '../shared/svelte-compile-warns/index.js';
 import { getSourceCode } from '../utils/compat.js';
+import type { Position } from 'svelte-eslint-parser/lib/ast/common.js';
+
+const ignores: string[] = [
+	'missing-declaration',
+	// Svelte v4
+	'dynamic-slot-name',
+	// Svelte v5
+	'invalid-slot-name'
+] as const;
+
+const unusedSelectorWarnings: string[] = ['css_unused_selector', 'css-unused-selector'] as const;
+
+function isGlobalStyleNode(
+	globalStyleRanges: [Position, Position][],
+	start?: Position,
+	end?: Position
+) {
+	if (start == null || end == null) {
+		return false;
+	}
+	return globalStyleRanges.some(([rangeStart, rangeEnd]) => {
+		return (
+			(rangeStart.line < start.line ||
+				(rangeStart.line === start.line && rangeStart.column <= start.column)) &&
+			(end.line < rangeEnd.line || (end.line === rangeEnd.line && end.column <= rangeEnd.column))
+		);
+	});
+}
 
 export default createRule('valid-compile', {
 	meta: {
@@ -39,21 +67,19 @@ export default createRule('valid-compile', {
 			: (warning) => warning;
 
 		const ignoreWarnings = Boolean(context.options[0]?.ignoreWarnings);
-
-		const ignores = [
-			'missing-declaration',
-			// Svelte v4
-			'dynamic-slot-name',
-			// Svelte v5
-			'invalid-slot-name'
-		];
+		const globalStyleRanges: [Position, Position][] = [];
 
 		/**
 		 * report
 		 */
 		function report({ warnings, kind }: SvelteCompileWarnings) {
 			for (const warn of warnings) {
-				if (warn.code && ignores.includes(warn.code)) {
+				if (
+					warn.code &&
+					(ignores.includes(warn.code) ||
+						(isGlobalStyleNode(globalStyleRanges, warn.start, warn.end) &&
+							unusedSelectorWarnings.includes(warn.code)))
+				) {
 					continue;
 				}
 				const reportWarn = kind === 'warn' ? transform(warn) : warn;
@@ -71,6 +97,15 @@ export default createRule('valid-compile', {
 		}
 
 		return {
+			SvelteStyleElement(node) {
+				const { attributes } = node.startTag;
+				for (const attr of attributes) {
+					if (attr.type === 'SvelteAttribute' && attr.key.name === 'global') {
+						globalStyleRanges.push([node.loc.start, node.loc.end]);
+						break;
+					}
+				}
+			},
 			'Program:exit'() {
 				const result = getSvelteCompileWarnings(context);
 				if (ignoreWarnings && result.kind === 'warn') {
diff --git a/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts b/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts
index ff12df7..e23455d 100644
--- a/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts
+++ b/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts
@@ -1,7 +1,6 @@
 import type { AST } from 'svelte-eslint-parser';
 import type { TSESTree } from '@typescript-eslint/types';
 import { createRule } from '../utils/index.js';
-import { isKitPageComponent } from '../utils/svelte-kit.js';
 import type { RuleContext } from '../types.js';
 
 const EXPECTED_PROP_NAMES = ['data', 'errors', 'form', 'snapshot'];
@@ -35,10 +34,14 @@ export default createRule('valid-prop-names-in-kit-pages', {
 		messages: {
 			unexpected: 'disallow props other than data or errors in SvelteKit page components.'
 		},
-		type: 'problem'
+		type: 'problem',
+		conditions: [
+			{
+				svelteKitFileTypes: ['+page.svelte', '+error.svelte', '+layout.svelte']
+			}
+		]
 	},
 	create(context) {
-		if (!isKitPageComponent(context)) return {};
 		let isScript = false;
 		return {
 			// <script>
diff --git a/packages/eslint-plugin-svelte/src/types-for-node.ts b/packages/eslint-plugin-svelte/src/types-for-node.ts
index a1bf991..00bf3c6 100644
--- a/packages/eslint-plugin-svelte/src/types-for-node.ts
+++ b/packages/eslint-plugin-svelte/src/types-for-node.ts
@@ -18,451 +18,936 @@ export type ASTNodeWithParent =
 
 export type ASTNodeListener = {
 	AccessorProperty?: (node: TSESTree.AccessorProperty & ASTNodeWithParent) => void;
+	'AccessorProperty:exit'?: (node: TSESTree.AccessorProperty & ASTNodeWithParent) => void;
 	ArrayExpression?: (node: TSESTree.ArrayExpression & ASTNodeWithParent) => void;
+	'ArrayExpression:exit'?: (node: TSESTree.ArrayExpression & ASTNodeWithParent) => void;
 	ArrayPattern?: (node: TSESTree.ArrayPattern & ASTNodeWithParent) => void;
+	'ArrayPattern:exit'?: (node: TSESTree.ArrayPattern & ASTNodeWithParent) => void;
 	ArrowFunctionExpression?: (node: TSESTree.ArrowFunctionExpression & ASTNodeWithParent) => void;
+	'ArrowFunctionExpression:exit'?: (
+		node: TSESTree.ArrowFunctionExpression & ASTNodeWithParent
+	) => void;
 	AssignmentExpression?: (node: TSESTree.AssignmentExpression & ASTNodeWithParent) => void;
+	'AssignmentExpression:exit'?: (node: TSESTree.AssignmentExpression & ASTNodeWithParent) => void;
 	AssignmentPattern?: (node: TSESTree.AssignmentPattern & ASTNodeWithParent) => void;
+	'AssignmentPattern:exit'?: (node: TSESTree.AssignmentPattern & ASTNodeWithParent) => void;
 	AwaitExpression?: (node: TSESTree.AwaitExpression & ASTNodeWithParent) => void;
+	'AwaitExpression:exit'?: (node: TSESTree.AwaitExpression & ASTNodeWithParent) => void;
 	BinaryExpression?: (node: TSESTree.BinaryExpression & ASTNodeWithParent) => void;
+	'BinaryExpression:exit'?: (node: TSESTree.BinaryExpression & ASTNodeWithParent) => void;
 	BlockStatement?: (node: TSESTree.BlockStatement & ASTNodeWithParent) => void;
+	'BlockStatement:exit'?: (node: TSESTree.BlockStatement & ASTNodeWithParent) => void;
 	BreakStatement?: (node: TSESTree.BreakStatement & ASTNodeWithParent) => void;
+	'BreakStatement:exit'?: (node: TSESTree.BreakStatement & ASTNodeWithParent) => void;
 	CallExpression?: (node: TSESTree.CallExpression & ASTNodeWithParent) => void;
+	'CallExpression:exit'?: (node: TSESTree.CallExpression & ASTNodeWithParent) => void;
 	CatchClause?: (node: TSESTree.CatchClause & ASTNodeWithParent) => void;
+	'CatchClause:exit'?: (node: TSESTree.CatchClause & ASTNodeWithParent) => void;
 	ChainExpression?: (node: TSESTree.ChainExpression & ASTNodeWithParent) => void;
+	'ChainExpression:exit'?: (node: TSESTree.ChainExpression & ASTNodeWithParent) => void;
 	ClassBody?: (node: TSESTree.ClassBody & ASTNodeWithParent) => void;
+	'ClassBody:exit'?: (node: TSESTree.ClassBody & ASTNodeWithParent) => void;
 	ClassDeclaration?: (node: TSESTree.ClassDeclaration & ASTNodeWithParent) => void;
+	'ClassDeclaration:exit'?: (node: TSESTree.ClassDeclaration & ASTNodeWithParent) => void;
 	ClassExpression?: (node: TSESTree.ClassExpression & ASTNodeWithParent) => void;
+	'ClassExpression:exit'?: (node: TSESTree.ClassExpression & ASTNodeWithParent) => void;
 	ConditionalExpression?: (node: TSESTree.ConditionalExpression & ASTNodeWithParent) => void;
+	'ConditionalExpression:exit'?: (node: TSESTree.ConditionalExpression & ASTNodeWithParent) => void;
 	ContinueStatement?: (node: TSESTree.ContinueStatement & ASTNodeWithParent) => void;
+	'ContinueStatement:exit'?: (node: TSESTree.ContinueStatement & ASTNodeWithParent) => void;
 	DebuggerStatement?: (node: TSESTree.DebuggerStatement & ASTNodeWithParent) => void;
+	'DebuggerStatement:exit'?: (node: TSESTree.DebuggerStatement & ASTNodeWithParent) => void;
 	Decorator?: (node: TSESTree.Decorator & ASTNodeWithParent) => void;
+	'Decorator:exit'?: (node: TSESTree.Decorator & ASTNodeWithParent) => void;
 	DoWhileStatement?: (node: TSESTree.DoWhileStatement & ASTNodeWithParent) => void;
+	'DoWhileStatement:exit'?: (node: TSESTree.DoWhileStatement & ASTNodeWithParent) => void;
 	EmptyStatement?: (node: TSESTree.EmptyStatement & ASTNodeWithParent) => void;
+	'EmptyStatement:exit'?: (node: TSESTree.EmptyStatement & ASTNodeWithParent) => void;
 	ExportAllDeclaration?: (node: TSESTree.ExportAllDeclaration & ASTNodeWithParent) => void;
+	'ExportAllDeclaration:exit'?: (node: TSESTree.ExportAllDeclaration & ASTNodeWithParent) => void;
 	ExportDefaultDeclaration?: (node: TSESTree.ExportDefaultDeclaration & ASTNodeWithParent) => void;
+	'ExportDefaultDeclaration:exit'?: (
+		node: TSESTree.ExportDefaultDeclaration & ASTNodeWithParent
+	) => void;
 	ExportNamedDeclaration?: (node: TSESTree.ExportNamedDeclaration & ASTNodeWithParent) => void;
+	'ExportNamedDeclaration:exit'?: (
+		node: TSESTree.ExportNamedDeclaration & ASTNodeWithParent
+	) => void;
 	ExportSpecifier?: (node: TSESTree.ExportSpecifier & ASTNodeWithParent) => void;
+	'ExportSpecifier:exit'?: (node: TSESTree.ExportSpecifier & ASTNodeWithParent) => void;
 	ExpressionStatement?: (node: TSESTree.ExpressionStatement & ASTNodeWithParent) => void;
+	'ExpressionStatement:exit'?: (node: TSESTree.ExpressionStatement & ASTNodeWithParent) => void;
 	ForInStatement?: (node: TSESTree.ForInStatement & ASTNodeWithParent) => void;
+	'ForInStatement:exit'?: (node: TSESTree.ForInStatement & ASTNodeWithParent) => void;
 	ForOfStatement?: (node: TSESTree.ForOfStatement & ASTNodeWithParent) => void;
+	'ForOfStatement:exit'?: (node: TSESTree.ForOfStatement & ASTNodeWithParent) => void;
 	ForStatement?: (node: TSESTree.ForStatement & ASTNodeWithParent) => void;
+	'ForStatement:exit'?: (node: TSESTree.ForStatement & ASTNodeWithParent) => void;
 	FunctionDeclaration?: (node: TSESTree.FunctionDeclaration & ASTNodeWithParent) => void;
+	'FunctionDeclaration:exit'?: (node: TSESTree.FunctionDeclaration & ASTNodeWithParent) => void;
 	FunctionExpression?: (node: TSESTree.FunctionExpression & ASTNodeWithParent) => void;
+	'FunctionExpression:exit'?: (node: TSESTree.FunctionExpression & ASTNodeWithParent) => void;
 	Identifier?: (node: TSESTree.Identifier & ASTNodeWithParent) => void;
+	'Identifier:exit'?: (node: TSESTree.Identifier & ASTNodeWithParent) => void;
 	IfStatement?: (node: TSESTree.IfStatement & ASTNodeWithParent) => void;
+	'IfStatement:exit'?: (node: TSESTree.IfStatement & ASTNodeWithParent) => void;
 	ImportAttribute?: (node: TSESTree.ImportAttribute & ASTNodeWithParent) => void;
+	'ImportAttribute:exit'?: (node: TSESTree.ImportAttribute & ASTNodeWithParent) => void;
 	ImportDeclaration?: (node: TSESTree.ImportDeclaration & ASTNodeWithParent) => void;
+	'ImportDeclaration:exit'?: (node: TSESTree.ImportDeclaration & ASTNodeWithParent) => void;
 	ImportDefaultSpecifier?: (node: TSESTree.ImportDefaultSpecifier & ASTNodeWithParent) => void;
+	'ImportDefaultSpecifier:exit'?: (
+		node: TSESTree.ImportDefaultSpecifier & ASTNodeWithParent
+	) => void;
 	ImportExpression?: (node: TSESTree.ImportExpression & ASTNodeWithParent) => void;
+	'ImportExpression:exit'?: (node: TSESTree.ImportExpression & ASTNodeWithParent) => void;
 	ImportNamespaceSpecifier?: (node: TSESTree.ImportNamespaceSpecifier & ASTNodeWithParent) => void;
+	'ImportNamespaceSpecifier:exit'?: (
+		node: TSESTree.ImportNamespaceSpecifier & ASTNodeWithParent
+	) => void;
 	ImportSpecifier?: (node: TSESTree.ImportSpecifier & ASTNodeWithParent) => void;
+	'ImportSpecifier:exit'?: (node: TSESTree.ImportSpecifier & ASTNodeWithParent) => void;
 	JSXAttribute?: (node: TSESTree.JSXAttribute & ASTNodeWithParent) => void;
+	'JSXAttribute:exit'?: (node: TSESTree.JSXAttribute & ASTNodeWithParent) => void;
 	JSXClosingElement?: (node: TSESTree.JSXClosingElement & ASTNodeWithParent) => void;
+	'JSXClosingElement:exit'?: (node: TSESTree.JSXClosingElement & ASTNodeWithParent) => void;
 	JSXClosingFragment?: (node: TSESTree.JSXClosingFragment & ASTNodeWithParent) => void;
+	'JSXClosingFragment:exit'?: (node: TSESTree.JSXClosingFragment & ASTNodeWithParent) => void;
 	JSXElement?: (node: TSESTree.JSXElement & ASTNodeWithParent) => void;
+	'JSXElement:exit'?: (node: TSESTree.JSXElement & ASTNodeWithParent) => void;
 	JSXEmptyExpression?: (node: TSESTree.JSXEmptyExpression & ASTNodeWithParent) => void;
+	'JSXEmptyExpression:exit'?: (node: TSESTree.JSXEmptyExpression & ASTNodeWithParent) => void;
 	JSXExpressionContainer?: (node: TSESTree.JSXExpressionContainer & ASTNodeWithParent) => void;
+	'JSXExpressionContainer:exit'?: (
+		node: TSESTree.JSXExpressionContainer & ASTNodeWithParent
+	) => void;
 	JSXFragment?: (node: TSESTree.JSXFragment & ASTNodeWithParent) => void;
+	'JSXFragment:exit'?: (node: TSESTree.JSXFragment & ASTNodeWithParent) => void;
 	JSXIdentifier?: (node: TSESTree.JSXIdentifier & ASTNodeWithParent) => void;
+	'JSXIdentifier:exit'?: (node: TSESTree.JSXIdentifier & ASTNodeWithParent) => void;
 	JSXMemberExpression?: (node: TSESTree.JSXMemberExpression & ASTNodeWithParent) => void;
+	'JSXMemberExpression:exit'?: (node: TSESTree.JSXMemberExpression & ASTNodeWithParent) => void;
 	JSXNamespacedName?: (node: TSESTree.JSXNamespacedName & ASTNodeWithParent) => void;
+	'JSXNamespacedName:exit'?: (node: TSESTree.JSXNamespacedName & ASTNodeWithParent) => void;
 	JSXOpeningElement?: (node: TSESTree.JSXOpeningElement & ASTNodeWithParent) => void;
+	'JSXOpeningElement:exit'?: (node: TSESTree.JSXOpeningElement & ASTNodeWithParent) => void;
 	JSXOpeningFragment?: (node: TSESTree.JSXOpeningFragment & ASTNodeWithParent) => void;
+	'JSXOpeningFragment:exit'?: (node: TSESTree.JSXOpeningFragment & ASTNodeWithParent) => void;
 	JSXSpreadAttribute?: (node: TSESTree.JSXSpreadAttribute & ASTNodeWithParent) => void;
+	'JSXSpreadAttribute:exit'?: (node: TSESTree.JSXSpreadAttribute & ASTNodeWithParent) => void;
 	JSXSpreadChild?: (node: TSESTree.JSXSpreadChild & ASTNodeWithParent) => void;
+	'JSXSpreadChild:exit'?: (node: TSESTree.JSXSpreadChild & ASTNodeWithParent) => void;
 	JSXText?: (node: TSESTree.JSXText & ASTNodeWithParent) => void;
+	'JSXText:exit'?: (node: TSESTree.JSXText & ASTNodeWithParent) => void;
 	LabeledStatement?: (node: TSESTree.LabeledStatement & ASTNodeWithParent) => void;
+	'LabeledStatement:exit'?: (node: TSESTree.LabeledStatement & ASTNodeWithParent) => void;
 	Literal?: (node: TSESTree.Literal & ASTNodeWithParent) => void;
+	'Literal:exit'?: (node: TSESTree.Literal & ASTNodeWithParent) => void;
 	LogicalExpression?: (node: TSESTree.LogicalExpression & ASTNodeWithParent) => void;
+	'LogicalExpression:exit'?: (node: TSESTree.LogicalExpression & ASTNodeWithParent) => void;
 	MemberExpression?: (node: TSESTree.MemberExpression & ASTNodeWithParent) => void;
+	'MemberExpression:exit'?: (node: TSESTree.MemberExpression & ASTNodeWithParent) => void;
 	MetaProperty?: (node: TSESTree.MetaProperty & ASTNodeWithParent) => void;
+	'MetaProperty:exit'?: (node: TSESTree.MetaProperty & ASTNodeWithParent) => void;
 	MethodDefinition?: (node: TSESTree.MethodDefinition & ASTNodeWithParent) => void;
+	'MethodDefinition:exit'?: (node: TSESTree.MethodDefinition & ASTNodeWithParent) => void;
 	NewExpression?: (node: TSESTree.NewExpression & ASTNodeWithParent) => void;
+	'NewExpression:exit'?: (node: TSESTree.NewExpression & ASTNodeWithParent) => void;
 	ObjectExpression?: (node: TSESTree.ObjectExpression & ASTNodeWithParent) => void;
+	'ObjectExpression:exit'?: (node: TSESTree.ObjectExpression & ASTNodeWithParent) => void;
 	ObjectPattern?: (node: TSESTree.ObjectPattern & ASTNodeWithParent) => void;
+	'ObjectPattern:exit'?: (node: TSESTree.ObjectPattern & ASTNodeWithParent) => void;
 	PrivateIdentifier?: (node: TSESTree.PrivateIdentifier & ASTNodeWithParent) => void;
+	'PrivateIdentifier:exit'?: (node: TSESTree.PrivateIdentifier & ASTNodeWithParent) => void;
 	Property?: (node: TSESTree.Property & ASTNodeWithParent) => void;
+	'Property:exit'?: (node: TSESTree.Property & ASTNodeWithParent) => void;
 	PropertyDefinition?: (node: TSESTree.PropertyDefinition & ASTNodeWithParent) => void;
+	'PropertyDefinition:exit'?: (node: TSESTree.PropertyDefinition & ASTNodeWithParent) => void;
 	RestElement?: (node: TSESTree.RestElement & ASTNodeWithParent) => void;
+	'RestElement:exit'?: (node: TSESTree.RestElement & ASTNodeWithParent) => void;
 	ReturnStatement?: (node: TSESTree.ReturnStatement & ASTNodeWithParent) => void;
+	'ReturnStatement:exit'?: (node: TSESTree.ReturnStatement & ASTNodeWithParent) => void;
 	SequenceExpression?: (node: TSESTree.SequenceExpression & ASTNodeWithParent) => void;
+	'SequenceExpression:exit'?: (node: TSESTree.SequenceExpression & ASTNodeWithParent) => void;
 	SpreadElement?: (node: TSESTree.SpreadElement & ASTNodeWithParent) => void;
+	'SpreadElement:exit'?: (node: TSESTree.SpreadElement & ASTNodeWithParent) => void;
 	StaticBlock?: (node: TSESTree.StaticBlock & ASTNodeWithParent) => void;
+	'StaticBlock:exit'?: (node: TSESTree.StaticBlock & ASTNodeWithParent) => void;
 	Super?: (node: TSESTree.Super & ASTNodeWithParent) => void;
+	'Super:exit'?: (node: TSESTree.Super & ASTNodeWithParent) => void;
 	SwitchCase?: (node: TSESTree.SwitchCase & ASTNodeWithParent) => void;
+	'SwitchCase:exit'?: (node: TSESTree.SwitchCase & ASTNodeWithParent) => void;
 	SwitchStatement?: (node: TSESTree.SwitchStatement & ASTNodeWithParent) => void;
+	'SwitchStatement:exit'?: (node: TSESTree.SwitchStatement & ASTNodeWithParent) => void;
 	TaggedTemplateExpression?: (node: TSESTree.TaggedTemplateExpression & ASTNodeWithParent) => void;
+	'TaggedTemplateExpression:exit'?: (
+		node: TSESTree.TaggedTemplateExpression & ASTNodeWithParent
+	) => void;
 	TemplateElement?: (node: TSESTree.TemplateElement & ASTNodeWithParent) => void;
+	'TemplateElement:exit'?: (node: TSESTree.TemplateElement & ASTNodeWithParent) => void;
 	TemplateLiteral?: (node: TSESTree.TemplateLiteral & ASTNodeWithParent) => void;
+	'TemplateLiteral:exit'?: (node: TSESTree.TemplateLiteral & ASTNodeWithParent) => void;
 	ThisExpression?: (node: TSESTree.ThisExpression & ASTNodeWithParent) => void;
+	'ThisExpression:exit'?: (node: TSESTree.ThisExpression & ASTNodeWithParent) => void;
 	ThrowStatement?: (node: TSESTree.ThrowStatement & ASTNodeWithParent) => void;
+	'ThrowStatement:exit'?: (node: TSESTree.ThrowStatement & ASTNodeWithParent) => void;
 	TryStatement?: (node: TSESTree.TryStatement & ASTNodeWithParent) => void;
+	'TryStatement:exit'?: (node: TSESTree.TryStatement & ASTNodeWithParent) => void;
 	UnaryExpression?: (node: TSESTree.UnaryExpression & ASTNodeWithParent) => void;
+	'UnaryExpression:exit'?: (node: TSESTree.UnaryExpression & ASTNodeWithParent) => void;
 	UpdateExpression?: (node: TSESTree.UpdateExpression & ASTNodeWithParent) => void;
+	'UpdateExpression:exit'?: (node: TSESTree.UpdateExpression & ASTNodeWithParent) => void;
 	VariableDeclaration?: (node: TSESTree.VariableDeclaration & ASTNodeWithParent) => void;
+	'VariableDeclaration:exit'?: (node: TSESTree.VariableDeclaration & ASTNodeWithParent) => void;
 	VariableDeclarator?: (node: TSESTree.VariableDeclarator & ASTNodeWithParent) => void;
+	'VariableDeclarator:exit'?: (node: TSESTree.VariableDeclarator & ASTNodeWithParent) => void;
 	WhileStatement?: (node: TSESTree.WhileStatement & ASTNodeWithParent) => void;
+	'WhileStatement:exit'?: (node: TSESTree.WhileStatement & ASTNodeWithParent) => void;
 	WithStatement?: (node: TSESTree.WithStatement & ASTNodeWithParent) => void;
+	'WithStatement:exit'?: (node: TSESTree.WithStatement & ASTNodeWithParent) => void;
 	YieldExpression?: (node: TSESTree.YieldExpression & ASTNodeWithParent) => void;
+	'YieldExpression:exit'?: (node: TSESTree.YieldExpression & ASTNodeWithParent) => void;
 	TSAbstractAccessorProperty?: (
 		node: TSESTree.TSAbstractAccessorProperty & ASTNodeWithParent
 	) => void;
+	'TSAbstractAccessorProperty:exit'?: (
+		node: TSESTree.TSAbstractAccessorProperty & ASTNodeWithParent
+	) => void;
 	TSAbstractKeyword?: (node: TSESTree.TSAbstractKeyword & ASTNodeWithParent) => void;
+	'TSAbstractKeyword:exit'?: (node: TSESTree.TSAbstractKeyword & ASTNodeWithParent) => void;
 	TSAbstractMethodDefinition?: (
 		node: TSESTree.TSAbstractMethodDefinition & ASTNodeWithParent
 	) => void;
+	'TSAbstractMethodDefinition:exit'?: (
+		node: TSESTree.TSAbstractMethodDefinition & ASTNodeWithParent
+	) => void;
 	TSAbstractPropertyDefinition?: (
 		node: TSESTree.TSAbstractPropertyDefinition & ASTNodeWithParent
 	) => void;
+	'TSAbstractPropertyDefinition:exit'?: (
+		node: TSESTree.TSAbstractPropertyDefinition & ASTNodeWithParent
+	) => void;
 	TSAnyKeyword?: (node: TSESTree.TSAnyKeyword & ASTNodeWithParent) => void;
+	'TSAnyKeyword:exit'?: (node: TSESTree.TSAnyKeyword & ASTNodeWithParent) => void;
 	TSArrayType?: (node: TSESTree.TSArrayType & ASTNodeWithParent) => void;
+	'TSArrayType:exit'?: (node: TSESTree.TSArrayType & ASTNodeWithParent) => void;
 	TSAsExpression?: (node: TSESTree.TSAsExpression & ASTNodeWithParent) => void;
+	'TSAsExpression:exit'?: (node: TSESTree.TSAsExpression & ASTNodeWithParent) => void;
 	TSAsyncKeyword?: (node: TSESTree.TSAsyncKeyword & ASTNodeWithParent) => void;
+	'TSAsyncKeyword:exit'?: (node: TSESTree.TSAsyncKeyword & ASTNodeWithParent) => void;
 	TSBigIntKeyword?: (node: TSESTree.TSBigIntKeyword & ASTNodeWithParent) => void;
+	'TSBigIntKeyword:exit'?: (node: TSESTree.TSBigIntKeyword & ASTNodeWithParent) => void;
 	TSBooleanKeyword?: (node: TSESTree.TSBooleanKeyword & ASTNodeWithParent) => void;
+	'TSBooleanKeyword:exit'?: (node: TSESTree.TSBooleanKeyword & ASTNodeWithParent) => void;
 	TSCallSignatureDeclaration?: (
 		node: TSESTree.TSCallSignatureDeclaration & ASTNodeWithParent
 	) => void;
+	'TSCallSignatureDeclaration:exit'?: (
+		node: TSESTree.TSCallSignatureDeclaration & ASTNodeWithParent
+	) => void;
 	TSClassImplements?: (node: TSESTree.TSClassImplements & ASTNodeWithParent) => void;
+	'TSClassImplements:exit'?: (node: TSESTree.TSClassImplements & ASTNodeWithParent) => void;
 	TSConditionalType?: (node: TSESTree.TSConditionalType & ASTNodeWithParent) => void;
+	'TSConditionalType:exit'?: (node: TSESTree.TSConditionalType & ASTNodeWithParent) => void;
 	TSConstructorType?: (node: TSESTree.TSConstructorType & ASTNodeWithParent) => void;
+	'TSConstructorType:exit'?: (node: TSESTree.TSConstructorType & ASTNodeWithParent) => void;
 	TSConstructSignatureDeclaration?: (
 		node: TSESTree.TSConstructSignatureDeclaration & ASTNodeWithParent
 	) => void;
+	'TSConstructSignatureDeclaration:exit'?: (
+		node: TSESTree.TSConstructSignatureDeclaration & ASTNodeWithParent
+	) => void;
 	TSDeclareFunction?: (node: TSESTree.TSDeclareFunction & ASTNodeWithParent) => void;
+	'TSDeclareFunction:exit'?: (node: TSESTree.TSDeclareFunction & ASTNodeWithParent) => void;
 	TSDeclareKeyword?: (node: TSESTree.TSDeclareKeyword & ASTNodeWithParent) => void;
+	'TSDeclareKeyword:exit'?: (node: TSESTree.TSDeclareKeyword & ASTNodeWithParent) => void;
 	TSEmptyBodyFunctionExpression?: (
 		node: TSESTree.TSEmptyBodyFunctionExpression & ASTNodeWithParent
 	) => void;
+	'TSEmptyBodyFunctionExpression:exit'?: (
+		node: TSESTree.TSEmptyBodyFunctionExpression & ASTNodeWithParent
+	) => void;
 	TSEnumBody?: (node: TSESTree.TSEnumBody & ASTNodeWithParent) => void;
+	'TSEnumBody:exit'?: (node: TSESTree.TSEnumBody & ASTNodeWithParent) => void;
 	TSEnumDeclaration?: (node: TSESTree.TSEnumDeclaration & ASTNodeWithParent) => void;
+	'TSEnumDeclaration:exit'?: (node: TSESTree.TSEnumDeclaration & ASTNodeWithParent) => void;
 	TSEnumMember?: (node: TSESTree.TSEnumMember & ASTNodeWithParent) => void;
+	'TSEnumMember:exit'?: (node: TSESTree.TSEnumMember & ASTNodeWithParent) => void;
 	TSExportAssignment?: (node: TSESTree.TSExportAssignment & ASTNodeWithParent) => void;
+	'TSExportAssignment:exit'?: (node: TSESTree.TSExportAssignment & ASTNodeWithParent) => void;
 	TSExportKeyword?: (node: TSESTree.TSExportKeyword & ASTNodeWithParent) => void;
+	'TSExportKeyword:exit'?: (node: TSESTree.TSExportKeyword & ASTNodeWithParent) => void;
 	TSExternalModuleReference?: (
 		node: TSESTree.TSExternalModuleReference & ASTNodeWithParent
 	) => void;
+	'TSExternalModuleReference:exit'?: (
+		node: TSESTree.TSExternalModuleReference & ASTNodeWithParent
+	) => void;
 	TSFunctionType?: (node: TSESTree.TSFunctionType & ASTNodeWithParent) => void;
+	'TSFunctionType:exit'?: (node: TSESTree.TSFunctionType & ASTNodeWithParent) => void;
 	TSImportEqualsDeclaration?: (
 		node: TSESTree.TSImportEqualsDeclaration & ASTNodeWithParent
 	) => void;
+	'TSImportEqualsDeclaration:exit'?: (
+		node: TSESTree.TSImportEqualsDeclaration & ASTNodeWithParent
+	) => void;
 	TSImportType?: (node: TSESTree.TSImportType & ASTNodeWithParent) => void;
+	'TSImportType:exit'?: (node: TSESTree.TSImportType & ASTNodeWithParent) => void;
 	TSIndexedAccessType?: (node: TSESTree.TSIndexedAccessType & ASTNodeWithParent) => void;
+	'TSIndexedAccessType:exit'?: (node: TSESTree.TSIndexedAccessType & ASTNodeWithParent) => void;
 	TSIndexSignature?: (node: TSESTree.TSIndexSignature & ASTNodeWithParent) => void;
+	'TSIndexSignature:exit'?: (node: TSESTree.TSIndexSignature & ASTNodeWithParent) => void;
 	TSInferType?: (node: TSESTree.TSInferType & ASTNodeWithParent) => void;
+	'TSInferType:exit'?: (node: TSESTree.TSInferType & ASTNodeWithParent) => void;
 	TSInstantiationExpression?: (
 		node: TSESTree.TSInstantiationExpression & ASTNodeWithParent
 	) => void;
+	'TSInstantiationExpression:exit'?: (
+		node: TSESTree.TSInstantiationExpression & ASTNodeWithParent
+	) => void;
 	TSInterfaceBody?: (node: TSESTree.TSInterfaceBody & ASTNodeWithParent) => void;
+	'TSInterfaceBody:exit'?: (node: TSESTree.TSInterfaceBody & ASTNodeWithParent) => void;
 	TSInterfaceDeclaration?: (node: TSESTree.TSInterfaceDeclaration & ASTNodeWithParent) => void;
+	'TSInterfaceDeclaration:exit'?: (
+		node: TSESTree.TSInterfaceDeclaration & ASTNodeWithParent
+	) => void;
 	TSInterfaceHeritage?: (node: TSESTree.TSInterfaceHeritage & ASTNodeWithParent) => void;
+	'TSInterfaceHeritage:exit'?: (node: TSESTree.TSInterfaceHeritage & ASTNodeWithParent) => void;
 	TSIntersectionType?: (node: TSESTree.TSIntersectionType & ASTNodeWithParent) => void;
+	'TSIntersectionType:exit'?: (node: TSESTree.TSIntersectionType & ASTNodeWithParent) => void;
 	TSIntrinsicKeyword?: (
 		node: TSESTree.Node & { type: AST_NODE_TYPES.TSIntrinsicKeyword } & ASTNodeWithParent
 	) => void;
+	'TSIntrinsicKeyword:exit'?: (
+		node: TSESTree.Node & { type: AST_NODE_TYPES.TSIntrinsicKeyword } & ASTNodeWithParent
+	) => void;
 	TSLiteralType?: (node: TSESTree.TSLiteralType & ASTNodeWithParent) => void;
+	'TSLiteralType:exit'?: (node: TSESTree.TSLiteralType & ASTNodeWithParent) => void;
 	TSMappedType?: (node: TSESTree.TSMappedType & ASTNodeWithParent) => void;
+	'TSMappedType:exit'?: (node: TSESTree.TSMappedType & ASTNodeWithParent) => void;
 	TSMethodSignature?: (node: TSESTree.TSMethodSignature & ASTNodeWithParent) => void;
+	'TSMethodSignature:exit'?: (node: TSESTree.TSMethodSignature & ASTNodeWithParent) => void;
 	TSModuleBlock?: (node: TSESTree.TSModuleBlock & ASTNodeWithParent) => void;
+	'TSModuleBlock:exit'?: (node: TSESTree.TSModuleBlock & ASTNodeWithParent) => void;
 	TSModuleDeclaration?: (node: TSESTree.TSModuleDeclaration & ASTNodeWithParent) => void;
+	'TSModuleDeclaration:exit'?: (node: TSESTree.TSModuleDeclaration & ASTNodeWithParent) => void;
 	TSNamedTupleMember?: (node: TSESTree.TSNamedTupleMember & ASTNodeWithParent) => void;
+	'TSNamedTupleMember:exit'?: (node: TSESTree.TSNamedTupleMember & ASTNodeWithParent) => void;
 	TSNamespaceExportDeclaration?: (
 		node: TSESTree.TSNamespaceExportDeclaration & ASTNodeWithParent
 	) => void;
+	'TSNamespaceExportDeclaration:exit'?: (
+		node: TSESTree.TSNamespaceExportDeclaration & ASTNodeWithParent
+	) => void;
 	TSNeverKeyword?: (node: TSESTree.TSNeverKeyword & ASTNodeWithParent) => void;
+	'TSNeverKeyword:exit'?: (node: TSESTree.TSNeverKeyword & ASTNodeWithParent) => void;
 	TSNonNullExpression?: (node: TSESTree.TSNonNullExpression & ASTNodeWithParent) => void;
+	'TSNonNullExpression:exit'?: (node: TSESTree.TSNonNullExpression & ASTNodeWithParent) => void;
 	TSNullKeyword?: (node: TSESTree.TSNullKeyword & ASTNodeWithParent) => void;
+	'TSNullKeyword:exit'?: (node: TSESTree.TSNullKeyword & ASTNodeWithParent) => void;
 	TSNumberKeyword?: (node: TSESTree.TSNumberKeyword & ASTNodeWithParent) => void;
+	'TSNumberKeyword:exit'?: (node: TSESTree.TSNumberKeyword & ASTNodeWithParent) => void;
 	TSObjectKeyword?: (node: TSESTree.TSObjectKeyword & ASTNodeWithParent) => void;
+	'TSObjectKeyword:exit'?: (node: TSESTree.TSObjectKeyword & ASTNodeWithParent) => void;
 	TSOptionalType?: (node: TSESTree.TSOptionalType & ASTNodeWithParent) => void;
+	'TSOptionalType:exit'?: (node: TSESTree.TSOptionalType & ASTNodeWithParent) => void;
 	TSParameterProperty?: (node: TSESTree.TSParameterProperty & ASTNodeWithParent) => void;
+	'TSParameterProperty:exit'?: (node: TSESTree.TSParameterProperty & ASTNodeWithParent) => void;
 	TSPrivateKeyword?: (node: TSESTree.TSPrivateKeyword & ASTNodeWithParent) => void;
+	'TSPrivateKeyword:exit'?: (node: TSESTree.TSPrivateKeyword & ASTNodeWithParent) => void;
 	TSPropertySignature?: (node: TSESTree.TSPropertySignature & ASTNodeWithParent) => void;
+	'TSPropertySignature:exit'?: (node: TSESTree.TSPropertySignature & ASTNodeWithParent) => void;
 	TSProtectedKeyword?: (node: TSESTree.TSProtectedKeyword & ASTNodeWithParent) => void;
+	'TSProtectedKeyword:exit'?: (node: TSESTree.TSProtectedKeyword & ASTNodeWithParent) => void;
 	TSPublicKeyword?: (node: TSESTree.TSPublicKeyword & ASTNodeWithParent) => void;
+	'TSPublicKeyword:exit'?: (node: TSESTree.TSPublicKeyword & ASTNodeWithParent) => void;
 	TSQualifiedName?: (node: TSESTree.TSQualifiedName & ASTNodeWithParent) => void;
+	'TSQualifiedName:exit'?: (node: TSESTree.TSQualifiedName & ASTNodeWithParent) => void;
 	TSReadonlyKeyword?: (node: TSESTree.TSReadonlyKeyword & ASTNodeWithParent) => void;
+	'TSReadonlyKeyword:exit'?: (node: TSESTree.TSReadonlyKeyword & ASTNodeWithParent) => void;
 	TSRestType?: (node: TSESTree.TSRestType & ASTNodeWithParent) => void;
+	'TSRestType:exit'?: (node: TSESTree.TSRestType & ASTNodeWithParent) => void;
 	TSSatisfiesExpression?: (node: TSESTree.TSSatisfiesExpression & ASTNodeWithParent) => void;
+	'TSSatisfiesExpression:exit'?: (node: TSESTree.TSSatisfiesExpression & ASTNodeWithParent) => void;
 	TSStaticKeyword?: (node: TSESTree.TSStaticKeyword & ASTNodeWithParent) => void;
+	'TSStaticKeyword:exit'?: (node: TSESTree.TSStaticKeyword & ASTNodeWithParent) => void;
 	TSStringKeyword?: (node: TSESTree.TSStringKeyword & ASTNodeWithParent) => void;
+	'TSStringKeyword:exit'?: (node: TSESTree.TSStringKeyword & ASTNodeWithParent) => void;
 	TSSymbolKeyword?: (node: TSESTree.TSSymbolKeyword & ASTNodeWithParent) => void;
+	'TSSymbolKeyword:exit'?: (node: TSESTree.TSSymbolKeyword & ASTNodeWithParent) => void;
 	TSTemplateLiteralType?: (node: TSESTree.TSTemplateLiteralType & ASTNodeWithParent) => void;
+	'TSTemplateLiteralType:exit'?: (node: TSESTree.TSTemplateLiteralType & ASTNodeWithParent) => void;
 	TSThisType?: (node: TSESTree.TSThisType & ASTNodeWithParent) => void;
+	'TSThisType:exit'?: (node: TSESTree.TSThisType & ASTNodeWithParent) => void;
 	TSTupleType?: (node: TSESTree.TSTupleType & ASTNodeWithParent) => void;
+	'TSTupleType:exit'?: (node: TSESTree.TSTupleType & ASTNodeWithParent) => void;
 	TSTypeAliasDeclaration?: (node: TSESTree.TSTypeAliasDeclaration & ASTNodeWithParent) => void;
+	'TSTypeAliasDeclaration:exit'?: (
+		node: TSESTree.TSTypeAliasDeclaration & ASTNodeWithParent
+	) => void;
 	TSTypeAnnotation?: (node: TSESTree.TSTypeAnnotation & ASTNodeWithParent) => void;
+	'TSTypeAnnotation:exit'?: (node: TSESTree.TSTypeAnnotation & ASTNodeWithParent) => void;
 	TSTypeAssertion?: (node: TSESTree.TSTypeAssertion & ASTNodeWithParent) => void;
+	'TSTypeAssertion:exit'?: (node: TSESTree.TSTypeAssertion & ASTNodeWithParent) => void;
 	TSTypeLiteral?: (node: TSESTree.TSTypeLiteral & ASTNodeWithParent) => void;
+	'TSTypeLiteral:exit'?: (node: TSESTree.TSTypeLiteral & ASTNodeWithParent) => void;
 	TSTypeOperator?: (node: TSESTree.TSTypeOperator & ASTNodeWithParent) => void;
+	'TSTypeOperator:exit'?: (node: TSESTree.TSTypeOperator & ASTNodeWithParent) => void;
 	TSTypeParameter?: (node: TSESTree.TSTypeParameter & ASTNodeWithParent) => void;
+	'TSTypeParameter:exit'?: (node: TSESTree.TSTypeParameter & ASTNodeWithParent) => void;
 	TSTypeParameterDeclaration?: (
 		node: TSESTree.TSTypeParameterDeclaration & ASTNodeWithParent
 	) => void;
+	'TSTypeParameterDeclaration:exit'?: (
+		node: TSESTree.TSTypeParameterDeclaration & ASTNodeWithParent
+	) => void;
 	TSTypeParameterInstantiation?: (
 		node: TSESTree.TSTypeParameterInstantiation & ASTNodeWithParent
 	) => void;
+	'TSTypeParameterInstantiation:exit'?: (
+		node: TSESTree.TSTypeParameterInstantiation & ASTNodeWithParent
+	) => void;
 	TSTypePredicate?: (node: TSESTree.TSTypePredicate & ASTNodeWithParent) => void;
+	'TSTypePredicate:exit'?: (node: TSESTree.TSTypePredicate & ASTNodeWithParent) => void;
 	TSTypeQuery?: (node: TSESTree.TSTypeQuery & ASTNodeWithParent) => void;
+	'TSTypeQuery:exit'?: (node: TSESTree.TSTypeQuery & ASTNodeWithParent) => void;
 	TSTypeReference?: (node: TSESTree.TSTypeReference & ASTNodeWithParent) => void;
+	'TSTypeReference:exit'?: (node: TSESTree.TSTypeReference & ASTNodeWithParent) => void;
 	TSUndefinedKeyword?: (node: TSESTree.TSUndefinedKeyword & ASTNodeWithParent) => void;
+	'TSUndefinedKeyword:exit'?: (node: TSESTree.TSUndefinedKeyword & ASTNodeWithParent) => void;
 	TSUnionType?: (node: TSESTree.TSUnionType & ASTNodeWithParent) => void;
+	'TSUnionType:exit'?: (node: TSESTree.TSUnionType & ASTNodeWithParent) => void;
 	TSUnknownKeyword?: (node: TSESTree.TSUnknownKeyword & ASTNodeWithParent) => void;
+	'TSUnknownKeyword:exit'?: (node: TSESTree.TSUnknownKeyword & ASTNodeWithParent) => void;
 	TSVoidKeyword?: (node: TSESTree.TSVoidKeyword & ASTNodeWithParent) => void;
+	'TSVoidKeyword:exit'?: (node: TSESTree.TSVoidKeyword & ASTNodeWithParent) => void;
 	Program?: (node: AST.SvelteProgram & ASTNodeWithParent) => void;
+	'Program:exit'?: (node: AST.SvelteProgram & ASTNodeWithParent) => void;
 	SvelteScriptElement?: (node: AST.SvelteScriptElement & ASTNodeWithParent) => void;
+	'SvelteScriptElement:exit'?: (node: AST.SvelteScriptElement & ASTNodeWithParent) => void;
 	SvelteStyleElement?: (node: AST.SvelteStyleElement & ASTNodeWithParent) => void;
+	'SvelteStyleElement:exit'?: (node: AST.SvelteStyleElement & ASTNodeWithParent) => void;
 	SvelteElement?: (node: AST.SvelteElement & ASTNodeWithParent) => void;
+	'SvelteElement:exit'?: (node: AST.SvelteElement & ASTNodeWithParent) => void;
 	SvelteStartTag?: (node: AST.SvelteStartTag & ASTNodeWithParent) => void;
+	'SvelteStartTag:exit'?: (node: AST.SvelteStartTag & ASTNodeWithParent) => void;
 	SvelteEndTag?: (node: AST.SvelteEndTag & ASTNodeWithParent) => void;
+	'SvelteEndTag:exit'?: (node: AST.SvelteEndTag & ASTNodeWithParent) => void;
 	SvelteName?: (node: AST.SvelteName & ASTNodeWithParent) => void;
+	'SvelteName:exit'?: (node: AST.SvelteName & ASTNodeWithParent) => void;
 	SvelteMemberExpressionName?: (node: AST.SvelteMemberExpressionName & ASTNodeWithParent) => void;
+	'SvelteMemberExpressionName:exit'?: (
+		node: AST.SvelteMemberExpressionName & ASTNodeWithParent
+	) => void;
 	SvelteLiteral?: (node: AST.SvelteLiteral & ASTNodeWithParent) => void;
+	'SvelteLiteral:exit'?: (node: AST.SvelteLiteral & ASTNodeWithParent) => void;
 	SvelteMustacheTag?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
+	'SvelteMustacheTag:exit'?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
 	SvelteDebugTag?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
+	'SvelteDebugTag:exit'?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
 	SvelteConstTag?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
+	'SvelteConstTag:exit'?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
 	SvelteRenderTag?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
+	'SvelteRenderTag:exit'?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
 	SvelteIfBlock?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
+	'SvelteIfBlock:exit'?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
 	SvelteElseBlock?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
+	'SvelteElseBlock:exit'?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
 	SvelteEachBlock?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
+	'SvelteEachBlock:exit'?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
 	SvelteAwaitBlock?: (node: AST.SvelteAwaitBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitBlock:exit'?: (node: AST.SvelteAwaitBlock & ASTNodeWithParent) => void;
 	SvelteAwaitPendingBlock?: (node: AST.SvelteAwaitPendingBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitPendingBlock:exit'?: (node: AST.SvelteAwaitPendingBlock & ASTNodeWithParent) => void;
 	SvelteAwaitThenBlock?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitThenBlock:exit'?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
 	SvelteAwaitCatchBlock?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitCatchBlock:exit'?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
 	SvelteKeyBlock?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
+	'SvelteKeyBlock:exit'?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
 	SvelteSnippetBlock?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
+	'SvelteSnippetBlock:exit'?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
 	SvelteAttribute?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
+	'SvelteAttribute:exit'?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
 	SvelteShorthandAttribute?: (node: AST.SvelteShorthandAttribute & ASTNodeWithParent) => void;
+	'SvelteShorthandAttribute:exit'?: (
+		node: AST.SvelteShorthandAttribute & ASTNodeWithParent
+	) => void;
 	SvelteSpreadAttribute?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;
+	'SvelteSpreadAttribute:exit'?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;
 	SvelteDirective?: (node: AST.SvelteDirective & ASTNodeWithParent) => void;
+	'SvelteDirective:exit'?: (node: AST.SvelteDirective & ASTNodeWithParent) => void;
 	SvelteStyleDirective?: (node: AST.SvelteStyleDirective & ASTNodeWithParent) => void;
+	'SvelteStyleDirective:exit'?: (node: AST.SvelteStyleDirective & ASTNodeWithParent) => void;
 	SvelteSpecialDirective?: (node: AST.SvelteSpecialDirective & ASTNodeWithParent) => void;
+	'SvelteSpecialDirective:exit'?: (node: AST.SvelteSpecialDirective & ASTNodeWithParent) => void;
 	SvelteGenericsDirective?: (node: AST.SvelteGenericsDirective & ASTNodeWithParent) => void;
+	'SvelteGenericsDirective:exit'?: (node: AST.SvelteGenericsDirective & ASTNodeWithParent) => void;
 	SvelteDirectiveKey?: (node: AST.SvelteDirectiveKey & ASTNodeWithParent) => void;
+	'SvelteDirectiveKey:exit'?: (node: AST.SvelteDirectiveKey & ASTNodeWithParent) => void;
 	SvelteSpecialDirectiveKey?: (node: AST.SvelteSpecialDirectiveKey & ASTNodeWithParent) => void;
+	'SvelteSpecialDirectiveKey:exit'?: (
+		node: AST.SvelteSpecialDirectiveKey & ASTNodeWithParent
+	) => void;
 	SvelteText?: (node: AST.SvelteText & ASTNodeWithParent) => void;
+	'SvelteText:exit'?: (node: AST.SvelteText & ASTNodeWithParent) => void;
 	SvelteHTMLComment?: (node: AST.SvelteHTMLComment & ASTNodeWithParent) => void;
+	'SvelteHTMLComment:exit'?: (node: AST.SvelteHTMLComment & ASTNodeWithParent) => void;
 	SvelteReactiveStatement?: (node: AST.SvelteReactiveStatement & ASTNodeWithParent) => void;
+	'SvelteReactiveStatement:exit'?: (node: AST.SvelteReactiveStatement & ASTNodeWithParent) => void;
 };
 
 export type ESNodeListener = {
 	AccessorProperty?: (node: TSESTree.AccessorProperty & ASTNodeWithParent) => void;
+	'AccessorProperty:exit'?: (node: TSESTree.AccessorProperty & ASTNodeWithParent) => void;
 	ArrayExpression?: (node: TSESTree.ArrayExpression & ASTNodeWithParent) => void;
+	'ArrayExpression:exit'?: (node: TSESTree.ArrayExpression & ASTNodeWithParent) => void;
 	ArrayPattern?: (node: TSESTree.ArrayPattern & ASTNodeWithParent) => void;
+	'ArrayPattern:exit'?: (node: TSESTree.ArrayPattern & ASTNodeWithParent) => void;
 	ArrowFunctionExpression?: (node: TSESTree.ArrowFunctionExpression & ASTNodeWithParent) => void;
+	'ArrowFunctionExpression:exit'?: (
+		node: TSESTree.ArrowFunctionExpression & ASTNodeWithParent
+	) => void;
 	AssignmentExpression?: (node: TSESTree.AssignmentExpression & ASTNodeWithParent) => void;
+	'AssignmentExpression:exit'?: (node: TSESTree.AssignmentExpression & ASTNodeWithParent) => void;
 	AssignmentPattern?: (node: TSESTree.AssignmentPattern & ASTNodeWithParent) => void;
+	'AssignmentPattern:exit'?: (node: TSESTree.AssignmentPattern & ASTNodeWithParent) => void;
 	AwaitExpression?: (node: TSESTree.AwaitExpression & ASTNodeWithParent) => void;
+	'AwaitExpression:exit'?: (node: TSESTree.AwaitExpression & ASTNodeWithParent) => void;
 	BinaryExpression?: (node: TSESTree.BinaryExpression & ASTNodeWithParent) => void;
+	'BinaryExpression:exit'?: (node: TSESTree.BinaryExpression & ASTNodeWithParent) => void;
 	BlockStatement?: (node: TSESTree.BlockStatement & ASTNodeWithParent) => void;
+	'BlockStatement:exit'?: (node: TSESTree.BlockStatement & ASTNodeWithParent) => void;
 	BreakStatement?: (node: TSESTree.BreakStatement & ASTNodeWithParent) => void;
+	'BreakStatement:exit'?: (node: TSESTree.BreakStatement & ASTNodeWithParent) => void;
 	CallExpression?: (node: TSESTree.CallExpression & ASTNodeWithParent) => void;
+	'CallExpression:exit'?: (node: TSESTree.CallExpression & ASTNodeWithParent) => void;
 	CatchClause?: (node: TSESTree.CatchClause & ASTNodeWithParent) => void;
+	'CatchClause:exit'?: (node: TSESTree.CatchClause & ASTNodeWithParent) => void;
 	ChainExpression?: (node: TSESTree.ChainExpression & ASTNodeWithParent) => void;
+	'ChainExpression:exit'?: (node: TSESTree.ChainExpression & ASTNodeWithParent) => void;
 	ClassBody?: (node: TSESTree.ClassBody & ASTNodeWithParent) => void;
+	'ClassBody:exit'?: (node: TSESTree.ClassBody & ASTNodeWithParent) => void;
 	ClassDeclaration?: (node: TSESTree.ClassDeclaration & ASTNodeWithParent) => void;
+	'ClassDeclaration:exit'?: (node: TSESTree.ClassDeclaration & ASTNodeWithParent) => void;
 	ClassExpression?: (node: TSESTree.ClassExpression & ASTNodeWithParent) => void;
+	'ClassExpression:exit'?: (node: TSESTree.ClassExpression & ASTNodeWithParent) => void;
 	ConditionalExpression?: (node: TSESTree.ConditionalExpression & ASTNodeWithParent) => void;
+	'ConditionalExpression:exit'?: (node: TSESTree.ConditionalExpression & ASTNodeWithParent) => void;
 	ContinueStatement?: (node: TSESTree.ContinueStatement & ASTNodeWithParent) => void;
+	'ContinueStatement:exit'?: (node: TSESTree.ContinueStatement & ASTNodeWithParent) => void;
 	DebuggerStatement?: (node: TSESTree.DebuggerStatement & ASTNodeWithParent) => void;
+	'DebuggerStatement:exit'?: (node: TSESTree.DebuggerStatement & ASTNodeWithParent) => void;
 	DoWhileStatement?: (node: TSESTree.DoWhileStatement & ASTNodeWithParent) => void;
+	'DoWhileStatement:exit'?: (node: TSESTree.DoWhileStatement & ASTNodeWithParent) => void;
 	EmptyStatement?: (node: TSESTree.EmptyStatement & ASTNodeWithParent) => void;
+	'EmptyStatement:exit'?: (node: TSESTree.EmptyStatement & ASTNodeWithParent) => void;
 	ExportAllDeclaration?: (node: TSESTree.ExportAllDeclaration & ASTNodeWithParent) => void;
+	'ExportAllDeclaration:exit'?: (node: TSESTree.ExportAllDeclaration & ASTNodeWithParent) => void;
 	ExportDefaultDeclaration?: (node: TSESTree.ExportDefaultDeclaration & ASTNodeWithParent) => void;
+	'ExportDefaultDeclaration:exit'?: (
+		node: TSESTree.ExportDefaultDeclaration & ASTNodeWithParent
+	) => void;
 	ExportNamedDeclaration?: (node: TSESTree.ExportNamedDeclaration & ASTNodeWithParent) => void;
+	'ExportNamedDeclaration:exit'?: (
+		node: TSESTree.ExportNamedDeclaration & ASTNodeWithParent
+	) => void;
 	ExportSpecifier?: (node: TSESTree.ExportSpecifier & ASTNodeWithParent) => void;
+	'ExportSpecifier:exit'?: (node: TSESTree.ExportSpecifier & ASTNodeWithParent) => void;
 	ExpressionStatement?: (node: TSESTree.ExpressionStatement & ASTNodeWithParent) => void;
+	'ExpressionStatement:exit'?: (node: TSESTree.ExpressionStatement & ASTNodeWithParent) => void;
 	ForInStatement?: (node: TSESTree.ForInStatement & ASTNodeWithParent) => void;
+	'ForInStatement:exit'?: (node: TSESTree.ForInStatement & ASTNodeWithParent) => void;
 	ForOfStatement?: (node: TSESTree.ForOfStatement & ASTNodeWithParent) => void;
+	'ForOfStatement:exit'?: (node: TSESTree.ForOfStatement & ASTNodeWithParent) => void;
 	ForStatement?: (node: TSESTree.ForStatement & ASTNodeWithParent) => void;
+	'ForStatement:exit'?: (node: TSESTree.ForStatement & ASTNodeWithParent) => void;
 	FunctionDeclaration?: (node: TSESTree.FunctionDeclaration & ASTNodeWithParent) => void;
+	'FunctionDeclaration:exit'?: (node: TSESTree.FunctionDeclaration & ASTNodeWithParent) => void;
 	FunctionExpression?: (node: TSESTree.FunctionExpression & ASTNodeWithParent) => void;
+	'FunctionExpression:exit'?: (node: TSESTree.FunctionExpression & ASTNodeWithParent) => void;
 	Identifier?: (node: TSESTree.Identifier & ASTNodeWithParent) => void;
+	'Identifier:exit'?: (node: TSESTree.Identifier & ASTNodeWithParent) => void;
 	IfStatement?: (node: TSESTree.IfStatement & ASTNodeWithParent) => void;
+	'IfStatement:exit'?: (node: TSESTree.IfStatement & ASTNodeWithParent) => void;
 	ImportDeclaration?: (node: TSESTree.ImportDeclaration & ASTNodeWithParent) => void;
+	'ImportDeclaration:exit'?: (node: TSESTree.ImportDeclaration & ASTNodeWithParent) => void;
 	ImportDefaultSpecifier?: (node: TSESTree.ImportDefaultSpecifier & ASTNodeWithParent) => void;
+	'ImportDefaultSpecifier:exit'?: (
+		node: TSESTree.ImportDefaultSpecifier & ASTNodeWithParent
+	) => void;
 	ImportExpression?: (node: TSESTree.ImportExpression & ASTNodeWithParent) => void;
+	'ImportExpression:exit'?: (node: TSESTree.ImportExpression & ASTNodeWithParent) => void;
 	ImportNamespaceSpecifier?: (node: TSESTree.ImportNamespaceSpecifier & ASTNodeWithParent) => void;
+	'ImportNamespaceSpecifier:exit'?: (
+		node: TSESTree.ImportNamespaceSpecifier & ASTNodeWithParent
+	) => void;
 	ImportSpecifier?: (node: TSESTree.ImportSpecifier & ASTNodeWithParent) => void;
+	'ImportSpecifier:exit'?: (node: TSESTree.ImportSpecifier & ASTNodeWithParent) => void;
 	LabeledStatement?: (node: TSESTree.LabeledStatement & ASTNodeWithParent) => void;
+	'LabeledStatement:exit'?: (node: TSESTree.LabeledStatement & ASTNodeWithParent) => void;
 	Literal?: (node: TSESTree.Literal & ASTNodeWithParent) => void;
+	'Literal:exit'?: (node: TSESTree.Literal & ASTNodeWithParent) => void;
 	LogicalExpression?: (node: TSESTree.LogicalExpression & ASTNodeWithParent) => void;
+	'LogicalExpression:exit'?: (node: TSESTree.LogicalExpression & ASTNodeWithParent) => void;
 	MemberExpression?: (node: TSESTree.MemberExpression & ASTNodeWithParent) => void;
+	'MemberExpression:exit'?: (node: TSESTree.MemberExpression & ASTNodeWithParent) => void;
 	MetaProperty?: (node: TSESTree.MetaProperty & ASTNodeWithParent) => void;
+	'MetaProperty:exit'?: (node: TSESTree.MetaProperty & ASTNodeWithParent) => void;
 	MethodDefinition?: (node: TSESTree.MethodDefinition & ASTNodeWithParent) => void;
+	'MethodDefinition:exit'?: (node: TSESTree.MethodDefinition & ASTNodeWithParent) => void;
 	NewExpression?: (node: TSESTree.NewExpression & ASTNodeWithParent) => void;
+	'NewExpression:exit'?: (node: TSESTree.NewExpression & ASTNodeWithParent) => void;
 	ObjectExpression?: (node: TSESTree.ObjectExpression & ASTNodeWithParent) => void;
+	'ObjectExpression:exit'?: (node: TSESTree.ObjectExpression & ASTNodeWithParent) => void;
 	ObjectPattern?: (node: TSESTree.ObjectPattern & ASTNodeWithParent) => void;
+	'ObjectPattern:exit'?: (node: TSESTree.ObjectPattern & ASTNodeWithParent) => void;
 	PrivateIdentifier?: (node: TSESTree.PrivateIdentifier & ASTNodeWithParent) => void;
+	'PrivateIdentifier:exit'?: (node: TSESTree.PrivateIdentifier & ASTNodeWithParent) => void;
 	Property?: (node: TSESTree.Property & ASTNodeWithParent) => void;
+	'Property:exit'?: (node: TSESTree.Property & ASTNodeWithParent) => void;
 	PropertyDefinition?: (node: TSESTree.PropertyDefinition & ASTNodeWithParent) => void;
+	'PropertyDefinition:exit'?: (node: TSESTree.PropertyDefinition & ASTNodeWithParent) => void;
 	RestElement?: (node: TSESTree.RestElement & ASTNodeWithParent) => void;
+	'RestElement:exit'?: (node: TSESTree.RestElement & ASTNodeWithParent) => void;
 	ReturnStatement?: (node: TSESTree.ReturnStatement & ASTNodeWithParent) => void;
+	'ReturnStatement:exit'?: (node: TSESTree.ReturnStatement & ASTNodeWithParent) => void;
 	SequenceExpression?: (node: TSESTree.SequenceExpression & ASTNodeWithParent) => void;
+	'SequenceExpression:exit'?: (node: TSESTree.SequenceExpression & ASTNodeWithParent) => void;
 	SpreadElement?: (node: TSESTree.SpreadElement & ASTNodeWithParent) => void;
+	'SpreadElement:exit'?: (node: TSESTree.SpreadElement & ASTNodeWithParent) => void;
 	Super?: (node: TSESTree.Super & ASTNodeWithParent) => void;
+	'Super:exit'?: (node: TSESTree.Super & ASTNodeWithParent) => void;
 	SwitchCase?: (node: TSESTree.SwitchCase & ASTNodeWithParent) => void;
+	'SwitchCase:exit'?: (node: TSESTree.SwitchCase & ASTNodeWithParent) => void;
 	SwitchStatement?: (node: TSESTree.SwitchStatement & ASTNodeWithParent) => void;
+	'SwitchStatement:exit'?: (node: TSESTree.SwitchStatement & ASTNodeWithParent) => void;
 	TaggedTemplateExpression?: (node: TSESTree.TaggedTemplateExpression & ASTNodeWithParent) => void;
+	'TaggedTemplateExpression:exit'?: (
+		node: TSESTree.TaggedTemplateExpression & ASTNodeWithParent
+	) => void;
 	TemplateElement?: (node: TSESTree.TemplateElement & ASTNodeWithParent) => void;
+	'TemplateElement:exit'?: (node: TSESTree.TemplateElement & ASTNodeWithParent) => void;
 	TemplateLiteral?: (node: TSESTree.TemplateLiteral & ASTNodeWithParent) => void;
+	'TemplateLiteral:exit'?: (node: TSESTree.TemplateLiteral & ASTNodeWithParent) => void;
 	ThisExpression?: (node: TSESTree.ThisExpression & ASTNodeWithParent) => void;
+	'ThisExpression:exit'?: (node: TSESTree.ThisExpression & ASTNodeWithParent) => void;
 	ThrowStatement?: (node: TSESTree.ThrowStatement & ASTNodeWithParent) => void;
+	'ThrowStatement:exit'?: (node: TSESTree.ThrowStatement & ASTNodeWithParent) => void;
 	TryStatement?: (node: TSESTree.TryStatement & ASTNodeWithParent) => void;
+	'TryStatement:exit'?: (node: TSESTree.TryStatement & ASTNodeWithParent) => void;
 	UnaryExpression?: (node: TSESTree.UnaryExpression & ASTNodeWithParent) => void;
+	'UnaryExpression:exit'?: (node: TSESTree.UnaryExpression & ASTNodeWithParent) => void;
 	UpdateExpression?: (node: TSESTree.UpdateExpression & ASTNodeWithParent) => void;
+	'UpdateExpression:exit'?: (node: TSESTree.UpdateExpression & ASTNodeWithParent) => void;
 	VariableDeclaration?: (node: TSESTree.VariableDeclaration & ASTNodeWithParent) => void;
+	'VariableDeclaration:exit'?: (node: TSESTree.VariableDeclaration & ASTNodeWithParent) => void;
 	VariableDeclarator?: (node: TSESTree.VariableDeclarator & ASTNodeWithParent) => void;
+	'VariableDeclarator:exit'?: (node: TSESTree.VariableDeclarator & ASTNodeWithParent) => void;
 	WhileStatement?: (node: TSESTree.WhileStatement & ASTNodeWithParent) => void;
+	'WhileStatement:exit'?: (node: TSESTree.WhileStatement & ASTNodeWithParent) => void;
 	WithStatement?: (node: TSESTree.WithStatement & ASTNodeWithParent) => void;
+	'WithStatement:exit'?: (node: TSESTree.WithStatement & ASTNodeWithParent) => void;
 	YieldExpression?: (node: TSESTree.YieldExpression & ASTNodeWithParent) => void;
+	'YieldExpression:exit'?: (node: TSESTree.YieldExpression & ASTNodeWithParent) => void;
 	Program?: (node: AST.SvelteProgram & ASTNodeWithParent) => void;
+	'Program:exit'?: (node: AST.SvelteProgram & ASTNodeWithParent) => void;
 	SvelteReactiveStatement?: (node: AST.SvelteReactiveStatement & ASTNodeWithParent) => void;
+	'SvelteReactiveStatement:exit'?: (node: AST.SvelteReactiveStatement & ASTNodeWithParent) => void;
 };
 
 export type TSNodeListener = {
 	Decorator?: (node: TSESTree.Decorator & ASTNodeWithParent) => void;
+	'Decorator:exit'?: (node: TSESTree.Decorator & ASTNodeWithParent) => void;
 	ImportAttribute?: (node: TSESTree.ImportAttribute & ASTNodeWithParent) => void;
+	'ImportAttribute:exit'?: (node: TSESTree.ImportAttribute & ASTNodeWithParent) => void;
 	StaticBlock?: (node: TSESTree.StaticBlock & ASTNodeWithParent) => void;
+	'StaticBlock:exit'?: (node: TSESTree.StaticBlock & ASTNodeWithParent) => void;
 	TSAbstractAccessorProperty?: (
 		node: TSESTree.TSAbstractAccessorProperty & ASTNodeWithParent
 	) => void;
+	'TSAbstractAccessorProperty:exit'?: (
+		node: TSESTree.TSAbstractAccessorProperty & ASTNodeWithParent
+	) => void;
 	TSAbstractKeyword?: (node: TSESTree.TSAbstractKeyword & ASTNodeWithParent) => void;
+	'TSAbstractKeyword:exit'?: (node: TSESTree.TSAbstractKeyword & ASTNodeWithParent) => void;
 	TSAbstractMethodDefinition?: (
 		node: TSESTree.TSAbstractMethodDefinition & ASTNodeWithParent
 	) => void;
+	'TSAbstractMethodDefinition:exit'?: (
+		node: TSESTree.TSAbstractMethodDefinition & ASTNodeWithParent
+	) => void;
 	TSAbstractPropertyDefinition?: (
 		node: TSESTree.TSAbstractPropertyDefinition & ASTNodeWithParent
 	) => void;
+	'TSAbstractPropertyDefinition:exit'?: (
+		node: TSESTree.TSAbstractPropertyDefinition & ASTNodeWithParent
+	) => void;
 	TSAnyKeyword?: (node: TSESTree.TSAnyKeyword & ASTNodeWithParent) => void;
+	'TSAnyKeyword:exit'?: (node: TSESTree.TSAnyKeyword & ASTNodeWithParent) => void;
 	TSArrayType?: (node: TSESTree.TSArrayType & ASTNodeWithParent) => void;
+	'TSArrayType:exit'?: (node: TSESTree.TSArrayType & ASTNodeWithParent) => void;
 	TSAsExpression?: (node: TSESTree.TSAsExpression & ASTNodeWithParent) => void;
+	'TSAsExpression:exit'?: (node: TSESTree.TSAsExpression & ASTNodeWithParent) => void;
 	TSAsyncKeyword?: (node: TSESTree.TSAsyncKeyword & ASTNodeWithParent) => void;
+	'TSAsyncKeyword:exit'?: (node: TSESTree.TSAsyncKeyword & ASTNodeWithParent) => void;
 	TSBigIntKeyword?: (node: TSESTree.TSBigIntKeyword & ASTNodeWithParent) => void;
+	'TSBigIntKeyword:exit'?: (node: TSESTree.TSBigIntKeyword & ASTNodeWithParent) => void;
 	TSBooleanKeyword?: (node: TSESTree.TSBooleanKeyword & ASTNodeWithParent) => void;
+	'TSBooleanKeyword:exit'?: (node: TSESTree.TSBooleanKeyword & ASTNodeWithParent) => void;
 	TSCallSignatureDeclaration?: (
 		node: TSESTree.TSCallSignatureDeclaration & ASTNodeWithParent
 	) => void;
+	'TSCallSignatureDeclaration:exit'?: (
+		node: TSESTree.TSCallSignatureDeclaration & ASTNodeWithParent
+	) => void;
 	TSClassImplements?: (node: TSESTree.TSClassImplements & ASTNodeWithParent) => void;
+	'TSClassImplements:exit'?: (node: TSESTree.TSClassImplements & ASTNodeWithParent) => void;
 	TSConditionalType?: (node: TSESTree.TSConditionalType & ASTNodeWithParent) => void;
+	'TSConditionalType:exit'?: (node: TSESTree.TSConditionalType & ASTNodeWithParent) => void;
 	TSConstructorType?: (node: TSESTree.TSConstructorType & ASTNodeWithParent) => void;
+	'TSConstructorType:exit'?: (node: TSESTree.TSConstructorType & ASTNodeWithParent) => void;
 	TSConstructSignatureDeclaration?: (
 		node: TSESTree.TSConstructSignatureDeclaration & ASTNodeWithParent
 	) => void;
+	'TSConstructSignatureDeclaration:exit'?: (
+		node: TSESTree.TSConstructSignatureDeclaration & ASTNodeWithParent
+	) => void;
 	TSDeclareFunction?: (node: TSESTree.TSDeclareFunction & ASTNodeWithParent) => void;
+	'TSDeclareFunction:exit'?: (node: TSESTree.TSDeclareFunction & ASTNodeWithParent) => void;
 	TSDeclareKeyword?: (node: TSESTree.TSDeclareKeyword & ASTNodeWithParent) => void;
+	'TSDeclareKeyword:exit'?: (node: TSESTree.TSDeclareKeyword & ASTNodeWithParent) => void;
 	TSEmptyBodyFunctionExpression?: (
 		node: TSESTree.TSEmptyBodyFunctionExpression & ASTNodeWithParent
 	) => void;
+	'TSEmptyBodyFunctionExpression:exit'?: (
+		node: TSESTree.TSEmptyBodyFunctionExpression & ASTNodeWithParent
+	) => void;
 	TSEnumBody?: (node: TSESTree.TSEnumBody & ASTNodeWithParent) => void;
+	'TSEnumBody:exit'?: (node: TSESTree.TSEnumBody & ASTNodeWithParent) => void;
 	TSEnumDeclaration?: (node: TSESTree.TSEnumDeclaration & ASTNodeWithParent) => void;
+	'TSEnumDeclaration:exit'?: (node: TSESTree.TSEnumDeclaration & ASTNodeWithParent) => void;
 	TSEnumMember?: (node: TSESTree.TSEnumMember & ASTNodeWithParent) => void;
+	'TSEnumMember:exit'?: (node: TSESTree.TSEnumMember & ASTNodeWithParent) => void;
 	TSExportAssignment?: (node: TSESTree.TSExportAssignment & ASTNodeWithParent) => void;
+	'TSExportAssignment:exit'?: (node: TSESTree.TSExportAssignment & ASTNodeWithParent) => void;
 	TSExportKeyword?: (node: TSESTree.TSExportKeyword & ASTNodeWithParent) => void;
+	'TSExportKeyword:exit'?: (node: TSESTree.TSExportKeyword & ASTNodeWithParent) => void;
 	TSExternalModuleReference?: (
 		node: TSESTree.TSExternalModuleReference & ASTNodeWithParent
 	) => void;
+	'TSExternalModuleReference:exit'?: (
+		node: TSESTree.TSExternalModuleReference & ASTNodeWithParent
+	) => void;
 	TSFunctionType?: (node: TSESTree.TSFunctionType & ASTNodeWithParent) => void;
+	'TSFunctionType:exit'?: (node: TSESTree.TSFunctionType & ASTNodeWithParent) => void;
 	TSImportEqualsDeclaration?: (
 		node: TSESTree.TSImportEqualsDeclaration & ASTNodeWithParent
 	) => void;
+	'TSImportEqualsDeclaration:exit'?: (
+		node: TSESTree.TSImportEqualsDeclaration & ASTNodeWithParent
+	) => void;
 	TSImportType?: (node: TSESTree.TSImportType & ASTNodeWithParent) => void;
+	'TSImportType:exit'?: (node: TSESTree.TSImportType & ASTNodeWithParent) => void;
 	TSIndexedAccessType?: (node: TSESTree.TSIndexedAccessType & ASTNodeWithParent) => void;
+	'TSIndexedAccessType:exit'?: (node: TSESTree.TSIndexedAccessType & ASTNodeWithParent) => void;
 	TSIndexSignature?: (node: TSESTree.TSIndexSignature & ASTNodeWithParent) => void;
+	'TSIndexSignature:exit'?: (node: TSESTree.TSIndexSignature & ASTNodeWithParent) => void;
 	TSInferType?: (node: TSESTree.TSInferType & ASTNodeWithParent) => void;
+	'TSInferType:exit'?: (node: TSESTree.TSInferType & ASTNodeWithParent) => void;
 	TSInstantiationExpression?: (
 		node: TSESTree.TSInstantiationExpression & ASTNodeWithParent
 	) => void;
+	'TSInstantiationExpression:exit'?: (
+		node: TSESTree.TSInstantiationExpression & ASTNodeWithParent
+	) => void;
 	TSInterfaceBody?: (node: TSESTree.TSInterfaceBody & ASTNodeWithParent) => void;
+	'TSInterfaceBody:exit'?: (node: TSESTree.TSInterfaceBody & ASTNodeWithParent) => void;
 	TSInterfaceDeclaration?: (node: TSESTree.TSInterfaceDeclaration & ASTNodeWithParent) => void;
+	'TSInterfaceDeclaration:exit'?: (
+		node: TSESTree.TSInterfaceDeclaration & ASTNodeWithParent
+	) => void;
 	TSInterfaceHeritage?: (node: TSESTree.TSInterfaceHeritage & ASTNodeWithParent) => void;
+	'TSInterfaceHeritage:exit'?: (node: TSESTree.TSInterfaceHeritage & ASTNodeWithParent) => void;
 	TSIntersectionType?: (node: TSESTree.TSIntersectionType & ASTNodeWithParent) => void;
+	'TSIntersectionType:exit'?: (node: TSESTree.TSIntersectionType & ASTNodeWithParent) => void;
 	TSIntrinsicKeyword?: (
 		node: TSESTree.Node & { type: AST_NODE_TYPES.TSIntrinsicKeyword } & ASTNodeWithParent
 	) => void;
+	'TSIntrinsicKeyword:exit'?: (
+		node: TSESTree.Node & { type: AST_NODE_TYPES.TSIntrinsicKeyword } & ASTNodeWithParent
+	) => void;
 	TSLiteralType?: (node: TSESTree.TSLiteralType & ASTNodeWithParent) => void;
+	'TSLiteralType:exit'?: (node: TSESTree.TSLiteralType & ASTNodeWithParent) => void;
 	TSMappedType?: (node: TSESTree.TSMappedType & ASTNodeWithParent) => void;
+	'TSMappedType:exit'?: (node: TSESTree.TSMappedType & ASTNodeWithParent) => void;
 	TSMethodSignature?: (node: TSESTree.TSMethodSignature & ASTNodeWithParent) => void;
+	'TSMethodSignature:exit'?: (node: TSESTree.TSMethodSignature & ASTNodeWithParent) => void;
 	TSModuleBlock?: (node: TSESTree.TSModuleBlock & ASTNodeWithParent) => void;
+	'TSModuleBlock:exit'?: (node: TSESTree.TSModuleBlock & ASTNodeWithParent) => void;
 	TSModuleDeclaration?: (node: TSESTree.TSModuleDeclaration & ASTNodeWithParent) => void;
+	'TSModuleDeclaration:exit'?: (node: TSESTree.TSModuleDeclaration & ASTNodeWithParent) => void;
 	TSNamedTupleMember?: (node: TSESTree.TSNamedTupleMember & ASTNodeWithParent) => void;
+	'TSNamedTupleMember:exit'?: (node: TSESTree.TSNamedTupleMember & ASTNodeWithParent) => void;
 	TSNamespaceExportDeclaration?: (
 		node: TSESTree.TSNamespaceExportDeclaration & ASTNodeWithParent
 	) => void;
+	'TSNamespaceExportDeclaration:exit'?: (
+		node: TSESTree.TSNamespaceExportDeclaration & ASTNodeWithParent
+	) => void;
 	TSNeverKeyword?: (node: TSESTree.TSNeverKeyword & ASTNodeWithParent) => void;
+	'TSNeverKeyword:exit'?: (node: TSESTree.TSNeverKeyword & ASTNodeWithParent) => void;
 	TSNonNullExpression?: (node: TSESTree.TSNonNullExpression & ASTNodeWithParent) => void;
+	'TSNonNullExpression:exit'?: (node: TSESTree.TSNonNullExpression & ASTNodeWithParent) => void;
 	TSNullKeyword?: (node: TSESTree.TSNullKeyword & ASTNodeWithParent) => void;
+	'TSNullKeyword:exit'?: (node: TSESTree.TSNullKeyword & ASTNodeWithParent) => void;
 	TSNumberKeyword?: (node: TSESTree.TSNumberKeyword & ASTNodeWithParent) => void;
+	'TSNumberKeyword:exit'?: (node: TSESTree.TSNumberKeyword & ASTNodeWithParent) => void;
 	TSObjectKeyword?: (node: TSESTree.TSObjectKeyword & ASTNodeWithParent) => void;
+	'TSObjectKeyword:exit'?: (node: TSESTree.TSObjectKeyword & ASTNodeWithParent) => void;
 	TSOptionalType?: (node: TSESTree.TSOptionalType & ASTNodeWithParent) => void;
+	'TSOptionalType:exit'?: (node: TSESTree.TSOptionalType & ASTNodeWithParent) => void;
 	TSParameterProperty?: (node: TSESTree.TSParameterProperty & ASTNodeWithParent) => void;
+	'TSParameterProperty:exit'?: (node: TSESTree.TSParameterProperty & ASTNodeWithParent) => void;
 	TSPrivateKeyword?: (node: TSESTree.TSPrivateKeyword & ASTNodeWithParent) => void;
+	'TSPrivateKeyword:exit'?: (node: TSESTree.TSPrivateKeyword & ASTNodeWithParent) => void;
 	TSPropertySignature?: (node: TSESTree.TSPropertySignature & ASTNodeWithParent) => void;
+	'TSPropertySignature:exit'?: (node: TSESTree.TSPropertySignature & ASTNodeWithParent) => void;
 	TSProtectedKeyword?: (node: TSESTree.TSProtectedKeyword & ASTNodeWithParent) => void;
+	'TSProtectedKeyword:exit'?: (node: TSESTree.TSProtectedKeyword & ASTNodeWithParent) => void;
 	TSPublicKeyword?: (node: TSESTree.TSPublicKeyword & ASTNodeWithParent) => void;
+	'TSPublicKeyword:exit'?: (node: TSESTree.TSPublicKeyword & ASTNodeWithParent) => void;
 	TSQualifiedName?: (node: TSESTree.TSQualifiedName & ASTNodeWithParent) => void;
+	'TSQualifiedName:exit'?: (node: TSESTree.TSQualifiedName & ASTNodeWithParent) => void;
 	TSReadonlyKeyword?: (node: TSESTree.TSReadonlyKeyword & ASTNodeWithParent) => void;
+	'TSReadonlyKeyword:exit'?: (node: TSESTree.TSReadonlyKeyword & ASTNodeWithParent) => void;
 	TSRestType?: (node: TSESTree.TSRestType & ASTNodeWithParent) => void;
+	'TSRestType:exit'?: (node: TSESTree.TSRestType & ASTNodeWithParent) => void;
 	TSSatisfiesExpression?: (node: TSESTree.TSSatisfiesExpression & ASTNodeWithParent) => void;
+	'TSSatisfiesExpression:exit'?: (node: TSESTree.TSSatisfiesExpression & ASTNodeWithParent) => void;
 	TSStaticKeyword?: (node: TSESTree.TSStaticKeyword & ASTNodeWithParent) => void;
+	'TSStaticKeyword:exit'?: (node: TSESTree.TSStaticKeyword & ASTNodeWithParent) => void;
 	TSStringKeyword?: (node: TSESTree.TSStringKeyword & ASTNodeWithParent) => void;
+	'TSStringKeyword:exit'?: (node: TSESTree.TSStringKeyword & ASTNodeWithParent) => void;
 	TSSymbolKeyword?: (node: TSESTree.TSSymbolKeyword & ASTNodeWithParent) => void;
+	'TSSymbolKeyword:exit'?: (node: TSESTree.TSSymbolKeyword & ASTNodeWithParent) => void;
 	TSTemplateLiteralType?: (node: TSESTree.TSTemplateLiteralType & ASTNodeWithParent) => void;
+	'TSTemplateLiteralType:exit'?: (node: TSESTree.TSTemplateLiteralType & ASTNodeWithParent) => void;
 	TSThisType?: (node: TSESTree.TSThisType & ASTNodeWithParent) => void;
+	'TSThisType:exit'?: (node: TSESTree.TSThisType & ASTNodeWithParent) => void;
 	TSTupleType?: (node: TSESTree.TSTupleType & ASTNodeWithParent) => void;
+	'TSTupleType:exit'?: (node: TSESTree.TSTupleType & ASTNodeWithParent) => void;
 	TSTypeAliasDeclaration?: (node: TSESTree.TSTypeAliasDeclaration & ASTNodeWithParent) => void;
+	'TSTypeAliasDeclaration:exit'?: (
+		node: TSESTree.TSTypeAliasDeclaration & ASTNodeWithParent
+	) => void;
 	TSTypeAnnotation?: (node: TSESTree.TSTypeAnnotation & ASTNodeWithParent) => void;
+	'TSTypeAnnotation:exit'?: (node: TSESTree.TSTypeAnnotation & ASTNodeWithParent) => void;
 	TSTypeAssertion?: (node: TSESTree.TSTypeAssertion & ASTNodeWithParent) => void;
+	'TSTypeAssertion:exit'?: (node: TSESTree.TSTypeAssertion & ASTNodeWithParent) => void;
 	TSTypeLiteral?: (node: TSESTree.TSTypeLiteral & ASTNodeWithParent) => void;
+	'TSTypeLiteral:exit'?: (node: TSESTree.TSTypeLiteral & ASTNodeWithParent) => void;
 	TSTypeOperator?: (node: TSESTree.TSTypeOperator & ASTNodeWithParent) => void;
+	'TSTypeOperator:exit'?: (node: TSESTree.TSTypeOperator & ASTNodeWithParent) => void;
 	TSTypeParameter?: (node: TSESTree.TSTypeParameter & ASTNodeWithParent) => void;
+	'TSTypeParameter:exit'?: (node: TSESTree.TSTypeParameter & ASTNodeWithParent) => void;
 	TSTypeParameterDeclaration?: (
 		node: TSESTree.TSTypeParameterDeclaration & ASTNodeWithParent
 	) => void;
+	'TSTypeParameterDeclaration:exit'?: (
+		node: TSESTree.TSTypeParameterDeclaration & ASTNodeWithParent
+	) => void;
 	TSTypeParameterInstantiation?: (
 		node: TSESTree.TSTypeParameterInstantiation & ASTNodeWithParent
 	) => void;
+	'TSTypeParameterInstantiation:exit'?: (
+		node: TSESTree.TSTypeParameterInstantiation & ASTNodeWithParent
+	) => void;
 	TSTypePredicate?: (node: TSESTree.TSTypePredicate & ASTNodeWithParent) => void;
+	'TSTypePredicate:exit'?: (node: TSESTree.TSTypePredicate & ASTNodeWithParent) => void;
 	TSTypeQuery?: (node: TSESTree.TSTypeQuery & ASTNodeWithParent) => void;
+	'TSTypeQuery:exit'?: (node: TSESTree.TSTypeQuery & ASTNodeWithParent) => void;
 	TSTypeReference?: (node: TSESTree.TSTypeReference & ASTNodeWithParent) => void;
+	'TSTypeReference:exit'?: (node: TSESTree.TSTypeReference & ASTNodeWithParent) => void;
 	TSUndefinedKeyword?: (node: TSESTree.TSUndefinedKeyword & ASTNodeWithParent) => void;
+	'TSUndefinedKeyword:exit'?: (node: TSESTree.TSUndefinedKeyword & ASTNodeWithParent) => void;
 	TSUnionType?: (node: TSESTree.TSUnionType & ASTNodeWithParent) => void;
+	'TSUnionType:exit'?: (node: TSESTree.TSUnionType & ASTNodeWithParent) => void;
 	TSUnknownKeyword?: (node: TSESTree.TSUnknownKeyword & ASTNodeWithParent) => void;
+	'TSUnknownKeyword:exit'?: (node: TSESTree.TSUnknownKeyword & ASTNodeWithParent) => void;
 	TSVoidKeyword?: (node: TSESTree.TSVoidKeyword & ASTNodeWithParent) => void;
+	'TSVoidKeyword:exit'?: (node: TSESTree.TSVoidKeyword & ASTNodeWithParent) => void;
 };
 
 export type SvelteNodeListener = {
 	SvelteScriptElement?: (node: AST.SvelteScriptElement & ASTNodeWithParent) => void;
+	'SvelteScriptElement:exit'?: (node: AST.SvelteScriptElement & ASTNodeWithParent) => void;
 	SvelteStyleElement?: (node: AST.SvelteStyleElement & ASTNodeWithParent) => void;
+	'SvelteStyleElement:exit'?: (node: AST.SvelteStyleElement & ASTNodeWithParent) => void;
 	SvelteElement?: (node: AST.SvelteElement & ASTNodeWithParent) => void;
+	'SvelteElement:exit'?: (node: AST.SvelteElement & ASTNodeWithParent) => void;
 	SvelteStartTag?: (node: AST.SvelteStartTag & ASTNodeWithParent) => void;
+	'SvelteStartTag:exit'?: (node: AST.SvelteStartTag & ASTNodeWithParent) => void;
 	SvelteEndTag?: (node: AST.SvelteEndTag & ASTNodeWithParent) => void;
+	'SvelteEndTag:exit'?: (node: AST.SvelteEndTag & ASTNodeWithParent) => void;
 	SvelteName?: (node: AST.SvelteName & ASTNodeWithParent) => void;
+	'SvelteName:exit'?: (node: AST.SvelteName & ASTNodeWithParent) => void;
 	SvelteMemberExpressionName?: (node: AST.SvelteMemberExpressionName & ASTNodeWithParent) => void;
+	'SvelteMemberExpressionName:exit'?: (
+		node: AST.SvelteMemberExpressionName & ASTNodeWithParent
+	) => void;
 	SvelteLiteral?: (node: AST.SvelteLiteral & ASTNodeWithParent) => void;
+	'SvelteLiteral:exit'?: (node: AST.SvelteLiteral & ASTNodeWithParent) => void;
 	SvelteMustacheTag?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
+	'SvelteMustacheTag:exit'?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
 	SvelteDebugTag?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
+	'SvelteDebugTag:exit'?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
 	SvelteConstTag?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
+	'SvelteConstTag:exit'?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
 	SvelteRenderTag?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
+	'SvelteRenderTag:exit'?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
 	SvelteIfBlock?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
+	'SvelteIfBlock:exit'?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
 	SvelteElseBlock?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
+	'SvelteElseBlock:exit'?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
 	SvelteEachBlock?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
+	'SvelteEachBlock:exit'?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
 	SvelteAwaitBlock?: (node: AST.SvelteAwaitBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitBlock:exit'?: (node: AST.SvelteAwaitBlock & ASTNodeWithParent) => void;
 	SvelteAwaitPendingBlock?: (node: AST.SvelteAwaitPendingBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitPendingBlock:exit'?: (node: AST.SvelteAwaitPendingBlock & ASTNodeWithParent) => void;
 	SvelteAwaitThenBlock?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitThenBlock:exit'?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
 	SvelteAwaitCatchBlock?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
+	'SvelteAwaitCatchBlock:exit'?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
 	SvelteKeyBlock?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
+	'SvelteKeyBlock:exit'?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
 	SvelteSnippetBlock?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
+	'SvelteSnippetBlock:exit'?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
 	SvelteAttribute?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
+	'SvelteAttribute:exit'?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
 	SvelteShorthandAttribute?: (node: AST.SvelteShorthandAttribute & ASTNodeWithParent) => void;
+	'SvelteShorthandAttribute:exit'?: (
+		node: AST.SvelteShorthandAttribute & ASTNodeWithParent
+	) => void;
 	SvelteSpreadAttribute?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;
+	'SvelteSpreadAttribute:exit'?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;
 	SvelteDirective?: (node: AST.SvelteDirective & ASTNodeWithParent) => void;
+	'SvelteDirective:exit'?: (node: AST.SvelteDirective & ASTNodeWithParent) => void;
 	SvelteStyleDirective?: (node: AST.SvelteStyleDirective & ASTNodeWithParent) => void;
+	'SvelteStyleDirective:exit'?: (node: AST.SvelteStyleDirective & ASTNodeWithParent) => void;
 	SvelteSpecialDirective?: (node: AST.SvelteSpecialDirective & ASTNodeWithParent) => void;
+	'SvelteSpecialDirective:exit'?: (node: AST.SvelteSpecialDirective & ASTNodeWithParent) => void;
 	SvelteGenericsDirective?: (node: AST.SvelteGenericsDirective & ASTNodeWithParent) => void;
+	'SvelteGenericsDirective:exit'?: (node: AST.SvelteGenericsDirective & ASTNodeWithParent) => void;
 	SvelteDirectiveKey?: (node: AST.SvelteDirectiveKey & ASTNodeWithParent) => void;
+	'SvelteDirectiveKey:exit'?: (node: AST.SvelteDirectiveKey & ASTNodeWithParent) => void;
 	SvelteSpecialDirectiveKey?: (node: AST.SvelteSpecialDirectiveKey & ASTNodeWithParent) => void;
+	'SvelteSpecialDirectiveKey:exit'?: (
+		node: AST.SvelteSpecialDirectiveKey & ASTNodeWithParent
+	) => void;
 	SvelteText?: (node: AST.SvelteText & ASTNodeWithParent) => void;
+	'SvelteText:exit'?: (node: AST.SvelteText & ASTNodeWithParent) => void;
 	SvelteHTMLComment?: (node: AST.SvelteHTMLComment & ASTNodeWithParent) => void;
+	'SvelteHTMLComment:exit'?: (node: AST.SvelteHTMLComment & ASTNodeWithParent) => void;
 };
diff --git a/packages/eslint-plugin-svelte/src/types.ts b/packages/eslint-plugin-svelte/src/types.ts
index 96a6abd..c7deb27 100644
--- a/packages/eslint-plugin-svelte/src/types.ts
+++ b/packages/eslint-plugin-svelte/src/types.ts
@@ -3,8 +3,12 @@ import type { Linter, Rule, SourceCode as ESLintSourceCode } from 'eslint';
 import type { AST, StyleContext, SvelteConfig } from 'svelte-eslint-parser';
 import type { TSESTree } from '@typescript-eslint/types';
 import type { ScopeManager, Scope, Variable } from '@typescript-eslint/scope-manager';
+import type { Rule as StyleRule, Node } from 'postcss';
+import type { Root as SelectorRoot, Node as SelectorNode } from 'postcss-selector-parser';
 import type { ASTNode, ASTNodeWithParent, ASTNodeListener } from './types-for-node.js';
 import type * as TS from 'typescript';
+import type { SourceLocation } from 'svelte-eslint-parser/lib/ast/common.js';
+import type { SvelteContext } from './utils/svelte-context.js';
 
 export type { ASTNode, ASTNodeWithParent, ASTNodeListener };
 export interface RuleListener extends ASTNodeListener {
@@ -105,6 +109,18 @@ export interface PartialRuleMetaData {
 	deprecated?: boolean;
 	replacedBy?: string[] | { note: string };
 	type: 'problem' | 'suggestion' | 'layout';
+	/**
+	 * Conditions to determine whether this rule should be applied.
+	 * Multiple conditions can be specified as array, and the rule will be applied if any one of them matches (logical OR).
+	 * If not specified, the rule will be applied to all files.
+	 */
+	conditions?: {
+		svelteVersions?: SvelteContext['svelteVersion'][];
+		svelteFileTypes?: SvelteContext['svelteFileType'][];
+		runes?: SvelteContext['runes'][];
+		svelteKitVersions?: SvelteContext['svelteKitVersion'][];
+		svelteKitFileTypes?: SvelteContext['svelteKitFileType'][];
+	}[];
 }
 
 export type RuleContext = {
@@ -207,6 +223,10 @@ export interface SourceCode {
 		isSvelteScript?: boolean;
 		getSvelteHtmlAst?: () => unknown;
 		getStyleContext?: () => StyleContext;
+		getStyleSelectorAST?: (rule: StyleRule) => SelectorRoot;
+		styleNodeLoc?: (node: Node) => Partial<SourceLocation>;
+		styleNodeRange?: (node: Node) => [number | undefined, number | undefined];
+		styleSelectorNodeLoc?: (node: SelectorNode) => Partial<SourceLocation>;
 		svelteParseContext?: {
 			/**
 			 * Whether to use Runes mode.
diff --git a/packages/eslint-plugin-svelte/src/utils/ast-utils.ts b/packages/eslint-plugin-svelte/src/utils/ast-utils.ts
index d12e56e..e844ab8 100644
--- a/packages/eslint-plugin-svelte/src/utils/ast-utils.ts
+++ b/packages/eslint-plugin-svelte/src/utils/ast-utils.ts
@@ -567,6 +567,14 @@ export function isForeignElement(node: SvAST.SvelteElement): boolean {
 	return svgElements.includes(getNodeName(node)) || mathmlElements.includes(getNodeName(node));
 }
 
+export function isSvgElement(node: SvAST.SvelteElement): boolean {
+	return svgElements.includes(getNodeName(node));
+}
+
+export function isMathMLElement(node: SvAST.SvelteElement): boolean {
+	return mathmlElements.includes(getNodeName(node));
+}
+
 /** Checks whether the given identifier node is used as an expression. */
 export function isExpressionIdentifier(node: TSESTree.Identifier): boolean {
 	const parent = node.parent;
diff --git a/packages/eslint-plugin-svelte/src/utils/get-package-json.ts b/packages/eslint-plugin-svelte/src/utils/get-package-json.ts
index 15d9b62..cfd3575 100644
--- a/packages/eslint-plugin-svelte/src/utils/get-package-json.ts
+++ b/packages/eslint-plugin-svelte/src/utils/get-package-json.ts
@@ -14,7 +14,8 @@ type PackageJson = {
 };
 
 const isRunOnBrowser = !fs.readFileSync;
-const cache = createCache<PackageJson | null>();
+const packageJsonCache = createCache<PackageJson | null>();
+const packageJsonsCache = createCache<PackageJson[]>();
 
 /**
  * Reads the `package.json` data in a given path.
@@ -49,27 +50,30 @@ function readPackageJson(dir: string): PackageJson | null {
  * @returns A found `package.json` data or `null`.
  *      This object have additional property `filePath`.
  */
-export function getPackageJson(startPath = 'a.js'): PackageJson | null {
-	if (isRunOnBrowser) return null;
+export function getPackageJsons(startPath = 'a.js'): PackageJson[] {
+	if (isRunOnBrowser) return [];
+
+	const cached = packageJsonsCache.get(startPath);
+	if (cached) {
+		return cached;
+	}
+
+	const packageJsons: PackageJson[] = [];
 	const startDir = path.dirname(path.resolve(startPath));
 	let dir = startDir;
 	let prevDir = '';
 	let data = null;
 
 	do {
-		data = cache.get(dir);
+		data = packageJsonCache.get(dir);
 		if (data) {
-			if (dir !== startDir) {
-				cache.set(startDir, data);
-			}
-			return data;
+			packageJsons.push(data);
 		}
 
 		data = readPackageJson(dir);
 		if (data) {
-			cache.set(dir, data);
-			cache.set(startDir, data);
-			return data;
+			packageJsonCache.set(dir, data);
+			packageJsons.push(data);
 		}
 
 		// Go to next.
@@ -77,6 +81,6 @@ export function getPackageJson(startPath = 'a.js'): PackageJson | null {
 		dir = path.resolve(dir, '..');
 	} while (dir !== prevDir);
 
-	cache.set(startDir, null);
-	return null;
+	packageJsonsCache.set(startDir, packageJsons);
+	return packageJsons;
 }
diff --git a/packages/eslint-plugin-svelte/src/utils/index.ts b/packages/eslint-plugin-svelte/src/utils/index.ts
index 89bbede..558590d 100644
--- a/packages/eslint-plugin-svelte/src/utils/index.ts
+++ b/packages/eslint-plugin-svelte/src/utils/index.ts
@@ -1,4 +1,50 @@
-import type { RuleModule, PartialRuleModule } from '../types.js';
+import type { RuleModule, PartialRuleModule, PartialRuleMetaData, RuleContext } from '../types.js';
+import { getSvelteContext, type SvelteContext } from '../utils/svelte-context.js';
+
+function doesNotSatisfy<T>(actual: T, expected?: T[]): boolean {
+	if (expected == null || expected.length === 0) {
+		return false;
+	}
+
+	return !expected.includes(actual);
+}
+
+function satisfiesCondition(
+	condition: NonNullable<PartialRuleMetaData['conditions']>[number],
+	svelteContext: SvelteContext
+): boolean {
+	if (
+		doesNotSatisfy(svelteContext.svelteVersion, condition.svelteVersions) ||
+		doesNotSatisfy(svelteContext.svelteFileType, condition.svelteFileTypes) ||
+		doesNotSatisfy(svelteContext.runes, condition.runes) ||
+		doesNotSatisfy(svelteContext.svelteKitVersion, condition.svelteKitVersions) ||
+		doesNotSatisfy(svelteContext.svelteKitFileType, condition.svelteKitFileTypes)
+	) {
+		return false;
+	}
+
+	return true;
+}
+
+// export for testing
+export function shouldRun(
+	svelteContext: SvelteContext | null,
+	conditions: PartialRuleMetaData['conditions']
+): boolean {
+	// If svelteContext is null, it means the rule might be executed based on the analysis result of a different parser.
+	// In this case, always execute the rule.
+	if (svelteContext == null || conditions == null || conditions.length === 0) {
+		return true;
+	}
+
+	for (const condition of conditions) {
+		if (satisfiesCondition(condition, svelteContext)) {
+			return true;
+		}
+	}
+
+	return false;
+}
 
 /**
  * Define the rule.
@@ -16,6 +62,14 @@ export function createRule(ruleName: string, rule: PartialRuleModule): RuleModul
 				ruleName
 			}
 		},
-		create: rule.create as never
+		create(context: RuleContext) {
+			const { conditions } = rule.meta;
+			const svelteContext = getSvelteContext(context);
+			if (!shouldRun(svelteContext, conditions)) {
+				return {};
+			}
+
+			return rule.create(context);
+		}
 	};
 }
diff --git a/packages/eslint-plugin-svelte/src/utils/rules.ts b/packages/eslint-plugin-svelte/src/utils/rules.ts
index cb0cbe8..43d6772 100644
--- a/packages/eslint-plugin-svelte/src/utils/rules.ts
+++ b/packages/eslint-plugin-svelte/src/utils/rules.ts
@@ -20,7 +20,6 @@ import maxAttributesPerLine from '../rules/max-attributes-per-line.js';
 import mustacheSpacing from '../rules/mustache-spacing.js';
 import noAtDebugTags from '../rules/no-at-debug-tags.js';
 import noAtHtmlTags from '../rules/no-at-html-tags.js';
-import noDeprecatedRawSpecialElements from '../rules/no-deprecated-raw-special-elements.js';
 import noDomManipulating from '../rules/no-dom-manipulating.js';
 import noDupeElseIfBlocks from '../rules/no-dupe-else-if-blocks.js';
 import noDupeOnDirectives from '../rules/no-dupe-on-directives.js';
@@ -38,6 +37,7 @@ import noInspect from '../rules/no-inspect.js';
 import noNavigationWithoutBase from '../rules/no-navigation-without-base.js';
 import noNotFunctionHandler from '../rules/no-not-function-handler.js';
 import noObjectInTextMustaches from '../rules/no-object-in-text-mustaches.js';
+import noRawSpecialElements from '../rules/no-raw-special-elements.js';
 import noReactiveFunctions from '../rules/no-reactive-functions.js';
 import noReactiveLiterals from '../rules/no-reactive-literals.js';
 import noReactiveReassign from '../rules/no-reactive-reassign.js';
@@ -91,7 +91,6 @@ export const rules = [
 	mustacheSpacing,
 	noAtDebugTags,
 	noAtHtmlTags,
-	noDeprecatedRawSpecialElements,
 	noDomManipulating,
 	noDupeElseIfBlocks,
 	noDupeOnDirectives,
@@ -109,6 +108,7 @@ export const rules = [
 	noNavigationWithoutBase,
 	noNotFunctionHandler,
 	noObjectInTextMustaches,
+	noRawSpecialElements,
 	noReactiveFunctions,
 	noReactiveLiterals,
 	noReactiveReassign,
diff --git a/packages/eslint-plugin-svelte/src/utils/svelte-context.ts b/packages/eslint-plugin-svelte/src/utils/svelte-context.ts
new file mode 100644
index 0000000..42c5562
--- /dev/null
+++ b/packages/eslint-plugin-svelte/src/utils/svelte-context.ts
@@ -0,0 +1,274 @@
+import type { RuleContext } from '../types.js';
+import fs from 'fs';
+import path from 'path';
+import { getPackageJsons } from './get-package-json.js';
+import { getFilename, getSourceCode } from './compat.js';
+
+const isRunInBrowser = !fs.readFileSync;
+
+export type SvelteContext = (
+	| {
+			svelteVersion: '3/4';
+			svelteFileType: '.svelte' | null;
+			runes: null;
+	  }
+	| ({
+			svelteVersion: '5';
+	  } & (
+			| {
+					svelteFileType: '.svelte' | '.svelte.[js|ts]';
+					/** If a user uses a parser other than `svelte-eslint-parser`, `undetermined` will be set. */
+					runes: boolean | 'undetermined';
+			  }
+			| {
+					/** e.g. `foo.js` / `package.json` */
+					svelteFileType: null;
+					runes: null;
+			  }
+	  ))
+	| {
+			/** For projects that do not use Svelte. */
+			svelteVersion: null;
+			svelteFileType: null;
+			runes: null;
+	  }
+) & {
+	svelteKitVersion: '1.0.0-next' | '1' | '2' | null;
+	svelteKitFileType:
+		| '+page.svelte'
+		| '+page.[js|ts]'
+		| '+page.server.[js|ts]'
+		| '+error.svelte'
+		| '+layout.svelte'
+		| '+layout.[js|ts]'
+		| '+layout.server.[js|ts]'
+		| '+server.[js|ts]'
+		| null;
+};
+
+function getSvelteFileType(filePath: string): SvelteContext['svelteFileType'] {
+	if (filePath.endsWith('.svelte')) {
+		return '.svelte';
+	}
+
+	if (filePath.endsWith('.svelte.js') || filePath.endsWith('.svelte.ts')) {
+		return '.svelte.[js|ts]';
+	}
+
+	return null;
+}
+
+function getSvelteKitFileTypeFromFilePath(filePath: string): SvelteContext['svelteKitFileType'] {
+	const fileName = filePath.split('/').pop();
+	switch (fileName) {
+		case '+page.svelte': {
+			return '+page.svelte';
+		}
+		case '+page.js':
+		case '+page.ts': {
+			return '+page.[js|ts]';
+		}
+		case '+page.server.js':
+		case '+page.server.ts': {
+			return '+page.server.[js|ts]';
+		}
+		case '+error.svelte': {
+			return '+error.svelte';
+		}
+		case '+layout.svelte': {
+			return '+layout.svelte';
+		}
+		case '+layout.js':
+		case '+layout.ts': {
+			return '+layout.[js|ts]';
+		}
+		case '+layout.server.js':
+		case '+layout.server.ts': {
+			return '+layout.server.[js|ts]';
+		}
+		case '+server.js':
+		case '+server.ts': {
+			return '+server.[js|ts]';
+		}
+		default: {
+			return null;
+		}
+	}
+}
+
+function getSvelteKitContext(
+	context: RuleContext
+): Pick<SvelteContext, 'svelteKitFileType' | 'svelteKitVersion'> {
+	const filePath = getFilename(context);
+	const svelteKitVersion = getSvelteKitVersion(filePath);
+	if (svelteKitVersion == null) {
+		return {
+			svelteKitFileType: null,
+			svelteKitVersion: null
+		};
+	}
+	if (isRunInBrowser) {
+		return {
+			svelteKitVersion,
+			// Judge by only file path if it runs in browser.
+			svelteKitFileType: getSvelteKitFileTypeFromFilePath(filePath)
+		};
+	}
+
+	const routes =
+		(
+			context.settings?.svelte?.kit?.files?.routes ??
+			getSourceCode(context).parserServices.svelteParseContext?.svelteConfig?.kit?.files?.routes
+		)?.replace(/^\//, '') ?? 'src/routes';
+	const projectRootDir = getProjectRootDir(getFilename(context)) ?? '';
+
+	if (!filePath.startsWith(path.join(projectRootDir, routes))) {
+		return {
+			svelteKitVersion,
+			svelteKitFileType: null
+		};
+	}
+
+	return {
+		svelteKitVersion,
+		svelteKitFileType: getSvelteKitFileTypeFromFilePath(filePath)
+	};
+}
+
+function getSvelteVersion(filePath: string): SvelteContext['svelteVersion'] {
+	// Hack: if it runs in browser, it regards as Svelte project.
+	if (isRunInBrowser) return '5';
+	try {
+		const packageJsons = getPackageJsons(filePath);
+		for (const packageJson of packageJsons) {
+			const version = packageJson.dependencies?.svelte ?? packageJson.devDependencies?.svelte;
+			if (typeof version !== 'string') {
+				continue;
+			}
+			const major = extractMajorVersion(version, false);
+			if (major === '3' || major === '4') {
+				return '3/4';
+			}
+			return major as SvelteContext['svelteVersion'];
+		}
+	} catch {
+		/** do nothing */
+	}
+
+	return null;
+}
+
+/**
+ * Check givin file is under SvelteKit project.
+ *
+ * If it runs on browser, it always returns true.
+ *
+ * @param filePath A file path.
+ * @returns
+ */
+function getSvelteKitVersion(filePath: string): SvelteContext['svelteKitVersion'] {
+	// Hack: if it runs in browser, it regards as SvelteKit project.
+	if (isRunInBrowser) return '2';
+	try {
+		const packageJsons = getPackageJsons(filePath);
+		if (packageJsons.length === 0) return null;
+		if (packageJsons[0].name === 'eslint-plugin-svelte') {
+			// Hack: CI removes `@sveltejs/kit` and it returns false and test failed.
+			// So always it returns 2 if it runs on the package.
+			return '2';
+		}
+
+		for (const packageJson of packageJsons) {
+			const version =
+				packageJson.dependencies?.['@sveltejs/kit'] ??
+				packageJson.devDependencies?.['@sveltejs/kit'];
+			if (typeof version !== 'string') {
+				return null;
+			}
+
+			return extractMajorVersion(version, true) as SvelteContext['svelteKitVersion'];
+		}
+	} catch {
+		/** do nothing */
+	}
+
+	return null;
+}
+
+function extractMajorVersion(version: string, recognizePrereleaseVersion: boolean): string | null {
+	if (recognizePrereleaseVersion) {
+		const match = /^(?:\^|~)?(\d+\.0\.0-next)/.exec(version);
+		if (match && match[1]) {
+			return match[1];
+		}
+	}
+
+	const match = /^(?:\^|~)?(\d+)\./.exec(version);
+	if (match && match[1]) {
+		return match[1];
+	}
+	return null;
+}
+
+/**
+ * Gets a  project root folder path.
+ * @param filePath A file path to lookup.
+ * @returns A found project root folder path or null.
+ */
+function getProjectRootDir(filePath: string): string | null {
+	if (isRunInBrowser) return null;
+	const packageJsons = getPackageJsons(filePath);
+	if (packageJsons.length === 0) {
+		return null;
+	}
+	const packageJsonFilePath = packageJsons[0].filePath;
+	if (!packageJsonFilePath) return null;
+	return path.dirname(path.resolve(packageJsonFilePath));
+}
+
+export function getSvelteContext(context: RuleContext): SvelteContext | null {
+	const { parserServices } = getSourceCode(context);
+	const { svelteParseContext } = parserServices;
+	const filePath = getFilename(context);
+	const svelteKitContext = getSvelteKitContext(context);
+	const svelteVersion = getSvelteVersion(filePath);
+	const svelteFileType = getSvelteFileType(filePath);
+
+	if (svelteVersion == null) {
+		return {
+			svelteVersion: null,
+			svelteFileType: null,
+			runes: null,
+			svelteKitVersion: svelteKitContext.svelteKitVersion,
+			svelteKitFileType: svelteKitContext.svelteKitFileType
+		};
+	}
+
+	if (svelteVersion === '3/4') {
+		return {
+			svelteVersion,
+			svelteFileType: svelteFileType === '.svelte' ? '.svelte' : null,
+			runes: null,
+			svelteKitVersion: svelteKitContext.svelteKitVersion,
+			svelteKitFileType: svelteKitContext.svelteKitFileType
+		};
+	}
+
+	if (svelteFileType == null) {
+		return {
+			svelteVersion,
+			svelteFileType: null,
+			runes: null,
+			svelteKitVersion: svelteKitContext.svelteKitVersion,
+			svelteKitFileType: svelteKitContext.svelteKitFileType
+		};
+	}
+
+	return {
+		svelteVersion,
+		runes: svelteParseContext?.runes ?? 'undetermined',
+		svelteFileType,
+		svelteKitVersion: svelteKitContext.svelteKitVersion,
+		svelteKitFileType: svelteKitContext.svelteKitFileType
+	};
+}
diff --git a/packages/eslint-plugin-svelte/src/utils/svelte-kit.ts b/packages/eslint-plugin-svelte/src/utils/svelte-kit.ts
deleted file mode 100644
index 80a9099..0000000
--- a/packages/eslint-plugin-svelte/src/utils/svelte-kit.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * refer: https://github.com/mysticatea/eslint-plugin-node/blob/f45c6149be7235c0f7422d1179c25726afeecd83/lib/util/get-package-json.js
- */
-
-import type { RuleContext } from '../types.js';
-import fs from 'fs';
-import path from 'path';
-import { getPackageJson } from './get-package-json.js';
-import { getFilename, getSourceCode } from './compat.js';
-
-const isRunOnBrowser = !fs.readFileSync;
-
-/**
- * return true if it's a SvelteKit page component.
- * @param context
- * @returns
- */
-export function isKitPageComponent(context: RuleContext): boolean {
-	// Hack: if it runs on browser, it regards as SvelteKit project.
-	if (isRunOnBrowser) return true;
-	if (!hasSvelteKit(getFilename(context))) return false;
-	const routes =
-		(
-			context.settings?.svelte?.kit?.files?.routes ??
-			getSourceCode(context).parserServices.svelteParseContext?.svelteConfig?.kit?.files?.routes
-		)?.replace(/^\//, '') ?? 'src/routes';
-	const filePath = getFilename(context);
-	const projectRootDir = getProjectRootDir(getFilename(context)) ?? '';
-	const fileName = path.basename(filePath);
-	return (
-		filePath.startsWith(path.join(projectRootDir, routes)) &&
-		// MEMO: check only `+` and file extension for maintainability
-		Boolean(/^\+.+\.svelte$/.test(fileName))
-	);
-}
-
-/**
- * Check givin file is under SvelteKit project.
- *
- * If it runs on browser, it always returns true.
- *
- * @param filePath A file path.
- * @returns
- */
-function hasSvelteKit(filePath: string): boolean {
-	// Hack: if it runs on browser, it regards as SvelteKit project.
-	if (isRunOnBrowser) return true;
-	try {
-		const packageJson = getPackageJson(filePath);
-		if (!packageJson) return false;
-		if (packageJson.name === 'eslint-plugin-svelte')
-			// Hack: CI removes `@sveltejs/kit` and it returns false and test failed.
-			// So always it returns true if it runs on the package.
-			return true;
-		return Boolean(
-			packageJson.dependencies?.['@sveltejs/kit'] ?? packageJson.devDependencies?.['@sveltejs/kit']
-		);
-	} catch {
-		return false;
-	}
-}
-
-/**
- * Gets a  project root folder path.
- * @param filePath A file path to lookup.
- * @returns A found project root folder path or null.
- */
-function getProjectRootDir(filePath: string): string | null {
-	if (isRunOnBrowser) return null;
-	const packageJsonFilePath = getPackageJson(filePath)?.filePath;
-	if (!packageJsonFilePath) return null;
-	return path.dirname(path.resolve(packageJsonFilePath));
-}
diff --git a/packages/eslint-plugin-svelte/tools/new-rule.ts b/packages/eslint-plugin-svelte/tools/new-rule.ts
index 7352ca7..18102ef 100644
--- a/packages/eslint-plugin-svelte/tools/new-rule.ts
+++ b/packages/eslint-plugin-svelte/tools/new-rule.ts
@@ -1,7 +1,12 @@
-import path from 'path';
-import fs from 'fs';
-import cp from 'child_process';
+import path from 'node:path';
+import fs from 'node:fs';
+import cp from 'node:child_process';
+import url from 'node:url';
 import { writeAndFormat } from './lib/write.js';
+
+const __filename = url.fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
 const logger = console;
 
 // main
@@ -60,9 +65,9 @@ export default createRule('${ruleId}', {
         schema: [],
         messages: {},
         type: 'suggestion', // 'problem', or 'layout',
+				conditions: [], // Conditions for applying this rule. Leave empty to always execute.
     },
     create(context) {
-        
         return {}
     },
 });
diff --git a/packages/eslint-plugin-svelte/tools/update-types-for-node.ts b/packages/eslint-plugin-svelte/tools/update-types-for-node.ts
index c2e416a..85b1bf5 100644
--- a/packages/eslint-plugin-svelte/tools/update-types-for-node.ts
+++ b/packages/eslint-plugin-svelte/tools/update-types-for-node.ts
@@ -70,6 +70,7 @@ for (const nodeType of tsEsNodeNames) {
 		argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}`;
 	}
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 }
 for (const nodeType of svelteNodeNames) {
 	let argType = `AST.${nodeType}`;
@@ -77,6 +78,7 @@ for (const nodeType of svelteNodeNames) {
 		argType = `AST.SvelteProgram`;
 	}
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 }
 typesForNodeCode.push(`}`);
 typesForNodeCode.push(``);
@@ -84,6 +86,7 @@ typesForNodeCode.push(`export type ESNodeListener = {`);
 for (const nodeType of esNodeNames) {
 	const argType = `TSESTree.${nodeType}`;
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 	estreeCode.push(`export type ${nodeType} = TSESTree.${nodeType}`);
 }
 for (const nodeType of esSvelteNodeNames) {
@@ -92,6 +95,7 @@ for (const nodeType of esSvelteNodeNames) {
 		argType = `AST.SvelteProgram`;
 	}
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 }
 typesForNodeCode.push(`}`);
 typesForNodeCode.push(``);
@@ -102,6 +106,7 @@ for (const nodeType of tsNodeNames) {
 		argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}`;
 	}
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 }
 typesForNodeCode.push(`}`);
 typesForNodeCode.push(``);
@@ -109,6 +114,7 @@ typesForNodeCode.push(`export type SvelteNodeListener = {`);
 for (const nodeType of svelteNodeNames.filter((k) => !esSvelteNodeNames.includes(k))) {
 	const argType = `AST.${nodeType}`;
 	typesForNodeCode.push(`  ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`);
+	typesForNodeCode.push(`  '${nodeType}:exit'?: (node: ${argType} & ASTNodeWithParent) => void`);
 }
 typesForNodeCode.push(`}`);
 


Test patch:
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-errors.yaml
deleted file mode 100644
index a2e0ece..0000000
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-errors.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-- message: Disallow self-closing on foreign (SVG or MathML) elements.
-  line: 2
-  column: 12
-  suggestions: null
-- message: Disallow self-closing on foreign (SVG or MathML) elements.
-  line: 3
-  column: 13
-  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/_config.json
similarity index 56%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/_config.json
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/_config.json
index 6081aab..f40ed66 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/_config.json
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/_config.json
@@ -1,7 +1,7 @@
 {
 	"options": [
 		{
-			"foreign": "never"
+			"math": "never"
 		}
 	]
 }
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-errors.yaml
new file mode 100644
index 0000000..382d877
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-errors.yaml
@@ -0,0 +1,4 @@
+- message: Disallow self-closing on MathML elements.
+  line: 3
+  column: 13
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-input.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-input.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-output.svelte
similarity index 67%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-output.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-output.svelte
index 76223b7..3e19b1c 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/foreign-never/svelte-never-output.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/math-never/svelte-never-output.svelte
@@ -1,3 +1,3 @@
 <!-- prettier-ignore -->
-<svg><path ></path></svg>
+<svg><path /></svg>
 <math><msup ></msup></math>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/_config.json
new file mode 100644
index 0000000..211f2f0
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/_config.json
@@ -0,0 +1,7 @@
+{
+	"options": [
+		{
+			"normal": "always"
+		}
+	]
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-errors.yaml
new file mode 100644
index 0000000..d25b212
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-errors.yaml
@@ -0,0 +1,4 @@
+- message: Require self-closing on HTML elements.
+  line: 3
+  column: 7
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-input.svelte
new file mode 100644
index 0000000..d594af2
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-input.svelte
@@ -0,0 +1,4 @@
+<!-- prettier-ignore -->
+<div>
+  <div></div>
+</div>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-output.svelte
new file mode 100644
index 0000000..a1b0b45
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/normal-always/component-never-output.svelte
@@ -0,0 +1,4 @@
+<!-- prettier-ignore -->
+<div>
+  <div/>
+</div>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-errors.yaml
index ed068bc..7620e93 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-errors.yaml
@@ -10,11 +10,11 @@
   line: 5
   column: 18
   suggestions: null
-- message: Require self-closing on foreign (SVG or MathML) elements.
+- message: Require self-closing on SVG elements.
   line: 6
   column: 13
   suggestions: null
-- message: Require self-closing on foreign (SVG or MathML) elements.
+- message: Disallow self-closing on MathML elements.
   line: 7
   column: 14
   suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-input.svelte
index e9b5f17..a71eee6 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-input.svelte
@@ -4,7 +4,7 @@
   <img>
   <TestComponent />
   <svg><path></path></svg>
-  <math><msup></msup></math>
+  <math><msup/></math>
 </div>
 <!-- prettier-ignore -->
 <svelte:head></svelte:head>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-output.svelte
index d11d92b..7091289 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-output.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/html/preset-html-output.svelte
@@ -4,7 +4,7 @@
   <img/>
   <TestComponent ></TestComponent>
   <svg><path/></svg>
-  <math><msup/></math>
+  <math><msup></msup></math>
 </div>
 <!-- prettier-ignore -->
 <svelte:head/>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/none/preset-none-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/none/preset-none-errors.yaml
index f12f4c3..99c3968 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/none/preset-none-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/presets/none/preset-none-errors.yaml
@@ -10,11 +10,11 @@
   line: 5
   column: 8
   suggestions: null
-- message: Disallow self-closing on foreign (SVG or MathML) elements.
+- message: Disallow self-closing on SVG elements.
   line: 6
   column: 14
   suggestions: null
-- message: Disallow self-closing on foreign (SVG or MathML) elements.
+- message: Disallow self-closing on MathML elements.
   line: 7
   column: 15
   suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/_config.json
new file mode 100644
index 0000000..271eb82
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/_config.json
@@ -0,0 +1,7 @@
+{
+	"options": [
+		{
+			"svg": "never"
+		}
+	]
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-errors.yaml
new file mode 100644
index 0000000..1ed4819
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-errors.yaml
@@ -0,0 +1,4 @@
+- message: Disallow self-closing on SVG elements.
+  line: 2
+  column: 12
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-input.svelte
new file mode 100644
index 0000000..ae91364
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-input.svelte
@@ -0,0 +1,3 @@
+<!-- prettier-ignore -->
+<svg><path /></svg>
+<math><msup></msup></math>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-output.svelte
new file mode 100644
index 0000000..19cfc19
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/svg-never/svelte-never-output.svelte
@@ -0,0 +1,3 @@
+<!-- prettier-ignore -->
+<svg><path ></path></svg>
+<math><msup></msup></math>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-errors.yaml
index 3b98d6d..81f26b6 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-errors.yaml
@@ -1,4 +1,4 @@
-- message: Require self-closing on HTML elements.
+- message: Disallow self-closing on HTML elements.
   line: 3
   column: 7
   suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-input.svelte
index b8d7b80..a952944 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-input.svelte
@@ -1,6 +1,6 @@
 <!-- prettier-ignore -->
 <div>
-  <div></div>
+  <div/>
   <CustomElement> </CustomElement>
   <img>
 </div>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-output.svelte
index d8a1286..ca2cc67 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-output.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/invalid/test01-output.svelte
@@ -1,6 +1,6 @@
 <!-- prettier-ignore -->
 <div>
-  <div/>
+  <div></div>
   <CustomElement/>
   <img/>
 </div>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/valid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/valid/test01-input.svelte
index 082bc47..ca8a085 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/valid/test01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/html-self-closing/valid/test01-input.svelte
@@ -1,9 +1,9 @@
 <div class="hello">
-	<div />
+	<div></div>
 	<div>hello</div>
 	<img />
 	<svg><path /></svg>
-	<math><msup /></math>
+	<math><msup></msup></math>
 	{#if true}
 		<svelte:self />
 	{/if}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test01-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config-from-parser-options/+test01-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/svelte.config.js b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/svelte.config.js
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/svelte.config.js
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/test01/svelte.config.js
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/+test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/+test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/_config.json
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/_config.json
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/_config.json
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/+test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/svelte-config/+test01-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test01/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test02-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test02-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/_config.json
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/_config.json
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/_config.json
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test02-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/+test02-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/invalid/test02/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01/_config.json
new file mode 100644
index 0000000..d71f630
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test01"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test02-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test02-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02/_config.json
new file mode 100644
index 0000000..beae40b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test02"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test03-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test03-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03/_config.json
new file mode 100644
index 0000000..d377828
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test03"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test04-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test04-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04/_config.json
new file mode 100644
index 0000000..88bcb09
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test04"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test05-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test05-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05/_config.json
new file mode 100644
index 0000000..a602212
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test05"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test06-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test06-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06/_config.json
new file mode 100644
index 0000000..a3443fc
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test06"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test07-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test07-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07/_config.json
new file mode 100644
index 0000000..dcb849b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test07"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test08-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test08/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test08-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test08/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test08/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test08/_config.json
new file mode 100644
index 0000000..c9afd0b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test08/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test09-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test09-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09/_config.json
new file mode 100644
index 0000000..772e2cc
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test09"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test010-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/+test010-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10/_config.json
new file mode 100644
index 0000000..1857660
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10/_config.json
@@ -0,0 +1,13 @@
+{
+	"languageOptions": {
+		"parserOptions": {
+			"svelteConfig": {
+				"kit": {
+					"files": {
+						"routes": "tests/fixtures/rules/no-export-load-in-svelte-module-in-kit-pages/valid/test10"
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-input.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-input.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-output.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/invalid/test01-output.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/invalid/test01-output.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/valid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/valid/test01-input.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/no-deprecated-raw-special-elements/valid/test01-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/no-raw-special-elements/valid/test01-input.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/invalid-svelte-ignore01-svelte4-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/invalid-svelte-ignore01-svelte4-errors.yaml
index ef54169..2f9836a 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/invalid-svelte-ignore01-svelte4-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/invalid-svelte-ignore01-svelte4-errors.yaml
@@ -3,7 +3,8 @@
   line: 6
   column: 3
   suggestions: null
-- message: 'A11y: A form label must be associated with a control.(a11y-label-has-associated-control)'
+- message: 'A11y: A form label must be associated with a
+    control.(a11y-label-has-associated-control)'
   line: 6
   column: 3
   suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-errors.yaml
new file mode 100644
index 0000000..4922b8b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-errors.yaml
@@ -0,0 +1,4 @@
+- message: Unused CSS selector "input"(css-unused-selector)
+  line: 2
+  column: 2
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-input.svelte
new file mode 100644
index 0000000..c8c3bc8
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-input.svelte
@@ -0,0 +1,5 @@
+<style>
+	input {
+		@apply bg-surface-50-900-token h-full overflow-hidden;
+	}
+</style>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json
new file mode 100644
index 0000000..b650cc2
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json
@@ -0,0 +1,3 @@
+{
+	"svelte": "^3.0.0 || ^4.0.0"
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml
new file mode 100644
index 0000000..af1ae04
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml
@@ -0,0 +1,6 @@
+- message: |-
+    Unused CSS selector "input"
+    https://svelte.dev/e/css_unused_selector(css_unused_selector)
+  line: 2
+  column: 2
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte
new file mode 100644
index 0000000..c8c3bc8
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte
@@ -0,0 +1,5 @@
+<style>
+	input {
+		@apply bg-surface-50-900-token h-full overflow-hidden;
+	}
+</style>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-requirements.json
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-requirements.json
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-requirements.json
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte
new file mode 100644
index 0000000..8ee9324
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte
@@ -0,0 +1,5 @@
+<style global>
+	input {
+		@apply bg-surface-50-900-token h-full overflow-hidden;
+	}
+</style>
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+test001-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/+test001-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+test001-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/+test001-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config-from-parser-options/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+test001-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/+test001-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte-config/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/errors.yaml
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/+svelte5-test001-errors.yaml
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/errors.yaml
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+test001-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/requirements.json
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+test001-requirements.json
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte5/requirements.json
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/requirements.json
new file mode 100644
index 0000000..0192b10
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/requirements.json
@@ -0,0 +1,3 @@
+{
+	"svelte": ">=5.0.0-0"
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test-for-form-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test-for-form/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test-for-form-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test-for-form/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test-for-form/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test-for-form/_config.json
new file mode 100644
index 0000000..9861188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test-for-form/_config.json
@@ -0,0 +1,11 @@
+{
+	"settings": {
+		"svelte": {
+			"kit": {
+				"files": {
+					"routes": "tests/fixtures"
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test001-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test001/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test001-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test001/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test001/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test001/_config.json
new file mode 100644
index 0000000..9861188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test001/_config.json
@@ -0,0 +1,11 @@
+{
+	"settings": {
+		"svelte": {
+			"kit": {
+				"files": {
+					"routes": "tests/fixtures"
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test002-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test002/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test002-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test002/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test002/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test002/_config.json
new file mode 100644
index 0000000..9861188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test002/_config.json
@@ -0,0 +1,11 @@
+{
+	"settings": {
+		"svelte": {
+			"kit": {
+				"files": {
+					"routes": "tests/fixtures"
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test003-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test003/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test003-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test003/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test003/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test003/_config.json
new file mode 100644
index 0000000..9861188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test003/_config.json
@@ -0,0 +1,11 @@
+{
+	"settings": {
+		"svelte": {
+			"kit": {
+				"files": {
+					"routes": "tests/fixtures"
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test004-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test004/+page.svelte
similarity index 100%
rename from packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/+test004-input.svelte
rename to packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test004/+page.svelte
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test004/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test004/_config.json
new file mode 100644
index 0000000..9861188
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/test004/_config.json
@@ -0,0 +1,11 @@
+{
+	"settings": {
+		"svelte": {
+			"kit": {
+				"files": {
+					"routes": "tests/fixtures"
+				}
+			}
+		}
+	}
+}
diff --git a/packages/eslint-plugin-svelte/tests/src/index.spec.ts b/packages/eslint-plugin-svelte/tests/src/index.spec.ts
new file mode 100644
index 0000000..316bb8f
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/src/index.spec.ts
@@ -0,0 +1,274 @@
+import assert from 'assert';
+import { shouldRun } from '../../src/utils/index.js';
+
+const actualSvelte3: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '3/4',
+	svelteFileType: '.svelte',
+	runes: null,
+	svelteKitVersion: null,
+	svelteKitFileType: null
+};
+
+const actualSvelte5: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '5',
+	svelteFileType: '.svelte',
+	runes: true,
+	svelteKitVersion: null,
+	svelteKitFileType: null
+};
+
+const actualUndetermined: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '5',
+	svelteFileType: '.svelte',
+	runes: 'undetermined',
+	svelteKitVersion: null,
+	svelteKitFileType: null
+};
+
+const actualSvelte5Script: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '5',
+	svelteFileType: '.svelte.[js|ts]',
+	runes: true,
+	svelteKitVersion: null,
+	svelteKitFileType: null
+};
+
+const actualSvelteKit: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '5',
+	svelteFileType: '.svelte',
+	runes: true,
+	svelteKitVersion: '2',
+	svelteKitFileType: '+page.svelte'
+};
+
+const actualSvelteKitNotRoute: Parameters<typeof shouldRun>[0] = {
+	svelteVersion: '5',
+	svelteFileType: '.svelte',
+	runes: true,
+	svelteKitVersion: '2',
+	svelteKitFileType: null
+};
+
+describe('shouldRun', () => {
+	it('no condition1', () => {
+		assert.strictEqual(shouldRun(actualSvelte3, []), true);
+	});
+	it('no condition2', () => {
+		assert.strictEqual(shouldRun(actualSvelte3, [{}]), true);
+	});
+	it('no condition3', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: undefined
+				}
+			]),
+			true
+		);
+	});
+	it('no condition4', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: []
+				}
+			]),
+			true
+		);
+	});
+
+	it('simple true', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: ['3/4']
+				}
+			]),
+			true
+		);
+	});
+
+	it('simple false', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: ['5']
+				}
+			]),
+			false
+		);
+	});
+
+	it('or true', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: ['3/4']
+				},
+				{
+					svelteVersions: ['5']
+				}
+			]),
+			true
+		);
+	});
+
+	it('or false', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKit, [
+				{
+					svelteKitFileTypes: ['+page.[js|ts]']
+				},
+				{
+					svelteKitFileTypes: ['+page.server.[js|ts]']
+				}
+			]),
+			false
+		);
+	});
+
+	it('and true', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte5, [
+				{
+					svelteVersions: ['5'],
+					runes: [true]
+				}
+			]),
+			true
+		);
+	});
+
+	it('and false', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte5, [
+				{
+					svelteVersions: ['5'],
+					runes: [false]
+				}
+			]),
+			false
+		);
+	});
+
+	it('undetermined true', () => {
+		assert.strictEqual(
+			shouldRun(actualUndetermined, [
+				{
+					svelteVersions: ['5'],
+					runes: ['undetermined']
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - svelte3', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte3, [
+				{
+					svelteVersions: ['3/4']
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - Svelte5 with runes', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte5, [
+				{
+					svelteVersions: ['5'],
+					svelteFileTypes: ['.svelte'],
+					runes: [true]
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - Svelte5 without runes', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte5, [
+				{
+					svelteVersions: ['5'],
+					svelteFileTypes: ['.svelte'],
+					runes: [false]
+				}
+			]),
+			false
+		);
+	});
+
+	it('real - Svelte5 script', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelte5Script, [
+				{
+					svelteVersions: ['5'],
+					svelteFileTypes: ['.svelte.[js|ts]'],
+					runes: [true]
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - SvelteKit1', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKit, [
+				{
+					svelteKitVersions: ['2'],
+					svelteKitFileTypes: ['+page.svelte']
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - SvelteKit2', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKit, [
+				{
+					svelteKitVersions: [null]
+				}
+			]),
+			false
+		);
+	});
+
+	it('real - SvelteKit3', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKit, [
+				{
+					svelteKitVersions: ['2'],
+					svelteKitFileTypes: [null]
+				}
+			]),
+			false
+		);
+	});
+
+	it('real - SvelteKit not route1', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKitNotRoute, [
+				{
+					svelteKitVersions: ['2'],
+					svelteKitFileTypes: [null]
+				}
+			]),
+			true
+		);
+	});
+
+	it('real - SvelteKit not route2', () => {
+		assert.strictEqual(
+			shouldRun(actualSvelteKitNotRoute, [
+				{
+					svelteKitVersions: ['2'],
+					svelteKitFileTypes: ['+page.svelte']
+				}
+			]),
+			false
+		);
+	});
+});
diff --git a/packages/eslint-plugin-svelte/tests/src/rules/no-deprecated-raw-special-elements.ts b/packages/eslint-plugin-svelte/tests/src/rules/no-raw-special-elements.ts
similarity index 59%
rename from packages/eslint-plugin-svelte/tests/src/rules/no-deprecated-raw-special-elements.ts
rename to packages/eslint-plugin-svelte/tests/src/rules/no-raw-special-elements.ts
index 172cc28..4250ec6 100644
--- a/packages/eslint-plugin-svelte/tests/src/rules/no-deprecated-raw-special-elements.ts
+++ b/packages/eslint-plugin-svelte/tests/src/rules/no-raw-special-elements.ts
@@ -1,5 +1,5 @@
 import { RuleTester } from '../../utils/eslint-compat.js';
-import rule from '../../../src/rules/no-deprecated-raw-special-elements.js';
+import rule from '../../../src/rules/no-raw-special-elements.js';
 import { loadTestCases } from '../../utils/utils.js';
 
 const tester = new RuleTester({
@@ -10,7 +10,7 @@ const tester = new RuleTester({
 });
 
 tester.run(
-	'no-deprecated-raw-special-elements',
+	'no-raw-special-elements',
 	rule as any,
-	loadTestCases('no-deprecated-raw-special-elements')
+	loadTestCases('no-raw-special-elements')
 );
diff --git a/packages/eslint-plugin-svelte/tests/utils/utils.ts b/packages/eslint-plugin-svelte/tests/utils/utils.ts
index 7cb97ed..dcf466a 100644
--- a/packages/eslint-plugin-svelte/tests/utils/utils.ts
+++ b/packages/eslint-plugin-svelte/tests/utils/utils.ts
@@ -119,14 +119,14 @@ export function loadTestCases(
 		.filter(filter)
 		.map((inputFile) => getConfig(ruleName, inputFile));
 
-	const fixable = plugin.rules[ruleName].meta.fixable != null;
+	const fixable = plugin.rules[ruleName].meta?.fixable != null;
 
 	const invalid = listupInput(invalidFixtureRoot)
 		.filter(filter)
 		.map((inputFile) => {
 			const config = getConfig(ruleName, inputFile);
-			const errorFile = inputFile.replace(/input\.[a-z]+$/u, 'errors.yaml');
-			const outputFile = inputFile.replace(/input\.[a-z]+$/u, 'output.svelte');
+			const errorFile = inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'errors.yaml');
+			const outputFile = inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'output.svelte');
 
 			if (!fs.existsSync(errorFile)) {
 				writeFixtures(ruleName, inputFile);
@@ -196,7 +196,8 @@ function* itrListupInput(rootDir: string): IterableIterator<string> {
 			continue;
 		}
 		const abs = path.join(rootDir, filename);
-		if (path.basename(filename, path.extname(filename)).endsWith('input')) {
+		const baseFileName = path.basename(filename, path.extname(filename));
+		if (baseFileName.endsWith('input') || baseFileName.startsWith('+')) {
 			yield abs;
 		} else if (fs.statSync(abs).isDirectory()) {
 			yield* itrListupInput(abs);
@@ -214,8 +215,8 @@ function applySuggestion(code: string, suggestion: LinterType.LintSuggestion) {
 
 function writeFixtures(ruleName: string, inputFile: string, { force }: { force?: boolean } = {}) {
 	const linter = new Linter();
-	const errorFile = inputFile.replace(/input\.[a-z]+$/u, 'errors.yaml');
-	const outputFile = inputFile.replace(/input\.[a-z]+$/u, 'output.svelte');
+	const errorFile = inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'errors.yaml');
+	const outputFile = inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'output.svelte');
 
 	const config = getConfig(ruleName, inputFile);
 
@@ -285,7 +286,7 @@ function writeFixtures(ruleName: string, inputFile: string, { force }: { force?:
 	if (force || !fs.existsSync(outputFile)) {
 		const output = applyFixes(config.code, result).output;
 
-		if (plugin.rules[ruleName].meta.fixable != null) {
+		if (plugin.rules[ruleName].meta?.fixable != null) {
 			fs.writeFileSync(outputFile, output, 'utf8');
 		}
 	}
@@ -296,11 +297,11 @@ function getConfig(ruleName: string, inputFile: string) {
 	const code = fs.readFileSync(inputFile, 'utf8');
 	let config;
 	let configFile = [
-		inputFile.replace(/input\.[a-z]+$/u, 'config.json'),
+		inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'config.json'),
 		path.join(path.dirname(inputFile), '_config.json'),
-		inputFile.replace(/input\.[a-z]+$/u, 'config.js'),
+		inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'config.js'),
 		path.join(path.dirname(inputFile), '_config.js'),
-		inputFile.replace(/input\.[a-z]+$/u, 'config.cjs'),
+		inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'config.cjs'),
 		path.join(path.dirname(inputFile), '_config.cjs')
 	].find((f) => fs.existsSync(f));
 	if (configFile) {
@@ -348,7 +349,7 @@ function getConfig(ruleName: string, inputFile: string) {
 }
 
 function getRequirements(inputFile: string): Record<string, string> {
-	let requirementsFile: string = inputFile.replace(/input\.[a-z]+$/u, 'requirements.json');
+	let requirementsFile: string = inputFile.replace(/(input|\+.+)\.[a-z]+$/u, 'requirements.json');
 	if (!fs.existsSync(requirementsFile)) {
 		requirementsFile = path.join(path.dirname(inputFile), '_requirements.json');
 	}