Skip to content

Commit

Permalink
Add A11Y rules (#36)
Browse files Browse the repository at this point in the history
* Add A11Y rules

* fix
  • Loading branch information
ota-meshi authored Jun 8, 2022
1 parent 2e8bce2 commit 2b77484
Show file tree
Hide file tree
Showing 66 changed files with 1,455 additions and 17 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
/docs-build/shim/assert.mjs
/docs-build/shim/eslint.mjs
/docs-build/shim/astro-eslint-parser.mjs
/docs-build/shim/eslint-plugin-jsx-a11y.mjs
/tests/fixtures/rules/indent/invalid/ts
/tests/fixtures/rules/indent/invalid/ts-v5
/tests/fixtures/rules/valid-compile/invalid/ts
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,4 @@ dist
/docs-build/shim/assert.mjs
/docs-build/shim/eslint.mjs
/docs-build/shim/astro-eslint-parser.mjs
/docs-build/shim/eslint-plugin-jsx-a11y.mjs
60 changes: 57 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,21 @@ See [documents](https://ota-meshi.github.io/eslint-plugin-astro/).
npm install --save-dev eslint eslint-plugin-astro
```

If you write TypeScript in Astro components, install the `@typescript-eslint/parser` as well:
If you write TypeScript in Astro components, you also need to install the `@typescript-eslint/parser`:

```bash
npm install --save-dev @typescript-eslint/parser
```

If you want to use the rules for checking accessibility (A11Y), you also need to install [eslint-plugin-jsx-a11y] additionally:
(It is used internally in the rules for A11Y.)

```bash
npm install --save-dev eslint-plugin-jsx-a11y
```

[eslint-plugin-jsx-a11y]: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y

> **Requirements**
>
> - ESLint v7.0.0 and above
Expand Down Expand Up @@ -121,7 +130,7 @@ module.exports = {
// Enables global variables available in Astro components.
node: true,
"astro/astro": true,
es2022: true,
es2020: true,
},
// Allows Astro components to be parsed.
parser: "astro-eslint-parser",
Expand All @@ -148,7 +157,7 @@ module.exports = {
files: ["**/*.astro/*.js", "*.astro/*.js"],
env: {
browser: true,
es2022: true,
es2020: true,
},
parserOptions: {
sourceType: "module",
Expand All @@ -174,6 +183,9 @@ This plugin provides configs:
- `plugin:astro/base` ... Minimal configuration to enable correct Astro component linting.
- `plugin:astro/recommended` ... Above, plus rules to prevent errors or unintended behavior.
- `plugin:astro/all` ... Configuration enables all astro rules. It's meant for testing, not for production use because it changes with every minor and major version of the plugin. Use it at your own risk.
- Extension of sharable configuration provided by [eslint-plugin-jsx-a11y]. You need to install [eslint-plugin-jsx-a11y] to use it.
- `plugin:astro/jsx-a11y-recommended` ... Similar to the [`"plugin:jsx-a11y/recommended"` configuration](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y#rule-strictness-in-different-modes), but with the rules extended for Astro components enabled.
- `plugin:astro/jsx-a11y-strict` ... Similar to the [`"plugin:jsx-a11y/strict"` configuration](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y#rule-strictness-in-different-modes), but with the rules extended for Astro components enabled.

See [the rule list](https://ota-meshi.github.io/eslint-plugin-astro/rules/) to get the `rules` that this plugin provides.

Expand Down Expand Up @@ -262,6 +274,47 @@ These rules relate to style guidelines, and are therefore quite subjective:
| [astro/prefer-object-class-list](https://ota-meshi.github.io/eslint-plugin-astro/rules/prefer-object-class-list/) | require use object instead of ternary expression in `class:list` | :wrench: |
| [astro/prefer-split-class-list](https://ota-meshi.github.io/eslint-plugin-astro/rules/prefer-split-class-list/) | require use split array elements in `class:list` | :wrench: |

## A11Y Extension Rules

These rules extend the rules provided by [eslint-plugin-jsx-a11y] to work well in Astro component:
(You need to install [eslint-plugin-jsx-a11y] to use the rules.)

| Rule ID | Description | |
|:--------|:------------|:---|
| [astro/jsx-a11y/alt-text](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/alt-text/) | apply `jsx-a11y/alt-text` rule to Astro components | |
| [astro/jsx-a11y/anchor-has-content](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/anchor-has-content/) | apply `jsx-a11y/anchor-has-content` rule to Astro components | |
| [astro/jsx-a11y/anchor-is-valid](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/anchor-is-valid/) | apply `jsx-a11y/anchor-is-valid` rule to Astro components | |
| [astro/jsx-a11y/aria-activedescendant-has-tabindex](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/aria-activedescendant-has-tabindex/) | apply `jsx-a11y/aria-activedescendant-has-tabindex` rule to Astro components | |
| [astro/jsx-a11y/aria-props](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/aria-props/) | apply `jsx-a11y/aria-props` rule to Astro components | |
| [astro/jsx-a11y/aria-proptypes](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/aria-proptypes/) | apply `jsx-a11y/aria-proptypes` rule to Astro components | |
| [astro/jsx-a11y/aria-role](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/aria-role/) | apply `jsx-a11y/aria-role` rule to Astro components | |
| [astro/jsx-a11y/aria-unsupported-elements](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/aria-unsupported-elements/) | apply `jsx-a11y/aria-unsupported-elements` rule to Astro components | |
| [astro/jsx-a11y/autocomplete-valid](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/autocomplete-valid/) | apply `jsx-a11y/autocomplete-valid` rule to Astro components | |
| [astro/jsx-a11y/click-events-have-key-events](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/click-events-have-key-events/) | apply `jsx-a11y/click-events-have-key-events` rule to Astro components | |
| [astro/jsx-a11y/control-has-associated-label](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/control-has-associated-label/) | apply `jsx-a11y/control-has-associated-label` rule to Astro components | |
| [astro/jsx-a11y/heading-has-content](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/heading-has-content/) | apply `jsx-a11y/heading-has-content` rule to Astro components | |
| [astro/jsx-a11y/html-has-lang](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/html-has-lang/) | apply `jsx-a11y/html-has-lang` rule to Astro components | |
| [astro/jsx-a11y/iframe-has-title](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/iframe-has-title/) | apply `jsx-a11y/iframe-has-title` rule to Astro components | |
| [astro/jsx-a11y/img-redundant-alt](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/img-redundant-alt/) | apply `jsx-a11y/img-redundant-alt` rule to Astro components | |
| [astro/jsx-a11y/interactive-supports-focus](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/interactive-supports-focus/) | apply `jsx-a11y/interactive-supports-focus` rule to Astro components | |
| [astro/jsx-a11y/label-has-associated-control](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/label-has-associated-control/) | apply `jsx-a11y/label-has-associated-control` rule to Astro components | |
| [astro/jsx-a11y/lang](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/lang/) | apply `jsx-a11y/lang` rule to Astro components | |
| [astro/jsx-a11y/media-has-caption](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/media-has-caption/) | apply `jsx-a11y/media-has-caption` rule to Astro components | |
| [astro/jsx-a11y/mouse-events-have-key-events](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/mouse-events-have-key-events/) | apply `jsx-a11y/mouse-events-have-key-events` rule to Astro components | |
| [astro/jsx-a11y/no-access-key](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-access-key/) | apply `jsx-a11y/no-access-key` rule to Astro components | |
| [astro/jsx-a11y/no-autofocus](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-autofocus/) | apply `jsx-a11y/no-autofocus` rule to Astro components | |
| [astro/jsx-a11y/no-distracting-elements](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-distracting-elements/) | apply `jsx-a11y/no-distracting-elements` rule to Astro components | |
| [astro/jsx-a11y/no-interactive-element-to-noninteractive-role](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-interactive-element-to-noninteractive-role/) | apply `jsx-a11y/no-interactive-element-to-noninteractive-role` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-element-interactions](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-noninteractive-element-interactions/) | apply `jsx-a11y/no-noninteractive-element-interactions` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-element-to-interactive-role](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-noninteractive-element-to-interactive-role/) | apply `jsx-a11y/no-noninteractive-element-to-interactive-role` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-tabindex](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-noninteractive-tabindex/) | apply `jsx-a11y/no-noninteractive-tabindex` rule to Astro components | |
| [astro/jsx-a11y/no-redundant-roles](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-redundant-roles/) | apply `jsx-a11y/no-redundant-roles` rule to Astro components | |
| [astro/jsx-a11y/no-static-element-interactions](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/no-static-element-interactions/) | apply `jsx-a11y/no-static-element-interactions` rule to Astro components | |
| [astro/jsx-a11y/role-has-required-aria-props](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/role-has-required-aria-props/) | apply `jsx-a11y/role-has-required-aria-props` rule to Astro components | |
| [astro/jsx-a11y/role-supports-aria-props](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/role-supports-aria-props/) | apply `jsx-a11y/role-supports-aria-props` rule to Astro components | |
| [astro/jsx-a11y/scope](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/scope/) | apply `jsx-a11y/scope` rule to Astro components | |
| [astro/jsx-a11y/tabindex-no-positive](https://ota-meshi.github.io/eslint-plugin-astro/rules/jsx-a11y/tabindex-no-positive/) | apply `jsx-a11y/tabindex-no-positive` rule to Astro components | |

<!--RULES_TABLE_END-->
<!--RULES_SECTION_END-->

Expand Down Expand Up @@ -297,3 +350,4 @@ See the [LICENSE](LICENSE) file for license rights and limitations (MIT).
[astro]: https://astro.build/
[eslint]: https://eslint.org/
[astro components]: https://docs.astro.build/en/core-concepts/astro-components/
[eslint-plugin-jsx-a11y]: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y
4 changes: 4 additions & 0 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ export default defineConfig({
dirname,
"./docs-build/shim/astro-eslint-parser.mjs",
),
"eslint-plugin-jsx-a11y": path.join(
dirname,
"./docs-build/shim/eslint-plugin-jsx-a11y.mjs",
),
[path.join(
dirname,
"./node_modules/astro-eslint-parser/lib/parser/astro-parser/astrojs-compiler-service.js",
Expand Down
4 changes: 4 additions & 0 deletions docs-build/build-system/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ build(
),
],
)
build(
require.resolve("./src/eslint-plugin-jsx-a11y.mjs"),
path.join(__dirname, "../shim/eslint-plugin-jsx-a11y.mjs"),
)

/** build */
function build(input, out, injects = []) {
Expand Down
5 changes: 5 additions & 0 deletions docs-build/build-system/src/eslint-plugin-jsx-a11y.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/* eslint require-jsdoc:0 -- shim */

import * as all from "../../../node_modules/eslint-plugin-jsx-a11y"
export const rules = all.rules
export default all
4 changes: 4 additions & 0 deletions docs-build/src/components/ESLintCodeBlock.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
if (typeof window !== "undefined") {
window.require.define("@typescript-eslint/parser", parser)
}
const pluginJsxA11y = await import("eslint-plugin-jsx-a11y")
if (typeof window !== "undefined") {
window.require.define("eslint-plugin-jsx-a11y", pluginJsxA11y)
}
return window.waitSetupForAstroCompilerWasm
})
.then(() => {
Expand Down
4 changes: 4 additions & 0 deletions docs-build/src/components/ESLintPlayground.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
if (typeof window !== "undefined") {
window.require.define("@typescript-eslint/parser", parser)
}
const pluginJsxA11y = await import("eslint-plugin-jsx-a11y")
if (typeof window !== "undefined") {
window.require.define("eslint-plugin-jsx-a11y", pluginJsxA11y)
}
return window.waitSetupForAstroCompilerWasm
})
.then(() => {
Expand Down
5 changes: 5 additions & 0 deletions docs-build/src/components/eslint/scripts/linter.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ export const categories = [
classes: "astro-category",
rules: [],
},
{
title: "A11Y Extension Rules",
classes: "astro-category",
rules: [],
},
{
title: "Extension Rules",
classes: "astro-category",
Expand Down
1 change: 1 addition & 0 deletions docs-build/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const categories = [
"Security Vulnerability",
"Best Practices",
"Stylistic Issues",
"A11Y Extension Rules",
"Extension Rules",
"System",
] as const
Expand Down
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ See the [LICENSE](https://github.com/ota-meshi/eslint-plugin-astro/blob/main/LIC
[astro]: https://astro.build/
[eslint]: https://eslint.org/
[astro components]: https://docs.astro.build/en/core-concepts/astro-components/
[eslint-plugin-jsx-a11y]: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y
43 changes: 43 additions & 0 deletions docs/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,46 @@ These rules relate to style guidelines, and are therefore quite subjective:
| [astro/prefer-class-list-directive](./rules/prefer-class-list-directive.md) | require `class:list` directives instead of `class` with expressions | :wrench: |
| [astro/prefer-object-class-list](./rules/prefer-object-class-list.md) | require use object instead of ternary expression in `class:list` | :wrench: |
| [astro/prefer-split-class-list](./rules/prefer-split-class-list.md) | require use split array elements in `class:list` | :wrench: |

## A11Y Extension Rules

These rules extend the rules provided by [eslint-plugin-jsx-a11y] to work well in Astro component:
(You need to install [eslint-plugin-jsx-a11y] to use the rules.)

| Rule ID | Description | |
|:--------|:------------|:---|
| [astro/jsx-a11y/alt-text](./rules/jsx-a11y/alt-text.md) | apply `jsx-a11y/alt-text` rule to Astro components | |
| [astro/jsx-a11y/anchor-has-content](./rules/jsx-a11y/anchor-has-content.md) | apply `jsx-a11y/anchor-has-content` rule to Astro components | |
| [astro/jsx-a11y/anchor-is-valid](./rules/jsx-a11y/anchor-is-valid.md) | apply `jsx-a11y/anchor-is-valid` rule to Astro components | |
| [astro/jsx-a11y/aria-activedescendant-has-tabindex](./rules/jsx-a11y/aria-activedescendant-has-tabindex.md) | apply `jsx-a11y/aria-activedescendant-has-tabindex` rule to Astro components | |
| [astro/jsx-a11y/aria-props](./rules/jsx-a11y/aria-props.md) | apply `jsx-a11y/aria-props` rule to Astro components | |
| [astro/jsx-a11y/aria-proptypes](./rules/jsx-a11y/aria-proptypes.md) | apply `jsx-a11y/aria-proptypes` rule to Astro components | |
| [astro/jsx-a11y/aria-role](./rules/jsx-a11y/aria-role.md) | apply `jsx-a11y/aria-role` rule to Astro components | |
| [astro/jsx-a11y/aria-unsupported-elements](./rules/jsx-a11y/aria-unsupported-elements.md) | apply `jsx-a11y/aria-unsupported-elements` rule to Astro components | |
| [astro/jsx-a11y/autocomplete-valid](./rules/jsx-a11y/autocomplete-valid.md) | apply `jsx-a11y/autocomplete-valid` rule to Astro components | |
| [astro/jsx-a11y/click-events-have-key-events](./rules/jsx-a11y/click-events-have-key-events.md) | apply `jsx-a11y/click-events-have-key-events` rule to Astro components | |
| [astro/jsx-a11y/control-has-associated-label](./rules/jsx-a11y/control-has-associated-label.md) | apply `jsx-a11y/control-has-associated-label` rule to Astro components | |
| [astro/jsx-a11y/heading-has-content](./rules/jsx-a11y/heading-has-content.md) | apply `jsx-a11y/heading-has-content` rule to Astro components | |
| [astro/jsx-a11y/html-has-lang](./rules/jsx-a11y/html-has-lang.md) | apply `jsx-a11y/html-has-lang` rule to Astro components | |
| [astro/jsx-a11y/iframe-has-title](./rules/jsx-a11y/iframe-has-title.md) | apply `jsx-a11y/iframe-has-title` rule to Astro components | |
| [astro/jsx-a11y/img-redundant-alt](./rules/jsx-a11y/img-redundant-alt.md) | apply `jsx-a11y/img-redundant-alt` rule to Astro components | |
| [astro/jsx-a11y/interactive-supports-focus](./rules/jsx-a11y/interactive-supports-focus.md) | apply `jsx-a11y/interactive-supports-focus` rule to Astro components | |
| [astro/jsx-a11y/label-has-associated-control](./rules/jsx-a11y/label-has-associated-control.md) | apply `jsx-a11y/label-has-associated-control` rule to Astro components | |
| [astro/jsx-a11y/lang](./rules/jsx-a11y/lang.md) | apply `jsx-a11y/lang` rule to Astro components | |
| [astro/jsx-a11y/media-has-caption](./rules/jsx-a11y/media-has-caption.md) | apply `jsx-a11y/media-has-caption` rule to Astro components | |
| [astro/jsx-a11y/mouse-events-have-key-events](./rules/jsx-a11y/mouse-events-have-key-events.md) | apply `jsx-a11y/mouse-events-have-key-events` rule to Astro components | |
| [astro/jsx-a11y/no-access-key](./rules/jsx-a11y/no-access-key.md) | apply `jsx-a11y/no-access-key` rule to Astro components | |
| [astro/jsx-a11y/no-autofocus](./rules/jsx-a11y/no-autofocus.md) | apply `jsx-a11y/no-autofocus` rule to Astro components | |
| [astro/jsx-a11y/no-distracting-elements](./rules/jsx-a11y/no-distracting-elements.md) | apply `jsx-a11y/no-distracting-elements` rule to Astro components | |
| [astro/jsx-a11y/no-interactive-element-to-noninteractive-role](./rules/jsx-a11y/no-interactive-element-to-noninteractive-role.md) | apply `jsx-a11y/no-interactive-element-to-noninteractive-role` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-element-interactions](./rules/jsx-a11y/no-noninteractive-element-interactions.md) | apply `jsx-a11y/no-noninteractive-element-interactions` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-element-to-interactive-role](./rules/jsx-a11y/no-noninteractive-element-to-interactive-role.md) | apply `jsx-a11y/no-noninteractive-element-to-interactive-role` rule to Astro components | |
| [astro/jsx-a11y/no-noninteractive-tabindex](./rules/jsx-a11y/no-noninteractive-tabindex.md) | apply `jsx-a11y/no-noninteractive-tabindex` rule to Astro components | |
| [astro/jsx-a11y/no-redundant-roles](./rules/jsx-a11y/no-redundant-roles.md) | apply `jsx-a11y/no-redundant-roles` rule to Astro components | |
| [astro/jsx-a11y/no-static-element-interactions](./rules/jsx-a11y/no-static-element-interactions.md) | apply `jsx-a11y/no-static-element-interactions` rule to Astro components | |
| [astro/jsx-a11y/role-has-required-aria-props](./rules/jsx-a11y/role-has-required-aria-props.md) | apply `jsx-a11y/role-has-required-aria-props` rule to Astro components | |
| [astro/jsx-a11y/role-supports-aria-props](./rules/jsx-a11y/role-supports-aria-props.md) | apply `jsx-a11y/role-supports-aria-props` rule to Astro components | |
| [astro/jsx-a11y/scope](./rules/jsx-a11y/scope.md) | apply `jsx-a11y/scope` rule to Astro components | |
| [astro/jsx-a11y/tabindex-no-positive](./rules/jsx-a11y/tabindex-no-positive.md) | apply `jsx-a11y/tabindex-no-positive` rule to Astro components | |

[eslint-plugin-jsx-a11y]: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y
24 changes: 24 additions & 0 deletions docs/rules/jsx-a11y/alt-text.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
title: "astro/jsx-a11y/alt-text"
description: "apply `jsx-a11y/alt-text` rule to Astro components"
setup: "import ESLintCodeBlock from '../docs-build/src/components/ESLintCodeBlockWrap.astro'"
---

# astro/jsx-a11y/alt-text

> apply `jsx-a11y/alt-text` rule to Astro components
- :exclamation: <badge text="This rule has not been released yet." vertical="middle" type="error"> **_This rule has not been released yet._** </badge>

This rule is the same rule as [jsx-a11y/alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md) rule but it applies to the Astro components.

## :books: Further Reading

- [jsx-a11y/alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md)

## :mag: Implementation

- [Rule source](https://github.com/ota-meshi/eslint-plugin-astro/blob/main/src/rules/jsx-a11y/alt-text.ts)
- [Test source](https://github.com/ota-meshi/eslint-plugin-astro/blob/main/tests/src/rules/jsx-a11y/alt-text.ts)

<sup>Taken with ❤️ [from eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md)</sup>
Loading

0 comments on commit 2b77484

Please sign in to comment.