Repository: eslint-stylistic/eslint-stylistic
Pull request #804 (2025-05-30 01:38:40)

feat: add support for `using`
<!-- DO NOT IGNORE THE TEMPLATE!

Thank you for contributing!

Before submitting the PR, please make sure you do the following:

- Read the [Contributing Guide](https://eslint.style/contribute/guide).
- Check that there isn't already a PR that solves the problem the same way to avoid creating a duplicate.
- Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`).
- Ideally, include relevant tests that fail without this PR but pass with it.

-->

### Description

This PR adds support for `using` and `await using` declarations by changing `keyword-spacing` rule and `padding-line-between-statements` rule.

It also adds new options to each rule.

### Linked Issues

### Additional context

This PR is a draft because estree doesn't support it yet.


pkg-pr-new[bot]: 
[Open in StackBlitz](https://pkg.pr.new/template/f631931e-a22b-4a52-a232-a1c3ae920e6c)


```
npm i https://pkg.pr.new/@stylistic/eslint-plugin@804
```


```
npm i https://pkg.pr.new/@eslint-stylistic/metadata@804
```


_commit: <a href="https://github.com/eslint-stylistic/eslint-stylistic/runs/44392561312"><code>e0a557d</code></a>_

codecov[bot]: ## [Bundle](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?dropdown=bundle) Report

Changes will increase total bundle size by 800 bytes (0.11%) :arrow_up:. This is within the [configured](https://docs.codecov.com/docs/javascript-bundle-analysis#main-features) threshold :white_check_mark:

<details><summary>Detailed changes</summary>

| Bundle name | Size | Change |
| ----------- | ---- | ------ |
| @stylistic/eslint-plugin-esm | 716.12kB | 800 bytes (0.11%) :arrow_up: |

</details>

### Affected Assets, Files, and Routes:

<details>
<summary>view changes for bundle: @stylistic/eslint-plugin-esm</summary>

#### **Assets Changed:**
| Asset Name | Size Change | Total Size | Change (%) |
| ---------- | ----------- | ---------- | ---------- |
| ```rules/padding-line-between-statements.js``` | 507 bytes | 16.53kB | 3.16%  |
| ```rules/keyword-spacing.js``` | 293 bytes | 15.31kB | 1.95%  |


**Files in** **```rules/padding-line-between-statements.js```**:

- ```./rules/padding-line-between-statements/padding-line-between-statements.ts``` → Total Size: **16.14kB**



**Files in** **```rules/keyword-spacing.js```**:

- ```./rules/keyword-spacing/keyword-spacing.ts``` → Total Size: **14.92kB**





</details>

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic) Report
Attention: Patch coverage is `90.62500%` with `3 lines` in your changes missing coverage. Please review.
> Project coverage is 99.66%. Comparing base [(`7c68386`)](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/commit/7c6838697c91e23214d6a47bb61d091d0a355b33?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic) to head [(`bdd3ea3`)](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/commit/bdd3ea351312322e4188a3fd1065b90a7bd8ecaa?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic).

| [Files with missing lines](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic) | Patch % | Lines |
|---|---|---|
| [...nt-plugin/rules/keyword-spacing/keyword-spacing.ts](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?src=pr&el=tree&filepath=packages%2Feslint-plugin%2Frules%2Fkeyword-spacing%2Fkeyword-spacing.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic#diff-cGFja2FnZXMvZXNsaW50LXBsdWdpbi9ydWxlcy9rZXl3b3JkLXNwYWNpbmcva2V5d29yZC1zcGFjaW5nLnRz) | 83.33% | [3 Missing :warning: ](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic) |

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #804      +/-   ##
==========================================
- Coverage   99.68%   99.66%   -0.02%     
==========================================
  Files          95       95              
  Lines       18070    18099      +29     
  Branches     4666     4680      +14     
==========================================
+ Hits        18013    18039      +26     
- Misses         57       60       +3     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/eslint-stylistic/eslint-stylistic/pull/804?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=eslint-stylistic).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
9romise: I've added support for `indent` as well. 💚

Patch:
diff --git a/packages/eslint-plugin/rules/indent/README.md b/packages/eslint-plugin/rules/indent/README.md
index 686bb010..3441e3cd 100644
--- a/packages/eslint-plugin/rules/indent/README.md
+++ b/packages/eslint-plugin/rules/indent/README.md
@@ -110,7 +110,7 @@ Level of indentation denotes the multiple of the indent specified. Example:
 
 - Indent of 4 spaces with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 8 spaces.
 - Indent of 2 spaces with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 4 spaces.
-- Indent of 2 spaces with `VariableDeclarator` set to `{"var": 2, "let": 2, "const": 3}` will indent the multi-line variable declarations with 4 spaces for `var` and `let`, 6 spaces for `const` statements.
+- Indent of 2 spaces with `VariableDeclarator` set to `{"var": 2, "let": 2, "const": 3, "using": 3}` will indent the multi-line variable declarations with 4 spaces for `var` and `let`, 6 spaces for `const`, `using` and `await using` statements.
 - Indent of tab with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 2 tabs.
 - Indent of 2 spaces with `SwitchCase` set to `0` will not indent `case` clauses with respect to `switch` statements.
 - Indent of 2 spaces with `SwitchCase` set to `1` will indent `case` clauses with 2 spaces with respect to `switch` statements.
@@ -256,6 +256,12 @@ let d,
 const g = 1,
     h = 2,
     i = 3;
+using j = foo(),
+    k = bar(),
+    l = baz();
+await using j = foo(),
+    k = bar(),
+    l = baz();
 ```
 
 :::
@@ -276,6 +282,12 @@ let d,
 const g = 1,
   h = 2,
   i = 3;
+using j = foo(),
+  k = bar(),
+  l = baz();
+await using j = foo(),
+  k = bar(),
+  l = baz();
 ```
 
 :::
@@ -296,6 +308,12 @@ let d,
 const g = 1,
     h = 2,
     i = 3;
+using j = foo(),
+    k = bar(),
+    l = baz();
+await using j = foo(),
+    k = bar(),
+    l = baz();
 ```
 
 :::
@@ -316,6 +334,12 @@ let d,
 const g = 1,
   h = 2,
   i = 3;
+using j = foo(),
+  k = bar(),
+  l = baz();
+await using j = foo(),
+  k = bar(),
+  l = baz();
 ```
 
 :::
@@ -336,16 +360,22 @@ let d,
 const g = 1,
       h = 2,
       i = 3;
+using j = foo(),
+      k = bar(),
+      l = baz();
+await using j = foo(),
+            k = bar(),
+            l = baz();
 ```
 
 :::
 
-Examples of **correct** code for this rule with the `2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }` options:
+Examples of **correct** code for this rule with the `2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3, "using": "first" } }` options:
 
 ::: correct
 
 ```js
-/* eslint @stylistic/indent: ["error", 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }] */
+/* eslint @stylistic/indent: ["error", 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3, "using": "first" } }] */
 
 var a,
     b,
@@ -356,6 +386,12 @@ let d,
 const g = 1,
       h = 2,
       i = 3;
+using j = foo(),
+      k = bar(),
+      l = baz();
+await using j = foo(),
+            k = bar(),
+            l = baz();
 ```
 
 :::
diff --git a/packages/eslint-plugin/rules/indent/indent.ts b/packages/eslint-plugin/rules/indent/indent.ts
index c154bb38..fe457065 100644
--- a/packages/eslint-plugin/rules/indent/indent.ts
+++ b/packages/eslint-plugin/rules/indent/indent.ts
@@ -578,6 +578,7 @@ export default createRule<RuleOptions, MessageIds>({
                   var: ELEMENT_LIST_SCHEMA,
                   let: ELEMENT_LIST_SCHEMA,
                   const: ELEMENT_LIST_SCHEMA,
+                  using: ELEMENT_LIST_SCHEMA,
                 },
                 additionalProperties: false,
               },
@@ -711,6 +712,7 @@ export default createRule<RuleOptions, MessageIds>({
         var: DEFAULT_VARIABLE_INDENT as number | 'first',
         let: DEFAULT_VARIABLE_INDENT as number | 'first',
         const: DEFAULT_VARIABLE_INDENT as number | 'first',
+        using: DEFAULT_VARIABLE_INDENT as number | 'first',
       },
       outerIIFEBody: 1,
       FunctionDeclaration: {
@@ -758,6 +760,7 @@ export default createRule<RuleOptions, MessageIds>({
             var: userOptions.VariableDeclarator,
             let: userOptions.VariableDeclarator,
             const: userOptions.VariableDeclarator,
+            using: userOptions.VariableDeclarator,
           }
         }
       }
@@ -1749,14 +1752,15 @@ export default createRule<RuleOptions, MessageIds>({
         if (node.declarations.length === 0)
           return
 
-        let variableIndent = Object.prototype.hasOwnProperty.call(options.VariableDeclarator, node.kind)
-          ? options.VariableDeclarator[node.kind as keyof typeof options.VariableDeclarator]
+        const kind = node.kind === 'await using' ? 'using' : node.kind
+        let variableIndent = Object.prototype.hasOwnProperty.call(options.VariableDeclarator, kind)
+          ? options.VariableDeclarator[kind]
           : DEFAULT_VARIABLE_INDENT
 
         const firstToken = sourceCode.getFirstToken(node)!
         const lastToken = sourceCode.getLastToken(node)!
 
-        if (options.VariableDeclarator[node.kind as keyof typeof options.VariableDeclarator] === 'first') {
+        if (options.VariableDeclarator[kind] === 'first') {
           if (node.declarations.length > 1) {
             addElementListIndent(
               node.declarations,
diff --git a/packages/eslint-plugin/rules/indent/types.d.ts b/packages/eslint-plugin/rules/indent/types.d.ts
index 6b83c1b8..f00e155a 100644
--- a/packages/eslint-plugin/rules/indent/types.d.ts
+++ b/packages/eslint-plugin/rules/indent/types.d.ts
@@ -1,6 +1,6 @@
 /* GENERATED, DO NOT EDIT DIRECTLY */
 
-/* @checksum: D7D9ke3d40qr6hi89XWsahsr6YW8HCiN2-GNt5pD-lA */
+/* @checksum: OXKn3_mfEuRvCVJ6qv5__ZiBZDQpamanEmwuqMCGavo */
 
 export type IndentSchema0 = 'tab' | number
 
@@ -12,6 +12,7 @@ export interface IndentSchema1 {
       var?: number | ('first' | 'off')
       let?: number | ('first' | 'off')
       const?: number | ('first' | 'off')
+      using?: number | ('first' | 'off')
     }
   outerIIFEBody?: number | 'off'
   MemberExpression?: number | 'off'
diff --git a/packages/eslint-plugin/rules/keyword-spacing/README.md b/packages/eslint-plugin/rules/keyword-spacing/README.md
index b3eef220..f719a776 100644
--- a/packages/eslint-plugin/rules/keyword-spacing/README.md
+++ b/packages/eslint-plugin/rules/keyword-spacing/README.md
@@ -29,7 +29,7 @@ However, if you want to enforce the style of following spacing cases, please ref
 
 ## Rule Details
 
-This rule enforces consistent spacing around keywords and keyword-like tokens: `as` (in module declarations), `async` (of async functions), `await` (of await expressions), `break`, `case`, `catch`, `class`, `const`, `continue`, `debugger`, `default`, `delete`, `do`, `else`, `export`, `extends`, `finally`, `for`, `from` (in module declarations), `function`, `get` (of getters), `if`, `import`, `in` (in for-in statements), `let`, `new`, `of` (in for-of statements), `return`, `set` (of setters), `static`, `super`, `switch`, `this`, `throw`, `try`, `typeof`, `var`, `void`, `while`, `with`, and `yield`. This rule is designed carefully not to conflict with other spacing rules: it does not apply to spacing where other rules report problems.
+This rule enforces consistent spacing around keywords and keyword-like tokens: `as` (in module declarations), `async` (of async functions), `await` (of await expressions), `break`, `case`, `catch`, `class`, `const`, `continue`, `debugger`, `default`, `delete`, `do`, `else`, `export`, `extends`, `finally`, `for`, `from` (in module declarations), `function`, `get` (of getters), `if`, `import`, `in` (in for-in statements), `let`, `new`, `of` (in for-of statements), `return`, `set` (of setters), `static`, `super`, `switch`, `this`, `throw`, `try`, `typeof`, `using`, `var`, `void`, `while`, `with`, and `yield`. This rule is designed carefully not to conflict with other spacing rules: it does not apply to spacing where other rules report problems.
 
 ## Options
 
diff --git a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing.ts b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing.ts
index 8589f639..22fb8a9d 100644
--- a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing.ts
+++ b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing.ts
@@ -11,7 +11,7 @@ const NEXT_TOKEN_M = /^[{*]$/u
 const TEMPLATE_OPEN_PAREN = /\$\{$/u
 const TEMPLATE_CLOSE_PAREN = /^\}/u
 const CHECK_TYPE = /^(?:JSXElement|RegularExpression|String|Template|PrivateIdentifier)$/u
-const KEYS = KEYWORDS_JS.concat(['as', 'async', 'await', 'from', 'get', 'let', 'of', 'satisfies', 'set', 'yield', 'type'])
+const KEYS = KEYWORDS_JS.concat(['as', 'async', 'await', 'from', 'get', 'let', 'of', 'satisfies', 'set', 'using', 'yield', 'type'])
 
 export default createRule<RuleOptions, MessageIds>({
   name: 'keyword-spacing',
@@ -269,8 +269,28 @@ export default createRule<RuleOptions, MessageIds>({
     function checkSpacingAroundFirstToken(node: ASTNode | null) {
       const firstToken = node && sourceCode.getFirstToken(node)
 
-      if (isKeywordToken(firstToken))
-        checkSpacingAround(firstToken)
+      if (!firstToken)
+        return
+
+      if (!isKeywordToken(firstToken)) {
+        // If the first token is not a keyword,
+        // the node is checked to see if it needs to be validated.
+        if (node.type === 'VariableDeclaration') {
+          if (
+            node.kind !== 'using'
+            && node.kind !== 'await using'
+            || firstToken.type !== 'Identifier'
+          ) {
+            /* c8 ignore next 2 */ // Currently, there is no syntax to reach this branch.
+            return
+          }
+        }
+        else {
+          return
+        }
+      }
+
+      checkSpacingAround(firstToken)
     }
 
     /**
diff --git a/packages/eslint-plugin/rules/keyword-spacing/types.d.ts b/packages/eslint-plugin/rules/keyword-spacing/types.d.ts
index 216be49f..4ead5017 100644
--- a/packages/eslint-plugin/rules/keyword-spacing/types.d.ts
+++ b/packages/eslint-plugin/rules/keyword-spacing/types.d.ts
@@ -1,6 +1,6 @@
 /* GENERATED, DO NOT EDIT DIRECTLY */
 
-/* @checksum: 6RaHSpkd0xngnBtv0uggStdq40cIo2NW9uru1q_OApM */
+/* @checksum: wWxki7ccOpBnj09gE5yZtjLJYgetIBdjG4m_OEhzxE0 */
 
 export interface KeywordSpacingSchema0 {
   before?: boolean
@@ -278,6 +278,10 @@ export interface KeywordSpacingSchema0 {
       before?: boolean
       after?: boolean
     }
+    using?: {
+      before?: boolean
+      after?: boolean
+    }
     yield?: {
       before?: boolean
       after?: boolean
diff --git a/packages/eslint-plugin/rules/padding-line-between-statements/README.md b/packages/eslint-plugin/rules/padding-line-between-statements/README.md
index 92ac3290..8c77b86b 100644
--- a/packages/eslint-plugin/rules/padding-line-between-statements/README.md
+++ b/packages/eslint-plugin/rules/padding-line-between-statements/README.md
@@ -78,15 +78,18 @@ You can supply any number of configurations. If a statement pair matches multipl
   - `"multiline-export"` is multiline `export` declarations.
   - `"multiline-expression"` is expression statements. This is the same as `expression` type, but only if the statement is multiline.
   - `"multiline-let"` is multiline `let` variable declarations.
+  - `"multiline-using"` is multiline `using` and `await using` variable declarations.
   - `"multiline-var"` is multiline `var` variable declarations.
   - `"return"` is `return` statements.
   - `"singleline-const"` is single-line `const` variable declarations.
   - `"singleline-export"` is single-line `export` declarations.
   - `"singleline-let"` is single-line `let` variable declarations.
+  - `"singleline-using"` is single-line `using` and `await using` variable declarations.
   - `"singleline-var"` is single-line `var` variable declarations.
   - `"switch"` is `switch` statements.
   - `"throw"` is `throw` statements.
   - `"try"` is `try` statements.
+  - `"using"` is `using` and `await using` variable declarations, both single-line and multiline.
   - `"var"` is `var` variable declarations, both single-line and multiline.
   - `"while"` is `while` loop statements.
   - `"with"` is `with` statements.
diff --git a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements.ts b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements.ts
index 05904acc..693e3716 100644
--- a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements.ts
+++ b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements.ts
@@ -512,10 +512,20 @@ const StatementTypes: Record<string, NodeTestObject> = {
   'multiline-const': newMultilineKeywordTester('const'),
   'multiline-export': newMultilineKeywordTester('export'),
   'multiline-let': newMultilineKeywordTester('let'),
+  'multiline-using': {
+    test: node => node.loc.start.line !== node.loc.end.line
+      && node.type === 'VariableDeclaration'
+      && (node.kind === 'using' || node.kind === 'await using'),
+  },
   'multiline-var': newMultilineKeywordTester('var'),
   'singleline-const': newSinglelineKeywordTester('const'),
   'singleline-export': newSinglelineKeywordTester('export'),
   'singleline-let': newSinglelineKeywordTester('let'),
+  'singleline-using': {
+    test: node => node.loc.start.line === node.loc.end.line
+      && node.type === 'VariableDeclaration'
+      && (node.kind === 'using' || node.kind === 'await using'),
+  },
   'singleline-var': newSinglelineKeywordTester('var'),
 
   'block': newNodeTypeTester(AST_NODE_TYPES.BlockStatement),
@@ -557,6 +567,10 @@ const StatementTypes: Record<string, NodeTestObject> = {
   'switch': newKeywordTester(AST_NODE_TYPES.SwitchStatement, 'switch'),
   'throw': newKeywordTester(AST_NODE_TYPES.ThrowStatement, 'throw'),
   'try': newKeywordTester(AST_NODE_TYPES.TryStatement, 'try'),
+  'using': {
+    test: node => node.type === 'VariableDeclaration'
+      && (node.kind === 'using' || node.kind === 'await using'),
+  },
   'var': newKeywordTester(AST_NODE_TYPES.VariableDeclaration, 'var'),
   'while': newKeywordTester(
     [AST_NODE_TYPES.WhileStatement, AST_NODE_TYPES.DoWhileStatement],
diff --git a/packages/eslint-plugin/rules/padding-line-between-statements/types.d.ts b/packages/eslint-plugin/rules/padding-line-between-statements/types.d.ts
index f7c542db..7a6f4aa8 100644
--- a/packages/eslint-plugin/rules/padding-line-between-statements/types.d.ts
+++ b/packages/eslint-plugin/rules/padding-line-between-statements/types.d.ts
@@ -1,6 +1,6 @@
 /* GENERATED, DO NOT EDIT DIRECTLY */
 
-/* @checksum: AKQtfWxdY7gvpdU0PyMcX1vT36R3UbWHr_wa7Bygdz0 */
+/* @checksum: Y-p3R6TSzYoUsNe9UG-PebVoUrUtTrEqpZgWDf7d9x4 */
 
 export type PaddingType = 'any' | 'never' | 'always'
 export type StatementType
@@ -17,10 +17,12 @@ export type StatementType
     | 'multiline-const'
     | 'multiline-export'
     | 'multiline-let'
+    | 'multiline-using'
     | 'multiline-var'
     | 'singleline-const'
     | 'singleline-export'
     | 'singleline-let'
+    | 'singleline-using'
     | 'singleline-var'
     | 'block'
     | 'empty'
@@ -43,6 +45,7 @@ export type StatementType
     | 'switch'
     | 'throw'
     | 'try'
+    | 'using'
     | 'var'
     | 'while'
     | 'with'
@@ -67,10 +70,12 @@ export type StatementType
         | 'multiline-const'
         | 'multiline-export'
         | 'multiline-let'
+        | 'multiline-using'
         | 'multiline-var'
         | 'singleline-const'
         | 'singleline-export'
         | 'singleline-let'
+        | 'singleline-using'
         | 'singleline-var'
         | 'block'
         | 'empty'
@@ -93,6 +98,7 @@ export type StatementType
         | 'switch'
         | 'throw'
         | 'try'
+        | 'using'
         | 'var'
         | 'while'
         | 'with'
@@ -116,10 +122,12 @@ export type StatementType
         | 'multiline-const'
         | 'multiline-export'
         | 'multiline-let'
+        | 'multiline-using'
         | 'multiline-var'
         | 'singleline-const'
         | 'singleline-export'
         | 'singleline-let'
+        | 'singleline-using'
         | 'singleline-var'
         | 'block'
         | 'empty'
@@ -142,6 +150,7 @@ export type StatementType
         | 'switch'
         | 'throw'
         | 'try'
+        | 'using'
         | 'var'
         | 'while'
         | 'with'
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d8827e77..ee6d5aa7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -64,8 +64,8 @@ catalogs:
       specifier: ^5.0.0
       version: 5.0.0
     eslint:
-      specifier: ^9.27.0
-      version: 9.28.0
+      specifier: ^9.29.0
+      version: 9.29.0
     eslint-plugin-format:
       specifier: ^1.0.1
       version: 1.0.1
@@ -222,7 +222,7 @@ importers:
     devDependencies:
       '@antfu/eslint-config':
         specifier: 'catalog:'
-        version: 4.14.1(@vue/compiler-sfc@3.5.16)(eslint-plugin-format@1.0.1(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
+        version: 4.14.1(@vue/compiler-sfc@3.5.16)(eslint-plugin-format@1.0.1(eslint@9.29.0(jiti@2.4.2)))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
       '@antfu/eslint-define-config':
         specifier: 'catalog:'
         version: 1.23.0-2
@@ -231,7 +231,7 @@ importers:
         version: 9.2.0
       '@babel/eslint-parser':
         specifier: catalog:test
-        version: 7.27.5(@babel/core@7.27.4)(eslint@9.28.0(jiti@2.4.2))
+        version: 7.27.5(@babel/core@7.27.4)(eslint@9.29.0(jiti@2.4.2))
       '@babel/plugin-syntax-decorators':
         specifier: catalog:test
         version: 7.27.1(@babel/core@7.27.4)
@@ -279,13 +279,13 @@ importers:
         version: 7.7.0
       '@typescript-eslint/parser':
         specifier: 'catalog:'
-        version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+        version: 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       '@typescript-eslint/types':
         specifier: 'catalog:'
         version: 8.33.1
       '@typescript-eslint/utils':
         specifier: 'catalog:'
-        version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+        version: 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       '@vitest/coverage-v8':
         specifier: catalog:test
         version: 3.2.2(vitest@3.2.2)
@@ -300,16 +300,16 @@ importers:
         version: 5.0.0
       eslint:
         specifier: 'catalog:'
-        version: 9.28.0(jiti@2.4.2)
+        version: 9.29.0(jiti@2.4.2)
       eslint-plugin-format:
         specifier: 'catalog:'
-        version: 1.0.1(eslint@9.28.0(jiti@2.4.2))
+        version: 1.0.1(eslint@9.29.0(jiti@2.4.2))
       eslint-visitor-keys:
         specifier: 'catalog:'
         version: 4.2.0
       eslint-vitest-rule-tester:
         specifier: catalog:test
-        version: 2.2.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
+        version: 2.2.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
       espree:
         specifier: 'catalog:'
         version: 10.3.0
@@ -390,7 +390,7 @@ importers:
         version: 3.5.16(typescript@5.8.3)
       vue-eslint-parser:
         specifier: catalog:test
-        version: 10.1.3(eslint@9.28.0(jiti@2.4.2))
+        version: 10.1.3(eslint@9.29.0(jiti@2.4.2))
       vue-tsc:
         specifier: ^2.2.10
         version: 2.2.10(typescript@5.8.3)
@@ -433,7 +433,7 @@ importers:
         version: 0.3.1(typescript@5.8.3)
       twoslash-eslint:
         specifier: ^0.3.1
-        version: 0.3.1(eslint@9.28.0(jiti@2.4.2))
+        version: 0.3.1(eslint@9.29.0(jiti@2.4.2))
       unocss:
         specifier: catalog:docs
         version: 66.1.3(postcss@8.5.4)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
@@ -1007,6 +1007,10 @@ packages:
     resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@eslint/config-array@0.20.1':
+    resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/config-helpers@0.2.2':
     resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1027,6 +1031,10 @@ packages:
     resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@eslint/js@9.29.0':
+    resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/markdown@6.5.0':
     resolution: {integrity: sha512-oSkF0p8X21vKEEAGTZASi7q3tbdTvlGduQ02Xz2A1AFncUP4RLVcNz27XurxVW4fs1JXuh0xBtvokXdtp/nN+Q==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1849,6 +1857,11 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
+  acorn@8.15.0:
+    resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
   ajv@6.12.6:
     resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
 
@@ -2391,6 +2404,10 @@ packages:
     resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  eslint-scope@8.4.0:
+    resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   eslint-visitor-keys@2.1.0:
     resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
     engines: {node: '>=10'}
@@ -2403,6 +2420,10 @@ packages:
     resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  eslint-visitor-keys@4.2.1:
+    resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   eslint-vitest-rule-tester@2.2.0:
     resolution: {integrity: sha512-4qnX3piKH1a41zBFHE2fQUKZI2/yhhpqJyEOTDGwP1jZ1tkcwvkXbtYNDcTY3YmirqqlNPAWw0UvIPW1rcEtLw==}
     peerDependencies:
@@ -2419,10 +2440,24 @@ packages:
       jiti:
         optional: true
 
+  eslint@9.29.0:
+    resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
   espree@10.3.0:
     resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  espree@10.4.0:
+    resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   espree@9.6.1:
     resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -4297,46 +4332,46 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
 
-  '@antfu/eslint-config@4.14.1(@vue/compiler-sfc@3.5.16)(eslint-plugin-format@1.0.1(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)':
+  '@antfu/eslint-config@4.14.1(@vue/compiler-sfc@3.5.16)(eslint-plugin-format@1.0.1(eslint@9.29.0(jiti@2.4.2)))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)':
     dependencies:
       '@antfu/install-pkg': 1.1.0
       '@clack/prompts': 0.11.0
-      '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.28.0(jiti@2.4.2))
+      '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.29.0(jiti@2.4.2))
       '@eslint/markdown': 6.5.0
-      '@stylistic/eslint-plugin': 5.0.0-beta.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
+      '@stylistic/eslint-plugin': 5.0.0-beta.3(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@vitest/eslint-plugin': 1.2.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)
       ansis: 4.1.0
       cac: 6.7.14
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-config-flat-gitignore: 2.1.0(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-config-flat-gitignore: 2.1.0(eslint@9.29.0(jiti@2.4.2))
       eslint-flat-config-utils: 2.1.0
-      eslint-merge-processors: 2.0.0(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-antfu: 3.1.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-command: 3.2.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-jsdoc: 50.7.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-jsonc: 2.20.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-n: 17.19.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint-merge-processors: 2.0.0(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-antfu: 3.1.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-command: 3.2.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-jsdoc: 50.7.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-jsonc: 2.20.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-n: 17.19.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       eslint-plugin-no-only-tests: 3.3.0
-      eslint-plugin-perfectionist: 4.14.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint-plugin-pnpm: 0.3.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-regexp: 2.8.0(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-toml: 0.12.0(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-unicorn: 59.0.1(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))
-      eslint-plugin-vue: 10.2.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)))
-      eslint-plugin-yml: 1.18.0(eslint@9.28.0(jiti@2.4.2))
-      eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))
+      eslint-plugin-perfectionist: 4.14.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint-plugin-pnpm: 0.3.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-regexp: 2.8.0(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-toml: 0.12.0(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-unicorn: 59.0.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-vue: 10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2)))
+      eslint-plugin-yml: 1.18.0(eslint@9.29.0(jiti@2.4.2))
+      eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.16)(eslint@9.29.0(jiti@2.4.2))
       globals: 16.2.0
       jsonc-eslint-parser: 2.4.0
       local-pkg: 1.1.1
       parse-gitignore: 2.0.0
       toml-eslint-parser: 0.10.0
-      vue-eslint-parser: 10.1.3(eslint@9.28.0(jiti@2.4.2))
+      vue-eslint-parser: 10.1.3(eslint@9.29.0(jiti@2.4.2))
       yaml-eslint-parser: 1.3.0
     optionalDependencies:
-      eslint-plugin-format: 1.0.1(eslint@9.28.0(jiti@2.4.2))
+      eslint-plugin-format: 1.0.1(eslint@9.29.0(jiti@2.4.2))
     transitivePeerDependencies:
       - '@eslint/json'
       - '@vue/compiler-sfc'
@@ -4396,11 +4431,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.28.0(jiti@2.4.2))':
+  '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.29.0(jiti@2.4.2))':
     dependencies:
       '@babel/core': 7.27.4
       '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       eslint-visitor-keys: 2.1.0
       semver: 6.3.1
 
@@ -4682,10 +4717,10 @@ snapshots:
   '@esbuild/win32-x64@0.25.5':
     optional: true
 
-  '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.28.0(jiti@2.4.2))':
+  '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.29.0(jiti@2.4.2))':
     dependencies:
       escape-string-regexp: 4.0.0
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       ignore: 5.3.2
 
   '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))':
@@ -4693,11 +4728,16 @@ snapshots:
       eslint: 9.28.0(jiti@2.4.2)
       eslint-visitor-keys: 3.4.3
 
+  '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.4.2))':
+    dependencies:
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-visitor-keys: 3.4.3
+
   '@eslint-community/regexpp@4.12.1': {}
 
-  '@eslint/compat@1.2.9(eslint@9.28.0(jiti@2.4.2))':
+  '@eslint/compat@1.2.9(eslint@9.29.0(jiti@2.4.2))':
     optionalDependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
 
   '@eslint/config-array@0.20.0':
     dependencies:
@@ -4707,6 +4747,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@eslint/config-array@0.20.1':
+    dependencies:
+      '@eslint/object-schema': 2.1.6
+      debug: 4.4.1
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
   '@eslint/config-helpers@0.2.2': {}
 
   '@eslint/core@0.13.0':
@@ -4733,6 +4781,8 @@ snapshots:
 
   '@eslint/js@9.28.0': {}
 
+  '@eslint/js@9.29.0': {}
+
   '@eslint/markdown@6.5.0':
     dependencies:
       '@eslint/core': 0.14.0
@@ -5138,11 +5188,11 @@ snapshots:
 
   '@sindresorhus/merge-streams@4.0.0': {}
 
-  '@stylistic/eslint-plugin@5.0.0-beta.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@stylistic/eslint-plugin@5.0.0-beta.3(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-visitor-keys: 4.2.0
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-visitor-keys: 4.2.1
       espree: 10.3.0
       estraverse: 5.3.0
       picomatch: 4.0.2
@@ -5223,15 +5273,15 @@ snapshots:
 
   '@types/web-bluetooth@0.0.21': {}
 
-  '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       '@typescript-eslint/scope-manager': 8.33.1
-      '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/type-utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       '@typescript-eslint/visitor-keys': 8.33.1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       graphemer: 1.4.0
       ignore: 7.0.5
       natural-compare: 1.4.0
@@ -5240,14 +5290,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/scope-manager': 8.33.1
       '@typescript-eslint/types': 8.33.1
       '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
       '@typescript-eslint/visitor-keys': 8.33.1
       debug: 4.4.1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
@@ -5270,12 +5320,12 @@ snapshots:
     dependencies:
       typescript: 5.8.3
 
-  '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/type-utils@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
       '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       debug: 4.4.1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       ts-api-utils: 2.1.0(typescript@5.8.3)
       typescript: 5.8.3
     transitivePeerDependencies:
@@ -5299,13 +5349,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/utils@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
       '@typescript-eslint/scope-manager': 8.33.1
       '@typescript-eslint/types': 8.33.1
       '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
@@ -5313,7 +5363,7 @@ snapshots:
   '@typescript-eslint/visitor-keys@8.33.1':
     dependencies:
       '@typescript-eslint/types': 8.33.1
-      eslint-visitor-keys: 4.2.0
+      eslint-visitor-keys: 4.2.1
 
   '@typescript/vfs@1.6.1(typescript@5.8.3)':
     dependencies:
@@ -5500,10 +5550,10 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)':
+  '@vitest/eslint-plugin@1.2.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2)':
     dependencies:
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint: 9.28.0(jiti@2.4.2)
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint: 9.29.0(jiti@2.4.2)
     optionalDependencies:
       typescript: 5.8.3
       vitest: 3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/ui@3.2.2)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)
@@ -5723,8 +5773,14 @@ snapshots:
     dependencies:
       acorn: 8.14.1
 
+  acorn-jsx@5.3.2(acorn@8.15.0):
+    dependencies:
+      acorn: 8.15.0
+
   acorn@8.14.1: {}
 
+  acorn@8.15.0: {}
+
   ajv@6.12.6:
     dependencies:
       fast-deep-equal: 3.1.3
@@ -6132,77 +6188,77 @@ snapshots:
 
   escape-string-regexp@5.0.0: {}
 
-  eslint-compat-utils@0.5.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-compat-utils@0.5.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       semver: 7.7.2
 
-  eslint-compat-utils@0.6.5(eslint@9.28.0(jiti@2.4.2)):
+  eslint-compat-utils@0.6.5(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       semver: 7.7.2
 
-  eslint-config-flat-gitignore@2.1.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-config-flat-gitignore@2.1.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      '@eslint/compat': 1.2.9(eslint@9.28.0(jiti@2.4.2))
-      eslint: 9.28.0(jiti@2.4.2)
+      '@eslint/compat': 1.2.9(eslint@9.29.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
 
   eslint-flat-config-utils@2.1.0:
     dependencies:
       pathe: 2.0.3
 
-  eslint-formatting-reporter@0.0.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-formatting-reporter@0.0.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       prettier-linter-helpers: 1.0.0
 
-  eslint-json-compat-utils@0.2.1(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
+  eslint-json-compat-utils@0.2.1(eslint@9.29.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       esquery: 1.6.0
       jsonc-eslint-parser: 2.4.0
 
-  eslint-merge-processors@2.0.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-merge-processors@2.0.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
 
   eslint-parser-plain@0.1.1: {}
 
-  eslint-plugin-antfu@3.1.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-antfu@3.1.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
 
-  eslint-plugin-command@3.2.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-command@3.2.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@es-joy/jsdoccomment': 0.50.2
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
 
-  eslint-plugin-es-x@7.8.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-es-x@7.8.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
       '@eslint-community/regexpp': 4.12.1
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-compat-utils: 0.5.1(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-compat-utils: 0.5.1(eslint@9.29.0(jiti@2.4.2))
 
-  eslint-plugin-format@1.0.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-format@1.0.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@dprint/formatter': 0.3.0
       '@dprint/markdown': 0.17.8
       '@dprint/toml': 0.6.4
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-formatting-reporter: 0.0.0(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-formatting-reporter: 0.0.0(eslint@9.29.0(jiti@2.4.2))
       eslint-parser-plain: 0.1.1
       prettier: 3.5.3
       synckit: 0.9.3
 
-  eslint-plugin-jsdoc@50.7.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-jsdoc@50.7.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@es-joy/jsdoccomment': 0.50.2
       are-docs-informative: 0.0.2
       comment-parser: 1.4.1
       debug: 4.4.1
       escape-string-regexp: 4.0.0
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       espree: 10.3.0
       esquery: 1.6.0
       parse-imports-exports: 0.2.4
@@ -6211,12 +6267,12 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-jsonc@2.20.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-jsonc@2.20.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-compat-utils: 0.6.5(eslint@9.28.0(jiti@2.4.2))
-      eslint-json-compat-utils: 0.2.1(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-compat-utils: 0.6.5(eslint@9.29.0(jiti@2.4.2))
+      eslint-json-compat-utils: 0.2.1(eslint@9.29.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
       espree: 10.3.0
       graphemer: 1.4.0
       jsonc-eslint-parser: 2.4.0
@@ -6225,13 +6281,13 @@ snapshots:
     transitivePeerDependencies:
       - '@eslint/json'
 
-  eslint-plugin-n@17.19.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
+  eslint-plugin-n@17.19.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3):
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       enhanced-resolve: 5.18.1
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-plugin-es-x: 7.8.0(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-plugin-es-x: 7.8.0(eslint@9.29.0(jiti@2.4.2))
       get-tsconfig: 4.10.1
       globals: 15.15.0
       ignore: 5.3.2
@@ -6244,19 +6300,19 @@ snapshots:
 
   eslint-plugin-no-only-tests@3.3.0: {}
 
-  eslint-plugin-perfectionist@4.14.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
+  eslint-plugin-perfectionist@4.14.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3):
     dependencies:
       '@typescript-eslint/types': 8.33.1
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint: 9.28.0(jiti@2.4.2)
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint: 9.29.0(jiti@2.4.2)
       natural-orderby: 5.0.0
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  eslint-plugin-pnpm@0.3.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-pnpm@0.3.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       find-up-simple: 1.0.1
       jsonc-eslint-parser: 2.4.0
       pathe: 2.0.3
@@ -6264,36 +6320,36 @@ snapshots:
       tinyglobby: 0.2.14
       yaml-eslint-parser: 1.3.0
 
-  eslint-plugin-regexp@2.8.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-regexp@2.8.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
       '@eslint-community/regexpp': 4.12.1
       comment-parser: 1.4.1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       jsdoc-type-pratt-parser: 4.1.0
       refa: 0.12.1
       regexp-ast-analysis: 0.7.1
       scslre: 0.3.0
 
-  eslint-plugin-toml@0.12.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-toml@0.12.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       debug: 4.4.1
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-compat-utils: 0.6.5(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-compat-utils: 0.6.5(eslint@9.29.0(jiti@2.4.2))
       lodash: 4.17.21
       toml-eslint-parser: 0.10.0
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-unicorn@59.0.1(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-unicorn@59.0.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@babel/helper-validator-identifier': 7.27.1
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
       '@eslint/plugin-kit': 0.2.8
       ci-info: 4.2.0
       clean-regexp: 1.0.0
       core-js-compat: 3.42.0
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       esquery: 1.6.0
       find-up-simple: 1.0.1
       globals: 16.2.0
@@ -6306,38 +6362,38 @@ snapshots:
       semver: 7.7.2
       strip-indent: 4.0.0
 
-  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
     optionalDependencies:
-      '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
 
-  eslint-plugin-vue@10.2.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2))):
+  eslint-plugin-vue@10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2))):
     dependencies:
-      '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
-      eslint: 9.28.0(jiti@2.4.2)
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
       natural-compare: 1.4.0
       nth-check: 2.1.1
       postcss-selector-parser: 6.1.2
       semver: 7.7.2
-      vue-eslint-parser: 10.1.3(eslint@9.28.0(jiti@2.4.2))
+      vue-eslint-parser: 10.1.3(eslint@9.29.0(jiti@2.4.2))
       xml-name-validator: 4.0.0
 
-  eslint-plugin-yml@1.18.0(eslint@9.28.0(jiti@2.4.2)):
+  eslint-plugin-yml@1.18.0(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       debug: 4.4.1
       escape-string-regexp: 4.0.0
-      eslint: 9.28.0(jiti@2.4.2)
-      eslint-compat-utils: 0.6.5(eslint@9.28.0(jiti@2.4.2))
+      eslint: 9.29.0(jiti@2.4.2)
+      eslint-compat-utils: 0.6.5(eslint@9.29.0(jiti@2.4.2))
       natural-compare: 1.4.0
       yaml-eslint-parser: 1.3.0
     transitivePeerDependencies:
       - supports-color
 
-  eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2)):
+  eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.16)(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@vue/compiler-sfc': 3.5.16
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
 
   eslint-scope@5.1.1:
     dependencies:
@@ -6349,17 +6405,24 @@ snapshots:
       esrecurse: 4.3.0
       estraverse: 5.3.0
 
+  eslint-scope@8.4.0:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
   eslint-visitor-keys@2.1.0: {}
 
   eslint-visitor-keys@3.4.3: {}
 
   eslint-visitor-keys@4.2.0: {}
 
-  eslint-vitest-rule-tester@2.2.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2):
+  eslint-visitor-keys@4.2.1: {}
+
+  eslint-vitest-rule-tester@2.2.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2):
     dependencies:
       '@types/eslint': 9.6.1
-      '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint: 9.28.0(jiti@2.4.2)
+      '@typescript-eslint/utils': 8.33.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      eslint: 9.29.0(jiti@2.4.2)
       vitest: 3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/ui@3.2.2)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)
     transitivePeerDependencies:
       - supports-color
@@ -6407,12 +6470,60 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  eslint@9.29.0(jiti@2.4.2):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
+      '@eslint-community/regexpp': 4.12.1
+      '@eslint/config-array': 0.20.1
+      '@eslint/config-helpers': 0.2.2
+      '@eslint/core': 0.14.0
+      '@eslint/eslintrc': 3.3.1
+      '@eslint/js': 9.29.0
+      '@eslint/plugin-kit': 0.3.1
+      '@humanfs/node': 0.16.6
+      '@humanwhocodes/module-importer': 1.0.1
+      '@humanwhocodes/retry': 0.4.3
+      '@types/estree': 1.0.8
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.6
+      debug: 4.4.1
+      escape-string-regexp: 4.0.0
+      eslint-scope: 8.4.0
+      eslint-visitor-keys: 4.2.1
+      espree: 10.4.0
+      esquery: 1.6.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 8.0.0
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      json-stable-stringify-without-jsonify: 1.0.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.4
+    optionalDependencies:
+      jiti: 2.4.2
+    transitivePeerDependencies:
+      - supports-color
+
   espree@10.3.0:
     dependencies:
       acorn: 8.14.1
       acorn-jsx: 5.3.2(acorn@8.14.1)
       eslint-visitor-keys: 4.2.0
 
+  espree@10.4.0:
+    dependencies:
+      acorn: 8.15.0
+      acorn-jsx: 5.3.2(acorn@8.15.0)
+      eslint-visitor-keys: 4.2.1
+
   espree@9.6.1:
     dependencies:
       acorn: 8.14.1
@@ -7973,9 +8084,9 @@ snapshots:
 
   tunnel@0.0.6: {}
 
-  twoslash-eslint@0.3.1(eslint@9.28.0(jiti@2.4.2)):
+  twoslash-eslint@0.3.1(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       twoslash-protocol: 0.3.1
 
   twoslash-protocol@0.3.1: {}
@@ -8304,10 +8415,10 @@ snapshots:
 
   vscode-uri@3.1.0: {}
 
-  vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)):
+  vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       debug: 4.4.1
-      eslint: 9.28.0(jiti@2.4.2)
+      eslint: 9.29.0(jiti@2.4.2)
       eslint-scope: 8.3.0
       eslint-visitor-keys: 4.2.0
       espree: 10.3.0
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 07fdcd1d..d5a1d15e 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -21,7 +21,7 @@ catalog:
   '@typescript-eslint/utils': ^8.32.1
   change-case: ^5.4.4
   escape-string-regexp: ^5.0.0
-  eslint: ^9.27.0
+  eslint: ^9.29.0
   eslint-plugin-format: ^1.0.1
   eslint-visitor-keys: ^4.2.0
   espree: ^10.3.0


Test patch:
diff --git a/packages/eslint-plugin/rules/indent/indent._ts_.test.ts b/packages/eslint-plugin/rules/indent/indent._ts_.test.ts
index d875c345..f1446de2 100644
--- a/packages/eslint-plugin/rules/indent/indent._ts_.test.ts
+++ b/packages/eslint-plugin/rules/indent/indent._ts_.test.ts
@@ -827,6 +827,24 @@ const map2 = Object.keys(map)
       `,
       options: [2],
     },
+    {
+      code: $`
+        using a = foo(),
+          b = bar();
+        await using c = baz(),
+          d = qux();
+      `,
+      options: [2, { VariableDeclarator: 1 }],
+    },
+    {
+      code: $`
+        using a = foo(),
+              b = bar();
+        await using c = baz(),
+                    d = qux();
+      `,
+      options: [2, { VariableDeclarator: { using: 'first' } }],
+    },
   ],
   invalid: [
     ...individualNodeTests.invalid!,
@@ -2039,5 +2057,43 @@ class Foo {
         },
       ],
     },
+    {
+      code: $`
+        using a = foo(),
+          b = bar();
+        await using c = baz(),
+          d = qux();
+      `,
+      output: $`
+        using a = foo(),
+              b = bar();
+        await using c = baz(),
+                    d = qux();
+      `,
+      options: [2, { VariableDeclarator: 'first' }],
+      errors: [
+        { messageId: 'wrongIndentation', data: { expected: '6 spaces', actual: 2 } },
+        { messageId: 'wrongIndentation', data: { expected: '12 spaces', actual: 2 } },
+      ],
+    },
+    {
+      code: $`
+        using a = foo(),
+              b = bar();
+        await using c = baz(),
+                    d = qux();
+      `,
+      output: $`
+        using a = foo(),
+          b = bar();
+        await using c = baz(),
+          d = qux();
+      `,
+      options: [2, { VariableDeclarator: { using: 1 } }],
+      errors: [
+        { messageId: 'wrongIndentation', data: { expected: '2 spaces', actual: 6 } },
+        { messageId: 'wrongIndentation', data: { expected: '2 spaces', actual: 12 } },
+      ],
+    },
   ],
 })
diff --git a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._js_.test.ts b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._js_.test.ts
index 0d06801e..3c2e96b2 100644
--- a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._js_.test.ts
+++ b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._js_.test.ts
@@ -2135,6 +2135,65 @@ run<RuleOptions, MessageIds>({
       errors: unexpectedBeforeAndAfter('const'),
     },
 
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    {
+      code: '{}using a = b',
+      output: '{} using a = b',
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('using'),
+    },
+    {
+      code: '{} using a = b',
+      output: '{}using a = b',
+      options: [NEITHER],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('using'),
+    },
+    {
+      code: '{}using a = b',
+      output: '{} using a = b',
+      options: [override('using', BOTH)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('using'),
+    },
+    {
+      code: '{} using a = b',
+      output: '{}using a = b',
+      options: [override('using', NEITHER)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('using'),
+    },
+    {
+      code: '{}await using a = b',
+      output: '{} await using a = b',
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('await'),
+    },
+    {
+      code: '{} await using a = b',
+      output: '{}await using a = b',
+      options: [NEITHER],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('await'),
+    },
+    {
+      code: '{}await using a = b',
+      output: '{} await using a = b',
+      options: [override('await', BOTH)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('await'),
+    },
+    {
+      code: '{} await using a = b',
+      output: '{}await using a = b',
+      options: [override('await', NEITHER)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('await'),
+    },
+
     // ----------------------------------------------------------------------
     // continue
     // ----------------------------------------------------------------------
diff --git a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._ts_.test.ts b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._ts_.test.ts
index e692b56a..183c0b8d 100644
--- a/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._ts_.test.ts
+++ b/packages/eslint-plugin/rules/keyword-spacing/keyword-spacing._ts_.test.ts
@@ -579,5 +579,60 @@ run<RuleOptions, MessageIds>({
         { messageId: 'unexpectedAfter', data: { value: 'from' } },
       ],
     },
+
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    {
+      code: '{}using a = b',
+      output: '{} using a = b',
+      errors: expectedBefore('using'),
+    },
+    {
+      code: '{} using a = b',
+      output: '{}using a = b',
+      options: [NEITHER],
+      errors: unexpectedBefore('using'),
+    },
+    {
+      code: '{}using a = b',
+      output: '{} using a = b',
+      options: [overrides('using', BOTH)],
+      errors: expectedBefore('using'),
+    },
+    {
+      code: '{} using a = b',
+      output: '{}using a = b',
+      options: [overrides('using', NEITHER)],
+      errors: unexpectedBefore('using'),
+    },
+    {
+      code: '{}await using a = b',
+      output: '{} await using a = b',
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('await'),
+    },
+    {
+      code: '{} await using a = b',
+      output: '{}await using a = b',
+      options: [NEITHER],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('await'),
+    },
+    {
+      code: '{}await using a = b',
+      output: '{} await using a = b',
+      options: [overrides('await', BOTH)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: expectedBefore('await'),
+    },
+    {
+      code: '{} await using a = b',
+      output: '{}await using a = b',
+      options: [overrides('await', NEITHER)],
+      parserOptions: { ecmaVersion: 2026 },
+      errors: unexpectedBefore('await'),
+    },
   ],
 })
diff --git a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._js_.test.ts b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._js_.test.ts
index 0db5cf4a..1a4354d8 100644
--- a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._js_.test.ts
+++ b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._js_.test.ts
@@ -1019,6 +1019,27 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\nfoo()`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'using', next: '*' },
+        ] as RuleOptions,
+      },
+    ]),
+    {
+      code: 'var a=1\nfoo()',
+      options: [
+        { blankLine: 'never', prev: '*', next: '*' },
+        { blankLine: 'always', prev: 'using', next: '*' },
+      ],
+    },
+
     // ----------------------------------------------------------------------
     // var
     // ----------------------------------------------------------------------
@@ -1136,6 +1157,41 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // multiline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // multiline-var
     // ----------------------------------------------------------------------
@@ -1235,6 +1291,41 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // singleline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'singleline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'singleline-using' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d={\ne:3,\nf:4\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'singleline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d={\ne:3,\nf:4\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'singleline-using' },
+        ] as RuleOptions,
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // singleline-var
     // ----------------------------------------------------------------------
@@ -4030,6 +4121,25 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a = x\n\nfoo()`,
+        output: `${usingType} a = x\nfoo()`,
+        options: [{ blankLine: 'never', prev: 'using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a = x\nfoo()`,
+        output: `${usingType} a = x\n\nfoo()`,
+        options: [{ blankLine: 'always', prev: 'using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // var
     // ----------------------------------------------------------------------
@@ -4169,6 +4279,45 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // multiline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        output: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d=3`,
+        options: [
+          { blankLine: 'never', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d=3`,
+        output: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        options: [
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        output: `${usingType} a=1\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b={\nc:2,\nd:3\n}`,
+        output: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // multiline-var
     // ----------------------------------------------------------------------
@@ -4280,6 +4429,37 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // singleline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        output: `${usingType} a=1\n${usingType} b=2`,
+        options: [{ blankLine: 'never', prev: 'singleline-using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        output: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [{ blankLine: 'always', prev: 'singleline-using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        output: `${usingType} a=1\n${usingType} b=2`,
+        options: [{ blankLine: 'never', prev: '*', next: 'singleline-using' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        output: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [{ blankLine: 'always', prev: '*', next: 'singleline-using' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // singleline-var
     // ----------------------------------------------------------------------
diff --git a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._ts_.test.ts b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._ts_.test.ts
index b5ac5551..92562b1c 100644
--- a/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._ts_.test.ts
+++ b/packages/eslint-plugin/rules/padding-line-between-statements/padding-line-between-statements._ts_.test.ts
@@ -1040,6 +1040,27 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\nfoo()`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'using', next: '*' },
+        ] as RuleOptions,
+      },
+    ]),
+    {
+      code: 'var a=1\nfoo()',
+      options: [
+        { blankLine: 'never', prev: '*', next: '*' },
+        { blankLine: 'always', prev: 'using', next: '*' },
+      ],
+    },
+
     // ----------------------------------------------------------------------
     // var
     // ----------------------------------------------------------------------
@@ -1156,6 +1177,41 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // multiline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // multiline-var
     // ----------------------------------------------------------------------
@@ -1255,6 +1311,41 @@ run<RuleOptions, MessageIds>({
       ],
     },
 
+    // ----------------------------------------------------------------------
+    // singleline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'singleline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'singleline-using' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d={\ne:3,\nf:4\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: 'singleline-using', next: '*' },
+        ] as RuleOptions,
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d={\ne:3,\nf:4\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: '*' },
+          { blankLine: 'always', prev: '*', next: 'singleline-using' },
+        ] as RuleOptions,
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // single line var
     // ----------------------------------------------------------------------
@@ -3940,6 +4031,25 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a = x\n\nfoo()`,
+        output: `${usingType} a = x\nfoo()`,
+        options: [{ blankLine: 'never', prev: 'using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a = x\nfoo()`,
+        output: `${usingType} a = x\n\nfoo()`,
+        options: [{ blankLine: 'always', prev: 'using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // var
     // ----------------------------------------------------------------------
@@ -4049,6 +4159,45 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // multiline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        output: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d=3`,
+        options: [
+          { blankLine: 'never', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a={\nb:1,\nc:2\n}\n${usingType} d=3`,
+        output: `${usingType} a={\nb:1,\nc:2\n}\n\n${usingType} d=3`,
+        options: [
+          { blankLine: 'always', prev: 'multiline-using', next: '*' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        output: `${usingType} a=1\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'never', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b={\nc:2,\nd:3\n}`,
+        output: `${usingType} a=1\n\n${usingType} b={\nc:2,\nd:3\n}`,
+        options: [
+          { blankLine: 'always', prev: '*', next: 'multiline-using' },
+        ] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // multiline-var
     // ----------------------------------------------------------------------
@@ -4136,6 +4285,37 @@ run<RuleOptions, MessageIds>({
       errors: [{ messageId: 'expectedBlankLine' }],
     },
 
+    // ----------------------------------------------------------------------
+    // singleline-using
+    // ----------------------------------------------------------------------
+
+    ...['using', 'await using'].flatMap(usingType => [
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        output: `${usingType} a=1\n${usingType} b=2`,
+        options: [{ blankLine: 'never', prev: 'singleline-using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        output: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [{ blankLine: 'always', prev: 'singleline-using', next: '*' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n\n${usingType} b=2`,
+        output: `${usingType} a=1\n${usingType} b=2`,
+        options: [{ blankLine: 'never', prev: '*', next: 'singleline-using' }] as RuleOptions,
+        errors: [{ messageId: 'unexpectedBlankLine' as const }],
+      },
+      {
+        code: `${usingType} a=1\n${usingType} b=2`,
+        output: `${usingType} a=1\n\n${usingType} b=2`,
+        options: [{ blankLine: 'always', prev: '*', next: 'singleline-using' }] as RuleOptions,
+        errors: [{ messageId: 'expectedBlankLine' as const }],
+      },
+    ]),
+
     // ----------------------------------------------------------------------
     // single line var
     // ----------------------------------------------------------------------