diff --git a/eslint.config.mjs b/eslint.config.mjs index 6d4f31d11..55644cd03 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,5 @@ import antfu from '@antfu/eslint-config' +import pluginVueA11y from 'eslint-plugin-vuejs-accessibility' export default antfu( { @@ -50,6 +51,18 @@ export default antfu( 'unused-imports/no-unused-vars': 'off', }, }, + { + files: ['packages/core/src/**/*.vue'], + plugins: { + 'vuejs-accessibility': pluginVueA11y, + }, + // Adopt the recommended preset at `warn` while existing violations are + // fixed incrementally; flip to `error` once the codebase is clean. + rules: Object.fromEntries( + Object.keys(pluginVueA11y.configs['flat/recommended'][1].rules) + .map(rule => [rule, 'warn']), + ), + }, { files: ['**/package.json'], rules: { diff --git a/package.json b/package.json index 2d0a6c821..8c02206d2 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@commitlint/config-conventional": "^20.0.0", "bumpp": "^11.0.1", "eslint": "^10.2.0", + "eslint-plugin-vuejs-accessibility": "^2.5.0", "lint-staged": "^16.4.0", "simple-git-hooks": "^2.13.1", "tsx": "^4.20.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6ac719a7..906497c65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2)) + version: 8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2)) '@commitlint/cli': specifier: ^20.1.0 version: 20.1.0(@types/node@24.0.13)(typescript@5.8.3) @@ -28,6 +28,9 @@ importers: eslint: specifier: ^10.2.0 version: 10.2.0(jiti@2.6.1) + eslint-plugin-vuejs-accessibility: + specifier: ^2.5.0 + version: 2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0) lint-staged: specifier: ^16.4.0 version: 16.4.0 @@ -61,7 +64,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2)) + version: 8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2)) '@floating-ui/dom': specifier: ^1.6.13 version: 1.6.13 @@ -3686,6 +3689,13 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-vuejs-accessibility@2.5.0: + resolution: {integrity: sha512-oZ2fL4tS91Cm/ezH3BueNP+FtpbbeS627OSqqgp9/lsN//glmoPcLBT6D53xwGocLtyBybaT99tX4ThBh8+ytA==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + globals: '>= 13.12.1' + eslint-plugin-yml@3.3.1: resolution: {integrity: sha512-isntsZchaTqDMNNkD+CakrgA/pdUoJ45USWBKpuqfAW1MCuw731xX/vrXfoJFZU3tTFr24nCbDYmDfT2+g4QtQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -7339,7 +7349,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 - '@antfu/eslint-config@8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2))': + '@antfu/eslint-config@8.0.0(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@typescript-eslint/typescript-estree@8.58.0(typescript@5.8.3))(@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.17)(eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0))(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.2))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 1.2.0 @@ -7378,6 +7388,8 @@ snapshots: toml-eslint-parser: 1.0.3 vue-eslint-parser: 10.4.0(eslint@10.2.0(jiti@2.6.1)) yaml-eslint-parser: 2.0.0 + optionalDependencies: + eslint-plugin-vuejs-accessibility: 2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0) transitivePeerDependencies: - '@eslint/json' - '@typescript-eslint/rule-tester' @@ -7613,7 +7625,7 @@ snapshots: '@commitlint/is-ignored@20.0.0': dependencies: '@commitlint/types': 20.0.0 - semver: 7.7.4 + semver: 7.8.0 '@commitlint/lint@20.0.0': dependencies: @@ -9001,7 +9013,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.0 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@5.8.3) typescript: 5.8.3 @@ -10320,7 +10332,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.4 + semver: 7.8.0 ee-first@1.1.1: {} @@ -10534,7 +10546,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@10.2.0(jiti@2.6.1)): dependencies: eslint: 10.2.0(jiti@2.6.1) - semver: 7.7.4 + semver: 7.8.0 eslint-config-flat-gitignore@2.3.0(eslint@10.2.0(jiti@2.6.1)): dependencies: @@ -10573,7 +10585,7 @@ snapshots: empathic: 2.0.0 eslint: 10.2.0(jiti@2.6.1) module-replacements: 2.11.0 - semver: 7.7.4 + semver: 7.8.0 eslint-plugin-es-x@7.8.0(eslint@10.2.0(jiti@2.6.1)): dependencies: @@ -10720,6 +10732,15 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@10.2.0(jiti@2.6.1)) '@typescript-eslint/parser': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.8.3) + eslint-plugin-vuejs-accessibility@2.5.0(eslint@10.2.0(jiti@2.6.1))(globals@17.4.0): + dependencies: + aria-query: 5.3.0 + eslint: 10.2.0(jiti@2.6.1) + globals: 17.4.0 + vue-eslint-parser: 10.4.0(eslint@10.2.0(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + eslint-plugin-yml@3.3.1(eslint@10.2.0(jiti@2.6.1)): dependencies: '@eslint/core': 1.2.0 @@ -11761,7 +11782,7 @@ snapshots: dependencies: acorn: 8.16.0 eslint-visitor-keys: 5.0.1 - semver: 7.7.4 + semver: 7.8.0 jsonc-parser@3.3.1: {} @@ -11985,7 +12006,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.0 make-fetch-happen@2.6.0: dependencies: @@ -12507,7 +12528,7 @@ snapshots: pkg-types: 1.3.1 postcss: 8.5.14 postcss-nested: 6.2.0(postcss@8.5.14) - semver: 7.7.4 + semver: 7.8.0 optionalDependencies: typescript: 5.8.3 vue-tsc: 2.2.12(typescript@5.8.3) @@ -14594,7 +14615,7 @@ snapshots: eslint-visitor-keys: 5.0.1 espree: 11.2.0 esquery: 1.7.0 - semver: 7.7.4 + semver: 7.8.0 transitivePeerDependencies: - supports-color