From 82f648157e50a1498082dd24b78594f7a18e39a5 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:06:00 -0700 Subject: [PATCH] chore: clean up a11y analysis code (#16345) * chore: clean up a11y analysis code * lint * apply changes from #16340 and #16341 * `utils.js` -> `index.js` * remove unused exports * remove unused exports * newlines are free :) * consolidate loops * put the exported function up top --------- Co-authored-by: Rich Harris --- .changeset/warm-olives-applaud.md | 5 + .../2-analyze/visitors/RegularElement.js | 2 +- .../2-analyze/visitors/SvelteElement.js | 2 +- .../visitors/shared/a11y/constants.js | 319 ++++ .../shared/{a11y.js => a11y/index.js} | 1529 +++++++---------- 5 files changed, 975 insertions(+), 882 deletions(-) create mode 100644 .changeset/warm-olives-applaud.md create mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js rename packages/svelte/src/compiler/phases/2-analyze/visitors/shared/{a11y.js => a11y/index.js} (55%) diff --git a/.changeset/warm-olives-applaud.md b/.changeset/warm-olives-applaud.md new file mode 100644 index 0000000000..63a7803b99 --- /dev/null +++ b/.changeset/warm-olives-applaud.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: clean up a11y analysis code diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index d5689e5d55..fab5d46e1b 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -9,7 +9,7 @@ import * as e from '../../../errors.js'; import * as w from '../../../warnings.js'; import { create_attribute, is_custom_element_node } from '../../nodes.js'; import { regex_starts_with_newline } from '../../patterns.js'; -import { check_element } from './shared/a11y.js'; +import { check_element } from './shared/a11y/index.js'; import { validate_element } from './shared/element.js'; import { mark_subtree_dynamic } from './shared/fragment.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteElement.js index c45859408c..f2e298f7ea 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteElement.js @@ -2,7 +2,7 @@ /** @import { Context } from '../types' */ import { NAMESPACE_MATHML, NAMESPACE_SVG } from '../../../../constants.js'; import { is_text_attribute } from '../../../utils/ast.js'; -import { check_element } from './shared/a11y.js'; +import { check_element } from './shared/a11y/index.js'; import { validate_element } from './shared/element.js'; import { mark_subtree_dynamic } from './shared/fragment.js'; diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js new file mode 100644 index 0000000000..a1b70f2207 --- /dev/null +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/shared/a11y/constants.js @@ -0,0 +1,319 @@ +/** @import { ARIARoleRelationConcept } from 'aria-query' */ +import { roles as roles_map, elementRoles } from 'aria-query'; +// @ts-expect-error package doesn't provide typings +import { AXObjects, elementAXObjects } from 'axobject-query'; + +export const aria_attributes = + 'activedescendant atomic autocomplete busy checked colcount colindex colspan controls current describedby description details disabled dropeffect errormessage expanded flowto grabbed haspopup hidden invalid keyshortcuts label labelledby level live modal multiline multiselectable orientation owns placeholder posinset pressed readonly relevant required roledescription rowcount rowindex rowspan selected setsize sort valuemax valuemin valuenow valuetext'.split( + ' ' + ); + +/** @type {Record} */ +export const a11y_required_attributes = { + a: ['href'], + area: ['alt', 'aria-label', 'aria-labelledby'], + // html-has-lang + html: ['lang'], + // iframe-has-title + iframe: ['title'], + img: ['alt'], + object: ['title', 'aria-label', 'aria-labelledby'] +}; + +export const a11y_distracting_elements = ['blink', 'marquee']; + +// this excludes `` and `