Repository: eslint-community/eslint-plugin-es-x
Pull request #152 (2024-04-21 23:39:18)

chore: use flat config & eslint v9


Patch:
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 369a17f..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1,8 +0,0 @@
-/.nyc_output
-/coverage
-/docs/.vitepress/dist
-/docs/.vitepress/cache
-/node_modules
-/test.*
-
-!docs/.vitepress
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 696eadd..0000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict"
-
-module.exports = {
-    extends: [
-        "./eslint-internal/config/es2020.js",
-        "./eslint-internal/config/+eslint-plugin.js",
-    ],
-    ignorePatterns: [
-        "/.nyc_output",
-        "/coverage",
-        "/node_modules",
-        "*.ts",
-        "!.vuepress",
-        "/docs/.vuepress/dist",
-    ],
-    globals: { fetch: "readonly" },
-    rules: {
-        "no-restricted-properties": [
-            "error",
-            {
-                object: "context",
-                property: "getSourceCode",
-                message: "Use eslint-compat-utils",
-            },
-            {
-                object: "context",
-                property: "getFilename",
-                message: "Use eslint-compat-utils",
-            },
-            {
-                object: "context",
-                property: "getPhysicalFilename",
-                message: "Use eslint-compat-utils",
-            },
-            {
-                object: "context",
-                property: "getCwd",
-                message: "Use eslint-compat-utils",
-            },
-            {
-                object: "context",
-                property: "getScope",
-                message: "Use sourceCode.getScope(node)",
-            },
-            {
-                object: "context",
-                property: "parserServices",
-                message: "Use sourceCode.parserServices",
-            },
-            {
-                object: "context",
-                property: "getDeclaredVariables",
-                message: "Use sourceCode.getDeclaredVariables(node)",
-            },
-        ],
-    },
-    overrides: [
-        {
-            files: "lib/rules/**/*.js",
-            rules: {
-                "eslint-plugin/require-meta-docs-url": [
-                    "error",
-                    {
-                        pattern:
-                            "http://eslint-community.github.io/eslint-plugin-es-x/rules/{{name}}.html",
-                    },
-                ],
-            },
-        },
-    ],
-}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 23670df..11f5894 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -27,24 +27,23 @@ jobs:
     strategy:
       matrix:
         include:
-          - eslint: 8
-            node: 18
+          - eslint: 9
+            node: 20
             os: ubuntu-latest
           # On other platforms
-          - eslint: 8
-            node: 18
+          - eslint: 9
+            node: 20
             os: windows-latest
-          - eslint: 8
-            node: 18
-            os: macos-latest
-          # On next Node.js versions
-          - eslint: ^9.0.0-0
+          - eslint: 9
             node: 20
-            os: ubuntu-latest
+            os: macos-latest
           # On other Node.js versions
           - eslint: 8
             node: 19
             os: ubuntu-latest
+          - eslint: 9
+            node: 18
+            os: ubuntu-latest
           - eslint: 8
             node: 16
             os: ubuntu-latest
@@ -79,7 +78,7 @@ jobs:
             npm r -D vuepress eslint-plugin-eslint-plugin eslint-plugin-prettier vue-eslint-parser eslint-plugin-vue
       - name: Install ESLint ${{ matrix.eslint }}
         run: |+
-            npm install -D eslint@${{ matrix.eslint }} --legacy-peer-deps
+            npm install -D eslint@${{ matrix.eslint }}
             npx rimraf node_modules
       - name: Install "@typescript-eslint/parser" ${{ matrix.tseslint }}
         run: |+
@@ -87,6 +86,6 @@ jobs:
             npx rimraf node_modules
         if: matrix.tseslint == 5
       - name: Install Packages
-        run: npm install -f
+        run: npm install
       - name: Test
         run: npm run -s test:mocha
diff --git a/.npmrc b/.npmrc
index c1ca392..7a67586 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,1 +1,2 @@
 package-lock = false
+force = true
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 0c0a4ec..97b66d4 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,7 +3,4 @@
         "javascript",
         "vue"
     ],
-    "eslint.options": {
-        "rulePaths": ["eslint-internal/rules"]
-    },
 }
diff --git a/docs/.vitepress/.eslintrc.js b/docs/.vitepress/.eslintrc.js
deleted file mode 100644
index 58693f5..0000000
--- a/docs/.vitepress/.eslintrc.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict"
-
-module.exports = {
-    rules: {
-        "n/no-missing-import": "off",
-        "n/no-extraneous-import": "off",
-        "n/file-extension-in-import": "off",
-        "n/no-extraneous-require": "off",
-    },
-    globals: {
-        window: "readonly",
-        document: "readonly",
-    },
-    overrides: [
-        {
-            files: ["*.vue"],
-            rules: {
-                "vue/multiline-html-element-content-newline": "off",
-                "vue/singleline-html-element-content-newline": "off",
-                "vue/name-property-casing": "off",
-                "vue/html-self-closing": "off",
-                "vue/comma-dangle": "off",
-            },
-        },
-    ],
-}
diff --git a/docs/.vitepress/theme/components/eslint-editor.vue b/docs/.vitepress/theme/components/eslint-editor.vue
index bb567da..375b027 100644
--- a/docs/.vitepress/theme/components/eslint-editor.vue
+++ b/docs/.vitepress/theme/components/eslint-editor.vue
@@ -301,10 +301,43 @@ function lint() {
     }
 }
 
+function getRuleDocUrl(ruleId) {
+    if (!ruleId.includes("/")) {
+        return `https://eslint.org/docs/rules/${ruleId}`
+    }
+    for (const config of [props.config].flat()) {
+        if (
+            config &&
+            config.plugins &&
+            typeof config.plugins === "object" &&
+            !Array.isArray(config.plugins)
+        ) {
+            for (const [pluginId, plugin] of Object.entries(config.plugins)) {
+                const pluginName = pluginId
+                    .replace(/^eslint-plugin-/u, "")
+                    .replace(/\/eslint-plugin$/u, "")
+                    .replace(/\/eslint-plugin-/u, "/")
+                if (!ruleId.startsWith(`${pluginName}/`)) {
+                    continue
+                }
+                const pluginRuleName = ruleId.slice(pluginName.length + 1)
+                const rule = plugin.rules?.[pluginRuleName]
+                if (
+                    rule &&
+                    typeof rule !== "function" &&
+                    rule?.meta?.docs?.url
+                ) {
+                    return rule.meta.docs.url
+                }
+            }
+        }
+    }
+    return null
+}
+
 /** Linter message to monaco editor marker */
 function messageToMarker(message) {
-    const rule = message.ruleId && linter.value?.getRules().get(message.ruleId)
-    const docUrl = rule && rule.meta && rule.meta.docs && rule.meta.docs.url
+    const docUrl = message.ruleId && getRuleDocUrl(message.ruleId)
     const startLineNumber = ensurePositiveInt(message.line, 1)
     const startColumn = ensurePositiveInt(message.column, 1)
     const endLineNumber = ensurePositiveInt(message.endLine, startLineNumber)
diff --git a/docs/.vitepress/theme/components/eslint-playground.vue b/docs/.vitepress/theme/components/eslint-playground.vue
index 933e82a..fd33584 100644
--- a/docs/.vitepress/theme/components/eslint-playground.vue
+++ b/docs/.vitepress/theme/components/eslint-playground.vue
@@ -43,50 +43,21 @@ const format = reactive({
 })
 
 const config = computed(() => ({
-    globals: {
-        // ES2015 globals
-        ArrayBuffer: false,
-        DataView: false,
-        Float32Array: false,
-        Float64Array: false,
-        Int16Array: false,
-        Int32Array: false,
-        Int8Array: false,
-        Map: false,
-        Promise: false,
-        Proxy: false,
-        Reflect: false,
-        Set: false,
-        Symbol: false,
-        Uint16Array: false,
-        Uint32Array: false,
-        Uint8Array: false,
-        Uint8ClampedArray: false,
-        WeakMap: false,
-        WeakSet: false,
-        // ES2017 globals
-        Atomics: false,
-        SharedArrayBuffer: false,
-        // ES2020 globals
-        BigInt: false,
-        BigInt64Array: false,
-        BigUint64Array: false,
-        globalThis: true,
-        // ES2021 globals
-        AggregateError: false,
-        FinalizationRegistry: false,
-        WeakRef: false,
-        // Intl
-        Intl: false,
+    plugins: {
+        "es-x": {
+            rules,
+        },
     },
-    rules: {},
-    parserOptions: {
-        ecmaVersion: "latest",
+    languageOptions: {
         sourceType: props.sourceType,
-        ecmaFeatures: {
-            jsx: true,
+        ecmaVersion: "latest",
+        parserOptions: {
+            ecmaFeatures: {
+                jsx: true,
+            },
         },
     },
+    rules: {},
     settings: {
         "es-x": { aggressive: true },
     },
@@ -109,10 +80,6 @@ onMounted(async () => {
     const [{ Linter }] = await Promise.all([import("eslint")])
 
     linter.value = markRaw(new Linter())
-
-    for (const ruleId of Object.keys(rules)) {
-        linter.value.defineRule(`es-x/${ruleId}`, rules[ruleId])
-    }
 })
 
 /**
diff --git a/docs/.vitepress/theme/components/monaco-editor.vue b/docs/.vitepress/theme/components/monaco-editor.vue
index 74e34ff..a745d6c 100644
--- a/docs/.vitepress/theme/components/monaco-editor.vue
+++ b/docs/.vitepress/theme/components/monaco-editor.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { loadMonacoEditor, setupMonacoEditor } from "./monaco/index"
+import { loadMonacoEditor, setupMonacoEditor } from "./monaco/index.mjs"
 import { onBeforeUnmount, onMounted, ref, watch } from "vue"
 
 const props = defineProps({
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/index.md b/docs/index.md
index 522c1da..bfa5854 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -36,13 +36,13 @@ Configure your `eslint.config.js` file.
 For example, to enable only Rest/Spread Properties in ES2018:
 
 ```js
-import * as pluginESx from "eslint-plugin-es-x"
+import pluginESx from "eslint-plugin-es-x"
 export default [
     {
         plugins: { "es-x": pluginESx },
         languageOptions: {
             ecmaVersion: 2018
-        },,
+        },
         rules: {
             "es-x/no-async-iteration": "error",
             "es-x/no-malformed-template-literals": "error",
@@ -81,7 +81,7 @@ See the [Available Configs](./configs/index.md) documentation.
 For example:
 
 ```js
-import * as pluginESx from "eslint-plugin-es-x"
+import pluginESx from "eslint-plugin-es-x"
 export default [
     pluginESx.configs['flat/restrict-to-es2018'],
 ]
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/eslint-internal/config/+browser.js b/eslint-internal/config/+browser.js
index 2d93674..6cd0640 100644
--- a/eslint-internal/config/+browser.js
+++ b/eslint-internal/config/+browser.js
@@ -6,6 +6,11 @@
 
 const globals = require("./_browser-globals")
 
-module.exports = {
-    globals,
-}
+module.exports = [
+    {
+        name: "eslint-internal/config/+browser.js",
+        languageOptions: {
+            globals,
+        },
+    },
+]
diff --git a/eslint-internal/config/+eslint-plugin.js b/eslint-internal/config/+eslint-plugin.js
index 4a7fa94..4695f24 100644
--- a/eslint-internal/config/+eslint-plugin.js
+++ b/eslint-internal/config/+eslint-plugin.js
@@ -6,63 +6,65 @@
 
 const { rulesDocumentUrl } = require("../utils")
 
-module.exports = {
-    plugins: ["eslint-plugin"],
-    extends: [require.resolve("./+node.js")],
-    overrides: [
-        {
-            files: ["**/rules/**", "**/internal-rules/**"],
-            rules: {
-                // Enabled rules
-                "eslint-plugin/consistent-output": "error",
-                "eslint-plugin/fixer-return": "error",
-                "eslint-plugin/meta-property-ordering": [
-                    "error",
-                    [
-                        "deprecated",
-                        "docs",
-                        "fixable",
-                        "messages",
-                        "replacedBy",
-                        "schema",
-                        "type",
-                    ],
+module.exports = [
+    ...require("./+node.js"),
+    {
+        name: "eslint-internal/config/+eslint-plugin.js#1",
+        plugins: { "eslint-plugin": require("eslint-plugin-eslint-plugin") },
+    },
+    {
+        name: "eslint-internal/config/+eslint-plugin.js#2",
+        files: ["**/rules/**", "**/internal-rules/**"],
+        rules: {
+            // Enabled rules
+            "eslint-plugin/consistent-output": "error",
+            "eslint-plugin/fixer-return": "error",
+            "eslint-plugin/meta-property-ordering": [
+                "error",
+                [
+                    "deprecated",
+                    "docs",
+                    "fixable",
+                    "messages",
+                    "replacedBy",
+                    "schema",
+                    "type",
                 ],
-                "eslint-plugin/no-deprecated-context-methods": "error",
-                "eslint-plugin/no-deprecated-report-api": "error",
-                "eslint-plugin/no-identical-tests": "error",
-                "eslint-plugin/no-missing-placeholders": "error",
-                "eslint-plugin/no-unused-placeholders": "error",
-                "eslint-plugin/no-useless-token-range": "error",
-                "eslint-plugin/prefer-output-null": "error",
-                "eslint-plugin/prefer-placeholders": "error",
-                "eslint-plugin/prefer-replace-text": "error",
-                "eslint-plugin/report-message-format": [
-                    "error",
-                    "[^a-z'\"{].*\\.$",
+            ],
+            "eslint-plugin/no-deprecated-context-methods": "error",
+            "eslint-plugin/no-deprecated-report-api": "error",
+            "eslint-plugin/no-identical-tests": "error",
+            "eslint-plugin/no-missing-placeholders": "error",
+            "eslint-plugin/no-unused-placeholders": "error",
+            "eslint-plugin/no-useless-token-range": "error",
+            "eslint-plugin/prefer-output-null": "error",
+            "eslint-plugin/prefer-placeholders": "error",
+            "eslint-plugin/prefer-replace-text": "error",
+            "eslint-plugin/report-message-format": [
+                "error",
+                "[^a-z'\"{].*\\.$",
+            ],
+            "eslint-plugin/require-meta-docs-url": [
+                "error",
+                { pattern: rulesDocumentUrl },
+            ],
+            "eslint-plugin/require-meta-fixable": "error",
+            "eslint-plugin/require-meta-type": "error",
+            "eslint-plugin/test-case-property-ordering": [
+                "error",
+                [
+                    "filename",
+                    "code",
+                    "output",
+                    "options",
+                    "parser",
+                    "parserOptions",
+                    "globals",
+                    "env",
+                    "errors",
                 ],
-                "eslint-plugin/require-meta-docs-url": [
-                    "error",
-                    { pattern: rulesDocumentUrl },
-                ],
-                "eslint-plugin/require-meta-fixable": "error",
-                "eslint-plugin/require-meta-type": "error",
-                "eslint-plugin/test-case-property-ordering": [
-                    "error",
-                    [
-                        "filename",
-                        "code",
-                        "output",
-                        "options",
-                        "parser",
-                        "parserOptions",
-                        "globals",
-                        "env",
-                        "errors",
-                    ],
-                ],
-                "eslint-plugin/test-case-shorthand-strings": "error",
-            },
+            ],
+            "eslint-plugin/test-case-shorthand-strings": "error",
         },
-    ],
-}
+    },
+]
diff --git a/eslint-internal/config/+modules.js b/eslint-internal/config/+modules.js
index db90014..79d381d 100644
--- a/eslint-internal/config/+modules.js
+++ b/eslint-internal/config/+modules.js
@@ -4,39 +4,36 @@
  */
 "use strict"
 
-module.exports = {
-    plugins: ["n"],
-    parserOptions: {
-        ecmaFeatures: { globalReturn: false },
-        sourceType: "module",
-    },
-    globals: {
-        __dirname: "off",
-        __filename: "off",
-        exports: "off",
-        module: "off",
-        require: "off",
-    },
-    rules: {
-        "n/no-extraneous-import": "error",
-        "n/file-extension-in-import": [
-            "error",
-            "always",
-            { ".js": "never", ".ts": "never", ".tsx": "never" },
-        ],
-        "n/no-missing-import": "error",
-        "n/no-unpublished-import": "error",
-        "n/no-unsupported-features/es-syntax": [
-            "error",
-            { ignores: ["modules", "dynamicImport"] },
-        ],
-    },
-    overrides: [
-        {
-            files: ["*.ts", "*.tsx", "*.vue"],
-            rules: {
-                "n/no-unsupported-features/es-syntax": "off",
+module.exports = [
+    {
+        name: "eslint-internal/config/+modules.js#1",
+        plugins: { n: require("eslint-plugin-n") },
+        languageOptions: {
+            sourceType: "module",
+            globals: {
+                __dirname: "off",
+                __filename: "off",
+                exports: "off",
+                module: "off",
+                require: "off",
             },
         },
-    ],
-}
+        rules: {
+            "n/no-extraneous-import": "error",
+            "n/file-extension-in-import": ["error", "always"],
+            "n/no-missing-import": "error",
+            "n/no-unpublished-import": "error",
+            "n/no-unsupported-features/es-syntax": [
+                "error",
+                { ignores: ["modules", "dynamicImport"] },
+            ],
+        },
+    },
+    {
+        name: "eslint-internal/config/+modules.js#2",
+        files: ["**/*.ts", "*.ts", "**/*.tsx", "*.tsx", "*.vue", "**/*.vue"],
+        rules: {
+            "n/no-unsupported-features/es-syntax": "off",
+        },
+    },
+]
diff --git a/eslint-internal/config/+node.js b/eslint-internal/config/+node.js
index 624955f..25a0235 100644
--- a/eslint-internal/config/+node.js
+++ b/eslint-internal/config/+node.js
@@ -4,98 +4,99 @@
  */
 "use strict"
 
-module.exports = {
-    plugins: ["n"],
-    parserOptions: {
-        ecmaFeatures: { globalReturn: true },
-        ecmaVersion: 2020,
-        sourceType: "script",
+module.exports = [
+    {
+        name: "eslint-internal/config/+node.js#1",
+        files: ["**/*.js", "*.js", "**/*.cjs", "*.cjs"],
+        languageOptions: {
+            parserOptions: {
+                ecmaFeatures: { globalReturn: true },
+            },
+            globals: {
+                // CommonJS
+                __dirname: "readonly",
+                __filename: "readonly",
+                exports: "writable",
+                module: "readonly",
+                require: "readonly",
+            },
+        },
     },
-    globals: {
-        // ECMAScript (experimental)
-        globalThis: "readonly",
-        // ECMA-404
-        Intl: "readonly",
-
-        // Web Standard
-        TextDecoder: "readonly",
-        TextEncoder: "readonly",
-        URL: "readonly",
-        URLSearchParams: "readonly",
-        WebAssembly: "readonly",
-        clearInterval: "readonly",
-        clearTimeout: "readonly",
-        console: "readonly",
-        queueMicrotask: "readonly",
-        setInterval: "readonly",
-        setTimeout: "readonly",
+    {
+        name: "eslint-internal/config/+node.js#2",
+        plugins: { n: require("eslint-plugin-n") },
+        languageOptions: {
+            ecmaVersion: 2020,
+            globals: {
+                // Web Standard
+                TextDecoder: "readonly",
+                TextEncoder: "readonly",
+                URL: "readonly",
+                URLSearchParams: "readonly",
+                WebAssembly: "readonly",
+                clearInterval: "readonly",
+                clearTimeout: "readonly",
+                console: "readonly",
+                queueMicrotask: "readonly",
+                setInterval: "readonly",
+                setTimeout: "readonly",
+                fetch: "readonly",
 
-        // Node.js
-        Buffer: "readonly",
-        GLOBAL: "readonly",
-        clearImmediate: "readonly",
-        global: "readonly",
-        process: "readonly",
-        root: "readonly",
-        setImmediate: "readonly",
-
-        // CommonJS
-        __dirname: "readonly",
-        __filename: "readonly",
-        exports: "writable",
-        module: "readonly",
-        require: "readonly",
-    },
-    rules: {
-        "n/exports-style": ["error", "module.exports"],
-        "n/file-extension-in-import": [
-            "error",
-            "always",
-            { ".js": "never", ".ts": "never", ".tsx": "never" },
-        ],
-        "n/no-callback-literal": "off",
-        "n/no-deprecated-api": "error",
-        "n/no-exports-assign": "error",
-        "n/no-extraneous-import": "error",
-        "n/no-extraneous-require": "error",
-        "n/no-missing-import": "error",
-        "n/no-missing-require": "error",
-        "n/no-unpublished-bin": "error",
-        "n/no-unpublished-import": "error",
-        "n/no-unpublished-require": "error",
-        "n/no-unsupported-features/es-builtins": "error",
-        "n/no-unsupported-features/es-syntax": "error",
-        "n/no-unsupported-features/node-builtins": "error",
-        "n/prefer-global/buffer": "error",
-        "n/prefer-global/console": "error",
-        "n/prefer-global/process": "error",
-        "n/prefer-global/text-decoder": "off",
-        "n/prefer-global/text-encoder": "off",
-        "n/prefer-global/url-search-params": "off",
-        "n/prefer-global/url": "off",
-        "n/prefer-promises/dns": "off",
-        "n/prefer-promises/fs": "off",
-        "n/process-exit-as-throw": "error",
-        "n/shebang": "error",
-    },
-    settings: {
-        node: {
-            tryExtensions: [
-                ".vue",
-                ".tsx",
-                ".ts",
-                ".mjs",
-                ".cjs",
-                ".js",
-                ".json",
-                ".node",
+                // Node.js
+                Buffer: "readonly",
+                GLOBAL: "readonly",
+                clearImmediate: "readonly",
+                global: "readonly",
+                process: "readonly",
+                root: "readonly",
+                setImmediate: "readonly",
+            },
+        },
+        rules: {
+            "n/exports-style": ["error", "module.exports"],
+            "n/file-extension-in-import": [
+                "error",
+                "always",
+                { ".js": "never", ".ts": "never", ".tsx": "never" },
             ],
+            "n/no-callback-literal": "off",
+            "n/no-deprecated-api": "error",
+            "n/no-exports-assign": "error",
+            "n/no-extraneous-import": "error",
+            "n/no-extraneous-require": "error",
+            "n/no-missing-import": "error",
+            "n/no-missing-require": "error",
+            "n/no-unpublished-bin": "error",
+            "n/no-unpublished-import": "error",
+            "n/no-unpublished-require": "error",
+            "n/no-unsupported-features/es-builtins": "error",
+            "n/no-unsupported-features/es-syntax": "error",
+            "n/no-unsupported-features/node-builtins": "error",
+            "n/prefer-global/buffer": "error",
+            "n/prefer-global/console": "error",
+            "n/prefer-global/process": "error",
+            "n/prefer-global/text-decoder": "off",
+            "n/prefer-global/text-encoder": "off",
+            "n/prefer-global/url-search-params": "off",
+            "n/prefer-global/url": "off",
+            "n/prefer-promises/dns": "off",
+            "n/prefer-promises/fs": "off",
+            "n/process-exit-as-throw": "error",
+            "n/shebang": "error",
         },
-    },
-    overrides: [
-        {
-            files: ["*.mjs", "*.ts", "*.tsx", "*.vue"],
-            extends: [require.resolve("./+modules.js")],
+        settings: {
+            node: {
+                tryExtensions: [
+                    ".vue",
+                    ".tsx",
+                    ".ts",
+                    ".mjs",
+                    ".cjs",
+                    ".js",
+                    ".json",
+                    ".node",
+                ],
+            },
         },
-    ],
-}
+    },
+]
diff --git a/eslint-internal/config/_base.js b/eslint-internal/config/_base.js
index 7dc7b39..34d2d98 100644
--- a/eslint-internal/config/_base.js
+++ b/eslint-internal/config/_base.js
@@ -4,416 +4,422 @@
  */
 "use strict"
 
-module.exports = {
-    root: true,
-    plugins: [
-        // "@mysticatea",
-        "prettier",
-        "eslint-comments",
-    ],
-    parserOptions: {
-        ecmaVersion: 5,
-        sourceType: "script",
+module.exports = [
+    {
+        name: "eslint-internal/config/_base.js#1",
+        files: ["**/*.js", "*.js", "**/*.cjs", "*.cjs"],
+        languageOptions: {
+            sourceType: "script",
+        },
     },
-    globals: {
-        Intl: "readonly",
-        clearInterval: "readonly",
-        clearTimeout: "readonly",
-        console: "readonly",
-        setInterval: "readonly",
-        setTimeout: "readonly",
+    {
+        name: "eslint-internal/config/_base.js#2",
+        files: ["**/*.mjs", "*.mjs"],
+        languageOptions: {
+            sourceType: "module",
+        },
     },
-    rules: {
-        // Enabled rules
-        "accessor-pairs": ["error", { enforceForClassMembers: true }],
-        "array-callback-return": "error",
-        camelcase: "error",
-        "consistent-return": "error",
-        curly: "error",
-        "default-case": "error",
-        "default-param-last": "error",
-        "dot-notation": "error",
-        eqeqeq: ["error", "always", { null: "ignore" }],
-        "for-direction": "error",
-        "func-style": ["error", "declaration"],
-        "getter-return": "error",
-        "init-declarations": "error",
-        "linebreak-style": ["error", "unix"],
-        "lines-between-class-members": "error",
-        "max-statements-per-line": ["error", { max: 1 }],
-        "multiline-comment-style": ["error", "separate-lines"],
-        "new-cap": "error",
-        "no-alert": "error",
-        "no-array-constructor": "error",
-        "no-async-promise-executor": "error",
-        "no-caller": "error",
-        "no-case-declarations": "error",
-        "no-compare-neg-zero": "error",
-        "no-cond-assign": "error",
-        "no-constant-condition": "error",
-        "no-control-regex": "error",
-        "no-debugger": "error",
-        "no-delete-var": "error",
-        "no-div-regex": "error",
-        "no-dupe-args": "error",
-        "no-dupe-keys": "error",
-        "no-duplicate-case": "error",
-        "no-else-return": "error",
-        "no-empty": "error",
-        "no-empty-character-class": "error",
-        "no-empty-function": "error",
-        "no-empty-pattern": "error",
-        "no-eval": "error",
-        "no-ex-assign": "error",
-        "no-extend-native": "error",
-        "no-extra-bind": "error",
-        "no-extra-boolean-cast": "error",
-        "no-extra-label": "error",
-        "no-fallthrough": "error",
-        "no-func-assign": "error",
-        "no-global-assign": "error",
-        "no-implicit-coercion": "error",
-        "no-implicit-globals": "error",
-        "no-implied-eval": "error",
-        "no-import-assign": "error",
-        "no-inner-declarations": ["error", "functions"],
-        "no-invalid-regexp": "error",
-        "no-invalid-this": "error",
-        "no-irregular-whitespace": [
-            "error",
-            {
-                skipComments: false,
-                skipRegExps: false,
-                skipStrings: false,
-                skipTemplates: false,
-            },
-        ],
-        "no-iterator": "error",
-        "no-label-var": "error",
-        "no-lone-blocks": "error",
-        "no-lonely-if": "error",
-        "no-loop-func": "error",
-        "no-misleading-character-class": "error",
-        "no-mixed-operators": [
-            "error",
-            {
-                groups: [
-                    ["&", "|", "^", "~", "<<", ">>", ">>>"],
-                    ["&&", "||"],
-                ],
-            },
-        ],
-        "no-new": "error",
-        "no-new-object": "error",
-        "no-new-require": "error",
-        "no-new-wrappers": "error",
-        "no-obj-calls": "error",
-        "no-octal": "error",
-        "no-octal-escape": "error",
-        "no-param-reassign": ["error", { props: false }],
-        "no-process-env": "error",
-        "no-process-exit": "error",
-        "no-prototype-builtins": "error",
-        "no-redeclare": ["error", { builtinGlobals: true }],
-        "no-regex-spaces": "error",
-        "no-restricted-properties": [
-            "error",
-            { property: "__count__" },
-            { property: "__noSuchMethod__" },
-            { property: "__parent__" },
-            { property: "__defineGetter__" },
-            { property: "__defineSetter__" },
-            { property: "__lookupGetter__" },
-            { property: "__lookupSetter__" },
-        ],
-        "no-return-assign": "error",
-        "no-return-await": "error",
-        "no-script-url": "error",
-        "no-self-assign": ["error", { props: true }],
-        "no-self-compare": "error",
-        "no-sequences": "error",
-        "no-shadow": ["error", { builtinGlobals: true }],
-        "no-shadow-restricted-names": "error",
-        "no-sparse-arrays": "error",
-        "no-tabs": "error",
-        "no-throw-literal": "error",
-        "no-undef": ["error", { typeof: true }],
-        "no-unexpected-multiline": "error",
-        "no-unmodified-loop-condition": "error",
-        "no-unneeded-ternary": "error",
-        "no-unreachable": "error",
-        "no-unsafe-finally": "error",
-        "no-unsafe-negation": ["error", { enforceForOrderingRelations: true }],
-        "no-unused-expressions": "error",
-        "no-unused-labels": "error",
-        "no-unused-vars": [
-            "error",
-            {
-                args: "all",
-                argsIgnorePattern: "^_(?:[^_].*)?$",
-                caughtErrors: "all",
-                vars: "all",
-                varsIgnorePattern: "^_(?:[^_].*)?$",
-            },
-        ],
-        "no-use-before-define": ["error", "nofunc"],
-        "no-useless-call": "error",
-        "no-useless-catch": "error",
-        "no-useless-concat": "error",
-        "no-useless-escape": "error",
-        "no-useless-return": "error",
-        "no-void": "error",
-        "no-with": "error",
-        "one-var": [
-            "error",
-            {
-                initialized: "never",
-                uninitialized: "always",
-            },
-        ],
-        "padding-line-between-statements": [
-            "error",
-            { blankLine: "always", next: "*", prev: "directive" },
-            { blankLine: "always", next: "function", prev: "*" },
-            { blankLine: "always", next: "*", prev: "function" },
-        ],
-        "prefer-promise-reject-errors": "error",
-        "prefer-regex-literals": "error",
-        quotes: ["error", "double", { avoidEscape: true }],
-        radix: "error",
-        "require-atomic-updates": "error",
-        "require-await": "error",
-        "spaced-comment": [
-            "error",
-            "always",
-            {
-                block: {
-                    balanced: true,
-                    markers: [
-                        "eslint",
-                        "eslint-env",
-                        "eslint-disable",
-                        "eslint-enable",
-                        "exported",
-                        "globals",
-                        "istanbul",
-                    ],
+    {
+        name: "eslint-internal/config/_base.js#3",
+        plugins: {
+            // "@mysticatea",
+            prettier: require("eslint-plugin-prettier"),
+            "eslint-comments": require("eslint-plugin-eslint-comments"),
+        },
+        rules: {
+            // Enabled rules
+            "accessor-pairs": ["error", { enforceForClassMembers: true }],
+            "array-callback-return": "error",
+            camelcase: "error",
+            "consistent-return": "error",
+            curly: "error",
+            "default-case": "error",
+            "default-param-last": "error",
+            "dot-notation": "error",
+            eqeqeq: ["error", "always", { null: "ignore" }],
+            "for-direction": "error",
+            "func-style": ["error", "declaration"],
+            "getter-return": "error",
+            "init-declarations": "error",
+            "linebreak-style": ["error", "unix"],
+            "lines-between-class-members": "error",
+            "max-statements-per-line": ["error", { max: 1 }],
+            "multiline-comment-style": ["error", "separate-lines"],
+            "new-cap": "error",
+            "no-alert": "error",
+            "no-array-constructor": "error",
+            "no-async-promise-executor": "error",
+            "no-caller": "error",
+            "no-case-declarations": "error",
+            "no-compare-neg-zero": "error",
+            "no-cond-assign": "error",
+            "no-constant-condition": "error",
+            "no-control-regex": "error",
+            "no-debugger": "error",
+            "no-delete-var": "error",
+            "no-div-regex": "error",
+            "no-dupe-args": "error",
+            "no-dupe-keys": "error",
+            "no-duplicate-case": "error",
+            "no-else-return": "error",
+            "no-empty": "error",
+            "no-empty-character-class": "error",
+            "no-empty-function": "error",
+            "no-empty-pattern": "error",
+            "no-eval": "error",
+            "no-ex-assign": "error",
+            "no-extend-native": "error",
+            "no-extra-bind": "error",
+            "no-extra-boolean-cast": "error",
+            "no-extra-label": "error",
+            "no-fallthrough": "error",
+            "no-func-assign": "error",
+            "no-global-assign": "error",
+            "no-implicit-coercion": "error",
+            "no-implicit-globals": "error",
+            "no-implied-eval": "error",
+            "no-import-assign": "error",
+            "no-inner-declarations": ["error", "functions"],
+            "no-invalid-regexp": "error",
+            "no-invalid-this": "error",
+            "no-irregular-whitespace": [
+                "error",
+                {
+                    skipComments: false,
+                    skipRegExps: false,
+                    skipStrings: false,
+                    skipTemplates: false,
                 },
-                line: {
-                    exceptions: ["-", "="],
-                    markers: [
-                        "eslint-disable-line",
-                        "eslint-disable-next-line",
-                        "istanbul",
-                        "TODO:",
-                        "FIXME:",
+            ],
+            "no-iterator": "error",
+            "no-label-var": "error",
+            "no-lone-blocks": "error",
+            "no-lonely-if": "error",
+            "no-loop-func": "error",
+            "no-misleading-character-class": "error",
+            "no-mixed-operators": [
+                "error",
+                {
+                    groups: [
+                        ["&", "|", "^", "~", "<<", ">>", ">>>"],
+                        ["&&", "||"],
                     ],
                 },
-            },
-        ],
-        strict: ["error", "global"],
-        "use-isnan": [
-            "error",
-            { enforceForIndexOf: true, enforceForSwitchCase: true },
-        ],
-        "valid-typeof": ["error", { requireStringLiterals: true }],
-        yoda: ["error", "never", { exceptRange: true }],
+            ],
+            "no-new": "error",
+            "no-new-object": "error",
+            "no-new-require": "error",
+            "no-new-wrappers": "error",
+            "no-obj-calls": "error",
+            "no-octal": "error",
+            "no-octal-escape": "error",
+            "no-param-reassign": ["error", { props: false }],
+            "no-process-env": "error",
+            "no-process-exit": "error",
+            "no-prototype-builtins": "error",
+            "no-redeclare": ["error", { builtinGlobals: true }],
+            "no-regex-spaces": "error",
+            "no-restricted-properties": [
+                "error",
+                { property: "__count__" },
+                { property: "__noSuchMethod__" },
+                { property: "__parent__" },
+                { property: "__defineGetter__" },
+                { property: "__defineSetter__" },
+                { property: "__lookupGetter__" },
+                { property: "__lookupSetter__" },
+            ],
+            "no-return-assign": "error",
+            "no-return-await": "error",
+            "no-script-url": "error",
+            "no-self-assign": ["error", { props: true }],
+            "no-self-compare": "error",
+            "no-sequences": "error",
+            "no-shadow": ["error", { builtinGlobals: true }],
+            "no-shadow-restricted-names": "error",
+            "no-sparse-arrays": "error",
+            "no-tabs": "error",
+            "no-throw-literal": "error",
+            "no-undef": ["error", { typeof: true }],
+            "no-unexpected-multiline": "error",
+            "no-unmodified-loop-condition": "error",
+            "no-unneeded-ternary": "error",
+            "no-unreachable": "error",
+            "no-unsafe-finally": "error",
+            "no-unsafe-negation": [
+                "error",
+                { enforceForOrderingRelations: true },
+            ],
+            "no-unused-expressions": "error",
+            "no-unused-labels": "error",
+            "no-unused-vars": [
+                "error",
+                {
+                    args: "all",
+                    argsIgnorePattern: "^_(?:[^_].*)?$",
+                    caughtErrors: "all",
+                    caughtErrorsIgnorePattern: "^_(?:[^_].*)?$",
+                    vars: "all",
+                    varsIgnorePattern: "^_(?:[^_].*)?$",
+                },
+            ],
+            "no-use-before-define": ["error", "nofunc"],
+            "no-useless-call": "error",
+            "no-useless-catch": "error",
+            "no-useless-concat": "error",
+            "no-useless-escape": "error",
+            "no-useless-return": "error",
+            "no-void": "error",
+            "no-with": "error",
+            "one-var": [
+                "error",
+                {
+                    initialized: "never",
+                    uninitialized: "always",
+                },
+            ],
+            "padding-line-between-statements": [
+                "error",
+                { blankLine: "always", next: "*", prev: "directive" },
+                { blankLine: "always", next: "function", prev: "*" },
+                { blankLine: "always", next: "*", prev: "function" },
+            ],
+            "prefer-promise-reject-errors": "error",
+            "prefer-regex-literals": "error",
+            quotes: ["error", "double", { avoidEscape: true }],
+            radix: "error",
+            "require-atomic-updates": "error",
+            "require-await": "error",
+            "spaced-comment": [
+                "error",
+                "always",
+                {
+                    block: {
+                        balanced: true,
+                        markers: [
+                            "eslint",
+                            "eslint-env",
+                            "eslint-disable",
+                            "eslint-enable",
+                            "exported",
+                            "globals",
+                            "istanbul",
+                        ],
+                    },
+                    line: {
+                        exceptions: ["-", "="],
+                        markers: [
+                            "eslint-disable-line",
+                            "eslint-disable-next-line",
+                            "istanbul",
+                            "TODO:",
+                            "FIXME:",
+                        ],
+                    },
+                },
+            ],
+            strict: ["error", "global"],
+            "use-isnan": [
+                "error",
+                { enforceForIndexOf: true, enforceForSwitchCase: true },
+            ],
+            "valid-typeof": ["error", { requireStringLiterals: true }],
+            yoda: ["error", "never", { exceptRange: true }],
 
-        // Enabled rules as warnings.
-        complexity: ["warn", { max: 16 }],
-        "max-nested-callbacks": ["warn", { max: 4 }],
-        "max-params": ["warn", { max: 8 }],
-        "no-console": ["warn", { allow: ["assert", "error"] }],
+            // Enabled rules as warnings.
+            complexity: ["warn", { max: 16 }],
+            "max-nested-callbacks": ["warn", { max: 4 }],
+            "max-params": ["warn", { max: 8 }],
+            "no-console": ["warn", { allow: ["assert", "error"] }],
 
-        // Disabled rules as favor of Prettier.
-        "array-bracket-newline": "off",
-        "array-bracket-spacing": "off",
-        "array-element-newline": "off",
-        "arrow-parens": "off",
-        "arrow-spacing": "off",
-        "block-spacing": "off",
-        "brace-style": "off",
-        "comma-dangle": "off",
-        "comma-spacing": "off",
-        "comma-style": "off",
-        "computed-property-spacing": "off",
-        "dot-location": "off",
-        "eol-last": "off",
-        "func-call-spacing": "off",
-        "function-call-argument-newline": "off",
-        "function-paren-newline": "off",
-        "generator-star-spacing": "off",
-        "implicit-arrow-linebreak": "off",
-        indent: "off",
-        "jsx-quotes": "off",
-        "key-spacing": "off",
-        "keyword-spacing": "off",
-        "multiline-ternary": "off",
-        "new-parens": "off",
-        "newline-per-chained-call": "off",
-        "no-extra-parens": "off",
-        "no-extra-semi": "off",
-        "no-floating-decimal": "off",
-        "no-mixed-spaces-and-tabs": "off",
-        "no-multi-spaces": "off",
-        "no-multiple-empty-lines": "off",
-        "no-trailing-spaces": "off",
-        "no-whitespace-before-property": "off",
-        "nonblock-statement-body-position": "off",
-        "object-curly-newline": "off",
-        "object-curly-spacing": "off",
-        "object-property-newline": "off",
-        "one-var-declaration-per-line": "off",
-        "operator-linebreak": "off",
-        "padded-blocks": "off",
-        "quote-props": "off",
-        "rest-spread-spacing": "off",
-        semi: "off",
-        "semi-spacing": "off",
-        "semi-style": "off",
-        "space-before-blocks": "off",
-        "space-before-function-paren": "off",
-        "space-in-parens": "off",
-        "space-infix-ops": "off",
-        "space-unary-ops": "off",
-        "switch-colon-spacing": "off",
-        "template-curly-spacing": "off",
-        "template-tag-spacing": "off",
-        "unicode-bom": "off",
-        "wrap-iife": "off",
-        "wrap-regex": "off",
-        "yield-star-spacing": "off",
+            // Disabled rules as favor of Prettier.
+            "array-bracket-newline": "off",
+            "array-bracket-spacing": "off",
+            "array-element-newline": "off",
+            "arrow-parens": "off",
+            "arrow-spacing": "off",
+            "block-spacing": "off",
+            "brace-style": "off",
+            "comma-dangle": "off",
+            "comma-spacing": "off",
+            "comma-style": "off",
+            "computed-property-spacing": "off",
+            "dot-location": "off",
+            "eol-last": "off",
+            "func-call-spacing": "off",
+            "function-call-argument-newline": "off",
+            "function-paren-newline": "off",
+            "generator-star-spacing": "off",
+            "implicit-arrow-linebreak": "off",
+            indent: "off",
+            "jsx-quotes": "off",
+            "key-spacing": "off",
+            "keyword-spacing": "off",
+            "multiline-ternary": "off",
+            "new-parens": "off",
+            "newline-per-chained-call": "off",
+            "no-extra-parens": "off",
+            "no-extra-semi": "off",
+            "no-floating-decimal": "off",
+            "no-mixed-spaces-and-tabs": "off",
+            "no-multi-spaces": "off",
+            "no-multiple-empty-lines": "off",
+            "no-trailing-spaces": "off",
+            "no-whitespace-before-property": "off",
+            "nonblock-statement-body-position": "off",
+            "object-curly-newline": "off",
+            "object-curly-spacing": "off",
+            "object-property-newline": "off",
+            "one-var-declaration-per-line": "off",
+            "operator-linebreak": "off",
+            "padded-blocks": "off",
+            "quote-props": "off",
+            "rest-spread-spacing": "off",
+            semi: "off",
+            "semi-spacing": "off",
+            "semi-style": "off",
+            "space-before-blocks": "off",
+            "space-before-function-paren": "off",
+            "space-in-parens": "off",
+            "space-infix-ops": "off",
+            "space-unary-ops": "off",
+            "switch-colon-spacing": "off",
+            "template-curly-spacing": "off",
+            "template-tag-spacing": "off",
+            "unicode-bom": "off",
+            "wrap-iife": "off",
+            "wrap-regex": "off",
+            "yield-star-spacing": "off",
 
-        // Disabled rules
-        "arrow-body-style": "off",
-        "block-scoped-var": "off",
-        "callback-return": "off",
-        "capitalized-comments": "off",
-        "class-methods-use-this": "off",
-        "consistent-this": "off",
-        "constructor-super": "off",
-        "func-name-matching": "off",
-        "func-names": "off",
-        "global-require": "off",
-        "guard-for-in": "off",
-        "handle-callback-err": "off",
-        "id-blacklist": "off",
-        "id-length": "off",
-        "id-match": "off",
-        "line-comment-position": "off",
-        "lines-around-comment": "off",
-        "max-classes-per-file": "off",
-        "max-depth": "off",
-        "max-len": "off",
-        "max-lines": "off",
-        "max-lines-per-function": "off",
-        "max-statements": "off",
-        "no-await-in-loop": "off",
-        "no-bitwise": "off",
-        "no-buffer-constructor": "off",
-        "no-class-assign": "off",
-        "no-confusing-arrow": "off",
-        "no-const-assign": "off",
-        "no-continue": "off",
-        "no-dupe-class-members": "off",
-        "no-duplicate-imports": "off",
-        "no-eq-null": "off",
-        "no-inline-comments": "off",
-        "no-labels": "off",
-        "no-magic-numbers": "off",
-        "no-mixed-requires": "off",
-        "no-multi-assign": "off",
-        "no-multi-str": "off",
-        "no-negated-condition": "off",
-        "no-nested-ternary": "off",
-        "no-new-func": "off",
-        "no-new-symbol": "off",
-        "no-path-concat": "off",
-        "no-plusplus": "off",
-        "no-proto": "off",
-        "no-restricted-globals": "off",
-        "no-restricted-imports": "off",
-        "no-restricted-modules": "off",
-        "no-restricted-syntax": "off",
-        "no-sync": "off",
-        "no-template-curly-in-string": "off",
-        "no-ternary": "off",
-        "no-this-before-super": "off",
-        "no-undef-init": "off",
-        "no-undefined": "off",
-        "no-underscore-dangle": "off",
-        "no-useless-computed-key": "off",
-        "no-useless-constructor": "off",
-        "no-useless-rename": "off",
-        "no-var": "off",
-        "no-warning-comments": "off",
-        "object-shorthand": "off",
-        "operator-assignment": "off",
-        "prefer-arrow-callback": "off",
-        "prefer-const": "off",
-        "prefer-destructuring": "off",
-        "prefer-named-capture-group": "off",
-        "prefer-numeric-literals": "off",
-        "prefer-rest-params": "off",
-        "prefer-object-spread": "off",
-        "prefer-spread": "off",
-        "prefer-template": "off",
-        "require-yield": "off",
-        "require-unicode-regexp": "off",
-        "sort-imports": "off",
-        "sort-keys": "off",
-        "sort-vars": "off",
-        "symbol-description": "off",
-        "vars-on-top": "off",
+            // Disabled rules
+            "arrow-body-style": "off",
+            "block-scoped-var": "off",
+            "callback-return": "off",
+            "capitalized-comments": "off",
+            "class-methods-use-this": "off",
+            "consistent-this": "off",
+            "constructor-super": "off",
+            "func-name-matching": "off",
+            "func-names": "off",
+            "global-require": "off",
+            "guard-for-in": "off",
+            "handle-callback-err": "off",
+            "id-blacklist": "off",
+            "id-length": "off",
+            "id-match": "off",
+            "line-comment-position": "off",
+            "lines-around-comment": "off",
+            "max-classes-per-file": "off",
+            "max-depth": "off",
+            "max-len": "off",
+            "max-lines": "off",
+            "max-lines-per-function": "off",
+            "max-statements": "off",
+            "no-await-in-loop": "off",
+            "no-bitwise": "off",
+            "no-buffer-constructor": "off",
+            "no-class-assign": "off",
+            "no-confusing-arrow": "off",
+            "no-const-assign": "off",
+            "no-continue": "off",
+            "no-dupe-class-members": "off",
+            "no-duplicate-imports": "off",
+            "no-eq-null": "off",
+            "no-inline-comments": "off",
+            "no-labels": "off",
+            "no-magic-numbers": "off",
+            "no-mixed-requires": "off",
+            "no-multi-assign": "off",
+            "no-multi-str": "off",
+            "no-negated-condition": "off",
+            "no-nested-ternary": "off",
+            "no-new-func": "off",
+            "no-new-symbol": "off",
+            "no-path-concat": "off",
+            "no-plusplus": "off",
+            "no-proto": "off",
+            "no-restricted-globals": "off",
+            "no-restricted-imports": "off",
+            "no-restricted-modules": "off",
+            "no-restricted-syntax": "off",
+            "no-sync": "off",
+            "no-template-curly-in-string": "off",
+            "no-ternary": "off",
+            "no-this-before-super": "off",
+            "no-undef-init": "off",
+            "no-undefined": "off",
+            "no-underscore-dangle": "off",
+            "no-useless-computed-key": "off",
+            "no-useless-constructor": "off",
+            "no-useless-rename": "off",
+            "no-var": "off",
+            "no-warning-comments": "off",
+            "object-shorthand": "off",
+            "operator-assignment": "off",
+            "prefer-arrow-callback": "off",
+            "prefer-const": "off",
+            "prefer-destructuring": "off",
+            "prefer-named-capture-group": "off",
+            "prefer-numeric-literals": "off",
+            "prefer-rest-params": "off",
+            "prefer-object-spread": "off",
+            "prefer-spread": "off",
+            "prefer-template": "off",
+            "require-yield": "off",
+            "require-unicode-regexp": "off",
+            "sort-imports": "off",
+            "sort-keys": "off",
+            "sort-vars": "off",
+            "symbol-description": "off",
+            "vars-on-top": "off",
 
-        //
-        // Plugins
-        //
+            //
+            // Plugins
+            //
 
-        // eslint-comments
-        "eslint-comments/disable-enable-pair": "error",
-        "eslint-comments/no-aggregating-enable": "error",
-        "eslint-comments/no-duplicate-disable": "error",
-        "eslint-comments/no-restricted-disable": "off",
-        "eslint-comments/no-unlimited-disable": "error",
-        "eslint-comments/no-unused-disable": "error",
-        "eslint-comments/no-unused-enable": "error",
-        "eslint-comments/no-use": [
-            "error",
-            {
-                allow: [
-                    "eslint-disable",
-                    "eslint-disable-line",
-                    "eslint-disable-next-line",
-                    "eslint-enable",
-                    "eslint-env",
-                    "globals",
-                ],
-            },
-        ],
+            // eslint-comments
+            "eslint-comments/disable-enable-pair": "error",
+            "eslint-comments/no-aggregating-enable": "error",
+            "eslint-comments/no-duplicate-disable": "error",
+            "eslint-comments/no-restricted-disable": "off",
+            "eslint-comments/no-unlimited-disable": "error",
+            "eslint-comments/no-unused-disable": "error",
+            "eslint-comments/no-unused-enable": "error",
+            "eslint-comments/no-use": [
+                "error",
+                {
+                    allow: [
+                        "eslint-disable",
+                        "eslint-disable-line",
+                        "eslint-disable-next-line",
+                        "eslint-enable",
+                        "eslint-env",
+                        "globals",
+                    ],
+                },
+            ],
 
-        // prettier
-        "prettier/prettier": [
-            "error",
-            {
-                tabWidth: 4,
-                semi: false,
-                trailingComma: "es5",
-            },
-            {
-                usePrettierrc: false,
-            },
-        ],
+            // prettier
+            "prettier/prettier": [
+                "error",
+                {
+                    tabWidth: 4,
+                    semi: false,
+                    trailingComma: "es5",
+                },
+                {
+                    usePrettierrc: false,
+                },
+            ],
 
-        // my own
-        "@mysticatea/arrow-parens": "off",
-        "my-block-scoped-var": "error",
-        "my-no-instanceof-array": "error",
-        "my-no-instanceof-wrapper": "error",
-        "my-no-literal-call": "error",
-        "my-no-this-in-static": "off",
-        "my-no-use-ignored-vars": ["error", "^_(?:[^_].*)?$"],
-        "my-no-useless-rest-spread": "off",
-        "my-prefer-for-of": "off",
+            "my/my-block-scoped-var": "error",
+            "my/my-no-instanceof-array": "error",
+            "my/my-no-instanceof-wrapper": "error",
+            "my/my-no-literal-call": "error",
+            "my/my-no-this-in-static": "off",
+            "my/my-no-use-ignored-vars": ["error", "^_(?:[^_].*)?$"],
+            "my/my-no-useless-rest-spread": "off",
+            "my/my-prefer-for-of": "off",
+        },
     },
-}
+]
diff --git a/eslint-internal/config/_browser-globals.js b/eslint-internal/config/_browser-globals.js
index e4cba16..b686de9 100644
--- a/eslint-internal/config/_browser-globals.js
+++ b/eslint-internal/config/_browser-globals.js
@@ -25,7 +25,7 @@ module.exports = {
     AudioParam: "readonly",
     AudioProcessingEvent: "readonly",
     AudioScheduledSourceNode: "readonly",
-    "AudioWorkletGlobalScope ": "readonly",
+    AudioWorkletGlobalScope: "readonly",
     AudioWorkletNode: "readonly",
     AudioWorkletProcessor: "readonly",
     BarProp: "readonly",
diff --git a/eslint-internal/config/_override-2015.js b/eslint-internal/config/_override-2015.js
index 2ff97bb..a8a6243 100644
--- a/eslint-internal/config/_override-2015.js
+++ b/eslint-internal/config/_override-2015.js
@@ -4,89 +4,68 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2015,
-    },
-    globals: {
-        ArrayBuffer: "readonly",
-        DataView: "readonly",
-        Float32Array: "readonly",
-        Float64Array: "readonly",
-        Int16Array: "readonly",
-        Int32Array: "readonly",
-        Int8Array: "readonly",
-        Map: "readonly",
-        Promise: "readonly",
-        Proxy: "readonly",
-        Reflect: "readonly",
-        Set: "readonly",
-        Symbol: "readonly",
-        Uint16Array: "readonly",
-        Uint32Array: "readonly",
-        Uint8Array: "readonly",
-        Uint8ClampedArray: "readonly",
-        WeakMap: "readonly",
-        WeakSet: "readonly",
-    },
-    rules: {
-        // Enabled rules as errors
-        "arrow-body-style": "error",
-        "constructor-super": "error",
-        "default-param-last": "error",
-        "no-class-assign": "error",
-        "no-const-assign": "error",
-        "no-dupe-class-members": "error",
-        "no-duplicate-imports": ["error", { includeExports: true }],
-        "no-import-assign": "error",
-        "no-new-symbol": "error",
-        "no-template-curly-in-string": "error",
-        "no-this-before-super": "error",
-        "no-useless-computed-key": "error",
-        "no-useless-constructor": "error",
-        "no-useless-rename": "error",
-        "no-var": "error",
-        "object-shorthand": [
-            "error",
-            "always",
-            { avoidExplicitReturnArrows: true },
-        ],
-        "prefer-arrow-callback": "error",
-        "prefer-const": "error",
-        "prefer-numeric-literals": "error",
-        "prefer-rest-params": "error",
-        "prefer-spread": "error",
-        "prefer-template": "error",
-        "require-unicode-regexp": "error",
-        "require-yield": "error",
-        "symbol-description": "error",
-
-        // Enabled rules as warnings
-        "class-methods-use-this": "warn",
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2015.js",
+        languageOptions: {
+            ecmaVersion: 2015,
+        },
+        rules: {
+            // Enabled rules as errors
+            "arrow-body-style": "error",
+            "constructor-super": "error",
+            "default-param-last": "error",
+            "no-class-assign": "error",
+            "no-const-assign": "error",
+            "no-dupe-class-members": "error",
+            "no-duplicate-imports": ["error", { includeExports: true }],
+            "no-import-assign": "error",
+            "no-new-symbol": "error",
+            "no-template-curly-in-string": "error",
+            "no-this-before-super": "error",
+            "no-useless-computed-key": "error",
+            "no-useless-constructor": "error",
+            "no-useless-rename": "error",
+            "no-var": "error",
+            "object-shorthand": [
+                "error",
+                "always",
+                { avoidExplicitReturnArrows: true },
+            ],
+            "prefer-arrow-callback": "error",
+            "prefer-const": "error",
+            "prefer-numeric-literals": "error",
+            "prefer-rest-params": "error",
+            "prefer-spread": "error",
+            "prefer-template": "error",
+            "require-unicode-regexp": "error",
+            "require-yield": "error",
+            "symbol-description": "error",
 
-        // Disabled rules as favor of Prettier.
-        "arrow-parens": "off",
-        "arrow-spacing": "off",
-        "generator-star-spacing": "off",
-        "no-confusing-arrow": "off",
-        "rest-spread-spacing": "off",
-        "template-curly-spacing": "off",
-        "yield-star-spacing": "off",
+            // Enabled rules as warnings
+            "class-methods-use-this": "warn",
 
-        // Desabled rules
-        "no-inner-declarations": "off",
-        "no-restricted-imports": "off",
-        "prefer-destructuring": "off",
-        "sort-imports": "off",
+            // Disabled rules as favor of Prettier.
+            "arrow-parens": "off",
+            "arrow-spacing": "off",
+            "generator-star-spacing": "off",
+            "no-confusing-arrow": "off",
+            "rest-spread-spacing": "off",
+            "template-curly-spacing": "off",
+            "yield-star-spacing": "off",
 
-        //
-        // Plugins
-        //
+            // Desabled rules
+            "no-inner-declarations": "off",
+            "no-restricted-imports": "off",
+            "prefer-destructuring": "off",
+            "sort-imports": "off",
 
-        // my own
-        "@mysticatea/block-scoped-var": "off",
-        "my-no-this-in-static": "error",
-        "my-no-useless-rest-spread": "error",
-        "my-prefer-for-of": "error",
+            //
+            // Plugins
+            //
+            "my/my-no-this-in-static": "error",
+            "my/my-no-useless-rest-spread": "error",
+            "my/my-prefer-for-of": "error",
+        },
     },
-}
+]
diff --git a/eslint-internal/config/_override-2016.js b/eslint-internal/config/_override-2016.js
index f18db5f..86aecee 100644
--- a/eslint-internal/config/_override-2016.js
+++ b/eslint-internal/config/_override-2016.js
@@ -4,8 +4,11 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2016,
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2016.js",
+        languageOptions: {
+            ecmaVersion: 2016,
+        },
     },
-}
+]
diff --git a/eslint-internal/config/_override-2017.js b/eslint-internal/config/_override-2017.js
index 13c0e24..4a0223b 100644
--- a/eslint-internal/config/_override-2017.js
+++ b/eslint-internal/config/_override-2017.js
@@ -4,25 +4,24 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2017,
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2017.js",
+        languageOptions: {
+            ecmaVersion: 2017,
+        },
+        rules: {
+            "prettier/prettier": [
+                "error",
+                {
+                    tabWidth: 4,
+                    semi: false,
+                    trailingComma: "all",
+                },
+                {
+                    usePrettierrc: false,
+                },
+            ],
+        },
     },
-    globals: {
-        Atomics: "readonly",
-        SharedArrayBuffer: "readonly",
-    },
-    rules: {
-        "prettier/prettier": [
-            "error",
-            {
-                tabWidth: 4,
-                semi: false,
-                trailingComma: "all",
-            },
-            {
-                usePrettierrc: false,
-            },
-        ],
-    },
-}
+]
diff --git a/eslint-internal/config/_override-2018.js b/eslint-internal/config/_override-2018.js
index 5348dd0..f91437a 100644
--- a/eslint-internal/config/_override-2018.js
+++ b/eslint-internal/config/_override-2018.js
@@ -4,11 +4,14 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2018,
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2018.js",
+        languageOptions: {
+            ecmaVersion: 2018,
+        },
+        rules: {
+            "prefer-object-spread": "error",
+        },
     },
-    rules: {
-        "prefer-object-spread": "error",
-    },
-}
+]
diff --git a/eslint-internal/config/_override-2019.js b/eslint-internal/config/_override-2019.js
index 1c33104..8fdc47b 100644
--- a/eslint-internal/config/_override-2019.js
+++ b/eslint-internal/config/_override-2019.js
@@ -4,8 +4,11 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2019,
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2019.js",
+        languageOptions: {
+            ecmaVersion: 2019,
+        },
     },
-}
+]
diff --git a/eslint-internal/config/_override-2020.js b/eslint-internal/config/_override-2020.js
index 1db0423..d0159fa 100644
--- a/eslint-internal/config/_override-2020.js
+++ b/eslint-internal/config/_override-2020.js
@@ -4,13 +4,11 @@
  */
 "use strict"
 
-module.exports = {
-    parserOptions: {
-        ecmaVersion: 2020,
+module.exports = [
+    {
+        name: "eslint-internal/config/_override-2020.js",
+        languageOptions: {
+            ecmaVersion: 2020,
+        },
     },
-    globals: {
-        BigInt: "readonly",
-        BigInt64Array: "readonly",
-        BigUint64Array: "readonly",
-    },
-}
+]
diff --git a/eslint-internal/config/_override-mocha.js b/eslint-internal/config/_override-mocha.js
index 4d103e0..513848d 100644
--- a/eslint-internal/config/_override-mocha.js
+++ b/eslint-internal/config/_override-mocha.js
@@ -4,10 +4,14 @@
  */
 "use strict"
 
-module.exports = {
-    overrides: [
-        {
-            files: ["**/test/**", "**/tests/**"],
+const files = ["**/test/**", "**/tests/**"]
+
+module.exports = [
+    ...require("./+node.js").map((config) => ({ ...config, files })),
+    {
+        name: "eslint-internal/config/_override-mocha.js",
+        files,
+        languageOptions: {
             globals: {
                 after: "readonly",
                 afterEach: "readonly",
@@ -19,9 +23,9 @@ module.exports = {
                 xdescribe: "readonly",
                 xit: "readonly",
             },
-            rules: {
-                "max-nested-callbacks": "off",
-            },
         },
-    ],
-}
+        rules: {
+            "max-nested-callbacks": "off",
+        },
+    },
+]
diff --git a/eslint-internal/config/_override-special.js b/eslint-internal/config/_override-special.js
index 17916c0..1721879 100644
--- a/eslint-internal/config/_override-special.js
+++ b/eslint-internal/config/_override-special.js
@@ -4,37 +4,16 @@
  */
 "use strict"
 
-module.exports = {
-    overrides: [
-        {
-            files: [
-                "**/scripts/**/*",
-                ".babelrc.js",
-                ".eslintrc.js",
-                "webpack.config.js",
-                "**/.vuepress/config.js",
-                "*.webpack.config.js",
-            ],
-            extends: [require.resolve("./+node.js")],
-            rules: {
-                "no-console": "off",
-                "no-process-env": "off",
-            },
-        },
-        {
-            files: [
-                "**/scripts/rollup-plugin/**/*",
-                "rollup.config.js",
-                "*.rollup.config.js",
-            ],
-            extends: [
-                require.resolve("./+node.js"),
-                require.resolve("./+modules.js"),
-            ],
-            rules: {
-                "no-console": "off",
-                "no-process-env": "off",
-            },
+const files = ["**/scripts/**/*", "eslint.config.js"]
+
+module.exports = [
+    ...require("./+node.js").map((config) => ({ ...config, files })),
+    {
+        name: "eslint-internal/config/_override-special.js",
+        files,
+        rules: {
+            "no-console": "off",
+            "no-process-env": "off",
         },
-    ],
-}
+    },
+]
diff --git a/eslint-internal/config/_override-ts.js b/eslint-internal/config/_override-ts.js
deleted file mode 100644
index b0db19a..0000000
--- a/eslint-internal/config/_override-ts.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * @author Toru Nagashima
- * See LICENSE file in root directory for full license.
- */
-"use strict"
-
-module.exports = {
-    overrides: [
-        {
-            files: ["*.ts", "*.tsx"],
-            extends: [require.resolve("./+modules.js")],
-            parser: require.resolve("@typescript-eslint/parser"),
-            parserOptions: {
-                loggerFn: false,
-                project: "tsconfig.json",
-            },
-            rules: {
-                // Enabled rules
-                "@mysticatea/ts/adjacent-overload-signatures": "error",
-                "@mysticatea/ts/array-type": "error",
-                "@mysticatea/ts/await-thenable": "error",
-                "@mysticatea/ts/ban-ts-ignore": "error",
-                "@mysticatea/ts/class-name-casing": "error",
-                "@mysticatea/ts/consistent-type-assertions": "error",
-                "@mysticatea/ts/explicit-member-accessibility": "error",
-                "@mysticatea/ts/interface-name-prefix": "error",
-                "@mysticatea/ts/member-naming": "error",
-                "@mysticatea/ts/no-array-constructor": "error",
-                "@mysticatea/ts/no-empty-interface": "error",
-                "@mysticatea/ts/no-extraneous-class": "error",
-                "@mysticatea/ts/no-floating-promises": "error",
-                "@mysticatea/ts/no-for-in-array": "error",
-                "@mysticatea/ts/no-inferrable-types": "error",
-                "@mysticatea/ts/no-misused-new": "error",
-                "@mysticatea/ts/no-misused-promises": "error",
-                "@mysticatea/ts/no-parameter-properties": "error",
-                "@mysticatea/ts/no-require-imports": "error",
-                "@mysticatea/ts/no-this-alias": [
-                    "error",
-                    { allowDestructuring: true },
-                ],
-                "@mysticatea/ts/no-unnecessary-qualifier": "error",
-                "@mysticatea/ts/no-unnecessary-type-arguments": "error",
-                "@mysticatea/ts/no-unnecessary-type-assertion": "error",
-                "@mysticatea/ts/no-var-requires": "error",
-                // https://github.com/typescript-eslint/typescript-eslint/issues/454
-                "@mysticatea/ts/prefer-function-type": "off",
-                "@mysticatea/ts/prefer-includes": "error",
-                "@mysticatea/ts/prefer-namespace-keyword": "error",
-                // https://github.com/typescript-eslint/typescript-eslint/issues/946
-                "@mysticatea/ts/prefer-readonly": "off",
-                "@mysticatea/ts/prefer-regexp-exec": "error",
-                "@mysticatea/ts/prefer-string-starts-ends-with": "error",
-                "@mysticatea/ts/restrict-plus-operands": "error",
-                "@mysticatea/ts/require-array-sort-compare": "error",
-                "@mysticatea/ts/triple-slash-reference": "error",
-                // なんか誤検知が多い...
-                "@mysticatea/ts/unbound-method": [
-                    "off",
-                    { ignoreStatic: true },
-                ],
-                // https://github.com/typescript-eslint/typescript-eslint/issues/452
-                "@mysticatea/ts/unified-signatures": "off",
-                "prettier/prettier": [
-                    "error",
-                    {
-                        tabWidth: 4,
-                        semi: false,
-                        trailingComma: "all",
-                        parser: "typescript",
-                    },
-                    {
-                        usePrettierrc: false,
-                    },
-                ],
-
-                // Replacements
-                camelcase: "off",
-                "@mysticatea/ts/camelcase": "error",
-                "no-empty-function": "off",
-                "@mysticatea/ts/no-empty-function": "error",
-                "no-useless-constructor": "off",
-                "@mysticatea/ts/no-useless-constructor": "error",
-                "require-await": "off",
-                "@mysticatea/ts/require-await": "error",
-
-                // Disabled rules
-                "func-style": "off",
-                "init-declarations": "off",
-                "lines-between-class-members": "off",
-                "no-dupe-class-members": "off",
-                "no-invalid-this": "off",
-                "no-loop-func": "off",
-                "no-redeclare": "off",
-                "no-undef": "off",
-                "no-unused-vars": "off",
-                "no-use-before-define": "off",
-                "one-var": "off",
-                "@mysticatea/ts/ban-types": "off",
-                "@mysticatea/ts/brace-style": "off", // favor of Prettier.
-                "@mysticatea/ts/consistent-type-definitions": "off",
-                "@mysticatea/ts/explicit-function-return-type": "off", // I want but this is not so...
-                "@mysticatea/ts/func-call-spacing": "off", // favor of Prettier.
-                "@mysticatea/ts/generic-type-naming": "off",
-                "@mysticatea/ts/indent": "off", // favor of Prettier.
-                "@mysticatea/ts/member-delimiter-style": "off", // favor of Prettier.
-                "@mysticatea/ts/member-ordering": "off",
-                "@mysticatea/ts/no-explicit-any": "off",
-                "@mysticatea/ts/no-extra-parens": "off", // favor of Prettier.
-                "@mysticatea/ts/no-magic-numbers": "off",
-                "@mysticatea/ts/no-namespace": "off", // I like the namespace for interfaces (type only things).
-                "@mysticatea/ts/no-non-null-assertion": "off",
-                "@mysticatea/ts/no-type-alias": "off",
-                "@mysticatea/ts/no-unnecessary-condition": "off", // This was problematic for test code.
-                "@mysticatea/ts/no-unused-vars": "off", // tsc verifies it.
-                "@mysticatea/ts/no-use-before-define": "off", // tsc verifies it.
-                "@mysticatea/ts/prefer-for-of": "off",
-                "@mysticatea/ts/promise-function-async": "off",
-                "@mysticatea/ts/quotes": "off", // favor of Prettier.
-                "@mysticatea/ts/semi": "off", // favor of Prettier.
-                "@mysticatea/ts/strict-boolean-expressions": "off",
-                "@mysticatea/ts/type-annotation-spacing": "off", // favor of Prettier.
-                "@mysticatea/ts/typedef": "off",
-            },
-        },
-        {
-            files: ["*.d.ts"],
-            rules: {
-                strict: "off",
-            },
-        },
-    ],
-}
diff --git a/eslint-internal/config/_override-vue.js b/eslint-internal/config/_override-vue.js
index 78fb977..29fec94 100644
--- a/eslint-internal/config/_override-vue.js
+++ b/eslint-internal/config/_override-vue.js
@@ -4,131 +4,137 @@
  */
 "use strict"
 
-module.exports = {
-    plugins: ["vue"],
-    overrides: [
-        {
-            files: ["*.vue"],
-            extends: [
-                require.resolve("./+browser.js"),
-                require.resolve("./+modules.js"),
+const files = ["**/*.vue", "*.vue"]
+
+module.exports = [
+    ...require("./+browser.js").map((config) => ({ ...config, files })),
+    ...require("./+modules.js").map((config) => ({ ...config, files })),
+    {
+        name: "eslint-internal/config/_override-vue.js",
+        files,
+        plugins: {
+            get vue() {
+                return require("eslint-plugin-vue")
+            },
+        },
+        processor: "vue/vue",
+        languageOptions: {
+            sourceType: "module",
+            get parser() {
+                return require("vue-eslint-parser")
+            },
+        },
+        rules: {
+            // Enabled rules
+            "vue/array-bracket-spacing": ["error", "never"],
+            "vue/arrow-spacing": "error",
+            "vue/block-spacing": "error",
+            "vue/brace-style": "error",
+            "vue/camelcase": "error",
+            "vue/comma-dangle": [
+                "error",
+                {
+                    arrays: "always",
+                    objects: "always",
+                    imports: "always",
+                    exports: "always",
+                    functions: "always",
+                },
             ],
-            parser: require.resolve("vue-eslint-parser"),
-            rules: {
-                // Enabled rules
-                "vue/array-bracket-spacing": ["error", "never"],
-                "vue/arrow-spacing": "error",
-                "vue/block-spacing": "error",
-                "vue/brace-style": "error",
-                "vue/camelcase": "error",
-                "vue/comma-dangle": [
-                    "error",
-                    {
-                        arrays: "always",
-                        objects: "always",
-                        imports: "always",
-                        exports: "always",
-                        functions: "always",
+            "vue/comment-directive": "error",
+            "vue/dot-location": "error",
+            "vue/eqeqeq": ["error", "always", { null: "ignore" }],
+            "vue/jsx-uses-vars": "error",
+            "vue/key-spacing": "error",
+            "vue/keyword-spacing": "error",
+            "vue/match-component-file-name": "error",
+            "vue/first-attribute-linebreak": ["error"],
+            "vue/max-attributes-per-line": [
+                "error",
+                {
+                    singleline: 3,
+                    multiline: {
+                        max: 1,
                     },
-                ],
-                "vue/comment-directive": "error",
-                "vue/dot-location": "error",
-                "vue/eqeqeq": ["error", "always", { null: "ignore" }],
-                "vue/jsx-uses-vars": "error",
-                "vue/key-spacing": "error",
-                "vue/keyword-spacing": "error",
-                "vue/match-component-file-name": "error",
-                "vue/first-attribute-linebreak": ["error"],
-                "vue/max-attributes-per-line": [
-                    "error",
-                    {
-                        singleline: 3,
-                        multiline: {
-                            max: 1,
-                        },
-                    },
-                ],
-                "vue/no-async-in-computed-properties": "error",
-                "vue/no-boolean-default": "error",
-                "vue/no-deprecated-scope-attribute": "error",
-                "vue/no-dupe-keys": "error",
-                "vue/no-duplicate-attributes": "error",
-                "vue/no-empty-pattern": "error",
-                "vue/no-parsing-error": "error",
-                "vue/no-reserved-keys": "error",
-                "vue/no-shared-component-data": "error",
-                "vue/no-side-effects-in-computed-properties": "error",
-                "vue/no-template-key": "error",
-                "vue/no-textarea-mustache": "error",
-                "vue/no-unused-vars": "error",
-                "vue/object-curly-spacing": ["error", "always"],
-                "vue/require-component-is": "error",
-                "vue/require-direct-export": "error",
-                "vue/require-render-return": "error",
-                "vue/require-v-for-key": "error",
-                "vue/require-valid-default-prop": "error",
-                "vue/return-in-computed-property": "error",
-                "vue/space-infix-ops": "error",
-                "vue/space-unary-ops": "error",
-                "vue/v-on-function-call": "error",
-                "vue/v-slot-style": "error",
-                "vue/valid-template-root": "error",
-                "vue/valid-v-bind": "error",
-                "vue/valid-v-cloak": "error",
-                "vue/valid-v-else-if": "error",
-                "vue/valid-v-else": "error",
-                "vue/valid-v-for": "error",
-                "vue/valid-v-html": "error",
-                "vue/valid-v-if": "error",
-                "vue/valid-v-model": "error",
-                "vue/valid-v-on": "error",
-                "vue/valid-v-once": "error",
-                "vue/valid-v-pre": "error",
-                "vue/valid-v-show": "error",
-                "vue/valid-v-slot": "error",
-                "vue/valid-v-text": "error",
-                "vue/attribute-hyphenation": "error",
-                "vue/html-end-tags": "error",
-                "vue/html-indent": ["error", 4],
-                "vue/html-self-closing": "error",
-                "vue/mustache-interpolation-spacing": "error",
-                "vue/name-property-casing": "error",
-                "vue/no-multi-spaces": "error",
-                "vue/require-default-prop": "error",
-                "vue/require-prop-types": "error",
-                "vue/v-bind-style": "error",
-                "vue/v-on-style": "error",
-                "vue/attributes-order": "error",
-                "vue/html-quotes": "error",
-                "vue/order-in-components": "error",
-                "vue/this-in-template": "error",
-                "vue/html-closing-bracket-newline": [
-                    "error",
-                    {
-                        singleline: "never",
-                        multiline: "always",
-                    },
-                ],
-                "vue/html-closing-bracket-spacing": "error",
-                "vue/prop-name-casing": "error",
-                "vue/component-name-in-template-casing": [
-                    "error",
-                    "kebab-case",
-                ],
-                "vue/multiline-html-element-content-newline": "error",
-                "vue/singleline-html-element-content-newline": "error",
-                "vue/no-spaces-around-equal-signs-in-attribute": "error",
-                "vue/no-template-shadow": "error",
-                "vue/no-unused-components": "error",
-                "vue/no-use-v-if-with-v-for": "error",
-                "vue/no-v-html": "error",
-                "vue/require-prop-type-constructor": "error",
-                "vue/use-v-on-exact": "error",
+                },
+            ],
+            "vue/no-async-in-computed-properties": "error",
+            "vue/no-boolean-default": "error",
+            "vue/no-deprecated-scope-attribute": "error",
+            "vue/no-dupe-keys": "error",
+            "vue/no-duplicate-attributes": "error",
+            "vue/no-empty-pattern": "error",
+            "vue/no-parsing-error": "error",
+            "vue/no-reserved-keys": "error",
+            "vue/no-shared-component-data": "error",
+            "vue/no-side-effects-in-computed-properties": "error",
+            "vue/no-template-key": "error",
+            "vue/no-textarea-mustache": "error",
+            "vue/no-unused-vars": "error",
+            "vue/object-curly-spacing": ["error", "always"],
+            "vue/require-component-is": "error",
+            "vue/require-direct-export": "error",
+            "vue/require-render-return": "error",
+            "vue/require-v-for-key": "error",
+            "vue/require-valid-default-prop": "error",
+            "vue/return-in-computed-property": "error",
+            "vue/space-infix-ops": "error",
+            "vue/space-unary-ops": "error",
+            "vue/v-on-function-call": "error",
+            "vue/v-slot-style": "error",
+            "vue/valid-template-root": "error",
+            "vue/valid-v-bind": "error",
+            "vue/valid-v-cloak": "error",
+            "vue/valid-v-else-if": "error",
+            "vue/valid-v-else": "error",
+            "vue/valid-v-for": "error",
+            "vue/valid-v-html": "error",
+            "vue/valid-v-if": "error",
+            "vue/valid-v-model": "error",
+            "vue/valid-v-on": "error",
+            "vue/valid-v-once": "error",
+            "vue/valid-v-pre": "error",
+            "vue/valid-v-show": "error",
+            "vue/valid-v-slot": "error",
+            "vue/valid-v-text": "error",
+            "vue/attribute-hyphenation": "error",
+            "vue/html-end-tags": "error",
+            "vue/html-indent": ["error", 4],
+            "vue/html-self-closing": "error",
+            "vue/mustache-interpolation-spacing": "error",
+            "vue/component-definition-name-casing": "error",
+            "vue/no-multi-spaces": "error",
+            "vue/require-default-prop": "error",
+            "vue/require-prop-types": "error",
+            "vue/v-bind-style": "error",
+            "vue/v-on-style": "error",
+            "vue/attributes-order": "error",
+            "vue/html-quotes": "error",
+            "vue/order-in-components": "error",
+            "vue/this-in-template": "error",
+            "vue/html-closing-bracket-newline": [
+                "error",
+                {
+                    singleline: "never",
+                    multiline: "always",
+                },
+            ],
+            "vue/html-closing-bracket-spacing": "error",
+            "vue/prop-name-casing": "error",
+            "vue/component-name-in-template-casing": ["error", "kebab-case"],
+            "vue/multiline-html-element-content-newline": "error",
+            "vue/singleline-html-element-content-newline": "error",
+            "vue/no-spaces-around-equal-signs-in-attribute": "error",
+            "vue/no-template-shadow": "error",
+            "vue/no-unused-components": "error",
+            "vue/no-use-v-if-with-v-for": "error",
+            "vue/no-v-html": "error",
+            "vue/require-prop-type-constructor": "error",
+            "vue/use-v-on-exact": "error",
 
-                // Disabled rules (prefer prettier)
-                "vue/no-restricted-syntax": "off",
-                "vue/script-indent": "off",
-            },
+            // Disabled rules (prefer prettier)
+            "vue/no-restricted-syntax": "off",
+            "vue/script-indent": "off",
         },
-    ],
-}
+    },
+]
diff --git a/eslint-internal/config/es2020.js b/eslint-internal/config/es2020.js
index 64322a2..5363a7a 100644
--- a/eslint-internal/config/es2020.js
+++ b/eslint-internal/config/es2020.js
@@ -4,18 +4,15 @@
  */
 "use strict"
 
-module.exports = {
-    extends: [
-        require.resolve("./_base.js"),
-        require.resolve("./_override-2015.js"),
-        require.resolve("./_override-2016.js"),
-        require.resolve("./_override-2017.js"),
-        require.resolve("./_override-2018.js"),
-        require.resolve("./_override-2019.js"),
-        require.resolve("./_override-2020.js"),
-        require.resolve("./_override-ts.js"),
-        require.resolve("./_override-vue.js"),
-        require.resolve("./_override-mocha.js"),
-        require.resolve("./_override-special.js"),
-    ],
-}
+module.exports = [
+    ...require("./_base.js"),
+    ...require("./_override-2015.js"),
+    ...require("./_override-2016.js"),
+    ...require("./_override-2017.js"),
+    ...require("./_override-2018.js"),
+    ...require("./_override-2019.js"),
+    ...require("./_override-2020.js"),
+    ...require("./_override-vue.js"),
+    ...require("./_override-mocha.js"),
+    ...require("./_override-special.js"),
+]
diff --git a/eslint-internal/my-plugin.js b/eslint-internal/my-plugin.js
new file mode 100644
index 0000000..3711c71
--- /dev/null
+++ b/eslint-internal/my-plugin.js
@@ -0,0 +1,15 @@
+"use strict"
+
+const fs = require("fs")
+const path = require("path")
+const rulesRoot = path.resolve(__dirname, "./rules")
+
+const rules = {}
+
+for (const entry of fs.readdirSync(rulesRoot, { withFileTypes: true })) {
+    rules[entry.name.replace(/\.js$/u, "")] = require(
+        path.join(rulesRoot, entry.name),
+    )
+}
+
+module.exports = { rules }
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..0304abf
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,103 @@
+"use strict"
+
+/** @type {import('eslint').Linter.FlatConfig[]} */
+const config = [
+    {
+        ignores: [
+            ".nyc_output/",
+            "coverage/",
+            "!docs/.vitepress",
+            "docs/.vitepress/dist/",
+            "docs/.vitepress/cache/",
+            "node_modules/",
+        ],
+    },
+    {
+        plugins: {
+            my: require("./eslint-internal/my-plugin.js"),
+        },
+    },
+    ...require("./eslint-internal/config/es2020.js"),
+    ...require("./eslint-internal/config/+eslint-plugin.js"),
+    {
+        rules: {
+            "no-restricted-properties": [
+                "error",
+                {
+                    object: "context",
+                    property: "getSourceCode",
+                    message: "Use eslint-compat-utils",
+                },
+                {
+                    object: "context",
+                    property: "getFilename",
+                    message: "Use eslint-compat-utils",
+                },
+                {
+                    object: "context",
+                    property: "getPhysicalFilename",
+                    message: "Use eslint-compat-utils",
+                },
+                {
+                    object: "context",
+                    property: "getCwd",
+                    message: "Use eslint-compat-utils",
+                },
+                {
+                    object: "context",
+                    property: "getScope",
+                    message: "Use sourceCode.getScope(node)",
+                },
+                {
+                    object: "context",
+                    property: "parserServices",
+                    message: "Use sourceCode.parserServices",
+                },
+                {
+                    object: "context",
+                    property: "getDeclaredVariables",
+                    message: "Use sourceCode.getDeclaredVariables(node)",
+                },
+            ],
+        },
+    },
+    {
+        files: ["lib/rules/**/*.js"],
+        rules: {
+            "eslint-plugin/require-meta-docs-url": [
+                "error",
+                {
+                    pattern:
+                        "http://eslint-community.github.io/eslint-plugin-es-x/rules/{{name}}.html",
+                },
+            ],
+        },
+    },
+    {
+        files: ["docs/.vitepress/**"],
+        rules: {
+            "n/no-missing-import": "off",
+            "n/no-extraneous-import": "off",
+            "n/file-extension-in-import": "off",
+            "n/no-extraneous-require": "off",
+        },
+        languageOptions: {
+            globals: {
+                window: "readonly",
+                document: "readonly",
+            },
+        },
+    },
+    {
+        files: ["docs/.vitepress/**/*.vue"],
+        rules: {
+            "vue/multiline-html-element-content-newline": "off",
+            "vue/singleline-html-element-content-newline": "off",
+            "vue/component-definition-name-casing": "off",
+            "vue/html-self-closing": "off",
+            "vue/comma-dangle": "off",
+        },
+    },
+]
+
+module.exports = config
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 38129d7..61f632f 100644
--- a/package.json
+++ b/package.json
@@ -15,23 +15,23 @@
   "dependencies": {
     "@eslint-community/eslint-utils": "^4.1.2",
     "@eslint-community/regexpp": "^4.6.0",
-    "eslint-compat-utils": "^0.5.0"
+    "eslint-compat-utils": "^0.5.1"
   },
   "devDependencies": {
     "@typescript-eslint/parser": "^7.0.2",
     "acorn": "^8.7.0",
     "env-cmd": "^10.1.0",
-    "eslint": "^8.11.0",
+    "eslint": "^9.1.0",
     "eslint-plugin-eslint-comments": "^3.2.0",
     "eslint-plugin-eslint-plugin": "^6.0.0",
     "eslint-plugin-n": "^16.0.1",
     "eslint-plugin-prettier": "^5.0.0",
-    "eslint-plugin-vue": "^9.0.0",
+    "eslint-plugin-vue": "^9.25.0",
     "espree": "^10.0.1",
     "globals": "^15.0.0",
     "jsdom": "^24.0.0",
     "mocha": "^10.0.0",
-    "monaco-editor": "^0.47.0",
+    "monaco-editor": "^0.49.0",
     "npm-run-all": "^4.1.5",
     "nyc": "^15.0.0",
     "opener": "^1.5.1",
@@ -48,8 +48,8 @@
     "coverage": "nyc report -r lcov && opener ./coverage/lcov-report/index.html",
     "docs:build": "vitepress build docs",
     "docs:watch": "vitepress dev docs",
-    "lint": "eslint lib tests scripts eslint-internal docs/.vitepress --rulesdir eslint-internal/rules",
-    "lint:fix": "eslint lib tests scripts eslint-internal docs/.vitepress --rulesdir eslint-internal/rules --fix",
+    "lint": "eslint lib tests scripts eslint-internal docs/.vitepress",
+    "lint:fix": "eslint lib tests scripts eslint-internal docs/.vitepress --fix",
     "new": "node scripts/new-rule",
     "pretest": "npm run -s lint",
     "test": "npm run -s test:mocha",
@@ -84,5 +84,8 @@
     "url": "https://github.com/eslint-community/eslint-plugin-es-x/issues"
   },
   "homepage": "https://github.com/eslint-community/eslint-plugin-es-x#readme",
-  "funding": "https://github.com/sponsors/ota-meshi"
+  "funding": [
+    "https://github.com/sponsors/ota-meshi",
+    "https://opencollective.com/eslint"
+  ]
 }
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 } },
+        },
+    ],
+})
diff --git a/tests/lib/util/define-prototype-method-handler/object-type-checker.js b/tests/lib/util/define-prototype-method-handler/object-type-checker.js
index a4603ec..3648e12 100644
--- a/tests/lib/util/define-prototype-method-handler/object-type-checker.js
+++ b/tests/lib/util/define-prototype-method-handler/object-type-checker.js
@@ -443,26 +443,6 @@ function getResultOfBuildExpressionTypeProvider(code) {
         languageOptions: {
             ecmaVersion: 2022,
             sourceType: "module",
-            globals: {
-                String: "readonly",
-                Number: "readonly",
-                Boolean: "readonly",
-                Symbol: "readonly",
-                Promise: "readonly",
-                BigInt: "readonly",
-                Intl: "readonly",
-                Int8Array: "readonly",
-                Uint8Array: "readonly",
-                Uint8ClampedArray: "readonly",
-                Int16Array: "readonly",
-                Uint16Array: "readonly",
-                Int32Array: "readonly",
-                Uint32Array: "readonly",
-                Float32Array: "readonly",
-                Float64Array: "readonly",
-                BigInt64Array: "readonly",
-                BigUint64Array: "readonly",
-            },
         },
         rules: { "test/test-rule": "warn" },
     })