Repository: sveltejs/eslint-plugin-svelte
Pull request #1006 (2025-01-12 02:47:18)

chore: do not run `infinite-reactive-loop` rule on Svelte 5 with runes
Related https://github.com/sveltejs/eslint-plugin-svelte/issues/894.
But add a configuration to disable rules that are unnecessary when running with Svelte 5 Runes.

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

Latest commit: aa2bac71e70cee7bcfeb46789e13d42e0f726910

**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 | Patch |

</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/chore/infinite-reactive-loop?filename=.changeset/quick-scissors-flash.md&value=---%0A%22eslint-plugin-svelte%22%3A%20patch%0A---%0A%0Achore%3A%20do%20not%20run%20%60infinite-reactive-loop%60%20rule%20on%20Svelte%205%20with%20runes%0A)


pkg-pr-new[bot]: 
[Open in Stackblitz](https://pkg.pr.new/template/b648874e-2475-418e-aaf2-b39fb73b1e4c)


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


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


Patch:
diff --git a/.changeset/cool-tomatoes-fry.md b/.changeset/cool-tomatoes-fry.md
new file mode 100644
index 0000000..f61cd8f
--- /dev/null
+++ b/.changeset/cool-tomatoes-fry.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: change the rule category of `valid-prop-names-in-kit-pages` to `SvelteKit`
diff --git a/.changeset/grumpy-deers-film.md b/.changeset/grumpy-deers-film.md
new file mode 100644
index 0000000..7ac8178
--- /dev/null
+++ b/.changeset/grumpy-deers-film.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: change the rule category of `no-export-load-in-svelte-module-in-kit-pages` to `SvelteKit`
diff --git a/.changeset/hip-avocados-call.md b/.changeset/hip-avocados-call.md
new file mode 100644
index 0000000..850593e
--- /dev/null
+++ b/.changeset/hip-avocados-call.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: update `svelte-eslint-parser` to `1.0.0-next.10`
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/perfect-mirrors-doubt.md b/.changeset/perfect-mirrors-doubt.md
new file mode 100644
index 0000000..413a80f
--- /dev/null
+++ b/.changeset/perfect-mirrors-doubt.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: do not run `no-reactive-reassign` rule on Svelte 5 with runes
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 2933e46..9d54d47 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -10,22 +10,28 @@
     "blue-swans-give",
     "cold-starfishes-doubt",
     "cool-rockets-allow",
+    "cool-steaks-happen",
     "eighty-trainers-push",
     "fast-coins-fly",
     "fifty-parents-itch",
     "green-squids-compete",
+    "hip-avocados-call",
     "hungry-grapes-shave",
     "itchy-dragons-boil",
     "lazy-eyes-wait",
     "loud-zoos-kiss",
     "nice-clocks-buy",
     "olive-melons-explain",
+    "olive-spiders-type",
     "olive-wolves-travel",
     "quiet-toys-burn",
     "sixty-news-look",
     "small-days-agree",
     "small-donuts-end",
+    "soft-bears-hear",
     "thick-items-retire",
-    "twenty-nails-end"
+    "thin-dryers-know",
+    "twenty-nails-end",
+    "two-students-pump"
   ]
 }
diff --git a/.changeset/smart-brooms-relax.md b/.changeset/smart-brooms-relax.md
new file mode 100644
index 0000000..ee9ebe8
--- /dev/null
+++ b/.changeset/smart-brooms-relax.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+chore: do not run `infinite-reactive-loop` rule on Svelte 5 with runes
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/.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..b2bac01 100644
--- a/README.md
+++ b/README.md
@@ -320,16 +320,15 @@ 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 |  |
 | [svelte/no-dupe-style-properties](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-style-properties/) | disallow duplicate style properties | :star: |
 | [svelte/no-dupe-use-directives](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-use-directives/) | disallow duplicate `use:` directives |  |
 | [svelte/no-dynamic-slot-name](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dynamic-slot-name/) | disallow dynamic slot name | :star::wrench: |
-| [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 |  |
@@ -337,7 +336,6 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | [svelte/require-store-callbacks-use-set-param](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-callbacks-use-set-param/) | store callbacks must use `set` param |  |
 | [svelte/require-store-reactive-access](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-reactive-access/) | disallow to use of the store itself as an operand. Need to use $ prefix or get function. | :wrench: |
 | [svelte/valid-compile](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-compile/) | disallow warnings when compiling. | :star: |
-| [svelte/valid-prop-names-in-kit-pages](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-prop-names-in-kit-pages/) | disallow props other than data or errors in SvelteKit page components. |  |
 
 ## Security Vulnerability
 
@@ -416,7 +414,9 @@ These rules relate to SvelteKit and its best Practices.
 
 | Rule ID | Description |    |
 |:--------|:------------|:---|
+| [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-navigation-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/) | disallow using navigation (links, goto, pushState, replaceState) without the base path |  |
+| [svelte/valid-prop-names-in-kit-pages](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-prop-names-in-kit-pages/) | disallow props other than data or errors in SvelteKit page components. |  |
 
 ## Experimental
 
diff --git a/docs/rules.md b/docs/rules.md
index 047b2ab..f07b703 100644
--- a/docs/rules.md
+++ b/docs/rules.md
@@ -14,27 +14,25 @@ sidebarDepth: 0
 
 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                                                                                                    |                |
-| [svelte/no-dupe-style-properties](./rules/no-dupe-style-properties.md)                                         | disallow duplicate style properties                                                                                                    | :star:         |
-| [svelte/no-dupe-use-directives](./rules/no-dupe-use-directives.md)                                             | disallow duplicate `use:` directives                                                                                                   |                |
-| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md)                                                 | disallow dynamic slot name                                                                                                             | :star::wrench: |
-| [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-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                          |                |
-| [svelte/no-unknown-style-directive-property](./rules/no-unknown-style-directive-property.md)                   | disallow unknown `style:property`                                                                                                      | :star:         |
-| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md)               | store callbacks must use `set` param                                                                                                   |                |
-| [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md)                               | disallow to use of the store itself as an operand. Need to use $ prefix or get function.                                               | :wrench:       |
-| [svelte/valid-compile](./rules/valid-compile.md)                                                               | disallow warnings when compiling.                                                                                                      | :star:         |
-| [svelte/valid-prop-names-in-kit-pages](./rules/valid-prop-names-in-kit-pages.md)                               | disallow props other than data or errors in SvelteKit page components.                                                                 |                |
+| 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-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                                                                                                    |                |
+| [svelte/no-dupe-style-properties](./rules/no-dupe-style-properties.md)                           | disallow duplicate style properties                                                                                                    | :star:         |
+| [svelte/no-dupe-use-directives](./rules/no-dupe-use-directives.md)                               | disallow duplicate `use:` directives                                                                                                   |                |
+| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md)                                   | disallow dynamic slot name                                                                                                             | :star::wrench: |
+| [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                          |                |
+| [svelte/no-unknown-style-directive-property](./rules/no-unknown-style-directive-property.md)     | disallow unknown `style:property`                                                                                                      | :star:         |
+| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param                                                                                                   |                |
+| [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md)                 | disallow to use of the store itself as an operand. Need to use $ prefix or get function.                                               | :wrench:       |
+| [svelte/valid-compile](./rules/valid-compile.md)                                                 | disallow warnings when compiling.                                                                                                      | :star:         |
 
 ## Security Vulnerability
 
@@ -111,9 +109,11 @@ These rules extend the rules provided by ESLint itself, or other plugins to work
 
 These rules relate to SvelteKit and its best Practices.
 
-| Rule ID                                                                    | Description                                                                            |     |
-| :------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :-- |
-| [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) | disallow using navigation (links, goto, pushState, replaceState) without the base path |     |
+| Rule ID                                                                                                        | Description                                                                            |     |
+| :------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | :-- |
+| [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-navigation-without-base](./rules/no-navigation-without-base.md)                                     | disallow using navigation (links, goto, pushState, replaceState) without the base path |     |
+| [svelte/valid-prop-names-in-kit-pages](./rules/valid-prop-names-in-kit-pages.md)                               | disallow props other than data or errors in SvelteKit page components.                 |     |
 
 ## Experimental
 
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 9ff2c1b..5caf23a 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.3",
+  "packageManager": "pnpm@9.15.4",
   "scripts": {
     "prerelease": "cd packages/eslint-plugin-svelte && pnpm clean && pnpm run build && cd ../.. && cp README.md packages/eslint-plugin-svelte",
     "release": "changeset publish",
@@ -25,7 +25,7 @@
     "c8": "^10.1.2",
     "env-cmd": "^10.1.0",
     "eslint": "~9.18.0",
-    "eslint-config-prettier": "^9.1.0",
+    "eslint-config-prettier": "^10.0.0",
     "eslint-formatter-friendly": "^7.0.0",
     "eslint-plugin-eslint-plugin": "^6.3.2",
     "eslint-plugin-jsdoc": "^50.6.0",
diff --git a/packages/eslint-plugin-svelte/CHANGELOG.md b/packages/eslint-plugin-svelte/CHANGELOG.md
index 92707fd..f0dd635 100644
--- a/packages/eslint-plugin-svelte/CHANGELOG.md
+++ b/packages/eslint-plugin-svelte/CHANGELOG.md
@@ -1,5 +1,29 @@
 # eslint-plugin-svelte
 
+## 3.0.0-next.14
+
+### Patch Changes
+
+- [#1021](https://github.com/sveltejs/eslint-plugin-svelte/pull/1021) [`6557c69`](https://github.com/sveltejs/eslint-plugin-svelte/commit/6557c69d7f3595cdf226e681cadf3d0df4c5d972) Thanks [@baseballyama](https://github.com/baseballyama)! - chore: update `svelte-eslint-parser` to `1.0.0-next.10`
+
+## 3.0.0-next.13
+
+### Major Changes
+
+- [#982](https://github.com/sveltejs/eslint-plugin-svelte/pull/982) [`04fc429`](https://github.com/sveltejs/eslint-plugin-svelte/commit/04fc4292ef68134691ac1808fd92688bd9982d37) Thanks [@baseballyama](https://github.com/baseballyama)! - feat!: Updated the `html-self-closing` rule to follow Svelte5
+
+### Minor Changes
+
+- [#1015](https://github.com/sveltejs/eslint-plugin-svelte/pull/1015) [`8369eaf`](https://github.com/sveltejs/eslint-plugin-svelte/commit/8369eaf5d2e77fccf0ac9fb3f663d94a2b323a4f) Thanks [@mikededo](https://github.com/mikededo)! - fix!: rename `no-deprecated-raw-special-elements` to `no-raw-special-elements`
+
+### Patch Changes
+
+- [#1009](https://github.com/sveltejs/eslint-plugin-svelte/pull/1009) [`a003664`](https://github.com/sveltejs/eslint-plugin-svelte/commit/a0036643b5451f0423cd61dafd092c39bd6f4bcb) Thanks [@baseballyama](https://github.com/baseballyama)! - chore: upgrade `svelte-eslint-parser` to `1.0.0-next.8`
+
+- [#1020](https://github.com/sveltejs/eslint-plugin-svelte/pull/1020) [`eae0e2e`](https://github.com/sveltejs/eslint-plugin-svelte/commit/eae0e2e52c2812ea630eea45e5be4f439191c806) Thanks [@baseballyama](https://github.com/baseballyama)! - chore: update `svelte-eslint-parser` to `1.0.0-next.9`
+
+- [#1007](https://github.com/sveltejs/eslint-plugin-svelte/pull/1007) [`8e9199a`](https://github.com/sveltejs/eslint-plugin-svelte/commit/8e9199ae326110778e4b0557616d394c6ac5e847) Thanks [@baseballyama](https://github.com/baseballyama)! - fix: update method for extracting major version
+
 ## 3.0.0-next.12
 
 ### Patch Changes
diff --git a/packages/eslint-plugin-svelte/package.json b/packages/eslint-plugin-svelte/package.json
index 674889c..fad005e 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.12",
+  "version": "3.0.0-next.14",
   "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",
@@ -65,7 +65,7 @@
     "postcss-load-config": "^3.1.4",
     "postcss-safe-parser": "^7.0.0",
     "semver": "^7.6.3",
-    "svelte-eslint-parser": "^1.0.0-next.8"
+    "svelte-eslint-parser": "^1.0.0-next.10"
   },
   "devDependencies": {
     "@babel/core": "^7.26.0",
diff --git a/packages/eslint-plugin-svelte/src/meta.ts b/packages/eslint-plugin-svelte/src/meta.ts
index 483121c..245559a 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.12';
+export const version = '3.0.0-next.14';
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/infinite-reactive-loop.ts b/packages/eslint-plugin-svelte/src/rules/infinite-reactive-loop.ts
index 7f777a9..621dfef 100644
--- a/packages/eslint-plugin-svelte/src/rules/infinite-reactive-loop.ts
+++ b/packages/eslint-plugin-svelte/src/rules/infinite-reactive-loop.ts
@@ -378,7 +378,17 @@ export default createRule('infinite-reactive-loop', {
 			unexpectedCall:
 				'Possibly it may occur an infinite reactive loop because this function may update `{{variableName}}`.'
 		},
-		type: 'suggestion'
+		type: 'suggestion',
+		// Do not run this rule on Svelte 5 with runes.
+		conditions: [
+			{
+				svelteVersions: ['3/4']
+			},
+			{
+				svelteVersions: ['5'],
+				runes: [false, 'undetermined']
+			}
+		]
 	},
 	create(context) {
 		return {
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 3db86fe..0a39a4e 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
@@ -6,7 +6,7 @@ export default createRule('no-export-load-in-svelte-module-in-kit-pages', {
 		docs: {
 			description:
 				'disallow exporting load functions in `*.svelte` module in SvelteKit page components.',
-			category: 'Possible Errors',
+			category: 'SvelteKit',
 			// TODO Switch to recommended in the major version.
 			recommended: false
 		},
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-reactive-reassign.ts b/packages/eslint-plugin-svelte/src/rules/no-reactive-reassign.ts
index f1da8a2..fb357cf 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-reactive-reassign.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-reactive-reassign.ts
@@ -27,7 +27,16 @@ export default createRule('no-reactive-reassign', {
 			assignmentToReactiveValue: "Assignment to reactive value '{{name}}'.",
 			assignmentToReactiveValueProp: "Assignment to property of reactive value '{{name}}'."
 		},
-		type: 'problem'
+		type: 'problem',
+		conditions: [
+			{
+				svelteVersions: ['3/4']
+			},
+			{
+				svelteVersions: ['5'],
+				runes: [false, 'undetermined']
+			}
+		]
 	},
 	create(context) {
 		const props = context.options[0]?.props !== false; // default true
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 e23455d..9519414 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
@@ -26,7 +26,7 @@ export default createRule('valid-prop-names-in-kit-pages', {
 	meta: {
 		docs: {
 			description: 'disallow props other than data or errors in SvelteKit page components.',
-			category: 'Possible Errors',
+			category: 'SvelteKit',
 			// TODO Switch to recommended in the major version.
 			recommended: false
 		},
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/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,


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-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/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')
 );