Repository: eslint-community/eslint-plugin-es-x
Pull request #60 (2023-01-31 00:09:32)

Add rules for Change Array by Copy
"Change Array by Copy" is now Stage 4.
This PR adds 4 rules forbidding the prototype methods added in that proposal.

https://github.com/tc39/proposal-change-array-by-copy


Patch:
diff --git a/docs/rules/index.md b/docs/rules/index.md
index 478bb64..80c76fe 100644
--- a/docs/rules/index.md
+++ b/docs/rules/index.md
@@ -11,6 +11,10 @@ There is a config that enables the rules in this category: `plugin:es-x/no-new-i
 | Rule ID | Description |    |
 |:--------|:------------|:--:|
 | [es-x/no-array-prototype-findlast-findlastindex](./no-array-prototype-findlast-findlastindex.md) | disallow the `Array.prototype.{findLast,findLastIndex}` methods. |  |
+| [es-x/no-array-prototype-toreversed](./no-array-prototype-toreversed.md) | disallow the `Array.prototype.toReversed` method. |  |
+| [es-x/no-array-prototype-tosorted](./no-array-prototype-tosorted.md) | disallow the `Array.prototype.toSorted` method. |  |
+| [es-x/no-array-prototype-tospliced](./no-array-prototype-tospliced.md) | disallow the `Array.prototype.toSpliced` method. |  |
+| [es-x/no-array-prototype-with](./no-array-prototype-with.md) | disallow the `Array.prototype.with` method. |  |
 | [es-x/no-hashbang](./no-hashbang.md) | disallow Hashbang comments. |  |
 
 ## ES2022
@@ -30,6 +34,15 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-regexp-unicode-property-escapes-2022](./no-regexp-unicode-property-escapes-2022.md) | disallow the new values of RegExp Unicode property escape sequences in ES2022. |  |
 | [es-x/no-top-level-await](./no-top-level-await.md) | disallow top-level `await`. |  |
 
+## ES2022 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2022-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, `plugin:es-x/restrict-to-es2020-intl-api`, and `plugin:es-x/restrict-to-es2021-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-segmenter](./no-intl-segmenter.md) | disallow the `Intl.Segmenter` object. |  |
+| [es-x/no-intl-supportedvaluesof](./no-intl-supportedvaluesof.md) | disallow the `Intl.supportedValuesOf` method. |  |
+
 ## ES2021
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2021`, `plugin:es-x/restrict-to-es3`, `plugin:es-x/restrict-to-es5`, `plugin:es-x/restrict-to-es2015`, `plugin:es-x/restrict-to-es2016`, `plugin:es-x/restrict-to-es2017`, `plugin:es-x/restrict-to-es2018`, `plugin:es-x/restrict-to-es2019`, and `plugin:es-x/restrict-to-es2020`
@@ -43,6 +56,16 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-string-prototype-replaceall](./no-string-prototype-replaceall.md) | disallow the `String.prototype.replaceAll` method. |  |
 | [es-x/no-weakrefs](./no-weakrefs.md) | disallow the `WeakRef` and `FinalizationRegistry` class. |  |
 
+## ES2021 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2021-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, and `plugin:es-x/restrict-to-es2020-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-datetimeformat-prototype-formatrange](./no-intl-datetimeformat-prototype-formatrange.md) | disallow the `Intl.DateTimeFormat.prototype.formatRange` method. |  |
+| [es-x/no-intl-displaynames](./no-intl-displaynames.md) | disallow the `Intl.DisplayNames` object. |  |
+| [es-x/no-intl-listformat](./no-intl-listformat.md) | disallow the `Intl.ListFormat` object. |  |
+
 ## ES2020
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2020`, `plugin:es-x/restrict-to-es3`, `plugin:es-x/restrict-to-es5`, `plugin:es-x/restrict-to-es2015`, `plugin:es-x/restrict-to-es2016`, `plugin:es-x/restrict-to-es2017`, `plugin:es-x/restrict-to-es2018`, and `plugin:es-x/restrict-to-es2019`
@@ -60,6 +83,15 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-regexp-unicode-property-escapes-2020](./no-regexp-unicode-property-escapes-2020.md) | disallow the new values of RegExp Unicode property escape sequences in ES2020. |  |
 | [es-x/no-string-prototype-matchall](./no-string-prototype-matchall.md) | disallow the `String.prototype.matchAll` method. |  |
 
+## ES2020 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2020-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, and `plugin:es-x/restrict-to-es2019-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-locale](./no-intl-locale.md) | disallow the `Intl.Locale` object. |  |
+| [es-x/no-intl-relativetimeformat](./no-intl-relativetimeformat.md) | disallow the `Intl.RelativeTimeFormat` object. |  |
+
 ## ES2019
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2019`, `plugin:es-x/restrict-to-es3`, `plugin:es-x/restrict-to-es5`, `plugin:es-x/restrict-to-es2015`, `plugin:es-x/restrict-to-es2016`, `plugin:es-x/restrict-to-es2017`, and `plugin:es-x/restrict-to-es2018`
@@ -89,6 +121,15 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-regexp-unicode-property-escapes](./no-regexp-unicode-property-escapes.md) | disallow RegExp Unicode property escape sequences. |  |
 | [es-x/no-rest-spread-properties](./no-rest-spread-properties.md) | disallow rest/spread properties. |  |
 
+## ES2018 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2018-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, and `plugin:es-x/restrict-to-es2017-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-numberformat-prototype-formattoparts](./no-intl-numberformat-prototype-formattoparts.md) | disallow the `NumberFormat.prototype.formatToParts` method. |  |
+| [es-x/no-intl-pluralrules](./no-intl-pluralrules.md) | disallow the `Intl.PluralRules` object. |  |
+
 ## ES2017
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2017`, `plugin:es-x/restrict-to-es3`, `plugin:es-x/restrict-to-es5`, `plugin:es-x/restrict-to-es2015`, and `plugin:es-x/restrict-to-es2016`
@@ -104,6 +145,14 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-string-prototype-padstart-padend](./no-string-prototype-padstart-padend.md) | disallow the `String.prototype.{padStart,padEnd}` methods. |  |
 | [es-x/no-trailing-function-commas](./no-trailing-function-commas.md) | disallow trailing commas in parameter/argument lists. | 🔧 |
 
+## ES2017 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2017-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, and `plugin:es-x/restrict-to-es2016-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-datetimeformat-prototype-formattoparts](./no-intl-datetimeformat-prototype-formattoparts.md) | disallow the `DateTimeFormat.prototype.formatToParts` method. |  |
+
 ## ES2016
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2016`, `plugin:es-x/restrict-to-es3`, `plugin:es-x/restrict-to-es5`, and `plugin:es-x/restrict-to-es2015`
@@ -113,6 +162,14 @@ There are multiple configs that enable all rules in this category: `plugin:es-x/
 | [es-x/no-array-prototype-includes](./no-array-prototype-includes.md) | disallow the `Array.prototype.includes` method. |  |
 | [es-x/no-exponential-operators](./no-exponential-operators.md) | disallow exponential operators. |  |
 
+## ES2016 Intl API
+
+There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2016-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, and `plugin:es-x/restrict-to-es2015-intl-api`
+
+| Rule ID | Description |    |
+|:--------|:------------|:--:|
+| [es-x/no-intl-getcanonicallocales](./no-intl-getcanonicallocales.md) | disallow the `Intl.getCanonicalLocales` method. |  |
+
 ## ES2015
 
 There are multiple configs that enable all rules in this category: `plugin:es-x/no-new-in-es2015`, `plugin:es-x/restrict-to-es3`, and `plugin:es-x/restrict-to-es5`
diff --git a/docs/rules/no-array-prototype-toreversed.md b/docs/rules/no-array-prototype-toreversed.md
new file mode 100644
index 0000000..c08991a
--- /dev/null
+++ b/docs/rules/no-array-prototype-toreversed.md
@@ -0,0 +1,46 @@
+---
+title: "es-x/no-array-prototype-toreversed"
+description: "disallow the `Array.prototype.toReversed` method"
+---
+
+# es-x/no-array-prototype-toreversed
+> disallow the `Array.prototype.toReversed` 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: `plugin:es-x/no-new-in-esnext`
+
+This rule reports ES2023 [`Array.prototype.toReversed` methods](https://github.com/tc39/proposal-change-array-by-copy) 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-array-prototype-toreversed: [error, { aggressive: true }] */
+array.toReversed()
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yaml
+rules:
+  es-x/no-array-prototype-toreversed: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-array-prototype-toreversed.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-array-prototype-toreversed.js)
diff --git a/docs/rules/no-array-prototype-tosorted.md b/docs/rules/no-array-prototype-tosorted.md
new file mode 100644
index 0000000..e1277ad
--- /dev/null
+++ b/docs/rules/no-array-prototype-tosorted.md
@@ -0,0 +1,46 @@
+---
+title: "es-x/no-array-prototype-tosorted"
+description: "disallow the `Array.prototype.toSorted` method"
+---
+
+# es-x/no-array-prototype-tosorted
+> disallow the `Array.prototype.toSorted` 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: `plugin:es-x/no-new-in-esnext`
+
+This rule reports ES2023 [`Array.prototype.toSorted` methods](https://github.com/tc39/proposal-change-array-by-copy) 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-array-prototype-tosorted: [error, { aggressive: true }] */
+array.toSorted()
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yaml
+rules:
+  es-x/no-array-prototype-tosorted: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-array-prototype-tosorted.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-array-prototype-tosorted.js)
diff --git a/docs/rules/no-array-prototype-tospliced.md b/docs/rules/no-array-prototype-tospliced.md
new file mode 100644
index 0000000..b6c733c
--- /dev/null
+++ b/docs/rules/no-array-prototype-tospliced.md
@@ -0,0 +1,46 @@
+---
+title: "es-x/no-array-prototype-tospliced"
+description: "disallow the `Array.prototype.toSpliced` method"
+---
+
+# es-x/no-array-prototype-tospliced
+> disallow the `Array.prototype.toSpliced` 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: `plugin:es-x/no-new-in-esnext`
+
+This rule reports ES2023 [`Array.prototype.toSpliced` methods](https://github.com/tc39/proposal-change-array-by-copy) 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-array-prototype-tospliced: [error, { aggressive: true }] */
+array.toSpliced(1, 1)
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yaml
+rules:
+  es-x/no-array-prototype-tospliced: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-array-prototype-tospliced.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-array-prototype-tospliced.js)
diff --git a/docs/rules/no-array-prototype-with.md b/docs/rules/no-array-prototype-with.md
new file mode 100644
index 0000000..3f5629c
--- /dev/null
+++ b/docs/rules/no-array-prototype-with.md
@@ -0,0 +1,46 @@
+---
+title: "es-x/no-array-prototype-with"
+description: "disallow the `Array.prototype.with` method"
+---
+
+# es-x/no-array-prototype-with
+> disallow the `Array.prototype.with` 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: `plugin:es-x/no-new-in-esnext`
+
+This rule reports ES2023 [`Array.prototype.with` methods](https://github.com/tc39/proposal-change-array-by-copy) 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-array-prototype-with: [error, { aggressive: true }] */
+array.with(index, value)
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yaml
+rules:
+  es-x/no-array-prototype-with: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-array-prototype-with.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-array-prototype-with.js)
diff --git a/docs/rules/no-intl-datetimeformat-prototype-formatrange.md b/docs/rules/no-intl-datetimeformat-prototype-formatrange.md
new file mode 100644
index 0000000..157fde9
--- /dev/null
+++ b/docs/rules/no-intl-datetimeformat-prototype-formatrange.md
@@ -0,0 +1,47 @@
+---
+title: "es-x/no-intl-datetimeformat-prototype-formatrange"
+description: "disallow the `Intl.DateTimeFormat.prototype.formatRange` method"
+---
+
+# es-x/no-intl-datetimeformat-prototype-formatrange
+> disallow the `Intl.DateTimeFormat.prototype.formatRange` 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: `plugin:es-x/no-new-in-es2021-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, and `plugin:es-x/restrict-to-es2020-intl-api`
+
+This rule reports ES2021 Intl API `Intl.DateTimeFormat.prototype.formatRange` 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-intl-datetimeformat-prototype-formatrange: [error, { aggressive: true }] */
+const dateTimeFormat = new Intl.DateTimeFormat('en', options1);
+console.log(dateTimeFormat.formatRange(startDate, endDate));
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yml
+rules:
+  es-x/no-intl-datetimeformat-prototype-formatrange: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-datetimeformat-prototype-formatrange.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-datetimeformat-prototype-formatrange.js)
diff --git a/docs/rules/no-intl-datetimeformat-prototype-formattoparts.md b/docs/rules/no-intl-datetimeformat-prototype-formattoparts.md
new file mode 100644
index 0000000..5d85695
--- /dev/null
+++ b/docs/rules/no-intl-datetimeformat-prototype-formattoparts.md
@@ -0,0 +1,51 @@
+---
+title: "es-x/no-intl-datetimeformat-prototype-formattoparts"
+description: "disallow the `DateTimeFormat.prototype.formatToParts` method"
+---
+
+# es-x/no-intl-datetimeformat-prototype-formattoparts
+> disallow the `DateTimeFormat.prototype.formatToParts` 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: `plugin:es-x/no-new-in-es2017-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, and `plugin:es-x/restrict-to-es2016-intl-api`
+
+This rule reports ES2017 Intl API `DateTimeFormat.prototype.formatToParts` 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-intl-datetimeformat-prototype-formattoparts: [error, { aggressive: true }] */
+const formatter = new Intl.DateTimeFormat('en', {
+  year: 'numeric',
+  month: 'long',
+  day: 'numeric'
+});
+console.log(formatter.formatToParts(num));
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yml
+rules:
+  es-x/no-intl-datetimeformat-prototype-formattoparts: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js)
diff --git a/docs/rules/no-intl-displaynames.md b/docs/rules/no-intl-displaynames.md
new file mode 100644
index 0000000..b5779f4
--- /dev/null
+++ b/docs/rules/no-intl-displaynames.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-displaynames"
+description: "disallow the `Intl.DisplayNames` object"
+---
+
+# es-x/no-intl-displaynames
+> disallow the `Intl.DisplayNames` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2021-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, and `plugin:es-x/restrict-to-es2020-intl-api`
+
+This rule reports ES2021 Intl API `Intl.DisplayNames` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-displaynames: error */
+const dn = new Intl.DisplayNames('en', {type: 'calendar'});
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-displaynames.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-displaynames.js)
diff --git a/docs/rules/no-intl-getcanonicallocales.md b/docs/rules/no-intl-getcanonicallocales.md
new file mode 100644
index 0000000..8163122
--- /dev/null
+++ b/docs/rules/no-intl-getcanonicallocales.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-getcanonicallocales"
+description: "disallow the `Intl.getCanonicalLocales` method"
+---
+
+# es-x/no-intl-getcanonicallocales
+> disallow the `Intl.getCanonicalLocales` 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: `plugin:es-x/no-new-in-es2016-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, and `plugin:es-x/restrict-to-es2015-intl-api`
+
+This rule reports ES2016 Intl API `Intl.getCanonicalLocales` method as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-getcanonicallocales: error */
+console.log(Intl.getCanonicalLocales('EN-US'));
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-getcanonicallocales.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-getcanonicallocales.js)
diff --git a/docs/rules/no-intl-listformat.md b/docs/rules/no-intl-listformat.md
new file mode 100644
index 0000000..5e2235b
--- /dev/null
+++ b/docs/rules/no-intl-listformat.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-listformat"
+description: "disallow the `Intl.ListFormat` object"
+---
+
+# es-x/no-intl-listformat
+> disallow the `Intl.ListFormat` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2021-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, and `plugin:es-x/restrict-to-es2020-intl-api`
+
+This rule reports ES2021 Intl API `Intl.ListFormat` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-listformat: error */
+const formatter = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-listformat.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-listformat.js)
diff --git a/docs/rules/no-intl-locale.md b/docs/rules/no-intl-locale.md
new file mode 100644
index 0000000..b4ee349
--- /dev/null
+++ b/docs/rules/no-intl-locale.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-locale"
+description: "disallow the `Intl.Locale` object"
+---
+
+# es-x/no-intl-locale
+> disallow the `Intl.Locale` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2020-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, and `plugin:es-x/restrict-to-es2019-intl-api`
+
+This rule reports ES2020 Intl API `Intl.Locale` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-locale: error */
+const japanese = new Intl.Locale('ja-Jpan-JP-u-ca-japanese-hc-h12');
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-locale.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-locale.js)
diff --git a/docs/rules/no-intl-numberformat-prototype-formattoparts.md b/docs/rules/no-intl-numberformat-prototype-formattoparts.md
new file mode 100644
index 0000000..029c228
--- /dev/null
+++ b/docs/rules/no-intl-numberformat-prototype-formattoparts.md
@@ -0,0 +1,50 @@
+---
+title: "es-x/no-intl-numberformat-prototype-formattoparts"
+description: "disallow the `NumberFormat.prototype.formatToParts` method"
+---
+
+# es-x/no-intl-numberformat-prototype-formattoparts
+> disallow the `NumberFormat.prototype.formatToParts` 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: `plugin:es-x/no-new-in-es2018-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, and `plugin:es-x/restrict-to-es2017-intl-api`
+
+This rule reports ES2018 Intl API `NumberFormat.prototype.formatToParts` 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-intl-numberformat-prototype-formattoparts: [error, { aggressive: true }] */
+const formatter = new Intl.NumberFormat('de-DE', {
+  style: 'currency',
+  currency: 'EUR'
+});
+console.log(formatter.formatToParts(number));
+```
+
+</eslint-playground>
+
+## 🔧 Options
+
+This rule has an option.
+
+```yml
+rules:
+  es-x/no-intl-numberformat-prototype-formattoparts: [error, { aggressive: false }]
+```
+
+### aggressive: boolean
+
+Configure the aggressive mode for only this rule.
+This is prior to the `settings['es-x'].aggressive` setting.
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-numberformat-prototype-formattoparts.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-numberformat-prototype-formattoparts.js)
diff --git a/docs/rules/no-intl-pluralrules.md b/docs/rules/no-intl-pluralrules.md
new file mode 100644
index 0000000..e805832
--- /dev/null
+++ b/docs/rules/no-intl-pluralrules.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-pluralrules"
+description: "disallow the `Intl.PluralRules` object"
+---
+
+# es-x/no-intl-pluralrules
+> disallow the `Intl.PluralRules` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2018-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, and `plugin:es-x/restrict-to-es2017-intl-api`
+
+This rule reports ES2018 Intl API `Intl.PluralRules` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-pluralrules: error */
+const pr = new Intl.PluralRules();
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-pluralrules.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-pluralrules.js)
diff --git a/docs/rules/no-intl-relativetimeformat.md b/docs/rules/no-intl-relativetimeformat.md
new file mode 100644
index 0000000..32e32a4
--- /dev/null
+++ b/docs/rules/no-intl-relativetimeformat.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-relativetimeformat"
+description: "disallow the `Intl.RelativeTimeFormat` object"
+---
+
+# es-x/no-intl-relativetimeformat
+> disallow the `Intl.RelativeTimeFormat` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2020-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, and `plugin:es-x/restrict-to-es2019-intl-api`
+
+This rule reports ES2020 Intl API `Intl.RelativeTimeFormat` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-relativetimeformat: error */
+const rtf = new Intl.RelativeTimeFormat('en', { style: 'narrow' });
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-relativetimeformat.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-relativetimeformat.js)
diff --git a/docs/rules/no-intl-segmenter.md b/docs/rules/no-intl-segmenter.md
new file mode 100644
index 0000000..f6d0d4f
--- /dev/null
+++ b/docs/rules/no-intl-segmenter.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-segmenter"
+description: "disallow the `Intl.Segmenter` object"
+---
+
+# es-x/no-intl-segmenter
+> disallow the `Intl.Segmenter` object
+
+- ❗ <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: `plugin:es-x/no-new-in-es2022-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, `plugin:es-x/restrict-to-es2020-intl-api`, and `plugin:es-x/restrict-to-es2021-intl-api`
+
+This rule reports ES2022 Intl API `Intl.Segmenter` object as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-segmenter: error */
+const segmenter = new Intl.Segmenter('fr', { granularity: 'word' });
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-segmenter.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-segmenter.js)
diff --git a/docs/rules/no-intl-supportedvaluesof.md b/docs/rules/no-intl-supportedvaluesof.md
new file mode 100644
index 0000000..08a0f74
--- /dev/null
+++ b/docs/rules/no-intl-supportedvaluesof.md
@@ -0,0 +1,30 @@
+---
+title: "es-x/no-intl-supportedvaluesof"
+description: "disallow the `Intl.supportedValuesOf` method"
+---
+
+# es-x/no-intl-supportedvaluesof
+> disallow the `Intl.supportedValuesOf` 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: `plugin:es-x/no-new-in-es2022-intl-api`, `plugin:es-x/restrict-to-es-intl-api-1st-edition`, `plugin:es-x/restrict-to-es2015-intl-api`, `plugin:es-x/restrict-to-es2016-intl-api`, `plugin:es-x/restrict-to-es2017-intl-api`, `plugin:es-x/restrict-to-es2018-intl-api`, `plugin:es-x/restrict-to-es2019-intl-api`, `plugin:es-x/restrict-to-es2020-intl-api`, and `plugin:es-x/restrict-to-es2021-intl-api`
+
+This rule reports  ES2022 Intl API `Intl.supportedValuesOf` method as errors.
+
+## 💡 Examples
+
+⛔ Examples of **incorrect** code for this rule:
+
+<eslint-playground type="bad">
+
+```js
+/*eslint es-x/no-intl-supportedvaluesof: error */
+const collation = Intl.supportedValuesOf("collation")
+```
+
+</eslint-playground>
+
+## 📚 References
+
+- [Rule source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/lib/rules/no-intl-supportedvaluesof.js)
+- [Test source](https://github.com/eslint-community/eslint-plugin-es-x/blob/master/tests/lib/rules/no-intl-supportedvaluesof.js)
diff --git a/lib/configs/no-new-in-es2016-intl-api.js b/lib/configs/no-new-in-es2016-intl-api.js
index f42c599..bbc2a08 100644
--- a/lib/configs/no-new-in-es2016-intl-api.js
+++ b/lib/configs/no-new-in-es2016-intl-api.js
@@ -4,4 +4,7 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: { "es-x/no-intl-getcanonicallocales": "error" },
+}
diff --git a/lib/configs/no-new-in-es2017-intl-api.js b/lib/configs/no-new-in-es2017-intl-api.js
index f42c599..b489afb 100644
--- a/lib/configs/no-new-in-es2017-intl-api.js
+++ b/lib/configs/no-new-in-es2017-intl-api.js
@@ -4,4 +4,7 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: { "es-x/no-intl-datetimeformat-prototype-formattoparts": "error" },
+}
diff --git a/lib/configs/no-new-in-es2018-intl-api.js b/lib/configs/no-new-in-es2018-intl-api.js
index f42c599..4468b24 100644
--- a/lib/configs/no-new-in-es2018-intl-api.js
+++ b/lib/configs/no-new-in-es2018-intl-api.js
@@ -4,4 +4,10 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: {
+        "es-x/no-intl-numberformat-prototype-formattoparts": "error",
+        "es-x/no-intl-pluralrules": "error",
+    },
+}
diff --git a/lib/configs/no-new-in-es2020-intl-api.js b/lib/configs/no-new-in-es2020-intl-api.js
index f42c599..e7ee804 100644
--- a/lib/configs/no-new-in-es2020-intl-api.js
+++ b/lib/configs/no-new-in-es2020-intl-api.js
@@ -4,4 +4,10 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: {
+        "es-x/no-intl-locale": "error",
+        "es-x/no-intl-relativetimeformat": "error",
+    },
+}
diff --git a/lib/configs/no-new-in-es2021-intl-api.js b/lib/configs/no-new-in-es2021-intl-api.js
index f42c599..766910f 100644
--- a/lib/configs/no-new-in-es2021-intl-api.js
+++ b/lib/configs/no-new-in-es2021-intl-api.js
@@ -4,4 +4,11 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: {
+        "es-x/no-intl-datetimeformat-prototype-formatrange": "error",
+        "es-x/no-intl-displaynames": "error",
+        "es-x/no-intl-listformat": "error",
+    },
+}
diff --git a/lib/configs/no-new-in-es2022-intl-api.js b/lib/configs/no-new-in-es2022-intl-api.js
index f42c599..ffe1c9e 100644
--- a/lib/configs/no-new-in-es2022-intl-api.js
+++ b/lib/configs/no-new-in-es2022-intl-api.js
@@ -4,4 +4,10 @@
  */
 "use strict"
 
-module.exports = { plugins: ["es-x"], rules: {} }
+module.exports = {
+    plugins: ["es-x"],
+    rules: {
+        "es-x/no-intl-segmenter": "error",
+        "es-x/no-intl-supportedvaluesof": "error",
+    },
+}
diff --git a/lib/configs/no-new-in-esnext.js b/lib/configs/no-new-in-esnext.js
index 0c2d28e..840c2f4 100644
--- a/lib/configs/no-new-in-esnext.js
+++ b/lib/configs/no-new-in-esnext.js
@@ -8,6 +8,10 @@ module.exports = {
     plugins: ["es-x"],
     rules: {
         "es-x/no-array-prototype-findlast-findlastindex": "error",
+        "es-x/no-array-prototype-toreversed": "error",
+        "es-x/no-array-prototype-tosorted": "error",
+        "es-x/no-array-prototype-tospliced": "error",
+        "es-x/no-array-prototype-with": "error",
         "es-x/no-hashbang": "error",
     },
 }
diff --git a/lib/index.js b/lib/index.js
index c6855e6..386c80a 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -93,7 +93,11 @@ module.exports = {
         "no-array-prototype-reduce": require("./rules/no-array-prototype-reduce"),
         "no-array-prototype-reduceright": require("./rules/no-array-prototype-reduceright"),
         "no-array-prototype-some": require("./rules/no-array-prototype-some"),
+        "no-array-prototype-toreversed": require("./rules/no-array-prototype-toreversed"),
+        "no-array-prototype-tosorted": require("./rules/no-array-prototype-tosorted"),
+        "no-array-prototype-tospliced": require("./rules/no-array-prototype-tospliced"),
         "no-array-prototype-values": require("./rules/no-array-prototype-values"),
+        "no-array-prototype-with": require("./rules/no-array-prototype-with"),
         "no-array-string-prototype-at": require("./rules/no-array-string-prototype-at"),
         "no-arrow-functions": require("./rules/no-arrow-functions"),
         "no-async-functions": require("./rules/no-async-functions"),
@@ -125,6 +129,17 @@ module.exports = {
         "no-hashbang": require("./rules/no-hashbang"),
         "no-import-meta": require("./rules/no-import-meta"),
         "no-initializers-in-for-in": require("./rules/no-initializers-in-for-in"),
+        "no-intl-numberformat-prototype-formattoparts": require("./rules/no-intl-numberformat-prototype-formattoparts"),
+        "no-intl-pluralrules": require("./rules/no-intl-pluralrules"),
+        "no-intl-locale": require("./rules/no-intl-locale"),
+        "no-intl-relativetimeformat": require("./rules/no-intl-relativetimeformat"),
+        "no-intl-datetimeformat-prototype-formatrange": require("./rules/no-intl-datetimeformat-prototype-formatrange"),
+        "no-intl-datetimeformat-prototype-formattoparts": require("./rules/no-intl-datetimeformat-prototype-formattoparts"),
+        "no-intl-displaynames": require("./rules/no-intl-displaynames"),
+        "no-intl-getcanonicallocales": require("./rules/no-intl-getcanonicallocales"),
+        "no-intl-listformat": require("./rules/no-intl-listformat"),
+        "no-intl-segmenter": require("./rules/no-intl-segmenter"),
+        "no-intl-supportedvaluesof": require("./rules/no-intl-supportedvaluesof"),
         "no-json": require("./rules/no-json"),
         "no-json-superset": require("./rules/no-json-superset"),
         "no-keyword-properties": require("./rules/no-keyword-properties"),
diff --git a/lib/rules/no-array-prototype-toreversed.js b/lib/rules/no-array-prototype-toreversed.js
new file mode 100644
index 0000000..74b02f2
--- /dev/null
+++ b/lib/rules/no-array-prototype-toreversed.js
@@ -0,0 +1,46 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Array.prototype.toReversed` method.",
+            category: "ES2023",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-array-prototype-toreversed.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2023 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Array: ["toReversed"],
+            Int8Array: ["toReversed"],
+            Uint8Array: ["toReversed"],
+            Uint8ClampedArray: ["toReversed"],
+            Int16Array: ["toReversed"],
+            Uint16Array: ["toReversed"],
+            Int32Array: ["toReversed"],
+            Uint32Array: ["toReversed"],
+            Float32Array: ["toReversed"],
+            Float64Array: ["toReversed"],
+            BigInt64Array: ["toReversed"],
+            BigUint64Array: ["toReversed"],
+        })
+    },
+}
diff --git a/lib/rules/no-array-prototype-tosorted.js b/lib/rules/no-array-prototype-tosorted.js
new file mode 100644
index 0000000..af65c18
--- /dev/null
+++ b/lib/rules/no-array-prototype-tosorted.js
@@ -0,0 +1,46 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Array.prototype.toSorted` method.",
+            category: "ES2023",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-array-prototype-tosorted.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2023 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Array: ["toSorted"],
+            Int8Array: ["toSorted"],
+            Uint8Array: ["toSorted"],
+            Uint8ClampedArray: ["toSorted"],
+            Int16Array: ["toSorted"],
+            Uint16Array: ["toSorted"],
+            Int32Array: ["toSorted"],
+            Uint32Array: ["toSorted"],
+            Float32Array: ["toSorted"],
+            Float64Array: ["toSorted"],
+            BigInt64Array: ["toSorted"],
+            BigUint64Array: ["toSorted"],
+        })
+    },
+}
diff --git a/lib/rules/no-array-prototype-tospliced.js b/lib/rules/no-array-prototype-tospliced.js
new file mode 100644
index 0000000..cee1721
--- /dev/null
+++ b/lib/rules/no-array-prototype-tospliced.js
@@ -0,0 +1,35 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Array.prototype.toSpliced` method.",
+            category: "ES2023",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-array-prototype-tospliced.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2023 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Array: ["toSpliced"],
+        })
+    },
+}
diff --git a/lib/rules/no-array-prototype-with.js b/lib/rules/no-array-prototype-with.js
new file mode 100644
index 0000000..266c1cc
--- /dev/null
+++ b/lib/rules/no-array-prototype-with.js
@@ -0,0 +1,46 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Array.prototype.with` method.",
+            category: "ES2023",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-array-prototype-with.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2023 '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            Array: ["with"],
+            Int8Array: ["with"],
+            Uint8Array: ["with"],
+            Uint8ClampedArray: ["with"],
+            Int16Array: ["with"],
+            Uint16Array: ["with"],
+            Int32Array: ["with"],
+            Uint32Array: ["with"],
+            Float32Array: ["with"],
+            Float64Array: ["with"],
+            BigInt64Array: ["with"],
+            BigUint64Array: ["with"],
+        })
+    },
+}
diff --git a/lib/rules/no-intl-datetimeformat-prototype-formatrange.js b/lib/rules/no-intl-datetimeformat-prototype-formatrange.js
new file mode 100644
index 0000000..e29035f
--- /dev/null
+++ b/lib/rules/no-intl-datetimeformat-prototype-formatrange.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description:
+                "disallow the `Intl.DateTimeFormat.prototype.formatRange` method.",
+            category: "ES2021-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-datetimeformat-prototype-formatrange.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2021 Intl API '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            "Intl.DateTimeFormat": ["formatRange"],
+        })
+    },
+}
diff --git a/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js b/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js
new file mode 100644
index 0000000..d50835d
--- /dev/null
+++ b/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description:
+                "disallow the `DateTimeFormat.prototype.formatToParts` method.",
+            category: "ES2017-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-datetimeformat-prototype-formattoparts.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2017 Intl API '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            "Intl.DateTimeFormat": ["formatToParts"],
+        })
+    },
+}
diff --git a/lib/rules/no-intl-displaynames.js b/lib/rules/no-intl-displaynames.js
new file mode 100644
index 0000000..9ece5e0
--- /dev/null
+++ b/lib/rules/no-intl-displaynames.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.DisplayNames` object.",
+            category: "ES2021-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-displaynames.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2021 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        DisplayNames: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-getcanonicallocales.js b/lib/rules/no-intl-getcanonicallocales.js
new file mode 100644
index 0000000..aba58d7
--- /dev/null
+++ b/lib/rules/no-intl-getcanonicallocales.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.getCanonicalLocales` method.",
+            category: "ES2016-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-getcanonicallocales.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2016 Intl API '{{name}}' method is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        getCanonicalLocales: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-listformat.js b/lib/rules/no-intl-listformat.js
new file mode 100644
index 0000000..8cc4db1
--- /dev/null
+++ b/lib/rules/no-intl-listformat.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.ListFormat` object.",
+            category: "ES2021-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-listformat.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2021 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        ListFormat: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-locale.js b/lib/rules/no-intl-locale.js
new file mode 100644
index 0000000..b162320
--- /dev/null
+++ b/lib/rules/no-intl-locale.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.Locale` object.",
+            category: "ES2020-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-locale.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2020 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        Locale: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-numberformat-prototype-formattoparts.js b/lib/rules/no-intl-numberformat-prototype-formattoparts.js
new file mode 100644
index 0000000..e08e0c7
--- /dev/null
+++ b/lib/rules/no-intl-numberformat-prototype-formattoparts.js
@@ -0,0 +1,36 @@
+"use strict"
+
+const {
+    definePrototypeMethodHandler,
+} = require("../util/define-prototype-method-handler")
+
+module.exports = {
+    meta: {
+        docs: {
+            description:
+                "disallow the `NumberFormat.prototype.formatToParts` method.",
+            category: "ES2018-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-numberformat-prototype-formattoparts.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2018 Intl API '{{name}}' method is forbidden.",
+        },
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    aggressive: { type: "boolean" },
+                },
+                additionalProperties: false,
+            },
+        ],
+        type: "problem",
+    },
+    create(context) {
+        return definePrototypeMethodHandler(context, {
+            "Intl.NumberFormat": ["formatToParts"],
+        })
+    },
+}
diff --git a/lib/rules/no-intl-pluralrules.js b/lib/rules/no-intl-pluralrules.js
new file mode 100644
index 0000000..56b04e5
--- /dev/null
+++ b/lib/rules/no-intl-pluralrules.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.PluralRules` object.",
+            category: "ES2018-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-pluralrules.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2018 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        PluralRules: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-relativetimeformat.js b/lib/rules/no-intl-relativetimeformat.js
new file mode 100644
index 0000000..4b31996
--- /dev/null
+++ b/lib/rules/no-intl-relativetimeformat.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.RelativeTimeFormat` object.",
+            category: "ES2020-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-relativetimeformat.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2020 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        RelativeTimeFormat: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-segmenter.js b/lib/rules/no-intl-segmenter.js
new file mode 100644
index 0000000..31ca3a2
--- /dev/null
+++ b/lib/rules/no-intl-segmenter.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.Segmenter` object.",
+            category: "ES2022-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-segmenter.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2022 Intl API '{{name}}' object is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        Segmenter: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/rules/no-intl-supportedvaluesof.js b/lib/rules/no-intl-supportedvaluesof.js
new file mode 100644
index 0000000..2dc3432
--- /dev/null
+++ b/lib/rules/no-intl-supportedvaluesof.js
@@ -0,0 +1,38 @@
+"use strict"
+
+const { READ, ReferenceTracker } = require("@eslint-community/eslint-utils")
+
+module.exports = {
+    meta: {
+        docs: {
+            description: "disallow the `Intl.supportedValuesOf` method.",
+            category: "ES2022-Intl-API",
+            recommended: false,
+            url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-intl-supportedvaluesof.html",
+        },
+        fixable: null,
+        messages: {
+            forbidden: "ES2022 Intl API '{{name}}' method is forbidden.",
+        },
+        schema: [],
+        type: "problem",
+    },
+    create(context) {
+        return {
+            "Program:exit"() {
+                const tracker = new ReferenceTracker(context.getScope())
+                for (const { node, path } of tracker.iterateGlobalReferences({
+                    Intl: {
+                        supportedValuesOf: { [READ]: true },
+                    },
+                })) {
+                    context.report({
+                        node,
+                        messageId: "forbidden",
+                        data: { name: path.join(".") },
+                    })
+                }
+            },
+        }
+    },
+}
diff --git a/lib/util/define-prototype-method-handler.js b/lib/util/define-prototype-method-handler.js
index 00ee11d..386de32 100644
--- a/lib/util/define-prototype-method-handler.js
+++ b/lib/util/define-prototype-method-handler.js
@@ -202,14 +202,18 @@ function definePrototypeMethodHandler(context, nameMap, options) {
      * @returns {boolean} `true` if should disallow it.
      */
     function typeSymbolEscapedNameEquals(type, className) {
-        const escapedName = type.symbol.escapedName
-        return (
-            escapedName === className ||
-            // ReadonlyArray, ReadonlyMap, ReadonlySet
-            escapedName === `Readonly${className}` ||
-            // CallableFunction
-            (className === "Function" && escapedName === "CallableFunction")
-        )
+        const symbol = type.symbol
+        if (!className.includes(".")) {
+            const escapedName = symbol.escapedName
+            return (
+                escapedName === className ||
+                // ReadonlyArray, ReadonlyMap, ReadonlySet
+                escapedName === `Readonly${className}` ||
+                // CallableFunction
+                (className === "Function" && escapedName === "CallableFunction")
+            )
+        }
+        return checker.getFullyQualifiedName(symbol) === className
     }
 
     /**
diff --git a/package.json b/package.json
index be264b9..af7ea96 100644
--- a/package.json
+++ b/package.json
@@ -52,6 +52,7 @@
     "pretest": "npm run -s lint",
     "test": "npm run -s test:mocha",
     "test:mocha": "nyc mocha tests/**/*.js --reporter dot --timeout 60000",
+    "test:debug": "mocha tests/**/*.js --reporter dot --timeout 60000",
     "update": "run-s update:*",
     "update:url": "npm run -s lint -- --fix",
     "update:configs": "node scripts/update-lib-configs",


Test patch:
diff --git a/tests/fixtures/tsconfig.json b/tests/fixtures/tsconfig.json
index 65fe407..2f2cd23 100644
--- a/tests/fixtures/tsconfig.json
+++ b/tests/fixtures/tsconfig.json
@@ -1,7 +1,7 @@
 {
     "compilerOptions": {
         "strict": true,
-        "lib": ["ES2020"]
+        "lib": ["ES2021"]
     },
     "include": ["test.ts"]
 }
diff --git a/tests/lib/rules/no-array-prototype-toreversed.js b/tests/lib/rules/no-array-prototype-toreversed.js
new file mode 100644
index 0000000..112a38e
--- /dev/null
+++ b/tests/lib/rules/no-array-prototype-toreversed.js
@@ -0,0 +1,213 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-array-prototype-toreversed.js")
+const ruleId = "no-array-prototype-toreversed"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "toReversed()",
+        "foo.find(predicate)",
+        "foo.toReversed()",
+        {
+            code: "toReversed()",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toReversed()",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "['foo'].toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+        },
+        {
+            code: "foo.toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toReversed()",
+            options: [{ aggressive: true }],
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "toReversed()" },
+        { filename, code: "foo.find(predicate)" },
+        { filename, code: "foo.toReversed()" },
+        { filename, code: "let foo = {}; foo.toReversed()" },
+        {
+            filename,
+            code: "toReversed()",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+
+        // `Array` is unknown type if tsconfig.json is not configured.
+        { filename, code: "let foo = []; foo.toReversed()" },
+        {
+            filename,
+            code: "let foo = ['foo']; foo.toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+        },
+        {
+            filename,
+            code: "function f<T extends string[]>(a: T) { a.toReversed() }",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+        },
+        {
+            filename,
+            code: "function f<T extends (string | number)[]>(a: T) { a.toReversed() }",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "['foo'].toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+        },
+        {
+            filename,
+            code: "let foo = []; foo.toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.toReversed()",
+            errors: [
+                "ES2023 'Array.prototype.toReversed' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "toReversed()" },
+            { filename, code: "foo.find(predicate)" },
+            { filename, code: "foo.toReversed()" },
+            { filename, code: "let foo = {}; foo.toReversed()" },
+            {
+                filename,
+                code: "toReversed()",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.find(predicate)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "['foo'].toReversed()",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = ['foo']; foo.toReversed()",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = []; foo.toReversed()",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends string[]>(a: T) { a.toReversed() }",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends (string | number)[]>(a: T) { a.toReversed() }",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.toReversed()",
+                errors: [
+                    "ES2023 'Array.prototype.toReversed' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+            ...[
+                "Int8Array",
+                "Uint8Array",
+                "Uint8ClampedArray",
+                "Int16Array",
+                "Uint16Array",
+                "Int32Array",
+                "Uint32Array",
+                "Float32Array",
+                "Float64Array",
+                "BigInt64Array",
+                "BigUint64Array",
+            ].map((className) => ({
+                filename,
+                code: `let foo = new ${className}(10); foo.toReversed()`,
+                errors: [
+                    `ES2023 '${className}.prototype.toReversed' method is forbidden.`,
+                ],
+            })),
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-array-prototype-tosorted.js b/tests/lib/rules/no-array-prototype-tosorted.js
new file mode 100644
index 0000000..f1200a4
--- /dev/null
+++ b/tests/lib/rules/no-array-prototype-tosorted.js
@@ -0,0 +1,195 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-array-prototype-tosorted.js")
+const ruleId = "no-array-prototype-tosorted"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "toSorted()",
+        "foo.find(predicate)",
+        "foo.toSorted()",
+        {
+            code: "toSorted()",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toSorted()",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "['foo'].toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+        },
+        {
+            code: "foo.toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toSorted()",
+            options: [{ aggressive: true }],
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "toSorted()" },
+        { filename, code: "foo.find(predicate)" },
+        { filename, code: "foo.toSorted()" },
+        { filename, code: "let foo = {}; foo.toSorted()" },
+        {
+            filename,
+            code: "toSorted()",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+
+        // `Array` is unknown type if tsconfig.json is not configured.
+        { filename, code: "let foo = []; foo.toSorted()" },
+        {
+            filename,
+            code: "let foo = ['foo']; foo.toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends string[]>(a: T) { a.toSorted() }",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends (string | number)[]>(a: T) { a.toSorted() }",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "['foo'].toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+        },
+        {
+            filename,
+            code: "let foo = []; foo.toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.toSorted()",
+            errors: ["ES2023 'Array.prototype.toSorted' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "toSorted()" },
+            { filename, code: "foo.find(predicate)" },
+            { filename, code: "foo.toSorted()" },
+            { filename, code: "let foo = {}; foo.toSorted()" },
+            {
+                filename,
+                code: "toSorted()",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.find(predicate)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "['foo'].toSorted()",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = ['foo']; foo.toSorted()",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = []; foo.toSorted()",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends string[]>(a: T) { a.toSorted() }",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends (string | number)[]>(a: T) { a.toSorted() }",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.toSorted()",
+                errors: [
+                    "ES2023 'Array.prototype.toSorted' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+            ...[
+                "Int8Array",
+                "Uint8Array",
+                "Uint8ClampedArray",
+                "Int16Array",
+                "Uint16Array",
+                "Int32Array",
+                "Uint32Array",
+                "Float32Array",
+                "Float64Array",
+                "BigInt64Array",
+                "BigUint64Array",
+            ].map((className) => ({
+                filename,
+                code: `let foo = new ${className}(10); foo.toSorted()`,
+                errors: [
+                    `ES2023 '${className}.prototype.toSorted' method is forbidden.`,
+                ],
+            })),
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-array-prototype-tospliced.js b/tests/lib/rules/no-array-prototype-tospliced.js
new file mode 100644
index 0000000..c4a5bab
--- /dev/null
+++ b/tests/lib/rules/no-array-prototype-tospliced.js
@@ -0,0 +1,176 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-array-prototype-tospliced.js")
+const ruleId = "no-array-prototype-tospliced"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "toSpliced(1, 2)",
+        "foo.find(predicate)",
+        "foo.toSpliced(1, 2)",
+        {
+            code: "toSpliced(1, 2)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toSpliced(1, 2)",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "['foo'].toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+        },
+        {
+            code: "foo.toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.toSpliced(1, 2)",
+            options: [{ aggressive: true }],
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "toSpliced(1, 2)" },
+        { filename, code: "foo.find(predicate)" },
+        { filename, code: "foo.toSpliced(1, 2)" },
+        { filename, code: "let foo = {}; foo.toSpliced(1, 2)" },
+        {
+            filename,
+            code: "toSpliced(1, 2)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+
+        // `Array` is unknown type if tsconfig.json is not configured.
+        { filename, code: "let foo = []; foo.toSpliced(1, 2)" },
+        {
+            filename,
+            code: "let foo = ['foo']; foo.toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends string[]>(a: T) { a.toSpliced(1, 2) }",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends (string | number)[]>(a: T) { a.toSpliced(1, 2) }",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "['foo'].toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+        },
+        {
+            filename,
+            code: "let foo = []; foo.toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.toSpliced(1, 2)",
+            errors: ["ES2023 'Array.prototype.toSpliced' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "toSpliced(1, 2)" },
+            { filename, code: "foo.find(predicate)" },
+            { filename, code: "foo.toSpliced(1, 2)" },
+            { filename, code: "let foo = {}; foo.toSpliced(1, 2)" },
+            {
+                filename,
+                code: "toSpliced(1, 2)",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.find(predicate)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "['foo'].toSpliced(1, 2)",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = ['foo']; foo.toSpliced(1, 2)",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "let foo = []; foo.toSpliced(1, 2)",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends string[]>(a: T) { a.toSpliced(1, 2) }",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f<T extends (string | number)[]>(a: T) { a.toSpliced(1, 2) }",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.toSpliced(1, 2)",
+                errors: [
+                    "ES2023 'Array.prototype.toSpliced' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-array-prototype-with.js b/tests/lib/rules/no-array-prototype-with.js
new file mode 100644
index 0000000..9f8e4c2
--- /dev/null
+++ b/tests/lib/rules/no-array-prototype-with.js
@@ -0,0 +1,166 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-array-prototype-with.js")
+const ruleId = "no-array-prototype-with"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "foo.find(predicate)",
+        "foo.with(index, value)",
+        {
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.with(index, value)",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "['foo'].with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+        },
+        {
+            code: "foo.with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.with(index, value)",
+            options: [{ aggressive: true }],
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "foo.find(predicate)" },
+        { filename, code: "foo.with(index, value)" },
+        { filename, code: "let foo = {}; foo.with(index, value)" },
+        {
+            filename,
+            code: "foo.find(predicate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+
+        // `Array` is unknown type if tsconfig.json is not configured.
+        { filename, code: "let foo = []; foo.with(index, value)" },
+        {
+            filename,
+            code: "let foo = ['foo']; foo.with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends string[]>(a: T) { a.with(index, value) }",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+        },
+        {
+            filename,
+            code: "function f<T extends (string | number)[]>(a: T) { a.with(index, value) }",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "['foo'].with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+        },
+        {
+            filename,
+            code: "let foo = []; foo.with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.with(index, value)",
+            errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "foo.find(predicate)" },
+            { filename, code: "foo.with(index, value)" },
+            { filename, code: "let foo = {}; foo.with(index, value)" },
+            {
+                filename,
+                code: "foo.find(predicate)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "['foo'].with(index, value)",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            },
+            {
+                filename,
+                code: "let foo = ['foo']; foo.with(index, value)",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            },
+            {
+                filename,
+                code: "let foo = []; foo.with(index, value)",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            },
+            {
+                filename,
+                code: "function f<T extends string[]>(a: T) { a.with(index, value) }",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            },
+            {
+                filename,
+                code: "function f<T extends (string | number)[]>(a: T) { a.with(index, value) }",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+            },
+            {
+                filename,
+                code: "foo.with(index, value)",
+                errors: ["ES2023 'Array.prototype.with' method is forbidden."],
+                settings: { "es-x": { aggressive: true } },
+            },
+            ...[
+                "Int8Array",
+                "Uint8Array",
+                "Uint8ClampedArray",
+                "Int16Array",
+                "Uint16Array",
+                "Int32Array",
+                "Uint32Array",
+                "Float32Array",
+                "Float64Array",
+                "BigInt64Array",
+                "BigUint64Array",
+            ].map((className) => ({
+                filename,
+                code: `let foo = new ${className}(10); foo.with(index, value)`,
+                errors: [
+                    `ES2023 '${className}.prototype.with' method is forbidden.`,
+                ],
+            })),
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-intl-datetimeformat-prototype-formatrange.js b/tests/lib/rules/no-intl-datetimeformat-prototype-formatrange.js
new file mode 100644
index 0000000..c18b820
--- /dev/null
+++ b/tests/lib/rules/no-intl-datetimeformat-prototype-formatrange.js
@@ -0,0 +1,136 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-datetimeformat-prototype-formatrange.js")
+const ruleId = "no-intl-datetimeformat-prototype-formatrange"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "formatRange(startDate, endDate)",
+        "foo.unknown(0)",
+        "foo.formatRange(startDate, endDate)",
+        {
+            code: "formatRange(startDate, endDate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.unknown(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: "foo.formatRange(startDate, endDate)",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "foo.formatRange(startDate, endDate)",
+            errors: [
+                "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.formatRange(startDate, endDate)",
+            options: [{ aggressive: true }],
+            errors: [
+                "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "formatRange(startDate, endDate)" },
+        { filename, code: "foo.unknown(0)" },
+        { filename, code: "foo.formatRange(startDate, endDate)" },
+        { filename, code: "let foo = {}; foo.formatRange(startDate, endDate)" },
+        {
+            filename,
+            code: "formatRange(startDate, endDate)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.unknown(0)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "let foo = new Unknown(); foo.formatRange(startDate, endDate)",
+            errors: [
+                "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.formatRange(startDate, endDate)",
+            errors: [
+                "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "formatRange(startDate, endDate)" },
+            { filename, code: "foo.unknown(0)" },
+            { filename, code: "foo.formatRange(startDate, endDate)" },
+            {
+                filename,
+                code: "let foo = {}; foo.formatRange(startDate, endDate)",
+            },
+            {
+                filename,
+                code: "formatRange(startDate, endDate)",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.unknown(0)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "let foo = new Intl.DateTimeFormat(); foo.formatRange(startDate, endDate)",
+                errors: [
+                    "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f(a: Intl.DateTimeFormat) { a.formatRange(startDate, endDate) }",
+                errors: [
+                    "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.formatRange(startDate, endDate)",
+                errors: [
+                    "ES2021 Intl API 'Intl.DateTimeFormat.prototype.formatRange' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js b/tests/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js
new file mode 100644
index 0000000..d01f88a
--- /dev/null
+++ b/tests/lib/rules/no-intl-datetimeformat-prototype-formattoparts.js
@@ -0,0 +1,136 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-datetimeformat-prototype-formattoparts.js")
+const ruleId = "no-intl-datetimeformat-prototype-formattoparts"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "formatToParts(now)",
+        "foo.unknown(0)",
+        "foo.formatToParts(now)",
+        {
+            code: "formatToParts(now)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.unknown(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: "foo.formatToParts(now)",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "foo.formatToParts(now)",
+            errors: [
+                "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.formatToParts(now)",
+            options: [{ aggressive: true }],
+            errors: [
+                "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "formatToParts(now)" },
+        { filename, code: "foo.unknown(0)" },
+        { filename, code: "foo.formatToParts(now)" },
+        { filename, code: "let foo = {}; foo.formatToParts(now)" },
+        {
+            filename,
+            code: "formatToParts(now)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.unknown(0)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "let foo = new Unknown(); foo.formatToParts(now)",
+            errors: [
+                "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.formatToParts(now)",
+            errors: [
+                "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "formatToParts(now)" },
+            { filename, code: "foo.unknown(0)" },
+            { filename, code: "foo.formatToParts(now)" },
+            {
+                filename,
+                code: "let foo = {}; foo.formatToParts(now)",
+            },
+            {
+                filename,
+                code: "formatToParts(now)",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.unknown(0)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "let foo = new Intl.DateTimeFormat(); foo.formatToParts(now)",
+                errors: [
+                    "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f(a: Intl.DateTimeFormat) { a.formatToParts(now) }",
+                errors: [
+                    "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.formatToParts(now)",
+                errors: [
+                    "ES2017 Intl API 'Intl.DateTimeFormat.prototype.formatToParts' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-intl-displaynames.js b/tests/lib/rules/no-intl-displaynames.js
new file mode 100644
index 0000000..3f71119
--- /dev/null
+++ b/tests/lib/rules/no-intl-displaynames.js
@@ -0,0 +1,21 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-displaynames")
+
+new RuleTester().run("no-intl-displaynames", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.DisplayNames",
+    ],
+    invalid: [
+        {
+            code: "Intl.DisplayNames",
+            errors: [
+                "ES2021 Intl API 'Intl.DisplayNames' object is forbidden.",
+            ],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-getcanonicallocales.js b/tests/lib/rules/no-intl-getcanonicallocales.js
new file mode 100644
index 0000000..4fbb5fc
--- /dev/null
+++ b/tests/lib/rules/no-intl-getcanonicallocales.js
@@ -0,0 +1,21 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-getcanonicallocales")
+
+new RuleTester().run("no-intl-getcanonicallocales", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.getCanonicalLocales",
+    ],
+    invalid: [
+        {
+            code: "Intl.getCanonicalLocales",
+            errors: [
+                "ES2016 Intl API 'Intl.getCanonicalLocales' method is forbidden.",
+            ],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-listformat.js b/tests/lib/rules/no-intl-listformat.js
new file mode 100644
index 0000000..01c2022
--- /dev/null
+++ b/tests/lib/rules/no-intl-listformat.js
@@ -0,0 +1,19 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-listformat")
+
+new RuleTester().run("no-intl-listformat", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.ListFormat",
+    ],
+    invalid: [
+        {
+            code: "Intl.ListFormat",
+            errors: ["ES2021 Intl API 'Intl.ListFormat' object is forbidden."],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-locale.js b/tests/lib/rules/no-intl-locale.js
new file mode 100644
index 0000000..d0f5da6
--- /dev/null
+++ b/tests/lib/rules/no-intl-locale.js
@@ -0,0 +1,19 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-locale")
+
+new RuleTester().run("no-intl-locale", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.Locale",
+    ],
+    invalid: [
+        {
+            code: "Intl.Locale",
+            errors: ["ES2020 Intl API 'Intl.Locale' object is forbidden."],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-numberformat-prototype-formattoparts.js b/tests/lib/rules/no-intl-numberformat-prototype-formattoparts.js
new file mode 100644
index 0000000..f07ad58
--- /dev/null
+++ b/tests/lib/rules/no-intl-numberformat-prototype-formattoparts.js
@@ -0,0 +1,136 @@
+"use strict"
+
+const path = require("path")
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-numberformat-prototype-formattoparts.js")
+const ruleId = "no-intl-numberformat-prototype-formattoparts"
+
+new RuleTester().run(ruleId, rule, {
+    valid: [
+        "formatToParts(num)",
+        "foo.unknown(0)",
+        "foo.formatToParts(num)",
+        {
+            code: "formatToParts(num)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        { code: "foo.unknown(0)", settings: { "es-x": { aggressive: true } } },
+        {
+            code: "foo.formatToParts(num)",
+            options: [{ aggressive: false }],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            code: "foo.formatToParts(num)",
+            errors: [
+                "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            code: "foo.formatToParts(num)",
+            options: [{ aggressive: true }],
+            errors: [
+                "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: false } },
+        },
+    ],
+})
+
+// -----------------------------------------------------------------------------
+// TypeScript
+// -----------------------------------------------------------------------------
+const parser = require.resolve("@typescript-eslint/parser")
+const tsconfigRootDir = path.resolve(__dirname, "../../fixtures")
+const project = "tsconfig.json"
+const filename = path.join(tsconfigRootDir, "test.ts")
+
+new RuleTester({ parser }).run(`${ruleId} TS`, rule, {
+    valid: [
+        { filename, code: "formatToParts(num)" },
+        { filename, code: "foo.unknown(0)" },
+        { filename, code: "foo.formatToParts(num)" },
+        { filename, code: "let foo = {}; foo.formatToParts(num)" },
+        {
+            filename,
+            code: "formatToParts(num)",
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.unknown(0)",
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+    invalid: [
+        {
+            filename,
+            code: "let foo = new Unknown(); foo.formatToParts(num)",
+            errors: [
+                "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+        {
+            filename,
+            code: "foo.formatToParts(num)",
+            errors: [
+                "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+            ],
+            settings: { "es-x": { aggressive: true } },
+        },
+    ],
+})
+
+new RuleTester({ parser, parserOptions: { tsconfigRootDir, project } }).run(
+    `${ruleId} TS Full Type Information`,
+    rule,
+    {
+        valid: [
+            { filename, code: "formatToParts(num)" },
+            { filename, code: "foo.unknown(0)" },
+            { filename, code: "foo.formatToParts(num)" },
+            {
+                filename,
+                code: "let foo = {}; foo.formatToParts(num)",
+            },
+            {
+                filename,
+                code: "formatToParts(num)",
+                settings: { "es-x": { aggressive: true } },
+            },
+            {
+                filename,
+                code: "foo.unknown(0)",
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+        invalid: [
+            {
+                filename,
+                code: "let foo = new Intl.NumberFormat(); foo.formatToParts(num)",
+                errors: [
+                    "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "function f(a: Intl.NumberFormat) { a.formatToParts(num) }",
+                errors: [
+                    "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+                ],
+            },
+            {
+                filename,
+                code: "foo.formatToParts(num)",
+                errors: [
+                    "ES2018 Intl API 'Intl.NumberFormat.prototype.formatToParts' method is forbidden.",
+                ],
+                settings: { "es-x": { aggressive: true } },
+            },
+        ],
+    },
+)
diff --git a/tests/lib/rules/no-intl-pluralrules.js b/tests/lib/rules/no-intl-pluralrules.js
new file mode 100644
index 0000000..9521ab0
--- /dev/null
+++ b/tests/lib/rules/no-intl-pluralrules.js
@@ -0,0 +1,19 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-pluralrules")
+
+new RuleTester().run("no-intl-pluralrules", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.PluralRules",
+    ],
+    invalid: [
+        {
+            code: "Intl.PluralRules",
+            errors: ["ES2018 Intl API 'Intl.PluralRules' object is forbidden."],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-relativetimeformat.js b/tests/lib/rules/no-intl-relativetimeformat.js
new file mode 100644
index 0000000..f6258c6
--- /dev/null
+++ b/tests/lib/rules/no-intl-relativetimeformat.js
@@ -0,0 +1,21 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-relativetimeformat")
+
+new RuleTester().run("no-intl-relativetimeformat", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.RelativeTimeFormat",
+    ],
+    invalid: [
+        {
+            code: "Intl.RelativeTimeFormat",
+            errors: [
+                "ES2020 Intl API 'Intl.RelativeTimeFormat' object is forbidden.",
+            ],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-segmenter.js b/tests/lib/rules/no-intl-segmenter.js
new file mode 100644
index 0000000..76db94d
--- /dev/null
+++ b/tests/lib/rules/no-intl-segmenter.js
@@ -0,0 +1,19 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-segmenter.js")
+
+new RuleTester().run("no-intl-segmenter", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.Segmenter",
+    ],
+    invalid: [
+        {
+            code: "Intl.Segmenter",
+            errors: ["ES2022 Intl API 'Intl.Segmenter' object is forbidden."],
+        },
+    ],
+})
diff --git a/tests/lib/rules/no-intl-supportedvaluesof.js b/tests/lib/rules/no-intl-supportedvaluesof.js
new file mode 100644
index 0000000..ff91cbc
--- /dev/null
+++ b/tests/lib/rules/no-intl-supportedvaluesof.js
@@ -0,0 +1,21 @@
+"use strict"
+
+const RuleTester = require("../../tester")
+const rule = require("../../../lib/rules/no-intl-supportedvaluesof.js")
+
+new RuleTester().run("no-intl-supportedvaluesof", rule, {
+    valid: [
+        "Intl",
+        "Intl.DateTimeFormat",
+        "Intl.NumberFormat",
+        "let Intl = 0; Intl.supportedValuesOf",
+    ],
+    invalid: [
+        {
+            code: "Intl.supportedValuesOf",
+            errors: [
+                "ES2022 Intl API 'Intl.supportedValuesOf' method is forbidden.",
+            ],
+        },
+    ],
+})