diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 704e0cf1..a9eefa5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,11 +46,14 @@ jobs: - uses: ./.github/actions/prepare - run: pnpm format --list-different test: - name: Test (Node.js ${{ matrix.node-version }}, ${{ matrix.os }}) + name: Test (Node.js ${{ matrix.node-version }}, ESLint ${{ matrix.eslint-version }}, ${{ matrix.os }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + eslint-version: + - 9 + - 10 node-version: - 20 - 22 @@ -63,15 +66,23 @@ jobs: - uses: ./.github/actions/prepare with: node-version: ${{ matrix.node-version }} + - run: pnpm install -D eslint@${{ matrix.eslint-version }} - run: pnpm run test --coverage - env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} if: always() uses: codecov/codecov-action@v5 type_check: - name: Type Check + name: Type Check (ESLint ${{ matrix.eslint-version }}) runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + eslint-version: + - 9 + - 10 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: ./.github/actions/prepare + - run: pnpm install -D eslint@${{ matrix.eslint-version }} - run: pnpm typecheck diff --git a/package.json b/package.json index 5c67727c..1b1ad963 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", - "@eslint/js": "9.39.1", + "@eslint/js": "10.0.1", "@eslint/markdown": "7.5.1", "@types/estree": "1.0.8", "@types/node": "24.10.1", @@ -77,7 +77,7 @@ "@vitest/coverage-v8": "4.0.13", "@vitest/eslint-plugin": "1.6.1", "console-fail-test": "0.6.0", - "eslint": "9.39.1", + "eslint": "10.0.0", "eslint-doc-generator": "3.0.2", "eslint-plugin-eslint-plugin": "7.3.0", "eslint-plugin-jsdoc": "62.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86911521..531bd3e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 4.0.1 eslint-fix-utils: specifier: ~0.4.0 - version: 0.4.0(@types/estree@1.0.8)(eslint@9.39.1(jiti@2.6.1)) + version: 0.4.0(@types/estree@1.0.8)(eslint@10.0.0(jiti@2.6.1)) package-json-validator: specifier: ~0.60.0 version: 0.60.0 @@ -41,10 +41,10 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: 4.6.0 - version: 4.6.0(eslint@9.39.1(jiti@2.6.1)) + version: 4.6.0(eslint@10.0.0(jiti@2.6.1)) '@eslint/js': - specifier: 9.39.1 - version: 9.39.1 + specifier: 10.0.1 + version: 10.0.1(eslint@10.0.0(jiti@2.6.1)) '@eslint/markdown': specifier: 7.5.1 version: 7.5.1 @@ -65,46 +65,46 @@ importers: version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1)) '@vitest/eslint-plugin': specifier: 1.6.1 - version: 1.6.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1)) + version: 1.6.1(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1)) console-fail-test: specifier: 0.6.0 version: 0.6.0 eslint: - specifier: 9.39.1 - version: 9.39.1(jiti@2.6.1) + specifier: 10.0.0 + version: 10.0.0(jiti@2.6.1) eslint-doc-generator: specifier: 3.0.2 - version: 3.0.2(eslint@9.39.1(jiti@2.6.1))(prettier@3.8.0)(typescript@5.9.3) + version: 3.0.2(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.0)(typescript@5.9.3) eslint-plugin-eslint-plugin: specifier: 7.3.0 - version: 7.3.0(eslint@9.39.1(jiti@2.6.1)) + version: 7.3.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.5.0 - version: 62.5.0(eslint@9.39.1(jiti@2.6.1)) + version: 62.5.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-jsonc: specifier: 2.21.0 - version: 2.21.0(eslint@9.39.1(jiti@2.6.1)) + version: 2.21.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-markdown-links: specifier: 0.7.1 - version: 0.7.1(@eslint/markdown@7.5.1)(eslint@9.39.1(jiti@2.6.1)) + version: 0.7.1(@eslint/markdown@7.5.1)(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-n: specifier: 17.23.1 - version: 17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 17.23.1(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-node-dependencies: specifier: 1.3.0 - version: 1.3.0(eslint@9.39.1(jiti@2.6.1)) + version: 1.3.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-perfectionist: specifier: 5.5.0 - version: 5.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 5.5.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-regexp: specifier: 3.0.0 - version: 3.0.0(eslint@9.39.1(jiti@2.6.1)) + version: 3.0.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-unicorn: specifier: 62.0.0 - version: 62.0.0(eslint@9.39.1(jiti@2.6.1)) + version: 62.0.0(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-yml: specifier: 3.0.0 - version: 3.0.0(eslint@9.39.1(jiti@2.6.1)) + version: 3.0.0(eslint@10.0.0(jiti@2.6.1)) husky: specifier: 9.1.7 version: 9.1.7 @@ -143,7 +143,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: 8.54.0 - version: 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: 4.0.13 version: 4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1) @@ -386,13 +386,13 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.0': + resolution: {integrity: sha512-T5Swqd+PZxBekRuMsIFCySM3NUE8GjuqyksIIsXgkF2GCuiDaqpxKyPkv9VMEKpq5D7r5DLss1tM8tCsvRSjeg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.2': + resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} @@ -402,21 +402,26 @@ packages: resolution: {integrity: sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.1.0': + resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true '@eslint/markdown@7.5.1': resolution: {integrity: sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.0': + resolution: {integrity: sha512-nWl20RtHQP2A2yvKU6Fee62Xo1AoNRqBLixtyg45zJhU8ljPFCyBK90d8e8XTnPns1RggSf4HH3bM8AhevkPVg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/plugin-kit@0.4.1': resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} @@ -426,6 +431,10 @@ packages: resolution: {integrity: sha512-hZ2uC1jbf6JMSsF2ZklhRQqf6GLpYyux6DlzegnW/aFlpu6qJj5GO7ub7WOETCrEl6pl6DAX7RgTgj/fyG+6BQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/plugin-kit@0.6.0': + resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -446,6 +455,14 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -848,6 +865,9 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -1061,9 +1081,6 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1146,9 +1163,6 @@ packages: resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} engines: {node: '>= 12.0.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1407,9 +1421,9 @@ packages: peerDependencies: eslint: '>=9.38.0' - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.0: + resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -1423,9 +1437,9 @@ packages: resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.0.0: + resolution: {integrity: sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -1570,10 +1584,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -1780,9 +1790,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -1952,8 +1959,9 @@ packages: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -2311,10 +2319,6 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strip-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} @@ -2762,30 +2766,30 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@9.39.1(jiti@2.6.1))': + '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@10.0.0(jiti@2.6.1))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) ignore: 7.0.5 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.1(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.0(jiti@2.6.1))': dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.0': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.0 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.2': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.1.0 '@eslint/core@0.17.0': dependencies: @@ -2795,21 +2799,13 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/core@1.1.0': dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@types/json-schema': 7.0.15 - '@eslint/js@9.39.1': {} + '@eslint/js@10.0.1(eslint@10.0.0(jiti@2.6.1))': + optionalDependencies: + eslint: 10.0.0(jiti@2.6.1) '@eslint/markdown@7.5.1': dependencies: @@ -2825,7 +2821,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.0': {} '@eslint/plugin-kit@0.4.1': dependencies: @@ -2837,6 +2833,11 @@ snapshots: '@eslint/core': 1.0.1 levn: 0.4.1 + '@eslint/plugin-kit@0.6.0': + dependencies: + '@eslint/core': 1.1.0 + levn: 0.4.1 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -2850,6 +2851,12 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@jest/diff-sequences@30.0.1': {} '@jest/get-type@30.1.0': {} @@ -3109,6 +3116,8 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.7': {} '@types/estree@1.0.8': {} @@ -3142,15 +3151,15 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.54.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3158,14 +3167,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -3188,13 +3197,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -3217,13 +3226,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -3250,11 +3259,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.6.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1))': + '@vitest/eslint-plugin@1.6.1(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1))': dependencies: '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.0(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 vitest: 4.0.13(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(yaml@2.8.1) @@ -3358,11 +3367,6 @@ snapshots: birpc@4.0.0: {} - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3433,8 +3437,6 @@ snapshots: comment-parser@1.4.5: {} - concat-map@0.0.1: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -3567,19 +3569,19 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@10.0.0(jiti@2.6.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) semver: 7.7.3 - eslint-compat-utils@0.6.5(eslint@9.39.1(jiti@2.6.1)): + eslint-compat-utils@0.6.5(eslint@10.0.0(jiti@2.6.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) semver: 7.7.3 - eslint-doc-generator@3.0.2(eslint@9.39.1(jiti@2.6.1))(prettier@3.8.0)(typescript@5.9.3): + eslint-doc-generator@3.0.2(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) ajv: 8.17.1 change-case: 5.4.4 commander: 14.0.2 @@ -3587,7 +3589,7 @@ snapshots: deepmerge: 4.3.1 dot-prop: 10.1.0 editorconfig: 3.0.1 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) jest-diff: 30.2.0 json-schema: 0.4.0 json-schema-traverse: 1.0.0 @@ -3599,32 +3601,32 @@ snapshots: - supports-color - typescript - eslint-fix-utils@0.4.0(@types/estree@1.0.8)(eslint@9.39.1(jiti@2.6.1)): + eslint-fix-utils@0.4.0(@types/estree@1.0.8)(eslint@10.0.0(jiti@2.6.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) optionalDependencies: '@types/estree': 1.0.8 - eslint-json-compat-utils@0.2.1(eslint@9.39.1(jiti@2.6.1))(jsonc-eslint-parser@2.4.1): + eslint-json-compat-utils@0.2.1(eslint@10.0.0(jiti@2.6.1))(jsonc-eslint-parser@2.4.1): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) esquery: 1.7.0 jsonc-eslint-parser: 2.4.1 - eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@10.0.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.1(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.1(jiti@2.6.1)) + eslint: 10.0.0(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@10.0.0(jiti@2.6.1)) - eslint-plugin-eslint-plugin@7.3.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-eslint-plugin@7.3.0(eslint@10.0.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) - eslint: 9.39.1(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) + eslint: 10.0.0(jiti@2.6.1) estraverse: 5.3.0 - eslint-plugin-jsdoc@62.5.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-jsdoc@62.5.0(eslint@10.0.0(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.83.0 '@es-joy/resolve.exports': 1.2.0 @@ -3632,7 +3634,7 @@ snapshots: comment-parser: 1.4.5 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) espree: 11.1.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -3644,13 +3646,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.21.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-jsonc@2.21.0(eslint@10.0.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) diff-sequences: 27.5.1 - eslint: 9.39.1(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@2.6.1)) - eslint-json-compat-utils: 0.2.1(eslint@9.39.1(jiti@2.6.1))(jsonc-eslint-parser@2.4.1) + eslint: 10.0.0(jiti@2.6.1) + eslint-compat-utils: 0.6.5(eslint@10.0.0(jiti@2.6.1)) + eslint-json-compat-utils: 0.2.1(eslint@10.0.0(jiti@2.6.1))(jsonc-eslint-parser@2.4.1) espree: 10.4.0 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.1 @@ -3659,24 +3661,24 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-markdown-links@0.7.1(@eslint/markdown@7.5.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-markdown-links@0.7.1(@eslint/markdown@7.5.1)(eslint@10.0.0(jiti@2.6.1)): dependencies: '@eslint/markdown': 7.5.1 '@mdit-vue/shared': 3.0.2 entities: 7.0.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) fast-content-type-parse: 3.0.0 github-slugger: 2.0.0 sdbm: 3.0.0 synckit: 0.11.11 undici: 7.16.0 - eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) enhanced-resolve: 5.18.1 - eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.6.1)) + eslint: 10.0.0(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@10.0.0(jiti@2.6.1)) get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 @@ -3686,10 +3688,10 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-node-dependencies@1.3.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-node-dependencies@1.3.0(eslint@10.0.0(jiti@2.6.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@2.6.1)) + eslint: 10.0.0(jiti@2.6.1) + eslint-compat-utils: 0.6.5(eslint@10.0.0(jiti@2.6.1)) jsonc-eslint-parser: 2.4.1 npm-package-arg: 12.0.2 package-json: 10.0.1 @@ -3697,36 +3699,36 @@ snapshots: synckit: 0.11.11 undici: 7.16.0 - eslint-plugin-perfectionist@5.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-perfectionist@5.5.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.0(jiti@2.6.1) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-regexp@3.0.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-regexp@3.0.0(eslint@10.0.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.5 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) jsdoc-type-pratt-parser: 7.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-unicorn@62.0.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-unicorn@62.0.0(eslint@10.0.0(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 ci-info: 4.3.1 clean-regexp: 1.0.0 core-js-compat: 3.47.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) esquery: 1.7.0 find-up-simple: 1.0.1 globals: 16.5.0 @@ -3739,21 +3741,23 @@ snapshots: semver: 7.7.3 strip-indent: 4.1.1 - eslint-plugin-yml@3.0.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-yml@3.0.0(eslint@10.0.0(jiti@2.6.1)): dependencies: '@eslint/core': 1.0.1 '@eslint/plugin-kit': 0.5.1 debug: 4.4.3 diff-sequences: 29.6.3 escape-string-regexp: 5.0.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 10.0.0(jiti@2.6.1) natural-compare: 1.4.0 yaml-eslint-parser: 2.0.0 transitivePeerDependencies: - supports-color - eslint-scope@8.4.0: + eslint-scope@9.1.0: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -3763,28 +3767,25 @@ snapshots: eslint-visitor-keys@5.0.0: {} - eslint@9.39.1(jiti@2.6.1): + eslint@10.0.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.0 + '@eslint/config-helpers': 0.5.2 + '@eslint/core': 1.1.0 + '@eslint/plugin-kit': 0.6.0 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.8 ajv: 6.12.6 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.0 + eslint-visitor-keys: 5.0.0 + espree: 11.1.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3795,8 +3796,7 @@ snapshots: 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 + minimatch: 10.1.2 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -3927,8 +3927,6 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@14.0.0: {} - globals@15.15.0: {} globals@16.5.0: {} @@ -4117,8 +4115,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 @@ -4482,9 +4478,9 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@3.1.2: + minimatch@10.1.2: dependencies: - brace-expansion: 1.1.11 + '@isaacs/brace-expansion': 5.0.1 minimatch@9.0.5: dependencies: @@ -4853,8 +4849,6 @@ snapshots: strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} - strip-json-comments@5.0.3: {} supports-color@7.2.0: @@ -4941,13 +4935,13 @@ snapshots: dependencies: tagged-tag: 1.0.0 - typescript-eslint@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color diff --git a/src/createRule.ts b/src/createRule.ts index 1c462540..35cf85d8 100644 --- a/src/createRule.ts +++ b/src/createRule.ts @@ -49,8 +49,11 @@ export interface PackageJsonRuleModule< Schema extends JSONSchema[] = JSONSchema[], > { create(context: PackageJsonRuleContext): RuleListener; - meta: Omit & { + meta: Omit & { defaultOptions?: NoInfer; + docs?: Rule.RuleMetaData["docs"] & { + category?: string; + }; schema?: Schema; }; } diff --git a/src/rules/no-empty-fields.ts b/src/rules/no-empty-fields.ts index 35b2e7c9..13ca65bb 100644 --- a/src/rules/no-empty-fields.ts +++ b/src/rules/no-empty-fields.ts @@ -137,9 +137,9 @@ export const rule = createRule({ hasSuggestions: true, messages: { emptyExpression: - "This {{expressionType}} does nothing and can be removed.", + "This {{ expressionType }} does nothing and can be removed.", emptyFields: - "The field '{{field}}' does nothing and can be removed.", + "The field '{{ field }}' does nothing and can be removed.", remove: "Remove this empty field.", }, schema: [ diff --git a/src/rules/restrict-private-properties.ts b/src/rules/restrict-private-properties.ts index 6bceb7eb..b09c62a4 100644 --- a/src/rules/restrict-private-properties.ts +++ b/src/rules/restrict-private-properties.ts @@ -89,9 +89,9 @@ export const rule = createRule({ fixable: "code", hasSuggestions: true, messages: { - removePropertySuggestion: "Remove the '{{property}}' field.", + removePropertySuggestion: "Remove the '{{ property }}' field.", unnecessaryProperty: - "The '{{property}}' field is unnecessary in private packages and can be removed.", + "The '{{ property }}' field is unnecessary in private packages and can be removed.", }, schema: [ { diff --git a/src/tests/rules/bin-name-casing.test.ts b/src/tests/rules/bin-name-casing.test.ts index f379829f..12956cc8 100644 --- a/src/tests/rules/bin-name-casing.test.ts +++ b/src/tests/rules/bin-name-casing.test.ts @@ -19,6 +19,9 @@ ruleTester.run("bin-name-casing", rule, { messageId: "invalidCase", suggestions: [ { + data: { + property: "silverMtZion", + }, messageId: "convertToKebabCase", output: `{ "bin": { @@ -37,6 +40,9 @@ ruleTester.run("bin-name-casing", rule, { messageId: "invalidCase", suggestions: [ { + data: { + property: "NIN", + }, messageId: "convertToKebabCase", output: `{ "bin": { diff --git a/src/tests/rules/exports-subpaths-style.test.ts b/src/tests/rules/exports-subpaths-style.test.ts index e3219cd4..388ae315 100644 --- a/src/tests/rules/exports-subpaths-style.test.ts +++ b/src/tests/rules/exports-subpaths-style.test.ts @@ -8,7 +8,7 @@ ruleTester.run("exports-subpaths-style", rule, { // ============================================================ { code: `{ "exports": "./index.js" }`, - errors: [{ messageId: "preferExplicit", type: "JSONLiteral" }], + errors: [{ messageId: "preferExplicit" }], output: `{ "exports": { ".": "./index.js" } }`, @@ -20,9 +20,7 @@ ruleTester.run("exports-subpaths-style", rule, { "require": "./index.cjs" } }`, - errors: [ - { messageId: "preferExplicit", type: "JSONObjectExpression" }, - ], + errors: [{ messageId: "preferExplicit" }], output: `{ "exports": { ".": { @@ -34,21 +32,21 @@ ruleTester.run("exports-subpaths-style", rule, { }, { code: `{ "exports": 123 }`, - errors: [{ messageId: "preferExplicit", type: "JSONLiteral" }], + errors: [{ messageId: "preferExplicit" }], output: `{ "exports": { ".": 123 } }`, }, { code: `{ "exports": true }`, - errors: [{ messageId: "preferExplicit", type: "JSONLiteral" }], + errors: [{ messageId: "preferExplicit" }], output: `{ "exports": { ".": true } }`, }, { code: `{ "exports": null }`, - errors: [{ messageId: "preferExplicit", type: "JSONLiteral" }], + errors: [{ messageId: "preferExplicit" }], output: `{ "exports": { ".": null } }`, @@ -56,7 +54,7 @@ ruleTester.run("exports-subpaths-style", rule, { // With explicit option { code: `{ "exports": "./index.js" }`, - errors: [{ messageId: "preferExplicit", type: "JSONLiteral" }], + errors: [{ messageId: "preferExplicit" }], options: [{ prefer: "explicit" }], output: `{ "exports": { ".": "./index.js" @@ -72,9 +70,7 @@ ruleTester.run("exports-subpaths-style", rule, { ".": "./index.js" } }`, - errors: [ - { messageId: "preferImplicit", type: "JSONObjectExpression" }, - ], + errors: [{ messageId: "preferImplicit" }], options: [{ prefer: "implicit" }], output: `{ "exports": "./index.js" @@ -89,9 +85,7 @@ ruleTester.run("exports-subpaths-style", rule, { } } }`, - errors: [ - { messageId: "preferImplicit", type: "JSONObjectExpression" }, - ], + errors: [{ messageId: "preferImplicit" }], options: [{ prefer: "implicit" }], output: `{ "exports": { @@ -106,9 +100,7 @@ ruleTester.run("exports-subpaths-style", rule, { ".": ["./index.js"] } }`, - errors: [ - { messageId: "preferImplicit", type: "JSONObjectExpression" }, - ], + errors: [{ messageId: "preferImplicit" }], options: [{ prefer: "implicit" }], output: `{ "exports": [ diff --git a/src/tests/rules/no-empty-fields.test.ts b/src/tests/rules/no-empty-fields.test.ts index 94cafe56..5f3e9f4f 100644 --- a/src/tests/rules/no-empty-fields.test.ts +++ b/src/tests/rules/no-empty-fields.test.ts @@ -14,6 +14,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "files" }, messageId: "emptyFields", suggestions: [ { @@ -39,6 +40,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { expressionType: "array" }, messageId: "emptyExpression", suggestions: [ { @@ -61,6 +63,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { expressionType: "object" }, messageId: "emptyExpression", suggestions: [ { @@ -74,6 +77,7 @@ ruleTester.run("no-empty-fields", rule, { ], }, { + data: { expressionType: "array" }, messageId: "emptyExpression", suggestions: [ { @@ -96,6 +100,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "dependencies" }, messageId: "emptyFields", suggestions: [ { @@ -121,6 +126,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "peerDependencies" }, messageId: "emptyFields", suggestions: [ { @@ -146,6 +152,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "scripts" }, messageId: "emptyFields", suggestions: [ { @@ -168,6 +175,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "devDependencies" }, messageId: "emptyFields", suggestions: [ { @@ -195,6 +203,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "nin" }, messageId: "emptyFields", suggestions: [ { @@ -227,6 +236,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "nin" }, messageId: "emptyFields", suggestions: [ { @@ -258,6 +268,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "files" }, messageId: "emptyFields", suggestions: [ { @@ -275,6 +286,7 @@ ruleTester.run("no-empty-fields", rule, { ], }, { + data: { field: "test" }, messageId: "emptyFields", suggestions: [ { @@ -303,6 +315,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "files" }, messageId: "emptyFields", suggestions: [ { @@ -318,6 +331,7 @@ ruleTester.run("no-empty-fields", rule, { ], }, { + data: { field: "scripts" }, messageId: "emptyFields", suggestions: [ { @@ -350,6 +364,7 @@ ruleTester.run("no-empty-fields", rule, { `, errors: [ { + data: { field: "development" }, messageId: "emptyFields", suggestions: [ { diff --git a/src/tests/rules/repository-shorthand.test.ts b/src/tests/rules/repository-shorthand.test.ts index 0ebfbaa6..910de571 100644 --- a/src/tests/rules/repository-shorthand.test.ts +++ b/src/tests/rules/repository-shorthand.test.ts @@ -95,7 +95,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", @@ -114,7 +113,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", @@ -133,7 +131,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", @@ -149,7 +146,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONLiteral", }, ], filename: "package.json", @@ -168,7 +164,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", @@ -187,7 +182,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", @@ -206,7 +200,6 @@ ruleTester.run("repository-shorthand", rule, { errors: [ { messageId: "preferShorthand", - type: "JSONObjectExpression", }, ], filename: "package.json", diff --git a/src/tests/rules/restrict-private-properties.test.ts b/src/tests/rules/restrict-private-properties.test.ts index c63726b2..21a515b8 100644 --- a/src/tests/rules/restrict-private-properties.test.ts +++ b/src/tests/rules/restrict-private-properties.test.ts @@ -12,14 +12,16 @@ ruleTester.run("restrict-private-properties", rule, { }`, errors: [ { + data: { property: "files" }, messageId: "unnecessaryProperty", suggestions: [ { + data: { property: "files" }, messageId: "removePropertySuggestion", output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, ], @@ -37,14 +39,16 @@ ruleTester.run("restrict-private-properties", rule, { }`, errors: [ { + data: { property: "publishConfig" }, messageId: "unnecessaryProperty", suggestions: [ { + data: { property: "publishConfig" }, messageId: "removePropertySuggestion", output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, ], @@ -54,7 +58,12 @@ ruleTester.run("restrict-private-properties", rule, { // Empty files array (auto-fixable) { code: `{ "private": true, "files": [] }`, - errors: [{ messageId: "unnecessaryProperty" }], + errors: [ + { + data: { property: "files" }, + messageId: "unnecessaryProperty", + }, + ], output: `{ "private": true }`, }, // Empty publishConfig object (auto-fixable) @@ -64,11 +73,16 @@ ruleTester.run("restrict-private-properties", rule, { "private": true, "publishConfig": {} }`, - errors: [{ messageId: "unnecessaryProperty" }], + errors: [ + { + data: { property: "publishConfig" }, + messageId: "unnecessaryProperty", + }, + ], output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, // Multiple blocked properties (mixed empty/non-empty) @@ -81,26 +95,31 @@ ruleTester.run("restrict-private-properties", rule, { }`, errors: [ { + data: { property: "files" }, messageId: "unnecessaryProperty", suggestions: [ { + data: { property: "files" }, messageId: "removePropertySuggestion", output: `{ "name": "test", "private": true, - +\t\t\t\t "publishConfig": {} }`, }, ], }, - { messageId: "unnecessaryProperty" }, + { + data: { property: "publishConfig" }, + messageId: "unnecessaryProperty", + }, ], output: `{ "name": "test", "private": true, "files": ["dist"] - +\t\t\t\t }`, }, // Custom blocked properties (non-empty, with suggestion) @@ -114,14 +133,16 @@ ruleTester.run("restrict-private-properties", rule, { }`, errors: [ { + data: { property: "dependencies" }, messageId: "unnecessaryProperty", suggestions: [ { + data: { property: "dependencies" }, messageId: "removePropertySuggestion", output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, ], @@ -136,12 +157,17 @@ ruleTester.run("restrict-private-properties", rule, { "private": true, "dependencies": {} }`, - errors: [{ messageId: "unnecessaryProperty" }], + errors: [ + { + data: { property: "dependencies" }, + messageId: "unnecessaryProperty", + }, + ], options: [{ blockedProperties: ["dependencies"] }], output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, // Options object without blockedProperties (uses default) @@ -153,14 +179,16 @@ ruleTester.run("restrict-private-properties", rule, { }`, errors: [ { + data: { property: "files" }, messageId: "unnecessaryProperty", suggestions: [ { + data: { property: "files" }, messageId: "removePropertySuggestion", output: `{ "name": "test", "private": true - +\t\t\t\t }`, }, ], diff --git a/src/tests/rules/ruleTester.ts b/src/tests/rules/ruleTester.ts index 751fe0ab..e0e61d5f 100644 --- a/src/tests/rules/ruleTester.ts +++ b/src/tests/rules/ruleTester.ts @@ -1,5 +1,6 @@ -import { RuleTester } from "eslint"; +import { RuleTester, ESLint } from "eslint"; import jsoncESLintParser from "jsonc-eslint-parser"; +import semver from "semver"; import * as vitest from "vitest"; import type { PackageJsonRuleModule } from "../../createRule.ts"; @@ -29,6 +30,15 @@ const originalRun = ruleTester.run; ruleTester.run = (name, rule, tests) => { originalRun.call(ruleTester, name, rule as PackageJsonRuleModule, { + // Assertion options were added in ESLint v10. + ...(semver.gte(ESLint.version, "10.0.0") + ? { + assertionOptions: { + requireData: true, + requireMessage: true, + }, + } + : {}), invalid: tests.invalid?.map((test) => ({ filename: "package.json", ...test, diff --git a/src/tests/rules/scripts-name-casing.test.ts b/src/tests/rules/scripts-name-casing.test.ts index 0bfbd621..0dc5b2d5 100644 --- a/src/tests/rules/scripts-name-casing.test.ts +++ b/src/tests/rules/scripts-name-casing.test.ts @@ -19,6 +19,9 @@ ruleTester.run("scripts-name-casing", rule, { messageId: "invalidCase", suggestions: [ { + data: { + property: "silverMtZion", + }, messageId: "convertToKebabCase", output: `{ "scripts": { @@ -37,6 +40,9 @@ ruleTester.run("scripts-name-casing", rule, { messageId: "invalidCase", suggestions: [ { + data: { + property: "NIN", + }, messageId: "convertToKebabCase", output: `{ "scripts": { diff --git a/src/tests/rules/sort-collections.test.ts b/src/tests/rules/sort-collections.test.ts index 70454e02..152d9ee2 100644 --- a/src/tests/rules/sort-collections.test.ts +++ b/src/tests/rules/sort-collections.test.ts @@ -18,7 +18,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -42,7 +41,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -66,7 +64,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -88,7 +85,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -110,7 +106,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -132,7 +127,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "scripts" }, messageId: "unsortedScripts", - type: "JSONProperty", }, ], filename: "package.json", @@ -158,7 +152,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "exports" }, messageId: "unsortedKeys", - type: "JSONProperty", }, ], filename: "package.json", @@ -186,7 +179,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "pnpm.patchedDependencies" }, messageId: "unsortedKeys", - type: "JSONProperty", }, ], filename: "package.json", @@ -215,7 +207,6 @@ ruleTester.run("sort-collections", rule, { { data: { key: "pnpm.peerDependencyRules.allowedVersions" }, messageId: "unsortedKeys", - type: "JSONProperty", }, ], filename: "package.json", diff --git a/src/tests/rules/specify-peers-locally.test.ts b/src/tests/rules/specify-peers-locally.test.ts index 72d7bc4e..52b23079 100644 --- a/src/tests/rules/specify-peers-locally.test.ts +++ b/src/tests/rules/specify-peers-locally.test.ts @@ -15,10 +15,12 @@ ruleTester.run("specify-peers-locally", rule, { }`, errors: [ { + data: { name: "abc" }, line: 3, messageId: "devDependencyNotDefined", suggestions: [ { + data: { name: "abc" }, messageId: "addToDevDependencies", output: `{ "peerDependencies": { @@ -45,10 +47,12 @@ ruleTester.run("specify-peers-locally", rule, { }`, errors: [ { + data: { name: "abc" }, line: 3, messageId: "devDependencyNotDefined", suggestions: [ { + data: { name: "abc" }, messageId: "addToDevDependencies", output: `{ "peerDependencies": { @@ -72,6 +76,7 @@ ruleTester.run("specify-peers-locally", rule, { }`, errors: [ { + data: { name: "abc" }, line: 3, messageId: "devDependencyNotDefined", suggestions: [], diff --git a/src/tests/rules/valid-repository-directory.test.ts b/src/tests/rules/valid-repository-directory.test.ts index 56706a43..f8d09fdc 100644 --- a/src/tests/rules/valid-repository-directory.test.ts +++ b/src/tests/rules/valid-repository-directory.test.ts @@ -120,6 +120,7 @@ ruleTester.run("valid-repository-directory (this repository)", rule, { messageId: "mismatched", suggestions: [ { + data: { expected: "" }, messageId: "replace", output: `{ "repository": { @@ -149,6 +150,10 @@ ruleTester.run("valid-repository-directory (this repository)", rule, { messageId: "mismatched", suggestions: [ { + data: { + expected: + "src/tests/__fixtures__/valid-local-dependency", + }, messageId: "replace", output: `{ "repository": {