Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable rules from eslint-plugin-jsx-a11y in @khanacademy/eslint-config/a11y #1118

Merged
merged 10 commits into from
Feb 11, 2025

Conversation

beaesguerra
Copy link
Member

@beaesguerra beaesguerra commented Feb 5, 2025

Summary:

This work is part of the implementation of ADR#781 Enabling more lint rules for accessibility

These changes includes:

  • Updating the eslint-plugin-jsx-a11y dependency
  • Configuring rules and settings (including custom component mapping, attribute mapping, polymorphic components) for eslint-plugin-jsx-a11y based on the proposed rules and settings in the ADR and the POC
  • Updating the README to include instructions for using @khanacademy/eslint-config/a11y

Issue: FEI-1133

Implementation Plan:

Test plan:

Testing the new config locally:

  • Run yarn pack in packages/eslint-config-khan. This will create a .tgz file in the directory
  • In another project, install the package: ex: yarn add -D -W /Users/beaesguerra/khan/wonder-stuff/packages/eslint-config-khan/khanacademy-eslint-config-v5.1.0.tgz
    • Note: you might need to remove the node_modules first to make sure it installed the correct package. You can check by checking node_modules/@khanacademy/eslint-config/a11y.js in the project to see if the new config is there
  • Make sure the project already extends @khanacademy/eslint-config/a11y in the project's eslint config file
  • Run yarn lint/pnpm lint in the project and restart the ESLint server. It should show errors from the jsx-a11y plugin

Note: Before merging and releasing these changes, I'll test these changes locally with the different projects and evaluate the errors to make sure the config changes are still relevant and helpful!

@beaesguerra beaesguerra self-assigned this Feb 5, 2025
Copy link

changeset-bot bot commented Feb 5, 2025

🦋 Changeset detected

Latest commit: 9d50ac1

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@khanacademy/eslint-config Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link

codecov bot commented Feb 5, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 99.85%. Comparing base (046f326) to head (9d50ac1).
Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main    #1118   +/-   ##
=======================================
  Coverage   99.85%   99.85%           
=======================================
  Files          97       97           
  Lines        1392     1392           
  Branches      358      359    +1     
=======================================
  Hits         1390     1390           
  Misses          1        1           
  Partials        1        1           

Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 046f326...9d50ac1. Read the comment docs.

Copy link
Contributor

github-actions bot commented Feb 5, 2025

Size Change: 0 B

Total Size: 4.63 kB

ℹ️ View Unchanged
Filename Size
packages/wonder-stuff-core/dist/browser/es/index.js 1.85 kB
packages/wonder-stuff-sentry/dist/browser/es/index.js 1.65 kB
packages/wonder-stuff-testing/dist/browser/es/index.js 1.12 kB

compressed-size-action

For regulard repos, the settings will look like this:

```
For monorepos the `"import/resolver"` settings will look like this:
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was duplicated from line 12 and not needed (I think!)

@beaesguerra beaesguerra marked this pull request as ready for review February 5, 2025 23:39
@khan-actions-bot khan-actions-bot requested a review from a team February 5, 2025 23:39
@khan-actions-bot
Copy link
Contributor

Gerald

Required Reviewers
  • @Khan/frontend-infra for changes to package.json, yarn.lock, .changeset/quiet-snails-cheer.md, packages/eslint-config-khan/README.md, packages/eslint-config-khan/a11y.js, packages/eslint-config-khan/package.json

Don't want to be involved in this pull request? Comment #removeme and we won't notify you of further changes.

Copy link
Member

@marcysutton marcysutton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great to me, thanks for all the thorough comments and rule settings! It will be good to hear @kevinb-khan's take on it too.

Copy link
Contributor

@kevinb-khan kevinb-khan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I didn't look at the specific rules though. 🎉

Comment on lines +39 to +70
// Mapping for common wrappers for html elements when we can use `addStyle`
StyledA: "a",
StyledButton: "button",
StyledImg: "img",
StyledSvg: "svg",
StyledUl: "ul",
StyledOl: "ol",
StyledLi: "li",
StyledSpan: "span",
StyledDiv: "div",
StyledSection: "section",
StyledHeader: "header",
StyledFooter: "footer",
StyledBlockquote: "blockquote",
StyledForm: "form",
StyledOutput: "output",
StyledIframe: "iframe",
StyledHr: "hr",
StyledP: "p",
StyledFieldset: "fieldset",
StyledLegend: "legend",
StyledCaption: "caption",
StyledPre: "pre",
StyledSup: "sup",
StyledMark: "mark",
StyledTable: "table",
StyledTr: "tr",
StyledTd: "td",
StyledTh: "th",
StyledDl: "dl",
StyledDt: "dt",
StyledDd: "dd",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So many. It would be nice to have a wonder-blocks package that exports this. Is that something that's on the roadmap?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean a WB package that exports this StyledX component mapping? Would it be useful for other cases? If not, another option would be to move this mapping to another file in this package and import it from there so the config file isn't as long! What do you think?

Or did you mean it'd be nice to have a WB package that exports the StyledX components already (as we briefly chatted about 😄)?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking of a WB package that does a bunch of exports like:

export const StyleP = addStyle("p");
export const styledTable = addStyle("table");
...

This suggestion is only tangentially related to this PR. It's so that people don't need to remember to use addStyle to get these variants. Eventually we could even add lint rules to disallow non-styled variants.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for clarifying! I created https://khanacademy.atlassian.net/browse/WB-1879 for this 😄

Comment on lines 2 to +3
const ERROR = "error";
const OFF = "off";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wondering if switching to tseslint.config means we'll get property type checking for our configs. No action req'd, just something we may want to think about for the future. See https://typescript-eslint.io/packages/typescript-eslint#config for details.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for sharing, that would be helpful down the line, yes! I was following the format from our default config file 😅

@beaesguerra
Copy link
Member Author

I tested the config changes locally in webapp, wonder-blocks and perseus and evaluated the errors! I found a few more ways to configure the settings so that the lint rules are more effective, the config is updated now (see last 2 commits) 😄

// for labels to be assosciated with the control for the
// jsx-a11y/label-has-associated-control rule.
SingleSelect: "select",
MultiSelect: "select",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. Good find!!

Copy link
Member

@marcysutton marcysutton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is awesome!! I tested it out locally in Wonder Blocks and it worked great. One minor change in the repro steps was that I had to use lowercase -w with pnpm.

Once I got that and the correct tarball path, it installed properly and caught non-semantic elements with addStyle. Great work, @beaesguerra!

@beaesguerra beaesguerra merged commit cd91b93 into main Feb 11, 2025
8 checks passed
@beaesguerra beaesguerra deleted the fei-1133 branch February 11, 2025 21:24
beaesguerra added a commit to Khan/wonder-blocks that referenced this pull request Feb 12, 2025
## Summary:
This work is part of the implementation of [ADR#781 Enabling more lint rules for accessibility](https://khanacademy.atlassian.net/wiki/x/IoBVyg)

These changes include:
- Updating `@khanacademy/eslint-config` to the latest version to include new jsx-a11y configuration and settings
- Addressed existing errors by adding `eslint-disable-next-line`
  - View the PR commits for a breakdown of errors by rule
  - Used `npx [email protected] .` to easily disable lint errors per rule
- New potential a11y issues can be prevented with these lint rules!

Note: In a follow up PR, I'll address the low hanging issues in WB and create tickets for more complex issues that were found

A breakdown of the existing jsx-a11y errors:

<img width="1027" alt="wb-linting-errors-before" src="https://github.com/user-attachments/assets/cbe4be7f-6868-48af-8474-bad0297cf8b2" />


Implementation Plan:
- Khan/wonder-stuff#1114 Set up eslint a11y config and enable aphrodite-add-style-variable-name 
- Use this new config in WB, perseus, webapp and address lint errors from the aphrodite-add-style-variable-name rule
  - #2459
  - Khan/perseus#2193
  - Khan/webapp#29212
- Khan/wonder-stuff#1118 Update the eslint-config/a11y config with the config based on the accessibility linting rules ADR
- (includes this PR) Use the updated config in projects and address existing errors by disabling the rules per line.

Issue: FEI-1133

## Test plan:
- Run `pnpm lint` and make sure there are no linting errors

Author: beaesguerra

Reviewers: beaesguerra, jandrade

Required Reviewers:

Approved By: jandrade

Checks: ✅ Chromatic - Get results on regular PRs (ubuntu-latest, 20.x), ✅ Lint / Lint (ubuntu-latest, 20.x), ✅ Test / Test (ubuntu-latest, 20.x, 2/2), ✅ Test / Test (ubuntu-latest, 20.x, 1/2), ✅ Check build sizes (ubuntu-latest, 20.x), ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Chromatic - Build and test on regular PRs / chromatic (ubuntu-latest, 20.x), ✅ Prime node_modules cache for primary configuration (ubuntu-latest, 20.x), ⏭️  Chromatic - Skip on Release PR (changesets), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ✅ gerald, ⏭️  dependabot

Pull Request URL: #2471
beaesguerra added a commit to Khan/perseus that referenced this pull request Feb 13, 2025
## Summary:
This work is part of the implementation of [ADR#781 Enabling more lint rules for accessibility](https://khanacademy.atlassian.net/wiki/x/IoBVyg)

These changes include:
- Updating `@khanacademy/eslint-config` to the latest version to include new jsx-a11y configuration and settings
- Updating `esling-plugin-jsx-a11y` to the latest version so it is up to date
- Addressed existing errors by adding `eslint-disable-next-line`
  - View the PR commits for a breakdown of errors by rule
  - Used `npx [email protected] .` to disable lint errors per rule
- Provided custom component mapping for jsx-a11y in the eslint config since Perseus has custom components 

New potential a11y issues can be prevented with these lint rules and existing errors can be addressed over time by the team! The lint error messages have a link to the [rule docs](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/main/docs/rules) for more details!

A breakdown of the existing jsx-a11y errors:

<img width="1019" alt="perseus-linting-errors-before" src="https://github.com/user-attachments/assets/8191e551-4147-43cb-bbcf-79b0e5684c26" />

### Implementation Plan:
- Khan/wonder-stuff#1114 Set up eslint a11y config and enable aphrodite-add-style-variable-name 
- Use this new config in WB, perseus, webapp and address lint errors from the aphrodite-add-style-variable-name rule
  - Khan/wonder-blocks#2459
  - #2193
  - Khan/webapp#29212
- Khan/wonder-stuff#1118 Update the eslint-config/a11y config with the config based on the accessibility linting rules ADR
- (includes this PR) Use the updated config in projects and address existing errors by disabling the rules per line.

Issue: FEI-1133

## Test plan:
- Run `yarn lint` and make sure there are no linting errors

Author: beaesguerra

Reviewers: catandthemachines, beaesguerra, #frontend-infra-web

Required Reviewers:

Approved By: catandthemachines

Checks: ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Lint, Typecheck, Format, and Test (ubuntu-latest, 20.x), ✅ Cypress (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ✅ Check builds for changes in size (ubuntu-latest, 20.x), ✅ Publish Storybook to Chromatic (ubuntu-latest, 20.x)

Pull Request URL: #2232
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants