Repository: eslint-community/eslint-plugin-es-x
Pull request #167 (2024-05-24 19:38:02)

Bump monaco-editor from 0.48.0 to 0.49.0
Bumps [monaco-editor](https://github.com/microsoft/monaco-editor) from 0.48.0 to 0.49.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/microsoft/monaco-editor/releases">monaco-editor's releases</a>.</em></p>
<blockquote>
<h2>v0.49.0</h2>
<h2>Changes:</h2>
<ul>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4533">#4533</a>: Adding the node versioning in the build steps of <code>publish-stable.yml</code></li>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4532">#4532</a>: Update version</li>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4450">#4450</a>: Add support for TypeSpec language</li>
</ul>
<p>This list of changes was <a href="https://dev.azure.com/monacotools/Monaco/_build/results?buildId=275037&amp;view=logs">auto generated</a>.</p>
<h2>v0.49.0-rc</h2>
<p>No release notes provided.</p>
<h2>v0.49.0-dev-20240524</h2>
<h2>Changes:</h2>
<ul>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4528">#4528</a>: chore: exclude all vscode from CG</li>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4401">#4401</a>: Adding Python f-string syntax support</li>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4305">#4305</a>: Update TypeScript to TS 5.4.5 in all projects, vendored files</li>
</ul>
<p>This list of changes was <a href="https://dev.azure.com/monacotools/Monaco/_build/results?buildId=274973&amp;view=logs">auto generated</a>.</p>
<h2>v0.49.0-dev-20240523</h2>
<h2>Changes:</h2>
<ul>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4401">#4401</a>: Adding Python f-string syntax support</li>
<li><a href="https://redirect.github.com/microsoft/monaco-editor/issues/4305">#4305</a>: Update TypeScript to TS 5.4.5 in all projects, vendored files</li>
</ul>
<p>This list of changes was <a href="https://dev.azure.com/monacotools/Monaco/_build/results?buildId=274764&amp;view=logs">auto generated</a>.</p>
<h2>v0.49.0-dev-20240522</h2>
<p>No release notes provided.</p>
<h2>v0.49.0-dev-20240521</h2>
<p>No release notes provided.</p>
<h2>v0.49.0-dev-20240520</h2>
<p>No release notes provided.</p>
<h2>v0.49.0-dev-20240519</h2>
<p>No release notes provided.</p>
<h2>v0.49.0-dev-20240518</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/microsoft/monaco-editor/blob/main/CHANGELOG.md">monaco-editor's changelog</a>.</em></p>
<blockquote>
<h2>[0.49.0]</h2>
<ul>
<li>New proposed <code>editorHoverVerbosityLevel</code> API</li>
<li>New proposed <code>newSymbolNamesProvider</code> API</li>
</ul>
<p>Contributions to <code>monaco-editor</code>:</p>
<ul>
<li><a href="https://github.com/timotheeguerin"><code>@​timotheeguerin (Timothee Guerin)</code></a>: Add support for TypeSpec language [PR <a href="https://redirect.github.com/microsoft/monaco-editor/issues/4450">#4450</a>](<a href="https://redirect.github.com/microsoft/monaco-editor/pull/4450">microsoft/monaco-editor#4450</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/microsoft/monaco-editor/commit/383fdf3fc0e1e1a024068b8d0fd4f3dcbae74d04"><code>383fdf3</code></a> Merge pull request <a href="https://redirect.github.com/microsoft/monaco-editor/issues/4533">#4533</a> from microsoft/significant-constrictor</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/ca1b8a419f90a6f077dd2cdaef40f0f47b13739e"><code>ca1b8a4</code></a> adding the node task to build step</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/8a9d28eabf0634561d0eb311b08ca95a0ff060f4"><code>8a9d28e</code></a> Merge pull request <a href="https://redirect.github.com/microsoft/monaco-editor/issues/4532">#4532</a> from microsoft/high-minnow</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/f2bb720045bdc7d85d3549e189db6e252277c393"><code>f2bb720</code></a> updating version</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/5491f5da1f4f6876c0c86d313347911a2f5efa68"><code>5491f5d</code></a> Sets node version</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/707338797bebe978449ded37c419c5daf5ad63ec"><code>7073387</code></a> Merge pull request <a href="https://redirect.github.com/microsoft/monaco-editor/issues/4450">#4450</a> from timotheeguerin/add-typespec-lang</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/ed45c2e7b8542eefaf60686c55f9fab40822b010"><code>ed45c2e</code></a> Merge branch 'main' into add-typespec-lang</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/3fd1654ff6d800788ad2efae338f441db06cc8fe"><code>3fd1654</code></a> Add docs for tests</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/2b748950d6971eea965c8807c519a51d6b39a47e"><code>2b74895</code></a> move example to where CI says it should be</li>
<li><a href="https://github.com/microsoft/monaco-editor/commit/851a5580edb76f5e69d705b990c2387231c147be"><code>851a558</code></a> Add typespec language</li>
<li>See full diff in <a href="https://github.com/microsoft/monaco-editor/compare/v0.48.0...v0.49.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=monaco-editor&package-manager=npm_and_yarn&previous-version=0.48.0&new-version=0.49.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/docs/configs/index.md b/docs/configs/index.md
index b60b546..1fcbe2c 100644
--- a/docs/configs/index.md
+++ b/docs/configs/index.md
@@ -928,5 +928,33 @@ export default [
 }
 ```
 
+## no-set-methods
+
+disallow proposal ES2025 [Set Methods for JavaScript](https://github.com/tc39/proposal-set-methods)\
+⚠️ This config will be changed in the minor versions of this plugin.
+
+This configs includes rules for [es-x/no-set-prototype-difference](../rules/no-set-prototype-difference.md), [es-x/no-set-prototype-intersection](../rules/no-set-prototype-intersection.md), [es-x/no-set-prototype-isdisjointfrom](../rules/no-set-prototype-isdisjointfrom.md), [es-x/no-set-prototype-issubsetof](../rules/no-set-prototype-issubsetof.md), [es-x/no-set-prototype-issupersetof](../rules/no-set-prototype-issupersetof.md), [es-x/no-set-prototype-symmetricdifference](../rules/no-set-prototype-symmetricdifference.md), and [es-x/no-set-prototype-union](../rules/no-set-prototype-union.md).
+
+### [Config (Flat Config)]
+
+eslint.config.js:
+
+```js
+import pluginESx from "eslint-plugin-es-x"
+export default [
+    pluginESx.configs['flat/no-set-methods']
+]
+```
+
+### [Legacy Config]
+
+.eslintrc.*:
+
+```json
+{
+    "extends": ["plugin:es-x/no-set-methods"],
+}
+```
+
 [Config (Flat Config)]: https://eslint.org/docs/latest/use/configure/configuration-files-new
 [Legacy Config]: https://eslint.org/docs/latest/use/configure/configuration-files
diff --git a/docs/rules/index.md b/docs/rules/index.md
index 8fbaf00..73750c7 100644
--- a/docs/rules/index.md
+++ b/docs/rules/index.md
@@ -4,6 +4,20 @@ This plugin provides the following rules.
 
 - 🔧 mark means that 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 the rule.
 
+## ES2025
+
+There is a config that enables the rules in this category: [`no-new-in-esnext`]
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-set-prototype-difference](./no-set-prototype-difference.md) | disallow the `Set.prototype.difference` method. |  |
+| [es-x/no-set-prototype-intersection](./no-set-prototype-intersection.md) | disallow the `Set.prototype.intersection` method. |  |
+| [es-x/no-set-prototype-isdisjointfrom](./no-set-prototype-isdisjointfrom.md) | disallow the `Set.prototype.isDisjointFrom` method. |  |
+| [es-x/no-set-prototype-issubsetof](./no-set-prototype-issubsetof.md) | disallow the `Set.prototype.isSubsetOf` method. |  |
+| [es-x/no-set-prototype-issupersetof](./no-set-prototype-issupersetof.md) | disallow the `Set.prototype.isSupersetOf` method. |  |
+| [es-x/no-set-prototype-symmetricdifference](./no-set-prototype-symmetricdifference.md) | disallow the `Set.prototype.symmetricDifference` method. |  |
+| [es-x/no-set-prototype-union](./no-set-prototype-union.md) | disallow the `Set.prototype.union` method. |  |
+
 ## ES2024
 
 There is a config that enables the rules in this category: [`no-new-in-esnext`]
diff --git a/docs/rules/no-set-prototype-difference.md b/docs/rules/no-set-prototype-difference.md
new file mode 100644
index 0000000..48446fc
--- /dev/null
+++ b/docs/rules/no-set-prototype-difference.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-difference"
+description: "disallow the `Set.prototype.difference` method"
+---
+
+# es-x/no-set-prototype-difference
+> disallow the `Set.prototype.difference` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.difference`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-difference: error */
+const a = new Set()
+const b = new Set()
+a.difference(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-difference.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-difference.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-intersection.md b/docs/rules/no-set-prototype-intersection.md
new file mode 100644
index 0000000..91a55b4
--- /dev/null
+++ b/docs/rules/no-set-prototype-intersection.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-intersection"
+description: "disallow the `Set.prototype.intersection` method"
+---
+
+# es-x/no-set-prototype-intersection
+> disallow the `Set.prototype.intersection` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.intersection`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-intersection: error */
+const a = new Set()
+const b = new Set()
+a.intersection(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-intersection.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-intersection.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-isdisjointfrom.md b/docs/rules/no-set-prototype-isdisjointfrom.md
new file mode 100644
index 0000000..f9ffb7a
--- /dev/null
+++ b/docs/rules/no-set-prototype-isdisjointfrom.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-isdisjointfrom"
+description: "disallow the `Set.prototype.isDisjointFrom` method"
+---
+
+# es-x/no-set-prototype-isdisjointfrom
+> disallow the `Set.prototype.isDisjointFrom` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.isDisjointFrom`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-isdisjointfrom: error */
+const a = new Set()
+const b = new Set()
+a.isDisjointFrom(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-isdisjointfrom.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-isdisjointfrom.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-issubsetof.md b/docs/rules/no-set-prototype-issubsetof.md
new file mode 100644
index 0000000..b1d8d07
--- /dev/null
+++ b/docs/rules/no-set-prototype-issubsetof.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-issubsetof"
+description: "disallow the `Set.prototype.isSubsetOf` method"
+---
+
+# es-x/no-set-prototype-issubsetof
+> disallow the `Set.prototype.isSubsetOf` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.isSubsetOf`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-issubsetof: error */
+const a = new Set()
+const b = new Set()
+a.isSubsetOf(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-issubsetof.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-issubsetof.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-issupersetof.md b/docs/rules/no-set-prototype-issupersetof.md
new file mode 100644
index 0000000..03d8b1b
--- /dev/null
+++ b/docs/rules/no-set-prototype-issupersetof.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-issupersetof"
+description: "disallow the `Set.prototype.isSupersetOf` method"
+---
+
+# es-x/no-set-prototype-issupersetof
+> disallow the `Set.prototype.isSupersetOf` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.isSupersetOf`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-issupersetof: error */
+const a = new Set()
+const b = new Set()
+a.isSupersetOf(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-issupersetof.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-issupersetof.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-symmetricdifference.md b/docs/rules/no-set-prototype-symmetricdifference.md
new file mode 100644
index 0000000..53e9ff1
--- /dev/null
+++ b/docs/rules/no-set-prototype-symmetricdifference.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-symmetricdifference"
+description: "disallow the `Set.prototype.symmetricDifference` method"
+---
+
+# es-x/no-set-prototype-symmetricdifference
+> disallow the `Set.prototype.symmetricDifference` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.symmetricDifference`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-symmetricdifference: error */
+const a = new Set()
+const b = new Set()
+a.symmetricDifference(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-symmetricdifference.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-symmetricdifference.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/docs/rules/no-set-prototype-union.md b/docs/rules/no-set-prototype-union.md
new file mode 100644
index 0000000..c7a4fb6
--- /dev/null
+++ b/docs/rules/no-set-prototype-union.md
@@ -0,0 +1,37 @@
+---
+title: "es-x/no-set-prototype-union"
+description: "disallow the `Set.prototype.union` method"
+---
+
+# es-x/no-set-prototype-union
+> disallow the `Set.prototype.union` method
+
+- ❗ <badge text="This rule has not been released yet." vertical="middle" type="error"> ***This rule has not been released yet.*** </badge>
+- ✅ The following configurations enable this rule: [no-new-in-esnext] and [no-set-methods]
+
+This rule reports ES2025 [`Set.prototype.union`](https://github.com/tc39/proposal-set-methods) methods as errors.
+
+This rule is silent by default because it's hard to know types. You need to configure [the aggressive mode](../#the-aggressive-mode) or TypeScript in order to enable this rule.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-set-prototype-union: error */
+const a = new Set()
+const b = new Set()
+a.union(b)
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-set-prototype-union.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-set-prototype-union.js)
+
+[no-new-in-esnext]: ../configs/index.md#no-new-in-esnext
+[no-set-methods]: ../configs/index.md#no-set-methods
diff --git a/lib/configs/flat/no-new-in-esnext.js b/lib/configs/flat/no-new-in-esnext.js
index 1e23dc0..d3ccfd0 100644
--- a/lib/configs/flat/no-new-in-esnext.js
+++ b/lib/configs/flat/no-new-in-esnext.js
@@ -11,6 +11,13 @@ module.exports = {
         },
     },
     rules: {
+        "es-x/no-set-prototype-difference": "error",
+        "es-x/no-set-prototype-intersection": "error",
+        "es-x/no-set-prototype-isdisjointfrom": "error",
+        "es-x/no-set-prototype-issubsetof": "error",
+        "es-x/no-set-prototype-issupersetof": "error",
+        "es-x/no-set-prototype-symmetricdifference": "error",
+        "es-x/no-set-prototype-union": "error",
         "es-x/no-arraybuffer-prototype-transfer": "error",
         "es-x/no-atomics-waitasync": "error",
         "es-x/no-object-map-groupby": "error",
diff --git a/lib/configs/flat/no-set-methods.js b/lib/configs/flat/no-set-methods.js
new file mode 100644
index 0000000..3607ba0
--- /dev/null
+++ b/lib/configs/flat/no-set-methods.js
@@ -0,0 +1,22 @@
+/**
+ * DON'T EDIT THIS FILE.
+ * This file was generated by "scripts/update-lib-flat-configs.js" script.
+ */
+"use strict"
+
+module.exports = {
+    plugins: {
+        get "es-x"() {
+            return require("../../index.js")
+        },
+    },
+    rules: {
+        "es-x/no-set-prototype-difference": "error",
+        "es-x/no-set-prototype-intersection": "error",
+        "es-x/no-set-prototype-isdisjointfrom": "error",
+        "es-x/no-set-prototype-issubsetof": "error",
+        "es-x/no-set-prototype-issupersetof": "error",
+        "es-x/no-set-prototype-symmetricdifference": "error",
+        "es-x/no-set-prototype-union": "error",
+    },
+}
diff --git a/lib/configs/no-new-in-esnext.js b/lib/configs/no-new-in-esnext.js
index ff1314e..7efb19b 100644
--- a/lib/configs/no-new-in-esnext.js
+++ b/lib/configs/no-new-in-esnext.js
@@ -7,6 +7,13 @@
 module.exports = {
     plugins: ["es-x"],
     rules: {
+        "es-x/no-set-prototype-difference": "error",
+        "es-x/no-set-prototype-intersection": "error",
+        "es-x/no-set-prototype-isdisjointfrom": "error",
+        "es-x/no-set-prototype-issubsetof": "error",
+        "es-x/no-set-prototype-issupersetof": "error",
+        "es-x/no-set-prototype-symmetricdifference": "error",
+        "es-x/no-set-prototype-union": "error",
         "es-x/no-arraybuffer-prototype-transfer": "error",
         "es-x/no-atomics-waitasync": "error",
         "es-x/no-object-map-groupby": "error",
diff --git a/lib/configs/no-set-methods.js b/lib/configs/no-set-methods.js
new file mode 100644
index 0000000..d5f6acc
--- /dev/null
+++ b/lib/configs/no-set-methods.js
@@ -0,0 +1,18 @@
+/**
+ * DON'T EDIT THIS FILE.
+ * This file was generated by "scripts/update-lib-configs.js" script.
+ */
+"use strict"
+
+module.exports = {
+    plugins: ["es-x"],
+    rules: {
+        "es-x/no-set-prototype-difference": "error",
+        "es-x/no-set-prototype-intersection": "error",
+        "es-x/no-set-prototype-isdisjointfrom": "error",
+        "es-x/no-set-prototype-issubsetof": "error",
+        "es-x/no-set-prototype-issupersetof": "error",
+        "es-x/no-set-prototype-symmetricdifference": "error",
+        "es-x/no-set-prototype-union": "error",
+    },
+}
diff --git a/lib/index.js b/lib/index.js
index a9498d5..d2f73db 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -31,6 +31,7 @@ module.exports = {
         "flat/no-new-in-es2023-intl-api": require("./configs/flat/no-new-in-es2023-intl-api"),
         "flat/no-new-in-esnext": require("./configs/flat/no-new-in-esnext"),
         "flat/no-new-in-esnext-intl-api": require("./configs/flat/no-new-in-esnext-intl-api"),
+        "flat/no-set-methods": require("./configs/flat/no-set-methods"),
         "flat/restrict-to-es-intl-api-1st-edition": require("./configs/flat/restrict-to-es-intl-api-1st-edition"),
         "flat/restrict-to-es3": require("./configs/flat/restrict-to-es3"),
         "flat/restrict-to-es5": require("./configs/flat/restrict-to-es5"),
@@ -71,6 +72,7 @@ module.exports = {
         "no-new-in-es2023-intl-api": require("./configs/no-new-in-es2023-intl-api"),
         "no-new-in-esnext": require("./configs/no-new-in-esnext"),
         "no-new-in-esnext-intl-api": require("./configs/no-new-in-esnext-intl-api"),
+        "no-set-methods": require("./configs/no-set-methods"),
         "restrict-to-es-intl-api-1st-edition": require("./configs/restrict-to-es-intl-api-1st-edition"),
         "restrict-to-es3": require("./configs/restrict-to-es3"),
         "restrict-to-es5": require("./configs/restrict-to-es5"),
@@ -284,6 +286,13 @@ module.exports = {
         "no-rest-parameters": require("./rules/no-rest-parameters"),
         "no-rest-spread-properties": require("./rules/no-rest-spread-properties"),
         "no-set": require("./rules/no-set"),
+        "no-set-prototype-difference": require("./rules/no-set-prototype-difference"),
+        "no-set-prototype-intersection": require("./rules/no-set-prototype-intersection"),
+        "no-set-prototype-isdisjointfrom": require("./rules/no-set-prototype-isdisjointfrom"),
+        "no-set-prototype-issubsetof": require("./rules/no-set-prototype-issubsetof"),
+        "no-set-prototype-issupersetof": require("./rules/no-set-prototype-issupersetof"),
+        "no-set-prototype-symmetricdifference": require("./rules/no-set-prototype-symmetricdifference"),
+        "no-set-prototype-union": require("./rules/no-set-prototype-union"),
         "no-shadow-catch-param": require("./rules/no-shadow-catch-param"),
         "no-shared-array-buffer": require("./rules/no-shared-array-buffer"),
         "no-spread-elements": require("./rules/no-spread-elements"),
diff --git a/lib/rules/no-set-prototype-difference.js b/lib/rules/no-set-prototype-difference.js
new file mode 100644
index 0000000..8c5ede6
--- /dev/null
+++ b/lib/rules/no-set-prototype-difference.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.difference` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-difference.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["difference"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-intersection.js b/lib/rules/no-set-prototype-intersection.js
new file mode 100644
index 0000000..68776be
--- /dev/null
+++ b/lib/rules/no-set-prototype-intersection.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.intersection` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-intersection.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["intersection"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-isdisjointfrom.js b/lib/rules/no-set-prototype-isdisjointfrom.js
new file mode 100644
index 0000000..198a4bd
--- /dev/null
+++ b/lib/rules/no-set-prototype-isdisjointfrom.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.isDisjointFrom` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-isdisjointfrom.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["isDisjointFrom"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-issubsetof.js b/lib/rules/no-set-prototype-issubsetof.js
new file mode 100644
index 0000000..780f21c
--- /dev/null
+++ b/lib/rules/no-set-prototype-issubsetof.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.isSubsetOf` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-issubsetof.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["isSubsetOf"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-issupersetof.js b/lib/rules/no-set-prototype-issupersetof.js
new file mode 100644
index 0000000..a3f3500
--- /dev/null
+++ b/lib/rules/no-set-prototype-issupersetof.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.isSupersetOf` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-issupersetof.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["isSupersetOf"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-symmetricdifference.js b/lib/rules/no-set-prototype-symmetricdifference.js
new file mode 100644
index 0000000..9f92de6
--- /dev/null
+++ b/lib/rules/no-set-prototype-symmetricdifference.js
@@ -0,0 +1,37 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description:
+                "disallow the `Set.prototype.symmetricDifference` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-symmetricdifference.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["symmetricDifference"],
+        })
+    },
+}
diff --git a/lib/rules/no-set-prototype-union.js b/lib/rules/no-set-prototype-union.js
new file mode 100644
index 0000000..bb4c47f
--- /dev/null
+++ b/lib/rules/no-set-prototype-union.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Set.prototype.union` method.",
+            category: "ES2025",
+            proposal: "set-methods",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-set-prototype-union.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2025 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Set: ["union"],
+        })
+    },
+}
diff --git a/package.json b/package.json
index 1e71e7a..68b5c60 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,7 @@
     "globals": "^15.0.0",
     "jsdom": "^24.0.0",
     "mocha": "^10.0.0",
-    "monaco-editor": "^0.48.0",
+    "monaco-editor": "^0.49.0",
     "npm-run-all": "^4.1.5",
     "nyc": "^15.0.0",
     "opener": "^1.5.1",
diff --git a/scripts/new-rule.js b/scripts/new-rule.js
index a8cbf95..86c0b7f 100644
--- a/scripts/new-rule.js
+++ b/scripts/new-rule.js
@@ -112,4 +112,4 @@ This rule reports ??? as errors.
 ${yellow}npx mocha "tests/**/${ruleId}.js" --reporter dot --timeout 60000${reset}
 
 `)
-})(process.argv[2])
+})(String(process.argv[2]).toLowerCase())
diff --git a/scripts/proposals.js b/scripts/proposals.js
index e1f250b..14e4f64 100644
--- a/scripts/proposals.js
+++ b/scripts/proposals.js
@@ -1,3 +1,8 @@
 "use strict"
 
-module.exports = {}
+module.exports = {
+    "set-methods": {
+        title: "Set Methods for JavaScript",
+        link: "https://github.com/tc39/proposal-set-methods",
+    },
+}
diff --git a/scripts/rules.js b/scripts/rules.js
index 5ec5adb..264127d 100644
--- a/scripts/rules.js
+++ b/scripts/rules.js
@@ -21,6 +21,7 @@ const libRoot = path.resolve(__dirname, "../lib/rules")
  * @property {string} id The category name.
  * @property {string} title The category title.
  * @property {number} [edition] The edition number.
+ * @property {number} [year] The year.
  * @property {string} [configName] The config name.
  * @property {string} [aboveConfigName] The config name for disallowing features all above.
  * @property {Rule[]} rules The rules in this category.
@@ -57,6 +58,7 @@ const categories = [
                 id: ecma262Id,
                 title: `ES${vFor262}`,
                 edition: vFor262 > 5 ? vFor262 - 2009 : vFor262,
+                year: vFor262 > 5 ? vFor262 : vFor262 + 2009,
                 rules: [],
                 experimental,
                 specKind: "ecma262",
@@ -74,7 +76,8 @@ const categories = [
             map[ecma402Id] = {
                 id: ecma402Id,
                 title: `ES${vFor402} Intl API`,
-                edition: vFor402 - 2013,
+                edition: vFor402 > 1 ? vFor402 - 2013 : vFor402,
+                year: vFor402 > 1 ? vFor402 : vFor402 + 2013,
                 rules: [],
                 experimental,
                 specKind: "ecma402",
@@ -172,10 +175,21 @@ const rules = []
         for (const proposal of proposalIds) {
             const id = `no-${proposal}`
 
+            if (!proposals[proposal]) {
+                throw new Error(
+                    `Missing define proposal: ${proposal}\nWe need to add it to scripts/proposals.js.`,
+                )
+            }
+
+            const baseCategory = categories[category]
+
             ;(categories[id] = categories[id] || {
                 id,
-                title: `[${proposals[proposal].title}](${proposals[proposal].link})`,
+                title: `${baseCategory.title} [${proposals[proposal].title}](${proposals[proposal].link})`,
+                edition: baseCategory.edition,
+                year: baseCategory.year,
                 rules: [],
+                experimental: baseCategory.experimental,
                 specKind: "proposal",
                 configName: id,
             }).rules.push(rule)
diff --git a/scripts/update-docs-configs.js b/scripts/update-docs-configs.js
index d395f1e..38df493 100644
--- a/scripts/update-docs-configs.js
+++ b/scripts/update-docs-configs.js
@@ -30,17 +30,65 @@ for (const { configName, rules, ...config } of Object.values(categories)) {
     }
 }
 
-for (const {
+Object.values(configs)
+    .filter(
+        (cat, i, list) =>
+            cat.specKind !== "proposal" &&
+            list.slice(0, i).every((c) => c.configName !== cat.configName),
+    )
+    .forEach(processCategoryConfig)
+
+for (const { title, aboveConfigName, specKind } of Object.values(configs)) {
+    if (!aboveConfigName) {
+        continue
+    }
+
+    contents.push(`## ${aboveConfigName}`)
+    contents.push("")
+    contents.push(
+        specKind === "ecma262"
+            ? `disallow new stuff that ${title} doesn't include`
+            : `disallow new stuff that ${title} (ECMA-402) doesn't include`,
+    )
+    contents.push("")
+    appendConfig(aboveConfigName)
+}
+
+Object.values(configs)
+    .filter((cat) => cat.specKind === "proposal")
+    .sort(
+        (a, b) =>
+            b.year - a.year ||
+            (a.configName > b.configName
+                ? 1
+                : a.configName < b.configName
+                  ? -1
+                  : 0),
+    )
+    .forEach(processCategoryConfig)
+
+contents.push(
+    "[Config (Flat Config)]: https://eslint.org/docs/latest/use/configure/configuration-files-new",
+)
+contents.push(
+    "[Legacy Config]: https://eslint.org/docs/latest/use/configure/configuration-files",
+)
+
+fs.writeFileSync(MD_PATH, `${contents.join("\n").trim()}\n`)
+
+/**
+ * Process for normal category config
+ * @param {import("./rules").Category} params
+ */
+function processCategoryConfig({
     title,
     rules,
     configName,
     specKind,
     experimental,
-} of Object.values(configs).filter((cat, i, list) =>
-    list.slice(0, i).every((c) => c.configName !== cat.configName),
-)) {
+}) {
     if (!configName || !rules.length) {
-        continue
+        return
     }
     contents.push(`## ${configName}`)
     contents.push("")
@@ -51,7 +99,7 @@ for (const {
                 ? "disallow the new stuff to be planned for the next yearly ECMAScript snapshot.\\"
                 : specKind === "ecma402"
                   ? "disallow the new stuff to be planned for the next yearly ECMAScript Intl API (ECMA-402) snapshot.\\"
-                  : "",
+                  : `disallow proposal ${title}\\`,
         )
         contents.push(
             "⚠️ This config will be changed in the minor versions of this plugin.",
@@ -65,34 +113,23 @@ for (const {
                   : `disallow proposal ${title}`,
         )
     }
-    contents.push("")
-    appendConfig(configName)
-}
-for (const { title, aboveConfigName, specKind } of Object.values(configs)) {
-    if (!aboveConfigName) {
-        continue
+
+    if (specKind === "proposal") {
+        contents.push("")
+        contents.push(
+            `This configs includes rules for ${formatList(
+                rules.map((rule) => {
+                    const ruleId = rule.ruleId
+                    return `[es-x/${ruleId}](../rules/${ruleId}.md)`
+                }),
+            )}.`,
+        )
     }
 
-    contents.push(`## ${aboveConfigName}`)
-    contents.push("")
-    contents.push(
-        specKind === "ecma262"
-            ? `disallow new stuff that ${title} doesn't include`
-            : `disallow new stuff that ${title} (ECMA-402) doesn't include`,
-    )
     contents.push("")
-    appendConfig(aboveConfigName)
+    appendConfig(configName)
 }
 
-contents.push(
-    "[Config (Flat Config)]: https://eslint.org/docs/latest/use/configure/configuration-files-new",
-)
-contents.push(
-    "[Legacy Config]: https://eslint.org/docs/latest/use/configure/configuration-files",
-)
-
-fs.writeFileSync(MD_PATH, `${contents.join("\n").trim()}\n`)
-
 function appendConfig(configName) {
     contents.push("### [Config (Flat Config)]")
     contents.push("")
@@ -116,3 +153,23 @@ export default [
     contents.push("```")
     contents.push("")
 }
+
+/**
+ * Format a list.
+ * @param {string[]} xs The list value to format.
+ */
+function formatList(xs) {
+    switch (xs.length) {
+        case 0:
+            return ""
+        case 1:
+            return xs[0]
+        case 2:
+            return `${xs[0]} and ${xs[1]}`
+        default: {
+            const ys = xs.slice(0, xs.length - 1)
+            const last = xs[xs.length - 1]
+            return `${ys.join(", ")}, and ${last}`
+        }
+    }
+}


Test patch:
diff --git a/tests/lib/rules/no-set-prototype-difference.js b/tests/lib/rules/no-set-prototype-difference.js
new file mode 100644
index 0000000..0584c29
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-difference.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-difference.js")
+const ruleId = "no-set-prototype-difference"
+
+const method = "difference"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-intersection.js b/tests/lib/rules/no-set-prototype-intersection.js
new file mode 100644
index 0000000..32a418c
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-intersection.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-intersection.js")
+const ruleId = "no-set-prototype-intersection"
+
+const method = "intersection"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-isdisjointfrom.js b/tests/lib/rules/no-set-prototype-isdisjointfrom.js
new file mode 100644
index 0000000..e59853d
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-isdisjointfrom.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-isdisjointfrom.js")
+const ruleId = "no-set-prototype-isdisjointfrom"
+
+const method = "isDisjointFrom"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-issubsetof.js b/tests/lib/rules/no-set-prototype-issubsetof.js
new file mode 100644
index 0000000..c94a783
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-issubsetof.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-issubsetof.js")
+const ruleId = "no-set-prototype-issubsetof"
+
+const method = "isSubsetOf"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-issupersetof.js b/tests/lib/rules/no-set-prototype-issupersetof.js
new file mode 100644
index 0000000..07b93d6
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-issupersetof.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-issupersetof.js")
+const ruleId = "no-set-prototype-issupersetof"
+
+const method = "isSupersetOf"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-symmetricdifference.js b/tests/lib/rules/no-set-prototype-symmetricdifference.js
new file mode 100644
index 0000000..5c4aba6
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-symmetricdifference.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-symmetricdifference.js")
+const ruleId = "no-set-prototype-symmetricdifference"
+
+const method = "symmetricDifference"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-set-prototype-union.js b/tests/lib/rules/no-set-prototype-union.js
new file mode 100644
index 0000000..39e0d72
--- /dev/null
+++ b/tests/lib/rules/no-set-prototype-union.js
@@ -0,0 +1,92 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-set-prototype-union.js")
+const ruleId = "no-set-prototype-union"
+
+const method = "union"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        `${method}(other)`,
+        `foo.${method}(other)`,
+        "foo.add(other)",
+        {
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.add(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: `${method}(other)`,
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: `foo.${method}(other)`,
+            options: [{ aggressive: true }],
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({
+    languageOptions: { parser, parserOptions: { tsconfigRootDir, project } },
+}).run(`${ruleId} TS Full Types`, rule, {
+    valid: [
+        { filename, code: `${method}(other)` },
+        { filename, code: "foo.add(other)" },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `let foo = {}; foo.${method}(other)`,
+        },
+        {
+            filename,
+            code: `${method}(other)`,
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.add(other)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: `let foo = new Set(); foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `function f<T extends Set<string>>(a: T) { a.${method}(other) }`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+        },
+        {
+            filename,
+            code: `foo.${method}(other)`,
+            errors: [`ES2025 'Set.prototype.${method}' method is forbidden.`],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})