From cc0f0863f794de30d2be679214fb1c52bf73ccce Mon Sep 17 00:00:00 2001 From: Drew Powers Date: Sun, 9 Feb 2025 00:42:19 -0700 Subject: [PATCH 1/2] AAM improvements --- .changeset/eight-cherries-relate.md | 9 + .changeset/silly-tigers-teach.md | 5 + .changeset/two-toys-sneeze.md | 5 + README.md | 18 +- package.json | 8 +- pnpm-lock.yaml | 537 +++++++++++---------- src/get-role.ts | 4 +- src/get-supported-attributes.ts | 6 +- src/lib/aria-roles.ts | 8 +- src/lib/html.ts | 24 +- src/lib/util.ts | 15 +- src/tags/input.ts | 30 +- test/dom/get-role.test.ts | 101 ++-- test/dom/get-supported-roles.test.ts | 105 ++-- test/helpers.ts | 6 + test/node/get-elements.test.ts | 4 +- test/node/get-required-attributes.test.ts | 2 +- test/node/get-role.test.ts | 184 ++++--- test/node/get-supported-attributes.test.ts | 273 ++++------- test/node/get-supported-roles.test.ts | 62 +-- test/node/utils.test.ts | 4 +- vitest.workspace.ts | 22 +- 22 files changed, 773 insertions(+), 659 deletions(-) create mode 100644 .changeset/eight-cherries-relate.md create mode 100644 .changeset/silly-tigers-teach.md create mode 100644 .changeset/two-toys-sneeze.md diff --git a/.changeset/eight-cherries-relate.md b/.changeset/eight-cherries-relate.md new file mode 100644 index 0000000..3c2ed09 --- /dev/null +++ b/.changeset/eight-cherries-relate.md @@ -0,0 +1,9 @@ +--- +"html-aria": patch +--- + +Bugfix: more AAM mappings were incorporated + +- `
` now maps to `definition` +- `
` now maps to `term` +- `
` now maps to `caption` diff --git a/.changeset/silly-tigers-teach.md b/.changeset/silly-tigers-teach.md new file mode 100644 index 0000000..4d24bb4 --- /dev/null +++ b/.changeset/silly-tigers-teach.md @@ -0,0 +1,5 @@ +--- +"html-aria": patch +--- + +Add support for custom elements diff --git a/.changeset/two-toys-sneeze.md b/.changeset/two-toys-sneeze.md new file mode 100644 index 0000000..ff95930 --- /dev/null +++ b/.changeset/two-toys-sneeze.md @@ -0,0 +1,5 @@ +--- +"html-aria": minor +--- + +Bugfix: aria-roledescription and aria-brailleroledescription removed from “naming prohibited” attributes diff --git a/README.md b/README.md index 2378441..aaf0bc7 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Determine which HTML maps to which default ARIA role. import { getRole } from "html-aria"; // DOM -const el = document.querySelector('article') +const el = document.querySelector("article"); getRole(el); // "article" // Node.js (no DOM) @@ -142,7 +142,7 @@ The spec dictates that **certain elements may NOT receive certain roles.** For e import { getSupportedRoles } from "html-aria"; // DOM -const el = document.querySelector('img') +const el = document.querySelector("img"); getSupportedRoles(el); // ["none", "presentation", "img"] // Node.js (no DOM) @@ -341,13 +341,19 @@ Further, a common mistake many simple accessibility libraries make is mapping ar _Note: `—` = [no corresponding role](#whats-the-difference-between-no-corresponding-role-and-the-none-role). Also worth pointing out that in other cases, [global aria-\* attributes](https://www.w3.org/TR/wai-aria-1.3/#global_states) are allowed, so this is unique to the element and NOT the ARIA role._ -### Technical deviations from the spec +### Discrepancies between specs -#### Mark +Though the [HTML in ARIA](https://www.w3.org/TR/html-aria) spec was the foundation for this library, at points it conflicts with [AAM](https://www.w3.org/TR/html-aam-1.0). We also have browsers sometimes showing inconsistent roles, too. For these discrepancies, we compare what the specs recommend, along with the library’s current decision in an attempt to follow the most helpful path. -The `` tag gets the `mark` role. Seems logical, right? Well, not according to the spec. It’s [not listed in the HTML in ARIA spec](https://www.w3.org/TR/html-aria/#el-mark), and it’s worth noting that `` is a [_related concept_](https://www.w3.org/TR/wai-aria-1.3/#mark), not a base concept as elements usually are. +| Element | [HTML in ARIA](https://www.w3.org/TR/html-aria) | [AAM](https://www.w3.org/TR/html-aam-1.0) | Browsers\* | html-aria | +| :------------- | :---------------------------------------------- | :---------------------------------------- | :------------------------------- | --------------------- | +| `
` | No corresponding role | definition | definition | definition | +| `
` | No corresponding role | list | (inconsistent) | No corresponding role | +| `
` | No corresponding role | term | term | term | +| `
` | No corresponding role | caption | caption (`Figcaption` in Chrome) | caption | +| `` | No corresponding role | mark | mark | mark | -But despite the ARIA specs being pretty clear that `` and `mark` aren’t directly equivalent, all modern browsers today seem to think they are, and `` always gets a `mark` role. For that reason, html-aria has sided with practical browser implementation rather than the ARIA spec. +_\* Chrome 132, Safari 18, Firefox 135. _ #### SVG diff --git a/package.json b/package.json index 826c849..170fdd8 100644 --- a/package.json +++ b/package.json @@ -52,14 +52,14 @@ "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.12", "@types/aria-query": "^5.0.4", - "@vitest/browser": "^3.0.4", + "@vitest/browser": "^3.0.5", "aria-query": "^5.3.2", "dom-accessibility-api": "^0.7.0", - "happy-dom": "^16.7.3", + "happy-dom": "^17.0.0", "jsdom": "^25.0.1", - "playwright": "^1.50.0", + "playwright": "^1.50.1", "typescript": "^5.7.3", "unbuild": "^3.3.1", - "vitest": "^3.0.4" + "vitest": "^3.0.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6cf7e5a..87931d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^5.0.4 version: 5.0.4 '@vitest/browser': - specifier: ^3.0.4 - version: 3.0.4(@types/node@12.20.55)(playwright@1.50.0)(typescript@5.7.3)(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2))(vitest@3.0.4) + specifier: ^3.0.5 + version: 3.0.5(playwright@1.50.1)(typescript@5.7.3)(vite@6.1.0(jiti@2.4.2))(vitest@3.0.5) aria-query: specifier: ^5.3.2 version: 5.3.2 @@ -30,14 +30,14 @@ importers: specifier: ^0.7.0 version: 0.7.0 happy-dom: - specifier: ^16.7.3 - version: 16.7.3 + specifier: ^17.0.0 + version: 17.0.0 jsdom: specifier: ^25.0.1 version: 25.0.1 playwright: - specifier: ^1.50.0 - version: 1.50.0 + specifier: ^1.50.1 + version: 1.50.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -45,8 +45,8 @@ importers: specifier: ^3.3.1 version: 3.3.1(typescript@5.7.3) vitest: - specifier: ^3.0.4 - version: 3.0.4(@types/node@12.20.55)(@vitest/browser@3.0.4)(happy-dom@16.7.3)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3)) + specifier: ^3.0.5 + version: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) packages: @@ -429,25 +429,36 @@ packages: cpu: [x64] os: [win32] - '@inquirer/confirm@5.1.3': - resolution: {integrity: sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==} + '@inquirer/confirm@5.1.5': + resolution: {integrity: sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/core@10.1.4': - resolution: {integrity: sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==} + '@inquirer/core@10.1.6': + resolution: {integrity: sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/figures@1.0.9': - resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + '@inquirer/figures@1.0.10': + resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} engines: {node: '>=18'} - '@inquirer/type@3.0.2': - resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + '@inquirer/type@3.0.4': + resolution: {integrity: sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} @@ -473,8 +484,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mswjs/interceptors@0.37.5': - resolution: {integrity: sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==} + '@mswjs/interceptors@0.37.6': + resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -555,98 +566,98 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.32.1': - resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} + '@rollup/rollup-android-arm-eabi@4.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.32.1': - resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.32.1': - resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.32.1': - resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.32.1': - resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.32.1': - resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.32.1': - resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.32.1': - resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.32.1': - resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.32.1': - resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.32.1': - resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': - resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.32.1': - resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.32.1': - resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.32.1': - resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.32.1': - resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.32.1': - resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.32.1': - resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.32.1': - resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} cpu: [x64] os: [win32] @@ -685,12 +696,12 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@vitest/browser@3.0.4': - resolution: {integrity: sha512-CMUG+OYJvXoe5ylGzmAU3eVX6d848FvRc+1j/STOi3bHBIv4kfXgUrvPuxJVzl6kOad57Vg+SKBvNjeBoc4esw==} + '@vitest/browser@3.0.5': + resolution: {integrity: sha512-5WAWJoucuWcGYU5t0HPBY03k9uogbUEIu4pDmZHoB4Dt+6pXqzDbzEmxGjejZSitSYA3k/udYfuotKNxETVA3A==} peerDependencies: playwright: '*' safaridriver: '*' - vitest: 3.0.4 + vitest: 3.0.5 webdriverio: '*' peerDependenciesMeta: playwright: @@ -700,11 +711,11 @@ packages: webdriverio: optional: true - '@vitest/expect@3.0.4': - resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} + '@vitest/expect@3.0.5': + resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} - '@vitest/mocker@3.0.4': - resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} + '@vitest/mocker@3.0.5': + resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -714,20 +725,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.4': - resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} + '@vitest/pretty-format@3.0.5': + resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} - '@vitest/runner@3.0.4': - resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} + '@vitest/runner@3.0.5': + resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} - '@vitest/snapshot@3.0.4': - resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} + '@vitest/snapshot@3.0.5': + resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} - '@vitest/spy@3.0.4': - resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} + '@vitest/spy@3.0.5': + resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} - '@vitest/utils@3.0.4': - resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} + '@vitest/utils@3.0.5': + resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} @@ -809,8 +820,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + caniuse-lite@1.0.30001698: + resolution: {integrity: sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==} chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} @@ -1002,8 +1013,8 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} - electron-to-chromium@1.5.88: - resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==} + electron-to-chromium@1.5.96: + resolution: {integrity: sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1054,8 +1065,8 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} @@ -1128,8 +1139,8 @@ packages: resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - happy-dom@16.7.3: - resolution: {integrity: sha512-76uiE9jCpC849cOyYZ8YBROpPcstW/hwCKoQYd3aiZaxHeR9zdjpup4z7qYEWbt+lY8Rb3efW2gmrckyoBftKg==} + happy-dom@17.0.0: + resolution: {integrity: sha512-jGuUr3UrgMzt1Mopyof3RzD49/GudAp1suP5KFU+EvNXmqUAMXpxux2zEJbabE1YXs0APrY61iRZ0BKMMWCGTg==} engines: {node: '>=18.0.0'} has-flag@4.0.0: @@ -1273,8 +1284,8 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1414,8 +1425,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -1466,18 +1477,18 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.50.0: - resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==} + playwright-core@1.50.1: + resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} engines: {node: '>=18'} hasBin: true - playwright@1.50.0: - resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==} + playwright@1.50.1: + resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} engines: {node: '>=18'} hasBin: true - postcss-calc@10.1.0: - resolution: {integrity: sha512-uQ/LDGsf3mgsSUEXmAt3VsCSHR3aKqtEIkmB+4PhzYwRYOW5MZs/GhCCFpsOtJJkP6EC6uGipbrnaTjqaJZcJw==} + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: postcss: ^8.4.38 @@ -1636,8 +1647,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-selector-parser@7.0.0: - resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} postcss-svgo@7.0.1: @@ -1722,8 +1733,8 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 - rollup@4.32.1: - resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1750,8 +1761,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -1861,11 +1872,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.75: - resolution: {integrity: sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw==} + tldts-core@6.1.76: + resolution: {integrity: sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==} - tldts@6.1.75: - resolution: {integrity: sha512-+lFzEXhpl7JXgWYaXcB6DqTYXbUArvrWAE/5ioq/X3CdWLbDjpPP4XTrQBmEJ91y3xbe4Fkw7Lxv4P3GWeJaNg==} + tldts@6.1.76: + resolution: {integrity: sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==} hasBin: true tmp@0.0.33: @@ -1884,8 +1895,8 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tough-cookie@5.1.0: - resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==} + tough-cookie@5.1.1: + resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} engines: {node: '>=16'} tr46@0.0.3: @@ -1944,13 +1955,13 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vite-node@3.0.4: - resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} + vite-node@3.0.5: + resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.0.11: - resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1989,16 +2000,16 @@ packages: yaml: optional: true - vitest@3.0.4: - resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} + vitest@3.0.5: + resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.4 - '@vitest/ui': 3.0.4 + '@vitest/browser': 3.0.5 + '@vitest/ui': 3.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2284,7 +2295,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.1 '@changesets/assemble-release-plan@6.0.5': dependencies: @@ -2293,7 +2304,7 @@ snapshots: '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.3 + semver: 7.7.1 '@changesets/changelog-git@0.2.0': dependencies: @@ -2331,10 +2342,10 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.9 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.1 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -2357,7 +2368,7 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.6.3 + semver: 7.7.1 '@changesets/get-github-info@0.6.0': dependencies: @@ -2522,31 +2533,25 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@inquirer/confirm@5.1.3(@types/node@12.20.55)': + '@inquirer/confirm@5.1.5': dependencies: - '@inquirer/core': 10.1.4(@types/node@12.20.55) - '@inquirer/type': 3.0.2(@types/node@12.20.55) - '@types/node': 12.20.55 + '@inquirer/core': 10.1.6 + '@inquirer/type': 3.0.4 - '@inquirer/core@10.1.4(@types/node@12.20.55)': + '@inquirer/core@10.1.6': dependencies: - '@inquirer/figures': 1.0.9 - '@inquirer/type': 3.0.2(@types/node@12.20.55) + '@inquirer/figures': 1.0.10 + '@inquirer/type': 3.0.4 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 - strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 - transitivePeerDependencies: - - '@types/node' - '@inquirer/figures@1.0.9': {} + '@inquirer/figures@1.0.10': {} - '@inquirer/type@3.0.2(@types/node@12.20.55)': - dependencies: - '@types/node': 12.20.55 + '@inquirer/type@3.0.4': {} '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -2581,7 +2586,7 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mswjs/interceptors@0.37.5': + '@mswjs/interceptors@0.37.6': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -2600,7 +2605,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.0 '@open-draft/deferred-promise@2.2.0': {} @@ -2613,13 +2618,13 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-alias@5.1.1(rollup@4.32.1)': + '@rollup/plugin-alias@5.1.1(rollup@4.34.6)': optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/plugin-commonjs@28.0.2(rollup@4.32.1)': + '@rollup/plugin-commonjs@28.0.2(rollup@4.34.6)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.32.1) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.3(picomatch@4.0.2) @@ -2627,94 +2632,94 @@ snapshots: magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/plugin-json@6.1.0(rollup@4.32.1)': + '@rollup/plugin-json@6.1.0(rollup@4.34.6)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.32.1) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.32.1)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.34.6)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.32.1) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/plugin-replace@6.0.2(rollup@4.32.1)': + '@rollup/plugin-replace@6.0.2(rollup@4.34.6)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.32.1) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) magic-string: 0.30.17 optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/pluginutils@5.1.4(rollup@4.32.1)': + '@rollup/pluginutils@5.1.4(rollup@4.34.6)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.32.1 + rollup: 4.34.6 - '@rollup/rollup-android-arm-eabi@4.32.1': + '@rollup/rollup-android-arm-eabi@4.34.6': optional: true - '@rollup/rollup-android-arm64@4.32.1': + '@rollup/rollup-android-arm64@4.34.6': optional: true - '@rollup/rollup-darwin-arm64@4.32.1': + '@rollup/rollup-darwin-arm64@4.34.6': optional: true - '@rollup/rollup-darwin-x64@4.32.1': + '@rollup/rollup-darwin-x64@4.34.6': optional: true - '@rollup/rollup-freebsd-arm64@4.32.1': + '@rollup/rollup-freebsd-arm64@4.34.6': optional: true - '@rollup/rollup-freebsd-x64@4.32.1': + '@rollup/rollup-freebsd-x64@4.34.6': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.32.1': + '@rollup/rollup-linux-arm-musleabihf@4.34.6': optional: true - '@rollup/rollup-linux-arm64-gnu@4.32.1': + '@rollup/rollup-linux-arm64-gnu@4.34.6': optional: true - '@rollup/rollup-linux-arm64-musl@4.32.1': + '@rollup/rollup-linux-arm64-musl@4.34.6': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.32.1': + '@rollup/rollup-linux-riscv64-gnu@4.34.6': optional: true - '@rollup/rollup-linux-s390x-gnu@4.32.1': + '@rollup/rollup-linux-s390x-gnu@4.34.6': optional: true - '@rollup/rollup-linux-x64-gnu@4.32.1': + '@rollup/rollup-linux-x64-gnu@4.34.6': optional: true - '@rollup/rollup-linux-x64-musl@4.32.1': + '@rollup/rollup-linux-x64-musl@4.34.6': optional: true - '@rollup/rollup-win32-arm64-msvc@4.32.1': + '@rollup/rollup-win32-arm64-msvc@4.34.6': optional: true - '@rollup/rollup-win32-ia32-msvc@4.32.1': + '@rollup/rollup-win32-ia32-msvc@4.34.6': optional: true - '@rollup/rollup-win32-x64-msvc@4.32.1': + '@rollup/rollup-win32-x64-msvc@4.34.6': optional: true '@testing-library/dom@10.4.0': @@ -2748,20 +2753,20 @@ snapshots: '@types/tough-cookie@4.0.5': {} - '@vitest/browser@3.0.4(@types/node@12.20.55)(playwright@1.50.0)(typescript@5.7.3)(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2))(vitest@3.0.4)': + '@vitest/browser@3.0.5(playwright@1.50.1)(typescript@5.7.3)(vite@6.1.0(jiti@2.4.2))(vitest@3.0.5)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.0.4(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2)) - '@vitest/utils': 3.0.4 + '@vitest/mocker': 3.0.5(msw@2.7.0(typescript@5.7.3))(vite@6.1.0(jiti@2.4.2)) + '@vitest/utils': 3.0.5 magic-string: 0.30.17 - msw: 2.7.0(@types/node@12.20.55)(typescript@5.7.3) + msw: 2.7.0(typescript@5.7.3) sirv: 3.0.0 tinyrainbow: 2.0.0 - vitest: 3.0.4(@types/node@12.20.55)(@vitest/browser@3.0.4)(happy-dom@16.7.3)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3)) + vitest: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) ws: 8.18.0 optionalDependencies: - playwright: 1.50.0 + playwright: 1.50.1 transitivePeerDependencies: - '@types/node' - bufferutil @@ -2769,45 +2774,45 @@ snapshots: - utf-8-validate - vite - '@vitest/expect@3.0.4': + '@vitest/expect@3.0.5': dependencies: - '@vitest/spy': 3.0.4 - '@vitest/utils': 3.0.4 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.4(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2))': + '@vitest/mocker@3.0.5(msw@2.7.0(typescript@5.7.3))(vite@6.1.0(jiti@2.4.2))': dependencies: - '@vitest/spy': 3.0.4 + '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - msw: 2.7.0(@types/node@12.20.55)(typescript@5.7.3) - vite: 6.0.11(@types/node@12.20.55)(jiti@2.4.2) + msw: 2.7.0(typescript@5.7.3) + vite: 6.1.0(jiti@2.4.2) - '@vitest/pretty-format@3.0.4': + '@vitest/pretty-format@3.0.5': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.4': + '@vitest/runner@3.0.5': dependencies: - '@vitest/utils': 3.0.4 + '@vitest/utils': 3.0.5 pathe: 2.0.2 - '@vitest/snapshot@3.0.4': + '@vitest/snapshot@3.0.5': dependencies: - '@vitest/pretty-format': 3.0.4 + '@vitest/pretty-format': 3.0.5 magic-string: 0.30.17 pathe: 2.0.2 - '@vitest/spy@3.0.4': + '@vitest/spy@3.0.5': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.4': + '@vitest/utils@3.0.5': dependencies: - '@vitest/pretty-format': 3.0.4 - loupe: 3.1.2 + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 tinyrainbow: 2.0.0 acorn@8.14.0: {} @@ -2847,7 +2852,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001698 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -2866,8 +2871,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.88 + caniuse-lite: 1.0.30001698 + electron-to-chromium: 1.5.96 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -2876,18 +2881,18 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001698 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001695: {} + caniuse-lite@1.0.30001698: {} chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.3 pathval: 2.0.0 chalk@4.1.2: @@ -2975,7 +2980,7 @@ snapshots: css-declaration-sorter: 7.2.0(postcss@8.5.1) cssnano-utils: 5.0.0(postcss@8.5.1) postcss: 8.5.1 - postcss-calc: 10.1.0(postcss@8.5.1) + postcss-calc: 10.1.1(postcss@8.5.1) postcss-colormin: 7.0.2(postcss@8.5.1) postcss-convert-values: 7.0.4(postcss@8.5.1) postcss-discard-comments: 7.0.3(postcss@8.5.1) @@ -3075,7 +3080,7 @@ snapshots: dotenv@8.6.0: {} - electron-to-chromium@1.5.88: {} + electron-to-chromium@1.5.96: {} emoji-regex@8.0.0: {} @@ -3144,7 +3149,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fastq@1.18.0: + fastq@1.19.0: dependencies: reusify: 1.0.4 @@ -3212,7 +3217,7 @@ snapshots: graphql@16.10.0: {} - happy-dom@16.7.3: + happy-dom@17.0.0: dependencies: webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 @@ -3315,7 +3320,7 @@ snapshots: rrweb-cssom: 0.7.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 5.1.0 + tough-cookie: 5.1.1 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 @@ -3350,7 +3355,7 @@ snapshots: lodash.uniq@4.5.0: {} - loupe@3.1.2: {} + loupe@3.1.3: {} lru-cache@10.4.3: {} @@ -3394,7 +3399,7 @@ snapshots: pkg-types: 1.3.1 postcss: 8.5.1 postcss-nested: 7.0.2(postcss@8.5.1) - semver: 7.6.3 + semver: 7.7.1 tinyglobby: 0.2.10 optionalDependencies: typescript: 5.7.3 @@ -3412,13 +3417,13 @@ snapshots: ms@2.1.3: {} - msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3): + msw@2.7.0(typescript@5.7.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.3(@types/node@12.20.55) - '@mswjs/interceptors': 0.37.5 + '@inquirer/confirm': 5.1.5 + '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 @@ -3477,7 +3482,7 @@ snapshots: p-try@2.2.0: {} - package-manager-detector@0.2.8: {} + package-manager-detector@0.2.9: {} parse5@7.2.1: dependencies: @@ -3513,18 +3518,18 @@ snapshots: mlly: 1.7.4 pathe: 2.0.2 - playwright-core@1.50.0: {} + playwright-core@1.50.1: {} - playwright@1.50.0: + playwright@1.50.1: dependencies: - playwright-core: 1.50.0 + playwright-core: 1.50.1 optionalDependencies: fsevents: 2.3.2 - postcss-calc@10.1.0(postcss@8.5.1): + postcss-calc@10.1.1(postcss@8.5.1): dependencies: postcss: 8.5.1 - postcss-selector-parser: 7.0.0 + postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 postcss-colormin@7.0.2(postcss@8.5.1): @@ -3600,7 +3605,7 @@ snapshots: postcss-nested@7.0.2(postcss@8.5.1): dependencies: postcss: 8.5.1 - postcss-selector-parser: 7.0.0 + postcss-selector-parser: 7.1.0 postcss-normalize-charset@7.0.0(postcss@8.5.1): dependencies: @@ -3669,7 +3674,7 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.0.0: + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -3738,37 +3743,37 @@ snapshots: reusify@1.0.4: {} - rollup-plugin-dts@6.1.1(rollup@4.32.1)(typescript@5.7.3): + rollup-plugin-dts@6.1.1(rollup@4.34.6)(typescript@5.7.3): dependencies: magic-string: 0.30.17 - rollup: 4.32.1 + rollup: 4.34.6 typescript: 5.7.3 optionalDependencies: '@babel/code-frame': 7.26.2 - rollup@4.32.1: + rollup@4.34.6: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.32.1 - '@rollup/rollup-android-arm64': 4.32.1 - '@rollup/rollup-darwin-arm64': 4.32.1 - '@rollup/rollup-darwin-x64': 4.32.1 - '@rollup/rollup-freebsd-arm64': 4.32.1 - '@rollup/rollup-freebsd-x64': 4.32.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 - '@rollup/rollup-linux-arm-musleabihf': 4.32.1 - '@rollup/rollup-linux-arm64-gnu': 4.32.1 - '@rollup/rollup-linux-arm64-musl': 4.32.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 - '@rollup/rollup-linux-riscv64-gnu': 4.32.1 - '@rollup/rollup-linux-s390x-gnu': 4.32.1 - '@rollup/rollup-linux-x64-gnu': 4.32.1 - '@rollup/rollup-linux-x64-musl': 4.32.1 - '@rollup/rollup-win32-arm64-msvc': 4.32.1 - '@rollup/rollup-win32-ia32-msvc': 4.32.1 - '@rollup/rollup-win32-x64-msvc': 4.32.1 + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 fsevents: 2.3.3 rrweb-cssom@0.7.1: {} @@ -3789,7 +3794,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} shebang-command@2.0.0: dependencies: @@ -3879,11 +3884,11 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.75: {} + tldts-core@6.1.76: {} - tldts@6.1.75: + tldts@6.1.76: dependencies: - tldts-core: 6.1.75 + tldts-core: 6.1.76 tmp@0.0.33: dependencies: @@ -3902,9 +3907,9 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tough-cookie@5.1.0: + tough-cookie@5.1.1: dependencies: - tldts: 6.1.75 + tldts: 6.1.76 tr46@0.0.3: {} @@ -3922,12 +3927,12 @@ snapshots: unbuild@3.3.1(typescript@5.7.3): dependencies: - '@rollup/plugin-alias': 5.1.1(rollup@4.32.1) - '@rollup/plugin-commonjs': 28.0.2(rollup@4.32.1) - '@rollup/plugin-json': 6.1.0(rollup@4.32.1) - '@rollup/plugin-node-resolve': 16.0.0(rollup@4.32.1) - '@rollup/plugin-replace': 6.0.2(rollup@4.32.1) - '@rollup/pluginutils': 5.1.4(rollup@4.32.1) + '@rollup/plugin-alias': 5.1.1(rollup@4.34.6) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.6) + '@rollup/plugin-json': 6.1.0(rollup@4.34.6) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.6) + '@rollup/plugin-replace': 6.0.2(rollup@4.34.6) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) citty: 0.1.6 consola: 3.4.0 defu: 6.1.4 @@ -3940,8 +3945,8 @@ snapshots: pathe: 2.0.2 pkg-types: 1.3.1 pretty-bytes: 6.1.1 - rollup: 4.32.1 - rollup-plugin-dts: 6.1.1(rollup@4.32.1)(typescript@5.7.3) + rollup: 4.34.6 + rollup-plugin-dts: 6.1.1(rollup@4.34.6)(typescript@5.7.3) scule: 1.3.0 tinyglobby: 0.2.10 untyped: 1.5.2 @@ -3983,13 +3988,13 @@ snapshots: util-deprecate@1.0.2: {} - vite-node@3.0.4(@types/node@12.20.55)(jiti@2.4.2): + vite-node@3.0.5(jiti@2.4.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 6.0.11(@types/node@12.20.55)(jiti@2.4.2) + vite: 6.1.0(jiti@2.4.2) transitivePeerDependencies: - '@types/node' - jiti @@ -4004,25 +4009,24 @@ snapshots: - tsx - yaml - vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2): + vite@6.1.0(jiti@2.4.2): dependencies: esbuild: 0.24.2 postcss: 8.5.1 - rollup: 4.32.1 + rollup: 4.34.6 optionalDependencies: - '@types/node': 12.20.55 fsevents: 2.3.3 jiti: 2.4.2 - vitest@3.0.4(@types/node@12.20.55)(@vitest/browser@3.0.4)(happy-dom@16.7.3)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3)): + vitest@3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)): dependencies: - '@vitest/expect': 3.0.4 - '@vitest/mocker': 3.0.4(msw@2.7.0(@types/node@12.20.55)(typescript@5.7.3))(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2)) - '@vitest/pretty-format': 3.0.4 - '@vitest/runner': 3.0.4 - '@vitest/snapshot': 3.0.4 - '@vitest/spy': 3.0.4 - '@vitest/utils': 3.0.4 + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(msw@2.7.0(typescript@5.7.3))(vite@6.1.0(jiti@2.4.2)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 chai: 5.1.2 debug: 4.4.0 expect-type: 1.1.0 @@ -4033,13 +4037,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.11(@types/node@12.20.55)(jiti@2.4.2) - vite-node: 3.0.4(@types/node@12.20.55)(jiti@2.4.2) + vite: 6.1.0(jiti@2.4.2) + vite-node: 3.0.5(jiti@2.4.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 12.20.55 - '@vitest/browser': 3.0.4(@types/node@12.20.55)(playwright@1.50.0)(typescript@5.7.3)(vite@6.0.11(@types/node@12.20.55)(jiti@2.4.2))(vitest@3.0.4) - happy-dom: 16.7.3 + '@vitest/browser': 3.0.5(playwright@1.50.1)(typescript@5.7.3)(vite@6.1.0(jiti@2.4.2))(vitest@3.0.5) + happy-dom: 17.0.0 jsdom: 25.0.1 transitivePeerDependencies: - jiti diff --git a/src/get-role.ts b/src/get-role.ts index 7c62fef..59e7380 100644 --- a/src/get-role.ts +++ b/src/get-role.ts @@ -65,8 +65,10 @@ export function getRole(element: Element | VirtualElement, options?: GetRoleOpti } const tag = tags[tagName]; + + // If custom element (unknown HTML element), assume generic if (!tag) { - return undefined; + return roles.generic; } switch (tagName) { diff --git a/src/get-supported-attributes.ts b/src/get-supported-attributes.ts index 79e2ae8..fd8c9f5 100644 --- a/src/get-supported-attributes.ts +++ b/src/get-supported-attributes.ts @@ -59,19 +59,19 @@ export function getSupportedAttributes(element: Element | VirtualElement, option return []; } default: { - return roleData?.supported?.length ? roleData.supported : roles.textbox.supported; + return roleData?.supported ?? roles.textbox.supported; } } break; } case 'summary': { - const supported = roleData?.supported.length ? roleData.supported : GLOBAL_ATTRIBUTES; + const supported = roleData?.supported ?? GLOBAL_ATTRIBUTES; return concatDedupeAndSort(supported, ['aria-disabled', 'aria-haspopup']); } } const attrList: ARIAAttribute[] = []; - if (roleData?.supported.length) { + if (roleData) { attrList.push(...roleData.supported); } else { attrList.push(...GLOBAL_ATTRIBUTES); diff --git a/src/lib/aria-roles.ts b/src/lib/aria-roles.ts index 48159ac..abe1b25 100644 --- a/src/lib/aria-roles.ts +++ b/src/lib/aria-roles.ts @@ -112,7 +112,9 @@ export const widgetRoles: Record = { nameFrom: 'author', nameRequired: true, prohibited: [], - required: ['aria-expanded'], + // Note: aria-controls isn’t required by ARIA 1.3, but AAM requires aria-controls for most implementations of comboboxes + // @see https://www.w3.org/TR/html-aam-1.0/#el-input-textetc-autocomplete + required: ['aria-controls', 'aria-expanded'], requiredParentRoles: [], subclasses: [], superclasses: [], @@ -677,7 +679,7 @@ export const documentRoles: Record = { allowedChildRoles: [], childrenPresentational: false, defaultAttributeValues: {}, - elements: [{ tagName: 'caption' }], + elements: [{ tagName: 'caption' }, { tagName: 'figcaption' }], name: 'caption', nameFrom: 'prohibited', nameRequired: false, @@ -1299,7 +1301,7 @@ export const documentRoles: Record = { allowedChildRoles: [], childrenPresentational: false, defaultAttributeValues: {}, - elements: [{ tagName: 'dfn' }], + elements: [{ tagName: 'dfn' }, { tagName: 'dt' }], name: 'term', nameFrom: 'prohibited', nameRequired: false, diff --git a/src/lib/html.ts b/src/lib/html.ts index 7161c8c..f886e4c 100644 --- a/src/lib/html.ts +++ b/src/lib/html.ts @@ -189,9 +189,12 @@ export const tags: Record = { supportedAttributesOverride: undefined, }, dd: { - defaultRole: NO_CORRESPONDING_ROLE, + // - html-aria: no corresponding role + // - AAM: definition + // - Chrome, Firefox, Safari: definition + defaultRole: 'definition', namingProhibited: false, - supportedRoles: NO_ROLES, + supportedRoles: ['definition'], supportedAttributesOverride: undefined, }, div: { @@ -201,21 +204,30 @@ export const tags: Record = { supportedAttributesOverride: undefined, }, dl: { + // - html-aria: no corresponding role + // - AAM: list + // - Chrome: Definitionlist, Firefox: definitionlist, Safari: no corresponding role defaultRole: NO_CORRESPONDING_ROLE, namingProhibited: false, supportedRoles: ['group', 'list', 'none', 'presentation'], supportedAttributesOverride: undefined, }, dt: { - defaultRole: NO_CORRESPONDING_ROLE, + // - html-aria: no corresponding role + // - AAM: term + // - Chrome, Firefox, Safari: term + defaultRole: 'term', namingProhibited: false, - supportedRoles: ['listitem'], + supportedRoles: ['listitem', 'term'], supportedAttributesOverride: undefined, }, figcaption: { - defaultRole: NO_CORRESPONDING_ROLE, + // - html-aria: no corresponding role + // - AAM: caption + // - Chrome, Firefox, Safari: caption + defaultRole: 'caption', namingProhibited: true, - supportedRoles: ['group', 'none', 'presentation'], + supportedRoles: ['caption', 'group', 'none', 'presentation'], supportedAttributesOverride: undefined, }, figure: { diff --git a/src/lib/util.ts b/src/lib/util.ts index 5bf84ce..9645ad2 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -84,10 +84,8 @@ export function calculateAccessibleName(element: Element | VirtualElement, role: export const NAME_PROHIBITED_ATTRIBUTES = new Set([ 'aria-braillelabel', - 'aria-brailleroledescription', 'aria-label', 'aria-labelledby', - 'aria-roledescription', ] satisfies NameProhibitedAttributes[]); const LANDMARK_ROLES = Object.keys(landmarkRoles) as LandmarkRole[]; @@ -106,18 +104,23 @@ export function hasLandmarkParent(element: Element | VirtualElement, ancestors?: ); } -const LIST_TYPE_ELEMENTS: TagName[] = ['ul', 'ol', 'menu']; -const LIST_TYPE_CSS_SELECTOR = LIST_TYPE_ELEMENTS.join(','); +const LIST_ELEMENTS: TagName[] = ['ul', 'ol', 'menu']; +const LIST_ROLES: ARIARole[] = ['list']; +const LIST_CSS_SELECTOR = LIST_ROLES.map((role) => `[role=${role}]`) + .concat(...LIST_ELEMENTS.map((el) => `${el}:not([role])`)) + .join(','); export function hasListParent(element: Element | VirtualElement, ancestors?: VirtualAncestorList): boolean { if (typeof Element !== 'undefined' && element instanceof Element) { - return !!element.parentElement?.closest(LIST_TYPE_CSS_SELECTOR); + return !!element.parentElement?.closest(LIST_CSS_SELECTOR); } // special behavior: outside the DOM, if we’re testing a list-like element, assume it’s within a list if (ancestors?.length !== 0 && element.tagName === 'li') { return true; } - return !!ancestors?.some((ancestor) => LIST_TYPE_ELEMENTS.includes(ancestor.tagName)); + return !!ancestors?.some( + (el) => LIST_ELEMENTS.includes(el.tagName) || (LIST_ROLES as string[]).includes(attr(el, 'role') as string), + ); } const GRID_ROLES: ARIARole[] = ['grid', 'treegrid']; diff --git a/src/tags/input.ts b/src/tags/input.ts index c80f69c..128e696 100644 --- a/src/tags/input.ts +++ b/src/tags/input.ts @@ -52,23 +52,23 @@ export const INPUT_ROLE_MAP: Record = { week: NO_CORRESPONDING_ROLE, }; -const COMBOBOX_ENABLED_TYPES: InputType[] = ['email', 'url', 'search', 'tel', 'text']; - export function getInputRole(element: Element | VirtualElement): RoleData | undefined { // For ARIA purposes, missing or invalid types are treated as "text" - let type = attr(element, 'type') as InputType | undefined; + let type = attr(element, 'type') as InputType; if (!type || !(type in INPUT_ROLE_MAP)) { type = 'text'; } - // handle input comboboxes + const role = type in INPUT_ROLE_MAP ? INPUT_ROLE_MAP[type as InputType] : INPUT_ROLE_MAP.text; + + // handle combobox behavior for textbox-type inputs // @see https://www.w3.org/TR/html-aria/#el-input-text-list const list = attr(element, 'list'); - if (list && COMBOBOX_ENABLED_TYPES.includes(type)) { + if (list && (role?.name === 'textbox' || role?.name === 'searchbox')) { return roles.combobox; } - return (type as InputType) in INPUT_ROLE_MAP ? INPUT_ROLE_MAP[type as InputType] : INPUT_ROLE_MAP.text; + return role; } export const INPUT_SUPPORTED_ROLES_MAP: Record = { @@ -103,19 +103,19 @@ export function getInputSupportedRoles(element: Element | VirtualElement): ARIAR type = 'text'; } - // handle input comboboxes - const list = attr(element, 'list'); - if (list && COMBOBOX_ENABLED_TYPES.includes(type)) { - return ['combobox']; - } - // special behavior: checkboxes // @see https://www.w3.org/TR/html-aria/#el-input-checkbox if (type === 'checkbox' && attr(element, 'aria-pressed')) { return ['button', ...INPUT_SUPPORTED_ROLES_MAP.checkbox]; } - return (type as InputType) in INPUT_ROLE_MAP - ? INPUT_SUPPORTED_ROLES_MAP[type as InputType] - : INPUT_SUPPORTED_ROLES_MAP.text; + const supportedRoles = INPUT_SUPPORTED_ROLES_MAP[type as InputType] ?? INPUT_SUPPORTED_ROLES_MAP.text; + + // handle combobox behavior for textbox-type inputs + const list = attr(element, 'list'); + if (list && supportedRoles.some((name) => name === 'textbox' || name === 'searchbox')) { + return ['combobox']; + } + + return supportedRoles; } diff --git a/test/dom/get-role.test.ts b/test/dom/get-role.test.ts index c265b5c..86fb47b 100644 --- a/test/dom/get-role.test.ts +++ b/test/dom/get-role.test.ts @@ -24,7 +24,7 @@ describe('getRole', () => { ['a (no href)', { given: ['Link', 'a'], want: 'generic' }], ['a (href)', { given: ['About', 'a'], want: 'link' }], ['abbr', { given: ['DOM', 'abbr'], want: NO_CORRESPONDING_ROLE }], - ['address', { given: ['
123 Address Ave.
a', 'address'], want: 'group' }], + ['address', { given: ['
123 Address Ave.
', 'address'], want: 'group' }], ['area (no href)', { given: ['Area', 'area'], want: 'generic' }], ['area (href)', { given: ['About', 'area'], want: 'link' }], ['article', { given: ['
Article
', 'article'], want: 'article' }], @@ -66,27 +66,27 @@ describe('getRole', () => { ['blockquote', { given: ['
', 'blockquote'], want: 'blockquote' }], ['body', { given: ['', 'body'], want: 'generic' }], ['br', { given: ['
', 'br'], want: NO_CORRESPONDING_ROLE }], - ['button', { given: ['', 'blockquote'], want: 'button' }], + ['button', { given: ['', 'button'], want: 'button' }], ['canvas', { given: ['', 'canvas'], want: NO_CORRESPONDING_ROLE }], - ['caption', { given: ['', 'caption'], want: 'caption' }], + ['caption', { given: ['
', 'caption'], want: 'caption' }], ['cite', { given: ['', 'cite'], want: NO_CORRESPONDING_ROLE }], ['code', { given: ['', 'code'], want: 'code' }], ['col', { given: ['
', 'col'], want: NO_CORRESPONDING_ROLE }], ['colgroup', { given: ['
', 'colgroup'], want: NO_CORRESPONDING_ROLE }], ['data', { given: ['', 'data'], want: 'generic' }], ['datalist', { given: ['', 'datalist'], want: 'listbox' }], - ['dd', { given: ['
', 'dd'], want: NO_CORRESPONDING_ROLE }], + ['dd', { given: ['
', 'dd'], want: 'definition' }], ['del', { given: ['', 'del'], want: 'deletion' }], ['details', { given: ['
', 'details'], want: 'group' }], ['dfn', { given: ['', 'dfn'], want: 'term' }], ['dialog', { given: ['', 'dialog'], want: 'dialog' }], ['div', { given: ['
', 'div'], want: 'generic' }], ['dl', { given: ['
', 'dl'], want: NO_CORRESPONDING_ROLE }], - ['dt', { given: ['
', 'dt'], want: NO_CORRESPONDING_ROLE }], + ['dt', { given: ['
', 'dt'], want: 'term' }], ['em', { given: ['', 'em'], want: 'emphasis' }], ['embed', { given: ['', 'embed'], want: NO_CORRESPONDING_ROLE }], ['fieldset', { given: ['
', 'fieldset'], want: 'group' }], - ['figcaption', { given: ['
', 'figcaption'], want: NO_CORRESPONDING_ROLE }], + ['figcaption', { given: ['
', 'figcaption'], want: 'caption' }], ['figure', { given: ['
', 'figure'], want: 'figure' }], ['footer', { given: ['
', 'footer'], want: 'contentinfo' }], ['footer (landmark)', { given: ['
', 'footer'], want: 'generic' }], @@ -140,62 +140,102 @@ describe('getRole', () => { // should produce a combobox. Other lists are ignored. But we want to test // all of them to guarantee this behavior is correct. // @see https://www.w3.org/TR/html-aria/#el-input-text-list - ['input (list)', { given: ['', 'input'], want: 'combobox' }], + ['input (list)', { given: ['', 'input'], want: 'combobox' }], ['input[type=button] (list)', { given: ['', 'input'], want: 'button' }], [ 'input[type=color] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=date] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=datetime-local] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + ], + [ + 'input[type=email] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, ], - ['input[type=email] (list)', { given: ['', 'input'], want: 'combobox' }], [ 'input[type=file] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=hidden] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=month] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + ], + [ + 'input[type=number] (list)', + { given: ['', 'input'], want: 'spinbutton' }, ], - ['input[type=number] (list)', { given: ['', 'input'], want: 'spinbutton' }], [ 'input[type=password] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + ], + ['input[type=radio] (list)', { given: ['', 'input'], want: 'radio' }], + ['input[type=range] (list)', { given: ['', 'input'], want: 'slider' }], + ['input[type=reset] (list)', { given: ['', 'input'], want: 'button' }], + [ + 'input[type=search] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, + ], + ['input[type=submit] (list)', { given: ['', 'input'], want: 'button' }], + [ + 'input[type=tel] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, + ], + [ + 'input[type=text] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, + ], + [ + 'input[type=shrek] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, ], - ['input[type=radio] (list)', { given: ['', 'input'], want: 'radio' }], - ['input[type=range] (list)', { given: ['', 'input'], want: 'slider' }], - ['input[type=reset] (list)', { given: ['', 'input'], want: 'button' }], - ['input[type=search] (list)', { given: ['', 'input'], want: 'combobox' }], - ['input[type=submit] (list)', { given: ['', 'input'], want: 'button' }], - ['input[type=tel] (list)', { given: ['', 'input'], want: 'combobox' }], - ['input[type=text] (list)', { given: ['', 'input'], want: 'combobox' }], - ['input[type=shrek] (list)', { given: ['', 'input'], want: 'combobox' }], [ 'input[type=time] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + ], + [ + 'input[type=url] (list)', + { + given: ['', 'input'], + want: 'combobox', + }, ], - ['input[type=url] (list)', { given: ['', 'input'], want: 'combobox' }], [ 'input[type=week] (list)', - { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, + { given: ['', 'input'], want: NO_CORRESPONDING_ROLE }, ], ['ins', { given: ['', 'ins'], want: 'insertion' }], + ['kbd', { given: ['', 'kbd'], want: NO_CORRESPONDING_ROLE }], ['label', { given: ['', 'label'], want: NO_CORRESPONDING_ROLE }], ['legend', { given: ['', 'legend'], want: NO_CORRESPONDING_ROLE }], ['li', { given: ['
', 'li'], want: 'listitem' }], + ['li (list role parent)', { given: ['
  • ', 'li'], want: 'listitem' }], ['li (no ancestors)', { given: ['
  • ', 'li'], want: 'generic' }], ['link', { given: ['', 'link'], want: NO_CORRESPONDING_ROLE }], - ['kbd', { given: ['', 'kbd'], want: NO_CORRESPONDING_ROLE }], ['main', { given: ['
    ', 'main'], want: 'main' }], ['map', { given: ['', 'map'], want: NO_CORRESPONDING_ROLE }], ['mark', { given: ['', 'mark'], want: 'mark' }], @@ -286,6 +326,11 @@ describe('getRole', () => { ['var', { given: ['', 'var'], want: NO_CORRESPONDING_ROLE }], ['video', { given: ['', 'video'], want: NO_CORRESPONDING_ROLE }], ['wbr', { given: ['', 'wbr'], want: NO_CORRESPONDING_ROLE }], + ['custom element', { given: ['My Button', 'x-button'], want: 'generic' }], + [ + 'custom element (with role)', + { given: ['My Button', 'x-button'], want: 'button' }, + ], ]; const testedTags = new Set(); diff --git a/test/dom/get-supported-roles.test.ts b/test/dom/get-supported-roles.test.ts index d55cd11..d2b3ab4 100644 --- a/test/dom/get-supported-roles.test.ts +++ b/test/dom/get-supported-roles.test.ts @@ -53,9 +53,9 @@ describe('getSupportedRoles', () => { ['code', { given: ['', 'code'], want: ALL_ROLES }], ['col', { given: ['
    ', 'col'], want: NO_ROLES }], ['colgroup', { given: ['
    ', 'colgroup'], want: NO_ROLES }], - ['dd', { given: ['
    ', 'dd'], want: NO_ROLES }], ['data', { given: ['', 'data'], want: ALL_ROLES }], ['datalist', { given: ['', 'datalist'], want: ['listbox'] }], + ['dd', { given: ['
    ', 'dd'], want: ['definition'] }], ['del', { given: ['', 'del'], want: ALL_ROLES }], ['details', { given: ['
    ', 'details'], want: ['group'] }], ['dfn', { given: ['', 'dfn'], want: ALL_ROLES }], @@ -63,7 +63,7 @@ describe('getSupportedRoles', () => { ['div', { given: ['
    ', 'div'], want: ALL_ROLES }], ['div (dl)', { given: ['
    ', 'div'], want: ['none', 'presentation'] }], ['dl', { given: ['
    ', 'dl'], want: ['group', 'list', 'none', 'presentation'] }], - ['dt', { given: ['
    ', 'dt'], want: ['listitem'] }], + ['dt', { given: ['
    ', 'dt'], want: ['listitem', 'term'] }], ['em', { given: ['', 'em'], want: ALL_ROLES }], [ 'embed', @@ -78,7 +78,10 @@ describe('getSupportedRoles', () => { { given: ['
    ', 'fieldset'], want: ['group', 'none', 'presentation', 'radiogroup'] }, ], ['figure', { given: ['
    ', 'figure'], want: ALL_ROLES }], - ['figcaption', { given: ['
    ', 'figcaption'], want: ['group', 'none', 'presentation'] }], + [ + 'figcaption', + { given: ['
    ', 'figcaption'], want: ['caption', 'group', 'none', 'presentation'] }, + ], [ 'footer (landmark)', { given: ['
    ', 'footer'], want: ['generic', 'group', 'none', 'presentation'] }, @@ -186,67 +189,109 @@ describe('getSupportedRoles', () => { ['input[type=time]', { given: ['', 'input'], want: [] }], ['input[type=url]', { given: ['', 'input'], want: ['textbox'] }], ['input[type=week]', { given: ['', 'input'], want: [] }], - ['input (list)', { given: ['', 'input'], want: ['combobox'] }], + [ + 'input (list)', + { given: ['', 'input'], want: ['combobox'] }, + ], [ 'input[type=button] (list)', { - given: ['', 'input'], + given: ['', 'input'], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], [ 'input[type=checkbox] (list)', { - given: ['', 'input'], + given: ['', 'input'], want: ['checkbox', 'menuitemcheckbox', 'option', 'switch'], }, ], [ 'input[type=checkbox] (list, pressed)', { - given: ['', 'input'], + given: ['', 'input'], want: ['button', 'checkbox', 'menuitemcheckbox', 'option', 'switch'], }, ], - ['input[type=color] (list)', { given: ['', 'input'], want: [] }], - ['input[type=date] (list)', { given: ['', 'input'], want: [] }], + ['input[type=color] (list)', { given: ['', 'input'], want: [] }], + ['input[type=date] (list)', { given: ['', 'input'], want: [] }], [ 'input[type=datetime-local] (list)', - { given: ['', 'input'], want: [] }, + { given: ['', 'input'], want: [] }, + ], + [ + 'input[type=email] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, ], - ['input[type=email] (list)', { given: ['', 'input'], want: ['combobox'] }], - ['input[type=file] (list)', { given: ['', 'input'], want: [] }], - ['input[type=hidden] (list)', { given: ['', 'input'], want: [] }], - ['input[type=month] (list)', { given: ['', 'input'], want: [] }], - ['input[type=number] (list)', { given: ['', 'input'], want: ['spinbutton'] }], - ['input[type=range] (list)', { given: ['', 'input'], want: ['slider'] }], - ['input[type=password] (list)', { given: ['', 'input'], want: [] }], + ['input[type=file] (list)', { given: ['', 'input'], want: [] }], + ['input[type=hidden] (list)', { given: ['', 'input'], want: [] }], + ['input[type=month] (list)', { given: ['', 'input'], want: [] }], [ - 'input[type=radio]', - { given: ['', 'input'], want: ['menuitemradio', 'radio'] }, + 'input[type=number] (list)', + { given: ['', 'input'], want: ['spinbutton'] }, ], - ['input[type=range] (list)', { given: ['', 'input'], want: ['slider'] }], + ['input[type=range] (list)', { given: ['', 'input'], want: ['slider'] }], + ['input[type=password] (list)', { given: ['', 'input'], want: [] }], + [ + 'input[type=radio] (list)', + { given: ['', 'input'], want: ['menuitemradio', 'radio'] }, + ], + ['input[type=range] (list)', { given: ['', 'input'], want: ['slider'] }], [ 'input[type=reset]', { - given: ['', 'input'], + given: ['', 'input'], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], - ['input[type=search] (list)', { given: ['', 'input'], want: ['combobox'] }], [ - 'input[type=submit]', + 'input[type=search] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, + ], + [ + 'input[type=submit] (list)', { - given: ['', 'input'], + given: ['', 'input'], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], - ['input[type=tel] (list)', { given: ['', 'input'], want: ['combobox'] }], - ['input[type=text] (list)', { given: ['', 'input'], want: ['combobox'] }], - ['input[type=shrek] (list)', { given: ['', 'input'], want: ['combobox'] }], - ['input[type=time] (list)', { given: ['', 'input'], want: [] }], - ['input[type=url] (list)', { given: ['', 'input'], want: ['combobox'] }], - ['input[type=week] (list)', { given: ['', 'input'], want: [] }], + [ + 'input[type=tel] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, + ], + [ + 'input[type=text] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, + ], + [ + 'input[type=shrek] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, + ], + ['input[type=time] (list)', { given: ['', 'input'], want: [] }], + [ + 'input[type=url] (list)', + { + given: ['', 'input'], + want: ['combobox'], + }, + ], + ['input[type=week] (list)', { given: ['', 'input'], want: [] }], ['ins', { given: ['', 'ins'], want: ALL_ROLES }], ['label', { given: ['', 'label'], want: [] }], ['legend', { given: ['', 'legend'], want: [] }], diff --git a/test/helpers.ts b/test/helpers.ts index 620a30a..6e1d37b 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -1,5 +1,10 @@ /** Ensure no copypasta error */ export function checkTestAndTagName(testName: string, tagName: string) { + // ignore custom elements + if (tagName.includes('-')) { + return; + } + if (!testName.includes(tagName)) { throw new Error(`Test "${testName}" is testing tag "${tagName}". Has there been a mistake?`); } @@ -26,6 +31,7 @@ export function setUpDOM(html: string, querySelector: string) { } const container = document.createElement('div'); + container.innerHTML = html; return { root: container, element: (container.querySelector(querySelector) || container.children[0]) as Element }; } diff --git a/test/node/get-elements.test.ts b/test/node/get-elements.test.ts index 2e52a4e..bc5184f 100644 --- a/test/node/get-elements.test.ts +++ b/test/node/get-elements.test.ts @@ -11,7 +11,7 @@ describe('getElements', () => { ['banner', { given: 'banner', want: [{ tagName: 'header' }] }], ['blockquote', { given: 'blockquote', want: [{ tagName: 'blockquote' }] }], ['button', { given: 'button', want: [{ tagName: 'button' }] }], - ['caption', { given: 'caption', want: [{ tagName: 'caption' }] }], + ['caption', { given: 'caption', want: [{ tagName: 'caption' }, { tagName: 'figcaption' }] }], ['cell', { given: 'cell', want: [{ tagName: 'td' }] }], ['checkbox', { given: 'checkbox', want: [{ tagName: 'input', attributes: { type: 'checkbox' } }] }], ['code', { given: 'code', want: [{ tagName: 'code' }] }], @@ -125,7 +125,7 @@ describe('getElements', () => { }, ], ['tabpanel', { given: 'tabpanel', want: undefined }], - ['term', { given: 'term', want: [{ tagName: 'dfn' }] }], + ['term', { given: 'term', want: [{ tagName: 'dfn' }, { tagName: 'dt' }] }], ['textbox', { given: 'textbox', want: [{ tagName: 'input', attributes: { type: 'text' } }] }], ['time', { given: 'time', want: [{ tagName: 'time' }] }], ['timer', { given: 'timer', want: undefined }], diff --git a/test/node/get-required-attributes.test.ts b/test/node/get-required-attributes.test.ts index 7e2a935..6988a6a 100644 --- a/test/node/get-required-attributes.test.ts +++ b/test/node/get-required-attributes.test.ts @@ -21,7 +21,7 @@ const tests: [ ['checkbox', { given: ['checkbox'], want: ['aria-checked'] }], ['code', { given: ['code'], want: [] }], ['columnheader', { given: ['columnheader'], want: [] }], - ['combobox', { given: ['combobox'], want: ['aria-expanded'] }], + ['combobox', { given: ['combobox'], want: ['aria-controls', 'aria-expanded'] }], ['comment', { given: ['comment'], want: [] }], ['complementary', { given: ['complementary'], want: [] }], ['contentinfo', { given: ['contentinfo'], want: [] }], diff --git a/test/node/get-role.test.ts b/test/node/get-role.test.ts index 8c89503..c594651 100644 --- a/test/node/get-role.test.ts +++ b/test/node/get-role.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from 'vitest'; -import { NO_CORRESPONDING_ROLE, type VirtualElement, getRole, tags } from '../../src/index.js'; +import { NO_CORRESPONDING_ROLE, type TagName, getRole, tags } from '../../src/index.js'; import { checkTestAndTagName } from '../helpers.js'; describe('getRole', () => { @@ -23,7 +23,7 @@ describe('getRole', () => { ][] = [ ['a', { given: [{ tagName: 'a' }], want: 'generic' }], ['a (href)', { given: [{ tagName: 'a', attributes: { href: '/about' } }], want: 'link' }], - ['abbr', { given: [{ tagName: 'abbr' }], want: undefined }], + ['abbr', { given: [{ tagName: 'abbr' }], want: NO_CORRESPONDING_ROLE }], ['address', { given: [{ tagName: 'address' }], want: 'group' }], ['area', { given: [{ tagName: 'area' }], want: 'generic' }], ['area (href)', { given: [{ tagName: 'area', attributes: { href: '/about' } }], want: 'link' }], @@ -79,54 +79,54 @@ describe('getRole', () => { 'aside (no name, sectioning section)', { given: [{ tagName: 'aside' }, { ancestors: [{ tagName: 'section' }] }], want: 'generic' }, ], - ['audio', { given: [{ tagName: 'audio' }], want: undefined }], + ['audio', { given: [{ tagName: 'audio' }], want: NO_CORRESPONDING_ROLE }], ['b', { given: [{ tagName: 'b' }], want: 'generic' }], - ['base', { given: [{ tagName: 'base' }], want: undefined }], + ['base', { given: [{ tagName: 'base' }], want: NO_CORRESPONDING_ROLE }], ['bdi', { given: [{ tagName: 'bdi' }], want: 'generic' }], ['bdo', { given: [{ tagName: 'bdo' }], want: 'generic' }], ['blockquote', { given: [{ tagName: 'blockquote' }], want: 'blockquote' }], ['body', { given: [{ tagName: 'body' }], want: 'generic' }], - ['br', { given: [{ tagName: 'br' }], want: undefined }], + ['br', { given: [{ tagName: 'br' }], want: NO_CORRESPONDING_ROLE }], ['button', { given: [{ tagName: 'button' }], want: 'button' }], - ['canvas', { given: [{ tagName: 'canvas' }], want: undefined }], + ['canvas', { given: [{ tagName: 'canvas' }], want: NO_CORRESPONDING_ROLE }], ['caption', { given: [{ tagName: 'caption' }], want: 'caption' }], - ['cite', { given: [{ tagName: 'cite' }], want: undefined }], + ['cite', { given: [{ tagName: 'cite' }], want: NO_CORRESPONDING_ROLE }], ['code', { given: [{ tagName: 'code' }], want: 'code' }], - ['col', { given: [{ tagName: 'col' }], want: undefined }], - ['colgroup', { given: [{ tagName: 'colgroup' }], want: undefined }], + ['col', { given: [{ tagName: 'col' }], want: NO_CORRESPONDING_ROLE }], + ['colgroup', { given: [{ tagName: 'colgroup' }], want: NO_CORRESPONDING_ROLE }], ['data', { given: [{ tagName: 'data' }], want: 'generic' }], ['datalist', { given: [{ tagName: 'datalist' }], want: 'listbox' }], - ['dd', { given: [{ tagName: 'dd' }], want: undefined }], + ['dd', { given: [{ tagName: 'dd' }], want: 'definition' }], ['del', { given: [{ tagName: 'del' }], want: 'deletion' }], ['details', { given: [{ tagName: 'details' }], want: 'group' }], ['dfn', { given: [{ tagName: 'dfn' }], want: 'term' }], ['dialog', { given: [{ tagName: 'dialog' }], want: 'dialog' }], ['div', { given: [{ tagName: 'div' }], want: 'generic' }], - ['dl', { given: [{ tagName: 'dl' }], want: undefined }], - ['dt', { given: [{ tagName: 'dt' }], want: undefined }], + ['dl', { given: [{ tagName: 'dl' }], want: NO_CORRESPONDING_ROLE }], + ['dt', { given: [{ tagName: 'dt' }], want: 'term' }], ['em', { given: [{ tagName: 'em' }], want: 'emphasis' }], - ['embed', { given: [{ tagName: 'embed' }], want: undefined }], + ['embed', { given: [{ tagName: 'embed' }], want: NO_CORRESPONDING_ROLE }], ['fieldset', { given: [{ tagName: 'fieldset' }], want: 'group' }], - ['figcaption', { given: [{ tagName: 'figcaption' }], want: undefined }], + ['figcaption', { given: [{ tagName: 'figcaption' }], want: 'caption' }], ['figure', { given: [{ tagName: 'figure' }], want: 'figure' }], ['footer', { given: [{ tagName: 'footer' }], want: 'contentinfo' }], ['footer (landmark)', { given: [{ tagName: 'footer' }, { ancestors: [{ tagName: 'article' }] }], want: 'generic' }], ['form', { given: [{ tagName: 'form' }], want: 'form' }], - ['g', { given: [{ tagName: 'g' }], want: undefined }], + ['g', { given: [{ tagName: 'g' }], want: NO_CORRESPONDING_ROLE }], ['h1', { given: [{ tagName: 'h1' }], want: 'heading' }], ['h2', { given: [{ tagName: 'h2' }], want: 'heading' }], ['h3', { given: [{ tagName: 'h3' }], want: 'heading' }], ['h4', { given: [{ tagName: 'h4' }], want: 'heading' }], ['h5', { given: [{ tagName: 'h5' }], want: 'heading' }], ['h6', { given: [{ tagName: 'h6' }], want: 'heading' }], - ['head', { given: [{ tagName: 'head' }], want: undefined }], + ['head', { given: [{ tagName: 'head' }], want: NO_CORRESPONDING_ROLE }], ['header', { given: [{ tagName: 'header' }], want: 'banner' }], ['header (landmark)', { given: [{ tagName: 'header' }, { ancestors: [{ tagName: 'main' }] }], want: 'generic' }], ['hgroup', { given: [{ tagName: 'hgroup' }], want: 'group' }], ['hr', { given: [{ tagName: 'hr' }], want: 'separator' }], ['html', { given: [{ tagName: 'html' }], want: 'document' }], ['i', { given: [{ tagName: 'i' }], want: 'generic' }], - ['iframe', { given: [{ tagName: 'iframe' }], want: undefined }], + ['iframe', { given: [{ tagName: 'iframe' }], want: NO_CORRESPONDING_ROLE }], ['img (named by alt)', { given: [{ tagName: 'img', attributes: { alt: 'My image' } }], want: 'img' }], ['img (named by label)', { given: [{ tagName: 'img', attributes: { 'aria-label': 'My image' } }], want: 'img' }], [ @@ -136,18 +136,30 @@ describe('getRole', () => { ['img (no name)', { given: [{ tagName: 'img' }], want: 'none' }], ['input', { given: [{ tagName: 'input' }], want: 'textbox' }], ['input[type=button]', { given: [{ tagName: 'input', attributes: { type: 'button' } }], want: 'button' }], - ['input[type=color]', { given: [{ tagName: 'input', attributes: { type: 'color' } }], want: undefined }], - ['input[type=date]', { given: [{ tagName: 'input', attributes: { type: 'date' } }], want: undefined }], + [ + 'input[type=color]', + { given: [{ tagName: 'input', attributes: { type: 'color' } }], want: NO_CORRESPONDING_ROLE }, + ], + ['input[type=date]', { given: [{ tagName: 'input', attributes: { type: 'date' } }], want: NO_CORRESPONDING_ROLE }], [ 'input[type=datetime-local]', - { given: [{ tagName: 'input', attributes: { type: 'datetime-local' } }], want: undefined }, + { given: [{ tagName: 'input', attributes: { type: 'datetime-local' } }], want: NO_CORRESPONDING_ROLE }, ], ['input[type=email]', { given: [{ tagName: 'input', attributes: { type: 'email' } }], want: 'textbox' }], - ['input[type=file]', { given: [{ tagName: 'input', attributes: { type: 'file' } }], want: undefined }], - ['input[type=hidden]', { given: [{ tagName: 'input', attributes: { type: 'hidden' } }], want: undefined }], - ['input[type=month]', { given: [{ tagName: 'input', attributes: { type: 'month' } }], want: undefined }], + ['input[type=file]', { given: [{ tagName: 'input', attributes: { type: 'file' } }], want: NO_CORRESPONDING_ROLE }], + [ + 'input[type=hidden]', + { given: [{ tagName: 'input', attributes: { type: 'hidden' } }], want: NO_CORRESPONDING_ROLE }, + ], + [ + 'input[type=month]', + { given: [{ tagName: 'input', attributes: { type: 'month' } }], want: NO_CORRESPONDING_ROLE }, + ], ['input[type=number]', { given: [{ tagName: 'input', attributes: { type: 'number' } }], want: 'spinbutton' }], - ['input[type=password]', { given: [{ tagName: 'input', attributes: { type: 'password' } }], want: undefined }], + [ + 'input[type=password]', + { given: [{ tagName: 'input', attributes: { type: 'password' } }], want: NO_CORRESPONDING_ROLE }, + ], ['input[type=radio]', { given: [{ tagName: 'input', attributes: { type: 'radio' } }], want: 'radio' }], ['input[type=range]', { given: [{ tagName: 'input', attributes: { type: 'range' } }], want: 'slider' }], ['input[type=reset]', { given: [{ tagName: 'input', attributes: { type: 'reset' } }], want: 'button' }], @@ -156,129 +168,154 @@ describe('getRole', () => { ['input[type=tel]', { given: [{ tagName: 'input', attributes: { type: 'tel' } }], want: 'textbox' }], ['input[type=text]', { given: [{ tagName: 'input', attributes: { type: 'text' } }], want: 'textbox' }], ['input[type=shrek]', { given: [{ tagName: 'input', attributes: { type: 'shrek' } }], want: 'textbox' }], - ['input[type=time]', { given: [{ tagName: 'input', attributes: { type: 'time' } }], want: undefined }], + ['input[type=time]', { given: [{ tagName: 'input', attributes: { type: 'time' } }], want: NO_CORRESPONDING_ROLE }], ['input[type=url]', { given: [{ tagName: 'input', attributes: { type: 'url' } }], want: 'textbox' }], - ['input[type=week]', { given: [{ tagName: 'input', attributes: { type: 'week' } }], want: undefined }], + ['input[type=week]', { given: [{ tagName: 'input', attributes: { type: 'week' } }], want: NO_CORRESPONDING_ROLE }], // Note: for input lists, ONLY text, search, tel, url, email, and invalid // should produce a combobox. Other lists are ignored. But we want to test // all of them to guarantee this behavior is correct. // @see https://www.w3.org/TR/html-aria/#el-input-text-list - ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'things' } }], want: 'combobox' }], - ['input[type=button] (list)', { given: [{ tagName: 'input', attributes: { type: 'button' } }], want: 'button' }], + ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'suggestions' } }], want: 'combobox' }], + [ + 'input[type=button] (list)', + { given: [{ tagName: 'input', attributes: { type: 'button', list: 'suggestions' } }], want: 'button' }, + ], [ 'input[type=color] (list)', - { given: [{ tagName: 'input', attributes: { type: 'color', list: 'colors' } }], want: undefined }, + { + given: [{ tagName: 'input', attributes: { type: 'color', list: 'suggestions' } }], + want: NO_CORRESPONDING_ROLE, + }, ], [ 'input[type=date] (list)', - { given: [{ tagName: 'input', attributes: { type: 'date', list: 'dates' } }], want: undefined }, + { given: [{ tagName: 'input', attributes: { type: 'date', list: 'suggestions' } }], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=datetime-local] (list)', - { given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'datetimes' } }], want: undefined }, + { + given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'suggestions' } }], + want: NO_CORRESPONDING_ROLE, + }, ], [ 'input[type=email] (list)', - { given: [{ tagName: 'input', attributes: { type: 'email', list: 'emails' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'email', list: 'suggestions' } }], want: 'combobox' }, ], [ 'input[type=file] (list)', - { given: [{ tagName: 'input', attributes: { type: 'file', list: 'files' } }], want: undefined }, + { given: [{ tagName: 'input', attributes: { type: 'file', list: 'suggestions' } }], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=hidden] (list)', - { given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'secrets' } }], want: undefined }, + { + given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'suggestions' } }], + want: NO_CORRESPONDING_ROLE, + }, ], [ 'input[type=month] (list)', - { given: [{ tagName: 'input', attributes: { type: 'month', list: 'months' } }], want: undefined }, + { + given: [{ tagName: 'input', attributes: { type: 'month', list: 'suggestions' } }], + want: NO_CORRESPONDING_ROLE, + }, ], [ 'input[type=number] (list)', - { given: [{ tagName: 'input', attributes: { type: 'number', list: 'numbers' } }], want: 'spinbutton' }, + { given: [{ tagName: 'input', attributes: { type: 'number', list: 'suggestions' } }], want: 'spinbutton' }, ], [ 'input[type=password] (list)', - { given: [{ tagName: 'input', attributes: { type: 'password', list: 'passwords' } }], want: undefined }, + { + given: [{ tagName: 'input', attributes: { type: 'password', list: 'suggestions' } }], + want: NO_CORRESPONDING_ROLE, + }, ], [ 'input[type=radio] (list)', - { given: [{ tagName: 'input', attributes: { type: 'radio', list: 'radios' } }], want: 'radio' }, + { given: [{ tagName: 'input', attributes: { type: 'radio', list: 'suggestions' } }], want: 'radio' }, ], [ 'input[type=range] (list)', - { given: [{ tagName: 'input', attributes: { type: 'range', list: 'ranges' } }], want: 'slider' }, + { given: [{ tagName: 'input', attributes: { type: 'range', list: 'suggestions' } }], want: 'slider' }, ], [ 'input[type=reset] (list)', - { given: [{ tagName: 'input', attributes: { type: 'reset', list: 'buttons' } }], want: 'button' }, + { given: [{ tagName: 'input', attributes: { type: 'reset', list: 'suggestions' } }], want: 'button' }, ], [ 'input[type=search] (list)', - { given: [{ tagName: 'input', attributes: { type: 'search', list: 'searches' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'search', list: 'suggestions' } }], want: 'combobox' }, ], [ 'input[type=submit] (list)', - { given: [{ tagName: 'input', attributes: { type: 'submit', list: 'buttons' } }], want: 'button' }, + { given: [{ tagName: 'input', attributes: { type: 'submit', list: 'suggestions' } }], want: 'button' }, ], [ 'input[type=tel] (list)', - { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'phone numbers' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'suggestions' } }], want: 'combobox' }, ], [ 'input[type=text] (list)', - { given: [{ tagName: 'input', attributes: { type: 'text', list: 'texts' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'text', list: 'suggestions' } }], want: 'combobox' }, ], [ 'input[type=shrek] (list)', - { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'ogres' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'suggestions' } }], want: 'combobox' }, ], [ 'input[type=time] (list)', - { given: [{ tagName: 'input', attributes: { type: 'time', list: 'times' } }], want: undefined }, + { given: [{ tagName: 'input', attributes: { type: 'time', list: 'suggestions' } }], want: NO_CORRESPONDING_ROLE }, ], [ 'input[type=url] (list)', - { given: [{ tagName: 'input', attributes: { type: 'url', list: 'urls' } }], want: 'combobox' }, + { given: [{ tagName: 'input', attributes: { type: 'url', list: 'ursuggestionsls' } }], want: 'combobox' }, ], [ 'input[type=week] (list)', - { given: [{ tagName: 'input', attributes: { type: 'week', list: 'weeks' } }], want: undefined }, + { given: [{ tagName: 'input', attributes: { type: 'week', list: 'suggestions' } }], want: NO_CORRESPONDING_ROLE }, ], ['ins', { given: [{ tagName: 'ins' }], want: 'insertion' }], - ['label', { given: [{ tagName: 'label' }], want: undefined }], - ['legend', { given: [{ tagName: 'legend' }], want: undefined }], + ['kbd', { given: [{ tagName: 'kbd' }], want: NO_CORRESPONDING_ROLE }], + ['label', { given: [{ tagName: 'label' }], want: NO_CORRESPONDING_ROLE }], + ['legend', { given: [{ tagName: 'legend' }], want: NO_CORRESPONDING_ROLE }], ['li', { given: [{ tagName: 'li' }], want: 'listitem' }], - ['li (no ancestors)', { given: [{ tagName: 'li' }, { ancestors: [] }], want: 'generic' }], ['li (list parent)', { given: [{ tagName: 'li' }, { ancestors: [{ tagName: 'ul' }] }], want: 'listitem' }], - ['link', { given: [{ tagName: 'link' }], want: undefined }], - ['kbd', { given: [{ tagName: 'kbd' }], want: undefined }], + [ + 'li (list role parent)', + { + given: [{ tagName: 'li' }, { ancestors: [{ tagName: 'div', attributes: { role: 'list' } }] }], + want: 'listitem', + }, + ], + ['li (no ancestors)', { given: [{ tagName: 'li' }, { ancestors: [] }], want: 'generic' }], + ['link', { given: [{ tagName: 'link' }], want: NO_CORRESPONDING_ROLE }], ['main', { given: [{ tagName: 'main' }], want: 'main' }], - ['map', { given: [{ tagName: 'map' }], want: undefined }], + ['map', { given: [{ tagName: 'map' }], want: NO_CORRESPONDING_ROLE }], ['mark', { given: [{ tagName: 'mark' }], want: 'mark' }], ['math', { given: [{ tagName: 'math' }], want: 'math' }], ['menu', { given: [{ tagName: 'menu' }], want: 'list' }], - ['meta', { given: [{ tagName: 'meta' }], want: undefined }], + ['meta', { given: [{ tagName: 'meta' }], want: NO_CORRESPONDING_ROLE }], ['meter', { given: [{ tagName: 'meter' }], want: 'meter' }], ['nav', { given: [{ tagName: 'nav' }], want: 'navigation' }], - ['noscript', { given: [{ tagName: 'noscript' }], want: undefined }], - ['object', { given: [{ tagName: 'object' }], want: undefined }], + ['noscript', { given: [{ tagName: 'noscript' }], want: NO_CORRESPONDING_ROLE }], + ['object', { given: [{ tagName: 'object' }], want: NO_CORRESPONDING_ROLE }], ['ol', { given: [{ tagName: 'ol' }], want: 'list' }], ['optgroup', { given: [{ tagName: 'optgroup' }], want: 'group' }], ['option', { given: [{ tagName: 'option' }], want: 'option' }], ['output', { given: [{ tagName: 'output' }], want: 'status' }], ['p', { given: [{ tagName: 'p' }], want: 'paragraph' }], - ['picture', { given: [{ tagName: 'picture' }], want: undefined }], + ['picture', { given: [{ tagName: 'picture' }], want: NO_CORRESPONDING_ROLE }], ['pre', { given: [{ tagName: 'pre' }], want: 'generic' }], ['progress', { given: [{ tagName: 'progress' }], want: 'progressbar' }], ['q', { given: [{ tagName: 'q' }], want: 'generic' }], - ['rp', { given: [{ tagName: 'rp' }], want: undefined }], - ['rt', { given: [{ tagName: 'rt' }], want: undefined }], - ['ruby', { given: [{ tagName: 'ruby' }], want: undefined }], + ['rp', { given: [{ tagName: 'rp' }], want: NO_CORRESPONDING_ROLE }], + ['rt', { given: [{ tagName: 'rt' }], want: NO_CORRESPONDING_ROLE }], + ['ruby', { given: [{ tagName: 'ruby' }], want: NO_CORRESPONDING_ROLE }], ['s', { given: [{ tagName: 's' }], want: 'deletion' }], ['samp', { given: [{ tagName: 'samp' }], want: 'generic' }], - ['script', { given: [{ tagName: 'script' }], want: undefined }], + ['script', { given: [{ tagName: 'script' }], want: NO_CORRESPONDING_ROLE }], ['search', { given: [{ tagName: 'search' }], want: 'search' }], [ 'section (named by label)', @@ -297,12 +334,12 @@ describe('getRole', () => { ['select[role=generic]', { given: [{ tagName: 'select', attributes: { role: 'generic' } }], want: 'generic' }], ['span', { given: [{ tagName: 'span' }], want: 'generic' }], ['small', { given: [{ tagName: 'small' }], want: 'generic' }], - ['source', { given: [{ tagName: 'source' }], want: undefined }], - ['slot', { given: [{ tagName: 'slot' }], want: undefined }], + ['source', { given: [{ tagName: 'source' }], want: NO_CORRESPONDING_ROLE }], + ['slot', { given: [{ tagName: 'slot' }], want: NO_CORRESPONDING_ROLE }], ['strong', { given: [{ tagName: 'strong' }], want: 'strong' }], - ['style', { given: [{ tagName: 'style' }], want: undefined }], + ['style', { given: [{ tagName: 'style' }], want: NO_CORRESPONDING_ROLE }], ['sub', { given: [{ tagName: 'sub' }], want: 'subscript' }], - ['summary', { given: [{ tagName: 'summary' }], want: undefined }], + ['summary', { given: [{ tagName: 'summary' }], want: NO_CORRESPONDING_ROLE }], ['sup', { given: [{ tagName: 'sup' }], want: 'superscript' }], ['svg', { given: [{ tagName: 'svg' }], want: 'graphics-document' }], ['svg[role=img]', { given: [{ tagName: 'svg', attributes: { role: 'img' } }], want: 'img' }], @@ -363,14 +400,19 @@ describe('getRole', () => { }, ], ['time', { given: [{ tagName: 'time' }], want: 'time' }], - ['title', { given: [{ tagName: 'title' }], want: undefined }], + ['title', { given: [{ tagName: 'title' }], want: NO_CORRESPONDING_ROLE }], ['tr', { given: [{ tagName: 'tr' }], want: 'row' }], - ['track', { given: [{ tagName: 'track' }], want: undefined }], + ['track', { given: [{ tagName: 'track' }], want: NO_CORRESPONDING_ROLE }], ['u', { given: [{ tagName: 'u' }], want: 'generic' }], ['ul', { given: [{ tagName: 'ul' }], want: 'list' }], - ['var', { given: [{ tagName: 'var' }], want: undefined }], - ['video', { given: [{ tagName: 'video' }], want: undefined }], - ['wbr', { given: [{ tagName: 'wbr' }], want: undefined }], + ['var', { given: [{ tagName: 'var' }], want: NO_CORRESPONDING_ROLE }], + ['video', { given: [{ tagName: 'video' }], want: NO_CORRESPONDING_ROLE }], + ['wbr', { given: [{ tagName: 'wbr' }], want: NO_CORRESPONDING_ROLE }], + ['custom element', { given: [{ tagName: 'x-button' as TagName }], want: 'generic' }], + [ + 'custom element (with role)', + { given: [{ tagName: 'x-button' as TagName, attributes: { role: 'button' } }], want: 'button' }, + ], ]; const testedTags = new Set(); diff --git a/test/node/get-supported-attributes.test.ts b/test/node/get-supported-attributes.test.ts index 91d8972..f83b26c 100644 --- a/test/node/get-supported-attributes.test.ts +++ b/test/node/get-supported-attributes.test.ts @@ -61,39 +61,31 @@ import { checkTestAndTagName } from '../helpers.js'; // commonly-used lists const GLOBAL_ATTRIBUTES = Object.keys(globalAttributes) as ARIAAttribute[]; -const BUTTON_ATTRIBUTES = [...GLOBAL_ATTRIBUTES, ...roles.button.supported]; -const GENERIC_NO_NAMING = removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.generic.supported], { - nameProhibited: true, -}); -const TEXTBOX_ATTRIBUTES = [...GLOBAL_ATTRIBUTES, ...roles.textbox.supported]; -const COMBOBOX_ATTRIBUTES = [...GLOBAL_ATTRIBUTES, ...roles.combobox.supported]; +const BUTTON_ATTRIBUTES = roles.button.supported; +const GENERIC_NO_NAMING = removeProhibited(roles.generic.supported, { nameProhibited: true }); +const TEXTBOX_ATTRIBUTES = roles.textbox.supported; +const COMBOBOX_ATTRIBUTES = roles.combobox.supported; const tests: [ string, { given: Parameters; want: ReturnType }, ][] = [ ['a', { given: [{ tagName: 'a' }], want: GENERIC_NO_NAMING }], - [ - 'a (href)', - { given: [{ tagName: 'a', attributes: { href: '#' } }], want: [...GLOBAL_ATTRIBUTES, ...roles.link.supported] }, - ], + ['a (href)', { given: [{ tagName: 'a', attributes: { href: '#' } }], want: roles.link.supported }], ['area', { given: [{ tagName: 'area' }], want: GENERIC_NO_NAMING }], - [ - 'area (href)', - { given: [{ tagName: 'area', attributes: { href: '#' } }], want: [...GLOBAL_ATTRIBUTES, ...roles.link.supported] }, - ], + ['area (href)', { given: [{ tagName: 'area', attributes: { href: '#' } }], want: roles.link.supported }], ['abbr', { given: [{ tagName: 'abbr' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], - ['address', { given: [{ tagName: 'address' }], want: [...GLOBAL_ATTRIBUTES, ...roles.group.supported] }], - ['article', { given: [{ tagName: 'article' }], want: [...GLOBAL_ATTRIBUTES, ...roles.article.supported] }], - ['aside', { given: [{ tagName: 'aside' }], want: [...GLOBAL_ATTRIBUTES, ...roles.complementary.supported] }], - ['audio', { given: [{ tagName: 'audio' }], want: [...GLOBAL_ATTRIBUTES, ...roles.application.supported] }], - ['b', { given: [{ tagName: 'b' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], + ['address', { given: [{ tagName: 'address' }], want: roles.group.supported }], + ['article', { given: [{ tagName: 'article' }], want: roles.article.supported }], + ['aside', { given: [{ tagName: 'aside' }], want: roles.complementary.supported }], + ['audio', { given: [{ tagName: 'audio' }], want: roles.application.supported }], + ['b', { given: [{ tagName: 'b' }], want: GENERIC_NO_NAMING }], ['b[role=generic]', { given: [{ tagName: 'b', attributes: { role: 'generic' } }], want: GENERIC_NO_NAMING }], ['b[role=button]', { given: [{ tagName: 'b', attributes: { role: 'button' } }], want: BUTTON_ATTRIBUTES }], ['base', { given: [{ tagName: 'base' }], want: NO_ATTRIBUTES }], ['bdi', { given: [{ tagName: 'bdi' }], want: GENERIC_NO_NAMING }], ['bdo', { given: [{ tagName: 'bdo' }], want: GENERIC_NO_NAMING }], - ['blockquote', { given: [{ tagName: 'blockquote' }], want: [...GLOBAL_ATTRIBUTES, ...roles.blockquote.supported] }], + ['blockquote', { given: [{ tagName: 'blockquote' }], want: roles.blockquote.supported }], [ 'body', { @@ -103,12 +95,12 @@ const tests: [ ], ['br', { given: [{ tagName: 'br' }], want: ['aria-hidden'] }], ['button', { given: [{ tagName: 'button' }], want: BUTTON_ATTRIBUTES }], - ['canvas', { given: [{ tagName: 'canvas' }], want: [...GLOBAL_ATTRIBUTES] }], + ['canvas', { given: [{ tagName: 'canvas' }], want: GLOBAL_ATTRIBUTES }], [ 'caption', { given: [{ tagName: 'caption' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.caption.supported], { nameProhibited: true }), + want: removeProhibited([...roles.caption.supported], { nameProhibited: true }), }, ], ['cite', { given: [{ tagName: 'cite' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], @@ -116,72 +108,57 @@ const tests: [ 'code', { given: [{ tagName: 'code' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.code.supported], { nameProhibited: true }), + want: removeProhibited([...roles.code.supported], { nameProhibited: true }), }, ], ['col', { given: [{ tagName: 'col' }], want: NO_ATTRIBUTES }], ['colgroup', { given: [{ tagName: 'colgroup' }], want: NO_ATTRIBUTES }], ['data', { given: [{ tagName: 'data' }], want: GENERIC_NO_NAMING }], ['datalist', { given: [{ tagName: 'datalist' }], want: NO_ATTRIBUTES }], - ['dd', { given: [{ tagName: 'dd' }], want: [...GLOBAL_ATTRIBUTES, ...roles.definition.supported] }], + ['dd', { given: [{ tagName: 'dd' }], want: roles.definition.supported }], [ 'del', - { - given: [{ tagName: 'del' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.deletion.supported], { nameProhibited: true }), - }, - ], - ['details', { given: [{ tagName: 'details' }], want: [...GLOBAL_ATTRIBUTES, ...roles.group.supported] }], - [ - 'dfn', - { - given: [{ tagName: 'dfn' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.term.supported], { nameProhibited: true }), - }, + { given: [{ tagName: 'del' }], want: removeProhibited([...roles.deletion.supported], { nameProhibited: true }) }, ], - ['dialog', { given: [{ tagName: 'dialog' }], want: [...GLOBAL_ATTRIBUTES, ...roles.dialog.supported] }], + ['details', { given: [{ tagName: 'details' }], want: roles.group.supported }], + ['dfn', { given: [{ tagName: 'dfn' }], want: removeProhibited([...roles.term.supported], { nameProhibited: true }) }], + ['dialog', { given: [{ tagName: 'dialog' }], want: roles.dialog.supported }], ['div', { given: [{ tagName: 'div' }], want: GENERIC_NO_NAMING }], ['div[role=button]', { given: [{ tagName: 'div', attributes: { role: 'button' } }], want: BUTTON_ATTRIBUTES }], ['dl', { given: [{ tagName: 'dl' }], want: GLOBAL_ATTRIBUTES }], - ['dt', { given: [{ tagName: 'dt' }], want: GLOBAL_ATTRIBUTES }], - ['em', { given: [{ tagName: 'em' }], want: GENERIC_NO_NAMING }], + ['dt', { given: [{ tagName: 'dt' }], want: roles.term.supported }], + ['em', { given: [{ tagName: 'em' }], want: removeProhibited(roles.emphasis.supported, { nameProhibited: true }) }], ['embed', { given: [{ tagName: 'embed' }], want: GLOBAL_ATTRIBUTES }], - ['fieldset', { given: [{ tagName: 'fieldset' }], want: [...GLOBAL_ATTRIBUTES, ...roles.group.supported] }], + ['fieldset', { given: [{ tagName: 'fieldset' }], want: roles.group.supported }], [ 'figcaption', - { given: [{ tagName: 'figcaption' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }, - ], - ['figure', { given: [{ tagName: 'figure' }], want: [...GLOBAL_ATTRIBUTES, ...roles.figure.supported] }], - ['form', { given: [{ tagName: 'form' }], want: [...GLOBAL_ATTRIBUTES, ...roles.form.supported] }], - ['footer', { given: [{ tagName: 'footer' }], want: [...GLOBAL_ATTRIBUTES, ...roles.contentinfo.supported] }], - ['g', { given: [{ tagName: 'g' }], want: [...GLOBAL_ATTRIBUTES] }], - ['h1', { given: [{ tagName: 'h1' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], - ['h2', { given: [{ tagName: 'h2' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], - ['h3', { given: [{ tagName: 'h3' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], - ['h4', { given: [{ tagName: 'h4' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], - ['h5', { given: [{ tagName: 'h5' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], - ['h6', { given: [{ tagName: 'h6' }], want: [...GLOBAL_ATTRIBUTES, ...roles.heading.supported] }], + { given: [{ tagName: 'figcaption' }], want: removeProhibited(roles.caption.supported, { nameProhibited: true }) }, + ], + ['figure', { given: [{ tagName: 'figure' }], want: roles.figure.supported }], + ['form', { given: [{ tagName: 'form' }], want: roles.form.supported }], + ['footer', { given: [{ tagName: 'footer' }], want: roles.contentinfo.supported }], + ['g', { given: [{ tagName: 'g' }], want: GLOBAL_ATTRIBUTES }], + ['h1', { given: [{ tagName: 'h1' }], want: roles.heading.supported }], + ['h2', { given: [{ tagName: 'h2' }], want: roles.heading.supported }], + ['h3', { given: [{ tagName: 'h3' }], want: roles.heading.supported }], + ['h4', { given: [{ tagName: 'h4' }], want: roles.heading.supported }], + ['h5', { given: [{ tagName: 'h5' }], want: roles.heading.supported }], + ['h6', { given: [{ tagName: 'h6' }], want: roles.heading.supported }], ['head', { given: [{ tagName: 'head' }], want: NO_ATTRIBUTES }], - ['header', { given: [{ tagName: 'header' }], want: [...GLOBAL_ATTRIBUTES, ...roles.banner.supported] }], - ['hgroup', { given: [{ tagName: 'hgroup' }], want: [...GLOBAL_ATTRIBUTES, ...roles.group.supported] }], - ['hr', { given: [{ tagName: 'hr' }], want: [...GLOBAL_ATTRIBUTES, ...roles.separator.supported] }], + ['header', { given: [{ tagName: 'header' }], want: roles.banner.supported }], + ['hgroup', { given: [{ tagName: 'hgroup' }], want: roles.group.supported }], + ['hr', { given: [{ tagName: 'hr' }], want: roles.separator.supported }], ['html', { given: [{ tagName: 'html' }], want: NO_ATTRIBUTES }], - ['i', { given: [{ tagName: 'i' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], + ['i', { given: [{ tagName: 'i' }], want: GENERIC_NO_NAMING }], ['iframe', { given: [{ tagName: 'iframe' }], want: GLOBAL_ATTRIBUTES }], - [ - 'img (name)', - { - given: [{ tagName: 'img', attributes: { alt: 'Alt text' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.img.supported], - }, - ], + ['img (name)', { given: [{ tagName: 'img', attributes: { alt: 'Alt text' } }], want: roles.img.supported }], ['img (no name)', { given: [{ tagName: 'img' }], want: ['aria-hidden'] }], ['input[type=button]', { given: [{ tagName: 'input', attributes: { type: 'button' } }], want: BUTTON_ATTRIBUTES }], [ 'input[type=checkbox]', { given: [{ tagName: 'input', attributes: { type: 'checkbox' } }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.checkbox.supported], { prohibited: ['aria-checked'] }), + want: removeProhibited([...roles.checkbox.supported], { prohibited: ['aria-checked'] }), }, ], [ @@ -206,10 +183,7 @@ const tests: [ ['input[type=month]', { given: [{ tagName: 'input', attributes: { type: 'month' } }], want: TEXTBOX_ATTRIBUTES }], [ 'input[type=number]', - { - given: [{ tagName: 'input', attributes: { type: 'number' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.spinbutton.supported], - }, + { given: [{ tagName: 'input', attributes: { type: 'number' } }], want: roles.spinbutton.supported }, ], [ 'input[type=password]', @@ -219,23 +193,14 @@ const tests: [ 'input[type=radio]', { given: [{ tagName: 'input', attributes: { type: 'radio' } }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.radio.supported], { prohibited: ['aria-checked'] }), - }, - ], - [ - 'input[type=range]', - { - given: [{ tagName: 'input', attributes: { type: 'range' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.slider.supported], + want: removeProhibited([...roles.radio.supported], { prohibited: ['aria-checked'] }), }, ], + ['input[type=range]', { given: [{ tagName: 'input', attributes: { type: 'range' } }], want: roles.slider.supported }], ['input[type=reset]', { given: [{ tagName: 'input', attributes: { type: 'reset' } }], want: BUTTON_ATTRIBUTES }], [ 'input[type=search]', - { - given: [{ tagName: 'input', attributes: { type: 'search' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.searchbox.supported], - }, + { given: [{ tagName: 'input', attributes: { type: 'search' } }], want: roles.searchbox.supported }, ], ['input[type=shrek]', { given: [{ tagName: 'input', attributes: { type: 'shrek' } }], want: TEXTBOX_ATTRIBUTES }], ['input[type=submit]', { given: [{ tagName: 'input', attributes: { type: 'submit' } }], want: BUTTON_ATTRIBUTES }], @@ -249,117 +214,114 @@ const tests: [ // should produce a combobox. Other lists are ignored. But we want to test // all of them to guarantee this behavior is correct. // @see https://www.w3.org/TR/html-aria/#el-input-text-list - ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'things' } }], want: COMBOBOX_ATTRIBUTES }], + ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }], [ 'input[type=button] (list)', { - given: [{ tagName: 'input', attributes: { type: 'button' } }], + given: [{ tagName: 'input', attributes: { type: 'button', list: 'suggestions' } }], want: BUTTON_ATTRIBUTES, }, ], [ 'input[type=color] (list)', { - given: [{ tagName: 'input', attributes: { type: 'color', list: 'colors' } }], + given: [{ tagName: 'input', attributes: { type: 'color', list: 'suggestions' } }], want: [...GLOBAL_ATTRIBUTES, 'aria-disabled'], }, ], [ 'input[type=date] (list)', - { given: [{ tagName: 'input', attributes: { type: 'date', list: 'dates' } }], want: TEXTBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'date', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES }, ], [ 'input[type=datetime-local] (list)', { - given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'datetimes' } }], + given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES, }, ], [ 'input[type=email] (list)', - { given: [{ tagName: 'input', attributes: { type: 'email', list: 'emails' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'email', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=file] (list)', { - given: [{ tagName: 'input', attributes: { type: 'file', list: 'files' } }], + given: [{ tagName: 'input', attributes: { type: 'file', list: 'suggestions' } }], want: [...GLOBAL_ATTRIBUTES, 'aria-disabled', 'aria-invalid', 'aria-required'], }, ], [ 'input[type=hidden] (list)', - { given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'secrets' } }], want: NO_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'suggestions' } }], want: NO_ATTRIBUTES }, ], [ 'input[type=month] (list)', - { given: [{ tagName: 'input', attributes: { type: 'month', list: 'months' } }], want: TEXTBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'month', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES }, ], [ 'input[type=number] (list)', { - given: [{ tagName: 'input', attributes: { type: 'number', list: 'numbers' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.spinbutton.supported], + given: [{ tagName: 'input', attributes: { type: 'number', list: 'suggestions' } }], + want: roles.spinbutton.supported, }, ], [ 'input[type=password] (list)', - { given: [{ tagName: 'input', attributes: { type: 'password', list: 'passwords' } }], want: TEXTBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'password', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES }, ], [ 'input[type=radio] (list)', { - given: [{ tagName: 'input', attributes: { type: 'radio', list: 'radios' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.radio.supported].filter((a) => a !== 'aria-checked'), + given: [{ tagName: 'input', attributes: { type: 'radio', list: 'suggestions' } }], + want: roles.radio.supported.filter((a) => a !== 'aria-checked'), }, ], [ 'input[type=range] (list)', - { - given: [{ tagName: 'input', attributes: { type: 'range', list: 'ranges' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.slider.supported], - }, + { given: [{ tagName: 'input', attributes: { type: 'range', list: 'suggestions' } }], want: roles.slider.supported }, ], [ 'input[type=reset] (list)', { - given: [{ tagName: 'input', attributes: { type: 'reset', list: 'buttons' } }], + given: [{ tagName: 'input', attributes: { type: 'reset', list: 'suggestions' } }], want: BUTTON_ATTRIBUTES, }, ], [ 'input[type=search] (list)', - { given: [{ tagName: 'input', attributes: { type: 'search', list: 'searches' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'search', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=submit] (list)', { - given: [{ tagName: 'input', attributes: { type: 'submit', list: 'buttons' } }], + given: [{ tagName: 'input', attributes: { type: 'submit', list: 'suggestions' } }], want: BUTTON_ATTRIBUTES, }, ], [ 'input[type=tel] (list)', - { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'phone numbers' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=text] (list)', - { given: [{ tagName: 'input', attributes: { type: 'text', list: 'texts' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'text', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=shrek] (list)', - { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'ogres' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=time] (list)', - { given: [{ tagName: 'input', attributes: { type: 'time', list: 'times' } }], want: TEXTBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'time', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES }, ], [ 'input[type=url] (list)', - { given: [{ tagName: 'input', attributes: { type: 'url', list: 'urls' } }], want: COMBOBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'url', list: 'suggestions' } }], want: COMBOBOX_ATTRIBUTES }, ], [ 'input[type=week] (list)', - { given: [{ tagName: 'input', attributes: { type: 'week', list: 'weeks' } }], want: TEXTBOX_ATTRIBUTES }, + { given: [{ tagName: 'input', attributes: { type: 'week', list: 'suggestions' } }], want: TEXTBOX_ATTRIBUTES }, ], [ 'ins', @@ -371,38 +333,35 @@ const tests: [ ['kbd', { given: [{ tagName: 'kbd' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], ['label', { given: [{ tagName: 'label' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], ['legend', { given: [{ tagName: 'legend' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], - ['li', { given: [{ tagName: 'li' }], want: [...GLOBAL_ATTRIBUTES, ...roles.listitem.supported] }], + ['li', { given: [{ tagName: 'li' }], want: roles.listitem.supported }], ['link', { given: [{ tagName: 'link' }], want: NO_ATTRIBUTES }], - ['main', { given: [{ tagName: 'main' }], want: [...GLOBAL_ATTRIBUTES, ...roles.main.supported] }], + ['main', { given: [{ tagName: 'main' }], want: roles.main.supported }], ['map', { given: [{ tagName: 'map' }], want: NO_ATTRIBUTES }], [ 'mark', { given: [{ tagName: 'mark' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.mark.supported], { nameProhibited: true }), + want: removeProhibited([...roles.mark.supported], { nameProhibited: true }), }, ], - ['math', { given: [{ tagName: 'math' }], want: [...GLOBAL_ATTRIBUTES, ...roles.math.supported] }], - ['menu', { given: [{ tagName: 'menu' }], want: [...GLOBAL_ATTRIBUTES, ...roles.list.supported] }], + ['math', { given: [{ tagName: 'math' }], want: roles.math.supported }], + ['menu', { given: [{ tagName: 'menu' }], want: roles.list.supported }], ['meta', { given: [{ tagName: 'meta' }], want: NO_ATTRIBUTES }], - ['meter', { given: [{ tagName: 'meter' }], want: [...GLOBAL_ATTRIBUTES, ...roles.meter.supported] }], - ['nav', { given: [{ tagName: 'nav' }], want: [...GLOBAL_ATTRIBUTES, ...roles.navigation.supported] }], + ['meter', { given: [{ tagName: 'meter' }], want: roles.meter.supported }], + ['nav', { given: [{ tagName: 'nav' }], want: roles.navigation.supported }], ['noscript', { given: [{ tagName: 'noscript' }], want: NO_ATTRIBUTES }], ['object', { given: [{ tagName: 'object' }], want: GLOBAL_ATTRIBUTES }], - ['ol', { given: [{ tagName: 'ol' }], want: [...GLOBAL_ATTRIBUTES, ...roles.list.supported] }], - ['optgroup', { given: [{ tagName: 'optgroup' }], want: [...GLOBAL_ATTRIBUTES, ...roles.group.supported] }], - ['option', { given: [{ tagName: 'option' }], want: [...GLOBAL_ATTRIBUTES, ...roles.option.supported] }], - ['output', { given: [{ tagName: 'output' }], want: [...GLOBAL_ATTRIBUTES, ...roles.status.supported] }], + ['ol', { given: [{ tagName: 'ol' }], want: roles.list.supported }], + ['optgroup', { given: [{ tagName: 'optgroup' }], want: roles.group.supported }], + ['option', { given: [{ tagName: 'option' }], want: roles.option.supported }], + ['output', { given: [{ tagName: 'output' }], want: roles.status.supported }], [ 'p', - { - given: [{ tagName: 'p' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.paragraph.supported], { nameProhibited: true }), - }, + { given: [{ tagName: 'p' }], want: removeProhibited([...roles.paragraph.supported], { nameProhibited: true }) }, ], ['picture', { given: [{ tagName: 'picture' }], want: ['aria-hidden'] }], ['pre', { given: [{ tagName: 'pre' }], want: GENERIC_NO_NAMING }], - ['progress', { given: [{ tagName: 'progress' }], want: [...GLOBAL_ATTRIBUTES, ...roles.progressbar.supported] }], + ['progress', { given: [{ tagName: 'progress' }], want: roles.progressbar.supported }], ['q', { given: [{ tagName: 'q' }], want: GENERIC_NO_NAMING }], ['rp', { given: [{ tagName: 'rp' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], ['rt', { given: [{ tagName: 'rt' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], @@ -411,7 +370,7 @@ const tests: [ 's', { given: [{ tagName: 's' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.deletion.supported], { nameProhibited: true }), + want: removeProhibited([...roles.deletion.supported], { nameProhibited: true }), }, ], ['samp', { given: [{ tagName: 'samp' }], want: GENERIC_NO_NAMING }], @@ -428,19 +387,10 @@ const tests: [ ['select', { given: [{ tagName: 'select' }], want: COMBOBOX_ATTRIBUTES }], ['select[size=0]', { given: [{ tagName: 'select', attributes: { size: 0 } }], want: COMBOBOX_ATTRIBUTES }], ['select[size=1]', { given: [{ tagName: 'select', attributes: { size: 1 } }], want: COMBOBOX_ATTRIBUTES }], - [ - 'select[size=2]', - { - given: [{ tagName: 'select', attributes: { size: 2 } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.listbox.supported], - }, - ], + ['select[size=2]', { given: [{ tagName: 'select', attributes: { size: 2 } }], want: roles.listbox.supported }], [ 'select[multiple]', - { - given: [{ tagName: 'select', attributes: { multiple: true } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.listbox.supported], - }, + { given: [{ tagName: 'select', attributes: { multiple: true } }], want: roles.listbox.supported }, ], [ 'select[role=generic]', @@ -452,64 +402,43 @@ const tests: [ ['span', { given: [{ tagName: 'span' }], want: GENERIC_NO_NAMING }], [ 'strong', - { - given: [{ tagName: 'strong' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.strong.supported], { nameProhibited: true }), - }, + { given: [{ tagName: 'strong' }], want: removeProhibited(roles.strong.supported, { nameProhibited: true }) }, ], ['style', { given: [{ tagName: 'style' }], want: NO_ATTRIBUTES }], - [ - 'sub', - { - given: [{ tagName: 'sub' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.subscript.supported], { nameProhibited: true }), - }, - ], + ['sub', { given: [{ tagName: 'sub' }], want: removeProhibited(roles.subscript.supported, { nameProhibited: true }) }], ['summary', { given: [{ tagName: 'summary' }], want: GLOBAL_ATTRIBUTES.concat(['aria-disabled', 'aria-haspopup']) }], [ 'sup', - { - given: [{ tagName: 'sup' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.superscript.supported], { nameProhibited: true }), - }, + { given: [{ tagName: 'sup' }], want: removeProhibited(roles.superscript.supported, { nameProhibited: true }) }, ], - ['svg', { given: [{ tagName: 'svg' }], want: [...GLOBAL_ATTRIBUTES, ...roles['graphics-document'].supported] }], - ['table', { given: [{ tagName: 'table' }], want: [...GLOBAL_ATTRIBUTES, ...roles.table.supported] }], - ['tbody', { given: [{ tagName: 'tbody' }], want: [...GLOBAL_ATTRIBUTES, ...roles.rowgroup.supported] }], - ['td', { given: [{ tagName: 'td' }], want: [...GLOBAL_ATTRIBUTES, ...roles.cell.supported] }], + ['svg', { given: [{ tagName: 'svg' }], want: roles['graphics-document'].supported }], + ['table', { given: [{ tagName: 'table' }], want: roles.table.supported }], + ['tbody', { given: [{ tagName: 'tbody' }], want: roles.rowgroup.supported }], + ['td', { given: [{ tagName: 'td' }], want: roles.cell.supported }], ['template', { given: [{ tagName: 'template' }], want: NO_ATTRIBUTES }], ['textarea', { given: [{ tagName: 'textarea' }], want: TEXTBOX_ATTRIBUTES }], - ['tfoot', { given: [{ tagName: 'tfoot' }], want: [...GLOBAL_ATTRIBUTES, ...roles.rowgroup.supported] }], - ['th', { given: [{ tagName: 'th' }], want: [...GLOBAL_ATTRIBUTES, ...roles.cell.supported] }], + ['tfoot', { given: [{ tagName: 'tfoot' }], want: roles.rowgroup.supported }], + ['th', { given: [{ tagName: 'th' }], want: roles.cell.supported }], [ 'th (thead)', - { - given: [{ tagName: 'th' }, { ancestors: [{ tagName: 'thead' }] }], - want: [...GLOBAL_ATTRIBUTES, ...roles.columnheader.supported], - }, - ], - [ - 'th', - { - given: [{ tagName: 'th', attributes: { scope: 'row' } }], - want: [...GLOBAL_ATTRIBUTES, ...roles.rowheader.supported], - }, + { given: [{ tagName: 'th' }, { ancestors: [{ tagName: 'thead' }] }], want: roles.columnheader.supported }, ], - ['thead', { given: [{ tagName: 'thead' }], want: [...GLOBAL_ATTRIBUTES, ...roles.rowgroup.supported] }], + ['th', { given: [{ tagName: 'th', attributes: { scope: 'row' } }], want: roles.rowheader.supported }], + ['thead', { given: [{ tagName: 'thead' }], want: roles.rowgroup.supported }], [ 'time', { given: [{ tagName: 'time' }], - want: removeProhibited([...GLOBAL_ATTRIBUTES, ...roles.time.supported], { nameProhibited: true }), + want: removeProhibited([...roles.time.supported], { nameProhibited: true }), }, ], ['title', { given: [{ tagName: 'title' }], want: NO_ATTRIBUTES }], - ['tr', { given: [{ tagName: 'tr' }], want: [...GLOBAL_ATTRIBUTES, ...roles.row.supported] }], + ['tr', { given: [{ tagName: 'tr' }], want: roles.row.supported }], ['track', { given: [{ tagName: 'track' }], want: NO_ATTRIBUTES }], ['u', { given: [{ tagName: 'u' }], want: GENERIC_NO_NAMING }], - ['ul', { given: [{ tagName: 'ul' }], want: [...GLOBAL_ATTRIBUTES, ...roles.list.supported] }], + ['ul', { given: [{ tagName: 'ul' }], want: roles.list.supported }], ['var', { given: [{ tagName: 'var' }], want: removeProhibited(GLOBAL_ATTRIBUTES, { nameProhibited: true }) }], - ['video', { given: [{ tagName: 'video' }], want: [...GLOBAL_ATTRIBUTES, ...roles.application.supported] }], + ['video', { given: [{ tagName: 'video' }], want: roles.application.supported }], ['wbr', { given: [{ tagName: 'wbr' }], want: ['aria-hidden'] }], ]; diff --git a/test/node/get-supported-roles.test.ts b/test/node/get-supported-roles.test.ts index 32dfe46..de00081 100644 --- a/test/node/get-supported-roles.test.ts +++ b/test/node/get-supported-roles.test.ts @@ -53,9 +53,9 @@ describe('getSupportedRoles', () => { ['code', { given: [{ tagName: 'code' }], want: ALL_ROLES }], ['col', { given: [{ tagName: 'col' }], want: NO_ROLES }], ['colgroup', { given: [{ tagName: 'colgroup' }], want: NO_ROLES }], - ['dd', { given: [{ tagName: 'dd' }], want: NO_ROLES }], ['data', { given: [{ tagName: 'data' }], want: ALL_ROLES }], ['datalist', { given: [{ tagName: 'datalist' }], want: ['listbox'] }], + ['dd', { given: [{ tagName: 'dd' }], want: ['definition'] }], ['del', { given: [{ tagName: 'del' }], want: ALL_ROLES }], ['details', { given: [{ tagName: 'details' }], want: ['group'] }], ['dfn', { given: [{ tagName: 'dfn' }], want: ALL_ROLES }], @@ -63,7 +63,7 @@ describe('getSupportedRoles', () => { ['div', { given: [{ tagName: 'div' }], want: ALL_ROLES }], ['div (dl)', { given: [{ tagName: 'div' }, { ancestors: [{ tagName: 'dl' }] }], want: ['none', 'presentation'] }], ['dl', { given: [{ tagName: 'dl' }], want: ['group', 'list', 'none', 'presentation'] }], - ['dt', { given: [{ tagName: 'dt' }], want: ['listitem'] }], + ['dt', { given: [{ tagName: 'dt' }], want: ['listitem', 'term'] }], ['em', { given: [{ tagName: 'em' }], want: ALL_ROLES }], [ 'embed', @@ -72,7 +72,7 @@ describe('getSupportedRoles', () => { ['form', { given: [{ tagName: 'form' }], want: ['form', 'none', 'presentation', 'search'] }], ['fieldset', { given: [{ tagName: 'fieldset' }], want: ['group', 'none', 'presentation', 'radiogroup'] }], ['figure', { given: [{ tagName: 'figure' }], want: ALL_ROLES }], - ['figcaption', { given: [{ tagName: 'figcaption' }], want: ['group', 'none', 'presentation'] }], + ['figcaption', { given: [{ tagName: 'figcaption' }], want: ['caption', 'group', 'none', 'presentation'] }], [ 'footer (landmark)', { @@ -189,120 +189,120 @@ describe('getSupportedRoles', () => { ['input[type=time]', { given: [{ tagName: 'input', attributes: { type: 'time' } }], want: [] }], ['input[type=url]', { given: [{ tagName: 'input', attributes: { type: 'url' } }], want: ['textbox'] }], ['input[type=week]', { given: [{ tagName: 'input', attributes: { type: 'week' } }], want: [] }], - ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'things' } }], want: ['combobox'] }], + ['input (list)', { given: [{ tagName: 'input', attributes: { list: 'suggestions' } }], want: ['combobox'] }], [ 'input[type=button] (list)', { - given: [{ tagName: 'input', attributes: { type: 'button', list: 'buttons' } }], + given: [{ tagName: 'input', attributes: { type: 'button', list: 'suggestions' } }], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], [ 'input[type=checkbox] (list)', { - given: [{ tagName: 'input', attributes: { type: 'checkbox', list: 'checkboxes' } }], + given: [{ tagName: 'input', attributes: { type: 'checkbox', list: 'suggestions' } }], want: ['checkbox', 'menuitemcheckbox', 'option', 'switch'], }, ], [ 'input[type=checkbox] (list, pressed)', { - given: [{ tagName: 'input', attributes: { type: 'checkbox', list: 'checkboxes', 'aria-pressed': true } }], + given: [{ tagName: 'input', attributes: { type: 'checkbox', list: 'suggestions', 'aria-pressed': true } }], want: ['button', 'checkbox', 'menuitemcheckbox', 'option', 'switch'], }, ], [ 'input[type=color] (list)', - { given: [{ tagName: 'input', attributes: { type: 'color', list: 'colors' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'color', list: 'suggestions' } }], want: [] }, ], [ 'input[type=date] (list)', - { given: [{ tagName: 'input', attributes: { type: 'date', list: 'dates' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'date', list: 'suggestions' } }], want: [] }, ], [ 'input[type=datetime-local] (list)', - { given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'datetimes' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'datetime-local', list: 'suggestions' } }], want: [] }, ], [ 'input[type=email] (list)', - { given: [{ tagName: 'input', attributes: { type: 'email', list: 'emails' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'email', list: 'suggestions' } }], want: ['combobox'] }, ], [ 'input[type=file] (list)', - { given: [{ tagName: 'input', attributes: { type: 'file', list: 'files' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'file', list: 'suggestions' } }], want: [] }, ], [ 'input[type=hidden] (list)', - { given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'secrets' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'hidden', list: 'suggestions' } }], want: [] }, ], [ 'input[type=month] (list)', - { given: [{ tagName: 'input', attributes: { type: 'month', list: 'months' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'month', list: 'suggestions' } }], want: [] }, ], [ 'input[type=number] (list)', - { given: [{ tagName: 'input', attributes: { type: 'number', list: 'numbers' } }], want: ['spinbutton'] }, + { given: [{ tagName: 'input', attributes: { type: 'number', list: 'suggestions' } }], want: ['spinbutton'] }, ], [ 'input[type=range] (list)', - { given: [{ tagName: 'input', attributes: { type: 'range', list: 'sliders' } }], want: ['slider'] }, + { given: [{ tagName: 'input', attributes: { type: 'range', list: 'suggestions' } }], want: ['slider'] }, ], [ 'input[type=password] (list)', - { given: [{ tagName: 'input', attributes: { type: 'password', list: 'passwords' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'password', list: 'suggestions' } }], want: [] }, ], [ - 'input[type=radio]', + 'input[type=radio] (list)', { - given: [{ tagName: 'input', attributes: { type: 'radio', list: 'radios' } }], + given: [{ tagName: 'input', attributes: { type: 'radio', list: 'suggestions' } }], want: ['menuitemradio', 'radio'], }, ], [ 'input[type=range] (list)', - { given: [{ tagName: 'input', attributes: { type: 'range', list: 'sliders' } }], want: ['slider'] }, + { given: [{ tagName: 'input', attributes: { type: 'range', list: 'suggestions' } }], want: ['slider'] }, ], [ - 'input[type=reset]', + 'input[type=reset] (list)', { - given: [{ tagName: 'input', attributes: { type: 'reset', list: 'buttons' } }], + given: [{ tagName: 'input', attributes: { type: 'reset', list: 'suggestions' } }], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], [ 'input[type=search] (list)', - { given: [{ tagName: 'input', attributes: { type: 'search', list: 'searches' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'search', list: 'suggestions' } }], want: ['combobox'] }, ], [ - 'input[type=submit]', + 'input[type=submit] (list)', { - given: [{ tagName: 'input', attributes: { type: 'submit', list: 'buttons' } }], + given: [{ tagName: 'input', attributes: { type: 'submit', list: 'suggestions' } }], want: ['button', 'checkbox', 'combobox', 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'separator', 'slider', 'switch', 'tab', 'treeitem'], // biome-ignore format: long list }, ], [ 'input[type=tel] (list)', - { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'phone numbers' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'tel', list: 'suggestions' } }], want: ['combobox'] }, ], [ 'input[type=text] (list)', - { given: [{ tagName: 'input', attributes: { type: 'text', list: 'texts' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'text', list: 'suggestions' } }], want: ['combobox'] }, ], [ 'input[type=shrek] (list)', - { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'ogres' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'shrek', list: 'suggestions' } }], want: ['combobox'] }, ], [ 'input[type=time] (list)', - { given: [{ tagName: 'input', attributes: { type: 'time', list: 'times' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'time', list: 'suggestions' } }], want: [] }, ], [ 'input[type=url] (list)', - { given: [{ tagName: 'input', attributes: { type: 'url', list: 'urls' } }], want: ['combobox'] }, + { given: [{ tagName: 'input', attributes: { type: 'url', list: 'suggestions' } }], want: ['combobox'] }, ], [ 'input[type=week] (list)', - { given: [{ tagName: 'input', attributes: { type: 'week', list: 'weeks' } }], want: [] }, + { given: [{ tagName: 'input', attributes: { type: 'week', list: 'suggestions' } }], want: [] }, ], ['ins', { given: [{ tagName: 'ins' }], want: ALL_ROLES }], ['label', { given: [{ tagName: 'label' }], want: [] }], diff --git a/test/node/utils.test.ts b/test/node/utils.test.ts index 8b20efd..3286590 100644 --- a/test/node/utils.test.ts +++ b/test/node/utils.test.ts @@ -19,7 +19,7 @@ describe('removeProhibited', () => { ], { nameProhibited: true }, ), - ).toEqual(['aria-atomic']); + ).toEqual(['aria-atomic', 'aria-brailleroledescription', 'aria-roledescription']); }); test('prohibited', () => { @@ -51,6 +51,6 @@ describe('removeProhibited', () => { ], { nameProhibited: true, prohibited: ['aria-checked'] }, ), - ).toEqual(['aria-atomic']); + ).toEqual(['aria-atomic', 'aria-brailleroledescription', 'aria-roledescription']); }); }); diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 088ee50..4f40e2e 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -22,15 +22,15 @@ export default defineWorkspace([ environment: 'happy-dom', }, }, - { - test: { - name: 'browser', - include: ['./test/dom/**/*.test.ts'], - browser: { - provider: 'playwright', - enabled: true, - instances: [{ browser: 'chromium' }], - }, - }, - }, + // { + // test: { + // name: 'browser', + // include: ['./test/dom/**/*.test.ts'], + // browser: { + // provider: 'playwright', + // enabled: true, + // instances: [{ browser: 'chromium' }], + // }, + // }, + // }, ]); From b82c5a8f594944316dd57860fef068790156a6a9 Mon Sep 17 00:00:00 2001 From: Drew Powers Date: Sun, 9 Feb 2025 00:43:35 -0700 Subject: [PATCH 2/2] Update deps --- package.json | 2 +- pnpm-lock.yaml | 152 +++++++++++++++++++++++++------------------------ 2 files changed, 80 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index 170fdd8..8c67109 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@vitest/browser": "^3.0.5", "aria-query": "^5.3.2", "dom-accessibility-api": "^0.7.0", - "happy-dom": "^17.0.0", + "happy-dom": "^17.0.2", "jsdom": "^25.0.1", "playwright": "^1.50.1", "typescript": "^5.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 87931d5..b935347 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^0.7.0 version: 0.7.0 happy-dom: - specifier: ^17.0.0 - version: 17.0.0 + specifier: ^17.0.2 + version: 17.0.2 jsdom: specifier: ^25.0.1 version: 25.0.1 @@ -46,7 +46,7 @@ importers: version: 3.3.1(typescript@5.7.3) vitest: specifier: ^3.0.5 - version: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) + version: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.2)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) packages: @@ -61,16 +61,16 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.5': - resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.7': - resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} + '@babel/core@7.26.8': + resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + '@babel/generator@7.26.8': + resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.26.5': @@ -103,8 +103,8 @@ packages: resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.7': - resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} engines: {node: '>=6.0.0'} hasBin: true @@ -112,20 +112,20 @@ packages: resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} engines: {node: '>=6.9.0'} - '@babel/standalone@7.26.7': - resolution: {integrity: sha512-Fvdo9Dd20GDUAREzYMIR2EFMKAJ+ccxstgQdb39XV/yvygHL4UPcqgTkiChPyltAe/b+zgq+vUPXeukEZ6aUeA==} + '@babel/standalone@7.26.8': + resolution: {integrity: sha512-WS5Cw/8gWP9qBJ+qPUVr5Le4bCeXTMoVHF9TofgEqAUpEgvVzNXCPf97SNLuDpSRNHNWcH2lFixGUGjaM6VVCg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.8': + resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.7': - resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + '@babel/traverse@7.26.8': + resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.7': - resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} engines: {node: '>=6.9.0'} '@biomejs/biome@1.9.4': @@ -684,6 +684,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/gensync@1.0.4': + resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -820,8 +823,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001698: - resolution: {integrity: sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==} + caniuse-lite@1.0.30001699: + resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} @@ -1139,8 +1142,8 @@ packages: resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - happy-dom@17.0.0: - resolution: {integrity: sha512-jGuUr3UrgMzt1Mopyof3RzD49/GudAp1suP5KFU+EvNXmqUAMXpxux2zEJbabE1YXs0APrY61iRZ0BKMMWCGTg==} + happy-dom@17.0.2: + resolution: {integrity: sha512-PWXllOadphR7angD3ndG5/Ax3yg1PFRvnN8Zu+xVtRsZjJE4RtJF1RBeWN9JFvF5EJmHOCiekdYVTxJr2NBibA==} engines: {node: '>=18.0.0'} has-flag@4.0.0: @@ -1872,11 +1875,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.76: - resolution: {integrity: sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==} + tldts-core@6.1.77: + resolution: {integrity: sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==} - tldts@6.1.76: - resolution: {integrity: sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==} + tldts@6.1.77: + resolution: {integrity: sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==} hasBin: true tmp@0.0.33: @@ -2135,20 +2138,21 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.5': {} + '@babel/compat-data@7.26.8': {} - '@babel/core@7.26.7': + '@babel/core@7.26.8': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 + '@babel/generator': 7.26.8 '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) '@babel/helpers': 7.26.7 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@types/gensync': 1.0.4 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -2157,17 +2161,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.5': + '@babel/generator@7.26.8': dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.26.8 '@babel/helper-validator-option': 7.25.9 browserslist: 4.24.4 lru-cache: 5.1.1 @@ -2175,17 +2179,17 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': dependencies: - '@babel/core': 7.26.7 + '@babel/core': 7.26.8 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.7 + '@babel/traverse': 7.26.8 transitivePeerDependencies: - supports-color @@ -2197,38 +2201,38 @@ snapshots: '@babel/helpers@7.26.7': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 - '@babel/parser@7.26.7': + '@babel/parser@7.26.8': dependencies: - '@babel/types': 7.26.7 + '@babel/types': 7.26.8 '@babel/runtime@7.26.7': dependencies: regenerator-runtime: 0.14.1 - '@babel/standalone@7.26.7': {} + '@babel/standalone@7.26.8': {} - '@babel/template@7.25.9': + '@babel/template@7.26.8': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 - '@babel/traverse@7.26.7': + '@babel/traverse@7.26.8': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 + '@babel/generator': 7.26.8 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.7': + '@babel/types@7.26.8': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -2745,6 +2749,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/gensync@1.0.4': {} + '@types/node@12.20.55': {} '@types/resolve@1.20.2': {} @@ -2763,7 +2769,7 @@ snapshots: msw: 2.7.0(typescript@5.7.3) sirv: 3.0.0 tinyrainbow: 2.0.0 - vitest: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) + vitest: 3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.2)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)) ws: 8.18.0 optionalDependencies: playwright: 1.50.1 @@ -2852,7 +2858,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001699 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -2871,7 +2877,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001699 electron-to-chromium: 1.5.96 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -2881,11 +2887,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001698 + caniuse-lite: 1.0.30001699 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001698: {} + caniuse-lite@1.0.30001699: {} chai@5.1.2: dependencies: @@ -3217,7 +3223,7 @@ snapshots: graphql@16.10.0: {} - happy-dom@17.0.0: + happy-dom@17.0.2: dependencies: webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 @@ -3884,11 +3890,11 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.76: {} + tldts-core@6.1.77: {} - tldts@6.1.76: + tldts@6.1.77: dependencies: - tldts-core: 6.1.76 + tldts-core: 6.1.77 tmp@0.0.33: dependencies: @@ -3909,7 +3915,7 @@ snapshots: tough-cookie@5.1.1: dependencies: - tldts: 6.1.76 + tldts: 6.1.77 tr46@0.0.3: {} @@ -3964,9 +3970,9 @@ snapshots: untyped@1.5.2: dependencies: - '@babel/core': 7.26.7 - '@babel/standalone': 7.26.7 - '@babel/types': 7.26.7 + '@babel/core': 7.26.8 + '@babel/standalone': 7.26.8 + '@babel/types': 7.26.8 citty: 0.1.6 defu: 6.1.4 jiti: 2.4.2 @@ -4018,7 +4024,7 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 - vitest@3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.0)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)): + vitest@3.0.5(@vitest/browser@3.0.5)(happy-dom@17.0.2)(jiti@2.4.2)(jsdom@25.0.1)(msw@2.7.0(typescript@5.7.3)): dependencies: '@vitest/expect': 3.0.5 '@vitest/mocker': 3.0.5(msw@2.7.0(typescript@5.7.3))(vite@6.1.0(jiti@2.4.2)) @@ -4042,7 +4048,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@vitest/browser': 3.0.5(playwright@1.50.1)(typescript@5.7.3)(vite@6.1.0(jiti@2.4.2))(vitest@3.0.5) - happy-dom: 17.0.0 + happy-dom: 17.0.2 jsdom: 25.0.1 transitivePeerDependencies: - jiti