From 13f6db39cd587f5bf0f6712e17c6cb260197718d Mon Sep 17 00:00:00 2001 From: Johannes Ewald Date: Tue, 7 Jul 2026 09:59:16 +0200 Subject: [PATCH 1/3] feat(eslint)!: switch JSX a11y linting to eslint-plugin-jsx-a11y-x Replace eslint-plugin-jsx-a11y with the actively maintained fork for ESLint 10 readiness while keeping the same rule coverage. --- eslint/__snapshots__/typescript-react.json | 360 +++++++++++++++---- eslint/presets/typescript-react.test/App.tsx | 2 +- eslint/rules/react.js | 6 +- package-lock.json | 101 +----- package.json | 3 +- 5 files changed, 310 insertions(+), 162 deletions(-) diff --git a/eslint/__snapshots__/typescript-react.json b/eslint/__snapshots__/typescript-react.json index 45772a5..4af482f 100644 --- a/eslint/__snapshots__/typescript-react.json +++ b/eslint/__snapshots__/typescript-react.json @@ -744,20 +744,55 @@ "implicit-arrow-linebreak": [0], "indent": [0], "indent-legacy": [0], - "jsx-a11y/alt-text": [2], - "jsx-a11y/anchor-ambiguous-text": [0], - "jsx-a11y/anchor-has-content": [2], - "jsx-a11y/anchor-is-valid": [2], - "jsx-a11y/aria-activedescendant-has-tabindex": [2], - "jsx-a11y/aria-props": [2], - "jsx-a11y/aria-proptypes": [2], - "jsx-a11y/aria-role": [2], - "jsx-a11y/aria-unsupported-elements": [2], - "jsx-a11y/autocomplete-valid": [2], - "jsx-a11y/click-events-have-key-events": [2], - "jsx-a11y/control-has-associated-label": [ + "jsx-a11y-x/alt-text": [ + 2, + { + "elements": ["img", "object", "area", "input[type=\"image\"]"] + } + ], + "jsx-a11y-x/anchor-ambiguous-text": [ + 0, + { + "words": ["click here", "here", "link", "a link", "learn more"] + } + ], + "jsx-a11y-x/anchor-has-content": [ + 2, + { + "components": [] + } + ], + "jsx-a11y-x/anchor-is-valid": [ + 2, + { + "components": [], + "specialLink": [], + "aspects": ["noHref", "invalidHref", "preferButton"] + } + ], + "jsx-a11y-x/aria-activedescendant-has-tabindex": [2], + "jsx-a11y-x/aria-props": [2], + "jsx-a11y-x/aria-proptypes": [2], + "jsx-a11y-x/aria-role": [ + 2, + { + "allowedInvalidRoles": [], + "ignoreNonDOM": false + } + ], + "jsx-a11y-x/aria-unsupported-elements": [2], + "jsx-a11y-x/autocomplete-valid": [ + 2, + { + "inputComponents": [] + } + ], + "jsx-a11y-x/click-events-have-key-events": [2], + "jsx-a11y-x/control-has-associated-label": [ 0, { + "labelAttributes": [], + "controlComponents": [], "ignoreElements": [ "audio", "canvas", @@ -782,11 +817,22 @@ "includeRoles": ["alert", "dialog"] } ], - "jsx-a11y/heading-has-content": [2], - "jsx-a11y/html-has-lang": [2], - "jsx-a11y/iframe-has-title": [2], - "jsx-a11y/img-redundant-alt": [2], - "jsx-a11y/interactive-supports-focus": [ + "jsx-a11y-x/heading-has-content": [ + 2, + { + "components": [] + } + ], + "jsx-a11y-x/html-has-lang": [2], + "jsx-a11y-x/iframe-has-title": [2], + "jsx-a11y-x/img-redundant-alt": [ + 2, + { + "components": [], + "words": [] + } + ], + "jsx-a11y-x/interactive-supports-focus": [ 2, { "tabbable": [ @@ -802,29 +848,89 @@ ] } ], - "jsx-a11y/label-has-associated-control": [2], - "jsx-a11y/label-has-for": [0], - "jsx-a11y/media-has-caption": [2], - "jsx-a11y/mouse-events-have-key-events": [2], - "jsx-a11y/no-access-key": [2], - "jsx-a11y/no-autofocus": [2], - "jsx-a11y/no-distracting-elements": [2], - "jsx-a11y/no-interactive-element-to-noninteractive-role": [ + "jsx-a11y-x/label-has-associated-control": [ + 2, + { + "labelComponents": [], + "labelAttributes": [], + "controlComponents": [], + "assert": "either", + "depth": 2 + } + ], + "jsx-a11y-x/label-has-for": [0], + "jsx-a11y-x/media-has-caption": [ + 2, + { + "audio": [], + "video": [], + "track": [] + } + ], + "jsx-a11y-x/mouse-events-have-key-events": [ + 2, + { + "hoverInHandlers": ["onMouseOver"], + "hoverOutHandlers": ["onMouseOut"] + } + ], + "jsx-a11y-x/no-access-key": [2], + "jsx-a11y-x/no-autofocus": [ + 2, + { + "ignoreNonDOM": false + } + ], + "jsx-a11y-x/no-distracting-elements": [ + 2, + { + "elements": ["marquee", "blink"] + } + ], + "jsx-a11y-x/no-interactive-element-to-noninteractive-role": [ 2, { "tr": ["none", "presentation"], "canvas": ["img"] } ], - "jsx-a11y/no-noninteractive-element-interactions": [ + "jsx-a11y-x/no-noninteractive-element-interactions": [ 2, { + "handlers": [ + "onFocus", + "onBlur", + "onLoad", + "onError", + "onKeyDown", + "onKeyPress", + "onKeyUp", + "onClick", + "onContextMenu", + "onDblClick", + "onDoubleClick", + "onDrag", + "onDragEnd", + "onDragEnter", + "onDragExit", + "onDragLeave", + "onDragOver", + "onDragStart", + "onDrop", + "onMouseDown", + "onMouseEnter", + "onMouseLeave", + "onMouseMove", + "onMouseOut", + "onMouseOver", + "onMouseUp" + ], "body": ["onError", "onLoad"], "iframe": ["onError", "onLoad"], "img": ["onError", "onLoad"] } ], - "jsx-a11y/no-noninteractive-element-to-interactive-role": [ + "jsx-a11y-x/no-noninteractive-element-to-interactive-role": [ 2, { "ul": [ @@ -859,19 +965,18 @@ "fieldset": ["radiogroup", "presentation"] } ], - "jsx-a11y/no-noninteractive-tabindex": [ + "jsx-a11y-x/no-noninteractive-tabindex": [ 2, { - "tags": [], "roles": ["tabpanel"], + "tags": [], "allowExpressionValues": true } ], - "jsx-a11y/no-redundant-roles": [2], - "jsx-a11y/no-static-element-interactions": [ + "jsx-a11y-x/no-redundant-roles": [2, {}], + "jsx-a11y-x/no-static-element-interactions": [ 2, { - "allowExpressionValues": true, "handlers": [ "onClick", "onMouseDown", @@ -879,13 +984,14 @@ "onKeyPress", "onKeyDown", "onKeyUp" - ] + ], + "allowExpressionValues": true } ], - "jsx-a11y/role-has-required-aria-props": [2], - "jsx-a11y/role-supports-aria-props": [2], - "jsx-a11y/scope": [2], - "jsx-a11y/tabindex-no-positive": [2], + "jsx-a11y-x/role-has-required-aria-props": [2], + "jsx-a11y-x/role-supports-aria-props": [2], + "jsx-a11y-x/scope": [2], + "jsx-a11y-x/tabindex-no-positive": [2], "jsx-quotes": [0], "key-spacing": [0], "keyword-spacing": [0], @@ -4241,20 +4347,55 @@ "implicit-arrow-linebreak": [0], "indent": [0], "indent-legacy": [0], - "jsx-a11y/alt-text": [2], - "jsx-a11y/anchor-ambiguous-text": [0], - "jsx-a11y/anchor-has-content": [2], - "jsx-a11y/anchor-is-valid": [2], - "jsx-a11y/aria-activedescendant-has-tabindex": [2], - "jsx-a11y/aria-props": [2], - "jsx-a11y/aria-proptypes": [2], - "jsx-a11y/aria-role": [2], - "jsx-a11y/aria-unsupported-elements": [2], - "jsx-a11y/autocomplete-valid": [2], - "jsx-a11y/click-events-have-key-events": [2], - "jsx-a11y/control-has-associated-label": [ + "jsx-a11y-x/alt-text": [ + 2, + { + "elements": ["img", "object", "area", "input[type=\"image\"]"] + } + ], + "jsx-a11y-x/anchor-ambiguous-text": [ + 0, + { + "words": ["click here", "here", "link", "a link", "learn more"] + } + ], + "jsx-a11y-x/anchor-has-content": [ + 2, + { + "components": [] + } + ], + "jsx-a11y-x/anchor-is-valid": [ + 2, + { + "components": [], + "specialLink": [], + "aspects": ["noHref", "invalidHref", "preferButton"] + } + ], + "jsx-a11y-x/aria-activedescendant-has-tabindex": [2], + "jsx-a11y-x/aria-props": [2], + "jsx-a11y-x/aria-proptypes": [2], + "jsx-a11y-x/aria-role": [ + 2, + { + "allowedInvalidRoles": [], + "ignoreNonDOM": false + } + ], + "jsx-a11y-x/aria-unsupported-elements": [2], + "jsx-a11y-x/autocomplete-valid": [ + 2, + { + "inputComponents": [] + } + ], + "jsx-a11y-x/click-events-have-key-events": [2], + "jsx-a11y-x/control-has-associated-label": [ 0, { + "labelAttributes": [], + "controlComponents": [], "ignoreElements": [ "audio", "canvas", @@ -4279,11 +4420,22 @@ "includeRoles": ["alert", "dialog"] } ], - "jsx-a11y/heading-has-content": [2], - "jsx-a11y/html-has-lang": [2], - "jsx-a11y/iframe-has-title": [2], - "jsx-a11y/img-redundant-alt": [2], - "jsx-a11y/interactive-supports-focus": [ + "jsx-a11y-x/heading-has-content": [ + 2, + { + "components": [] + } + ], + "jsx-a11y-x/html-has-lang": [2], + "jsx-a11y-x/iframe-has-title": [2], + "jsx-a11y-x/img-redundant-alt": [ + 2, + { + "components": [], + "words": [] + } + ], + "jsx-a11y-x/interactive-supports-focus": [ 2, { "tabbable": [ @@ -4299,29 +4451,89 @@ ] } ], - "jsx-a11y/label-has-associated-control": [2], - "jsx-a11y/label-has-for": [0], - "jsx-a11y/media-has-caption": [2], - "jsx-a11y/mouse-events-have-key-events": [2], - "jsx-a11y/no-access-key": [2], - "jsx-a11y/no-autofocus": [2], - "jsx-a11y/no-distracting-elements": [2], - "jsx-a11y/no-interactive-element-to-noninteractive-role": [ + "jsx-a11y-x/label-has-associated-control": [ + 2, + { + "labelComponents": [], + "labelAttributes": [], + "controlComponents": [], + "assert": "either", + "depth": 2 + } + ], + "jsx-a11y-x/label-has-for": [0], + "jsx-a11y-x/media-has-caption": [ + 2, + { + "audio": [], + "video": [], + "track": [] + } + ], + "jsx-a11y-x/mouse-events-have-key-events": [ + 2, + { + "hoverInHandlers": ["onMouseOver"], + "hoverOutHandlers": ["onMouseOut"] + } + ], + "jsx-a11y-x/no-access-key": [2], + "jsx-a11y-x/no-autofocus": [ + 2, + { + "ignoreNonDOM": false + } + ], + "jsx-a11y-x/no-distracting-elements": [ + 2, + { + "elements": ["marquee", "blink"] + } + ], + "jsx-a11y-x/no-interactive-element-to-noninteractive-role": [ 2, { "tr": ["none", "presentation"], "canvas": ["img"] } ], - "jsx-a11y/no-noninteractive-element-interactions": [ + "jsx-a11y-x/no-noninteractive-element-interactions": [ 2, { + "handlers": [ + "onFocus", + "onBlur", + "onLoad", + "onError", + "onKeyDown", + "onKeyPress", + "onKeyUp", + "onClick", + "onContextMenu", + "onDblClick", + "onDoubleClick", + "onDrag", + "onDragEnd", + "onDragEnter", + "onDragExit", + "onDragLeave", + "onDragOver", + "onDragStart", + "onDrop", + "onMouseDown", + "onMouseEnter", + "onMouseLeave", + "onMouseMove", + "onMouseOut", + "onMouseOver", + "onMouseUp" + ], "body": ["onError", "onLoad"], "iframe": ["onError", "onLoad"], "img": ["onError", "onLoad"] } ], - "jsx-a11y/no-noninteractive-element-to-interactive-role": [ + "jsx-a11y-x/no-noninteractive-element-to-interactive-role": [ 2, { "ul": [ @@ -4356,19 +4568,18 @@ "fieldset": ["radiogroup", "presentation"] } ], - "jsx-a11y/no-noninteractive-tabindex": [ + "jsx-a11y-x/no-noninteractive-tabindex": [ 2, { - "tags": [], "roles": ["tabpanel"], + "tags": [], "allowExpressionValues": true } ], - "jsx-a11y/no-redundant-roles": [2], - "jsx-a11y/no-static-element-interactions": [ + "jsx-a11y-x/no-redundant-roles": [2, {}], + "jsx-a11y-x/no-static-element-interactions": [ 2, { - "allowExpressionValues": true, "handlers": [ "onClick", "onMouseDown", @@ -4376,13 +4587,14 @@ "onKeyPress", "onKeyDown", "onKeyUp" - ] + ], + "allowExpressionValues": true } ], - "jsx-a11y/role-has-required-aria-props": [2], - "jsx-a11y/role-supports-aria-props": [2], - "jsx-a11y/scope": [2], - "jsx-a11y/tabindex-no-positive": [2], + "jsx-a11y-x/role-has-required-aria-props": [2], + "jsx-a11y-x/role-supports-aria-props": [2], + "jsx-a11y-x/scope": [2], + "jsx-a11y-x/tabindex-no-positive": [2], "jsx-quotes": [0], "key-spacing": [0], "keyword-spacing": [0], diff --git a/eslint/presets/typescript-react.test/App.tsx b/eslint/presets/typescript-react.test/App.tsx index 1342e94..fc96a13 100644 --- a/eslint/presets/typescript-react.test/App.tsx +++ b/eslint/presets/typescript-react.test/App.tsx @@ -21,7 +21,7 @@ export const App = (_props: { name: string; count: number }) => { return ( <> - {/* eslint-disable-next-line jsx-a11y/alt-text */} + {/* eslint-disable-next-line jsx-a11y-x/alt-text */} {/* eslint-disable-next-line react/jsx-curly-brace-presence */} {"Hello world"} diff --git a/eslint/rules/react.js b/eslint/rules/react.js index 70cce75..e9393dc 100644 --- a/eslint/rules/react.js +++ b/eslint/rules/react.js @@ -1,5 +1,5 @@ import reactPlugin2 from "@eslint-react/eslint-plugin"; -import jsxA11yPlugin from "eslint-plugin-jsx-a11y"; +import jsxA11yPlugin from "eslint-plugin-jsx-a11y-x"; import reactPlugin from "eslint-plugin-react"; import reactHooksPlugin from "eslint-plugin-react-hooks"; import reactRefreshPlugin from "eslint-plugin-react-refresh"; @@ -35,11 +35,11 @@ export const react = [ files, }, { - ...jsxA11yPlugin.flatConfigs.recommended, + ...jsxA11yPlugin.configs.recommended, files, }, { - ...jsxA11yPlugin.flatConfigs.strict, + ...jsxA11yPlugin.configs.strict, files, }, { diff --git a/package-lock.json b/package-lock.json index 64d572e..53b371b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,10 +19,9 @@ "@semantic-release/exec": "^7.1.0", "@tanstack/eslint-plugin-query": "^5.101.0", "@types/eslint-config-prettier": "^6.11.3", - "@types/eslint-plugin-jsx-a11y": "^6.10.1", "@vitest/eslint-plugin": "^1.6.14", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-jsx-a11y-x": "^0.2.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-playwright": "^2.10.1", "eslint-plugin-prefer-arrow": "^1.2.3", @@ -2341,15 +2340,6 @@ "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", "license": "MIT" }, - "node_modules/@types/eslint-plugin-jsx-a11y": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@types/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz", - "integrity": "sha512-5RtuPVe0xz8BAhrkn2oww6Uw885atf962Q4fqZo48QdO3EQA7oCEDSXa6optgJ1ZMds3HD9ITK5bfm4AWuoXFQ==", - "license": "MIT", - "dependencies": { - "eslint": "^9" - } - }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -3007,12 +2997,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "license": "MIT" - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -4109,12 +4093,6 @@ "integrity": "sha512-v/qV5aV5EUA2pGilzUCq5/eyOloZAqDZBu9UMBIzgPpLlprjSR6zswsWBTv0KpqxLGUAZEwhO95ZCt7srymNVA==", "license": "ISC" }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", @@ -4559,61 +4537,25 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "node_modules/eslint-plugin-jsx-a11y-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y-x/-/eslint-plugin-jsx-a11y-x-0.2.0.tgz", + "integrity": "sha512-O/VpKt2G38VCMlBgGCH8eJGWXM05z892zGKeuPfPATMPLDZOWeVtKS8SBt98ElaeFRKcJEv2bELub+Llo3m9zw==", "license": "MIT", "dependencies": { "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", + "axe-core": "^4.10.2", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", + "jsx-ast-utils-x": "^0.1.0", "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" + "minimatch": "^10.2.5" }, "engines": { - "node": ">=4.0" + "node": "^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-no-only-tests": { @@ -6723,6 +6665,15 @@ "node": ">=4.0" } }, + "node_modules/jsx-ast-utils-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", + "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11769,20 +11720,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", diff --git a/package.json b/package.json index 35f0dcd..4fa7e0d 100644 --- a/package.json +++ b/package.json @@ -92,10 +92,9 @@ "@semantic-release/exec": "^7.1.0", "@tanstack/eslint-plugin-query": "^5.101.0", "@types/eslint-config-prettier": "^6.11.3", - "@types/eslint-plugin-jsx-a11y": "^6.10.1", "@vitest/eslint-plugin": "^1.6.14", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-jsx-a11y-x": "^0.2.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-playwright": "^2.10.1", "eslint-plugin-prefer-arrow": "^1.2.3", From 4007f8818c5185c1e22b64e54d6f6d3ea8217214 Mon Sep 17 00:00:00 2001 From: Johannes Ewald Date: Mon, 13 Jul 2026 10:36:42 +0200 Subject: [PATCH 2/3] docs(ai): add comment style and commit message conventions Restrict block comments to JSDoc-only usage and require Conventional Commits for commit messages. Co-Authored-By: Claude Sonnet 5 --- ai/coding-styleguide-js-ts.mdc | 1 + ai/rules.mdc | 1 + 2 files changed, 2 insertions(+) diff --git a/ai/coding-styleguide-js-ts.mdc b/ai/coding-styleguide-js-ts.mdc index 60e05a6..a974c8a 100644 --- a/ai/coding-styleguide-js-ts.mdc +++ b/ai/coding-styleguide-js-ts.mdc @@ -105,6 +105,7 @@ globs: **/*.js, **/*.ts, **/*.mjs, **/*.cjs, **/*.mts, **/*.cts - Use comments to explain why, invariants, constraints, and non-obvious trade-offs - Do not write comments that only restate what the code already makes obvious - Add short contract comments only for complex or high-impact exports. Focus on purpose, guarantees, and important caveats. +- **Comments:** no bare `/* */` block comments. Use `//` for inline notes; use JSDoc (`/** */`) for file-level comments (with `@file`) and when documenting an exported symbol, prop, or function. ## Testing diff --git a/ai/rules.mdc b/ai/rules.mdc index 9f5c3eb..838d5d3 100644 --- a/ai/rules.mdc +++ b/ai/rules.mdc @@ -45,6 +45,7 @@ See [Coding Styleguide Shell Scripts](./coding-styleguide-sh.mdc) - Write integration or e2e tests for more complex functions/classes/components - Prefer staged validation for non-trivial tasks: run focused checks after meaningful changes, then run broader lint/type/test checks before handoff. For trivial tasks, a single final validation is acceptable. - Adjust documentation both in comments and markdown files once you're done +- Use [Conventional Commits](https://www.conventionalcommits.org/) for commit messages ## Consumer-repo uncertainty protocol From b71013fbfffcc24eb6bb314acef094284cef57e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 08:43:16 +0000 Subject: [PATCH 3/3] chore(deps-dev): bump eslint from 9.39.4 to 10.6.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.39.4 to 10.6.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.39.4...v10.6.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 296 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 66 insertions(+), 232 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53b371b..e9541a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "@types/node": "^26.0.0", "@types/react": "^19.2.14", "@types/signale": "^1.4.7", - "eslint": "^9.39.1", + "eslint": "^10.6.0", "husky": "^9.1.7", "lint-staged": "^17.0.8", "npm-run-all2": "^9.0.2", @@ -61,7 +61,7 @@ "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^9.38.0", + "eslint": "^10.6.0", "prettier": "^3.6.2", "semantic-release": "^25.0.1", "typescript": ">=6.0.0" @@ -684,69 +684,29 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.5" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { @@ -761,69 +721,6 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", @@ -837,37 +734,25 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { @@ -2340,6 +2225,12 @@ "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", "license": "MIT" }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -4464,32 +4355,32 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz", + "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==", "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", - "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -4499,8 +4390,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -4508,7 +4398,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -4905,16 +4795,18 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4932,82 +4824,42 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6866,12 +6718,6 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", @@ -11862,18 +11708,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/super-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", diff --git a/package.json b/package.json index 4fa7e0d..2c2acfc 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "@types/node": "^26.0.0", "@types/react": "^19.2.14", "@types/signale": "^1.4.7", - "eslint": "^9.39.1", + "eslint": "^10.6.0", "husky": "^9.1.7", "lint-staged": "^17.0.8", "npm-run-all2": "^9.0.2",