From 105016cfe9d82876cfed2ff5c656a7842c5b3761 Mon Sep 17 00:00:00 2001 From: Luis Parra <16653744+lsprr@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:45:34 -0400 Subject: [PATCH 001/400] fix(invalidrole): allow upper and mixed case role names (#4358) Closes: #2695 --- lib/checks/aria/invalidrole-evaluate.js | 2 +- test/checks/shared/invalidrole.js | 29 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/checks/aria/invalidrole-evaluate.js b/lib/checks/aria/invalidrole-evaluate.js index 9c8f26ed6..66a803d74 100644 --- a/lib/checks/aria/invalidrole-evaluate.js +++ b/lib/checks/aria/invalidrole-evaluate.js @@ -28,7 +28,7 @@ import { tokenList } from '../../core/utils'; function invalidroleEvaluate(node, options, virtualNode) { const allRoles = tokenList(virtualNode.attr('role')); const allInvalid = allRoles.every( - role => !isValidRole(role, { allowAbstract: true }) + role => !isValidRole(role.toLowerCase(), { allowAbstract: true }) ); /** diff --git a/test/checks/shared/invalidrole.js b/test/checks/shared/invalidrole.js index d9aa0a394..8d83b218f 100644 --- a/test/checks/shared/invalidrole.js +++ b/test/checks/shared/invalidrole.js @@ -111,4 +111,33 @@ describe('invalidrole', function () { ); assert.deepEqual(checkContext._data, ['foo', 'bar']); }); + + it('should return true if applied to an uppercase nonsensical role', function () { + var virtualNode = queryFixture( + '
Contents
' + ); + assert.isTrue( + checks.invalidrole.evaluate.call( + checkContext, + virtualNode.actualNode, + null, + virtualNode + ) + ); + assert.deepEqual(checkContext._data, ['FOO']); + }); + + it('should return false if applied to an uppercase valid role', function () { + var virtualNode = queryFixture( + '
Contents
' + ); + assert.isFalse( + checks.invalidrole.evaluate.call( + checkContext, + virtualNode.actualNode, + null, + virtualNode + ) + ); + }); }); From 4788bf8d6fd963d7b017dad950b122ffcea8d151 Mon Sep 17 00:00:00 2001 From: Michael Sereniti <31261408+msereniti@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:40:01 +0200 Subject: [PATCH 002/400] fix(aria-allowed-role): add gridcell, separator, slider and treeitem to allowed roles of button element (#4398) Closes: https://github.com/dequelabs/axe-core/issues/4397 --- lib/standards/html-elms.js | 6 +++++- .../rules/aria-allowed-role/aria-allowed-role.html | 13 +++++++------ .../rules/aria-allowed-role/aria-allowed-role.json | 4 ++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/standards/html-elms.js b/lib/standards/html-elms.js index ce773e111..d96ab34b5 100644 --- a/lib/standards/html-elms.js +++ b/lib/standards/html-elms.js @@ -140,14 +140,18 @@ const htmlElms = { allowedRoles: [ 'checkbox', 'combobox', + 'gridcell', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', + 'separator', + 'slider', 'switch', - 'tab' + 'tab', + 'treeitem' ], // 5.4 button Element namingMethods: ['subtreeText'] diff --git a/test/integration/rules/aria-allowed-role/aria-allowed-role.html b/test/integration/rules/aria-allowed-role/aria-allowed-role.html index 3a2b99efa..80a922349 100644 --- a/test/integration/rules/aria-allowed-role/aria-allowed-role.html +++ b/test/integration/rules/aria-allowed-role/aria-allowed-role.html @@ -207,6 +207,12 @@

>
+
@@ -219,12 +225,7 @@

- +
+ + + + + Next diff --git a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json index 8bb1af8ee..2e5602061 100644 --- a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json +++ b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json @@ -22,6 +22,11 @@ ["#incomplete8"], ["#incomplete9"], ["#incomplete10"], - ["#incomplete11"] + ["#incomplete11"], + ["#incomplete12"], + ["#incomplete13"], + ["#incomplete14"], + ["#incomplete15"], + ["#incomplete16"] ] } From 9ecf596831b3b2c1ccd8acbc73e6d93165b99844 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 08:16:21 -0600 Subject: [PATCH 004/400] chore: bump chromedriver from 122.0.4 to 123.0.1 (#4391) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 122.0.4 to 123.0.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=chromedriver&package-manager=npm_and_yarn&previous-version=122.0.4&new-version=123.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef9328930..d8b44c578 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "browser-driver-manager": "1.0.4", "chai": "^4.3.7", "chalk": "^4.x", - "chromedriver": "*", + "chromedriver": "latest", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", "colorjs.io": "^0.5.0", @@ -3448,9 +3448,9 @@ } }, "node_modules/chromedriver": { - "version": "122.0.4", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.4.tgz", - "integrity": "sha512-MxkaWaxCqefHyh9UorGzl1F6ZNBgC7pqgT0piAysLZdw20ojSgJ62ljG8SFbhDJqBTegKbmuioa6MQ1m4Czdsg==", + "version": "123.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.1.tgz", + "integrity": "sha512-YQUIP/zdlzDIRCZNCv6rEVDSY4RAxo/tDL0OiGPPuai+z8unRNqJr/9V6XTBypVFyDheXNalKt9QxEqdMPuLAQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15752,9 +15752,9 @@ } }, "chromedriver": { - "version": "122.0.4", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.4.tgz", - "integrity": "sha512-MxkaWaxCqefHyh9UorGzl1F6ZNBgC7pqgT0piAysLZdw20ojSgJ62ljG8SFbhDJqBTegKbmuioa6MQ1m4Czdsg==", + "version": "123.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.1.tgz", + "integrity": "sha512-YQUIP/zdlzDIRCZNCv6rEVDSY4RAxo/tDL0OiGPPuai+z8unRNqJr/9V6XTBypVFyDheXNalKt9QxEqdMPuLAQ==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", From 44e39ec47b366f386b093998cf6de1eb7137ebf6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 09:18:54 -0600 Subject: [PATCH 005/400] chore: bump the npm-low-risk group with 11 updates (#4403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the npm-low-risk group with 11 updates: | Package | From | To | | --- | --- | --- | | [@axe-core/webdriverjs](https://github.com/dequelabs/axe-core-npm) | `4.8.5` | `4.9.0` | | [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.24.0` | `7.24.4` | | [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.24.0` | `7.24.4` | | [@babel/runtime-corejs3](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs3) | `7.24.0` | `7.24.4` | | [chromedriver](https://github.com/giggio/node-chromedriver) | `123.0.1` | `123.0.2` | | [clean-jsdoc-theme](https://github.com/ankitskvmdam/clean-jsdoc-theme) | `4.2.17` | `4.2.18` | | [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) | `3.36.0` | `3.36.1` | | [glob](https://github.com/isaacs/node-glob) | `10.3.10` | `10.3.12` | | [mocha](https://github.com/mochajs/mocha) | `10.3.0` | `10.4.0` | | [selenium-webdriver](https://github.com/SeleniumHQ/selenium) | `4.18.1` | `4.19.0` | | [typescript](https://github.com/Microsoft/TypeScript) | `5.4.2` | `5.4.4` | Updates `@axe-core/webdriverjs` from 4.8.5 to 4.9.0
Release notes

Sourced from @​axe-core/webdriverjs's releases.

Release 4.9.0

What's Changed

New Contributors

Full Changelog: https://github.com/dequelabs/axe-core-npm/compare/v4.8.5...v4.9.0

Changelog

Sourced from @​axe-core/webdriverjs's changelog.

4.9.0 (2024-04-01)

Bug Fixes

Features

Commits

Updates `@babel/core` from 7.24.0 to 7.24.4
Release notes

Sourced from @​babel/core's releases.

v7.24.4 (2024-04-03)

Thanks @​Dunqing, @​luiscubal, and @​samualtnorman for your first PRs!

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

Committers: 7

v7.24.3 (2024-03-20)

Thanks @​ota-meshi for your first PR!

:bug: Bug Fix

  • babel-helper-module-imports

Committers: 2

v7.24.2 (2024-03-19)

:bug: Bug Fix

  • babel-code-frame, babel-highlight

... (truncated)

Changelog

Sourced from @​babel/core's changelog.

v7.24.4 (2024-04-03)

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

v7.24.3 (2024-03-20)

:bug: Bug Fix

  • babel-helper-module-imports

v7.24.2 (2024-03-19)

:bug: Bug Fix

v7.24.1 (2024-03-19)

:bug: Bug Fix

  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-proposal-decorators, babel-plugin-proposal-json-modules, babel-plugin-transform-async-generator-functions, babel-plugin-transform-regenerator, babel-plugin-transform-runtime, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators, babel-plugin-proposal-pipeline-operator, babel-plugin-transform-class-properties
  • babel-helper-create-class-features-plugin, babel-helper-replace-supers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties

:memo: Documentation

:house: Internal

  • babel-code-frame, babel-highlight

... (truncated)

Commits

Updates `@babel/preset-env` from 7.24.0 to 7.24.4
Release notes

Sourced from @​babel/preset-env's releases.

v7.24.4 (2024-04-03)

Thanks @​Dunqing, @​luiscubal, and @​samualtnorman for your first PRs!

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

Committers: 7

v7.24.3 (2024-03-20)

Thanks @​ota-meshi for your first PR!

:bug: Bug Fix

  • babel-helper-module-imports

Committers: 2

v7.24.2 (2024-03-19)

:bug: Bug Fix

  • babel-code-frame, babel-highlight

... (truncated)

Changelog

Sourced from @​babel/preset-env's changelog.

v7.24.4 (2024-04-03)

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

v7.24.3 (2024-03-20)

:bug: Bug Fix

  • babel-helper-module-imports

v7.24.2 (2024-03-19)

:bug: Bug Fix

v7.24.1 (2024-03-19)

:bug: Bug Fix

  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-proposal-decorators, babel-plugin-proposal-json-modules, babel-plugin-transform-async-generator-functions, babel-plugin-transform-regenerator, babel-plugin-transform-runtime, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators, babel-plugin-proposal-pipeline-operator, babel-plugin-transform-class-properties
  • babel-helper-create-class-features-plugin, babel-helper-replace-supers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties

:memo: Documentation

:house: Internal

  • babel-code-frame, babel-highlight

... (truncated)

Commits

Updates `@babel/runtime-corejs3` from 7.24.0 to 7.24.4
Release notes

Sourced from @​babel/runtime-corejs3's releases.

v7.24.4 (2024-04-03)

Thanks @​Dunqing, @​luiscubal, and @​samualtnorman for your first PRs!

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

Committers: 7

v7.24.3 (2024-03-20)

Thanks @​ota-meshi for your first PR!

:bug: Bug Fix

  • babel-helper-module-imports

Committers: 2

v7.24.2 (2024-03-19)

:bug: Bug Fix

  • babel-code-frame, babel-highlight

... (truncated)

Changelog

Sourced from @​babel/runtime-corejs3's changelog.

v7.24.4 (2024-04-03)

:eyeglasses: Spec Compliance

  • babel-parser
  • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3

:bug: Bug Fix

  • babel-generator
  • babel-compat-data, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-transform-block-scoping
  • babel-core, babel-plugin-transform-block-scoped-functions, babel-plugin-transform-block-scoping

v7.24.3 (2024-03-20)

:bug: Bug Fix

  • babel-helper-module-imports

v7.24.2 (2024-03-19)

:bug: Bug Fix

v7.24.1 (2024-03-19)

:bug: Bug Fix

  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
  • babel-plugin-proposal-decorators, babel-plugin-proposal-json-modules, babel-plugin-transform-async-generator-functions, babel-plugin-transform-regenerator, babel-plugin-transform-runtime, babel-preset-env
  • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators, babel-plugin-proposal-pipeline-operator, babel-plugin-transform-class-properties
  • babel-helper-create-class-features-plugin, babel-helper-replace-supers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties

:memo: Documentation

:house: Internal

  • babel-code-frame, babel-highlight

... (truncated)

Commits

Updates `chromedriver` from 123.0.1 to 123.0.2
Commits

Updates `clean-jsdoc-theme` from 4.2.17 to 4.2.18
Commits

Updates `core-js` from 3.36.0 to 3.36.1
Changelog

Sourced from core-js's changelog.

3.36.1 - 2024.03.19
Commits

Updates `glob` from 10.3.10 to 10.3.12
Commits

Updates `mocha` from 10.3.0 to 10.4.0
Release notes

Sourced from mocha's releases.

v10.4.0

10.4.0 / 2024-03-26

:tada: Enhancements

:bug: Fixes

:nut_and_bolt: Other

Changelog

Sourced from mocha's changelog.

10.4.0 / 2024-03-26

:tada: Enhancements

:bug: Fixes

:nut_and_bolt: Other

Commits
Maintainer changes

This version was pushed to... _Description has been truncated_ Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1817 +++++++++++++++++++++------------------------ 1 file changed, 855 insertions(+), 962 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8b44c578..0947cc245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "browser-driver-manager": "1.0.4", "chai": "^4.3.7", "chalk": "^4.x", - "chromedriver": "latest", + "chromedriver": "*", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", "colorjs.io": "^0.5.0", @@ -104,125 +104,54 @@ } }, "node_modules/@axe-core/webdriverjs": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.8.5.tgz", - "integrity": "sha512-cktRjzb3vl/nuyWSmULuw88O21op1LhxlStGu81zjWZssq4gVxBJSqZCBtCVt4w2ekSMxv/vjSXcx+ASnTssmw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.0.tgz", + "integrity": "sha512-eX9dtgrppYShyPy/xc58I+G/T0ENLbiqkOHk+cJn/jLOcdOYg2mO98fME3I/zMQiZ15cLiD747Fmcr2DAG1WFA==", "dev": true, "dependencies": { - "axe-core": "~4.8.4" + "axe-core": "~4.9.0" }, "peerDependencies": { "selenium-webdriver": ">3.0.0-beta || >=2.53.1 || >4.0.0-alpha" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -239,14 +168,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -323,9 +252,9 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -333,7 +262,7 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -363,9 +292,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -425,12 +354,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -494,13 +423,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -588,13 +517,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -602,14 +531,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -687,9 +617,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -698,13 +628,29 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", + "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -714,14 +660,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -731,13 +677,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -841,12 +787,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -856,12 +802,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1013,12 +959,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1028,13 +974,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -1046,13 +992,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { @@ -1063,12 +1009,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1078,12 +1024,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1093,13 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1109,13 +1055,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1126,17 +1072,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1148,13 +1094,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1164,12 +1110,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1179,13 +1125,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1195,12 +1141,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1210,12 +1156,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1226,13 +1172,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1242,12 +1188,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1258,12 +1204,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1274,14 +1220,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1291,12 +1237,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1307,12 +1253,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1322,12 +1268,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1338,12 +1284,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1353,13 +1299,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1369,13 +1315,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1386,14 +1332,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -1404,13 +1350,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1436,12 +1382,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1451,12 +1397,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1467,12 +1413,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1483,16 +1429,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1502,13 +1447,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1518,12 +1463,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1534,12 +1479,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1551,12 +1496,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1566,13 +1511,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1582,14 +1527,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1600,12 +1545,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1615,12 +1560,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1631,12 +1576,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1646,12 +1591,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1661,12 +1606,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1677,12 +1622,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1692,12 +1637,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1707,12 +1652,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1722,12 +1667,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1737,13 +1682,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1753,13 +1698,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1769,13 +1714,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1785,26 +1730,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", + "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", + "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1816,58 +1762,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1899,9 +1845,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1911,9 +1857,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.0.tgz", - "integrity": "sha512-HxiRMOncx3ly6f3fcZ1GVKf+/EROcI9qwPgmij8Czqy6Okm/0T37T4y2ZIlLUuEUFjtM7NRsfdCO8Y3tAiJZew==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", "dev": true, "dependencies": { "core-js-pure": "^3.30.2", @@ -1938,18 +1884,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -2268,9 +2214,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.24.tgz", - "integrity": "sha512-+VaWXDa6+l6MhflBvVXjIEAzb59nQ2JUK3bwRp2zRpPtU+8TFRy9Gg/5oIcNlkEL5PGlBFGfemUVvIgLnTzq7Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2855,9 +2801,9 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.4.tgz", - "integrity": "sha512-CZLSKisu/bhJ2awW4kJndluz2HLZYIHh5Uy1+ZwDRkJi69811xgIXXfdU9HSLX0Th+ILrHj8qfL/5wzamsFtQg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.0.tgz", + "integrity": "sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw==", "dev": true, "engines": { "node": ">=4" @@ -2875,13 +2821,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -2889,25 +2835,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3169,9 +3115,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3188,8 +3134,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3316,9 +3262,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001608", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001608.tgz", + "integrity": "sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA==", "dev": true, "funding": [ { @@ -3448,9 +3394,9 @@ } }, "node_modules/chromedriver": { - "version": "123.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.1.tgz", - "integrity": "sha512-YQUIP/zdlzDIRCZNCv6rEVDSY4RAxo/tDL0OiGPPuai+z8unRNqJr/9V6XTBypVFyDheXNalKt9QxEqdMPuLAQ==", + "version": "123.0.2", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.2.tgz", + "integrity": "sha512-Kx0r/IGULm7eciaUtX/OKaFbdBdHRDSguiV1Q4zuQncz11gvymDdMtELa7ppk+kTL5113NLPud92nuIMNTRhww==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3491,9 +3437,9 @@ } }, "node_modules/clean-jsdoc-theme": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.17.tgz", - "integrity": "sha512-5SbJNXcQHUXd7N13g+3OpGFiBQdxz36xwEP3p1r1vbo/apLcDRtugaFdUZ56H6Rvlb68Q33EChoBkajSlnD11w==", + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.18.tgz", + "integrity": "sha512-iPz34GEhTZGW33Oi25IUgW1suGFuQZoDoCjn82BEI7Ck83CvJisrrxYv3WLjHA/wz8g82wy8WsUyRiTGajUZdw==", "dev": true, "dependencies": { "@jsdoc/salty": "^0.2.4", @@ -4295,9 +4241,9 @@ } }, "node_modules/core-js": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", "dev": true, "hasInstallScript": true, "funding": { @@ -4306,12 +4252,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -4905,9 +4851,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.615", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", - "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", + "version": "1.4.731", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.731.tgz", + "integrity": "sha512-+TqVfZjpRz2V/5SPpmJxq9qK620SC5SqCnxQIOi7i/U08ZDcTpKbT7Xjj9FU5CbXTMUb4fywbIr8C7cGv4hcjw==", "dev": true }, "node_modules/emoji-regex": { @@ -6269,16 +6215,16 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -9303,9 +9249,9 @@ } }, "node_modules/mocha": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", - "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -10334,12 +10280,12 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -10350,9 +10296,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -11302,14 +11248,14 @@ "dev": true }, "node_modules/selenium-webdriver": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.18.1.tgz", - "integrity": "sha512-uP4OJ5wR4+VjdTi5oi/k8oieV2fIhVdVuaOPrklKghgS59w7Zz3nGa5gcG73VcU9EBRv5IZEBRhPr7qFJAj5mQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.19.0.tgz", + "integrity": "sha512-8XHW8m9V2XN2/SC1kr4bWzMtGvjmKUEZ6S0UBoDBqonhmwEIzKOLbzhanBd08HCOg1s1O0XrDWCD71NnA8Zt0g==", "dev": true, "dependencies": { "jszip": "^3.10.1", - "tmp": "^0.2.1", - "ws": ">=8.14.2" + "tmp": "^0.2.3", + "ws": ">=8.16.0" }, "engines": { "node": ">= 14.20.0" @@ -12301,15 +12247,12 @@ } }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-fast-properties": { @@ -12473,9 +12416,9 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -13280,103 +13223,45 @@ } }, "@axe-core/webdriverjs": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.8.5.tgz", - "integrity": "sha512-cktRjzb3vl/nuyWSmULuw88O21op1LhxlStGu81zjWZssq4gVxBJSqZCBtCVt4w2ekSMxv/vjSXcx+ASnTssmw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.0.tgz", + "integrity": "sha512-eX9dtgrppYShyPy/xc58I+G/T0ENLbiqkOHk+cJn/jLOcdOYg2mO98fME3I/zMQiZ15cLiD747Fmcr2DAG1WFA==", "dev": true, "requires": { - "axe-core": "~4.8.4" + "axe-core": "~4.9.0" } }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true }, "@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -13386,14 +13271,14 @@ } }, "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "dependencies": { @@ -13459,9 +13344,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -13469,7 +13354,7 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -13487,9 +13372,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.22.6", @@ -13534,12 +13419,12 @@ } }, "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "requires": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" } }, "@babel/helper-module-transforms": { @@ -13582,13 +13467,13 @@ } }, "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" } }, @@ -13649,25 +13534,26 @@ } }, "@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "requires": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" } }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -13729,39 +13615,49 @@ } }, "@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", + "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-proposal-object-rest-spread": { @@ -13830,21 +13726,21 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-syntax-import-meta": { @@ -13948,260 +13844,260 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -14215,243 +14111,243 @@ } }, "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" } }, "@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", + "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", + "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -14463,58 +14359,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" } @@ -14537,18 +14433,18 @@ "dev": true }, "@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/runtime-corejs3": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.0.tgz", - "integrity": "sha512-HxiRMOncx3ly6f3fcZ1GVKf+/EROcI9qwPgmij8Czqy6Okm/0T37T4y2ZIlLUuEUFjtM7NRsfdCO8Y3tAiJZew==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", "dev": true, "requires": { "core-js-pure": "^3.30.2", @@ -14567,18 +14463,18 @@ } }, "@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -14806,9 +14702,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.24.tgz", - "integrity": "sha512-+VaWXDa6+l6MhflBvVXjIEAzb59nQ2JUK3bwRp2zRpPtU+8TFRy9Gg/5oIcNlkEL5PGlBFGfemUVvIgLnTzq7Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -15317,9 +15213,9 @@ "dev": true }, "axe-core": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.4.tgz", - "integrity": "sha512-CZLSKisu/bhJ2awW4kJndluz2HLZYIHh5Uy1+ZwDRkJi69811xgIXXfdU9HSLX0Th+ILrHj8qfL/5wzamsFtQg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.0.tgz", + "integrity": "sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw==", "dev": true }, "axios": { @@ -15334,33 +15230,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.1" } }, "balanced-match": { @@ -15572,13 +15468,13 @@ "dev": true }, "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" } @@ -15664,9 +15560,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001608", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001608.tgz", + "integrity": "sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA==", "dev": true }, "catharsis": { @@ -15752,9 +15648,9 @@ } }, "chromedriver": { - "version": "123.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.1.tgz", - "integrity": "sha512-YQUIP/zdlzDIRCZNCv6rEVDSY4RAxo/tDL0OiGPPuai+z8unRNqJr/9V6XTBypVFyDheXNalKt9QxEqdMPuLAQ==", + "version": "123.0.2", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.2.tgz", + "integrity": "sha512-Kx0r/IGULm7eciaUtX/OKaFbdBdHRDSguiV1Q4zuQncz11gvymDdMtELa7ppk+kTL5113NLPud92nuIMNTRhww==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", @@ -15784,9 +15680,9 @@ } }, "clean-jsdoc-theme": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.17.tgz", - "integrity": "sha512-5SbJNXcQHUXd7N13g+3OpGFiBQdxz36xwEP3p1r1vbo/apLcDRtugaFdUZ56H6Rvlb68Q33EChoBkajSlnD11w==", + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.18.tgz", + "integrity": "sha512-iPz34GEhTZGW33Oi25IUgW1suGFuQZoDoCjn82BEI7Ck83CvJisrrxYv3WLjHA/wz8g82wy8WsUyRiTGajUZdw==", "dev": true, "requires": { "@jsdoc/salty": "^0.2.4", @@ -16410,18 +16306,18 @@ "dev": true }, "core-js": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", "dev": true }, "core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "requires": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" } }, "core-js-pure": { @@ -16862,9 +16758,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.615", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", - "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", + "version": "1.4.731", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.731.tgz", + "integrity": "sha512-+TqVfZjpRz2V/5SPpmJxq9qK620SC5SqCnxQIOi7i/U08ZDcTpKbT7Xjj9FU5CbXTMUb4fywbIr8C7cGv4hcjw==", "dev": true }, "emoji-regex": { @@ -17894,16 +17790,16 @@ } }, "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "dependencies": { "brace-expansion": { @@ -20113,9 +20009,9 @@ "dev": true }, "mocha": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", - "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "requires": { "ansi-colors": "4.1.1", @@ -20919,19 +20815,19 @@ "dev": true }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true } } @@ -21659,14 +21555,14 @@ "dev": true }, "selenium-webdriver": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.18.1.tgz", - "integrity": "sha512-uP4OJ5wR4+VjdTi5oi/k8oieV2fIhVdVuaOPrklKghgS59w7Zz3nGa5gcG73VcU9EBRv5IZEBRhPr7qFJAj5mQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.19.0.tgz", + "integrity": "sha512-8XHW8m9V2XN2/SC1kr4bWzMtGvjmKUEZ6S0UBoDBqonhmwEIzKOLbzhanBd08HCOg1s1O0XrDWCD71NnA8Zt0g==", "dev": true, "requires": { "jszip": "^3.10.1", - "tmp": "^0.2.1", - "ws": ">=8.14.2" + "tmp": "^0.2.3", + "ws": ">=8.16.0" } }, "semver": { @@ -22445,13 +22341,10 @@ } }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -22573,9 +22466,9 @@ "dev": true }, "typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true }, "ua-parser-js": { From 5c318f3537056be5779cb53374bc6f4785947c91 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 10 Apr 2024 09:25:08 -0600 Subject: [PATCH 006/400] fix: fix building axe-core translation files with region locales (#4396) Figured a simple `split` would do the job without needing to write a complicated regex to do it. Otherwise we'd need something like `/\.([a-zA-Z_]+)\.js$/` Closes: #4388 --- build/tasks/configure.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/tasks/configure.js b/build/tasks/configure.js index f4a3c6d26..19a8372ef 100644 --- a/build/tasks/configure.js +++ b/build/tasks/configure.js @@ -18,9 +18,11 @@ module.exports = function (grunt) { }); this.files.forEach(function (file) { - const match = file.dest.auto.match(/\.([a-z]{2,3})\.js/); - if (match) { - options.locale = match[1]; + // locale will always be the 2nd to last part of the + // filename and in the format of "..js" + const parts = file.dest.auto.split('.'); + if (parts.length > 2) { + options.locale = parts[parts.length - 2]; } buildRules(grunt, options, null, function (result) { From 0cd9d71fa3b53bca33905b2a676db522aa923912 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 11 Apr 2024 09:31:53 -0500 Subject: [PATCH 007/400] fix(label-content-name-mismatch): fewer blocklists, handle all single char alpha the same fix: #4386 --- lib/commons/text/is-human-interpretable.js | 28 ++++++++++----------- test/commons/text/is-human-interpretable.js | 16 +++++++++--- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/commons/text/is-human-interpretable.js b/lib/commons/text/is-human-interpretable.js index c591da1c3..534fe2f70 100644 --- a/lib/commons/text/is-human-interpretable.js +++ b/lib/commons/text/is-human-interpretable.js @@ -13,10 +13,11 @@ import sanitize from './sanitize'; function isHumanInterpretable(str) { /** * Steps: - * 1) Trim string to avoid whitespace + * 1) Check for single alpha character edge cases + * * 2) Check for symbolic text character edge cases * a) handle if character is alphanumeric & within the given icon mapping - * eg: x (dismiss), i (info) + * eg: 'aA' for toggling capitalization * * 3) handle unicode from astral (non bilingual multi plane) unicode, emoji & punctuations * eg: Windings font @@ -25,29 +26,26 @@ function isHumanInterpretable(str) { * eg: ? (help), > (next arrow), < (back arrow), need help ? */ - str = str.trim(); - if (!str.length) { return 0; } - // Step 1 + if (str.length === 1 && !str.match(/\d/i)) { + return 0; + } + const symbolicTextCharactersSet = new Set([ - // dismiss - 'x', - '×', - // wysiwyg - 'i', // or, info - 'b', - 'aa', // toggle capitalization (aA) - 'abc' // spelling + // toggle capitalization + 'aA', + // spelling + 'abc', + 'ABC' ]); - // Step 1a + if (symbolicTextCharactersSet.has(str)) { return 0; } - // Step 2 const noUnicodeStr = removeUnicode(str, { emoji: true, nonBmp: true, diff --git a/test/commons/text/is-human-interpretable.js b/test/commons/text/is-human-interpretable.js index 5a4c022a8..a06239547 100644 --- a/test/commons/text/is-human-interpretable.js +++ b/test/commons/text/is-human-interpretable.js @@ -4,10 +4,18 @@ describe('text.isHumanInterpretable', function () { assert.equal(actual, 0); }); - it('returns 0 when given string is a single character that is blacklisted as icon', function () { - var blacklistedIcons = ['x', 'i']; - blacklistedIcons.forEach(function (iconText) { - var actual = axe.commons.text.isHumanInterpretable(iconText); + it('returns 0 when given string is a single alpha character', function () { + const singleCharacterExamples = ['i', '×']; + singleCharacterExamples.forEach(function (characterExample) { + const actual = axe.commons.text.isHumanInterpretable(characterExample); + assert.equal(actual, 0); + }); + }); + + it('returns 0 when given string is in the symbolic text characters set (blocklist)', function () { + const blocklistedSymbols = ['aA', 'abc']; + blocklistedSymbols.forEach(function (symbolicText) { + const actual = axe.commons.text.isHumanInterpretable(symbolicText); assert.equal(actual, 0); }); }); From 9ed16e6ffad5343331b46011b27dc2ad28b42cac Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 11 Apr 2024 10:03:16 -0500 Subject: [PATCH 008/400] fix(label-content-name-mismatch): refactor isHumanInterpretable, tests var -> const isHumanInterpretable was getting lengthy, refactored into several small functions unit test used var, switched to const Refs: #4386 --- lib/commons/text/is-human-interpretable.js | 40 +++++++++++++-------- test/commons/text/is-human-interpretable.js | 20 +++++------ 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/lib/commons/text/is-human-interpretable.js b/lib/commons/text/is-human-interpretable.js index 534fe2f70..5b0a96bab 100644 --- a/lib/commons/text/is-human-interpretable.js +++ b/lib/commons/text/is-human-interpretable.js @@ -13,27 +13,42 @@ import sanitize from './sanitize'; function isHumanInterpretable(str) { /** * Steps: - * 1) Check for single alpha character edge cases + * 1) Early escape if string is empty * - * 2) Check for symbolic text character edge cases + * 2) Check for single alpha character edge cases + * + * 3) Check for symbolic text character edge cases * a) handle if character is alphanumeric & within the given icon mapping * eg: 'aA' for toggling capitalization * - * 3) handle unicode from astral (non bilingual multi plane) unicode, emoji & punctuations + * 4) handle unicode from astral (non bilingual multi plane) unicode, emoji & punctuations * eg: Windings font * eg: '💪' * eg: I saw a shooting 💫 * eg: ? (help), > (next arrow), < (back arrow), need help ? */ - if (!str.length) { + if ( + isEmpty(str) || + isNonDigitCharacter(str) || + isSymbolicText(str) || + isUnicodeOrPunctuation(str) + ) { return 0; } - if (str.length === 1 && !str.match(/\d/i)) { - return 0; - } + return 1; +} + +function isEmpty(str) { + return sanitize(str).length === 0; +} +function isNonDigitCharacter(str) { + return str.length === 1 && !str.match(/\d/i); +} + +function isSymbolicText(str) { const symbolicTextCharactersSet = new Set([ // toggle capitalization 'aA', @@ -42,20 +57,17 @@ function isHumanInterpretable(str) { 'ABC' ]); - if (symbolicTextCharactersSet.has(str)) { - return 0; - } + return symbolicTextCharactersSet.has(str); +} +function isUnicodeOrPunctuation(str) { const noUnicodeStr = removeUnicode(str, { emoji: true, nonBmp: true, punctuations: true }); - if (!sanitize(noUnicodeStr)) { - return 0; - } - return 1; + return !sanitize(noUnicodeStr); } export default isHumanInterpretable; diff --git a/test/commons/text/is-human-interpretable.js b/test/commons/text/is-human-interpretable.js index a06239547..6686cf2df 100644 --- a/test/commons/text/is-human-interpretable.js +++ b/test/commons/text/is-human-interpretable.js @@ -1,6 +1,6 @@ describe('text.isHumanInterpretable', function () { it('returns 0 when given string is empty', function () { - var actual = axe.commons.text.isHumanInterpretable(''); + const actual = axe.commons.text.isHumanInterpretable(''); assert.equal(actual, 0); }); @@ -21,51 +21,51 @@ describe('text.isHumanInterpretable', function () { }); it('returns 0 when given string is only punctuations', function () { - var actual = axe.commons.text.isHumanInterpretable('?!!!,.'); + const actual = axe.commons.text.isHumanInterpretable('?!!!,.'); assert.equal(actual, 0); }); it('returns 1 when given string has emoji as a part of the sentence', function () { - var actual = axe.commons.text.isHumanInterpretable('I like 🏀'); + const actual = axe.commons.text.isHumanInterpretable('I like 🏀'); assert.equal(actual, 1); }); it('returns 1 when given string has non BMP character (eg: windings font) as part of the sentence', function () { - var actual = axe.commons.text.isHumanInterpretable('I ✂ my hair'); + const actual = axe.commons.text.isHumanInterpretable('I ✂ my hair'); assert.equal(actual, 1); }); it('returns 1 when given string has both non BMP character, and emoji as part of the sentence', function () { - var actual = axe.commons.text.isHumanInterpretable( + const actual = axe.commons.text.isHumanInterpretable( 'I ✂ my hair, and I like 🏀' ); assert.equal(actual, 1); }); it('returns 0 when given string has only emoji', function () { - var actual = axe.commons.text.isHumanInterpretable('🏀🍔🍉🎅'); + const actual = axe.commons.text.isHumanInterpretable('🏀🍔🍉🎅'); assert.equal(actual, 0); }); it('returns 0 when given string has only non BNP characters', function () { - var actual = axe.commons.text.isHumanInterpretable('⌛👓'); + const actual = axe.commons.text.isHumanInterpretable('⌛👓'); assert.equal(actual, 0); }); it('returns 0 when given string has combination of only non BNP characters and emojis', function () { - var actual = axe.commons.text.isHumanInterpretable('⌛👓🏀🍔🍉🎅'); + const actual = axe.commons.text.isHumanInterpretable('⌛👓🏀🍔🍉🎅'); assert.equal(actual, 0); }); it('returns 1 when given string is a punctuated sentence', function () { - var actual = axe.commons.text.isHumanInterpretable( + const actual = axe.commons.text.isHumanInterpretable( "I like football, but I prefer basketball; although I can't play either very well." ); assert.equal(actual, 1); }); it('returns 1 for a sentence without emoji or punctuations', function () { - var actual = axe.commons.text.isHumanInterpretable('Earth is round'); + const actual = axe.commons.text.isHumanInterpretable('Earth is round'); assert.equal(actual, 1); }); }); From 30d8388976118a0cdc85de2bc939a3c6f9c601ef Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 11 Apr 2024 13:45:02 -0500 Subject: [PATCH 009/400] fix(label-content-name-mismatch): 0 for all single char, cjk & x test, ignore cap Addresses all feedback on PR #4402 - Simpler symbolic text check, ignoring case, with unit test for both - Added back "x" and "X" in unit test - Removed trim step, uneeded - Reverted set to list, uneeded - removed /i in non-digit regex - test for a CJK character - adjusted integration test labels for single character incompletes, noticed an ordering bug and corrected Refs: #4386 --- .../label/label-content-name-mismatch-evaluate.js | 15 ++++++--------- lib/commons/text/is-human-interpretable.js | 15 ++++++--------- test/commons/text/is-human-interpretable.js | 4 ++-- .../label-content-name-mismatch.html | 9 +++++---- .../label-content-name-mismatch.json | 3 ++- 5 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/checks/label/label-content-name-mismatch-evaluate.js b/lib/checks/label/label-content-name-mismatch-evaluate.js index 5686c6093..acd53c6e4 100644 --- a/lib/checks/label/label-content-name-mismatch-evaluate.js +++ b/lib/checks/label/label-content-name-mismatch-evaluate.js @@ -41,12 +41,7 @@ function labelContentNameMismatchEvaluate(node, options, virtualNode) { const pixelThreshold = options?.pixelThreshold; const occurrenceThreshold = options?.occurrenceThreshold ?? options?.occuranceThreshold; - const accText = accessibleText(node).toLowerCase(); - if (isHumanInterpretable(accText) < 1) { - return undefined; - } - const visibleText = sanitize( subtreeText(virtualNode, { subtreeDescendant: true, @@ -55,13 +50,15 @@ function labelContentNameMismatchEvaluate(node, options, virtualNode) { occurrenceThreshold }) ).toLowerCase(); + if (!visibleText) { return true; } - if (isHumanInterpretable(visibleText) < 1) { - if (isStringContained(visibleText, accText)) { - return true; - } + + if ( + isHumanInterpretable(accText) < 1 || + isHumanInterpretable(visibleText) < 1 + ) { return undefined; } diff --git a/lib/commons/text/is-human-interpretable.js b/lib/commons/text/is-human-interpretable.js index 5b0a96bab..4b7b640ae 100644 --- a/lib/commons/text/is-human-interpretable.js +++ b/lib/commons/text/is-human-interpretable.js @@ -45,19 +45,16 @@ function isEmpty(str) { } function isNonDigitCharacter(str) { - return str.length === 1 && !str.match(/\d/i); + return str.length === 1 && !str.match(/\d/); } function isSymbolicText(str) { - const symbolicTextCharactersSet = new Set([ - // toggle capitalization - 'aA', - // spelling - 'abc', - 'ABC' - ]); + const symbolicText = [ + 'aa', // toggle capitalization (aA) + 'abc' // spelling + ]; - return symbolicTextCharactersSet.has(str); + return symbolicText.includes(str.toLowerCase()); } function isUnicodeOrPunctuation(str) { diff --git a/test/commons/text/is-human-interpretable.js b/test/commons/text/is-human-interpretable.js index 6686cf2df..6b1c8c483 100644 --- a/test/commons/text/is-human-interpretable.js +++ b/test/commons/text/is-human-interpretable.js @@ -5,7 +5,7 @@ describe('text.isHumanInterpretable', function () { }); it('returns 0 when given string is a single alpha character', function () { - const singleCharacterExamples = ['i', '×']; + const singleCharacterExamples = ['i', 'x', 'X', '×', '']; singleCharacterExamples.forEach(function (characterExample) { const actual = axe.commons.text.isHumanInterpretable(characterExample); assert.equal(actual, 0); @@ -13,7 +13,7 @@ describe('text.isHumanInterpretable', function () { }); it('returns 0 when given string is in the symbolic text characters set (blocklist)', function () { - const blocklistedSymbols = ['aA', 'abc']; + const blocklistedSymbols = ['aA', 'Aa', 'abc', 'ABC']; blocklistedSymbols.forEach(function (symbolicText) { const actual = axe.commons.text.isHumanInterpretable(symbolicText); assert.equal(actual, 0); diff --git a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.html b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.html index f6eedb945..ea45db6e1 100644 --- a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.html +++ b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.html @@ -36,10 +36,11 @@ - - - - + + + + + Next diff --git a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json index 2e5602061..364635f11 100644 --- a/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json +++ b/test/integration/rules/label-content-name-mismatch/label-content-name-mismatch.json @@ -27,6 +27,7 @@ ["#incomplete13"], ["#incomplete14"], ["#incomplete15"], - ["#incomplete16"] + ["#incomplete16"], + ["#incomplete17"] ] } From c4aa0620468573777e43e1914f9995bc6cfb6d89 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 11 Apr 2024 13:51:18 -0500 Subject: [PATCH 010/400] fix(label-content-name-mismatch): simpler non-digit check, test added Followed Steven's advice for a simpler non-digit single character check, added a test to show a digit isn't incompleted Refs: #4386 --- lib/commons/text/is-human-interpretable.js | 2 +- test/commons/text/is-human-interpretable.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/commons/text/is-human-interpretable.js b/lib/commons/text/is-human-interpretable.js index 4b7b640ae..a80c19b6e 100644 --- a/lib/commons/text/is-human-interpretable.js +++ b/lib/commons/text/is-human-interpretable.js @@ -45,7 +45,7 @@ function isEmpty(str) { } function isNonDigitCharacter(str) { - return str.length === 1 && !str.match(/\d/); + return str.length === 1 && str.match(/\D/); } function isSymbolicText(str) { diff --git a/test/commons/text/is-human-interpretable.js b/test/commons/text/is-human-interpretable.js index 6b1c8c483..c170956bd 100644 --- a/test/commons/text/is-human-interpretable.js +++ b/test/commons/text/is-human-interpretable.js @@ -25,6 +25,11 @@ describe('text.isHumanInterpretable', function () { assert.equal(actual, 0); }); + it('returns 1 when given string that has a number', function () { + const actual = axe.commons.text.isHumanInterpretable('7'); + assert.equal(actual, 1); + }); + it('returns 1 when given string has emoji as a part of the sentence', function () { const actual = axe.commons.text.isHumanInterpretable('I like 🏀'); assert.equal(actual, 1); From 2940f6ee36ba52d8cf089be2a3c8e7c516c81dd6 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Mon, 15 Apr 2024 08:24:04 -0600 Subject: [PATCH 011/400] fix(isVisibleOnScreen): account for position: absolute elements inside overflow container (#4405) Also tested various ways to try to get the `position: absolute` to be hidden by the node. Turns out there are a few cases where it will be hidden: * overflow node uses position itself other than static * node in-between the overflow node and the positioned child uses position `relative` or `sticky` and cases where it won't be hidden * positioned child uses a position of `fixed` (it won't be hidden by any ancestor overflow, even if the ancestor uses position itself) Closes: #4016 --- lib/commons/dom/visibility-methods.js | 40 ++++++++++- test/commons/dom/visibility-methods.js | 91 ++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 3 deletions(-) diff --git a/lib/commons/dom/visibility-methods.js b/lib/commons/dom/visibility-methods.js index cf11a6477..de5743089 100644 --- a/lib/commons/dom/visibility-methods.js +++ b/lib/commons/dom/visibility-methods.js @@ -117,16 +117,33 @@ export function overflowHidden(vNode, { isAncestor } = {}) { return false; } - const rect = vNode.boundingClientRect; - const nodes = getOverflowHiddenAncestors(vNode); + // a node with position fixed cannot be hidden by an overflow + // ancestor, even when that ancestor uses a non-static position + const position = vNode.getComputedStylePropertyValue('position'); + if (position === 'fixed') { + return false; + } + const nodes = getOverflowHiddenAncestors(vNode); if (!nodes.length) { return false; } + const rect = vNode.boundingClientRect; return nodes.some(node => { - const nodeRect = node.boundingClientRect; + // a node with position absolute will not be hidden by an + // overflow ancestor unless the ancestor uses a non-static + // position or a node in-between uses a position of relative + // or sticky + if ( + position === 'absolute' && + !hasPositionedAncestorBetween(vNode, node) && + node.getComputedStylePropertyValue('position') === 'static' + ) { + return false; + } + const nodeRect = node.boundingClientRect; if (nodeRect.width < 2 || nodeRect.height < 2) { return true; } @@ -238,3 +255,20 @@ export function detailsHidden(vNode) { return !vNode.parent.hasAttr('open'); } + +function hasPositionedAncestorBetween(child, ancestor) { + let node = child.parent; + while (node && node !== ancestor) { + if ( + ['relative', 'sticky'].includes( + node.getComputedStylePropertyValue('position') + ) + ) { + return true; + } + + node = node.parent; + } + + return false; +} diff --git a/test/commons/dom/visibility-methods.js b/test/commons/dom/visibility-methods.js index 867b50f69..f62b723c7 100644 --- a/test/commons/dom/visibility-methods.js +++ b/test/commons/dom/visibility-methods.js @@ -302,6 +302,97 @@ describe('dom.visibility-methods', () => { ); assert.isFalse(overflowHidden(vNode)); }); + + it('should return false for ancestor with "overflow:hidden" and element with "position:fixed"', () => { + var vNode = queryFixture( + '

' + + '
Hello world
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); + + it('should return false for ancestor with "overflow:hidden; position:relative" and element with "position:fixed"', () => { + var vNode = queryFixture( + '
' + + '
Hello world
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); + + it('should return false for ancestor with "overflow:hidden" and element with "position:absolute"', () => { + var vNode = queryFixture( + '
' + + '
Hello world
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); + + it('should return true for ancestor with "overflow:hidden; position:relative" and element with "position:absolute"', () => { + var vNode = queryFixture( + '
' + + '
Hello world
' + + '
' + ); + assert.isTrue(overflowHidden(vNode)); + }); + + it('should return true for ancestor with "overflow:hidden" and element with "position:absolute" if ancestor in-between uses "position:relative"', () => { + var vNode = queryFixture( + '
' + + '
' + + '
Hello world
' + + '
' + + '
' + ); + assert.isTrue(overflowHidden(vNode)); + }); + + it('should return true for ancestor with "overflow:hidden" and element with "position:absolute" if ancestor in-between uses "position:sticky"', () => { + var vNode = queryFixture( + '
' + + '
' + + '
Hello world
' + + '
' + + '
' + ); + assert.isTrue(overflowHidden(vNode)); + }); + + it('should return false for ancestor with "overflow:hidden" and element with "position:absolute" if ancestor in-between uses "position:absolute"', () => { + var vNode = queryFixture( + '
' + + '
' + + '
Hello world
' + + '
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); + + it('should return false for ancestor with "overflow:hidden" and element with "position:absolute" if ancestor in-between uses "position:fixed"', () => { + var vNode = queryFixture( + '
' + + '
' + + '
Hello world
' + + '
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); + + it('should return false for ancestor with "overflow:hidden" and element with "position:absolute" if ancestor of overflow node uses position other than static', () => { + var vNode = queryFixture( + '
' + + '
' + + '
Hello world
' + + '
' + + '
' + ); + assert.isFalse(overflowHidden(vNode)); + }); }); describe('clipHidden', () => { From 75b0c11ed476367a3fa29f11ec92bbdf13114ba1 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 15 Apr 2024 15:03:19 -0400 Subject: [PATCH 012/400] build: pass `posix` option to build in windows (#4409) Closes: https://github.com/dequelabs/axe-core/issues/4407 --- build/rule-generator/questions.js | 15 ++++++++++++--- build/tasks/metadata-function-map.js | 2 +- test/aria-practices/apg.spec.js | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/build/rule-generator/questions.js b/build/rule-generator/questions.js index dc5e665d0..28f9a511f 100644 --- a/build/rule-generator/questions.js +++ b/build/rule-generator/questions.js @@ -33,7 +33,10 @@ const validateGetRuleName = async input => { throw new Error(`RULE name conflicts with an existing rule's filename.`); } // 3) ensure no rule id overlaps - const ruleSpecs = await glob(`${directories.rules}/**/*.json`); + const ruleSpecs = await glob(`${directories.rules}/**/*.json`, { + posix: true, + absolute: true + }); const axeRulesIds = ruleSpecs.reduce((out, specPath) => { const spec = require(specPath); out.push(spec.id); @@ -62,7 +65,10 @@ const validateGetCheckName = async input => { ); } // 2) ensure no check filename overlaps - const checkSpecs = await glob(`${directories.checks}/**/*.json`); + const checkSpecs = await glob(`${directories.checks}/**/*.json`, { + posix: true, + absolute: true + }); // cannot use `fs.existsSync` here, as we do not know which category of checks to look under const axeChecksFileNames = checkSpecs.map( f => f.replace('.json', '').split('/').reverse()[0] @@ -71,7 +77,10 @@ const validateGetCheckName = async input => { throw new Error('CHECK name conflicts with an existing filename.'); } // 3) ensure no check id overlaps - const ruleSpecs = await glob(`${directories.rules}/**/*.json`); + const ruleSpecs = await glob(`${directories.rules}/**/*.json`, { + posix: true, + absolute: true + }); const axe = require(directories.axePath); const axeChecksIds = ruleSpecs.reduce((out, specPath) => { const spec = require(specPath); diff --git a/build/tasks/metadata-function-map.js b/build/tasks/metadata-function-map.js index e2e9d6054..36b583670 100644 --- a/build/tasks/metadata-function-map.js +++ b/build/tasks/metadata-function-map.js @@ -22,7 +22,7 @@ module.exports = function (grunt) { '// This file is automatically generated using build/tasks/metadata-function-map.js\n'; src.forEach(globPath => { - glob.sync(globPath).forEach(filePath => { + glob.sync(globPath, { posix: true }).forEach(filePath => { const relativePath = path.relative( path.dirname(file.dest), filePath diff --git a/test/aria-practices/apg.spec.js b/test/aria-practices/apg.spec.js index f7da83253..fd1c630ee 100644 --- a/test/aria-practices/apg.spec.js +++ b/test/aria-practices/apg.spec.js @@ -9,7 +9,8 @@ describe('aria-practices', function () { // Use path.resolve rather than require.resolve because APG package.json main file does not exist const apgPath = path.resolve(__dirname, '../../node_modules/aria-practices/'); const filePaths = globSync( - `${apgPath}/content/patterns/*/**/examples/*.html` + `${apgPath}/content/patterns/*/**/examples/*.html`, + { posix: true } ); const testFiles = filePaths.map( fileName => fileName.split('/aria-practices/content/patterns/')[1] From ace25cd51fab327a9a5239608bdfba3bdad2f0ee Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 16 Apr 2024 13:06:29 -0500 Subject: [PATCH 013/400] fix(region): img alt='' ignored by region rule added isPresentationGraphic check which currently only handles alt='' and ignores them for the region rule svg I believe is handled differently already role='presentation' test added as well, use-case already handled fix: #4145 --- lib/checks/navigation/region-evaluate.js | 13 ++++++++++-- test/checks/navigation/region.js | 25 +++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/checks/navigation/region-evaluate.js b/lib/checks/navigation/region-evaluate.js index 0e14b8a16..c29e29b8a 100644 --- a/lib/checks/navigation/region-evaluate.js +++ b/lib/checks/navigation/region-evaluate.js @@ -45,14 +45,19 @@ function getRegionlessNodes(options) { */ function findRegionlessElms(virtualNode, options) { const node = virtualNode.actualNode; - // End recursion if the element is a landmark, skiplink, or hidden content + // End recursion if the element is... + // - a landmark + // - a skiplink + // - hidden content + // - a presentation graphic if ( getRole(virtualNode) === 'button' || isRegion(virtualNode, options) || ['iframe', 'frame'].includes(virtualNode.props.nodeName) || (dom.isSkipLink(virtualNode.actualNode) && dom.getElementByReference(virtualNode.actualNode, 'href')) || - !dom.isVisibleToScreenReaders(node) + !dom.isVisibleToScreenReaders(node) || + isPresentationGraphic(virtualNode) ) { // Mark each parent node as having region descendant let vNode = virtualNode; @@ -86,6 +91,10 @@ function findRegionlessElms(virtualNode, options) { } } +function isPresentationGraphic(virtualNode) { + return virtualNode.props.nodeName === 'img' && virtualNode.attr('alt') === ''; +} + // Check if the current element is a landmark function isRegion(virtualNode, options) { const node = virtualNode.actualNode; diff --git a/test/checks/navigation/region.js b/test/checks/navigation/region.js index fb4d13b3e..ca19f35da 100644 --- a/test/checks/navigation/region.js +++ b/test/checks/navigation/region.js @@ -47,13 +47,32 @@ describe('region', function () { }); it('should return false when img content is outside the region', function () { - var checkArgs = checkSetup( - '

Introduction

' - ); + var checkArgs = checkSetup(` + +
Content
+ `); assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); }); + it('should return true when img content outside of the region is decorative, via an empty alt attr', function () { + var checkArgs = checkSetup(` + +
Content
+ `); + + assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); + }); + + it('should return true when img content outside of the region is decorative, via a presentation role', function () { + var checkArgs = checkSetup(` + Content
+ `); + + assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); + }); + it('should return true when textless text content is outside the region', function () { var checkArgs = checkSetup( '

Introduction

' From 7c810e2462f41a7181218c108a5d5f8c95e122ba Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 16 Apr 2024 13:15:47 -0500 Subject: [PATCH 014/400] fix(region): replaces tabs for spaces in prior commit my IDE was adding tabs ew, replaced with spaces Refs: #4145 --- test/checks/navigation/region.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/checks/navigation/region.js b/test/checks/navigation/region.js index ca19f35da..9e6f1acd5 100644 --- a/test/checks/navigation/region.js +++ b/test/checks/navigation/region.js @@ -49,7 +49,7 @@ describe('region', function () { it('should return false when img content is outside the region', function () { var checkArgs = checkSetup(` -
Content
+
Content
`); assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); @@ -58,7 +58,7 @@ describe('region', function () { it('should return true when img content outside of the region is decorative, via an empty alt attr', function () { var checkArgs = checkSetup(` -
Content
+
Content
`); assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); @@ -67,7 +67,7 @@ describe('region', function () { it('should return true when img content outside of the region is decorative, via a presentation role', function () { var checkArgs = checkSetup(` Content +
Content
`); assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); From 551ba24efa4108c18fe1a81ae9107d694fa9a5aa Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Fri, 19 Apr 2024 09:26:13 -0500 Subject: [PATCH 015/400] fix(aria-valid-attr-value): aria-controls & aria-haspopup incomplete if an element has both aria-controls and aria-haspopup mark it incomplete as we are unsure if the DOM element will be added dynamically later Refs: #4363 --- lib/checks/aria/aria-valid-attr-value-evaluate.js | 15 +++++++++++++-- lib/checks/aria/aria-valid-attr-value.json | 3 ++- locales/_template.json | 3 ++- test/checks/aria/valid-attr-value.js | 9 +++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/checks/aria/aria-valid-attr-value-evaluate.js b/lib/checks/aria/aria-valid-attr-value-evaluate.js index 36e824afc..79ea53fef 100644 --- a/lib/checks/aria/aria-valid-attr-value-evaluate.js +++ b/lib/checks/aria/aria-valid-attr-value-evaluate.js @@ -36,12 +36,23 @@ export default function ariaValidAttrValueEvaluate(node, options, virtualNode) { const preChecks = { // aria-controls should only check if element exists if the element - // doesn't have aria-expanded=false or aria-selected=false (tabs) + // doesn't have aria-expanded=false, aria-selected=false (tabs), + // or aria-haspopup (may load later) // @see https://github.com/dequelabs/axe-core/issues/1463 + // @see https://github.com/dequelabs/axe-core/issues/4363 'aria-controls': () => { + const hasPopup = + ['false', null].includes(virtualNode.attr('aria-haspopup')) === false; + + if (hasPopup) { + needsReview = `aria-controls="${virtualNode.attr('aria-controls')}"`; + messageKey = 'controlsWithinPopup'; + } + return ( virtualNode.attr('aria-expanded') !== 'false' && - virtualNode.attr('aria-selected') !== 'false' + virtualNode.attr('aria-selected') !== 'false' && + hasPopup === false ); }, // aria-current should mark as needs review if any value is used that is diff --git a/lib/checks/aria/aria-valid-attr-value.json b/lib/checks/aria/aria-valid-attr-value.json index d533ad667..df7f2be6d 100644 --- a/lib/checks/aria/aria-valid-attr-value.json +++ b/lib/checks/aria/aria-valid-attr-value.json @@ -15,7 +15,8 @@ "noIdShadow": "ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: ${data.needsReview}", "ariaCurrent": "ARIA attribute value is invalid and will be treated as \"aria-current=true\": ${data.needsReview}", "idrefs": "Unable to determine if ARIA attribute element ID exists on the page: ${data.needsReview}", - "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}" + "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}", + "controlsWithinPopup": "Unable to determine if aria-controls referenced ID exists on the page while using aria-haspopup: ${data.needsReview}" } } } diff --git a/locales/_template.json b/locales/_template.json index a911c6014..0029d133a 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -538,7 +538,8 @@ "noIdShadow": "ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: ${data.needsReview}", "ariaCurrent": "ARIA attribute value is invalid and will be treated as \"aria-current=true\": ${data.needsReview}", "idrefs": "Unable to determine if ARIA attribute element ID exists on the page: ${data.needsReview}", - "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}" + "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}", + "controlsWithinPopup": "Unable to determine if aria-controls referenced ID exists on the page while using aria-haspopup: ${data.needsReview}" } }, "aria-valid-attr": { diff --git a/test/checks/aria/valid-attr-value.js b/test/checks/aria/valid-attr-value.js index a9e3a3afc..e2605ecd8 100644 --- a/test/checks/aria/valid-attr-value.js +++ b/test/checks/aria/valid-attr-value.js @@ -110,6 +110,15 @@ describe('aria-valid-attr-value', function () { assert.isFalse(validAttrValueCheck.call(checkContext, null, null, vNode)); }); + it('should return undefined on aria-controls with aria-haspopup as we cannot determine if it is in the DOM later', function () { + var vNode = queryFixture( + '' + ); + assert.isUndefined( + validAttrValueCheck.call(checkContext, null, null, vNode) + ); + }); + it('should pass on aria-owns and aria-expanded=false when the element is not in the DOM', function () { var vNode = queryFixture( '' From 08ddcbc16795ca99efdb6e2c8d24b4561bd65af8 Mon Sep 17 00:00:00 2001 From: EvilKarter Date: Mon, 22 Apr 2024 17:55:24 +0200 Subject: [PATCH 016/400] chore: Update local de.json (#4408) Update local de.json --- locales/de.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/locales/de.json b/locales/de.json index cab4da906..8f35d0c65 100644 --- a/locales/de.json +++ b/locales/de.json @@ -498,7 +498,8 @@ }, "aria-required-children": { "pass": { - "default": "Alle benötigten ARIA Kinder sind vorhanden." + "default": "Alle benötigten ARIA Kinder sind vorhanden.", + "aria-busy": "Element hat ein aria-busy-Attribut, daher ist es erlaubt, erforderliche ARIA Kinder wegzulassen" }, "fail": { "singular": "Benötigte ARIA Kindrolle nicht vorhanden: ${data.values}", @@ -864,7 +865,10 @@ "fail": "Die viewport-Einstellungen im -Tag blockieren das Zoomen auf mobilen Geräten." }, "target-offset": { - "pass": "Das Ziel hat genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px, der mindestens ${data.minOffset}px beträgt.", + "pass": { + "default": "Das Ziel hat genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px, der mindestens ${data.minOffset}px beträgt.", + "large": "Das Ziel überschreitet bei weitem die Mindestgröße von ${data.minOffset}px." + }, "fail": "Das Ziel hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px.", "incomplete": { "default": "Element mit negativem Tabindex hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px. Ist dies ein Ziel?", @@ -874,7 +878,8 @@ "target-size": { "pass": { "default": "Das Steuerelement hat eine ausreichende Größe (${data.width}px x ${data.height}px, sollte mindestens ${data.minSize}px x ${data.minSize}px sein).", - "obscured": "Das Steuerelement wird ignoriert, da es vollständig verdeckt ist und daher nicht angeklickt werden kann." + "obscured": "Das Steuerelement wird ignoriert, da es vollständig verdeckt ist und daher nicht angeklickt werden kann.", + "large": "Das Ziel überschreitet bei weitem die Mindestgröße von ${data.minSize}px." }, "fail": { "default": "Das Ziel hat eine unzureichende Größe (${data.width}px x ${data.height}px, sollte mindestens ${data.minSize}px x ${data.minSize}px sein).", @@ -884,7 +889,8 @@ "default": "Element mit negativem Tabindex hat unzureichende Größe (${data.width}px mal ${data.height}px, sollte mindestens ${data.minSize}px mal ${data.minSize}px sein). Ist dies ein Ziel?", "contentOverflow": "Elementgröße konnte aufgrund von Überlaufinhalten nicht genau bestimmt werden", "partiallyObscured": "Element mit negativem Tabindex hat unzureichende Größe, weil es teilweise verdeckt ist (kleinster Platz ist ${data.width}px mal ${data.height}px, sollte mindestens ${data.minSize}px mal ${data.minSize}px sein). Ist dies ein Ziel?", - "partiallyObscuredNonTabbable": "Das Ziel hat eine unzureichende Größe, weil es teilweise von einem Nachbarn mit negativem Tabindex verdeckt wird (der kleinste Platz ist ${data.width}px mal ${data.height}px, sollte mindestens ${data.minSize}px mal ${data.minSize}px sein). Ist der Nachbar ein Ziel?" + "partiallyObscuredNonTabbable": "Das Ziel hat eine unzureichende Größe, weil es teilweise von einem Nachbarn mit negativem Tabindex verdeckt wird (der kleinste Platz ist ${data.width}px mal ${data.height}px, sollte mindestens ${data.minSize}px mal ${data.minSize}px sein). Ist der Nachbar ein Ziel?", + "tooManyRects": "Die Zielgröße konnte nicht ermittelt werden, da zu viele überlappende Elemente vorhanden sind." } }, "header-present": { From 69f778b71b4c78f89334dcb0c75bedc2005609f5 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 22 Apr 2024 11:11:12 -0500 Subject: [PATCH 017/400] fix(aria-roles): correct abstract roles (types) for aria-roles Too many aria roles were set to widget or otherwise were incorrect, added a comment source for where I got my information for which abstract roles were the type of which roles Refs: #4371 --- lib/standards/aria-roles.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/standards/aria-roles.js b/lib/standards/aria-roles.js index 340fdb9b1..035990967 100644 --- a/lib/standards/aria-roles.js +++ b/lib/standards/aria-roles.js @@ -1,4 +1,5 @@ // Source: https://www.w3.org/TR/wai-aria-1.1/#roles +// Source for abstract roles: https://www.w3.org/TR/wai-aria/#abstract_roles and https://www.w3.org/WAI/ARIA/1.2/class-diagram/rdf_model.svg /* easiest way to see allowed roles is to filter out the global ones from the list of inherited states and properties. The dpub spec @@ -17,13 +18,13 @@ */ const ariaRoles = { alert: { - type: 'widget', + type: 'structure', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded'], superclassRole: ['section'] }, alertdialog: { - type: 'widget', + type: 'window', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded', 'aria-modal'], superclassRole: ['alert', 'dialog'], @@ -31,7 +32,7 @@ const ariaRoles = { }, application: { // Note: spec difference - type: 'landmark', + type: 'structure', // Note: aria-expanded is not in the 1.1 spec but is // consistently supported in ATs and was added in 1.2 allowedAttrs: ['aria-activedescendant', 'aria-expanded'], @@ -119,7 +120,7 @@ const ariaRoles = { nameFromContent: true }, combobox: { - type: 'widget', + type: 'composite', requiredAttrs: ['aria-expanded', 'aria-controls'], allowedAttrs: [ 'aria-owns', @@ -169,7 +170,7 @@ const ariaRoles = { prohibitedAttrs: ['aria-label', 'aria-labelledby'] }, dialog: { - type: 'widget', + type: 'window', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded', 'aria-modal'], superclassRole: ['window'], @@ -301,7 +302,7 @@ const ariaRoles = { superclassRole: ['section'] }, listbox: { - type: 'widget', + type: 'composite', requiredOwned: ['group', 'option'], allowedAttrs: [ 'aria-multiselectable', @@ -328,7 +329,7 @@ const ariaRoles = { nameFromContent: true }, log: { - type: 'widget', + type: 'structure', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded'], superclassRole: ['section'] @@ -340,7 +341,7 @@ const ariaRoles = { superclassRole: ['landmark'] }, marquee: { - type: 'widget', + type: 'structure', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded'], superclassRole: ['section'] @@ -696,7 +697,7 @@ const ariaRoles = { accessibleNameRequired: true }, status: { - type: 'widget', + type: 'structure', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded'], superclassRole: ['section'] @@ -816,7 +817,7 @@ const ariaRoles = { superclassRole: ['section'] }, timer: { - type: 'widget', + type: 'structure', // Spec difference: Aria-expanded removed in 1.2 allowedAttrs: ['aria-expanded'], superclassRole: ['status'] From ffe37f6f3dfe58f945718581dcdc5c2aef74f498 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 22 Apr 2024 12:48:42 -0500 Subject: [PATCH 018/400] fix(aria-roles): table with role application is structure Previously there was a test to confirm a table with role of application was a data table, but the spec indicates that has an anstract role of structure meaning this should be a structure table instead This commit is just a test correction Refs: #4421 --- test/commons/table/is-data-table.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/test/commons/table/is-data-table.js b/test/commons/table/is-data-table.js index c3607faf0..d78c25e7b 100644 --- a/test/commons/table/is-data-table.js +++ b/test/commons/table/is-data-table.js @@ -32,6 +32,14 @@ describe('table.isDataTable', function () { assert.isFalse(axe.commons.table.isDataTable(node)); }); + it('should be false if the table has role=application, which is an astract role of structure', function () { + fixture.innerHTML = '
'; + + var node = fixture.querySelector('table'); + axe.testUtils.flatTreeSetup(fixture.firstChild); + assert.isFalse(axe.commons.table.isDataTable(node)); + }); + it('should be true if the table is inside an editable area', function () { fixture.innerHTML = '
' + @@ -71,13 +79,6 @@ describe('table.isDataTable', function () { }); describe('should be true if the table has a landmark role', function () { - it('application', function () { - fixture.innerHTML = '
'; - - var node = fixture.querySelector('table'); - axe.testUtils.flatTreeSetup(fixture.firstChild); - assert.isTrue(axe.commons.table.isDataTable(node)); - }); it('banner', function () { fixture.innerHTML = '
'; From aa1aa20043b03bb24783a46e040931804f2a1c5a Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 22 Apr 2024 13:17:17 -0500 Subject: [PATCH 019/400] fix(aria-roles): inline widgets consider composite type widget not inline rule corrected isWidgetType check to consider composite widget types --- lib/rules/widget-not-inline-matches.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rules/widget-not-inline-matches.js b/lib/rules/widget-not-inline-matches.js index 61e5f2270..1e6a7602d 100644 --- a/lib/rules/widget-not-inline-matches.js +++ b/lib/rules/widget-not-inline-matches.js @@ -18,7 +18,8 @@ const matchesFns = [ ]; function isWidgetType(vNode) { - return getRoleType(vNode) === 'widget'; + const roleType = getRoleType(vNode); + return roleType === 'widget' || roleType === 'composite'; } function isNotAreaElement(vNode) { From a82371226d202899325ac661106519e70008cefe Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 23 Apr 2024 08:56:45 -0500 Subject: [PATCH 020/400] fix(aria-valid-attr-value): more thorough test coverage - messageKey added to unit test - integration test Refs: #4363 --- test/checks/aria/valid-attr-value.js | 4 ++++ .../rules/aria-valid-attr-value/aria-valid-attr-value.html | 3 +++ .../rules/aria-valid-attr-value/aria-valid-attr-value.json | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/checks/aria/valid-attr-value.js b/test/checks/aria/valid-attr-value.js index e2605ecd8..956c3b496 100644 --- a/test/checks/aria/valid-attr-value.js +++ b/test/checks/aria/valid-attr-value.js @@ -117,6 +117,10 @@ describe('aria-valid-attr-value', function () { assert.isUndefined( validAttrValueCheck.call(checkContext, null, null, vNode) ); + assert.deepEqual(checkContext._data, { + messageKey: 'controlsWithinPopup', + needsReview: 'aria-controls="test"' + }); }); it('should pass on aria-owns and aria-expanded=false when the element is not in the DOM', function () { diff --git a/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.html b/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.html index 42e60bae4..1542a403b 100644 --- a/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.html +++ b/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.html @@ -360,4 +360,7 @@

Possible False Positives

I'm actually valid
I'm not really gone
+
+ May have injected html to control dynamically later, who knows! +
diff --git a/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.json b/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.json index 8fb15e119..f0b46c6fc 100644 --- a/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.json +++ b/test/integration/rules/aria-valid-attr-value/aria-valid-attr-value.json @@ -236,6 +236,7 @@ ["#incomplete5"], ["#incomplete6"], ["#incomplete7"], - ["#incomplete8"] + ["#incomplete8"], + ["#incomplete9"] ] } From 3a90bb70c8db087b2f03cc30a4aee756995c311c Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:11:37 -0600 Subject: [PATCH 021/400] fix(target-size): pass for element that has nearby elements that are obscured (#4422) Had to update how we handled the too many rects break early since it would return an empty array, which when looking at the lengths of the arrays in `getOffset` made it difficult to know which case needed to be handled (returned empty due to too many rects or returned empty because there wasn't any visible rect). Talked to Wilco and we agreed that when we encountered too many rects we could throw and handle the error case in both checks. Closes: #4387 --- lib/checks/mobile/target-offset-evaluate.js | 23 ++++++++++++-- lib/checks/mobile/target-offset.json | 3 +- lib/checks/mobile/target-size-evaluate.js | 6 ++-- lib/commons/math/get-offset.js | 2 +- lib/commons/math/split-rects.js | 2 +- locales/_template.json | 3 +- test/checks/mobile/target-offset.js | 20 +++++++++++-- test/commons/math/get-offset.js | 30 ++++++++++++++++--- test/commons/math/split-rects.js | 7 +++-- .../full/target-size/too-many-rects.js | 1 + 10 files changed, 81 insertions(+), 16 deletions(-) diff --git a/lib/checks/mobile/target-offset-evaluate.js b/lib/checks/mobile/target-offset-evaluate.js index 8e45fc816..949906576 100644 --- a/lib/checks/mobile/target-offset-evaluate.js +++ b/lib/checks/mobile/target-offset-evaluate.js @@ -20,8 +20,27 @@ export default function targetOffsetEvaluate(node, options, vNode) { continue; } // the offset code works off radius but we want our messaging to reflect diameter - const offset = - roundToSingleDecimal(getOffset(vNode, vNeighbor, minOffset / 2)) * 2; + let offset = null; + try { + offset = getOffset(vNode, vNeighbor, minOffset / 2); + } catch (err) { + if (err.message.startsWith('splitRects')) { + this.data({ + messageKey: 'tooManyRects', + closestOffset: 0, + minOffset + }); + return undefined; + } + + throw err; + } + + if (offset === null) { + continue; + } + + offset = roundToSingleDecimal(offset) * 2; if (offset + roundingMargin >= minOffset) { continue; } diff --git a/lib/checks/mobile/target-offset.json b/lib/checks/mobile/target-offset.json index c06ee11d7..498ea64dc 100644 --- a/lib/checks/mobile/target-offset.json +++ b/lib/checks/mobile/target-offset.json @@ -14,7 +14,8 @@ "fail": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px.", "incomplete": { "default": "Element with negative tabindex has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is this a target?", - "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?" + "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?", + "tooManyRects": "Could not get the target size because there are too many overlapping elements" } } } diff --git a/lib/checks/mobile/target-size-evaluate.js b/lib/checks/mobile/target-size-evaluate.js index 6ee45bc9c..85561055b 100644 --- a/lib/checks/mobile/target-size-evaluate.js +++ b/lib/checks/mobile/target-size-evaluate.js @@ -131,8 +131,10 @@ function getLargestUnobscuredArea(vNode, obscuredNodes) { const obscuringRects = obscuredNodes.map( ({ boundingClientRect: rect }) => rect ); - const unobscuredRects = splitRects(nodeRect, obscuringRects); - if (unobscuredRects.length === 0) { + let unobscuredRects; + try { + unobscuredRects = splitRects(nodeRect, obscuringRects); + } catch (err) { return null; } diff --git a/lib/commons/math/get-offset.js b/lib/commons/math/get-offset.js index 664871fda..957d4e43c 100644 --- a/lib/commons/math/get-offset.js +++ b/lib/commons/math/get-offset.js @@ -18,7 +18,7 @@ export default function getOffset(vTarget, vNeighbor, minRadiusNeighbour = 12) { const neighborRects = getTargetRects(vNeighbor); if (!targetRects.length || !neighborRects.length) { - return 0; + return null; } const targetBoundingBox = targetRects.reduce(getBoundingRect); diff --git a/lib/commons/math/split-rects.js b/lib/commons/math/split-rects.js index ca4ef232a..ea6ba5397 100644 --- a/lib/commons/math/split-rects.js +++ b/lib/commons/math/split-rects.js @@ -18,7 +18,7 @@ export default function splitRects(outerRect, overlapRects) { // a performance bottleneck // @see https://github.com/dequelabs/axe-core/issues/4359 if (uniqueRects.length > 4000) { - return []; + throw new Error('splitRects: Too many rects'); } } return uniqueRects; diff --git a/locales/_template.json b/locales/_template.json index a911c6014..6ea35122f 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -872,7 +872,8 @@ "fail": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px.", "incomplete": { "default": "Element with negative tabindex has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is this a target?", - "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?" + "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?", + "tooManyRects": "Could not get the target size because there are too many overlapping elements" } }, "target-size": { diff --git a/test/checks/mobile/target-offset.js b/test/checks/mobile/target-offset.js index 367968f44..747d9a4fa 100644 --- a/test/checks/mobile/target-offset.js +++ b/test/checks/mobile/target-offset.js @@ -98,6 +98,21 @@ describe('target-offset tests', () => { assert.closeTo(checkContext._data.closestOffset, 24, 0.2); }); + it('ignores obscured widget elements as neighbors', () => { + const checkArgs = checkSetup(` +
+ Go to top +
+
+ Cookies: Accept all cookies +
+ `); + + assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); + assert.equal(checkContext._data.minOffset, 24); + assert.closeTo(checkContext._data.closestOffset, 24, 0.2); + }); + it('sets all elements that are too close as related nodes', () => { const checkArgs = checkSetup( '${html} `); - assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + assert.isUndefined(checkEvaluate.apply(checkContext, checkArgs)); assert.deepEqual(checkContext._data, { + messageKey: 'tooManyRects', closestOffset: 0, minOffset: 24 }); diff --git a/test/commons/math/get-offset.js b/test/commons/math/get-offset.js index 073c8d064..c4a5e8964 100644 --- a/test/commons/math/get-offset.js +++ b/test/commons/math/get-offset.js @@ -33,24 +33,46 @@ describe('getOffset', () => { assert.closeTo(getOffset(nodeA, nodeB), 63.6, round); }); - it('returns 0 if nodeA is overlapped by nodeB', () => { + it('returns null if nodeA is overlapped by nodeB', () => { const fixture = fixtureSetup(` `); const nodeA = fixture.children[1]; const nodeB = fixture.children[3]; - assert.equal(getOffset(nodeA, nodeB), 0); + assert.isNull(getOffset(nodeA, nodeB)); }); - it('returns 0 if nodeB is overlapped by nodeA', () => { + it('returns null if nodeB is overlapped by nodeA', () => { const fixture = fixtureSetup(` `); const nodeA = fixture.children[3]; const nodeB = fixture.children[1]; - assert.equal(getOffset(nodeA, nodeB), 0); + assert.isNull(getOffset(nodeA, nodeB)); + }); + + it('returns null if nodeA is overlapped by another node', () => { + const fixture = fixtureSetup(` + + +
 
+ `); + const nodeB = fixture.children[1]; + const nodeA = fixture.children[3]; + assert.isNull(getOffset(nodeA, nodeB)); + }); + + it('returns null if nodeB is overlapped by another node', () => { + const fixture = fixtureSetup(` + + +
 
+ `); + const nodeA = fixture.children[3]; + const nodeB = fixture.children[1]; + assert.isNull(getOffset(nodeA, nodeB)); }); it('subtracts minNeighbourRadius from center-to-center calculations', () => { diff --git a/test/commons/math/split-rects.js b/test/commons/math/split-rects.js index 9463a7fbd..968b8c7b7 100644 --- a/test/commons/math/split-rects.js +++ b/test/commons/math/split-rects.js @@ -16,13 +16,16 @@ describe('splitRects', () => { assert.deepEqual(rects[0], rectA); }); - it('returns empty array if there are too many overlapping rects', () => { + it('throws if there are too many overlapping rects', () => { const rects = []; for (let i = 0; i < 100; i++) { rects.push(new DOMRect(i, i, 50, 50)); } const rectA = new DOMRect(0, 0, 1000, 1000); - assert.lengthOf(splitRects(rectA, rects), 0); + + assert.throws(() => { + splitRects(rectA, rects); + }, 'splitRects: Too many rects'); }); describe('with one overlapping rect', () => { diff --git a/test/integration/full/target-size/too-many-rects.js b/test/integration/full/target-size/too-many-rects.js index d1364b0d3..d81485024 100644 --- a/test/integration/full/target-size/too-many-rects.js +++ b/test/integration/full/target-size/too-many-rects.js @@ -9,6 +9,7 @@ describe('target-size too many rects test', () => { elementRef: true }; const context = { + include: '#incomplete', // ignore the incomplete table results exclude: 'table tr' }; From 6091367a20f70e536fc7e8d77eae4fa7232bc7c0 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:11:56 -0600 Subject: [PATCH 022/400] fix(target-size): ignore descendant elements in shadow dom (#4410) This also adds to the `.eslintrc` to error if `node.contains()` or `vNode.actualNode.contains()` or used. (also upgraded the `node.attributes` error to account for `vNode.actualNode.attributes` as I noticed it was missing). Closes: https://github.com/dequelabs/axe-core/issues/4194 --------- Co-authored-by: Wilco Fiers --- .eslintrc.js | 28 +++- lib/checks/mobile/target-size-evaluate.js | 5 +- lib/commons/dom/get-target-rects.js | 5 +- lib/core/utils/contains.js | 2 + test/checks/mobile/target-size.js | 122 ++++++++++-------- test/commons/dom/get-target-rects.js | 18 ++- .../full/target-size/shadow-dom.html | 66 ++++++++++ .../full/target-size/shadow-dom.js | 39 ++++++ 8 files changed, 222 insertions(+), 63 deletions(-) create mode 100644 test/integration/full/target-size/shadow-dom.html create mode 100644 test/integration/full/target-size/shadow-dom.js diff --git a/.eslintrc.js b/.eslintrc.js index 71a39bc1c..37592b660 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -59,13 +59,37 @@ module.exports = { selector: 'MemberExpression[property.name=tagName]', message: "Don't use node.tagName, use node.nodeName instead." }, + // node.attributes can be clobbered so is unsafe to use + // @see https://github.com/dequelabs/axe-core/pull/1432 { - // node.attributes can be clobbered so is unsafe to use - // @see https://github.com/dequelabs/axe-core/pull/1432 + // node.attributes selector: 'MemberExpression[object.name=node][property.name=attributes]', message: "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." + }, + { + // vNode.actualNode.attributes + selector: + 'MemberExpression[object.property.name=actualNode][property.name=attributes]', + message: + "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." + }, + // node.contains doesn't work with shadow dom + // @see https://github.com/dequelabs/axe-core/issues/4194 + { + // node.contains() + selector: + 'CallExpression[callee.object.name=node][callee.property.name=contains]', + message: + "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." + }, + { + // vNode.actualNode.contains() + selector: + 'CallExpression[callee.object.property.name=actualNode][callee.property.name=contains]', + message: + "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." } ] }, diff --git a/lib/checks/mobile/target-size-evaluate.js b/lib/checks/mobile/target-size-evaluate.js index 85561055b..88c029f34 100644 --- a/lib/checks/mobile/target-size-evaluate.js +++ b/lib/checks/mobile/target-size-evaluate.js @@ -5,6 +5,7 @@ import { rectHasMinimumSize, hasVisualOverlap } from '../../commons/math'; +import { contains } from '../../core/utils'; /** * Determine if an element has a minimum size, taking into account @@ -187,9 +188,7 @@ function toDecimalSize(rect) { } function isDescendantNotInTabOrder(vAncestor, vNode) { - return ( - vAncestor.actualNode.contains(vNode.actualNode) && !isInTabOrder(vNode) - ); + return contains(vAncestor, vNode) && !isInTabOrder(vNode); } function mapActualNodes(vNodes) { diff --git a/lib/commons/dom/get-target-rects.js b/lib/commons/dom/get-target-rects.js index fc5b2aabe..a2bc2eec1 100644 --- a/lib/commons/dom/get-target-rects.js +++ b/lib/commons/dom/get-target-rects.js @@ -2,6 +2,7 @@ import findNearbyElms from './find-nearby-elms'; import isInTabOrder from './is-in-tab-order'; import { splitRects, hasVisualOverlap } from '../math'; import memoize from '../../core/utils/memoize'; +import { contains } from '../../core/utils'; export default memoize(getTargetRects); @@ -32,7 +33,5 @@ function getTargetRects(vNode) { } function isDescendantNotInTabOrder(vAncestor, vNode) { - return ( - vAncestor.actualNode.contains(vNode.actualNode) && !isInTabOrder(vNode) - ); + return contains(vAncestor, vNode) && !isInTabOrder(vNode); } diff --git a/lib/core/utils/contains.js b/lib/core/utils/contains.js index dfea001e1..6b05722c0 100644 --- a/lib/core/utils/contains.js +++ b/lib/core/utils/contains.js @@ -12,8 +12,10 @@ export default function contains(vNode, otherVNode) { !vNode.shadowId && !otherVNode.shadowId && vNode.actualNode && + // eslint-disable-next-line no-restricted-syntax typeof vNode.actualNode.contains === 'function' ) { + // eslint-disable-next-line no-restricted-syntax return vNode.actualNode.contains(otherVNode.actualNode); } diff --git a/test/checks/mobile/target-size.js b/test/checks/mobile/target-size.js index 688f80975..f0769c3c5 100644 --- a/test/checks/mobile/target-size.js +++ b/test/checks/mobile/target-size.js @@ -1,23 +1,22 @@ -describe('target-size tests', function () { - 'use strict'; - - var checkContext = axe.testUtils.MockCheckContext(); - var checkSetup = axe.testUtils.checkSetup; - var shadowCheckSetup = axe.testUtils.shadowCheckSetup; - var check = checks['target-size']; +describe('target-size tests', () => { + const checkContext = axe.testUtils.MockCheckContext(); + const checkSetup = axe.testUtils.checkSetup; + const shadowCheckSetup = axe.testUtils.shadowCheckSetup; + const check = checks['target-size']; + const fixture = document.querySelector('#fixture'); function elmIds(elms) { - return Array.from(elms).map(function (elm) { + return Array.from(elms).map(elm => { return '#' + elm.id; }); } - afterEach(function () { + afterEach(() => { checkContext.reset(); }); - it('returns false for targets smaller than minSize', function () { - var checkArgs = checkSetup( + it('returns false for targets smaller than minSize', () => { + const checkArgs = checkSetup( '' @@ -30,8 +29,8 @@ describe('target-size tests', function () { }); }); - it('returns undefined for non-tabbable targets smaller than minSize', function () { - var checkArgs = checkSetup( + it('returns undefined for non-tabbable targets smaller than minSize', () => { + const checkArgs = checkSetup( '' @@ -44,8 +43,8 @@ describe('target-size tests', function () { }); }); - it('returns true for unobscured targets larger than minSize', function () { - var checkArgs = checkSetup( + it('returns true for unobscured targets larger than minSize', () => { + const checkArgs = checkSetup( '' @@ -58,8 +57,8 @@ describe('target-size tests', function () { }); }); - it('returns true for very large targets', function () { - var checkArgs = checkSetup( + it('returns true for very large targets', () => { + const checkArgs = checkSetup( '' @@ -68,9 +67,9 @@ describe('target-size tests', function () { assert.deepEqual(checkContext._data, { messageKey: 'large', minSize: 24 }); }); - describe('when fully obscured', function () { - it('returns true, regardless of size', function () { - var checkArgs = checkSetup( + describe('when fully obscured', () => { + it('returns true, regardless of size', () => { + const checkArgs = checkSetup( '
x' + @@ -83,8 +82,8 @@ describe('target-size tests', function () { assert.deepEqual(elmIds(checkContext._relatedNodes), ['#obscurer']); }); - it('returns true when obscured by another focusable widget', function () { - var checkArgs = checkSetup( + it('returns true when obscured by another focusable widget', () => { + const checkArgs = checkSetup( 'x' + @@ -97,8 +96,8 @@ describe('target-size tests', function () { assert.deepEqual(elmIds(checkContext._relatedNodes), ['#obscurer']); }); - it('ignores obscuring element has pointer-events:none', function () { - var checkArgs = checkSetup( + it('ignores obscuring element has pointer-events:none', () => { + const checkArgs = checkSetup( 'x' + @@ -115,9 +114,9 @@ describe('target-size tests', function () { }); }); - describe('when partially obscured', function () { - it('returns true for focusable non-widgets', function () { - var checkArgs = checkSetup( + describe('when partially obscured', () => { + it('returns true for focusable non-widgets', () => { + const checkArgs = checkSetup( '' + @@ -137,8 +136,8 @@ describe('target-size tests', function () { assert.deepEqual(elmIds(checkContext._relatedNodes), ['#obscurer']); }); - it('returns true for non-focusable widgets', function () { - var checkArgs = checkSetup( + it('returns true for non-focusable widgets', () => { + const checkArgs = checkSetup( '' + @@ -158,9 +157,9 @@ describe('target-size tests', function () { assert.deepEqual(elmIds(checkContext._relatedNodes), ['#obscurer']); }); - describe('by a focusable widget', function () { - it('returns true for obscured targets with sufficient space', function () { - var checkArgs = checkSetup( + describe('by a focusable widget', () => { + it('returns true for obscured targets with sufficient space', () => { + const checkArgs = checkSetup( '' + @@ -202,8 +201,8 @@ describe('target-size tests', function () { }); describe('for obscured targets with insufficient space', () => { - it('returns false if all elements are tabbable', function () { - var checkArgs = checkSetup( + it('returns false if all elements are tabbable', () => { + const checkArgs = checkSetup( '' + @@ -227,8 +226,8 @@ describe('target-size tests', function () { ]); }); - it('returns undefined if the target is not tabbable', function () { - var checkArgs = checkSetup( + it('returns undefined if the target is not tabbable', () => { + const checkArgs = checkSetup( '' + @@ -252,8 +251,8 @@ describe('target-size tests', function () { ]); }); - it('returns undefined if the obscuring node is not tabbable', function () { - var checkArgs = checkSetup( + it('returns undefined if the obscuring node is not tabbable', () => { + const checkArgs = checkSetup( '' + @@ -279,8 +278,8 @@ describe('target-size tests', function () { }); describe('that is a descendant', () => { - it('returns false if the widget is tabbable', function () { - var checkArgs = checkSetup( + it('returns false if the widget is tabbable', () => { + const checkArgs = checkSetup( ` ` @@ -289,8 +288,8 @@ describe('target-size tests', function () { assert.isFalse(out); }); - it('returns true if the widget is not tabbable', function () { - var checkArgs = checkSetup( + it('returns true if the widget is not tabbable', () => { + const checkArgs = checkSetup( ` ` @@ -301,8 +300,8 @@ describe('target-size tests', function () { }); describe('that is a descendant', () => { - it('returns false if the widget is tabbable', function () { - var checkArgs = checkSetup( + it('returns false if the widget is tabbable', () => { + const checkArgs = checkSetup( ` ` @@ -311,8 +310,8 @@ describe('target-size tests', function () { assert.isFalse(out); }); - it('returns true if the widget is not tabbable', function () { - var checkArgs = checkSetup( + it('returns true if the widget is not tabbable', () => { + const checkArgs = checkSetup( ` ` @@ -324,9 +323,9 @@ describe('target-size tests', function () { }); }); - describe('with overflowing content', function () { + describe('with overflowing content', () => { it('returns undefined target is too small', () => { - var checkArgs = checkSetup( + const checkArgs = checkSetup( '' ); assert.isUndefined(check.evaluate.apply(checkContext, checkArgs)); @@ -337,7 +336,7 @@ describe('target-size tests', function () { }); it('returns true if target has sufficient size', () => { - var checkArgs = checkSetup( + const checkArgs = checkSetup( '' ); assert.isTrue(check.evaluate.apply(checkContext, checkArgs)); @@ -345,7 +344,7 @@ describe('target-size tests', function () { describe('and partially obscured', () => { it('is undefined when unobscured area is too small', () => { - var checkArgs = checkSetup( + const checkArgs = checkSetup( '' + ' ' + '
' + @@ -359,7 +358,7 @@ describe('target-size tests', function () { }); it('is true when unobscured area is sufficient', () => { - var checkArgs = checkSetup( + const checkArgs = checkSetup( '' + ' ' + '
' + @@ -371,7 +370,7 @@ describe('target-size tests', function () { describe('and fully obscured', () => { it('is undefined', () => { - var checkArgs = checkSetup( + const checkArgs = checkSetup( '' + ' ' + '
' + @@ -386,8 +385,8 @@ describe('target-size tests', function () { }); }); - it('works across shadow boundaries', function () { - var checkArgs = shadowCheckSetup( + it('works across shadow boundaries', () => { + const checkArgs = shadowCheckSetup( '' + ''; + const target = fixture.querySelector('#target'); + const shadow = fixture + .querySelector('#shadow') + .attachShadow({ mode: 'open' }); + shadow.innerHTML = + '
'; + + axe.setup(fixture); + const vNode = axe.utils.getNodeFromTree(target); + assert.isTrue(check.evaluate.apply(checkContext, [target, {}, vNode])); + }); }); diff --git a/test/commons/dom/get-target-rects.js b/test/commons/dom/get-target-rects.js index f25abe291..be37b7cbb 100644 --- a/test/commons/dom/get-target-rects.js +++ b/test/commons/dom/get-target-rects.js @@ -1,6 +1,7 @@ describe('get-target-rects', () => { const getTargetRects = axe.commons.dom.getTargetRects; const { queryFixture } = axe.testUtils; + const fixture = document.getElementById('fixture'); it('returns the bounding rect when unobscured', () => { const vNode = queryFixture(''); @@ -74,10 +75,25 @@ describe('get-target-rects', () => { `); const rects = getTargetRects(vNode); - console.log(JSON.stringify(rects)); assert.deepEqual(rects, [ new DOMRect(10, 5, 30, 7), new DOMRect(10, 5, 7, 40) ]); }); + + it('ignores non-tabbable descendants of the target that are in shadow dom', () => { + fixture.innerHTML = + ''; + const target = fixture.querySelector('#target'); + const shadow = fixture + .querySelector('#shadow') + .attachShadow({ mode: 'open' }); + shadow.innerHTML = + '
'; + + axe.setup(fixture); + const vNode = axe.utils.getNodeFromTree(target); + const rects = getTargetRects(vNode); + assert.deepEqual(rects, [vNode.actualNode.getBoundingClientRect()]); + }); }); diff --git a/test/integration/full/target-size/shadow-dom.html b/test/integration/full/target-size/shadow-dom.html new file mode 100644 index 000000000..cc5e33f73 --- /dev/null +++ b/test/integration/full/target-size/shadow-dom.html @@ -0,0 +1,66 @@ + + + + Target-size shadow DOM test + + + + + + + +
+ + + + + + + + diff --git a/test/integration/full/target-size/shadow-dom.js b/test/integration/full/target-size/shadow-dom.js new file mode 100644 index 000000000..557ad32f9 --- /dev/null +++ b/test/integration/full/target-size/shadow-dom.js @@ -0,0 +1,39 @@ +describe('target-size shadow dom test', () => { + 'use strict'; + let results; + + before(done => { + axe.testUtils.awaitNestedLoad(async () => { + const options = { + runOnly: ['target-size'], + elementRef: true + }; + const context = { + // ignore the mocha links + exclude: '#mocha' + }; + results = await axe.run(context, options); + done(); + }); + }); + + describe('violations', function () { + it('should find 0', function () { + assert.lengthOf(results.violations, 0); + }); + }); + + describe('passes', function () { + it('should find 2', function () { + assert.lengthOf(results.passes[0].nodes, 2); + }); + }); + + it('should find 0 inapplicable', function () { + assert.lengthOf(results.inapplicable, 0); + }); + + it('should find 0 incomplete', function () { + assert.lengthOf(results.incomplete, 0); + }); +}); From a55740f38763a5bc222a5ae0e5aea07603c85a66 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:04:42 -0600 Subject: [PATCH 023/400] docs: add readme to locales dir to note _template is generated (#4425) Just clarifying that the `_template.json` file is generated so contributors don't edit it without knowing. The rest of the text is mostly copied from the root level README, which I also corrected gramatical mistakes. --- README.md | 4 ++-- locales/README.md | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 locales/README.md diff --git a/README.md b/README.md index 1f6ccfec4..8848b0a3e 100644 --- a/README.md +++ b/README.md @@ -103,9 +103,9 @@ or equivalently: This will create a new build for axe, called `axe..js` and `axe..min.js`. If you want to build all localized versions, simply pass in `--all-lang` instead. If you want to build multiple localized versions (but not all of them), you can pass in a comma-separated list of languages to the `--lang` flag, like `--lang=nl,ja`. -To create a new translation for axe, start by running `grunt translate --lang=`. This will create a json file fin the `./locales` directory, with the default English text in it for you to translate. Alternatively, you could copy `./locales/_template.json`. We welcome any localization for axe-core. For details on how to contribute, see the Contributing section below. For details on the message syntax, see [Check Message Template](/doc/check-message-template.md). +To create a new translation for axe, start by running `grunt translate --lang=`. This will create a json file in the `./locales` directory, with the default English text in it for you to translate. Alternatively, you could copy `./locales/_template.json`. We welcome any localization for axe-core. For details on how to contribute, see the Contributing section below. For details on the message syntax, see [Check Message Template](/doc/check-message-template.md). -To update existing translation file, re-run `grunt translate --lang=`. This will add new messages used in English and remove messages which were not used in English. +To update an existing translation file, re-run `grunt translate --lang=`. This will add new messages used in English and remove messages which were not used in English. Additionally, locale can be applied at runtime by passing a `locale` object to `axe.configure()`. The locale object must be of the same shape as existing locales in the `./locales` directory. For example: diff --git a/locales/README.md b/locales/README.md new file mode 100644 index 000000000..059e4db10 --- /dev/null +++ b/locales/README.md @@ -0,0 +1,9 @@ +# Localizations + +We welcome any localization for axe-core. For details on how to contribute, see the [Contributing section](../README.md#contributing) of the main README. For details on the message syntax, see [Check Message Template](../doc/check-message-template.md). + +To create a new translation for axe, start by running `grunt translate --lang=`. This will create a json file with the default English text in it for you to translate. Alternatively, you could copy `_template.json`. + +To update an existing translation file, re-run `grunt translate --lang=`. This will add new messages used in English and remove messages which were not used in English. + +`_template.json` is a generated file which is created every time axe is built. It's compiled using each rules' `description` and `help` properties as well as each checks' `metadata.messages` property. To update the `_template.json` file you'll need to update the corresponding [rule](../lib/rules) or [check](../lib/checks) metadata file and rebuild. From 61cbf3098c3e4af050d5d48d61f6e73d856b2700 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:11:34 -0600 Subject: [PATCH 024/400] docs: update required develop node version to 18 (#4424) Was the only reference to a required node version I could find in the docs. Our node version script is already set to 18. Closes: https://github.com/dequelabs/axe-core/issues/4323 --- doc/developer-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/developer-guide.md b/doc/developer-guide.md index 07abffb21..5b3233770 100644 --- a/doc/developer-guide.md +++ b/doc/developer-guide.md @@ -31,7 +31,7 @@ Axe 3.0 supports open Shadow DOM: see our virtual DOM APIs and test utilities fo ### Environment Pre-requisites -1. You must have NodeJS version 12 or higher installed. +1. You must have NodeJS version 18 or higher installed. 1. Install npm development dependencies. In the root folder of your axe-core repository, run `npm install` ### Building axe.js From 2d185f65e11c79cddcd48ac66a672866e3f083a3 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 25 Apr 2024 08:14:31 -0500 Subject: [PATCH 025/400] fix(aria-roles): address pr comments - learned sometimes we intentionally spec change - added `window` as a supported type, and `composite` which was missing from the readme - undid my change to `isWidgetType` Refs: #4371 --- doc/standards-object.md | 6 ++++-- lib/rules/widget-not-inline-matches.js | 3 +-- lib/standards/aria-roles.js | 10 ++++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/doc/standards-object.md b/doc/standards-object.md index a439b1ed4..cd34776d9 100644 --- a/doc/standards-object.md +++ b/doc/standards-object.md @@ -67,9 +67,11 @@ The [`ariaRoles`](../lib/standards/aria-roles.js) object defines valid ARIA role - `type` - string(required). [The role type](https://www.w3.org/TR/wai-aria-1.1/#roles_categorization). Valid types are: - `abstract` - - `widget` - - `structure` + - `composite` - `landmark` + - `structure` + - `widget` + - `window` - `requiredContext` - array(optional). List of required parent roles. - `requiredOwned` - array(optional). List of required owned roles. - `requiredAttrs` - array(optional). List of required attributes. diff --git a/lib/rules/widget-not-inline-matches.js b/lib/rules/widget-not-inline-matches.js index 1e6a7602d..61e5f2270 100644 --- a/lib/rules/widget-not-inline-matches.js +++ b/lib/rules/widget-not-inline-matches.js @@ -18,8 +18,7 @@ const matchesFns = [ ]; function isWidgetType(vNode) { - const roleType = getRoleType(vNode); - return roleType === 'widget' || roleType === 'composite'; + return getRoleType(vNode) === 'widget'; } function isNotAreaElement(vNode) { diff --git a/lib/standards/aria-roles.js b/lib/standards/aria-roles.js index 035990967..7a6d32577 100644 --- a/lib/standards/aria-roles.js +++ b/lib/standards/aria-roles.js @@ -1,5 +1,5 @@ // Source: https://www.w3.org/TR/wai-aria-1.1/#roles -// Source for abstract roles: https://www.w3.org/TR/wai-aria/#abstract_roles and https://www.w3.org/WAI/ARIA/1.2/class-diagram/rdf_model.svg +// Source for abstract roles (types): https://www.w3.org/TR/wai-aria/#abstract_roles /* easiest way to see allowed roles is to filter out the global ones from the list of inherited states and properties. The dpub spec @@ -32,7 +32,7 @@ const ariaRoles = { }, application: { // Note: spec difference - type: 'structure', + type: 'landmark', // Note: aria-expanded is not in the 1.1 spec but is // consistently supported in ATs and was added in 1.2 allowedAttrs: ['aria-activedescendant', 'aria-expanded'], @@ -120,7 +120,8 @@ const ariaRoles = { nameFromContent: true }, combobox: { - type: 'composite', + // Note: spec difference + type: 'widget', requiredAttrs: ['aria-expanded', 'aria-controls'], allowedAttrs: [ 'aria-owns', @@ -302,7 +303,8 @@ const ariaRoles = { superclassRole: ['section'] }, listbox: { - type: 'composite', + // Note: spec difference + type: 'widget', requiredOwned: ['group', 'option'], allowedAttrs: [ 'aria-multiselectable', From 417e6b1a03d3359db37d87a67f5b2ee9687107c2 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 25 Apr 2024 08:23:20 -0500 Subject: [PATCH 026/400] fix(aria-roles): reverted test change as well test change was only for data tables, but we didn't want to keep that type change Refs: #4371 --- test/commons/table/is-data-table.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/test/commons/table/is-data-table.js b/test/commons/table/is-data-table.js index d78c25e7b..c3607faf0 100644 --- a/test/commons/table/is-data-table.js +++ b/test/commons/table/is-data-table.js @@ -32,14 +32,6 @@ describe('table.isDataTable', function () { assert.isFalse(axe.commons.table.isDataTable(node)); }); - it('should be false if the table has role=application, which is an astract role of structure', function () { - fixture.innerHTML = '
'; - - var node = fixture.querySelector('table'); - axe.testUtils.flatTreeSetup(fixture.firstChild); - assert.isFalse(axe.commons.table.isDataTable(node)); - }); - it('should be true if the table is inside an editable area', function () { fixture.innerHTML = '
' + @@ -79,6 +71,13 @@ describe('table.isDataTable', function () { }); describe('should be true if the table has a landmark role', function () { + it('application', function () { + fixture.innerHTML = '
'; + + var node = fixture.querySelector('table'); + axe.testUtils.flatTreeSetup(fixture.firstChild); + assert.isTrue(axe.commons.table.isDataTable(node)); + }); it('banner', function () { fixture.innerHTML = '
'; From facd65f6f528122ba9c748e587ae3cf1ebd2a22a Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 25 Apr 2024 13:35:08 -0500 Subject: [PATCH 027/400] fix(aria-roles): exception for focus-order-semantics add `window` to has-widget-role, renamed Refs: #4371 --- .../has-widget-or-window-role-evaluate.js | 26 + ...le.json => has-widget-or-window-role.json} | 4 +- lib/checks/aria/has-widget-role-evaluate.js | 20 - lib/rules/focus-order-semantics.json | 2 +- locales/_template.json | 2 +- test/checks/aria/has-widget-or-window-role.js | 118 ++++ test/checks/aria/has-widget-role.js | 572 ------------------ 7 files changed, 148 insertions(+), 596 deletions(-) create mode 100644 lib/checks/aria/has-widget-or-window-role-evaluate.js rename lib/checks/aria/{has-widget-role.json => has-widget-or-window-role.json} (67%) delete mode 100644 lib/checks/aria/has-widget-role-evaluate.js create mode 100644 test/checks/aria/has-widget-or-window-role.js delete mode 100644 test/checks/aria/has-widget-role.js diff --git a/lib/checks/aria/has-widget-or-window-role-evaluate.js b/lib/checks/aria/has-widget-or-window-role-evaluate.js new file mode 100644 index 000000000..676b7d6f6 --- /dev/null +++ b/lib/checks/aria/has-widget-or-window-role-evaluate.js @@ -0,0 +1,26 @@ +import { getRoleType } from '../../commons/aria'; + +const acceptedRoles = { + widget: true, + composite: true, + window: true +}; + +/** + * Check if an elements `role` attribute uses any widget, composite, window abstract role values. + * + * Widget roles are taken from the `ariaRoles` standards object from the roles `type` property. + * + * @memberof checks + * @return {Boolean} True if the element uses a `widget`, `composite`, or `window` abstract role (type). False otherwise. + */ +// # TODO: change to abstract role for widget and window +function hasWidgetOrWindowRoleEvaluate(node) { + const role = node.getAttribute('role'); + if (role === null) { + return false; + } + return !!acceptedRoles[getRoleType(role)]; +} + +export default hasWidgetOrWindowRoleEvaluate; diff --git a/lib/checks/aria/has-widget-role.json b/lib/checks/aria/has-widget-or-window-role.json similarity index 67% rename from lib/checks/aria/has-widget-role.json rename to lib/checks/aria/has-widget-or-window-role.json index bda9ad343..be3f30f7d 100644 --- a/lib/checks/aria/has-widget-role.json +++ b/lib/checks/aria/has-widget-or-window-role.json @@ -1,6 +1,6 @@ { - "id": "has-widget-role", - "evaluate": "has-widget-role-evaluate", + "id": "has-widget-or-window-role", + "evaluate": "has-widget-or-window-role-evaluate", "options": [], "metadata": { "impact": "minor", diff --git a/lib/checks/aria/has-widget-role-evaluate.js b/lib/checks/aria/has-widget-role-evaluate.js deleted file mode 100644 index c3344ef20..000000000 --- a/lib/checks/aria/has-widget-role-evaluate.js +++ /dev/null @@ -1,20 +0,0 @@ -import { getRoleType } from '../../commons/aria'; - -/** - * Check if an elements `role` attribute uses any widget or composite role values. - * - * Widget roles are taken from the `ariaRoles` standards object from the roles `type` property. - * - * @memberof checks - * @return {Boolean} True if the element uses a `widget` or `composite` role. False otherwise. - */ -function hasWidgetRoleEvaluate(node) { - const role = node.getAttribute('role'); - if (role === null) { - return false; - } - const roleType = getRoleType(role); - return roleType === 'widget' || roleType === 'composite'; -} - -export default hasWidgetRoleEvaluate; diff --git a/lib/rules/focus-order-semantics.json b/lib/rules/focus-order-semantics.json index 8c73c2b9f..65bc65725 100644 --- a/lib/rules/focus-order-semantics.json +++ b/lib/rules/focus-order-semantics.json @@ -9,6 +9,6 @@ "help": "Elements in the focus order should have an appropriate role" }, "all": [], - "any": ["has-widget-role", "valid-scrollable-semantics"], + "any": ["has-widget-or-window-role", "valid-scrollable-semantics"], "none": [] } diff --git a/locales/_template.json b/locales/_template.json index 6ea35122f..2c09e751c 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -576,7 +576,7 @@ }, "fail": "Element does not have global ARIA attribute" }, - "has-widget-role": { + "has-widget-or-window-role": { "pass": "Element has a widget role.", "fail": "Element does not have a widget role." }, diff --git a/test/checks/aria/has-widget-or-window-role.js b/test/checks/aria/has-widget-or-window-role.js new file mode 100644 index 000000000..2adae9971 --- /dev/null +++ b/test/checks/aria/has-widget-or-window-role.js @@ -0,0 +1,118 @@ +describe('has-widget-or-window-role', function () { + 'use strict'; + + let node; + const fixture = document.getElementById('fixture'); + const checkContext = axe.testUtils.MockCheckContext(); + const evaluate = currentNode => + axe.testUtils + .getCheckEvaluate('has-widget-or-window-role') + .call(checkContext, currentNode); + const roles = { + widget: { + button: true, + checkbox: true, + gridcell: true, + link: true, + menuitem: true, + menuitemcheckbox: true, + menuitemradio: true, + option: true, + progressbar: true, + radio: true, + scrollbar: true, + searchbox: true, + slider: true, + spinbutton: true, + switch: true, + tab: true, + tabpanel: true, + textbox: true, + treeitem: true + }, + composite: { + combobox: true, + grid: true, + listbox: true, + menu: true, + menubar: true, + radiogroup: true, + tablist: true, + tree: true, + treegrid: true, + + application: false, + article: false, + cell: false, + columnheader: false, + definition: false, + directory: false, + document: false, + feed: false, + figure: false, + group: false, + heading: false, + img: false, + list: false, + listitem: false, + math: false, + none: false, + note: false, + presentation: false, + row: false, + rowgroup: false, + rowheader: false, + table: false, + term: false, + toolbar: false + }, + window: { + alertdialog: true, + dialog: true + }, + landmark: { + banner: false, + complimentary: false, + contentinfo: false, + form: false, + name: false, + navigation: false, + region: false, + search: false + } + }; + + afterEach(function () { + node.innerHTML = ''; + checkContext._data = null; + }); + + it('should return false for elements with no role', function () { + node = document.createElement('div'); + fixture.appendChild(node); + + assert.isFalse(evaluate(node)); + }); + + it('should return false for elements with nonsensical roles', function () { + node = document.createElement('div'); + node.setAttribute('role', 'buttonbuttonbutton'); + fixture.appendChild(node); + + assert.isFalse(evaluate(node)); + }); + + Object.keys(roles).forEach(category => { + describe(category, function () { + Object.keys(roles[category]).forEach(role => { + it(`should return ${roles[category][role]} for role="${role}"`, function () { + node = document.createElement('div'); + node.setAttribute('role', role); + fixture.appendChild(node); + + assert.equal(evaluate(node), roles[category][role]); + }); + }); + }); + }); +}); diff --git a/test/checks/aria/has-widget-role.js b/test/checks/aria/has-widget-role.js deleted file mode 100644 index f7324cadc..000000000 --- a/test/checks/aria/has-widget-role.js +++ /dev/null @@ -1,572 +0,0 @@ -describe('has-widget-role', function () { - 'use strict'; - - var fixture = document.getElementById('fixture'); - var node; - var checkContext = axe.testUtils.MockCheckContext(); - - afterEach(function () { - node.innerHTML = ''; - checkContext._data = null; - }); - - it('should return false for elements with no role', function () { - node = document.createElement('div'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for elements with nonsensical roles', function () { - node = document.createElement('div'); - node.setAttribute('role', 'buttonbuttonbutton'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - // Widget roles - it('should return true for role=button', function () { - node = document.createElement('div'); - node.setAttribute('role', 'button'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=checkbox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'checkbox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=gridcell', function () { - node = document.createElement('div'); - node.setAttribute('role', 'gridcell'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=link', function () { - node = document.createElement('div'); - node.setAttribute('role', 'link'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=menuitem', function () { - node = document.createElement('div'); - node.setAttribute('role', 'menuitem'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=menuitemcheckbox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'menuitemcheckbox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=menuitemradio', function () { - node = document.createElement('div'); - node.setAttribute('role', 'menuitemradio'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=option', function () { - node = document.createElement('div'); - node.setAttribute('role', 'option'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=progressbar', function () { - node = document.createElement('div'); - node.setAttribute('role', 'progressbar'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=radio', function () { - node = document.createElement('div'); - node.setAttribute('role', 'radio'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=scrollbar', function () { - node = document.createElement('div'); - node.setAttribute('role', 'scrollbar'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=searchbox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'searchbox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=slider', function () { - node = document.createElement('div'); - node.setAttribute('role', 'slider'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=spinbutton', function () { - node = document.createElement('div'); - node.setAttribute('role', 'spinbutton'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=switch', function () { - node = document.createElement('div'); - node.setAttribute('role', 'switch'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=tab', function () { - node = document.createElement('div'); - node.setAttribute('role', 'tab'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=tabpanel', function () { - node = document.createElement('div'); - node.setAttribute('role', 'tabpanel'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=textbox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'textbox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=treeitem', function () { - node = document.createElement('div'); - node.setAttribute('role', 'treeitem'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - // Composite widget roles - it('should return true for role=combobox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'combobox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=grid', function () { - node = document.createElement('div'); - node.setAttribute('role', 'grid'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=listbox', function () { - node = document.createElement('div'); - node.setAttribute('role', 'listbox'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=menu', function () { - node = document.createElement('div'); - node.setAttribute('role', 'menu'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=menubar', function () { - node = document.createElement('div'); - node.setAttribute('role', 'menubar'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=radiogroup', function () { - node = document.createElement('div'); - node.setAttribute('role', 'radiogroup'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=tablist', function () { - node = document.createElement('div'); - node.setAttribute('role', 'tablist'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=tree', function () { - node = document.createElement('div'); - node.setAttribute('role', 'tree'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return true for role=treegrid', function () { - node = document.createElement('div'); - node.setAttribute('role', 'treegrid'); - fixture.appendChild(node); - assert.isTrue( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=application', function () { - node = document.createElement('div'); - node.setAttribute('role', 'application'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=article', function () { - node = document.createElement('div'); - node.setAttribute('role', 'article'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=cell', function () { - node = document.createElement('div'); - node.setAttribute('role', 'cell'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=columnheader', function () { - node = document.createElement('div'); - node.setAttribute('role', 'columnheader'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=definition', function () { - node = document.createElement('div'); - node.setAttribute('role', 'definition'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=directory', function () { - node = document.createElement('div'); - node.setAttribute('role', 'directory'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=document', function () { - node = document.createElement('div'); - node.setAttribute('role', 'document'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=feed', function () { - node = document.createElement('div'); - node.setAttribute('role', 'feed'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=figure', function () { - node = document.createElement('div'); - node.setAttribute('role', 'figure'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=group', function () { - node = document.createElement('div'); - node.setAttribute('role', 'group'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=heading', function () { - node = document.createElement('div'); - node.setAttribute('role', 'heading'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=img', function () { - node = document.createElement('div'); - node.setAttribute('role', 'img'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=list', function () { - node = document.createElement('div'); - node.setAttribute('role', 'list'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=listitem', function () { - node = document.createElement('div'); - node.setAttribute('role', 'listitem'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=math', function () { - node = document.createElement('div'); - node.setAttribute('role', 'math'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=none', function () { - node = document.createElement('div'); - node.setAttribute('role', 'none'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=note', function () { - node = document.createElement('div'); - node.setAttribute('role', 'note'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=presentation', function () { - node = document.createElement('div'); - node.setAttribute('role', 'presentation'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=row', function () { - node = document.createElement('div'); - node.setAttribute('role', 'row'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=rowgroup', function () { - node = document.createElement('div'); - node.setAttribute('role', 'rowgroup'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=rowheader', function () { - node = document.createElement('div'); - node.setAttribute('role', 'rowheader'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=table', function () { - node = document.createElement('div'); - node.setAttribute('role', 'table'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=term', function () { - node = document.createElement('div'); - node.setAttribute('role', 'term'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=toolbar', function () { - node = document.createElement('div'); - node.setAttribute('role', 'toolbar'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - // Landmark Roles - it('should return false for role=banner', function () { - node = document.createElement('div'); - node.setAttribute('role', 'banner'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=complementary', function () { - node = document.createElement('div'); - node.setAttribute('role', 'complementary'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=contentinfo', function () { - node = document.createElement('div'); - node.setAttribute('role', 'contentinfo'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=form', function () { - node = document.createElement('div'); - node.setAttribute('role', 'form'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=main', function () { - node = document.createElement('div'); - node.setAttribute('role', 'main'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=navigation', function () { - node = document.createElement('div'); - node.setAttribute('role', 'navigation'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=region', function () { - node = document.createElement('div'); - node.setAttribute('role', 'region'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); - - it('should return false for role=search', function () { - node = document.createElement('div'); - node.setAttribute('role', 'search'); - fixture.appendChild(node); - assert.isFalse( - axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) - ); - }); -}); From bfa95ae2ff233de32390777f735cd35ef1e50fa4 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 25 Apr 2024 14:35:45 -0500 Subject: [PATCH 028/400] fix(aria-roles): updated locales better pass/fail english message, removed outdated translations Refs: #4371 --- lib/checks/aria/has-widget-or-window-role.json | 4 ++-- locales/_template.json | 4 ++-- locales/da.json | 4 ---- locales/de.json | 4 ---- locales/el.json | 4 ---- locales/es.json | 4 ---- locales/eu.json | 4 ---- locales/fr.json | 4 ---- locales/he.json | 4 ---- locales/it.json | 4 ---- locales/ja.json | 4 ---- locales/ko.json | 4 ---- locales/no_NB.json | 4 ---- locales/pl.json | 4 ---- locales/pt_BR.json | 4 ---- locales/zh_CN.json | 4 ---- locales/zh_TW.json | 4 ---- 17 files changed, 4 insertions(+), 64 deletions(-) diff --git a/lib/checks/aria/has-widget-or-window-role.json b/lib/checks/aria/has-widget-or-window-role.json index be3f30f7d..f5fed0b46 100644 --- a/lib/checks/aria/has-widget-or-window-role.json +++ b/lib/checks/aria/has-widget-or-window-role.json @@ -5,8 +5,8 @@ "metadata": { "impact": "minor", "messages": { - "pass": "Element has a widget role.", - "fail": "Element does not have a widget role." + "pass": "Element has a widget or window role.", + "fail": "Element does not have a widget or window role." } } } diff --git a/locales/_template.json b/locales/_template.json index 2c09e751c..cbdf75ed6 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -577,8 +577,8 @@ "fail": "Element does not have global ARIA attribute" }, "has-widget-or-window-role": { - "pass": "Element has a widget role.", - "fail": "Element does not have a widget role." + "pass": "Element has a widget or window role.", + "fail": "Element does not have a widget or window role." }, "invalidrole": { "pass": "ARIA role is valid", diff --git a/locales/da.json b/locales/da.json index 56c9a5ccd..a8f54214e 100644 --- a/locales/da.json +++ b/locales/da.json @@ -365,10 +365,6 @@ "plural": "'aria-errormessage'-værdi ${data.values}` bør bruge en teknik til at annoncere beskeden (fx 'aria-live', 'aria-describedby', 'role=alert', osv.)" } }, - "has-widget-role": { - "pass": "Elementet har en 'widget'-rolle.", - "fail": "Elementet har ikke en 'widget'-rolle." - }, "invalidrole": { "pass": "ARIA-rollen er korrekt", "fail": "Rollen skal være en af de mulige ARIA-roller" diff --git a/locales/de.json b/locales/de.json index 8f35d0c65..bd8a24b0a 100644 --- a/locales/de.json +++ b/locales/de.json @@ -576,10 +576,6 @@ }, "fail": "Das Element hat keine globalen ARIA Attribute." }, - "has-widget-role": { - "pass": "Element hat eine widget-Rolle.", - "fail": "Das Element besitzt keine widget-Rolle." - }, "invalidrole": { "pass": "ARIA Rolle ist gültig.", "fail": { diff --git a/locales/el.json b/locales/el.json index f8f805c42..4355fafeb 100644 --- a/locales/el.json +++ b/locales/el.json @@ -539,10 +539,6 @@ }, "fail": "Το στοιχείο δεν έχει καθολικό χαρακτηριστικό ARIA" }, - "has-widget-role": { - "pass": "Το στοιχείο έχει ρόλο widget.", - "fail": "Το στοιχείο δεν έχει ρόλο widget." - }, "invalidrole": { "pass": "Ο ρόλος ARIA είναι έγκυρος", "fail": { diff --git a/locales/es.json b/locales/es.json index 7a0b5c0b3..1f5aace76 100644 --- a/locales/es.json +++ b/locales/es.json @@ -356,10 +356,6 @@ "plural": "En aria-errormessage, valor ${data.values}`, se debe usar una técnica para anunciar el mensaje (p. ej., aria-live, aria-describedby, role=alert, etc.)" } }, - "has-widget-role": { - "pass": "El elemento tiene un rol de widget.", - "fail": "El elemento no tiene un rol de widget." - }, "invalidrole": { "pass": "El rol ARIA es válido", "fail": "El rol debe ser uno de los roles ARIA válidos" diff --git a/locales/eu.json b/locales/eu.json index 03b534cfc..e4130d375 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -356,10 +356,6 @@ "plural": "aria-errormessagen, bailioa ${data.values}`, mezua iragartzeko teknika bat erabili behar da (adibidez: aria-live, aria-describedby, role = alert, etab.)." } }, - "has-widget-role": { - "pass": "Elementuak widget rola du.", - "fail": "Elementuak ez du widget rolik." - }, "invalidrole": { "pass": "ARIA rola baliozkoa da", "fail": "Rolak baliozko ARIA rola izan behar du" diff --git a/locales/fr.json b/locales/fr.json index 9bd71725e..b57078518 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -519,10 +519,6 @@ }, "fail": "L’élément n’a pas d’attribut ARIA global" }, - "has-widget-role": { - "pass": "L’élément a un rôle widget.", - "fail": "L’élément n’a pas de rôle widget." - }, "invalidrole": { "pass": "Le rôle ARIA est valide", "fail": { diff --git a/locales/he.json b/locales/he.json index fd0d2eaa5..5502bac62 100644 --- a/locales/he.json +++ b/locales/he.json @@ -529,10 +529,6 @@ }, "fail": "לאלמנט אין תכונת ARIA גלובלית: " }, - "has-widget-role": { - "pass": "לאלמנט יש תפקיד של וגדג'ט.", - "fail": "לאלמנט אין תפקיד של וגדג'ט." - }, "invalidrole": { "pass": "תפקיד ARIA קביל", "fail": { diff --git a/locales/it.json b/locales/it.json index 6f1b72325..6aa14e609 100644 --- a/locales/it.json +++ b/locales/it.json @@ -573,10 +573,6 @@ }, "fail": "L'elemento non ha un attributo ARIA globale" }, - "has-widget-role": { - "pass": "L'elemento ha un ruolo widget.", - "fail": "L'elemento non ha un ruolo widget." - }, "invalidrole": { "pass": "Il ruolo ARIA è valido", "fail": { diff --git a/locales/ja.json b/locales/ja.json index 161fdba32..ce1f6e0eb 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -575,10 +575,6 @@ }, "fail": "要素にはグローバルなARIA属性が指定されていません" }, - "has-widget-role": { - "pass": "要素にはwidgetロールが存在します", - "fail": "要素にはwidgetロールが存在しません" - }, "invalidrole": { "pass": "ARIAロールが有効です", "fail": { diff --git a/locales/ko.json b/locales/ko.json index 9c304d1d7..d86ffeed5 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -524,10 +524,6 @@ }, "fail": "엘리먼트가 전역 ARIA 어트리뷰트를 가지고 있지 않습니다." }, - "has-widget-role": { - "pass": "엘리먼트가 위젯 역할(role)을 가지고 있습니다.", - "fail": "엘리먼트가 위젯 역할(role)을 가지고 있지 않습니다." - }, "invalidrole": { "pass": "ARIA 역할(role)이 유효합니다.", "fail": { diff --git a/locales/no_NB.json b/locales/no_NB.json index 4dbf8dbe9..ed73ec0bb 100644 --- a/locales/no_NB.json +++ b/locales/no_NB.json @@ -365,10 +365,6 @@ "plural": "'aria-errormessage'-verdier ${data.values}` skal bruke en metode for å annonsere beskeden (f.eks. 'aria-live', 'aria-describedby', 'role=alert', osv.)" } }, - "has-widget-role": { - "pass": "Elementet har en 'widget'-rolle.", - "fail": "Elementet har ikke en 'widget'-rolle." - }, "invalidrole": { "pass": "ARIA-rollen er korrekt", "fail": "Rollen skal være en av de mulige ARIA-roller" diff --git a/locales/pl.json b/locales/pl.json index 1caafcabd..7c2f2d1f7 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -575,10 +575,6 @@ }, "fail": "Element nie ma ogólnego atrybutu ARIA" }, - "has-widget-role": { - "pass": "Element ma rolę widżetu.", - "fail": "Element nie ma roli widżetu." - }, "invalidrole": { "pass": "Rola ARIA jest poprawna.", "fail": { diff --git a/locales/pt_BR.json b/locales/pt_BR.json index 404d5ab29..68d4cf2da 100644 --- a/locales/pt_BR.json +++ b/locales/pt_BR.json @@ -504,10 +504,6 @@ }, "fail": "O elemento não tem atributo ARIA global" }, - "has-widget-role": { - "pass": "Elemento tem um 'role' de 'widget'.", - "fail": "Elemento não tem um 'role' de 'widget'." - }, "invalidrole": { "pass": "O ARIA 'role' é válido", "fail": { diff --git a/locales/zh_CN.json b/locales/zh_CN.json index ef5e6876d..089cf0ce3 100644 --- a/locales/zh_CN.json +++ b/locales/zh_CN.json @@ -576,10 +576,6 @@ }, "fail": "元素没有全局 ARIA 属性" }, - "has-widget-role": { - "pass": "元素有小部件角色", - "fail": "元素没有小部件角色" - }, "invalidrole": { "pass": "ARIA 角色有效", "fail": { diff --git a/locales/zh_TW.json b/locales/zh_TW.json index 37a9d3262..ba6c50f4c 100644 --- a/locales/zh_TW.json +++ b/locales/zh_TW.json @@ -573,10 +573,6 @@ }, "fail": "元素沒有全域 ARIA 屬性" }, - "has-widget-role": { - "pass": "元素具有小部件角色", - "fail": "元素沒有小部件角色" - }, "invalidrole": { "pass": "ARIA 角色有效", "fail": { From 29e7e2a32f952978178885d3e8e424290db587b3 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:47:53 -0600 Subject: [PATCH 029/400] revert(color-contrast): revert upgrade to colorjs.io v0.5.0 to work with prototype.js (#4429) This [puts back the v0.4.3 code](https://github.com/dequelabs/axe-core/pull/4366) in `color.js` to handle colorjs.io not handling rad and turn values in hsl. I also decided to use core-js `Array.from` polyfill rather than our own internal one since I needed to bring it in outside of the `polyfill.js` file and could then add it as an import and reuse it in both places. Closes: https://github.com/dequelabs/axe-core/issues/4428 --- lib/commons/color/color.js | 41 +- lib/core/imports/index.js | 10 +- lib/core/imports/polyfills.js | 91 +- package-lock.json | 16 +- package.json | 2 +- test/commons/color/color.js | 18 + .../full/contrast/prototype-lib-1.7.3.js | 8074 +++++++++++++++++ test/integration/full/contrast/prototype.html | 32 + test/integration/full/contrast/prototype.js | 26 + 9 files changed, 8210 insertions(+), 100 deletions(-) create mode 100644 test/integration/full/contrast/prototype-lib-1.7.3.js create mode 100644 test/integration/full/contrast/prototype.html create mode 100644 test/integration/full/contrast/prototype.js diff --git a/lib/commons/color/color.js b/lib/commons/color/color.js index 5201628d3..c6cb6496a 100644 --- a/lib/commons/color/color.js +++ b/lib/commons/color/color.js @@ -1,6 +1,7 @@ -import { Colorjs } from '../../core/imports'; +import { Colorjs, ArrayFrom } from '../../core/imports'; const hexRegex = /^#[0-9a-f]{3,8}$/i; +const hslRegex = /hsl\(\s*([-\d.]+)(rad|turn)/; /** * @class Color @@ -129,9 +130,37 @@ export default class Color { * @instance */ parseString(colorString) { + // Colorjs { + const value = angle + unit; + + switch (unit) { + case 'rad': + return match.replace(value, radToDeg(angle)); + case 'turn': + return match.replace(value, turnToDeg(angle)); + } + }); + try { + // revert prototype.js override of Array.from + // in order to get color-contrast working + // @see https://github.com/dequelabs/axe-core/issues/4428 + let prototypeArrayFrom; + if ('Prototype' in window && 'Version' in window.Prototype) { + prototypeArrayFrom = Array.from; + Array.from = ArrayFrom; + } + // srgb values are between 0 and 1 const color = new Colorjs(colorString).to('srgb'); + + if (prototypeArrayFrom) { + Array.from = prototypeArrayFrom; + prototypeArrayFrom = null; + } + this.r = color.r; this.g = color.g; this.b = color.b; @@ -328,3 +357,13 @@ export default class Color { function clamp(value, min, max) { return Math.min(Math.max(min, value), max); } + +// convert radians to degrees +function radToDeg(rad) { + return (rad * 180) / Math.PI; +} + +// convert turn to degrees +function turnToDeg(turn) { + return turn * 360; +} diff --git a/lib/core/imports/index.js b/lib/core/imports/index.js index 80aa717d5..4a23f352f 100644 --- a/lib/core/imports/index.js +++ b/lib/core/imports/index.js @@ -6,6 +6,7 @@ import doT from '@deque/dot'; import emojiRegexText from 'emoji-regex'; import memoize from 'memoizee'; import Color from 'colorjs.io'; +import ArrayFrom from 'core-js-pure/actual/array/from'; // prevent striping newline characters from strings (e.g. failure // summaries). value must be synced with build/configure.js @@ -17,4 +18,11 @@ doT.templateSettings.strip = false; * @namespace imports * @memberof axe */ -export { CssSelectorParser, doT, emojiRegexText, memoize, Color as Colorjs }; +export { + CssSelectorParser, + doT, + emojiRegexText, + memoize, + Color as Colorjs, + ArrayFrom +}; diff --git a/lib/core/imports/polyfills.js b/lib/core/imports/polyfills.js index 5725632e4..7ad8adb4a 100644 --- a/lib/core/imports/polyfills.js +++ b/lib/core/imports/polyfills.js @@ -3,6 +3,7 @@ import { Uint32Array } from 'typedarray'; import 'weakmap-polyfill'; import hasOwn from 'core-js-pure/actual/object/has-own'; import values from 'core-js-pure/actual/object/values'; +import ArrayFrom from 'core-js-pure/actual/array/from'; if (!('hasOwn' in Object)) { Object.hasOwn = hasOwn; @@ -177,95 +178,7 @@ if (!Array.prototype.some) { } if (!Array.from) { - Object.defineProperty(Array, 'from', { - value: (function () { - var toStr = Object.prototype.toString; - var isCallable = function (fn) { - return ( - typeof fn === 'function' || toStr.call(fn) === '[object Function]' - ); - }; - var toInteger = function (value) { - var number = Number(value); - if (isNaN(number)) { - return 0; - } - if (number === 0 || !isFinite(number)) { - return number; - } - return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); - }; - var maxSafeInteger = Math.pow(2, 53) - 1; - var toLength = function (value) { - var len = toInteger(value); - return Math.min(Math.max(len, 0), maxSafeInteger); - }; - - // The length property of the from method is 1. - return function from(arrayLike /*, mapFn, thisArg */) { - // 1. Let C be the this value. - var C = this; - - // 2. Let items be ToObject(arrayLike). - var items = Object(arrayLike); - - // 3. ReturnIfAbrupt(items). - if (arrayLike == null) { - throw new TypeError( - 'Array.from requires an array-like object - not null or undefined' - ); - } - - // 4. If mapfn is undefined, then let mapping be false. - var mapFn = arguments.length > 1 ? arguments[1] : void undefined; - var T; - if (typeof mapFn !== 'undefined') { - // 5. else - // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. - if (!isCallable(mapFn)) { - throw new TypeError( - 'Array.from: when provided, the second argument must be a function' - ); - } - - // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. - if (arguments.length > 2) { - T = arguments[2]; - } - } - - // 10. Let lenValue be Get(items, "length"). - // 11. Let len be ToLength(lenValue). - var len = toLength(items.length); - - // 13. If IsConstructor(C) is true, then - // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. - // 14. a. Else, Let A be ArrayCreate(len). - var A = isCallable(C) ? Object(new C(len)) : new Array(len); - - // 16. Let k be 0. - var k = 0; - // 17. Repeat, while k < len… (also steps a - h) - var kValue; - while (k < len) { - kValue = items[k]; - if (mapFn) { - A[k] = - typeof T === 'undefined' - ? mapFn(kValue, k) - : mapFn.call(T, kValue, k); - } else { - A[k] = kValue; - } - k += 1; - } - // 18. Let putStatus be Put(A, "length", len, true). - A.length = len; - // 20. Return A. - return A; - }; - })() - }); + Array.from = ArrayFrom; } if (!String.prototype.includes) { diff --git a/package-lock.json b/package-lock.json index 0947cc245..c337ac05d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,10 +20,10 @@ "browser-driver-manager": "1.0.4", "chai": "^4.3.7", "chalk": "^4.x", - "chromedriver": "*", + "chromedriver": "latest", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", - "colorjs.io": "^0.5.0", + "colorjs.io": "^0.4.3", "conventional-commits-parser": "^5.0.0", "core-js": "^3.27.1", "css-selector-parser": "^1.4.1", @@ -3655,9 +3655,9 @@ "dev": true }, "node_modules/colorjs.io": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.0.tgz", - "integrity": "sha512-qekjTiBLM3F/sXKks/ih5aWaHIGu+Ftel0yKEvmpbKvmxpNOhojKgha5uiWEUOqEpRjC1Tq3nJRT7WgdBOxIGg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.4.3.tgz", + "integrity": "sha512-Jr6NiWFZCuSECl23Bhe4jvDldQsE0ErnWrdl3xIUFy+Bkp0l8r5qt/iZlNH47/xxGP5izcyC8InjoUoI4Po+Pg==", "dev": true }, "node_modules/colors": { @@ -15845,9 +15845,9 @@ "dev": true }, "colorjs.io": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.0.tgz", - "integrity": "sha512-qekjTiBLM3F/sXKks/ih5aWaHIGu+Ftel0yKEvmpbKvmxpNOhojKgha5uiWEUOqEpRjC1Tq3nJRT7WgdBOxIGg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.4.3.tgz", + "integrity": "sha512-Jr6NiWFZCuSECl23Bhe4jvDldQsE0ErnWrdl3xIUFy+Bkp0l8r5qt/iZlNH47/xxGP5izcyC8InjoUoI4Po+Pg==", "dev": true }, "colors": { diff --git a/package.json b/package.json index e746e267c..9983cadde 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "chromedriver": "latest", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", - "colorjs.io": "^0.5.0", + "colorjs.io": "^0.4.3", "conventional-commits-parser": "^5.0.0", "core-js": "^3.27.1", "css-selector-parser": "^1.4.1", diff --git a/test/commons/color/color.js b/test/commons/color/color.js index 1c1230e7f..3c1722c11 100644 --- a/test/commons/color/color.js +++ b/test/commons/color/color.js @@ -166,6 +166,15 @@ describe('color.Color', () => { assert.equal(c.alpha, 1); }); + it('supports negative rad on hue', () => { + const c = new Color(); + c.parseColorFnString('hsl(-3.49rad, 40%, 50%)'); + assert.equal(c.red, 77); + assert.equal(c.green, 179); + assert.equal(c.blue, 145); + assert.equal(c.alpha, 1); + }); + it('supports turn on hue', () => { const c = new Color(); c.parseColorFnString('hsl(0.444turn, 40%, 50%)'); @@ -174,6 +183,15 @@ describe('color.Color', () => { assert.equal(c.blue, 144); assert.equal(c.alpha, 1); }); + + it('supports negative turn on hue', () => { + const c = new Color(); + c.parseColorFnString('hsl(-0.556turn, 40%, 50%)'); + assert.equal(c.red, 77); + assert.equal(c.green, 179); + assert.equal(c.blue, 144); + assert.equal(c.alpha, 1); + }); }); describe('with hwb()', () => { diff --git a/test/integration/full/contrast/prototype-lib-1.7.3.js b/test/integration/full/contrast/prototype-lib-1.7.3.js new file mode 100644 index 000000000..641442695 --- /dev/null +++ b/test/integration/full/contrast/prototype-lib-1.7.3.js @@ -0,0 +1,8074 @@ +/* eslint-disable */ +/* Prototype JavaScript framework, version 1.7.3 + * (c) 2005-2010 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.7.3', + + Browser: (function () { + var ua = navigator.userAgent; + var isOpera = + Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + }; + })(), + + BrowserFeatures: { + XPath: !!document.evaluate, + + SelectorsAPI: !!document.querySelector, + + ElementExtensions: (function () { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function () { + if (typeof window.HTMLDivElement !== 'undefined') return true; + + var div = document.createElement('div'), + form = document.createElement('form'), + isSupported = false; + + if (div['__proto__'] && div['__proto__'] !== form['__proto__']) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() + }, + + ScriptFragment: ']*>([\\S\\s]*?)', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function () {}, + + K: function (x) { + return x; + } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function () { + var IS_DONTENUM_BUGGY = (function () { + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function subclass() {} + function create() { + var parent = null, + properties = $A(arguments); + if (Object.isFunction(properties[0])) parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + subclass.prototype = parent.prototype; + klass.prototype = new subclass(); + parent.subclasses.push(klass); + } + + for (var i = 0, length = properties.length; i < length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + return klass; + } + + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype, + properties = Object.keys(source); + + if (IS_DONTENUM_BUGGY) { + if (source.toString != Object.prototype.toString) + properties.push('toString'); + if (source.valueOf != Object.prototype.valueOf) + properties.push('valueOf'); + } + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], + value = source[property]; + if ( + ancestor && + Object.isFunction(value) && + value.argumentNames()[0] == '$super' + ) { + var method = value; + value = (function (m) { + return function () { + return ancestor[m].apply(this, arguments); + }; + })(property).wrap(method); + + value.valueOf = (function (method) { + return function () { + return method.valueOf.call(method); + }; + })(method); + + value.toString = (function (method) { + return function () { + return method.toString.call(method); + }; + })(method); + } + this.prototype[property] = value; + } + + return this; + } + + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function () { + var _toString = Object.prototype.toString, + _hasOwnProperty = Object.prototype.hasOwnProperty, + NULL_TYPE = 'Null', + UNDEFINED_TYPE = 'Undefined', + BOOLEAN_TYPE = 'Boolean', + NUMBER_TYPE = 'Number', + STRING_TYPE = 'String', + OBJECT_TYPE = 'Object', + FUNCTION_CLASS = '[object Function]', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + DATE_CLASS = '[object Date]', + NATIVE_JSON_STRINGIFY_SUPPORT = + window.JSON && + typeof JSON.stringify === 'function' && + JSON.stringify(0) === '0' && + typeof JSON.stringify(Prototype.K) === 'undefined'; + + var DONT_ENUMS = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ]; + + var IS_DONTENUM_BUGGY = (function () { + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function Type(o) { + switch (o) { + case null: + return NULL_TYPE; + case void 0: + return UNDEFINED_TYPE; + } + var type = typeof o; + switch (type) { + case 'boolean': + return BOOLEAN_TYPE; + case 'number': + return NUMBER_TYPE; + case 'string': + return STRING_TYPE; + } + return OBJECT_TYPE; + } + + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + + function inspect(object) { + try { + if (isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + } + + function toJSON(value) { + return Str('', { '': value }, []); + } + + function Str(key, holder, stack) { + var value = holder[key]; + if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + var _class = _toString.call(value); + + switch (_class) { + case NUMBER_CLASS: + case BOOLEAN_CLASS: + case STRING_CLASS: + value = value.valueOf(); + } + + switch (value) { + case null: + return 'null'; + case true: + return 'true'; + case false: + return 'false'; + } + + var type = typeof value; + switch (type) { + case 'string': + return value.inspect(true); + case 'number': + return isFinite(value) ? String(value) : 'null'; + case 'object': + for (var i = 0, length = stack.length; i < length; i++) { + if (stack[i] === value) { + throw new TypeError( + "Cyclic reference to '" + value + "' in object" + ); + } + } + stack.push(value); + + var partial = []; + if (_class === ARRAY_CLASS) { + for (var i = 0, length = value.length; i < length; i++) { + var str = Str(i, value, stack); + partial.push(typeof str === 'undefined' ? 'null' : str); + } + partial = '[' + partial.join(',') + ']'; + } else { + var keys = Object.keys(value); + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i], + str = Str(key, value, stack); + if (typeof str !== 'undefined') { + partial.push(key.inspect(true) + ':' + str); + } + } + partial = '{' + partial.join(',') + '}'; + } + stack.pop(); + return partial; + } + } + + function stringify(object) { + return JSON.stringify(object); + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + if (Type(object) !== OBJECT_TYPE) { + throw new TypeError(); + } + var results = []; + for (var property in object) { + if (_hasOwnProperty.call(object, property)) results.push(property); + } + + if (IS_DONTENUM_BUGGY) { + for (var i = 0; (property = DONT_ENUMS[i]); i++) { + if (_hasOwnProperty.call(object, property)) results.push(property); + } + } + + return results; + } + + function values(object) { + var results = []; + for (var property in object) results.push(object[property]); + return results; + } + + function clone(object) { + return extend({}, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) === ARRAY_CLASS; + } + + var hasNativeIsArray = + typeof Array.isArray == 'function' && + Array.isArray([]) && + !Array.isArray({}); + + if (hasNativeIsArray) { + isArray = Array.isArray; + } + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return _toString.call(object) === FUNCTION_CLASS; + } + + function isString(object) { + return _toString.call(object) === STRING_CLASS; + } + + function isNumber(object) { + return _toString.call(object) === NUMBER_CLASS; + } + + function isDate(object) { + return _toString.call(object) === DATE_CLASS; + } + + function isUndefined(object) { + return typeof object === 'undefined'; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: Object.keys || keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isUndefined: isUndefined + }); +})(); +Object.extend( + Function.prototype, + (function () { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, + length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString() + .match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') + .replace(/\s+/g, '') + .split(','); + return names.length == 1 && !names[0] ? [] : names; + } + + function bind(context) { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + + if (!Object.isFunction(this)) + throw new TypeError('The object is not callable.'); + + var nop = function () {}; + var __method = this, + args = slice.call(arguments, 1); + + var bound = function () { + var a = merge(args, arguments); + var c = this instanceof bound ? this : context; + return __method.apply(c, a); + }; + + nop.prototype = this.prototype; + bound.prototype = new nop(); + + return bound; + } + + function bindAsEventListener(context) { + var __method = this, + args = slice.call(arguments, 1); + return function (event) { + var a = update([event || window.event], args); + return __method.apply(context, a); + }; + } + + function curry() { + if (!arguments.length) return this; + var __method = this, + args = slice.call(arguments, 0); + return function () { + var a = merge(args, arguments); + return __method.apply(this, a); + }; + } + + function delay(timeout) { + var __method = this, + args = slice.call(arguments, 1); + timeout = timeout * 1000; + return window.setTimeout(function () { + return __method.apply(__method, args); + }, timeout); + } + + function defer() { + var args = update([0.01], arguments); + return this.delay.apply(this, args); + } + + function wrap(wrapper) { + var __method = this; + return function () { + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); + }; + } + + function methodize() { + if (this._methodized) return this._methodized; + var __method = this; + return (this._methodized = function () { + var a = update([this], arguments); + return __method.apply(null, a); + }); + } + + var extensions = { + argumentNames: argumentNames, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize + }; + + if (!Function.prototype.bind) extensions.bind = bind; + + return extensions; + })() +); + +(function (proto) { + function toISOString() { + return ( + this.getUTCFullYear() + + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + + '-' + + this.getUTCDate().toPaddedString(2) + + 'T' + + this.getUTCHours().toPaddedString(2) + + ':' + + this.getUTCMinutes().toPaddedString(2) + + ':' + + this.getUTCSeconds().toPaddedString(2) + + 'Z' + ); + } + + function toJSON() { + return this.toISOString(); + } + + if (!proto.toISOString) proto.toISOString = toISOString; + if (!proto.toJSON) proto.toJSON = toJSON; +})(Date.prototype); + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function (str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; +var PeriodicalExecuter = Class.create({ + initialize: function (callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function () { + this.timer = setInterval( + this.onTimerEvent.bind(this), + this.frequency * 1000 + ); + }, + + execute: function () { + this.callback(this); + }, + + stop: function () { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function () { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + this.currentlyExecuting = false; + } catch (e) { + this.currentlyExecuting = false; + throw e; + } + } + } +}); +Object.extend(String, { + interpret: function (value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend( + String.prototype, + (function () { + var NATIVE_JSON_PARSE_SUPPORT = + window.JSON && + typeof JSON.parse === 'function' && + JSON.parse('{"test": true}').test; + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function (match) { + return template.evaluate(match); + }; + } + + function isNonEmptyRegExp(regexp) { + return regexp.source && regexp.source !== '(?:)'; + } + + function gsub(pattern, replacement) { + var result = '', + source = this, + match; + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) pattern = RegExp.escape(pattern); + + if (!(pattern.length || isNonEmptyRegExp(pattern))) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } + + while (source.length > 0) { + match = source.match(pattern); + if (match && match[0].length > 0) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + (result += source), (source = ''); + } + } + return result; + } + + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function (match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + } + + function scan(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + } + + function truncate(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length + ? this.slice(0, length - truncation.length) + truncation + : String(this); + } + + function strip() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + function stripTags() { + return this.replace( + /<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?(\/)?>|<\/\w+>/gi, + '' + ); + } + + function stripScripts() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + } + + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), + matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function (scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + } + + function evalScripts() { + return this.extractScripts().map(function (script) { + return eval(script); + }); + } + + function escapeHTML() { + return this.replace(/&/g, '&') + .replace(//g, '>'); + } + + function unescapeHTML() { + return this.stripTags() + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&'); + } + + function toQueryParams(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return {}; + + return match[1].split(separator || '&').inject({}, function (hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()), + value = pair.length > 1 ? pair.join('=') : pair[0]; + + if (value != undefined) { + value = value.gsub('+', ' '); + value = decodeURIComponent(value); + } + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } else hash[key] = value; + } + return hash; + }); + } + + function toArray() { + return this.split(''); + } + + function succ() { + return ( + this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1) + ); + } + + function times(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + } + + function camelize() { + return this.replace(/-+(.)?/g, function (match, chr) { + return chr ? chr.toUpperCase() : ''; + }); + } + + function capitalize() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + } + + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } + + function dasherize() { + return this.replace(/_/g, '-'); + } + + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function (character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) + return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, "\\'") + "'"; + } + + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } + + function isJSON() { + var str = this; + if (str.blank()) return false; + str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); + str = str.replace( + /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + ']' + ); + str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + return /^[\],:{}\s]*$/.test(str); + } + + function evalJSON(sanitize) { + var json = this.unfilterJSON(), + cx = + /[\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff\u0000]/g; + if (cx.test(json)) { + json = json.replace(cx, function (a) { + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) {} + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + } + + function parseJSON() { + var json = this.unfilterJSON(); + return JSON.parse(json); + } + + function include(pattern) { + return this.indexOf(pattern) > -1; + } + + function startsWith(pattern, position) { + position = Object.isNumber(position) ? position : 0; + return this.lastIndexOf(pattern, position) === position; + } + + function endsWith(pattern, position) { + pattern = String(pattern); + position = Object.isNumber(position) ? position : this.length; + if (position < 0) position = 0; + if (position > this.length) position = this.length; + var d = position - pattern.length; + return d >= 0 && this.indexOf(pattern, d) === d; + } + + function empty() { + return this == ''; + } + + function blank() { + return /^\s*$/.test(this); + } + + function interpolate(object, pattern) { + return new Template(this, pattern).evaluate(object); + } + + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim || strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, + include: include, + startsWith: String.prototype.startsWith || startsWith, + endsWith: String.prototype.endsWith || endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; + })() +); + +var Template = Class.create({ + initialize: function (template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function (object) { + if (object && Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function (match) { + if (object == null) return match[1] + ''; + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, + expr = match[3], + pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') + ? match[2].replace(/\\\\]/g, ']') + : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring( + '[' == match[3] ? match[1].length : match[0].length + ); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = {}; + +var Enumerable = (function () { + function each(iterator, context) { + try { + this._each(iterator, context); + } catch (e) { + if (e != $break) throw e; + } + return this; + } + + function eachSlice(number, iterator, context) { + var index = -number, + slices = [], + array = this.toArray(); + if (number < 1) return array; + while ((index += number) < array.length) + slices.push(array.slice(index, index + number)); + return slices.collect(iterator, context); + } + + function all(iterator, context) { + iterator = iterator || Prototype.K; + var result = true; + this.each(function (value, index) { + result = result && !!iterator.call(context, value, index, this); + if (!result) throw $break; + }, this); + return result; + } + + function any(iterator, context) { + iterator = iterator || Prototype.K; + var result = false; + this.each(function (value, index) { + if ((result = !!iterator.call(context, value, index, this))) throw $break; + }, this); + return result; + } + + function collect(iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + this.each(function (value, index) { + results.push(iterator.call(context, value, index, this)); + }, this); + return results; + } + + function detect(iterator, context) { + var result; + this.each(function (value, index) { + if (iterator.call(context, value, index, this)) { + result = value; + throw $break; + } + }, this); + return result; + } + + function findAll(iterator, context) { + var results = []; + this.each(function (value, index) { + if (iterator.call(context, value, index, this)) results.push(value); + }, this); + return results; + } + + function grep(filter, iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + + if (Object.isString(filter)) filter = new RegExp(RegExp.escape(filter)); + + this.each(function (value, index) { + if (filter.match(value)) + results.push(iterator.call(context, value, index, this)); + }, this); + return results; + } + + function include(object) { + if (Object.isFunction(this.indexOf) && this.indexOf(object) != -1) + return true; + + var found = false; + this.each(function (value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + } + + function inGroupsOf(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function (slice) { + while (slice.length < number) slice.push(fillWith); + return slice; + }); + } + + function inject(memo, iterator, context) { + this.each(function (value, index) { + memo = iterator.call(context, memo, value, index, this); + }, this); + return memo; + } + + function invoke(method) { + var args = $A(arguments).slice(1); + return this.map(function (value) { + return value[method].apply(value, args); + }); + } + + function max(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function (value, index) { + value = iterator.call(context, value, index, this); + if (result == null || value >= result) result = value; + }, this); + return result; + } + + function min(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function (value, index) { + value = iterator.call(context, value, index, this); + if (result == null || value < result) result = value; + }, this); + return result; + } + + function partition(iterator, context) { + iterator = iterator || Prototype.K; + var trues = [], + falses = []; + this.each(function (value, index) { + (iterator.call(context, value, index, this) ? trues : falses).push(value); + }, this); + return [trues, falses]; + } + + function pluck(property) { + var results = []; + this.each(function (value) { + results.push(value[property]); + }); + return results; + } + + function reject(iterator, context) { + var results = []; + this.each(function (value, index) { + if (!iterator.call(context, value, index, this)) results.push(value); + }, this); + return results; + } + + function sortBy(iterator, context) { + return this.map(function (value, index) { + return { + value: value, + criteria: iterator.call(context, value, index, this) + }; + }, this) + .sort(function (left, right) { + var a = left.criteria, + b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }) + .pluck('value'); + } + + function toArray() { + return this.map(); + } + + function zip() { + var iterator = Prototype.K, + args = $A(arguments); + if (Object.isFunction(args.last())) iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function (value, index) { + return iterator(collections.pluck(index)); + }); + } + + function size() { + return this.toArray().length; + } + + function inspect() { + return '#'; + } + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); + +function $A(iterable) { + if (!iterable) return []; + if ('toArray' in Object(iterable)) return iterable.toArray(); + var length = iterable.length || 0, + results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +Array.from = $A; + +(function () { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator, context) { + for (var i = 0, length = this.length >>> 0; i < length; i++) { + if (i in this) iterator.call(context, this[i], i, this); + } + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function (value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function (array, value) { + if (Object.isArray(value)) return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function (value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline === false ? this.toArray() : this)._reverse(); + } + + function uniq(sorted) { + return this.inject([], function (array, value, index) { + if ( + 0 == index || + (sorted ? array.last() != value : !array.include(value)) + ) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function (item) { + return array.indexOf(item) !== -1; + }); + } + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function indexOf(item, i) { + if (this == null) throw new TypeError(); + + var array = Object(this), + length = array.length >>> 0; + if (length === 0) return -1; + + i = Number(i); + if (isNaN(i)) { + i = 0; + } else if (i !== 0 && isFinite(i)) { + i = (i > 0 ? 1 : -1) * Math.floor(Math.abs(i)); + } + + if (i > length) return -1; + + var k = i >= 0 ? i : Math.max(length - Math.abs(i), 0); + for (; k < length; k++) if (k in array && array[k] === item) return k; + return -1; + } + + function lastIndexOf(item, i) { + if (this == null) throw new TypeError(); + + var array = Object(this), + length = array.length >>> 0; + if (length === 0) return -1; + + if (!Object.isUndefined(i)) { + i = Number(i); + if (isNaN(i)) { + i = 0; + } else if (i !== 0 && isFinite(i)) { + i = (i > 0 ? 1 : -1) * Math.floor(Math.abs(i)); + } + } else { + i = length; + } + + var k = i >= 0 ? Math.min(i, length - 1) : length - Math.abs(i); + + for (; k >= 0; k--) if (k in array && array[k] === item) return k; + return -1; + } + + function concat(_) { + var array = [], + items = slice.call(arguments, 0), + item, + n = 0; + items.unshift(this); + for (var i = 0, length = items.length; i < length; i++) { + item = items[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) { + if (j in item) array[n] = item[j]; + n++; + } + } else { + array[n++] = item; + } + } + array.length = n; + return array; + } + + function wrapNative(method) { + return function () { + if (arguments.length === 0) { + return method.call(this, Prototype.K); + } else if (arguments[0] === undefined) { + var args = slice.call(arguments, 1); + args.unshift(Prototype.K); + return method.apply(this, args); + } else { + return method.apply(this, arguments); + } + }; + } + + function map(iterator) { + if (this == null) throw new TypeError(); + iterator = iterator || Prototype.K; + + var object = Object(this); + var results = [], + context = arguments[1], + n = 0; + + for (var i = 0, length = object.length >>> 0; i < length; i++) { + if (i in object) { + results[n] = iterator.call(context, object[i], i, object); + } + n++; + } + results.length = n; + return results; + } + + if (arrayProto.map) { + map = wrapNative(Array.prototype.map); + } + + function filter(iterator) { + if (this == null || !Object.isFunction(iterator)) throw new TypeError(); + + var object = Object(this); + var results = [], + context = arguments[1], + value; + + for (var i = 0, length = object.length >>> 0; i < length; i++) { + if (i in object) { + value = object[i]; + if (iterator.call(context, value, i, object)) { + results.push(value); + } + } + } + return results; + } + + if (arrayProto.filter) { + filter = Array.prototype.filter; + } + + function some(iterator) { + if (this == null) throw new TypeError(); + iterator = iterator || Prototype.K; + var context = arguments[1]; + + var object = Object(this); + for (var i = 0, length = object.length >>> 0; i < length; i++) { + if (i in object && iterator.call(context, object[i], i, object)) { + return true; + } + } + + return false; + } + + if (arrayProto.some) { + some = wrapNative(Array.prototype.some); + } + + function every(iterator) { + if (this == null) throw new TypeError(); + iterator = iterator || Prototype.K; + var context = arguments[1]; + + var object = Object(this); + for (var i = 0, length = object.length >>> 0; i < length; i++) { + if (i in object && !iterator.call(context, object[i], i, object)) { + return false; + } + } + + return true; + } + + if (arrayProto.every) { + every = wrapNative(Array.prototype.every); + } + + Object.extend(arrayProto, Enumerable); + + if (arrayProto.entries === Enumerable.entries) { + delete arrayProto.entries; + } + + if (!arrayProto._reverse) arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + + map: map, + collect: map, + select: filter, + filter: filter, + findAll: filter, + some: some, + any: some, + every: every, + all: every, + + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect + }); + + var CONCAT_ARGUMENTS_BUGGY = (function () { + return [].concat(arguments)[0][0] !== 1; + })(1, 2); + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); +function $H(object) { + return new Hash(object); +} + +var Hash = Class.create( + Enumerable, + (function () { + function initialize(object) { + this._object = Object.isHash(object) + ? object.toObject() + : Object.clone(object); + } + + function _each(iterator, context) { + var i = 0; + for (var key in this._object) { + var value = this._object[key], + pair = [key, value]; + pair.key = key; + pair.value = value; + iterator.call(context, pair, i); + i++; + } + } + + function set(key, value) { + return (this._object[key] = value); + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function (pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function (result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + + value = String.interpret(value); + + value = value.gsub(/(\r)?\n/, '\r\n'); + value = encodeURIComponent(value); + value = value.gsub(/%20/, '+'); + return key + '=' + value; + } + + function toQueryString() { + return this.inject([], function (results, pair) { + var key = encodeURIComponent(pair.key), + values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) { + var queryValues = []; + for (var i = 0, len = values.length, value; i < len; i++) { + value = values[i]; + queryValues.push(toQueryPair(key, value)); + } + return results.concat(queryValues); + } + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); + } + + function inspect() { + return ( + '#' + ); + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toObject, + clone: clone + }; + })() +); + +Hash.from = $H; +Object.extend( + Number.prototype, + (function () { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; + })() +); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create( + Enumerable, + (function () { + function initialize(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + } + + function _each(iterator, context) { + var value = this.start, + i; + for (i = 0; this.include(value); i++) { + iterator.call(context, value, i); + value = value.succ(); + } + } + + function include(value) { + if (value < this.start) return false; + if (this.exclusive) return value < this.end; + return value <= this.end; + } + + return { + initialize: initialize, + _each: _each, + include: include + }; + })() +); + +var Abstract = {}; + +var Try = { + these: function () { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +}; + +var Ajax = { + getTransport: function () { + return ( + Try.these( + function () { + return new XMLHttpRequest(); + }, + function () { + return new ActiveXObject('Msxml2.XMLHTTP'); + }, + function () { + return new ActiveXObject('Microsoft.XMLHTTP'); + } + ) || false + ); + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function (iterator, context) { + this.responders._each(iterator, context); + }, + + register: function (responder) { + if (!this.include(responder)) this.responders.push(responder); + }, + + unregister: function (responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function (callback, request, transport, json) { + this.each(function (responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function () { + Ajax.activeRequestCount++; + }, + onComplete: function () { + Ajax.activeRequestCount--; + } +}); +Ajax.Base = Class.create({ + initialize: function (options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || {}); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function ($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function (url) { + this.url = url; + this.method = this.options.method; + var params = Object.isString(this.options.parameters) + ? this.options.parameters + : Object.toQueryString(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + params += (params ? '&' : '') + '_method=' + this.method; + this.method = 'post'; + } + + if (params && this.method === 'get') { + this.url += (this.url.include('?') ? '&' : '?') + params; + } + + this.parameters = params.toQueryParams(); + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open( + this.method.toUpperCase(), + this.url, + this.options.asynchronous + ); + + if (this.options.asynchronous) + this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = + this.method == 'post' ? this.options.postBody || params : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + } catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function () { + var readyState = this.transport.readyState; + if (readyState > 1 && !(readyState == 4 && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function () { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + Accept: 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = + this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if ( + this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0, 2005])[1] < 2005 + ) + headers['Connection'] = 'close'; + } + + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i + 1]; + else + $H(extras).each(function (pair) { + headers[pair.key] = pair.value; + }); + } + + for (var name in headers) + if (headers[name] != null) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function () { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300) || status == 304; + }, + + getStatus: function () { + try { + if (this.transport.status === 1223) return 204; + return this.transport.status || 0; + } catch (e) { + return 0; + } + }, + + respondToReadyState: function (readyState) { + var state = Ajax.Request.Events[readyState], + response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + ( + this.options['on' + response.status] || + this.options['on' + (this.success() ? 'Success' : 'Failure')] || + Prototype.emptyFunction + )(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if ( + this.options.evalJS == 'force' || + (this.options.evalJS && + this.isSameOrigin() && + contentType && + contentType.match( + /^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i + )) + ) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)( + response, + response.headerJSON + ); + Ajax.Responders.dispatch( + 'on' + state, + this, + response, + response.headerJSON + ); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function () { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return ( + !m || + m[0] == + '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + }) + ); + }, + + getHeader: function (name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { + return null; + } + }, + + evalResponse: function () { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function (exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = [ + 'Uninitialized', + 'Loading', + 'Loaded', + 'Interactive', + 'Complete' +]; + +Ajax.Response = Class.create({ + initialize: function (request) { + this.request = request; + var transport = (this.transport = request.transport), + readyState = (this.readyState = transport.readyState); + + if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if (readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function () { + try { + return this.transport.statusText || ''; + } catch (e) { + return ''; + } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function () { + try { + return this.getAllResponseHeaders(); + } catch (e) { + return null; + } + }, + + getResponseHeader: function (name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function () { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function () { + var json = this.getHeader('X-JSON'); + if (!json) return null; + + try { + json = decodeURIComponent(escape(json)); + } catch (e) {} + + try { + return json.evalJSON( + this.request.options.sanitizeJSON || !this.request.isSameOrigin() + ); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function () { + var options = this.request.options; + if ( + !options.evalJSON || + (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank() + ) + return null; + try { + return this.responseText.evalJSON( + options.sanitizeJSON || !this.request.isSameOrigin() + ); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function ($super, container, url, options) { + this.container = { + success: container.success || container, + failure: container.failure || (container.success ? null : container) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = function (response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }.bind(this); + + $super(url, options); + }, + + updateContent: function (responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if ((receiver = $(receiver))) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = {}; + insertion[options.insertion] = responseText; + receiver.insert(insertion); + } else options.insertion(receiver, responseText); + } else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function ($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = this.options.frequency || 2; + this.decay = this.options.decay || 1; + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function () { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function () { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function (response) { + if (this.options.decay) { + this.decay = + response.responseText == this.lastText + ? this.decay * this.options.decay + : 1; + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent + .bind(this) + .delay(this.decay * this.frequency); + }, + + onTimerEvent: function () { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); + +(function (GLOBAL) { + var UNDEFINED; + var SLICE = Array.prototype.slice; + + var DIV = document.createElement('div'); + + function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + + if (Object.isString(element)) element = document.getElementById(element); + return Element.extend(element); + } + + GLOBAL.$ = $; + + if (!GLOBAL.Node) GLOBAL.Node = {}; + + if (!GLOBAL.Node.ELEMENT_NODE) { + Object.extend(GLOBAL.Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); + } + + var ELEMENT_CACHE = {}; + + function shouldUseCreationCache(tagName, attributes) { + if (tagName === 'select') return false; + if ('type' in attributes) return false; + return true; + } + + var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function () { + try { + var el = document.createElement(''); + return el.tagName.toLowerCase() === 'input' && el.name === 'x'; + } catch (err) { + return false; + } + })(); + + var oldElement = GLOBAL.Element; + function Element(tagName, attributes) { + attributes = attributes || {}; + tagName = tagName.toLowerCase(); + + if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute( + document.createElement(tagName), + attributes + ); + } + + if (!ELEMENT_CACHE[tagName]) + ELEMENT_CACHE[tagName] = Element.extend(document.createElement(tagName)); + + var node = shouldUseCreationCache(tagName, attributes) + ? ELEMENT_CACHE[tagName].cloneNode(false) + : document.createElement(tagName); + + return Element.writeAttribute(node, attributes); + } + + GLOBAL.Element = Element; + + Object.extend(GLOBAL.Element, oldElement || {}); + if (oldElement) GLOBAL.Element.prototype = oldElement.prototype; + + Element.Methods = { ByTag: {}, Simulated: {} }; + + var methods = {}; + + var INSPECT_ATTRIBUTES = { id: 'id', className: 'class' }; + function inspect(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + + var attribute, value; + for (var property in INSPECT_ATTRIBUTES) { + attribute = INSPECT_ATTRIBUTES[property]; + value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + } + + return result + '>'; + } + + methods.inspect = inspect; + + function visible(element) { + return $(element).getStyle('display') !== 'none'; + } + + function toggle(element, bool) { + element = $(element); + if (typeof bool !== 'boolean') bool = !Element.visible(element); + Element[bool ? 'show' : 'hide'](element); + + return element; + } + + function hide(element) { + element = $(element); + element.style.display = 'none'; + return element; + } + + function show(element) { + element = $(element); + element.style.display = ''; + return element; + } + + Object.extend(methods, { + visible: visible, + toggle: toggle, + hide: hide, + show: show + }); + + function remove(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + } + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function () { + var el = document.createElement('select'), + isBuggy = true; + el.innerHTML = ''; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== 'OPTION'; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function () { + try { + var el = document.createElement('table'); + if (el && el.tBodies) { + el.innerHTML = 'test'; + var isBuggy = typeof el.tBodies[0] == 'undefined'; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var LINK_ELEMENT_INNERHTML_BUGGY = (function () { + try { + var el = document.createElement('div'); + el.innerHTML = ''; + var isBuggy = el.childNodes.length === 0; + el = null; + return isBuggy; + } catch (e) { + return true; + } + })(); + + var ANY_INNERHTML_BUGGY = + SELECT_ELEMENT_INNERHTML_BUGGY || + TABLE_ELEMENT_INNERHTML_BUGGY || + LINK_ELEMENT_INNERHTML_BUGGY; + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement('script'), + isBuggy = false; + try { + s.appendChild(document.createTextNode('')); + isBuggy = !s.firstChild || (s.firstChild && s.firstChild.nodeType !== 3); + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + function update(element, content) { + element = $(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + while (i--) purgeElement(descendants[i]); + + if (content && content.toElement) content = content.toElement(); + + if (Object.isElement(content)) return element.update().insert(content); + + content = Object.toHTML(content); + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (ANY_INNERHTML_BUGGY) { + if (tagName in INSERTION_TRANSLATIONS.tags) { + while (element.firstChild) element.removeChild(element.firstChild); + + var nodes = getContentFromAnonymousElement( + tagName, + content.stripScripts() + ); + for (var i = 0, node; (node = nodes[i]); i++) element.appendChild(node); + } else if ( + LINK_ELEMENT_INNERHTML_BUGGY && + Object.isString(content) && + content.indexOf(' -1 + ) { + while (element.firstChild) element.removeChild(element.firstChild); + + var nodes = getContentFromAnonymousElement( + tagName, + content.stripScripts(), + true + ); + + for (var i = 0, node; (node = nodes[i]); i++) element.appendChild(node); + } else { + element.innerHTML = content.stripScripts(); + } + } else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + function replace(element, content) { + element = $(element); + + if (content && content.toElement) { + content = content.toElement(); + } else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + + element.parentNode.replaceChild(content, element); + return element; + } + + var INSERTION_TRANSLATIONS = { + before: function (element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function (element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function (element, node) { + element.appendChild(node); + }, + after: function (element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + + tags: { + TABLE: ['', '
', 1], + TBODY: ['', '
', 2], + TR: ['', '
', 3], + TD: ['
', '
', 4], + SELECT: ['', 1] + } + }; + + var tags = INSERTION_TRANSLATIONS.tags; + + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD + }); + + function replace_IE(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, + tagName = parent.tagName.toUpperCase(); + + if (tagName in INSERTION_TRANSLATIONS.tags) { + var nextSibling = Element.next(element); + var fragments = getContentFromAnonymousElement( + tagName, + content.stripScripts() + ); + + parent.removeChild(element); + + var iterator; + if (nextSibling) + iterator = function (node) { + parent.insertBefore(node, nextSibling); + }; + else + iterator = function (node) { + parent.appendChild(node); + }; + + fragments.each(iterator); + } else { + element.outerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + if ('outerHTML' in document.documentElement) replace = replace_IE; + + function isContent(content) { + if (Object.isUndefined(content) || content === null) return false; + + if (Object.isString(content) || Object.isNumber(content)) return true; + if (Object.isElement(content)) return true; + if (content.toElement || content.toHTML) return true; + + return false; + } + + function insertContentAt(element, content, position) { + position = position.toLowerCase(); + var method = INSERTION_TRANSLATIONS[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + method(element, content); + return element; + } + + content = Object.toHTML(content); + var tagName = ( + position === 'before' || position === 'after' + ? element.parentNode + : element + ).tagName.toUpperCase(); + + var childNodes = getContentFromAnonymousElement( + tagName, + content.stripScripts() + ); + + if (position === 'top' || position === 'after') childNodes.reverse(); + + for (var i = 0, node; (node = childNodes[i]); i++) method(element, node); + + content.evalScripts.bind(content).defer(); + } + + function insert(element, insertions) { + element = $(element); + + if (isContent(insertions)) insertions = { bottom: insertions }; + + for (var position in insertions) + insertContentAt(element, insertions[position], position); + + return element; + } + + function wrap(element, wrapper, attributes) { + element = $(element); + + if (Object.isElement(wrapper)) { + $(wrapper).writeAttribute(attributes || {}); + } else if (Object.isString(wrapper)) { + wrapper = new Element(wrapper, attributes); + } else { + wrapper = new Element('div', wrapper); + } + + if (element.parentNode) element.parentNode.replaceChild(wrapper, element); + + wrapper.appendChild(element); + + return wrapper; + } + + function cleanWhitespace(element) { + element = $(element); + var node = element.firstChild; + + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType === Node.TEXT_NODE && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + } + + function empty(element) { + return $(element).innerHTML.blank(); + } + + function getContentFromAnonymousElement(tagName, html, force) { + var t = INSERTION_TRANSLATIONS.tags[tagName], + div = DIV; + + var workaround = !!t; + if (!workaround && force) { + workaround = true; + t = ['', '', 0]; + } + + if (workaround) { + div.innerHTML = ' ' + t[0] + html + t[1]; + div.removeChild(div.firstChild); + for (var i = t[2]; i--; ) div = div.firstChild; + } else { + div.innerHTML = html; + } + + return $A(div.childNodes); + } + + function clone(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + if (!HAS_UNIQUE_ID_PROPERTY) { + clone._prototypeUID = UNDEFINED; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) descendants[i]._prototypeUID = UNDEFINED; + } + } + return Element.extend(clone); + } + + function purgeElement(element) { + var uid = getUniqueElementID(element); + if (uid) { + Element.stopObserving(element); + if (!HAS_UNIQUE_ID_PROPERTY) element._prototypeUID = UNDEFINED; + delete Element.Storage[uid]; + } + } + + function purgeCollection(elements) { + var i = elements.length; + while (i--) purgeElement(elements[i]); + } + + function purgeCollection_IE(elements) { + var i = elements.length, + element, + uid; + while (i--) { + element = elements[i]; + uid = getUniqueElementID(element); + delete Element.Storage[uid]; + delete Event.cache[uid]; + } + } + + if (HAS_UNIQUE_ID_PROPERTY) { + purgeCollection = purgeCollection_IE; + } + + function purge(element) { + if (!(element = $(element))) return; + purgeElement(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + + while (i--) purgeElement(descendants[i]); + + return null; + } + + Object.extend(methods, { + remove: remove, + update: update, + replace: replace, + insert: insert, + wrap: wrap, + cleanWhitespace: cleanWhitespace, + empty: empty, + clone: clone, + purge: purge + }); + + function recursivelyCollect(element, property, maximumLength) { + element = $(element); + maximumLength = maximumLength || -1; + var elements = []; + + while ((element = element[property])) { + if (element.nodeType === Node.ELEMENT_NODE) + elements.push(Element.extend(element)); + + if (elements.length === maximumLength) break; + } + + return elements; + } + + function ancestors(element) { + return recursivelyCollect(element, 'parentNode'); + } + + function descendants(element) { + return Element.select(element, '*'); + } + + function firstDescendant(element) { + element = $(element).firstChild; + while (element && element.nodeType !== Node.ELEMENT_NODE) + element = element.nextSibling; + + return $(element); + } + + function immediateDescendants(element) { + var results = [], + child = $(element).firstChild; + + while (child) { + if (child.nodeType === Node.ELEMENT_NODE) + results.push(Element.extend(child)); + + child = child.nextSibling; + } + + return results; + } + + function previousSiblings(element) { + return recursivelyCollect(element, 'previousSibling'); + } + + function nextSiblings(element) { + return recursivelyCollect(element, 'nextSibling'); + } + + function siblings(element) { + element = $(element); + var previous = previousSiblings(element), + next = nextSiblings(element); + return previous.reverse().concat(next); + } + + function match(element, selector) { + element = $(element); + + if (Object.isString(selector)) + return Prototype.Selector.match(element, selector); + + return selector.match(element); + } + + function _recursivelyFind(element, property, expression, index) { + (element = $(element)), + (expression = expression || 0), + (index = index || 0); + if (Object.isNumber(expression)) { + (index = expression), (expression = null); + } + + while ((element = element[property])) { + if (element.nodeType !== 1) continue; + if (expression && !Prototype.Selector.match(element, expression)) + continue; + if (--index >= 0) continue; + + return Element.extend(element); + } + } + + function up(element, expression, index) { + element = $(element); + + if (arguments.length === 1) return $(element.parentNode); + return _recursivelyFind(element, 'parentNode', expression, index); + } + + function down(element, expression, index) { + if (arguments.length === 1) return firstDescendant(element); + (element = $(element)), + (expression = expression || 0), + (index = index || 0); + + if (Object.isNumber(expression)) (index = expression), (expression = '*'); + + var node = Prototype.Selector.select(expression, element)[index]; + return Element.extend(node); + } + + function previous(element, expression, index) { + return _recursivelyFind(element, 'previousSibling', expression, index); + } + + function next(element, expression, index) { + return _recursivelyFind(element, 'nextSibling', expression, index); + } + + function select(element) { + element = $(element); + var expressions = SLICE.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element); + } + + function adjacent(element) { + element = $(element); + var expressions = SLICE.call(arguments, 1).join(', '); + var siblings = Element.siblings(element), + results = []; + for (var i = 0, sibling; (sibling = siblings[i]); i++) { + if (Prototype.Selector.match(sibling, expressions)) results.push(sibling); + } + + return results; + } + + function descendantOf_DOM(element, ancestor) { + (element = $(element)), (ancestor = $(ancestor)); + if (!element || !ancestor) return false; + while ((element = element.parentNode)) + if (element === ancestor) return true; + return false; + } + + function descendantOf_contains(element, ancestor) { + (element = $(element)), (ancestor = $(ancestor)); + if (!element || !ancestor) return false; + if (!ancestor.contains) return descendantOf_DOM(element, ancestor); + return ancestor.contains(element) && ancestor !== element; + } + + function descendantOf_compareDocumentPosition(element, ancestor) { + (element = $(element)), (ancestor = $(ancestor)); + if (!element || !ancestor) return false; + return (element.compareDocumentPosition(ancestor) & 8) === 8; + } + + var descendantOf; + if (DIV.compareDocumentPosition) { + descendantOf = descendantOf_compareDocumentPosition; + } else if (DIV.contains) { + descendantOf = descendantOf_contains; + } else { + descendantOf = descendantOf_DOM; + } + + Object.extend(methods, { + recursivelyCollect: recursivelyCollect, + ancestors: ancestors, + descendants: descendants, + firstDescendant: firstDescendant, + immediateDescendants: immediateDescendants, + previousSiblings: previousSiblings, + nextSiblings: nextSiblings, + siblings: siblings, + match: match, + up: up, + down: down, + previous: previous, + next: next, + select: select, + adjacent: adjacent, + descendantOf: descendantOf, + + getElementsBySelector: select, + + childElements: immediateDescendants + }); + + var idCounter = 1; + function identify(element) { + element = $(element); + var id = Element.readAttribute(element, 'id'); + if (id) return id; + + do { + id = 'anonymous_element_' + idCounter++; + } while ($(id)); + + Element.writeAttribute(element, 'id', id); + return id; + } + + function readAttribute(element, name) { + return $(element).getAttribute(name); + } + + function readAttribute_IE(element, name) { + element = $(element); + + var table = ATTRIBUTE_TRANSLATIONS.read; + if (table.values[name]) return table.values[name](element, name); + + if (table.names[name]) name = table.names[name]; + + if (name.include(':')) { + if (!element.attributes || !element.attributes[name]) return null; + return element.attributes[name].value; + } + + return element.getAttribute(name); + } + + function readAttribute_Opera(element, name) { + if (name === 'title') return element.title; + return element.getAttribute(name); + } + + var PROBLEMATIC_ATTRIBUTE_READING = (function () { + DIV.setAttribute('onclick', []); + var value = DIV.getAttribute('onclick'); + var isFunction = Object.isArray(value); + DIV.removeAttribute('onclick'); + return isFunction; + })(); + + if (PROBLEMATIC_ATTRIBUTE_READING) { + readAttribute = readAttribute_IE; + } else if (Prototype.Browser.Opera) { + readAttribute = readAttribute_Opera; + } + + function writeAttribute(element, name, value) { + element = $(element); + var attributes = {}, + table = ATTRIBUTE_TRANSLATIONS.write; + + if (typeof name === 'object') { + attributes = name; + } else { + attributes[name] = Object.isUndefined(value) ? true : value; + } + + for (var attr in attributes) { + name = table.names[attr] || attr; + value = attributes[attr]; + if (table.values[attr]) { + value = table.values[attr](element, value); + if (Object.isUndefined(value)) continue; + } + if (value === false || value === null) element.removeAttribute(name); + else if (value === true) element.setAttribute(name, name); + else element.setAttribute(name, value); + } + + return element; + } + + var PROBLEMATIC_HAS_ATTRIBUTE_WITH_CHECKBOXES = (function () { + if (!HAS_EXTENDED_CREATE_ELEMENT_SYNTAX) { + return false; + } + var checkbox = document.createElement(''); + checkbox.checked = true; + var node = checkbox.getAttributeNode('checked'); + return !node || !node.specified; + })(); + + function hasAttribute(element, attribute) { + attribute = ATTRIBUTE_TRANSLATIONS.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return !!(node && node.specified); + } + + function hasAttribute_IE(element, attribute) { + if (attribute === 'checked') { + return element.checked; + } + return hasAttribute(element, attribute); + } + + GLOBAL.Element.Methods.Simulated.hasAttribute = + PROBLEMATIC_HAS_ATTRIBUTE_WITH_CHECKBOXES ? hasAttribute_IE : hasAttribute; + + function classNames(element) { + return new Element.ClassNames(element); + } + + var regExpCache = {}; + function getRegExpForClassName(className) { + if (regExpCache[className]) return regExpCache[className]; + + var re = new RegExp('(^|\\s+)' + className + '(\\s+|$)'); + regExpCache[className] = re; + return re; + } + + function hasClassName(element, className) { + if (!(element = $(element))) return; + + var elementClassName = element.className; + + if (elementClassName.length === 0) return false; + if (elementClassName === className) return true; + + return getRegExpForClassName(className).test(elementClassName); + } + + function addClassName(element, className) { + if (!(element = $(element))) return; + + if (!hasClassName(element, className)) + element.className += (element.className ? ' ' : '') + className; + + return element; + } + + function removeClassName(element, className) { + if (!(element = $(element))) return; + + element.className = element.className + .replace(getRegExpForClassName(className), ' ') + .strip(); + + return element; + } + + function toggleClassName(element, className, bool) { + if (!(element = $(element))) return; + + if (Object.isUndefined(bool)) bool = !hasClassName(element, className); + + var method = Element[bool ? 'addClassName' : 'removeClassName']; + return method(element, className); + } + + var ATTRIBUTE_TRANSLATIONS = {}; + + var classProp = 'className', + forProp = 'for'; + + DIV.setAttribute(classProp, 'x'); + if (DIV.className !== 'x') { + DIV.setAttribute('class', 'x'); + if (DIV.className === 'x') classProp = 'class'; + } + + var LABEL = document.createElement('label'); + LABEL.setAttribute(forProp, 'x'); + if (LABEL.htmlFor !== 'x') { + LABEL.setAttribute('htmlFor', 'x'); + if (LABEL.htmlFor === 'x') forProp = 'htmlFor'; + } + LABEL = null; + + function _getAttr(element, attribute) { + return element.getAttribute(attribute); + } + + function _getAttr2(element, attribute) { + return element.getAttribute(attribute, 2); + } + + function _getAttrNode(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ''; + } + + function _getFlag(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + } + + DIV.onclick = Prototype.emptyFunction; + var onclickValue = DIV.getAttribute('onclick'); + + var _getEv; + + if (String(onclickValue).indexOf('{') > -1) { + _getEv = function (element, attribute) { + var value = element.getAttribute(attribute); + if (!value) return null; + value = value.toString(); + value = value.split('{')[1]; + value = value.split('}')[0]; + return value.strip(); + }; + } else if (onclickValue === '') { + _getEv = function (element, attribute) { + var value = element.getAttribute(attribute); + if (!value) return null; + return value.strip(); + }; + } + + ATTRIBUTE_TRANSLATIONS.read = { + names: { + class: classProp, + className: classProp, + for: forProp, + htmlFor: forProp + }, + + values: { + style: function (element) { + return element.style.cssText.toLowerCase(); + }, + title: function (element) { + return element.title; + } + } + }; + + ATTRIBUTE_TRANSLATIONS.write = { + names: { + className: 'class', + htmlFor: 'for', + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, + + values: { + checked: function (element, value) { + value = !!value; + element.checked = value; + return value ? 'checked' : null; + }, + + style: function (element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + ATTRIBUTE_TRANSLATIONS.has = { names: {} }; + + Object.extend( + ATTRIBUTE_TRANSLATIONS.write.names, + ATTRIBUTE_TRANSLATIONS.read.names + ); + + var CAMEL_CASED_ATTRIBUTE_NAMES = $w( + 'colSpan rowSpan vAlign dateTime ' + + 'accessKey tabIndex encType maxLength readOnly longDesc frameBorder' + ); + + for (var i = 0, attr; (attr = CAMEL_CASED_ATTRIBUTE_NAMES[i]); i++) { + ATTRIBUTE_TRANSLATIONS.write.names[attr.toLowerCase()] = attr; + ATTRIBUTE_TRANSLATIONS.has.names[attr.toLowerCase()] = attr; + } + + Object.extend(ATTRIBUTE_TRANSLATIONS.read.values, { + href: _getAttr2, + src: _getAttr2, + type: _getAttr, + action: _getAttrNode, + disabled: _getFlag, + checked: _getFlag, + readonly: _getFlag, + multiple: _getFlag, + onload: _getEv, + onunload: _getEv, + onclick: _getEv, + ondblclick: _getEv, + onmousedown: _getEv, + onmouseup: _getEv, + onmouseover: _getEv, + onmousemove: _getEv, + onmouseout: _getEv, + onfocus: _getEv, + onblur: _getEv, + onkeypress: _getEv, + onkeydown: _getEv, + onkeyup: _getEv, + onsubmit: _getEv, + onreset: _getEv, + onselect: _getEv, + onchange: _getEv + }); + + Object.extend(methods, { + identify: identify, + readAttribute: readAttribute, + writeAttribute: writeAttribute, + classNames: classNames, + hasClassName: hasClassName, + addClassName: addClassName, + removeClassName: removeClassName, + toggleClassName: toggleClassName + }); + + function normalizeStyleName(style) { + if (style === 'float' || style === 'styleFloat') return 'cssFloat'; + return style.camelize(); + } + + function normalizeStyleName_IE(style) { + if (style === 'float' || style === 'cssFloat') return 'styleFloat'; + return style.camelize(); + } + + function setStyle(element, styles) { + element = $(element); + var elementStyle = element.style, + match; + + if (Object.isString(styles)) { + elementStyle.cssText += ';' + styles; + if (styles.include('opacity')) { + var opacity = styles.match(/opacity:\s*(\d?\.?\d*)/)[1]; + Element.setOpacity(element, opacity); + } + return element; + } + + for (var property in styles) { + if (property === 'opacity') { + Element.setOpacity(element, styles[property]); + } else { + var value = styles[property]; + if (property === 'float' || property === 'cssFloat') { + property = Object.isUndefined(elementStyle.styleFloat) + ? 'cssFloat' + : 'styleFloat'; + } + elementStyle[property] = value; + } + } + + return element; + } + + function getStyle(element, style) { + element = $(element); + style = normalizeStyleName(style); + + var value = element.style[style]; + if (!value || value === 'auto') { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + + if (style === 'opacity') return value ? parseFloat(value) : 1.0; + return value === 'auto' ? null : value; + } + + function getStyle_Opera(element, style) { + switch (style) { + case 'height': + case 'width': + if (!Element.visible(element)) return null; + + var dim = parseInt(getStyle(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) return dim + 'px'; + + return Element.measure(element, style); + + default: + return getStyle(element, style); + } + } + + function getStyle_IE(element, style) { + element = $(element); + style = normalizeStyleName_IE(style); + + var value = element.style[style]; + if (!value && element.currentStyle) { + value = element.currentStyle[style]; + } + + if (style === 'opacity') { + if (!STANDARD_CSS_OPACITY_SUPPORTED) return getOpacity_IE(element); + else return value ? parseFloat(value) : 1.0; + } + + if (value === 'auto') { + if ((style === 'width' || style === 'height') && Element.visible(element)) + return Element.measure(element, style) + 'px'; + return null; + } + + return value; + } + + function stripAlphaFromFilter_IE(filter) { + return (filter || '').replace(/alpha\([^\)]*\)/gi, ''); + } + + function hasLayout_IE(element) { + if (!element.currentStyle || !element.currentStyle.hasLayout) + element.style.zoom = 1; + return element; + } + + var STANDARD_CSS_OPACITY_SUPPORTED = (function () { + DIV.style.cssText = 'opacity:.55'; + return /^0.55/.test(DIV.style.opacity); + })(); + + function setOpacity(element, value) { + element = $(element); + if (value == 1 || value === '') value = ''; + else if (value < 0.00001) value = 0; + element.style.opacity = value; + return element; + } + + function setOpacity_IE(element, value) { + if (STANDARD_CSS_OPACITY_SUPPORTED) return setOpacity(element, value); + + element = hasLayout_IE($(element)); + var filter = Element.getStyle(element, 'filter'), + style = element.style; + + if (value == 1 || value === '') { + filter = stripAlphaFromFilter_IE(filter); + if (filter) style.filter = filter; + else style.removeAttribute('filter'); + return element; + } + + if (value < 0.00001) value = 0; + + style.filter = + stripAlphaFromFilter_IE(filter) + ' alpha(opacity=' + value * 100 + ')'; + + return element; + } + + function getOpacity(element) { + return Element.getStyle(element, 'opacity'); + } + + function getOpacity_IE(element) { + if (STANDARD_CSS_OPACITY_SUPPORTED) return getOpacity(element); + + var filter = Element.getStyle(element, 'filter'); + if (filter.length === 0) return 1.0; + var match = (filter || '').match(/alpha\(opacity=(.*)\)/i); + if (match && match[1]) return parseFloat(match[1]) / 100; + return 1.0; + } + + Object.extend(methods, { + setStyle: setStyle, + getStyle: getStyle, + setOpacity: setOpacity, + getOpacity: getOpacity + }); + + if ('styleFloat' in DIV.style) { + methods.getStyle = getStyle_IE; + methods.setOpacity = setOpacity_IE; + methods.getOpacity = getOpacity_IE; + } + + var UID = 0; + + GLOBAL.Element.Storage = { UID: 1 }; + + function getUniqueElementID(element) { + if (element === window) return 0; + + if (typeof element._prototypeUID === 'undefined') + element._prototypeUID = Element.Storage.UID++; + return element._prototypeUID; + } + + function getUniqueElementID_IE(element) { + if (element === window) return 0; + if (element == document) return 1; + return element.uniqueID; + } + + var HAS_UNIQUE_ID_PROPERTY = 'uniqueID' in DIV; + if (HAS_UNIQUE_ID_PROPERTY) getUniqueElementID = getUniqueElementID_IE; + + function getStorage(element) { + if (!(element = $(element))) return; + + var uid = getUniqueElementID(element); + + if (!Element.Storage[uid]) Element.Storage[uid] = $H(); + + return Element.Storage[uid]; + } + + function store(element, key, value) { + if (!(element = $(element))) return; + var storage = getStorage(element); + if (arguments.length === 2) { + storage.update(key); + } else { + storage.set(key, value); + } + return element; + } + + function retrieve(element, key, defaultValue) { + if (!(element = $(element))) return; + var storage = getStorage(element), + value = storage.get(key); + + if (Object.isUndefined(value)) { + storage.set(key, defaultValue); + value = defaultValue; + } + + return value; + } + + Object.extend(methods, { + getStorage: getStorage, + store: store, + retrieve: retrieve + }); + + var Methods = {}, + ByTag = Element.Methods.ByTag, + F = Prototype.BrowserFeatures; + + if (!F.ElementExtensions && '__proto__' in DIV) { + GLOBAL.HTMLElement = {}; + GLOBAL.HTMLElement.prototype = DIV['__proto__']; + F.ElementExtensions = true; + } + + function checkElementPrototypeDeficiency(tagName) { + if (typeof window.Element === 'undefined') return false; + if (!HAS_EXTENDED_CREATE_ELEMENT_SYNTAX) return false; + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random() + '').slice(2), + el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = el[id] !== 'x'; + delete proto[id]; + el = null; + return isBuggy; + } + + return false; + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = + checkElementPrototypeDeficiency('object'); + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var EXTENDED = {}; + function elementIsExtended(element) { + var uid = getUniqueElementID(element); + return uid in EXTENDED; + } + + function extend(element) { + if (!element || elementIsExtended(element)) return element; + if (element.nodeType !== Node.ELEMENT_NODE || element == window) + return element; + + var methods = Object.clone(Methods), + tagName = element.tagName.toUpperCase(); + + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + extendElementWith(element, methods); + EXTENDED[getUniqueElementID(element)] = true; + return element; + } + + function extend_IE8(element) { + if (!element || elementIsExtended(element)) return element; + + var t = element.tagName; + if (t && /^(?:object|applet|embed)$/i.test(t)) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + + return element; + } + + if (F.SpecificElementExtensions) { + extend = HTMLOBJECTELEMENT_PROTOTYPE_BUGGY ? extend_IE8 : Prototype.K; + } + + function addMethodsToTagName(tagName, methods) { + tagName = tagName.toUpperCase(); + if (!ByTag[tagName]) ByTag[tagName] = {}; + Object.extend(ByTag[tagName], methods); + } + + function mergeMethods(destination, methods, onlyIfAbsent) { + if (Object.isUndefined(onlyIfAbsent)) onlyIfAbsent = false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + OPTGROUP: 'OptGroup', + TEXTAREA: 'TextArea', + P: 'Paragraph', + FIELDSET: 'FieldSet', + UL: 'UList', + OL: 'OList', + DL: 'DList', + DIR: 'Directory', + H1: 'Heading', + H2: 'Heading', + H3: 'Heading', + H4: 'Heading', + H5: 'Heading', + H6: 'Heading', + Q: 'Quote', + INS: 'Mod', + DEL: 'Mod', + A: 'Anchor', + IMG: 'Image', + CAPTION: 'TableCaption', + COL: 'TableCol', + COLGROUP: 'TableCol', + THEAD: 'TableSection', + TFOOT: 'TableSection', + TBODY: 'TableSection', + TR: 'TableRow', + TH: 'TableCell', + TD: 'TableCell', + FRAMESET: 'FrameSet', + IFRAME: 'IFrame' + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + var element = document.createElement(tagName), + proto = element['__proto__'] || element.constructor.prototype; + + element = null; + return proto; + } + + function addMethods(methods) { + if (arguments.length === 0) addFormMethods(); + + if (arguments.length === 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) { + Object.extend(Element.Methods, methods || {}); + } else { + if (Object.isArray(tagName)) { + for (var i = 0, tag; (tag = tagName[i]); i++) + addMethodsToTagName(tag, methods); + } else { + addMethodsToTagName(tagName, methods); + } + } + + var ELEMENT_PROTOTYPE = window.HTMLElement + ? HTMLElement.prototype + : Element.prototype; + + if (F.ElementExtensions) { + mergeMethods(ELEMENT_PROTOTYPE, Element.Methods); + mergeMethods(ELEMENT_PROTOTYPE, Element.Methods.Simulated, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + mergeMethods(klass.prototype, ByTag[tag]); + } + } + + Object.extend(Element, Element.Methods); + Object.extend(Element, Element.Methods.Simulated); + delete Element.ByTag; + delete Element.Simulated; + + Element.extend.refresh(); + + ELEMENT_CACHE = {}; + } + + Object.extend(GLOBAL.Element, { + extend: extend, + addMethods: addMethods + }); + + if (extend === Prototype.K) { + GLOBAL.Element.extend.refresh = Prototype.emptyFunction; + } else { + GLOBAL.Element.extend.refresh = function () { + if (Prototype.BrowserFeatures.ElementExtensions) return; + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + + EXTENDED = {}; + }; + } + + function addFormMethods() { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + FORM: Object.clone(Form.Methods), + INPUT: Object.clone(Form.Element.Methods), + SELECT: Object.clone(Form.Element.Methods), + TEXTAREA: Object.clone(Form.Element.Methods), + BUTTON: Object.clone(Form.Element.Methods) + }); + } + + Element.addMethods(methods); + + function destroyCache_IE() { + DIV = null; + ELEMENT_CACHE = null; + } + + if (window.attachEvent) window.attachEvent('onunload', destroyCache_IE); +})(this); +(function () { + function toDecimal(pctString) { + var match = pctString.match(/^(\d+)%?$/i); + if (!match) return null; + return Number(match[1]) / 100; + } + + function getRawStyle(element, style) { + element = $(element); + + var value = element.style[style]; + if (!value || value === 'auto') { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + + if (style === 'opacity') return value ? parseFloat(value) : 1.0; + return value === 'auto' ? null : value; + } + + function getRawStyle_IE(element, style) { + var value = element.style[style]; + if (!value && element.currentStyle) { + value = element.currentStyle[style]; + } + return value; + } + + function getContentWidth(element, context) { + var boxWidth = element.offsetWidth; + + var bl = getPixelValue(element, 'borderLeftWidth', context) || 0; + var br = getPixelValue(element, 'borderRightWidth', context) || 0; + var pl = getPixelValue(element, 'paddingLeft', context) || 0; + var pr = getPixelValue(element, 'paddingRight', context) || 0; + + return boxWidth - bl - br - pl - pr; + } + + if ( + !Object.isUndefined(document.documentElement.currentStyle) && + !Prototype.Browser.Opera + ) { + getRawStyle = getRawStyle_IE; + } + + function getPixelValue(value, property, context) { + var element = null; + if (Object.isElement(value)) { + element = value; + value = getRawStyle(element, property); + } + + if (value === null || Object.isUndefined(value)) { + return null; + } + + if (/^(?:-)?\d+(\.\d+)?(px)?$/i.test(value)) { + return window.parseFloat(value); + } + + var isPercentage = value.include('%'), + isViewport = context === document.viewport; + + if ( + /\d/.test(value) && + element && + element.runtimeStyle && + !(isPercentage && isViewport) + ) { + var style = element.style.left, + rStyle = element.runtimeStyle.left; + element.runtimeStyle.left = element.currentStyle.left; + element.style.left = value || 0; + value = element.style.pixelLeft; + element.style.left = style; + element.runtimeStyle.left = rStyle; + + return value; + } + + if (element && isPercentage) { + context = context || element.parentNode; + var decimal = toDecimal(value), + whole = null; + + var isHorizontal = + property.include('left') || + property.include('right') || + property.include('width'); + + var isVertical = + property.include('top') || + property.include('bottom') || + property.include('height'); + + if (context === document.viewport) { + if (isHorizontal) { + whole = document.viewport.getWidth(); + } else if (isVertical) { + whole = document.viewport.getHeight(); + } + } else { + if (isHorizontal) { + whole = $(context).measure('width'); + } else if (isVertical) { + whole = $(context).measure('height'); + } + } + + return whole === null ? 0 : whole * decimal; + } + + return 0; + } + + function toCSSPixels(number) { + if (Object.isString(number) && number.endsWith('px')) return number; + return number + 'px'; + } + + function isDisplayed(element) { + while (element && element.parentNode) { + var display = element.getStyle('display'); + if (display === 'none') { + return false; + } + element = $(element.parentNode); + } + return true; + } + + var hasLayout = Prototype.K; + if ('currentStyle' in document.documentElement) { + hasLayout = function (element) { + if (!element.currentStyle.hasLayout) { + element.style.zoom = 1; + } + return element; + }; + } + + function cssNameFor(key) { + if (key.include('border')) key = key + '-width'; + return key.camelize(); + } + + Element.Layout = Class.create(Hash, { + initialize: function ($super, element, preCompute) { + $super(); + this.element = $(element); + + Element.Layout.PROPERTIES.each(function (property) { + this._set(property, null); + }, this); + + if (preCompute) { + this._preComputing = true; + this._begin(); + Element.Layout.PROPERTIES.each(this._compute, this); + this._end(); + this._preComputing = false; + } + }, + + _set: function (property, value) { + return Hash.prototype.set.call(this, property, value); + }, + + set: function (property, value) { + throw 'Properties of Element.Layout are read-only.'; + }, + + get: function ($super, property) { + var value = $super(property); + return value === null ? this._compute(property) : value; + }, + + _begin: function () { + if (this._isPrepared()) return; + + var element = this.element; + if (isDisplayed(element)) { + this._setPrepared(true); + return; + } + + var originalStyles = { + position: element.style.position || '', + width: element.style.width || '', + visibility: element.style.visibility || '', + display: element.style.display || '' + }; + + element.store('prototype_original_styles', originalStyles); + + var position = getRawStyle(element, 'position'), + width = element.offsetWidth; + + if (width === 0 || width === null) { + element.style.display = 'block'; + width = element.offsetWidth; + } + + var context = + position === 'fixed' ? document.viewport : element.parentNode; + + var tempStyles = { + visibility: 'hidden', + display: 'block' + }; + + if (position !== 'fixed') tempStyles.position = 'absolute'; + + element.setStyle(tempStyles); + + var positionedWidth = element.offsetWidth, + newWidth; + if (width && positionedWidth === width) { + newWidth = getContentWidth(element, context); + } else if (position === 'absolute' || position === 'fixed') { + newWidth = getContentWidth(element, context); + } else { + var parent = element.parentNode, + pLayout = $(parent).getLayout(); + + newWidth = + pLayout.get('width') - + this.get('margin-left') - + this.get('border-left') - + this.get('padding-left') - + this.get('padding-right') - + this.get('border-right') - + this.get('margin-right'); + } + + element.setStyle({ width: newWidth + 'px' }); + + this._setPrepared(true); + }, + + _end: function () { + var element = this.element; + var originalStyles = element.retrieve('prototype_original_styles'); + element.store('prototype_original_styles', null); + element.setStyle(originalStyles); + this._setPrepared(false); + }, + + _compute: function (property) { + var COMPUTATIONS = Element.Layout.COMPUTATIONS; + if (!(property in COMPUTATIONS)) { + throw 'Property not found.'; + } + + return this._set( + property, + COMPUTATIONS[property].call(this, this.element) + ); + }, + + _isPrepared: function () { + return this.element.retrieve('prototype_element_layout_prepared', false); + }, + + _setPrepared: function (bool) { + return this.element.store('prototype_element_layout_prepared', bool); + }, + + toObject: function () { + var args = $A(arguments); + var keys = + args.length === 0 + ? Element.Layout.PROPERTIES + : args.join(' ').split(' '); + var obj = {}; + keys.each(function (key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + var value = this.get(key); + if (value != null) obj[key] = value; + }, this); + return obj; + }, + + toHash: function () { + var obj = this.toObject.apply(this, arguments); + return new Hash(obj); + }, + + toCSS: function () { + var args = $A(arguments); + var keys = + args.length === 0 + ? Element.Layout.PROPERTIES + : args.join(' ').split(' '); + var css = {}; + + keys.each(function (key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + + var value = this.get(key); + if (value != null) css[cssNameFor(key)] = value + 'px'; + }, this); + return css; + }, + + inspect: function () { + return '#'; + } + }); + + Object.extend(Element.Layout, { + PROPERTIES: $w( + 'height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height' + ), + + COMPOSITE_PROPERTIES: $w( + 'padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height' + ), + + COMPUTATIONS: { + height: function (element) { + if (!this._preComputing) this._begin(); + + var bHeight = this.get('border-box-height'); + if (bHeight <= 0) { + if (!this._preComputing) this._end(); + return 0; + } + + var bTop = this.get('border-top'), + bBottom = this.get('border-bottom'); + + var pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + if (!this._preComputing) this._end(); + + return bHeight - bTop - bBottom - pTop - pBottom; + }, + + width: function (element) { + if (!this._preComputing) this._begin(); + + var bWidth = this.get('border-box-width'); + if (bWidth <= 0) { + if (!this._preComputing) this._end(); + return 0; + } + + var bLeft = this.get('border-left'), + bRight = this.get('border-right'); + + var pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + if (!this._preComputing) this._end(); + return bWidth - bLeft - bRight - pLeft - pRight; + }, + + 'padding-box-height': function (element) { + var height = this.get('height'), + pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + return height + pTop + pBottom; + }, + + 'padding-box-width': function (element) { + var width = this.get('width'), + pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + return width + pLeft + pRight; + }, + + 'border-box-height': function (element) { + if (!this._preComputing) this._begin(); + var height = element.offsetHeight; + if (!this._preComputing) this._end(); + return height; + }, + + 'border-box-width': function (element) { + if (!this._preComputing) this._begin(); + var width = element.offsetWidth; + if (!this._preComputing) this._end(); + return width; + }, + + 'margin-box-height': function (element) { + var bHeight = this.get('border-box-height'), + mTop = this.get('margin-top'), + mBottom = this.get('margin-bottom'); + + if (bHeight <= 0) return 0; + + return bHeight + mTop + mBottom; + }, + + 'margin-box-width': function (element) { + var bWidth = this.get('border-box-width'), + mLeft = this.get('margin-left'), + mRight = this.get('margin-right'); + + if (bWidth <= 0) return 0; + + return bWidth + mLeft + mRight; + }, + + top: function (element) { + var offset = element.positionedOffset(); + return offset.top; + }, + + bottom: function (element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pHeight = parent.measure('height'); + + var mHeight = this.get('border-box-height'); + + return pHeight - mHeight - offset.top; + }, + + left: function (element) { + var offset = element.positionedOffset(); + return offset.left; + }, + + right: function (element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pWidth = parent.measure('width'); + + var mWidth = this.get('border-box-width'); + + return pWidth - mWidth - offset.left; + }, + + 'padding-top': function (element) { + return getPixelValue(element, 'paddingTop'); + }, + + 'padding-bottom': function (element) { + return getPixelValue(element, 'paddingBottom'); + }, + + 'padding-left': function (element) { + return getPixelValue(element, 'paddingLeft'); + }, + + 'padding-right': function (element) { + return getPixelValue(element, 'paddingRight'); + }, + + 'border-top': function (element) { + return getPixelValue(element, 'borderTopWidth'); + }, + + 'border-bottom': function (element) { + return getPixelValue(element, 'borderBottomWidth'); + }, + + 'border-left': function (element) { + return getPixelValue(element, 'borderLeftWidth'); + }, + + 'border-right': function (element) { + return getPixelValue(element, 'borderRightWidth'); + }, + + 'margin-top': function (element) { + return getPixelValue(element, 'marginTop'); + }, + + 'margin-bottom': function (element) { + return getPixelValue(element, 'marginBottom'); + }, + + 'margin-left': function (element) { + return getPixelValue(element, 'marginLeft'); + }, + + 'margin-right': function (element) { + return getPixelValue(element, 'marginRight'); + } + } + }); + + if ('getBoundingClientRect' in document.documentElement) { + Object.extend(Element.Layout.COMPUTATIONS, { + right: function (element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.right - rect.right).round(); + }, + + bottom: function (element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.bottom - rect.bottom).round(); + } + }); + } + + Element.Offset = Class.create({ + initialize: function (left, top) { + this.left = left.round(); + this.top = top.round(); + + this[0] = this.left; + this[1] = this.top; + }, + + relativeTo: function (offset) { + return new Element.Offset(this.left - offset.left, this.top - offset.top); + }, + + inspect: function () { + return '#'.interpolate(this); + }, + + toString: function () { + return '[#{left}, #{top}]'.interpolate(this); + }, + + toArray: function () { + return [this.left, this.top]; + } + }); + + function getLayout(element, preCompute) { + return new Element.Layout(element, preCompute); + } + + function measure(element, property) { + return $(element).getLayout().get(property); + } + + function getHeight(element) { + return Element.getDimensions(element).height; + } + + function getWidth(element) { + return Element.getDimensions(element).width; + } + + function getDimensions(element) { + element = $(element); + var display = Element.getStyle(element, 'display'); + + if (display && display !== 'none') { + return { width: element.offsetWidth, height: element.offsetHeight }; + } + + var style = element.style; + var originalStyles = { + visibility: style.visibility, + position: style.position, + display: style.display + }; + + var newStyles = { + visibility: 'hidden', + display: 'block' + }; + + if (originalStyles.position !== 'fixed') newStyles.position = 'absolute'; + + Element.setStyle(element, newStyles); + + var dimensions = { + width: element.offsetWidth, + height: element.offsetHeight + }; + + Element.setStyle(element, originalStyles); + + return dimensions; + } + + function getOffsetParent(element) { + element = $(element); + + function selfOrBody(element) { + return isHtml(element) ? $(document.body) : $(element); + } + + if ( + isDocument(element) || + isDetached(element) || + isBody(element) || + isHtml(element) + ) + return $(document.body); + + var isInline = Element.getStyle(element, 'display') === 'inline'; + if (!isInline && element.offsetParent) + return selfOrBody(element.offsetParent); + + while ((element = element.parentNode) && element !== document.body) { + if (Element.getStyle(element, 'position') !== 'static') { + return selfOrBody(element); + } + } + + return $(document.body); + } + + function cumulativeOffset(element) { + element = $(element); + var valueT = 0, + valueL = 0; + if (element.parentNode) { + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + } + return new Element.Offset(valueL, valueT); + } + + function positionedOffset(element) { + element = $(element); + + var layout = element.getLayout(); + + var valueT = 0, + valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (isBody(element)) break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + + valueL -= layout.get('margin-left'); + valueT -= layout.get('margin-top'); + + return new Element.Offset(valueL, valueT); + } + + function cumulativeScrollOffset(element) { + var valueT = 0, + valueL = 0; + do { + if (element === document.body) { + var bodyScrollNode = + document.documentElement || document.body.parentNode || document.body; + valueT += !Object.isUndefined(window.pageYOffset) + ? window.pageYOffset + : bodyScrollNode.scrollTop || 0; + valueL += !Object.isUndefined(window.pageXOffset) + ? window.pageXOffset + : bodyScrollNode.scrollLeft || 0; + break; + } else { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } + } while (element); + return new Element.Offset(valueL, valueT); + } + + function viewportOffset(forElement) { + var valueT = 0, + valueL = 0, + docBody = document.body; + + forElement = $(forElement); + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if ( + element.offsetParent == docBody && + Element.getStyle(element, 'position') == 'absolute' + ) + break; + } while ((element = element.offsetParent)); + + element = forElement; + do { + if (element != docBody) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while ((element = element.parentNode)); + return new Element.Offset(valueL, valueT); + } + + function absolutize(element) { + element = $(element); + + if (Element.getStyle(element, 'position') === 'absolute') { + return element; + } + + var offsetParent = getOffsetParent(element); + var eOffset = element.viewportOffset(), + pOffset = offsetParent.viewportOffset(); + + var offset = eOffset.relativeTo(pOffset); + var layout = element.getLayout(); + + element.store('prototype_absolutize_original_styles', { + position: element.getStyle('position'), + left: element.getStyle('left'), + top: element.getStyle('top'), + width: element.getStyle('width'), + height: element.getStyle('height') + }); + + element.setStyle({ + position: 'absolute', + top: offset.top + 'px', + left: offset.left + 'px', + width: layout.get('width') + 'px', + height: layout.get('height') + 'px' + }); + + return element; + } + + function relativize(element) { + element = $(element); + if (Element.getStyle(element, 'position') === 'relative') { + return element; + } + + var originalStyles = element.retrieve( + 'prototype_absolutize_original_styles' + ); + + if (originalStyles) element.setStyle(originalStyles); + return element; + } + + function scrollTo(element) { + element = $(element); + var pos = Element.cumulativeOffset(element); + window.scrollTo(pos.left, pos.top); + return element; + } + + function makePositioned(element) { + element = $(element); + var position = Element.getStyle(element, 'position'), + styles = {}; + if (position === 'static' || !position) { + styles.position = 'relative'; + if (Prototype.Browser.Opera) { + styles.top = 0; + styles.left = 0; + } + Element.setStyle(element, styles); + Element.store(element, 'prototype_made_positioned', true); + } + return element; + } + + function undoPositioned(element) { + element = $(element); + var storage = Element.getStorage(element), + madePositioned = storage.get('prototype_made_positioned'); + + if (madePositioned) { + storage.unset('prototype_made_positioned'); + Element.setStyle(element, { + position: '', + top: '', + bottom: '', + left: '', + right: '' + }); + } + return element; + } + + function makeClipping(element) { + element = $(element); + + var storage = Element.getStorage(element), + madeClipping = storage.get('prototype_made_clipping'); + + if (Object.isUndefined(madeClipping)) { + var overflow = Element.getStyle(element, 'overflow'); + storage.set('prototype_made_clipping', overflow); + if (overflow !== 'hidden') element.style.overflow = 'hidden'; + } + + return element; + } + + function undoClipping(element) { + element = $(element); + var storage = Element.getStorage(element), + overflow = storage.get('prototype_made_clipping'); + + if (!Object.isUndefined(overflow)) { + storage.unset('prototype_made_clipping'); + element.style.overflow = overflow || ''; + } + + return element; + } + + function clonePosition(element, source, options) { + options = Object.extend( + { + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, + options || {} + ); + + var docEl = document.documentElement; + + source = $(source); + element = $(element); + var p, + delta, + layout, + styles = {}; + + if (options.setLeft || options.setTop) { + p = Element.viewportOffset(source); + delta = [0, 0]; + if (Element.getStyle(element, 'position') === 'absolute') { + var parent = Element.getOffsetParent(element); + if (parent !== document.body) delta = Element.viewportOffset(parent); + } + } + + function pageScrollXY() { + var x = 0, + y = 0; + if (Object.isNumber(window.pageXOffset)) { + x = window.pageXOffset; + y = window.pageYOffset; + } else if ( + document.body && + (document.body.scrollLeft || document.body.scrollTop) + ) { + x = document.body.scrollLeft; + y = document.body.scrollTop; + } else if (docEl && (docEl.scrollLeft || docEl.scrollTop)) { + x = docEl.scrollLeft; + y = docEl.scrollTop; + } + return { x: x, y: y }; + } + + var pageXY = pageScrollXY(); + + if (options.setWidth || options.setHeight) { + layout = Element.getLayout(source); + } + + if (options.setLeft) + styles.left = p[0] + pageXY.x - delta[0] + options.offsetLeft + 'px'; + if (options.setTop) + styles.top = p[1] + pageXY.y - delta[1] + options.offsetTop + 'px'; + + var currentLayout = element.getLayout(); + + if (options.setWidth) { + styles.width = layout.get('width') + 'px'; + } + if (options.setHeight) { + styles.height = layout.get('height') + 'px'; + } + + return Element.setStyle(element, styles); + } + + if (Prototype.Browser.IE) { + getOffsetParent = getOffsetParent.wrap(function (proceed, element) { + element = $(element); + + if ( + isDocument(element) || + isDetached(element) || + isBody(element) || + isHtml(element) + ) + return $(document.body); + + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + }); + + positionedOffset = positionedOffset.wrap(function (proceed, element) { + element = $(element); + if (!element.parentNode) return new Element.Offset(0, 0); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + hasLayout(offsetParent); + + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + }); + } else if (Prototype.Browser.Webkit) { + cumulativeOffset = function (element) { + element = $(element); + var valueT = 0, + valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) { + if (Element.getStyle(element, 'position') == 'absolute') break; + } + + element = element.offsetParent; + } while (element); + + return new Element.Offset(valueL, valueT); + }; + } + + Element.addMethods({ + getLayout: getLayout, + measure: measure, + getWidth: getWidth, + getHeight: getHeight, + getDimensions: getDimensions, + getOffsetParent: getOffsetParent, + cumulativeOffset: cumulativeOffset, + positionedOffset: positionedOffset, + cumulativeScrollOffset: cumulativeScrollOffset, + viewportOffset: viewportOffset, + absolutize: absolutize, + relativize: relativize, + scrollTo: scrollTo, + makePositioned: makePositioned, + undoPositioned: undoPositioned, + makeClipping: makeClipping, + undoClipping: undoClipping, + clonePosition: clonePosition + }); + + function isBody(element) { + return element.nodeName.toUpperCase() === 'BODY'; + } + + function isHtml(element) { + return element.nodeName.toUpperCase() === 'HTML'; + } + + function isDocument(element) { + return element.nodeType === Node.DOCUMENT_NODE; + } + + function isDetached(element) { + return ( + element !== document.body && !Element.descendantOf(element, document.body) + ); + } + + if ('getBoundingClientRect' in document.documentElement) { + Element.addMethods({ + viewportOffset: function (element) { + element = $(element); + if (isDetached(element)) return new Element.Offset(0, 0); + + var rect = element.getBoundingClientRect(), + docEl = document.documentElement; + return new Element.Offset( + rect.left - docEl.clientLeft, + rect.top - docEl.clientTop + ); + } + }); + } +})(); + +(function () { + var IS_OLD_OPERA = + Prototype.Browser.Opera && window.parseFloat(window.opera.version()) < 9.5; + var ROOT = null; + function getRootElement() { + if (ROOT) return ROOT; + ROOT = IS_OLD_OPERA ? document.body : document.documentElement; + return ROOT; + } + + function getDimensions() { + return { width: this.getWidth(), height: this.getHeight() }; + } + + function getWidth() { + return getRootElement().clientWidth; + } + + function getHeight() { + return getRootElement().clientHeight; + } + + function getScrollOffsets() { + var x = + window.pageXOffset || + document.documentElement.scrollLeft || + document.body.scrollLeft; + var y = + window.pageYOffset || + document.documentElement.scrollTop || + document.body.scrollTop; + + return new Element.Offset(x, y); + } + + document.viewport = { + getDimensions: getDimensions, + getWidth: getWidth, + getHeight: getHeight, + getScrollOffsets: getScrollOffsets + }; +})(); +window.$$ = function () { + var expression = $A(arguments).join(', '); + return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function () { + function select() { + throw new Error('Method "Prototype.Selector.select" must be defined.'); + } + + function match() { + throw new Error('Method "Prototype.Selector.match" must be defined.'); + } + + function find(elements, expression, index) { + index = index || 0; + var match = Prototype.Selector.match, + length = elements.length, + matchIndex = 0, + i; + + for (i = 0; i < length; i++) { + if (match(elements[i], expression) && index == matchIndex++) { + return Element.extend(elements[i]); + } + } + } + + function extendElements(elements) { + for (var i = 0, length = elements.length; i < length; i++) { + Element.extend(elements[i]); + } + return elements; + } + + var K = Prototype.K; + + return { + select: select, + match: match, + find: find, + extendElements: Element.extend === K ? K : extendElements, + extendElement: Element.extend + }; +})(); +Prototype._original_property = window.Sizzle; + +(function () { + function fakeDefine(fn) { + Prototype._actual_sizzle = fn(); + } + fakeDefine.amd = true; + + if (typeof define !== 'undefined' && define.amd) { + Prototype._original_define = define; + Prototype._actual_sizzle = null; + window.define = fakeDefine; + } +})(); + +/*! + * Sizzle CSS Selector Engine v1.10.18 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-02-05 + */ +(function (window) { + var i, + support, + Expr, + getText, + isXML, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + expando = 'sizzle' + -new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function (a, b) { + if (a === b) { + hasDuplicate = true; + } + return 0; + }, + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + hasOwn = {}.hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + indexOf = + arr.indexOf || + function (elem) { + var i = 0, + len = this.length; + for (; i < len; i++) { + if (this[i] === elem) { + return i; + } + } + return -1; + }, + booleans = + 'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped', + whitespace = '[\\x20\\t\\r\\n\\f]', + characterEncoding = '(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+', + identifier = characterEncoding.replace('w', 'w#'), + attributes = + '\\[' + + whitespace + + '*(' + + characterEncoding + + ')' + + whitespace + + '*(?:([*^$|!~]?=)' + + whitespace + + '*(?:([\'"])((?:\\\\.|[^\\\\])*?)\\3|(' + + identifier + + ')|)|)' + + whitespace + + '*\\]', + pseudos = + ':(' + + characterEncoding + + ')(?:\\((([\'"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|' + + attributes.replace(3, 8) + + ')*)|.*)\\)|)', + rtrim = new RegExp( + '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', + 'g' + ), + rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'), + rcombinators = new RegExp( + '^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*' + ), + rattributeQuotes = new RegExp( + '=' + whitespace + '*([^\\]\'"]*?)' + whitespace + '*\\]', + 'g' + ), + rpseudo = new RegExp(pseudos), + ridentifier = new RegExp('^' + identifier + '$'), + matchExpr = { + ID: new RegExp('^#(' + characterEncoding + ')'), + CLASS: new RegExp('^\\.(' + characterEncoding + ')'), + TAG: new RegExp('^(' + characterEncoding.replace('w', 'w*') + ')'), + ATTR: new RegExp('^' + attributes), + PSEUDO: new RegExp('^' + pseudos), + CHILD: new RegExp( + '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + + whitespace + + '*(even|odd|(([+-]|)(\\d*)n|)' + + whitespace + + '*(?:([+-]|)' + + whitespace + + '*(\\d+)|))' + + whitespace + + '*\\)|)', + 'i' + ), + bool: new RegExp('^(?:' + booleans + ')$', 'i'), + needsContext: new RegExp( + '^' + + whitespace + + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + + whitespace + + '*((?:-\\d)?\\d*)' + + whitespace + + '*\\)|)(?=[^-]|$)', + 'i' + ) + }, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + rnative = /^[^{]+\{\s*\[native \w/, + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + rsibling = /[+~]/, + rescape = /'|\\/g, + runescape = new RegExp( + '\\\\([\\da-f]{1,6}' + whitespace + '?|(' + whitespace + ')|.)', + 'ig' + ), + funescape = function (_, escaped, escapedWhitespace) { + var high = '0x' + escaped - 0x10000; + return high !== high || escapedWhitespace + ? escaped + : high < 0 + ? String.fromCharCode(high + 0x10000) + : String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00); + }; + + try { + push.apply( + (arr = slice.call(preferredDoc.childNodes)), + preferredDoc.childNodes + ); + arr[preferredDoc.childNodes.length].nodeType; + } catch (e) { + push = { + apply: arr.length + ? function (target, els) { + push_native.apply(target, slice.call(els)); + } + : function (target, els) { + var j = target.length, + i = 0; + while ((target[j++] = els[i++])) {} + target.length = j - 1; + } + }; + } + + function Sizzle(selector, context, results, seed) { + var match, elem, m, nodeType, i, groups, old, nid, newContext, newSelector; + + if ( + (context ? context.ownerDocument || context : preferredDoc) !== document + ) { + setDocument(context); + } + + context = context || document; + results = results || []; + + if (!selector || typeof selector !== 'string') { + return results; + } + + if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) { + return []; + } + + if (documentIsHTML && !seed) { + if ((match = rquickExpr.exec(selector))) { + if ((m = match[1])) { + if (nodeType === 9) { + elem = context.getElementById(m); + if (elem && elem.parentNode) { + if (elem.id === m) { + results.push(elem); + return results; + } + } else { + return results; + } + } else { + if ( + context.ownerDocument && + (elem = context.ownerDocument.getElementById(m)) && + contains(context, elem) && + elem.id === m + ) { + results.push(elem); + return results; + } + } + } else if (match[2]) { + push.apply(results, context.getElementsByTagName(selector)); + return results; + } else if ( + (m = match[3]) && + support.getElementsByClassName && + context.getElementsByClassName + ) { + push.apply(results, context.getElementsByClassName(m)); + return results; + } + } + + if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + if (nodeType === 1 && context.nodeName.toLowerCase() !== 'object') { + groups = tokenize(selector); + + if ((old = context.getAttribute('id'))) { + nid = old.replace(rescape, '\\$&'); + } else { + context.setAttribute('id', nid); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while (i--) { + groups[i] = nid + toSelector(groups[i]); + } + newContext = + (rsibling.test(selector) && testContext(context.parentNode)) || + context; + newSelector = groups.join(','); + } + + if (newSelector) { + try { + push.apply(results, newContext.querySelectorAll(newSelector)); + return results; + } catch (qsaError) { + } finally { + if (!old) { + context.removeAttribute('id'); + } + } + } + } + } + + return select(selector.replace(rtrim, '$1'), context, results, seed); + } + + /** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ + function createCache() { + var keys = []; + + function cache(key, value) { + if (keys.push(key + ' ') > Expr.cacheLength) { + delete cache[keys.shift()]; + } + return (cache[key + ' '] = value); + } + return cache; + } + + /** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ + function markFunction(fn) { + fn[expando] = true; + return fn; + } + + /** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ + function assert(fn) { + var div = document.createElement('div'); + + try { + return !!fn(div); + } catch (e) { + return false; + } finally { + if (div.parentNode) { + div.parentNode.removeChild(div); + } + div = null; + } + } + + /** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ + function addHandle(attrs, handler) { + var arr = attrs.split('|'), + i = attrs.length; + + while (i--) { + Expr.attrHandle[arr[i]] = handler; + } + } + + /** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ + function siblingCheck(a, b) { + var cur = b && a, + diff = + cur && + a.nodeType === 1 && + b.nodeType === 1 && + (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE); + + if (diff) { + return diff; + } + + if (cur) { + while ((cur = cur.nextSibling)) { + if (cur === b) { + return -1; + } + } + } + + return a ? 1 : -1; + } + + /** + * Returns a function to use in pseudos for input types + * @param {String} type + */ + function createInputPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === 'input' && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ + function createButtonPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return (name === 'input' || name === 'button') && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ + function createPositionalPseudo(fn) { + return markFunction(function (argument) { + argument = +argument; + return markFunction(function (seed, matches) { + var j, + matchIndexes = fn([], seed.length, argument), + i = matchIndexes.length; + + while (i--) { + if (seed[(j = matchIndexes[i])]) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); + } + + /** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ + function testContext(context) { + return ( + context && typeof context.getElementsByTagName !== strundefined && context + ); + } + + support = Sizzle.support = {}; + + /** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ + isXML = Sizzle.isXML = function (elem) { + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== 'HTML' : false; + }; + + /** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ + setDocument = Sizzle.setDocument = function (node) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { + return document; + } + + document = doc; + docElem = doc.documentElement; + + documentIsHTML = !isXML(doc); + + if (parent && parent !== parent.top) { + if (parent.addEventListener) { + parent.addEventListener( + 'unload', + function () { + setDocument(); + }, + false + ); + } else if (parent.attachEvent) { + parent.attachEvent('onunload', function () { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + support.attributes = assert(function (div) { + div.className = 'i'; + return !div.getAttribute('className'); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + support.getElementsByTagName = assert(function (div) { + div.appendChild(doc.createComment('')); + return !div.getElementsByTagName('*').length; + }); + + support.getElementsByClassName = + rnative.test(doc.getElementsByClassName) && + assert(function (div) { + div.innerHTML = "
"; + + div.firstChild.className = 'i'; + return div.getElementsByClassName('i').length === 2; + }); + + support.getById = assert(function (div) { + docElem.appendChild(div).id = expando; + return !doc.getElementsByName || !doc.getElementsByName(expando).length; + }); + + if (support.getById) { + Expr.find['ID'] = function (id, context) { + if (typeof context.getElementById !== strundefined && documentIsHTML) { + var m = context.getElementById(id); + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter['ID'] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + return elem.getAttribute('id') === attrId; + }; + }; + } else { + delete Expr.find['ID']; + + Expr.filter['ID'] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + var node = + typeof elem.getAttributeNode !== strundefined && + elem.getAttributeNode('id'); + return node && node.value === attrId; + }; + }; + } + + Expr.find['TAG'] = support.getElementsByTagName + ? function (tag, context) { + if (typeof context.getElementsByTagName !== strundefined) { + return context.getElementsByTagName(tag); + } + } + : function (tag, context) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName(tag); + + if (tag === '*') { + while ((elem = results[i++])) { + if (elem.nodeType === 1) { + tmp.push(elem); + } + } + + return tmp; + } + return results; + }; + + Expr.find['CLASS'] = + support.getElementsByClassName && + function (className, context) { + if ( + typeof context.getElementsByClassName !== strundefined && + documentIsHTML + ) { + return context.getElementsByClassName(className); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + rbuggyMatches = []; + + rbuggyQSA = []; + + if ((support.qsa = rnative.test(doc.querySelectorAll))) { + assert(function (div) { + div.innerHTML = ""; + + if (div.querySelectorAll("[t^='']").length) { + rbuggyQSA.push('[*^$]=' + whitespace + '*(?:\'\'|"")'); + } + + if (!div.querySelectorAll('[selected]').length) { + rbuggyQSA.push('\\[' + whitespace + '*(?:value|' + booleans + ')'); + } + + if (!div.querySelectorAll(':checked').length) { + rbuggyQSA.push(':checked'); + } + }); + + assert(function (div) { + var input = doc.createElement('input'); + input.setAttribute('type', 'hidden'); + div.appendChild(input).setAttribute('name', 'D'); + + if (div.querySelectorAll('[name=d]').length) { + rbuggyQSA.push('name' + whitespace + '*[*^$|!~]?='); + } + + if (!div.querySelectorAll(':enabled').length) { + rbuggyQSA.push(':enabled', ':disabled'); + } + + div.querySelectorAll('*,:x'); + rbuggyQSA.push(',.*:'); + }); + } + + if ( + (support.matchesSelector = rnative.test( + (matches = + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) + )) + ) { + assert(function (div) { + support.disconnectedMatch = matches.call(div, 'div'); + + matches.call(div, "[s!='']:x"); + rbuggyMatches.push('!=', pseudos); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|')); + rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join('|')); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test(docElem.compareDocumentPosition); + + contains = + hasCompare || rnative.test(docElem.contains) + ? function (a, b) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return ( + a === bup || + !!( + bup && + bup.nodeType === 1 && + (adown.contains + ? adown.contains(bup) + : a.compareDocumentPosition && + a.compareDocumentPosition(bup) & 16) + ) + ); + } + : function (a, b) { + if (b) { + while ((b = b.parentNode)) { + if (b === a) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + sortOrder = hasCompare + ? function (a, b) { + if (a === b) { + hasDuplicate = true; + return 0; + } + + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if (compare) { + return compare; + } + + compare = + (a.ownerDocument || a) === (b.ownerDocument || b) + ? a.compareDocumentPosition(b) + : 1; + + if ( + compare & 1 || + (!support.sortDetached && b.compareDocumentPosition(a) === compare) + ) { + if ( + a === doc || + (a.ownerDocument === preferredDoc && contains(preferredDoc, a)) + ) { + return -1; + } + if ( + b === doc || + (b.ownerDocument === preferredDoc && contains(preferredDoc, b)) + ) { + return 1; + } + + return sortInput + ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) + : 0; + } + + return compare & 4 ? -1 : 1; + } + : function (a, b) { + if (a === b) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [a], + bp = [b]; + + if (!aup || !bup) { + return a === doc + ? -1 + : b === doc + ? 1 + : aup + ? -1 + : bup + ? 1 + : sortInput + ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) + : 0; + } else if (aup === bup) { + return siblingCheck(a, b); + } + + cur = a; + while ((cur = cur.parentNode)) { + ap.unshift(cur); + } + cur = b; + while ((cur = cur.parentNode)) { + bp.unshift(cur); + } + + while (ap[i] === bp[i]) { + i++; + } + + return i + ? siblingCheck(ap[i], bp[i]) + : ap[i] === preferredDoc + ? -1 + : bp[i] === preferredDoc + ? 1 + : 0; + }; + + return doc; + }; + + Sizzle.matches = function (expr, elements) { + return Sizzle(expr, null, null, elements); + }; + + Sizzle.matchesSelector = function (elem, expr) { + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + expr = expr.replace(rattributeQuotes, "='$1']"); + + if ( + support.matchesSelector && + documentIsHTML && + (!rbuggyMatches || !rbuggyMatches.test(expr)) && + (!rbuggyQSA || !rbuggyQSA.test(expr)) + ) { + try { + var ret = matches.call(elem, expr); + + if ( + ret || + support.disconnectedMatch || + (elem.document && elem.document.nodeType !== 11) + ) { + return ret; + } + } catch (e) {} + } + + return Sizzle(expr, document, null, [elem]).length > 0; + }; + + Sizzle.contains = function (context, elem) { + if ((context.ownerDocument || context) !== document) { + setDocument(context); + } + return contains(context, elem); + }; + + Sizzle.attr = function (elem, name) { + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + var fn = Expr.attrHandle[name.toLowerCase()], + val = + fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) + ? fn(elem, name, !documentIsHTML) + : undefined; + + return val !== undefined + ? val + : support.attributes || !documentIsHTML + ? elem.getAttribute(name) + : (val = elem.getAttributeNode(name)) && val.specified + ? val.value + : null; + }; + + Sizzle.error = function (msg) { + throw new Error('Syntax error, unrecognized expression: ' + msg); + }; + + /** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ + Sizzle.uniqueSort = function (results) { + var elem, + duplicates = [], + j = 0, + i = 0; + + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice(0); + results.sort(sortOrder); + + if (hasDuplicate) { + while ((elem = results[i++])) { + if (elem === results[i]) { + j = duplicates.push(i); + } + } + while (j--) { + results.splice(duplicates[j], 1); + } + } + + sortInput = null; + + return results; + }; + + /** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ + getText = Sizzle.getText = function (elem) { + var node, + ret = '', + i = 0, + nodeType = elem.nodeType; + + if (!nodeType) { + while ((node = elem[i++])) { + ret += getText(node); + } + } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { + if (typeof elem.textContent === 'string') { + return elem.textContent; + } else { + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText(elem); + } + } + } else if (nodeType === 3 || nodeType === 4) { + return elem.nodeValue; + } + + return ret; + }; + + Expr = Sizzle.selectors = { + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + '>': { dir: 'parentNode', first: true }, + ' ': { dir: 'parentNode' }, + '+': { dir: 'previousSibling', first: true }, + '~': { dir: 'previousSibling' } + }, + + preFilter: { + ATTR: function (match) { + match[1] = match[1].replace(runescape, funescape); + + match[3] = (match[4] || match[5] || '').replace(runescape, funescape); + + if (match[2] === '~=') { + match[3] = ' ' + match[3] + ' '; + } + + return match.slice(0, 4); + }, + + CHILD: function (match) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if (match[1].slice(0, 3) === 'nth') { + if (!match[3]) { + Sizzle.error(match[0]); + } + + match[4] = +(match[4] + ? match[5] + (match[6] || 1) + : 2 * (match[3] === 'even' || match[3] === 'odd')); + match[5] = +(match[7] + match[8] || match[3] === 'odd'); + } else if (match[3]) { + Sizzle.error(match[0]); + } + + return match; + }, + + PSEUDO: function (match) { + var excess, + unquoted = !match[5] && match[2]; + + if (matchExpr['CHILD'].test(match[0])) { + return null; + } + + if (match[3] && match[4] !== undefined) { + match[2] = match[4]; + } else if ( + unquoted && + rpseudo.test(unquoted) && + (excess = tokenize(unquoted, true)) && + (excess = + unquoted.indexOf(')', unquoted.length - excess) - unquoted.length) + ) { + match[0] = match[0].slice(0, excess); + match[2] = unquoted.slice(0, excess); + } + + return match.slice(0, 3); + } + }, + + filter: { + TAG: function (nodeNameSelector) { + var nodeName = nodeNameSelector + .replace(runescape, funescape) + .toLowerCase(); + return nodeNameSelector === '*' + ? function () { + return true; + } + : function (elem) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + CLASS: function (className) { + var pattern = classCache[className + ' ']; + + return ( + pattern || + ((pattern = new RegExp( + '(^|' + whitespace + ')' + className + '(' + whitespace + '|$)' + )) && + classCache(className, function (elem) { + return pattern.test( + (typeof elem.className === 'string' && elem.className) || + (typeof elem.getAttribute !== strundefined && + elem.getAttribute('class')) || + '' + ); + })) + ); + }, + + ATTR: function (name, operator, check) { + return function (elem) { + var result = Sizzle.attr(elem, name); + + if (result == null) { + return operator === '!='; + } + if (!operator) { + return true; + } + + result += ''; + + return operator === '=' + ? result === check + : operator === '!=' + ? result !== check + : operator === '^=' + ? check && result.indexOf(check) === 0 + : operator === '*=' + ? check && result.indexOf(check) > -1 + : operator === '$=' + ? check && result.slice(-check.length) === check + : operator === '~=' + ? (' ' + result + ' ').indexOf(check) > -1 + : operator === '|=' + ? result === check || + result.slice(0, check.length + 1) === check + '-' + : false; + }; + }, + + CHILD: function (type, what, argument, first, last) { + var simple = type.slice(0, 3) !== 'nth', + forward = type.slice(-4) !== 'last', + ofType = what === 'of-type'; + + return first === 1 && last === 0 + ? function (elem) { + return !!elem.parentNode; + } + : function (elem, context, xml) { + var cache, + outerCache, + node, + diff, + nodeIndex, + start, + dir = simple !== forward ? 'nextSibling' : 'previousSibling', + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if (parent) { + if (simple) { + while (dir) { + node = elem; + while ((node = node[dir])) { + if ( + ofType + ? node.nodeName.toLowerCase() === name + : node.nodeType === 1 + ) { + return false; + } + } + start = dir = type === 'only' && !start && 'nextSibling'; + } + return true; + } + + start = [forward ? parent.firstChild : parent.lastChild]; + + if (forward && useCache) { + outerCache = parent[expando] || (parent[expando] = {}); + cache = outerCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[nodeIndex]; + + while ( + (node = + (++nodeIndex && node && node[dir]) || + (diff = nodeIndex = 0) || + start.pop()) + ) { + if (node.nodeType === 1 && ++diff && node === elem) { + outerCache[type] = [dirruns, nodeIndex, diff]; + break; + } + } + } else if ( + useCache && + (cache = (elem[expando] || (elem[expando] = {}))[type]) && + cache[0] === dirruns + ) { + diff = cache[1]; + } else { + while ( + (node = + (++nodeIndex && node && node[dir]) || + (diff = nodeIndex = 0) || + start.pop()) + ) { + if ( + (ofType + ? node.nodeName.toLowerCase() === name + : node.nodeType === 1) && + ++diff + ) { + if (useCache) { + (node[expando] || (node[expando] = {}))[type] = [ + dirruns, + diff + ]; + } + + if (node === elem) { + break; + } + } + } + } + + diff -= last; + return ( + diff === first || (diff % first === 0 && diff / first >= 0) + ); + } + }; + }, + + PSEUDO: function (pseudo, argument) { + var args, + fn = + Expr.pseudos[pseudo] || + Expr.setFilters[pseudo.toLowerCase()] || + Sizzle.error('unsupported pseudo: ' + pseudo); + + if (fn[expando]) { + return fn(argument); + } + + if (fn.length > 1) { + args = [pseudo, pseudo, '', argument]; + return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) + ? markFunction(function (seed, matches) { + var idx, + matched = fn(seed, argument), + i = matched.length; + while (i--) { + idx = indexOf.call(seed, matched[i]); + seed[idx] = !(matches[idx] = matched[i]); + } + }) + : function (elem) { + return fn(elem, 0, args); + }; + } + + return fn; + } + }, + + pseudos: { + not: markFunction(function (selector) { + var input = [], + results = [], + matcher = compile(selector.replace(rtrim, '$1')); + + return matcher[expando] + ? markFunction(function (seed, matches, context, xml) { + var elem, + unmatched = matcher(seed, null, xml, []), + i = seed.length; + + while (i--) { + if ((elem = unmatched[i])) { + seed[i] = !(matches[i] = elem); + } + } + }) + : function (elem, context, xml) { + input[0] = elem; + matcher(input, null, xml, results); + return !results.pop(); + }; + }), + + has: markFunction(function (selector) { + return function (elem) { + return Sizzle(selector, elem).length > 0; + }; + }), + + contains: markFunction(function (text) { + return function (elem) { + return ( + (elem.textContent || elem.innerText || getText(elem)).indexOf( + text + ) > -1 + ); + }; + }), + + lang: markFunction(function (lang) { + if (!ridentifier.test(lang || '')) { + Sizzle.error('unsupported lang: ' + lang); + } + lang = lang.replace(runescape, funescape).toLowerCase(); + return function (elem) { + var elemLang; + do { + if ( + (elemLang = documentIsHTML + ? elem.lang + : elem.getAttribute('xml:lang') || elem.getAttribute('lang')) + ) { + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf(lang + '-') === 0; + } + } while ((elem = elem.parentNode) && elem.nodeType === 1); + return false; + }; + }), + + target: function (elem) { + var hash = window.location && window.location.hash; + return hash && hash.slice(1) === elem.id; + }, + + root: function (elem) { + return elem === docElem; + }, + + focus: function (elem) { + return ( + elem === document.activeElement && + (!document.hasFocus || document.hasFocus()) && + !!(elem.type || elem.href || ~elem.tabIndex) + ); + }, + + enabled: function (elem) { + return elem.disabled === false; + }, + + disabled: function (elem) { + return elem.disabled === true; + }, + + checked: function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + return ( + (nodeName === 'input' && !!elem.checked) || + (nodeName === 'option' && !!elem.selected) + ); + }, + + selected: function (elem) { + if (elem.parentNode) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + empty: function (elem) { + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + if (elem.nodeType < 6) { + return false; + } + } + return true; + }, + + parent: function (elem) { + return !Expr.pseudos['empty'](elem); + }, + + header: function (elem) { + return rheader.test(elem.nodeName); + }, + + input: function (elem) { + return rinputs.test(elem.nodeName); + }, + + button: function (elem) { + var name = elem.nodeName.toLowerCase(); + return ( + (name === 'input' && elem.type === 'button') || name === 'button' + ); + }, + + text: function (elem) { + var attr; + return ( + elem.nodeName.toLowerCase() === 'input' && + elem.type === 'text' && + ((attr = elem.getAttribute('type')) == null || + attr.toLowerCase() === 'text') + ); + }, + + first: createPositionalPseudo(function () { + return [0]; + }), + + last: createPositionalPseudo(function (matchIndexes, length) { + return [length - 1]; + }), + + eq: createPositionalPseudo(function (matchIndexes, length, argument) { + return [argument < 0 ? argument + length : argument]; + }), + + even: createPositionalPseudo(function (matchIndexes, length) { + var i = 0; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + odd: createPositionalPseudo(function (matchIndexes, length) { + var i = 1; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + lt: createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; --i >= 0; ) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + gt: createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; ++i < length; ) { + matchIndexes.push(i); + } + return matchIndexes; + }) + } + }; + + Expr.pseudos['nth'] = Expr.pseudos['eq']; + + for (i in { + radio: true, + checkbox: true, + file: true, + password: true, + image: true + }) { + Expr.pseudos[i] = createInputPseudo(i); + } + for (i in { submit: true, reset: true }) { + Expr.pseudos[i] = createButtonPseudo(i); + } + + function setFilters() {} + setFilters.prototype = Expr.filters = Expr.pseudos; + Expr.setFilters = new setFilters(); + + function tokenize(selector, parseOnly) { + var matched, + match, + tokens, + type, + soFar, + groups, + preFilters, + cached = tokenCache[selector + ' ']; + + if (cached) { + return parseOnly ? 0 : cached.slice(0); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while (soFar) { + if (!matched || (match = rcomma.exec(soFar))) { + if (match) { + soFar = soFar.slice(match[0].length) || soFar; + } + groups.push((tokens = [])); + } + + matched = false; + + if ((match = rcombinators.exec(soFar))) { + matched = match.shift(); + tokens.push({ + value: matched, + type: match[0].replace(rtrim, ' ') + }); + soFar = soFar.slice(matched.length); + } + + for (type in Expr.filter) { + if ( + (match = matchExpr[type].exec(soFar)) && + (!preFilters[type] || (match = preFilters[type](match))) + ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice(matched.length); + } + } + + if (!matched) { + break; + } + } + + return parseOnly + ? soFar.length + : soFar + ? Sizzle.error(selector) + : tokenCache(selector, groups).slice(0); + } + + function toSelector(tokens) { + var i = 0, + len = tokens.length, + selector = ''; + for (; i < len; i++) { + selector += tokens[i].value; + } + return selector; + } + + function addCombinator(matcher, combinator, base) { + var dir = combinator.dir, + checkNonElements = base && dir === 'parentNode', + doneName = done++; + + return combinator.first + ? function (elem, context, xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + return matcher(elem, context, xml); + } + } + } + : function (elem, context, xml) { + var oldCache, + outerCache, + newCache = [dirruns, doneName]; + + if (xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + if (matcher(elem, context, xml)) { + return true; + } + } + } + } else { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + outerCache = elem[expando] || (elem[expando] = {}); + if ( + (oldCache = outerCache[dir]) && + oldCache[0] === dirruns && + oldCache[1] === doneName + ) { + return (newCache[2] = oldCache[2]); + } else { + outerCache[dir] = newCache; + + if ((newCache[2] = matcher(elem, context, xml))) { + return true; + } + } + } + } + } + }; + } + + function elementMatcher(matchers) { + return matchers.length > 1 + ? function (elem, context, xml) { + var i = matchers.length; + while (i--) { + if (!matchers[i](elem, context, xml)) { + return false; + } + } + return true; + } + : matchers[0]; + } + + function multipleContexts(selector, contexts, results) { + var i = 0, + len = contexts.length; + for (; i < len; i++) { + Sizzle(selector, contexts[i], results); + } + return results; + } + + function condense(unmatched, map, filter, context, xml) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for (; i < len; i++) { + if ((elem = unmatched[i])) { + if (!filter || filter(elem, context, xml)) { + newUnmatched.push(elem); + if (mapped) { + map.push(i); + } + } + } + } + + return newUnmatched; + } + + function setMatcher( + preFilter, + selector, + matcher, + postFilter, + postFinder, + postSelector + ) { + if (postFilter && !postFilter[expando]) { + postFilter = setMatcher(postFilter); + } + if (postFinder && !postFinder[expando]) { + postFinder = setMatcher(postFinder, postSelector); + } + return markFunction(function (seed, results, context, xml) { + var temp, + i, + elem, + preMap = [], + postMap = [], + preexisting = results.length, + elems = + seed || + multipleContexts( + selector || '*', + context.nodeType ? [context] : context, + [] + ), + matcherIn = + preFilter && (seed || !selector) + ? condense(elems, preMap, preFilter, context, xml) + : elems, + matcherOut = matcher + ? postFinder || (seed ? preFilter : preexisting || postFilter) + ? [] + : results + : matcherIn; + + if (matcher) { + matcher(matcherIn, matcherOut, context, xml); + } + + if (postFilter) { + temp = condense(matcherOut, postMap); + postFilter(temp, [], context, xml); + + i = temp.length; + while (i--) { + if ((elem = temp[i])) { + matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); + } + } + } + + if (seed) { + if (postFinder || preFilter) { + if (postFinder) { + temp = []; + i = matcherOut.length; + while (i--) { + if ((elem = matcherOut[i])) { + temp.push((matcherIn[i] = elem)); + } + } + postFinder(null, (matcherOut = []), temp, xml); + } + + i = matcherOut.length; + while (i--) { + if ( + (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1 + ) { + seed[temp] = !(results[temp] = elem); + } + } + } + } else { + matcherOut = condense( + matcherOut === results + ? matcherOut.splice(preexisting, matcherOut.length) + : matcherOut + ); + if (postFinder) { + postFinder(null, results, matcherOut, xml); + } else { + push.apply(results, matcherOut); + } + } + }); + } + + function matcherFromTokens(tokens) { + var checkContext, + matcher, + j, + len = tokens.length, + leadingRelative = Expr.relative[tokens[0].type], + implicitRelative = leadingRelative || Expr.relative[' '], + i = leadingRelative ? 1 : 0, + matchContext = addCombinator( + function (elem) { + return elem === checkContext; + }, + implicitRelative, + true + ), + matchAnyContext = addCombinator( + function (elem) { + return indexOf.call(checkContext, elem) > -1; + }, + implicitRelative, + true + ), + matchers = [ + function (elem, context, xml) { + return ( + (!leadingRelative && (xml || context !== outermostContext)) || + ((checkContext = context).nodeType + ? matchContext(elem, context, xml) + : matchAnyContext(elem, context, xml)) + ); + } + ]; + + for (; i < len; i++) { + if ((matcher = Expr.relative[tokens[i].type])) { + matchers = [addCombinator(elementMatcher(matchers), matcher)]; + } else { + matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); + + if (matcher[expando]) { + j = ++i; + for (; j < len; j++) { + if (Expr.relative[tokens[j].type]) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher(matchers), + i > 1 && + toSelector( + tokens + .slice(0, i - 1) + .concat({ value: tokens[i - 2].type === ' ' ? '*' : '' }) + ).replace(rtrim, '$1'), + matcher, + i < j && matcherFromTokens(tokens.slice(i, j)), + j < len && matcherFromTokens((tokens = tokens.slice(j))), + j < len && toSelector(tokens) + ); + } + matchers.push(matcher); + } + } + + return elementMatcher(matchers); + } + + function matcherFromGroupMatchers(elementMatchers, setMatchers) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function (seed, context, xml, results, outermost) { + var elem, + j, + matcher, + matchedCount = 0, + i = '0', + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + elems = seed || (byElement && Expr.find['TAG']('*', outermost)), + dirrunsUnique = (dirruns += + contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if (outermost) { + outermostContext = context !== document && context; + } + + for (; i !== len && (elem = elems[i]) != null; i++) { + if (byElement && elem) { + j = 0; + while ((matcher = elementMatchers[j++])) { + if (matcher(elem, context, xml)) { + results.push(elem); + break; + } + } + if (outermost) { + dirruns = dirrunsUnique; + } + } + + if (bySet) { + if ((elem = !matcher && elem)) { + matchedCount--; + } + + if (seed) { + unmatched.push(elem); + } + } + } + + matchedCount += i; + if (bySet && i !== matchedCount) { + j = 0; + while ((matcher = setMatchers[j++])) { + matcher(unmatched, setMatched, context, xml); + } + + if (seed) { + if (matchedCount > 0) { + while (i--) { + if (!(unmatched[i] || setMatched[i])) { + setMatched[i] = pop.call(results); + } + } + } + + setMatched = condense(setMatched); + } + + push.apply(results, setMatched); + + if ( + outermost && + !seed && + setMatched.length > 0 && + matchedCount + setMatchers.length > 1 + ) { + Sizzle.uniqueSort(results); + } + } + + if (outermost) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? markFunction(superMatcher) : superMatcher; + } + + compile = Sizzle.compile = function ( + selector, + match /* Internal Use Only */ + ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[selector + ' ']; + + if (!cached) { + if (!match) { + match = tokenize(selector); + } + i = match.length; + while (i--) { + cached = matcherFromTokens(match[i]); + if (cached[expando]) { + setMatchers.push(cached); + } else { + elementMatchers.push(cached); + } + } + + cached = compilerCache( + selector, + matcherFromGroupMatchers(elementMatchers, setMatchers) + ); + + cached.selector = selector; + } + return cached; + }; + + /** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ + select = Sizzle.select = function (selector, context, results, seed) { + var i, + tokens, + token, + type, + find, + compiled = typeof selector === 'function' && selector, + match = !seed && tokenize((selector = compiled.selector || selector)); + + results = results || []; + + if (match.length === 1) { + tokens = match[0] = match[0].slice(0); + if ( + tokens.length > 2 && + (token = tokens[0]).type === 'ID' && + support.getById && + context.nodeType === 9 && + documentIsHTML && + Expr.relative[tokens[1].type] + ) { + context = (Expr.find['ID']( + token.matches[0].replace(runescape, funescape), + context + ) || [])[0]; + if (!context) { + return results; + } else if (compiled) { + context = context.parentNode; + } + + selector = selector.slice(tokens.shift().value.length); + } + + i = matchExpr['needsContext'].test(selector) ? 0 : tokens.length; + while (i--) { + token = tokens[i]; + + if (Expr.relative[(type = token.type)]) { + break; + } + if ((find = Expr.find[type])) { + if ( + (seed = find( + token.matches[0].replace(runescape, funescape), + (rsibling.test(tokens[0].type) && + testContext(context.parentNode)) || + context + )) + ) { + tokens.splice(i, 1); + selector = seed.length && toSelector(tokens); + if (!selector) { + push.apply(results, seed); + return results; + } + + break; + } + } + } + } + + (compiled || compile(selector, match))( + seed, + context, + !documentIsHTML, + results, + (rsibling.test(selector) && testContext(context.parentNode)) || context + ); + return results; + }; + + support.sortStable = expando.split('').sort(sortOrder).join('') === expando; + + support.detectDuplicates = !!hasDuplicate; + + setDocument(); + + support.sortDetached = assert(function (div1) { + return div1.compareDocumentPosition(document.createElement('div')) & 1; + }); + + if ( + !assert(function (div) { + div.innerHTML = ""; + return div.firstChild.getAttribute('href') === '#'; + }) + ) { + addHandle('type|href|height|width', function (elem, name, isXML) { + if (!isXML) { + return elem.getAttribute(name, name.toLowerCase() === 'type' ? 1 : 2); + } + }); + } + + if ( + !support.attributes || + !assert(function (div) { + div.innerHTML = ''; + div.firstChild.setAttribute('value', ''); + return div.firstChild.getAttribute('value') === ''; + }) + ) { + addHandle('value', function (elem, name, isXML) { + if (!isXML && elem.nodeName.toLowerCase() === 'input') { + return elem.defaultValue; + } + }); + } + + if ( + !assert(function (div) { + return div.getAttribute('disabled') == null; + }) + ) { + addHandle(booleans, function (elem, name, isXML) { + var val; + if (!isXML) { + return elem[name] === true + ? name.toLowerCase() + : (val = elem.getAttributeNode(name)) && val.specified + ? val.value + : null; + } + }); + } + + if (typeof define === 'function' && define.amd) { + define(function () { + return Sizzle; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = Sizzle; + } else { + window.Sizzle = Sizzle; + } +})(window); + +(function () { + if (typeof Sizzle !== 'undefined') { + return; + } + + if (typeof define !== 'undefined' && define.amd) { + window.Sizzle = Prototype._actual_sizzle; + window.define = Prototype._original_define; + delete Prototype._actual_sizzle; + delete Prototype._original_define; + } else if (typeof module !== 'undefined' && module.exports) { + window.Sizzle = module.exports; + module.exports = {}; + } +})(); + +(function (engine) { + var extendElements = Prototype.Selector.extendElements; + + function select(selector, scope) { + return extendElements(engine(selector, scope || document)); + } + + function match(element, selector) { + return engine.matches(selector, [element]).length == 1; + } + + Prototype.Selector.engine = engine; + Prototype.Selector.select = select; + Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + +var Form = { + reset: function (form) { + form = $(form); + form.reset(); + return form; + }, + + serializeElements: function (elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, + value, + submitted = false, + submit = options.submit, + accumulator, + initial; + + if (options.hash) { + initial = {}; + accumulator = function (result, key, value) { + if (key in result) { + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key] = result[key].concat(value); + } else result[key] = value; + return result; + }; + } else { + initial = ''; + accumulator = function (result, key, values) { + if (!Object.isArray(values)) { + values = [values]; + } + if (!values.length) { + return result; + } + var encodedKey = encodeURIComponent(key).gsub(/%20/, '+'); + return ( + result + + (result ? '&' : '') + + values + .map(function (value) { + value = value.gsub(/(\r)?\n/, '\r\n'); + value = encodeURIComponent(value); + value = value.gsub(/%20/, '+'); + return encodedKey + '=' + value; + }) + .join('&') + ); + }; + } + + return elements.inject(initial, function (result, element) { + if (!element.disabled && element.name) { + key = element.name; + value = $(element).getValue(); + if ( + value != null && + element.type != 'file' && + (element.type != 'submit' || + (!submitted && + submit !== false && + (!submit || key == submit) && + (submitted = true))) + ) { + result = accumulator(result, key, value); + } + } + return result; + }); + } +}; + +Form.Methods = { + serialize: function (form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function (form) { + var elements = $(form).getElementsByTagName('*'); + var element, + results = [], + serializers = Form.Element.Serializers; + + for (var i = 0; (element = elements[i]); i++) { + if (serializers[element.tagName.toLowerCase()]) + results.push(Element.extend(element)); + } + return results; + }, + + getInputs: function (form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for ( + var i = 0, matchingInputs = [], length = inputs.length; + i < length; + i++ + ) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function (form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function (form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function (form) { + var elements = $(form) + .getElements() + .findAll(function (element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements + .findAll(function (element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }) + .sortBy(function (element) { + return element.tabIndex; + }) + .first(); + + return firstByIndex + ? firstByIndex + : elements.find(function (element) { + return /^(?:input|select|textarea)$/i.test(element.tagName); + }); + }, + + focusFirstElement: function (form) { + form = $(form); + var element = form.findFirstElement(); + if (element) element.activate(); + return form; + }, + + request: function (form, options) { + (form = $(form)), (options = Object.clone(options || {})); + + var params = options.parameters, + action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function (element) { + $(element).focus(); + return element; + }, + + select: function (element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + serialize: function (element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = {}; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function (element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function (element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function (element) { + $(element).value = ''; + return element; + }, + + present: function (element) { + return $(element).value != ''; + }, + + activate: function (element) { + element = $(element); + try { + element.focus(); + if ( + element.select && + (element.tagName.toLowerCase() != 'input' || + !/^(?:button|reset|submit)$/i.test(element.type)) + ) + element.select(); + } catch (e) {} + return element; + }, + + disable: function (element) { + element = $(element); + element.disabled = true; + return element; + }, + + enable: function (element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; + +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = (function () { + function input(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return inputSelector(element, value); + default: + return valueSelector(element, value); + } + } + + function inputSelector(element, value) { + if (Object.isUndefined(value)) + return element.checked ? element.value : null; + else element.checked = !!value; + } + + function valueSelector(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + } + + function select(element, value) { + if (Object.isUndefined(value)) + return (element.type === 'select-one' ? selectOne : selectMany)(element); + + var opt, + currentValue, + single = !Object.isArray(value); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + currentValue = this.optionValue(opt); + if (single) { + if (currentValue == value) { + opt.selected = true; + return; + } + } else opt.selected = value.include(currentValue); + } + } + + function selectOne(element) { + var index = element.selectedIndex; + return index >= 0 ? optionValue(element.options[index]) : null; + } + + function selectMany(element) { + var values, + length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(optionValue(opt)); + } + return values; + } + + function optionValue(opt) { + return Element.hasAttribute(opt, 'value') ? opt.value : opt.text; + } + + return { + input: input, + inputSelector: inputSelector, + textarea: valueSelector, + select: select, + selectOne: selectOne, + selectMany: selectMany, + optionValue: optionValue, + button: valueSelector + }; +})(); + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function ($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function () { + var value = this.getValue(); + if ( + Object.isString(this.lastValue) && Object.isString(value) + ? this.lastValue != value + : String(this.lastValue) != String(value) + ) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function () { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function () { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function (element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else this.registerCallback(this.element); + }, + + onElementEvent: function () { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function () { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function (element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function () { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function () { + return Form.serialize(this.element); + } +}); +(function (GLOBAL) { + var DIV = document.createElement('div'); + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = + 'onmouseenter' in docEl && 'onmouseleave' in docEl; + + var Event = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45 + }; + + var isIELegacyEvent = function (event) { + return false; + }; + + if (window.attachEvent) { + if (window.addEventListener) { + isIELegacyEvent = function (event) { + return !(event instanceof window.Event); + }; + } else { + isIELegacyEvent = function (event) { + return true; + }; + } + } + + var _isButton; + + function _isButtonForDOMEvents(event, code) { + return event.which ? event.which === code + 1 : event.button === code; + } + + var legacyButtonMap = { 0: 1, 1: 4, 2: 2 }; + function _isButtonForLegacyEvents(event, code) { + return event.button === legacyButtonMap[code]; + } + + function _isButtonForWebKit(event, code) { + switch (code) { + case 0: + return event.which == 1 && !event.metaKey; + case 1: + return event.which == 2 || (event.which == 1 && event.metaKey); + case 2: + return event.which == 3; + default: + return false; + } + } + + if (window.attachEvent) { + if (!window.addEventListener) { + _isButton = _isButtonForLegacyEvents; + } else { + _isButton = function (event, code) { + return isIELegacyEvent(event) + ? _isButtonForLegacyEvents(event, code) + : _isButtonForDOMEvents(event, code); + }; + } + } else if (Prototype.Browser.WebKit) { + _isButton = _isButtonForWebKit; + } else { + _isButton = _isButtonForDOMEvents; + } + + function isLeftClick(event) { + return _isButton(event, 0); + } + + function isMiddleClick(event) { + return _isButton(event, 1); + } + + function isRightClick(event) { + return _isButton(event, 2); + } + + function element(event) { + return Element.extend(_element(event)); + } + + function _element(event) { + event = Event.extend(event); + + var node = event.target, + type = event.type, + currentTarget = event.currentTarget; + + if (currentTarget && currentTarget.tagName) { + if ( + type === 'load' || + type === 'error' || + (type === 'click' && + currentTarget.tagName.toLowerCase() === 'input' && + currentTarget.type === 'radio') + ) + node = currentTarget; + } + + return node.nodeType == Node.TEXT_NODE ? node.parentNode : node; + } + + function findElement(event, expression) { + var element = _element(event), + selector = Prototype.Selector; + if (!expression) return Element.extend(element); + while (element) { + if (Object.isElement(element) && selector.match(element, expression)) + return Element.extend(element); + element = element.parentNode; + } + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return ( + event.pageX || + event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0) + ); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return ( + event.pageY || + event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0) + ); + } + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop + }; + + var methods = Object.keys(Event.Methods).inject({}, function (m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (window.attachEvent) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': + case 'mouseenter': + element = event.fromElement; + break; + case 'mouseout': + case 'mouseleave': + element = event.toElement; + break; + default: + return null; + } + return Element.extend(element); + } + + var additionalMethods = { + stopPropagation: function () { + this.cancelBubble = true; + }, + preventDefault: function () { + this.returnValue = false; + }, + inspect: function () { + return '[object Event]'; + } + }; + + Event.extend = function (event, element) { + if (!event) return false; + + if (!isIELegacyEvent(event)) return event; + + if (event._extendedByPrototype) return event; + event._extendedByPrototype = Prototype.emptyFunction; + + var pointer = Event.pointer(event); + + Object.extend(event, { + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + + Object.extend(event, methods); + Object.extend(event, additionalMethods); + + return event; + }; + } else { + Event.extend = Prototype.K; + } + + if (window.addEventListener) { + Event.prototype = + window.Event.prototype || document.createEvent('HTMLEvents').__proto__; + Object.extend(Event.prototype, methods); + } + + var EVENT_TRANSLATIONS = { + mouseenter: 'mouseover', + mouseleave: 'mouseout' + }; + + function getDOMEventName(eventName) { + return EVENT_TRANSLATIONS[eventName] || eventName; + } + + if (MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) getDOMEventName = Prototype.K; + + function getUniqueElementID(element) { + if (element === window) return 0; + + if (typeof element._prototypeUID === 'undefined') + element._prototypeUID = Element.Storage.UID++; + return element._prototypeUID; + } + + function getUniqueElementID_IE(element) { + if (element === window) return 0; + if (element == document) return 1; + return element.uniqueID; + } + + if ('uniqueID' in DIV) getUniqueElementID = getUniqueElementID_IE; + + function isCustomEvent(eventName) { + return eventName.include(':'); + } + + Event._isCustomEvent = isCustomEvent; + + function getOrCreateRegistryFor(element, uid) { + var CACHE = GLOBAL.Event.cache; + if (Object.isUndefined(uid)) uid = getUniqueElementID(element); + if (!CACHE[uid]) CACHE[uid] = { element: element }; + return CACHE[uid]; + } + + function destroyRegistryForElement(element, uid) { + if (Object.isUndefined(uid)) uid = getUniqueElementID(element); + delete GLOBAL.Event.cache[uid]; + } + + function register(element, eventName, handler) { + var registry = getOrCreateRegistryFor(element); + if (!registry[eventName]) registry[eventName] = []; + var entries = registry[eventName]; + + var i = entries.length; + while (i--) if (entries[i].handler === handler) return null; + + var uid = getUniqueElementID(element); + var responder = GLOBAL.Event._createResponder(uid, eventName, handler); + var entry = { + responder: responder, + handler: handler + }; + + entries.push(entry); + return entry; + } + + function unregister(element, eventName, handler) { + var registry = getOrCreateRegistryFor(element); + var entries = registry[eventName] || []; + + var i = entries.length, + entry; + while (i--) { + if (entries[i].handler === handler) { + entry = entries[i]; + break; + } + } + + if (entry) { + var index = entries.indexOf(entry); + entries.splice(index, 1); + } + + if (entries.length === 0) { + delete registry[eventName]; + if (Object.keys(registry).length === 1 && 'element' in registry) + destroyRegistryForElement(element); + } + + return entry; + } + + function observe(element, eventName, handler) { + element = $(element); + var entry = register(element, eventName, handler); + + if (entry === null) return element; + + var responder = entry.responder; + if (isCustomEvent(eventName)) + observeCustomEvent(element, eventName, responder); + else observeStandardEvent(element, eventName, responder); + + return element; + } + + function observeStandardEvent(element, eventName, responder) { + var actualEventName = getDOMEventName(eventName); + if (element.addEventListener) { + element.addEventListener(actualEventName, responder, false); + } else { + element.attachEvent('on' + actualEventName, responder); + } + } + + function observeCustomEvent(element, eventName, responder) { + if (element.addEventListener) { + element.addEventListener('dataavailable', responder, false); + } else { + element.attachEvent('ondataavailable', responder); + element.attachEvent('onlosecapture', responder); + } + } + + function stopObserving(element, eventName, handler) { + element = $(element); + var handlerGiven = !Object.isUndefined(handler), + eventNameGiven = !Object.isUndefined(eventName); + + if (!eventNameGiven && !handlerGiven) { + stopObservingElement(element); + return element; + } + + if (!handlerGiven) { + stopObservingEventName(element, eventName); + return element; + } + + var entry = unregister(element, eventName, handler); + + if (!entry) return element; + removeEvent(element, eventName, entry.responder); + return element; + } + + function stopObservingStandardEvent(element, eventName, responder) { + var actualEventName = getDOMEventName(eventName); + if (element.removeEventListener) { + element.removeEventListener(actualEventName, responder, false); + } else { + element.detachEvent('on' + actualEventName, responder); + } + } + + function stopObservingCustomEvent(element, eventName, responder) { + if (element.removeEventListener) { + element.removeEventListener('dataavailable', responder, false); + } else { + element.detachEvent('ondataavailable', responder); + element.detachEvent('onlosecapture', responder); + } + } + + function stopObservingElement(element) { + var uid = getUniqueElementID(element), + registry = GLOBAL.Event.cache[uid]; + if (!registry) return; + + destroyRegistryForElement(element, uid); + + var entries, i; + for (var eventName in registry) { + if (eventName === 'element') continue; + + entries = registry[eventName]; + i = entries.length; + while (i--) removeEvent(element, eventName, entries[i].responder); + } + } + + function stopObservingEventName(element, eventName) { + var registry = getOrCreateRegistryFor(element); + var entries = registry[eventName]; + if (entries) { + delete registry[eventName]; + } + + entries = entries || []; + + var i = entries.length; + while (i--) removeEvent(element, eventName, entries[i].responder); + + for (var name in registry) { + if (name === 'element') continue; + return; // There is another registered event + } + + destroyRegistryForElement(element); + } + + function removeEvent(element, eventName, handler) { + if (isCustomEvent(eventName)) + stopObservingCustomEvent(element, eventName, handler); + else stopObservingStandardEvent(element, eventName, handler); + } + + function getFireTarget(element) { + if (element !== document) return element; + if (document.createEvent && !element.dispatchEvent) + return document.documentElement; + return element; + } + + function fire(element, eventName, memo, bubble) { + element = getFireTarget($(element)); + if (Object.isUndefined(bubble)) bubble = true; + memo = memo || {}; + + var event = fireEvent(element, eventName, memo, bubble); + return Event.extend(event); + } + + function fireEvent_DOM(element, eventName, memo, bubble) { + var event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', bubble, true); + + event.eventName = eventName; + event.memo = memo; + + element.dispatchEvent(event); + return event; + } + + function fireEvent_IE(element, eventName, memo, bubble) { + var event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onlosecapture'; + + event.eventName = eventName; + event.memo = memo; + + element.fireEvent(event.eventType, event); + return event; + } + + var fireEvent = document.createEvent ? fireEvent_DOM : fireEvent_IE; + + Event.Handler = Class.create({ + initialize: function (element, eventName, selector, callback) { + this.element = $(element); + this.eventName = eventName; + this.selector = selector; + this.callback = callback; + this.handler = this.handleEvent.bind(this); + }, + + start: function () { + Event.observe(this.element, this.eventName, this.handler); + return this; + }, + + stop: function () { + Event.stopObserving(this.element, this.eventName, this.handler); + return this; + }, + + handleEvent: function (event) { + var element = Event.findElement(event, this.selector); + if (element) this.callback.call(this.element, event, element); + } + }); + + function on(element, eventName, selector, callback) { + element = $(element); + if (Object.isFunction(selector) && Object.isUndefined(callback)) { + (callback = selector), (selector = null); + } + + return new Event.Handler(element, eventName, selector, callback).start(); + } + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving, + on: on + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving, + + on: on + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + on: on.methodize(), + + loaded: false + }); + + if (GLOBAL.Event) Object.extend(window.Event, Event); + else GLOBAL.Event = Event; + + GLOBAL.Event.cache = {}; + + function destroyCache_IE() { + GLOBAL.Event.cache = null; + } + + if (window.attachEvent) window.attachEvent('onunload', destroyCache_IE); + + DIV = null; + docEl = null; +})(this); + +(function (GLOBAL) { + /* Code for creating leak-free event responders is based on work by + John-David Dalton. */ + + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = + 'onmouseenter' in docEl && 'onmouseleave' in docEl; + + function isSimulatedMouseEnterLeaveEvent(eventName) { + return ( + !MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === 'mouseenter' || eventName === 'mouseleave') + ); + } + + function createResponder(uid, eventName, handler) { + if (Event._isCustomEvent(eventName)) + return createResponderForCustomEvent(uid, eventName, handler); + if (isSimulatedMouseEnterLeaveEvent(eventName)) + return createMouseEnterLeaveResponder(uid, eventName, handler); + + return function (event) { + if (!Event.cache) return; + + var element = Event.cache[uid].element; + Event.extend(event, element); + handler.call(element, event); + }; + } + + function createResponderForCustomEvent(uid, eventName, handler) { + return function (event) { + var cache = Event.cache[uid]; + var element = cache && cache.element; + + if (Object.isUndefined(event.eventName)) return false; + + if (event.eventName !== eventName) return false; + + Event.extend(event, element); + handler.call(element, event); + }; + } + + function createMouseEnterLeaveResponder(uid, eventName, handler) { + return function (event) { + var element = Event.cache[uid].element; + + Event.extend(event, element); + var parent = event.relatedTarget; + + while (parent && parent !== element) { + try { + parent = parent.parentNode; + } catch (e) { + parent = element; + } + } + + if (parent === element) return; + handler.call(element, event); + }; + } + + GLOBAL.Event._createResponder = createResponder; + docEl = null; +})(this); + +(function (GLOBAL) { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ + + var TIMER; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (TIMER) window.clearTimeout(TIMER); + document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.detachEvent('onreadystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { + document.documentElement.doScroll('left'); + } catch (e) { + TIMER = pollDoScroll.defer(); + return; + } + + fireContentLoadedEvent(); + } + + if (document.readyState === 'complete') { + fireContentLoadedEvent(); + return; + } + + if (document.addEventListener) { + document.addEventListener( + 'DOMContentLoaded', + fireContentLoadedEvent, + false + ); + } else { + document.attachEvent('onreadystatechange', checkReadyState); + if (window == top) TIMER = pollDoScroll.defer(); + } + + Event.observe(window, 'load', fireContentLoadedEvent); +})(this); + +Element.addMethods(); +/*------------------------------- DEPRECATED -------------------------------*/ + +Hash.toQueryString = Object.toQueryString; + +var Toggle = { display: Element.toggle }; + +Element.addMethods({ + childOf: Element.Methods.descendantOf +}); + +var Insertion = { + Before: function (element, content) { + return Element.insert(element, { before: content }); + }, + + Top: function (element, content) { + return Element.insert(element, { top: content }); + }, + + Bottom: function (element, content) { + return Element.insert(element, { bottom: content }); + }, + + After: function (element, content) { + return Element.insert(element, { after: content }); + } +}; + +var $continue = new Error( + '"throw $continue" is deprecated, use "return" instead' +); + +var Position = { + includeScrollOffsets: false, + + prepare: function () { + this.deltaX = + window.pageXOffset || + document.documentElement.scrollLeft || + document.body.scrollLeft || + 0; + this.deltaY = + window.pageYOffset || + document.documentElement.scrollTop || + document.body.scrollTop || + 0; + }, + + within: function (element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = Element.cumulativeOffset(element); + + return ( + y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth + ); + }, + + withinIncludingScrolloffsets: function (element, x, y) { + var offsetcache = Element.cumulativeScrollOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = Element.cumulativeOffset(element); + + return ( + this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth + ); + }, + + overlap: function (mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ( + (this.offset[1] + element.offsetHeight - this.ycomp) / + element.offsetHeight + ); + if (mode == 'horizontal') + return ( + (this.offset[0] + element.offsetWidth - this.xcomp) / + element.offsetWidth + ); + }, + + cumulativeOffset: Element.Methods.cumulativeOffset, + + positionedOffset: Element.Methods.positionedOffset, + + absolutize: function (element) { + Position.prepare(); + return Element.absolutize(element); + }, + + relativize: function (element) { + Position.prepare(); + return Element.relativize(element); + }, + + realOffset: Element.Methods.cumulativeScrollOffset, + + offsetParent: Element.Methods.getOffsetParent, + + page: Element.Methods.viewportOffset, + + clone: function (source, target, options) { + options = options || {}; + return Element.clonePosition(target, source, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +if (!document.getElementsByClassName) + document.getElementsByClassName = (function (instanceMethods) { + function iter(name) { + return name.blank() + ? null + : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; + } + + instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath + ? function (element, className) { + className = className.toString().strip(); + var cond = /\s/.test(className) + ? $w(className).map(iter).join('') + : iter(className); + return cond + ? document._getElementsByXPath('.//*' + cond, element) + : []; + } + : function (element, className) { + className = className.toString().strip(); + var elements = [], + classNames = /\s/.test(className) ? $w(className) : null; + if (!classNames && !className) return elements; + + var nodes = $(element).getElementsByTagName('*'); + className = ' ' + className + ' '; + + for (var i = 0, child, cn; (child = nodes[i]); i++) { + if ( + child.className && + (cn = ' ' + child.className + ' ') && + (cn.include(className) || + (classNames && + classNames.all(function (name) { + return ( + !name.toString().blank() && cn.include(' ' + name + ' ') + ); + }))) + ) + elements.push(Element.extend(child)); + } + return elements; + }; + + return function (className, parentElement) { + return $(parentElement || document.body).getElementsByClassName( + className + ); + }; + })(Element.Methods); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function (element) { + this.element = $(element); + }, + + _each: function (iterator, context) { + this.element.className + .split(/\s+/) + .select(function (name) { + return name.length > 0; + }) + ._each(iterator, context); + }, + + set: function (className) { + this.element.className = className; + }, + + add: function (classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function (classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function () { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); + +/*--------------------------------------------------------------------------*/ + +(function () { + window.Selector = Class.create({ + initialize: function (expression) { + this.expression = expression.strip(); + }, + + findElements: function (rootElement) { + return Prototype.Selector.select(this.expression, rootElement); + }, + + match: function (element) { + return Prototype.Selector.match(element, this.expression); + }, + + toString: function () { + return this.expression; + }, + + inspect: function () { + return '#'; + } + }); + + Object.extend(Selector, { + matchElements: function (elements, expression) { + var match = Prototype.Selector.match, + results = []; + + for (var i = 0, length = elements.length; i < length; i++) { + var element = elements[i]; + if (match(element, expression)) { + results.push(Element.extend(element)); + } + } + return results; + }, + + findElement: function (elements, expression, index) { + index = index || 0; + var matchIndex = 0, + element; + for (var i = 0, length = elements.length; i < length; i++) { + element = elements[i]; + if ( + Prototype.Selector.match(element, expression) && + index === matchIndex++ + ) { + return Element.extend(element); + } + } + }, + + findChildElements: function (element, expressions) { + var selector = expressions.toArray().join(', '); + return Prototype.Selector.select(selector, element || document); + } + }); +})(); diff --git a/test/integration/full/contrast/prototype.html b/test/integration/full/contrast/prototype.html new file mode 100644 index 000000000..f7f915d6b --- /dev/null +++ b/test/integration/full/contrast/prototype.html @@ -0,0 +1,32 @@ + + + + Test Page + + + + + + + + + + + + +
Text
+ + + + + diff --git a/test/integration/full/contrast/prototype.js b/test/integration/full/contrast/prototype.js new file mode 100644 index 000000000..2b0f271b4 --- /dev/null +++ b/test/integration/full/contrast/prototype.js @@ -0,0 +1,26 @@ +describe('color-contrast prototype.js test', () => { + let results; + + before(done => { + axe.testUtils.awaitNestedLoad(async () => { + const options = { + runOnly: ['color-contrast'], + elementRef: true + }; + results = await axe.run('#fixture', options); + done(); + }); + }); + + describe('incomplete', () => { + it('should find none', () => { + assert.lengthOf(results.incomplete, 0); + }); + }); + + describe('violations', () => { + it('should find one', () => { + assert.lengthOf(results.violations, 1); + }); + }); +}); From 5c5ede0c02ab6e0a62a0e13a4ff5d1e27c3db353 Mon Sep 17 00:00:00 2001 From: Dan Bjorge Date: Fri, 26 Apr 2024 08:08:28 -0400 Subject: [PATCH 030/400] chore: set up vscode config to attach to test:debug (#4430) This updates the existing `test:debug` run script to pass `--remote-debugging-port` to chrome, and then sets up a vscode launch profile to connect to that port. No QA required. --- .vscode/launch.json | 18 ++++++++++++++++++ CONTRIBUTING.md | 2 +- doc/developer-guide.md | 2 +- package.json | 2 +- test/integration/rules/README.md | 2 +- test/karma.conf.js | 11 +++++++++++ 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..e189436e9 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "attach", + "name": "Attach to Karma test:debug", + "address": "localhost", + "port": 9765, // keep in sync with debugPort in karma.conf.js + "webRoot": "${workspaceFolder}", + "sourceMaps": true, + "sourceMapPathOverrides": { + "*": "${webRoot}/*", + "base/*": "${webRoot}/*" + } + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d692677a2..b2461d480 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -162,7 +162,7 @@ If you need to debug the unit tests in a browser, you can run: npm run test:debug ``` -This will start the Karma server and open up the Chrome browser. Click the `Debug` button to start debugging the tests. You can also navigate to the listed URL in your browser of choice to debug tests using that browser. +This will start the Karma server and open up the Chrome browser. Click the `Debug` button to start debugging the tests. You can either use that browser's debugger or attach an external debugger on port 9765; [a VS Code launch profile](./.vscode/launch.json) is provided. You can also navigate to the listed URL in your browser of choice to debug tests using that browser. Because the amount of tests is so large, it's recommended to debug only a specific set of unit tests rather than the whole test suite. You can use the `testDirs` argument when using the debug command and pass a specific test directory. The test directory names are the same as those used for `test:unit:*`: diff --git a/doc/developer-guide.md b/doc/developer-guide.md index 5b3233770..a4eff8058 100644 --- a/doc/developer-guide.md +++ b/doc/developer-guide.md @@ -71,7 +71,7 @@ There are also a set of tests that are not considered unit tests that you can ru Additionally, you can [watch for changes](#watching-for-changes) to files and automatically run the relevant tests. -If you need to debug a test in a non-headless browser, you can run `npm run test:debug` which will run the Karma tests in non-headless Chrome. You can also navigate to the newly opened page using any supported browser. +If you need to debug a test in a non-headless browser, you can run `npm run test:debug` which will run the Karma tests in non-headless Chrome. You can either use that browser's debugger or attach an external debugger on port 9765; [a VS Code launch profile](../.vscode/launch.json) is provided. You can also navigate to the newly opened page using any supported browser. You can scope which set of tests to debug by passing the `testDirs` argument. Supported values are: diff --git a/package.json b/package.json index 9983cadde..0dda5cb33 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "test": "npm run test:tsc && run-s \"test:unit:* -- {@}\" --", "test:tsc": "tsc", "test:unit": "karma start test/karma.conf.js", - "test:debug": "npm run test:unit -- --no-single-run --browsers=Chrome", + "test:debug": "npm run test:unit -- --no-single-run --browsers=ChromeDebugging", "test:unit:core": "npm run test:unit -- testDirs=core", "test:unit:commons": "npm run test:unit -- testDirs=commons", "test:unit:rule-matches": "npm run test:unit -- testDirs=rule-matches", diff --git a/test/integration/rules/README.md b/test/integration/rules/README.md index d9a6e54f4..5543d275d 100644 --- a/test/integration/rules/README.md +++ b/test/integration/rules/README.md @@ -2,7 +2,7 @@ Rule Integration tests take an HTML snippet file and runs an axe-core rule against it. The results for the run are then compared against the companion JSON file to ensure that every node returns as the expected result (passes, violation, incomplete, inapplicable). -To run the rule integration tests, run `npm run test:unit:integration`. You can run and debug the tests in a non-headless browser by running `npm run test:debug -- testDirs=integration`. +To run the rule integration tests, run `npm run test:unit:integration`. You can run and debug the tests in a non-headless browser by running `npm run test:debug -- testDirs=integration`. You can either use that browser's debugger or attach an external debugger on port 9765; [a VS Code launch profile](../../../.vscode/launch.json) is provided. When the tests are run, each JSON file is converted into a test suite file using [Karmas preprocessor](https://karma-runner.github.io/latest/config/preprocessors.html) and [runner.js](./runner.js) as the test suite template. diff --git a/test/karma.conf.js b/test/karma.conf.js index b4036b908..ff0f2ebf7 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -11,6 +11,7 @@ var testDirs = [ 'virtual-rules' ]; var testFiles = []; +var debugPort = 9765; // arbitrary, sync with .vscode/launch.json var args = process.argv.slice(2); args.forEach(function (arg) { @@ -23,6 +24,10 @@ args.forEach(function (arg) { else if (parts[0] === 'testFiles') { testFiles = parts[1].split(','); } + // pattern: debugPort=1234 + else if (parts[0] === 'debugPort') { + debugPort = parseInt(parts[1], 10); + } }); var testPaths = []; @@ -108,6 +113,12 @@ module.exports = function (config) { timeout: 4000, reporter: 'html' } + }, + customLaunchers: { + ChromeDebugging: { + base: 'Chrome', + flags: ['--remote-debugging-port=' + debugPort] + } } }); }; From a07c4882ba5fed7f44b845a613b035e65c153a6a Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 08:25:25 -0500 Subject: [PATCH 031/400] Revert "fix(aria-roles): exception for focus-order-semantics" Addresses some feedback from Wilco in the PR that this isn't the change we want This reverts commit facd65f6f528122ba9c748e587ae3cf1ebd2a22a. --- .../has-widget-or-window-role-evaluate.js | 26 - lib/checks/aria/has-widget-role-evaluate.js | 20 + ...-window-role.json => has-widget-role.json} | 4 +- lib/rules/focus-order-semantics.json | 2 +- locales/_template.json | 6 +- test/checks/aria/has-widget-or-window-role.js | 118 ---- test/checks/aria/has-widget-role.js | 572 ++++++++++++++++++ 7 files changed, 598 insertions(+), 150 deletions(-) delete mode 100644 lib/checks/aria/has-widget-or-window-role-evaluate.js create mode 100644 lib/checks/aria/has-widget-role-evaluate.js rename lib/checks/aria/{has-widget-or-window-role.json => has-widget-role.json} (69%) delete mode 100644 test/checks/aria/has-widget-or-window-role.js create mode 100644 test/checks/aria/has-widget-role.js diff --git a/lib/checks/aria/has-widget-or-window-role-evaluate.js b/lib/checks/aria/has-widget-or-window-role-evaluate.js deleted file mode 100644 index 676b7d6f6..000000000 --- a/lib/checks/aria/has-widget-or-window-role-evaluate.js +++ /dev/null @@ -1,26 +0,0 @@ -import { getRoleType } from '../../commons/aria'; - -const acceptedRoles = { - widget: true, - composite: true, - window: true -}; - -/** - * Check if an elements `role` attribute uses any widget, composite, window abstract role values. - * - * Widget roles are taken from the `ariaRoles` standards object from the roles `type` property. - * - * @memberof checks - * @return {Boolean} True if the element uses a `widget`, `composite`, or `window` abstract role (type). False otherwise. - */ -// # TODO: change to abstract role for widget and window -function hasWidgetOrWindowRoleEvaluate(node) { - const role = node.getAttribute('role'); - if (role === null) { - return false; - } - return !!acceptedRoles[getRoleType(role)]; -} - -export default hasWidgetOrWindowRoleEvaluate; diff --git a/lib/checks/aria/has-widget-role-evaluate.js b/lib/checks/aria/has-widget-role-evaluate.js new file mode 100644 index 000000000..c3344ef20 --- /dev/null +++ b/lib/checks/aria/has-widget-role-evaluate.js @@ -0,0 +1,20 @@ +import { getRoleType } from '../../commons/aria'; + +/** + * Check if an elements `role` attribute uses any widget or composite role values. + * + * Widget roles are taken from the `ariaRoles` standards object from the roles `type` property. + * + * @memberof checks + * @return {Boolean} True if the element uses a `widget` or `composite` role. False otherwise. + */ +function hasWidgetRoleEvaluate(node) { + const role = node.getAttribute('role'); + if (role === null) { + return false; + } + const roleType = getRoleType(role); + return roleType === 'widget' || roleType === 'composite'; +} + +export default hasWidgetRoleEvaluate; diff --git a/lib/checks/aria/has-widget-or-window-role.json b/lib/checks/aria/has-widget-role.json similarity index 69% rename from lib/checks/aria/has-widget-or-window-role.json rename to lib/checks/aria/has-widget-role.json index f5fed0b46..9f79d1487 100644 --- a/lib/checks/aria/has-widget-or-window-role.json +++ b/lib/checks/aria/has-widget-role.json @@ -1,6 +1,6 @@ { - "id": "has-widget-or-window-role", - "evaluate": "has-widget-or-window-role-evaluate", + "id": "has-widget-role", + "evaluate": "has-widget-role-evaluate", "options": [], "metadata": { "impact": "minor", diff --git a/lib/rules/focus-order-semantics.json b/lib/rules/focus-order-semantics.json index 65bc65725..8c73c2b9f 100644 --- a/lib/rules/focus-order-semantics.json +++ b/lib/rules/focus-order-semantics.json @@ -9,6 +9,6 @@ "help": "Elements in the focus order should have an appropriate role" }, "all": [], - "any": ["has-widget-or-window-role", "valid-scrollable-semantics"], + "any": ["has-widget-role", "valid-scrollable-semantics"], "none": [] } diff --git a/locales/_template.json b/locales/_template.json index cbdf75ed6..6ea35122f 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -576,9 +576,9 @@ }, "fail": "Element does not have global ARIA attribute" }, - "has-widget-or-window-role": { - "pass": "Element has a widget or window role.", - "fail": "Element does not have a widget or window role." + "has-widget-role": { + "pass": "Element has a widget role.", + "fail": "Element does not have a widget role." }, "invalidrole": { "pass": "ARIA role is valid", diff --git a/test/checks/aria/has-widget-or-window-role.js b/test/checks/aria/has-widget-or-window-role.js deleted file mode 100644 index 2adae9971..000000000 --- a/test/checks/aria/has-widget-or-window-role.js +++ /dev/null @@ -1,118 +0,0 @@ -describe('has-widget-or-window-role', function () { - 'use strict'; - - let node; - const fixture = document.getElementById('fixture'); - const checkContext = axe.testUtils.MockCheckContext(); - const evaluate = currentNode => - axe.testUtils - .getCheckEvaluate('has-widget-or-window-role') - .call(checkContext, currentNode); - const roles = { - widget: { - button: true, - checkbox: true, - gridcell: true, - link: true, - menuitem: true, - menuitemcheckbox: true, - menuitemradio: true, - option: true, - progressbar: true, - radio: true, - scrollbar: true, - searchbox: true, - slider: true, - spinbutton: true, - switch: true, - tab: true, - tabpanel: true, - textbox: true, - treeitem: true - }, - composite: { - combobox: true, - grid: true, - listbox: true, - menu: true, - menubar: true, - radiogroup: true, - tablist: true, - tree: true, - treegrid: true, - - application: false, - article: false, - cell: false, - columnheader: false, - definition: false, - directory: false, - document: false, - feed: false, - figure: false, - group: false, - heading: false, - img: false, - list: false, - listitem: false, - math: false, - none: false, - note: false, - presentation: false, - row: false, - rowgroup: false, - rowheader: false, - table: false, - term: false, - toolbar: false - }, - window: { - alertdialog: true, - dialog: true - }, - landmark: { - banner: false, - complimentary: false, - contentinfo: false, - form: false, - name: false, - navigation: false, - region: false, - search: false - } - }; - - afterEach(function () { - node.innerHTML = ''; - checkContext._data = null; - }); - - it('should return false for elements with no role', function () { - node = document.createElement('div'); - fixture.appendChild(node); - - assert.isFalse(evaluate(node)); - }); - - it('should return false for elements with nonsensical roles', function () { - node = document.createElement('div'); - node.setAttribute('role', 'buttonbuttonbutton'); - fixture.appendChild(node); - - assert.isFalse(evaluate(node)); - }); - - Object.keys(roles).forEach(category => { - describe(category, function () { - Object.keys(roles[category]).forEach(role => { - it(`should return ${roles[category][role]} for role="${role}"`, function () { - node = document.createElement('div'); - node.setAttribute('role', role); - fixture.appendChild(node); - - assert.equal(evaluate(node), roles[category][role]); - }); - }); - }); - }); -}); diff --git a/test/checks/aria/has-widget-role.js b/test/checks/aria/has-widget-role.js new file mode 100644 index 000000000..f7324cadc --- /dev/null +++ b/test/checks/aria/has-widget-role.js @@ -0,0 +1,572 @@ +describe('has-widget-role', function () { + 'use strict'; + + var fixture = document.getElementById('fixture'); + var node; + var checkContext = axe.testUtils.MockCheckContext(); + + afterEach(function () { + node.innerHTML = ''; + checkContext._data = null; + }); + + it('should return false for elements with no role', function () { + node = document.createElement('div'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for elements with nonsensical roles', function () { + node = document.createElement('div'); + node.setAttribute('role', 'buttonbuttonbutton'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + // Widget roles + it('should return true for role=button', function () { + node = document.createElement('div'); + node.setAttribute('role', 'button'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=checkbox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'checkbox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=gridcell', function () { + node = document.createElement('div'); + node.setAttribute('role', 'gridcell'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=link', function () { + node = document.createElement('div'); + node.setAttribute('role', 'link'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=menuitem', function () { + node = document.createElement('div'); + node.setAttribute('role', 'menuitem'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=menuitemcheckbox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'menuitemcheckbox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=menuitemradio', function () { + node = document.createElement('div'); + node.setAttribute('role', 'menuitemradio'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=option', function () { + node = document.createElement('div'); + node.setAttribute('role', 'option'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=progressbar', function () { + node = document.createElement('div'); + node.setAttribute('role', 'progressbar'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=radio', function () { + node = document.createElement('div'); + node.setAttribute('role', 'radio'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=scrollbar', function () { + node = document.createElement('div'); + node.setAttribute('role', 'scrollbar'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=searchbox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'searchbox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=slider', function () { + node = document.createElement('div'); + node.setAttribute('role', 'slider'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=spinbutton', function () { + node = document.createElement('div'); + node.setAttribute('role', 'spinbutton'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=switch', function () { + node = document.createElement('div'); + node.setAttribute('role', 'switch'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=tab', function () { + node = document.createElement('div'); + node.setAttribute('role', 'tab'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=tabpanel', function () { + node = document.createElement('div'); + node.setAttribute('role', 'tabpanel'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=textbox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'textbox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=treeitem', function () { + node = document.createElement('div'); + node.setAttribute('role', 'treeitem'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + // Composite widget roles + it('should return true for role=combobox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'combobox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=grid', function () { + node = document.createElement('div'); + node.setAttribute('role', 'grid'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=listbox', function () { + node = document.createElement('div'); + node.setAttribute('role', 'listbox'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=menu', function () { + node = document.createElement('div'); + node.setAttribute('role', 'menu'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=menubar', function () { + node = document.createElement('div'); + node.setAttribute('role', 'menubar'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=radiogroup', function () { + node = document.createElement('div'); + node.setAttribute('role', 'radiogroup'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=tablist', function () { + node = document.createElement('div'); + node.setAttribute('role', 'tablist'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=tree', function () { + node = document.createElement('div'); + node.setAttribute('role', 'tree'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return true for role=treegrid', function () { + node = document.createElement('div'); + node.setAttribute('role', 'treegrid'); + fixture.appendChild(node); + assert.isTrue( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=application', function () { + node = document.createElement('div'); + node.setAttribute('role', 'application'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=article', function () { + node = document.createElement('div'); + node.setAttribute('role', 'article'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=cell', function () { + node = document.createElement('div'); + node.setAttribute('role', 'cell'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=columnheader', function () { + node = document.createElement('div'); + node.setAttribute('role', 'columnheader'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=definition', function () { + node = document.createElement('div'); + node.setAttribute('role', 'definition'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=directory', function () { + node = document.createElement('div'); + node.setAttribute('role', 'directory'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=document', function () { + node = document.createElement('div'); + node.setAttribute('role', 'document'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=feed', function () { + node = document.createElement('div'); + node.setAttribute('role', 'feed'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=figure', function () { + node = document.createElement('div'); + node.setAttribute('role', 'figure'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=group', function () { + node = document.createElement('div'); + node.setAttribute('role', 'group'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=heading', function () { + node = document.createElement('div'); + node.setAttribute('role', 'heading'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=img', function () { + node = document.createElement('div'); + node.setAttribute('role', 'img'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=list', function () { + node = document.createElement('div'); + node.setAttribute('role', 'list'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=listitem', function () { + node = document.createElement('div'); + node.setAttribute('role', 'listitem'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=math', function () { + node = document.createElement('div'); + node.setAttribute('role', 'math'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=none', function () { + node = document.createElement('div'); + node.setAttribute('role', 'none'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=note', function () { + node = document.createElement('div'); + node.setAttribute('role', 'note'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=presentation', function () { + node = document.createElement('div'); + node.setAttribute('role', 'presentation'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=row', function () { + node = document.createElement('div'); + node.setAttribute('role', 'row'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=rowgroup', function () { + node = document.createElement('div'); + node.setAttribute('role', 'rowgroup'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=rowheader', function () { + node = document.createElement('div'); + node.setAttribute('role', 'rowheader'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=table', function () { + node = document.createElement('div'); + node.setAttribute('role', 'table'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=term', function () { + node = document.createElement('div'); + node.setAttribute('role', 'term'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=toolbar', function () { + node = document.createElement('div'); + node.setAttribute('role', 'toolbar'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + // Landmark Roles + it('should return false for role=banner', function () { + node = document.createElement('div'); + node.setAttribute('role', 'banner'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=complementary', function () { + node = document.createElement('div'); + node.setAttribute('role', 'complementary'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=contentinfo', function () { + node = document.createElement('div'); + node.setAttribute('role', 'contentinfo'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=form', function () { + node = document.createElement('div'); + node.setAttribute('role', 'form'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=main', function () { + node = document.createElement('div'); + node.setAttribute('role', 'main'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=navigation', function () { + node = document.createElement('div'); + node.setAttribute('role', 'navigation'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=region', function () { + node = document.createElement('div'); + node.setAttribute('role', 'region'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); + + it('should return false for role=search', function () { + node = document.createElement('div'); + node.setAttribute('role', 'search'); + fixture.appendChild(node); + assert.isFalse( + axe.testUtils.getCheckEvaluate('has-widget-role').call(checkContext, node) + ); + }); +}); From f11c03fc73f6a932e320415d8a060dbd17b4a98a Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 08:39:24 -0500 Subject: [PATCH 032/400] fix(aria-roles): support window role in valid-scrollable-semantics reflected in focus-order-semantics --- .../valid-scrollable-semantics-evaluate.js | 2 ++ .../checks/aria/valid-scrollable-semantics.js | 24 +++++++++++++++++++ .../focus-order-semantics.html | 5 ++++ .../focus-order-semantics.json | 4 +++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/checks/aria/valid-scrollable-semantics-evaluate.js b/lib/checks/aria/valid-scrollable-semantics-evaluate.js index 7c3615dbc..933bd3e69 100644 --- a/lib/checks/aria/valid-scrollable-semantics-evaluate.js +++ b/lib/checks/aria/valid-scrollable-semantics-evaluate.js @@ -16,11 +16,13 @@ const VALID_TAG_NAMES_FOR_SCROLLABLE_REGIONS = { * appropriate for scrollable elements found in the focus order. */ const VALID_ROLES_FOR_SCROLLABLE_REGIONS = { + alertdialog: true, application: true, article: true, banner: false, complementary: true, contentinfo: true, + dialog: true, form: true, main: true, navigation: true, diff --git a/test/checks/aria/valid-scrollable-semantics.js b/test/checks/aria/valid-scrollable-semantics.js index 26ea72533..63c7f1d6f 100644 --- a/test/checks/aria/valid-scrollable-semantics.js +++ b/test/checks/aria/valid-scrollable-semantics.js @@ -106,6 +106,18 @@ describe('valid-scrollable-semantics', function () { ); }); + it('should return true for role=alertdialog', function () { + var node = document.createElement('div'); + node.setAttribute('role', 'alertdialog'); + fixture.appendChild(node); + flatTreeSetup(fixture); + assert.isTrue( + axe.testUtils + .getCheckEvaluate('valid-scrollable-semantics') + .call(checkContext, node) + ); + }); + it('should return true for role=article', function () { var node = document.createElement('div'); node.setAttribute('role', 'article'); @@ -118,6 +130,18 @@ describe('valid-scrollable-semantics', function () { ); }); + it('should return true for role=dialog', function () { + var node = document.createElement('div'); + node.setAttribute('role', 'dialog'); + fixture.appendChild(node); + flatTreeSetup(fixture); + assert.isTrue( + axe.testUtils + .getCheckEvaluate('valid-scrollable-semantics') + .call(checkContext, node) + ); + }); + it('should return true for nav elements', function () { var node = document.createElement('nav'); fixture.appendChild(node); diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.html b/test/integration/rules/focus-order-semantics/focus-order-semantics.html index 7ac09790a..3a95bd5ce 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.html +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.html @@ -32,6 +32,11 @@

Valid landmark roles for scrollable containers

+

Valid window roles for scrollable containers

+
+
+ +

Valid scrollable HTML tags for scrollable regions, not selected by this rule diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.json b/test/integration/rules/focus-order-semantics/focus-order-semantics.json index dac1ba8f1..cc1365bbe 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.json +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.json @@ -11,7 +11,9 @@ ["#pass7"], ["#pass8"], ["#pass9"], - ["#pass10"] + ["#pass10"], + ["#pass11"], + ["#pass12"] ], "violations": [ ["#violation1"], From d85631696321b0c2def1336d070f188011b779bc Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 08:52:50 -0500 Subject: [PATCH 033/400] fix(aria-roles): window roles and marque/timer expectations in focus-order-semantics addressing more pr feedback --- lib/checks/aria/valid-scrollable-semantics-evaluate.js | 1 + .../rules/focus-order-semantics/focus-order-semantics.html | 7 +++++-- .../rules/focus-order-semantics/focus-order-semantics.json | 7 +++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/checks/aria/valid-scrollable-semantics-evaluate.js b/lib/checks/aria/valid-scrollable-semantics-evaluate.js index 933bd3e69..755cbf472 100644 --- a/lib/checks/aria/valid-scrollable-semantics-evaluate.js +++ b/lib/checks/aria/valid-scrollable-semantics-evaluate.js @@ -16,6 +16,7 @@ const VALID_TAG_NAMES_FOR_SCROLLABLE_REGIONS = { * appropriate for scrollable elements found in the focus order. */ const VALID_ROLES_FOR_SCROLLABLE_REGIONS = { + alert: true, alertdialog: true, application: true, article: true, diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.html b/test/integration/rules/focus-order-semantics/focus-order-semantics.html index 3a95bd5ce..296b1cb93 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.html +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.html @@ -19,6 +19,8 @@

Invalid landmark roles for scrollable containers

+
+

Valid landmark roles for scrollable containers

@@ -31,11 +33,12 @@

Valid landmark roles for scrollable containers

+

Valid window roles for scrollable containers

-
- +
+

Valid scrollable HTML tags for scrollable regions, not selected by this diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.json b/test/integration/rules/focus-order-semantics/focus-order-semantics.json index cc1365bbe..0cfe89330 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.json +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.json @@ -13,12 +13,15 @@ ["#pass9"], ["#pass10"], ["#pass11"], - ["#pass12"] + ["#pass12"], + ["#pass13"] ], "violations": [ ["#violation1"], ["#violation2"], ["#violation3"], - ["#violation4"] + ["#violation4"], + ["#violation5"], + ["#violation6"] ] } From dc966d3a5de35d0c4e1946ba8c1096b9f70763c7 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 08:54:15 -0500 Subject: [PATCH 034/400] Revert "fix(aria-roles): updated locales" This reverts commit bfa95ae2ff233de32390777f735cd35ef1e50fa4. --- lib/checks/aria/has-widget-role.json | 4 ++-- locales/da.json | 4 ++++ locales/de.json | 4 ++++ locales/el.json | 4 ++++ locales/es.json | 4 ++++ locales/eu.json | 4 ++++ locales/fr.json | 4 ++++ locales/he.json | 4 ++++ locales/it.json | 4 ++++ locales/ja.json | 4 ++++ locales/ko.json | 4 ++++ locales/no_NB.json | 4 ++++ locales/pl.json | 4 ++++ locales/pt_BR.json | 4 ++++ locales/zh_CN.json | 4 ++++ locales/zh_TW.json | 4 ++++ 16 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lib/checks/aria/has-widget-role.json b/lib/checks/aria/has-widget-role.json index 9f79d1487..bda9ad343 100644 --- a/lib/checks/aria/has-widget-role.json +++ b/lib/checks/aria/has-widget-role.json @@ -5,8 +5,8 @@ "metadata": { "impact": "minor", "messages": { - "pass": "Element has a widget or window role.", - "fail": "Element does not have a widget or window role." + "pass": "Element has a widget role.", + "fail": "Element does not have a widget role." } } } diff --git a/locales/da.json b/locales/da.json index a8f54214e..56c9a5ccd 100644 --- a/locales/da.json +++ b/locales/da.json @@ -365,6 +365,10 @@ "plural": "'aria-errormessage'-værdi ${data.values}` bør bruge en teknik til at annoncere beskeden (fx 'aria-live', 'aria-describedby', 'role=alert', osv.)" } }, + "has-widget-role": { + "pass": "Elementet har en 'widget'-rolle.", + "fail": "Elementet har ikke en 'widget'-rolle." + }, "invalidrole": { "pass": "ARIA-rollen er korrekt", "fail": "Rollen skal være en af de mulige ARIA-roller" diff --git a/locales/de.json b/locales/de.json index bd8a24b0a..8f35d0c65 100644 --- a/locales/de.json +++ b/locales/de.json @@ -576,6 +576,10 @@ }, "fail": "Das Element hat keine globalen ARIA Attribute." }, + "has-widget-role": { + "pass": "Element hat eine widget-Rolle.", + "fail": "Das Element besitzt keine widget-Rolle." + }, "invalidrole": { "pass": "ARIA Rolle ist gültig.", "fail": { diff --git a/locales/el.json b/locales/el.json index 4355fafeb..f8f805c42 100644 --- a/locales/el.json +++ b/locales/el.json @@ -539,6 +539,10 @@ }, "fail": "Το στοιχείο δεν έχει καθολικό χαρακτηριστικό ARIA" }, + "has-widget-role": { + "pass": "Το στοιχείο έχει ρόλο widget.", + "fail": "Το στοιχείο δεν έχει ρόλο widget." + }, "invalidrole": { "pass": "Ο ρόλος ARIA είναι έγκυρος", "fail": { diff --git a/locales/es.json b/locales/es.json index 1f5aace76..7a0b5c0b3 100644 --- a/locales/es.json +++ b/locales/es.json @@ -356,6 +356,10 @@ "plural": "En aria-errormessage, valor ${data.values}`, se debe usar una técnica para anunciar el mensaje (p. ej., aria-live, aria-describedby, role=alert, etc.)" } }, + "has-widget-role": { + "pass": "El elemento tiene un rol de widget.", + "fail": "El elemento no tiene un rol de widget." + }, "invalidrole": { "pass": "El rol ARIA es válido", "fail": "El rol debe ser uno de los roles ARIA válidos" diff --git a/locales/eu.json b/locales/eu.json index e4130d375..03b534cfc 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -356,6 +356,10 @@ "plural": "aria-errormessagen, bailioa ${data.values}`, mezua iragartzeko teknika bat erabili behar da (adibidez: aria-live, aria-describedby, role = alert, etab.)." } }, + "has-widget-role": { + "pass": "Elementuak widget rola du.", + "fail": "Elementuak ez du widget rolik." + }, "invalidrole": { "pass": "ARIA rola baliozkoa da", "fail": "Rolak baliozko ARIA rola izan behar du" diff --git a/locales/fr.json b/locales/fr.json index b57078518..9bd71725e 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -519,6 +519,10 @@ }, "fail": "L’élément n’a pas d’attribut ARIA global" }, + "has-widget-role": { + "pass": "L’élément a un rôle widget.", + "fail": "L’élément n’a pas de rôle widget." + }, "invalidrole": { "pass": "Le rôle ARIA est valide", "fail": { diff --git a/locales/he.json b/locales/he.json index 5502bac62..fd0d2eaa5 100644 --- a/locales/he.json +++ b/locales/he.json @@ -529,6 +529,10 @@ }, "fail": "לאלמנט אין תכונת ARIA גלובלית: " }, + "has-widget-role": { + "pass": "לאלמנט יש תפקיד של וגדג'ט.", + "fail": "לאלמנט אין תפקיד של וגדג'ט." + }, "invalidrole": { "pass": "תפקיד ARIA קביל", "fail": { diff --git a/locales/it.json b/locales/it.json index 6aa14e609..6f1b72325 100644 --- a/locales/it.json +++ b/locales/it.json @@ -573,6 +573,10 @@ }, "fail": "L'elemento non ha un attributo ARIA globale" }, + "has-widget-role": { + "pass": "L'elemento ha un ruolo widget.", + "fail": "L'elemento non ha un ruolo widget." + }, "invalidrole": { "pass": "Il ruolo ARIA è valido", "fail": { diff --git a/locales/ja.json b/locales/ja.json index ce1f6e0eb..161fdba32 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -575,6 +575,10 @@ }, "fail": "要素にはグローバルなARIA属性が指定されていません" }, + "has-widget-role": { + "pass": "要素にはwidgetロールが存在します", + "fail": "要素にはwidgetロールが存在しません" + }, "invalidrole": { "pass": "ARIAロールが有効です", "fail": { diff --git a/locales/ko.json b/locales/ko.json index d86ffeed5..9c304d1d7 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -524,6 +524,10 @@ }, "fail": "엘리먼트가 전역 ARIA 어트리뷰트를 가지고 있지 않습니다." }, + "has-widget-role": { + "pass": "엘리먼트가 위젯 역할(role)을 가지고 있습니다.", + "fail": "엘리먼트가 위젯 역할(role)을 가지고 있지 않습니다." + }, "invalidrole": { "pass": "ARIA 역할(role)이 유효합니다.", "fail": { diff --git a/locales/no_NB.json b/locales/no_NB.json index ed73ec0bb..4dbf8dbe9 100644 --- a/locales/no_NB.json +++ b/locales/no_NB.json @@ -365,6 +365,10 @@ "plural": "'aria-errormessage'-verdier ${data.values}` skal bruke en metode for å annonsere beskeden (f.eks. 'aria-live', 'aria-describedby', 'role=alert', osv.)" } }, + "has-widget-role": { + "pass": "Elementet har en 'widget'-rolle.", + "fail": "Elementet har ikke en 'widget'-rolle." + }, "invalidrole": { "pass": "ARIA-rollen er korrekt", "fail": "Rollen skal være en av de mulige ARIA-roller" diff --git a/locales/pl.json b/locales/pl.json index 7c2f2d1f7..1caafcabd 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -575,6 +575,10 @@ }, "fail": "Element nie ma ogólnego atrybutu ARIA" }, + "has-widget-role": { + "pass": "Element ma rolę widżetu.", + "fail": "Element nie ma roli widżetu." + }, "invalidrole": { "pass": "Rola ARIA jest poprawna.", "fail": { diff --git a/locales/pt_BR.json b/locales/pt_BR.json index 68d4cf2da..404d5ab29 100644 --- a/locales/pt_BR.json +++ b/locales/pt_BR.json @@ -504,6 +504,10 @@ }, "fail": "O elemento não tem atributo ARIA global" }, + "has-widget-role": { + "pass": "Elemento tem um 'role' de 'widget'.", + "fail": "Elemento não tem um 'role' de 'widget'." + }, "invalidrole": { "pass": "O ARIA 'role' é válido", "fail": { diff --git a/locales/zh_CN.json b/locales/zh_CN.json index 089cf0ce3..ef5e6876d 100644 --- a/locales/zh_CN.json +++ b/locales/zh_CN.json @@ -576,6 +576,10 @@ }, "fail": "元素没有全局 ARIA 属性" }, + "has-widget-role": { + "pass": "元素有小部件角色", + "fail": "元素没有小部件角色" + }, "invalidrole": { "pass": "ARIA 角色有效", "fail": { diff --git a/locales/zh_TW.json b/locales/zh_TW.json index ba6c50f4c..37a9d3262 100644 --- a/locales/zh_TW.json +++ b/locales/zh_TW.json @@ -573,6 +573,10 @@ }, "fail": "元素沒有全域 ARIA 屬性" }, + "has-widget-role": { + "pass": "元素具有小部件角色", + "fail": "元素沒有小部件角色" + }, "invalidrole": { "pass": "ARIA 角色有效", "fail": { From 9b15ae0bccbe1dccc637c2de13085f6b7da7f74b Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 09:00:43 -0500 Subject: [PATCH 035/400] fix(aria-roles): log and status allowed in focus-order-semantics extends prior work by accounting for all standards aria roles changes --- lib/checks/aria/valid-scrollable-semantics-evaluate.js | 4 +++- .../rules/focus-order-semantics/focus-order-semantics.html | 6 ++++-- .../rules/focus-order-semantics/focus-order-semantics.json | 4 +++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/checks/aria/valid-scrollable-semantics-evaluate.js b/lib/checks/aria/valid-scrollable-semantics-evaluate.js index 755cbf472..fef446f35 100644 --- a/lib/checks/aria/valid-scrollable-semantics-evaluate.js +++ b/lib/checks/aria/valid-scrollable-semantics-evaluate.js @@ -25,10 +25,12 @@ const VALID_ROLES_FOR_SCROLLABLE_REGIONS = { contentinfo: true, dialog: true, form: true, + log: true, main: true, navigation: true, region: true, - search: false + search: false, + status: true }; /** diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.html b/test/integration/rules/focus-order-semantics/focus-order-semantics.html index 296b1cb93..9e8593a40 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.html +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.html @@ -34,11 +34,13 @@

Valid landmark roles for scrollable containers

+
+

Valid window roles for scrollable containers

-
- +
+

Valid scrollable HTML tags for scrollable regions, not selected by this diff --git a/test/integration/rules/focus-order-semantics/focus-order-semantics.json b/test/integration/rules/focus-order-semantics/focus-order-semantics.json index 0cfe89330..b9ed3b20c 100644 --- a/test/integration/rules/focus-order-semantics/focus-order-semantics.json +++ b/test/integration/rules/focus-order-semantics/focus-order-semantics.json @@ -14,7 +14,9 @@ ["#pass10"], ["#pass11"], ["#pass12"], - ["#pass13"] + ["#pass13"], + ["#pass14"], + ["#pass15"] ], "violations": [ ["#violation1"], From eac822328b21325f0c16438b69f4a39a3102d5b9 Mon Sep 17 00:00:00 2001 From: ymrl Date: Mon, 29 Apr 2024 23:47:19 +0900 Subject: [PATCH 036/400] chore(i18n): Fix typo in locales/ja.json (#4426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed a typo in `locales/ja.json`. Usually “braille” is written as “点字”, by Kanji, not be mixed with Hiragana in Japanese. --- locales/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja.json b/locales/ja.json index 161fdba32..f3efdc8c6 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -19,7 +19,7 @@ }, "aria-braille-equivalent": { "description": "aria-braillelabelとaria-brailleroledescriptionには、点字以外の同等のものが存在することを確認します", - "help": "aria-braille属性には、点じ以外の同等のものがなければなりません " + "help": "aria-braille属性には、点字以外の同等のものがなければなりません " }, "aria-command-name": { "description": "すべてのARIA button、link、menuitemにアクセシブルな名前があることを確認します", From 5594d8f1ff45703bed81e4a137afb42b6449d0ee Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Mon, 29 Apr 2024 12:50:21 -0500 Subject: [PATCH 037/400] fix(aria-roles): target-size tests consider changed aria roles last feedback yay --- .../rules/target-size/target-size.html | 35 +++++++++++++++++++ .../rules/target-size/target-size.json | 7 ++++ 2 files changed, 42 insertions(+) diff --git a/test/integration/rules/target-size/target-size.html b/test/integration/rules/target-size/target-size.html index 3c4b0be94..d3cef72ee 100644 --- a/test/integration/rules/target-size/target-size.html +++ b/test/integration/rules/target-size/target-size.html @@ -28,6 +28,41 @@

+
+ +
Cookies
+
+ +
+ + +
+ +
+ + +
+ +
+ +
Log
+
+ +
+ +
Marquee
+
+ +
+ +
Status
+
+ +
+ +
Timer
+
+

Date: Tue, 30 Apr 2024 13:31:39 -0500 Subject: [PATCH 038/400] add suggested isShallowlyHidden instead of presentational --- lib/checks/navigation/region-evaluate.js | 27 ++++++++++++++++---- test/checks/navigation/region.js | 32 ++++++++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/lib/checks/navigation/region-evaluate.js b/lib/checks/navigation/region-evaluate.js index c29e29b8a..f42593a6b 100644 --- a/lib/checks/navigation/region-evaluate.js +++ b/lib/checks/navigation/region-evaluate.js @@ -1,4 +1,5 @@ import * as dom from '../../commons/dom'; +import { hasChildTextNodes } from '../../commons/dom/has-content-virtual'; import { getRole } from '../../commons/aria'; import * as standards from '../../commons/standards'; import matches from '../../commons/matches'; @@ -56,8 +57,7 @@ function findRegionlessElms(virtualNode, options) { ['iframe', 'frame'].includes(virtualNode.props.nodeName) || (dom.isSkipLink(virtualNode.actualNode) && dom.getElementByReference(virtualNode.actualNode, 'href')) || - !dom.isVisibleToScreenReaders(node) || - isPresentationGraphic(virtualNode) + !dom.isVisibleToScreenReaders(node) ) { // Mark each parent node as having region descendant let vNode = virtualNode; @@ -78,7 +78,8 @@ function findRegionlessElms(virtualNode, options) { // @see https://github.com/dequelabs/axe-core/issues/2049 } else if ( node !== document.body && - dom.hasContent(node, /* noRecursion: */ true) + dom.hasContent(node, /* noRecursion: */ true) && + !isPresentational(node, virtualNode) ) { return [virtualNode]; @@ -91,8 +92,24 @@ function findRegionlessElms(virtualNode, options) { } } -function isPresentationGraphic(virtualNode) { - return virtualNode.props.nodeName === 'img' && virtualNode.attr('alt') === ''; +function isPresentational(node, virtualNode) { + return ( + isShallowlyHidden(virtualNode) && + !hasGlobalAriaAttr(virtualNode) && + !dom.isFocusable(node) + ); +} + +function hasGlobalAriaAttr(virtualNode) { + return standards.getGlobalAriaAttrs().some(attr => virtualNode.hasAttr(attr)); +} + +function isShallowlyHidden(virtualNode) { + // The element itself is not visible to screen readers, but its descendants might be + return ( + getRole(virtualNode, { noPresentational: true }) === null && + !hasChildTextNodes(virtualNode) + ); } // Check if the current element is a landmark diff --git a/test/checks/navigation/region.js b/test/checks/navigation/region.js index 9e6f1acd5..4a1df6db9 100644 --- a/test/checks/navigation/region.js +++ b/test/checks/navigation/region.js @@ -46,8 +46,8 @@ describe('region', function () { assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); }); - it('should return false when img content is outside the region', function () { - var checkArgs = checkSetup(` + it('should return false when img content is outside the region, no alt attribute at all', function () { + const checkArgs = checkSetup(`

`); @@ -56,23 +56,41 @@ describe('region', function () { }); it('should return true when img content outside of the region is decorative, via an empty alt attr', function () { - var checkArgs = checkSetup(` - + const checkArgs = checkSetup(` +
Content
`); assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); }); - it('should return true when img content outside of the region is decorative, via a presentation role', function () { - var checkArgs = checkSetup(` -
Content
`); assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); }); + it('should return false when img content outside of the region is focusable (implicit role=img)', function () { + const checkArgs = checkSetup(` + +
Content
+ `); + + assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + }); + + it('should return false when img content outside of the region has a global aria attribute (implicit role=img)', function () { + const checkArgs = checkSetup(` + +
Content
+ `); + + assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + }); + it('should return true when textless text content is outside the region', function () { var checkArgs = checkSetup( '

Introduction

' From be633afc26fbf797add34f3ddbab7375a222b6a8 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 30 Apr 2024 16:06:31 -0500 Subject: [PATCH 039/400] rely on getRole instead of adding hasGlobalAttr and focusable unecessarily --- lib/checks/navigation/region-evaluate.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/lib/checks/navigation/region-evaluate.js b/lib/checks/navigation/region-evaluate.js index f42593a6b..3c0729840 100644 --- a/lib/checks/navigation/region-evaluate.js +++ b/lib/checks/navigation/region-evaluate.js @@ -50,7 +50,6 @@ function findRegionlessElms(virtualNode, options) { // - a landmark // - a skiplink // - hidden content - // - a presentation graphic if ( getRole(virtualNode) === 'button' || isRegion(virtualNode, options) || @@ -79,7 +78,7 @@ function findRegionlessElms(virtualNode, options) { } else if ( node !== document.body && dom.hasContent(node, /* noRecursion: */ true) && - !isPresentational(node, virtualNode) + !isShallowlyHidden(virtualNode) ) { return [virtualNode]; @@ -92,18 +91,6 @@ function findRegionlessElms(virtualNode, options) { } } -function isPresentational(node, virtualNode) { - return ( - isShallowlyHidden(virtualNode) && - !hasGlobalAriaAttr(virtualNode) && - !dom.isFocusable(node) - ); -} - -function hasGlobalAriaAttr(virtualNode) { - return standards.getGlobalAriaAttrs().some(attr => virtualNode.hasAttr(attr)); -} - function isShallowlyHidden(virtualNode) { // The element itself is not visible to screen readers, but its descendants might be return ( From d51532937dd5bb08b65bf4eddc5b021446a653da Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 30 Apr 2024 16:16:01 -0500 Subject: [PATCH 040/400] additional test for overwritten role with nested child content --- test/checks/navigation/region.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/checks/navigation/region.js b/test/checks/navigation/region.js index 4a1df6db9..a1794d3b3 100644 --- a/test/checks/navigation/region.js +++ b/test/checks/navigation/region.js @@ -203,6 +203,15 @@ describe('region', function () { assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); }); + it('ignores native landmark elements with an overwriting role with a nested child', function () { + var checkArgs = checkSetup(` +

Content

+
Content
+ `); + + assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + }); + it('returns false for content outside of form tags with accessible names', function () { var checkArgs = checkSetup( '

Text

' From 7ac63921e7fab21f3359dcfc8affa7585bc9c25b Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 1 May 2024 11:13:33 -0600 Subject: [PATCH 041/400] fix(aria-allowed-attr): allow meter role allowed aria-* attributes on meter element (#4435) Turns out we didn't list the `meter` element's implicit role. Ref: https://github.com/w3c/html-aria/issues/517 QA notes: verify a `meter` element allows non-global aria attributes from the [`meter` role](https://www.w3.org/TR/wai-aria-1.2/#meter). --- lib/commons/standards/implicit-html-roles.js | 1 + test/integration/rules/aria-allowed-attr/passes.html | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/commons/standards/implicit-html-roles.js b/lib/commons/standards/implicit-html-roles.js index 64455b1cb..b302f0319 100644 --- a/lib/commons/standards/implicit-html-roles.js +++ b/lib/commons/standards/implicit-html-roles.js @@ -151,6 +151,7 @@ const implicitHtmlRoles = { main: 'main', math: 'math', menu: 'list', + meter: 'meter', nav: 'navigation', ol: 'list', optgroup: 'group', diff --git a/test/integration/rules/aria-allowed-attr/passes.html b/test/integration/rules/aria-allowed-attr/passes.html index dfef5d3ed..c1ebea91b 100644 --- a/test/integration/rules/aria-allowed-attr/passes.html +++ b/test/integration/rules/aria-allowed-attr/passes.html @@ -2118,7 +2118,16 @@
- + + 40 + From b29a90d6b4e5c58cfd35ed03777dccc67520d8c5 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Thu, 2 May 2024 08:17:42 -0500 Subject: [PATCH 042/400] Update lib/checks/navigation/region-evaluate.js Co-authored-by: Wilco Fiers --- lib/checks/navigation/region-evaluate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checks/navigation/region-evaluate.js b/lib/checks/navigation/region-evaluate.js index 3c0729840..0e20b472c 100644 --- a/lib/checks/navigation/region-evaluate.js +++ b/lib/checks/navigation/region-evaluate.js @@ -94,7 +94,7 @@ function findRegionlessElms(virtualNode, options) { function isShallowlyHidden(virtualNode) { // The element itself is not visible to screen readers, but its descendants might be return ( - getRole(virtualNode, { noPresentational: true }) === null && + ['none', 'presentation'].includes(getRole(virtualNode)) && !hasChildTextNodes(virtualNode) ); } From 53782f2e765f072da36ede25d8843ed5f6a329db Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 2 May 2024 13:36:47 -0500 Subject: [PATCH 043/400] additional test coverage --- test/checks/navigation/region.js | 36 +++++++++++++++++++ test/integration/full/region/region-fail.html | 5 +++ test/integration/full/region/region-pass.html | 10 ++++++ 3 files changed, 51 insertions(+) diff --git a/test/checks/navigation/region.js b/test/checks/navigation/region.js index a1794d3b3..2620661d9 100644 --- a/test/checks/navigation/region.js +++ b/test/checks/navigation/region.js @@ -91,6 +91,42 @@ describe('region', function () { assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); }); + it('should return true when canvas role=none', function () { + const checkArgs = checkSetup(` + +
Content
+ `); + + assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); + }); + + it('should return false when object has an aria-label', function () { + const checkArgs = checkSetup(` + +
Content
+ `); + + assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + }); + + it('should return false when a non-landmark has text content but a role=none', function () { + const checkArgs = checkSetup(` +
apples
+
Content
+ `); + + assert.isFalse(checkEvaluate.apply(checkContext, checkArgs)); + }); + + it('should return true when a non-landmark does NOT have text content and a role=none', function () { + const checkArgs = checkSetup(` +
+
Content
+ `); + + assert.isTrue(checkEvaluate.apply(checkContext, checkArgs)); + }); + it('should return true when textless text content is outside the region', function () { var checkArgs = checkSetup( '

Introduction

' diff --git a/test/integration/full/region/region-fail.html b/test/integration/full/region/region-fail.html index 79fc58c0f..10971298d 100644 --- a/test/integration/full/region/region-fail.html +++ b/test/integration/full/region/region-fail.html @@ -23,6 +23,11 @@
This is not a skip link. + + + + +
apples

This is a header.

diff --git a/test/integration/full/region/region-pass.html b/test/integration/full/region/region-pass.html index 3c1a88111..b10ad2d69 100644 --- a/test/integration/full/region/region-pass.html +++ b/test/integration/full/region/region-pass.html @@ -20,6 +20,16 @@ + + + + + + + +
+ +

This is a header.

From 8938496442ddc756666df5331cc5593c9dec67e4 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 2 May 2024 14:47:54 -0500 Subject: [PATCH 044/400] targeted test failure cases --- test/integration/full/region/region-fail.html | 21 +++++++++--- test/integration/full/region/region-fail.js | 32 +++++++++++++++++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/test/integration/full/region/region-fail.html b/test/integration/full/region/region-fail.html index 10971298d..6f44a2ead 100644 --- a/test/integration/full/region/region-fail.html +++ b/test/integration/full/region/region-fail.html @@ -23,11 +23,6 @@ This is not a skip link. - - - - -
apples

This is a header.

@@ -45,6 +40,22 @@

This is a header.

+
+ +
+
+ +
+
+ +
+
+ +
+
+
apples
+
+ This should be ignored
diff --git a/test/integration/full/region/region-fail.js b/test/integration/full/region/region-fail.js index a1fd2952a..09e7ae990 100644 --- a/test/integration/full/region/region-fail.js +++ b/test/integration/full/region/region-fail.js @@ -15,12 +15,40 @@ describe('region fail test', function () { }); describe('violations', function () { - it('should find one', function () { - assert.lengthOf(results.violations[0].nodes, 1); + it('should find all violations', function () { + assert.lengthOf(results.violations[0].nodes, 6); }); it('should find wrapper', function () { assert.deepEqual(results.violations[0].nodes[0].target, ['#wrapper']); }); + + it('should find image without an alt tag', function () { + assert.deepEqual(results.violations[0].nodes[1].target, ['#img-no-alt']); + }); + + it('should find focusable image', function () { + assert.deepEqual(results.violations[0].nodes[2].target, [ + '#img-focusable' + ]); + }); + + it('should find image with global aria attr', function () { + assert.deepEqual(results.violations[0].nodes[3].target, [ + '#img-aria-global' + ]); + }); + + it('should find object with a label', function () { + assert.deepEqual(results.violations[0].nodes[4].target, [ + '#labeled-object' + ]); + }); + + it('should find div with an role of none', function () { + assert.deepEqual(results.violations[0].nodes[5].target, [ + '#none-role-div' + ]); + }); }); }); From 738e9e2b41e73e5be5d96c76d9a65666fd88ae73 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Fri, 3 May 2024 08:04:14 -0500 Subject: [PATCH 045/400] Update test/integration/full/region/region-pass.html Co-authored-by: Wilco Fiers --- test/integration/full/region/region-pass.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/full/region/region-pass.html b/test/integration/full/region/region-pass.html index b10ad2d69..1e739bb39 100644 --- a/test/integration/full/region/region-pass.html +++ b/test/integration/full/region/region-pass.html @@ -21,9 +21,9 @@ - + - + From 821b8643fd412fac62c23f4dc74cba150329a5c4 Mon Sep 17 00:00:00 2001 From: API Team CI User Date: Mon, 6 May 2024 12:21:05 +0000 Subject: [PATCH 046/400] chore(release): 4.9.1 --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ bower.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- sri-history.json | 4 ++++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3523aebf7..6b4484f0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,42 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [4.9.1](https://github.com/dequelabs/axe-core/compare/v4.9.0...v4.9.1) (2024-05-06) + +### Bug Fixes + +- **aria-allowed-attr:** allow meter role allowed aria-\* attributes on meter element ([#4435](https://github.com/dequelabs/axe-core/issues/4435)) ([7ac6392](https://github.com/dequelabs/axe-core/commit/7ac63921e7fab21f3359dcfc8affa7585bc9c25b)) +- **aria-allowed-role:** add gridcell, separator, slider and treeitem to allowed roles of button element ([#4398](https://github.com/dequelabs/axe-core/issues/4398)) ([4788bf8](https://github.com/dequelabs/axe-core/commit/4788bf8d6fd963d7b017dad950b122ffcea8d151)) +- **aria-roles:** address pr comments ([2d185f6](https://github.com/dequelabs/axe-core/commit/2d185f65e11c79cddcd48ac66a672866e3f083a3)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** correct abstract roles (types) for aria-roles ([69f778b](https://github.com/dequelabs/axe-core/commit/69f778b71b4c78f89334dcb0c75bedc2005609f5)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** correct abstract roles (types) for aria-roles ([#4421](https://github.com/dequelabs/axe-core/issues/4421)) ([19bde94](https://github.com/dequelabs/axe-core/commit/19bde947907189c22dd34ffd2d5d939aabddbd78)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** exception for focus-order-semantics ([facd65f](https://github.com/dequelabs/axe-core/commit/facd65f6f528122ba9c748e587ae3cf1ebd2a22a)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** inline widgets consider composite type ([aa1aa20](https://github.com/dequelabs/axe-core/commit/aa1aa20043b03bb24783a46e040931804f2a1c5a)) +- **aria-roles:** log and status allowed in focus-order-semantics ([9b15ae0](https://github.com/dequelabs/axe-core/commit/9b15ae0bccbe1dccc637c2de13085f6b7da7f74b)) +- **aria-roles:** reverted test change as well ([417e6b1](https://github.com/dequelabs/axe-core/commit/417e6b1a03d3359db37d87a67f5b2ee9687107c2)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** support window role in valid-scrollable-semantics ([f11c03f](https://github.com/dequelabs/axe-core/commit/f11c03fc73f6a932e320415d8a060dbd17b4a98a)) +- **aria-roles:** table with role application is structure ([ffe37f6](https://github.com/dequelabs/axe-core/commit/ffe37f6f3dfe58f945718581dcdc5c2aef74f498)), closes [#4421](https://github.com/dequelabs/axe-core/issues/4421) +- **aria-roles:** target-size tests consider changed aria roles ([5594d8f](https://github.com/dequelabs/axe-core/commit/5594d8f1ff45703bed81e4a137afb42b6449d0ee)) +- **aria-roles:** updated locales ([bfa95ae](https://github.com/dequelabs/axe-core/commit/bfa95ae2ff233de32390777f735cd35ef1e50fa4)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) +- **aria-roles:** window roles and marque/timer expectations in focus-order-semantics ([d856316](https://github.com/dequelabs/axe-core/commit/d85631696321b0c2def1336d070f188011b779bc)) +- **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([551ba24](https://github.com/dequelabs/axe-core/commit/551ba24efa4108c18fe1a81ae9107d694fa9a5aa)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) +- **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([#4418](https://github.com/dequelabs/axe-core/issues/4418)) ([ef1e09d](https://github.com/dequelabs/axe-core/commit/ef1e09db3cb566e1c243ad797389a1821a4f8361)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) +- **aria-valid-attr-value:** more thorough test coverage ([a823712](https://github.com/dequelabs/axe-core/commit/a82371226d202899325ac661106519e70008cefe)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) +- fix building axe-core translation files with region locales ([#4396](https://github.com/dequelabs/axe-core/issues/4396)) ([5c318f3](https://github.com/dequelabs/axe-core/commit/5c318f3537056be5779cb53374bc6f4785947c91)), closes [#4388](https://github.com/dequelabs/axe-core/issues/4388) +- **invalidrole:** allow upper and mixed case role names ([#4358](https://github.com/dequelabs/axe-core/issues/4358)) ([105016c](https://github.com/dequelabs/axe-core/commit/105016cfe9d82876cfed2ff5c656a7842c5b3761)), closes [#2695](https://github.com/dequelabs/axe-core/issues/2695) +- **isVisibleOnScreen:** account for position: absolute elements inside overflow container ([#4405](https://github.com/dequelabs/axe-core/issues/4405)) ([2940f6e](https://github.com/dequelabs/axe-core/commit/2940f6ee36ba52d8cf089be2a3c8e7c516c81dd6)), closes [#4016](https://github.com/dequelabs/axe-core/issues/4016) +- **label-content-name-mismatch:** 0 for all single char, cjk & x test, ignore cap ([30d8388](https://github.com/dequelabs/axe-core/commit/30d8388976118a0cdc85de2bc939a3c6f9c601ef)), closes [#4402](https://github.com/dequelabs/axe-core/issues/4402) [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([c215a9d](https://github.com/dequelabs/axe-core/commit/c215a9d4888a3702a4d426cd8cddd8dbaeea8640)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([#4402](https://github.com/dequelabs/axe-core/issues/4402)) ([56e139a](https://github.com/dequelabs/axe-core/commit/56e139a6873c33544e946f5060e72cb541ab72c2)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **label-content-name-mismatch:** fewer blocklists, handle all single char alpha the same ([0cd9d71](https://github.com/dequelabs/axe-core/commit/0cd9d71fa3b53bca33905b2a676db522aa923912)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **label-content-name-mismatch:** refactor isHumanInterpretable, tests var -> const ([9ed16e6](https://github.com/dequelabs/axe-core/commit/9ed16e6ffad5343331b46011b27dc2ad28b42cac)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **label-content-name-mismatch:** simpler non-digit check, test added ([c4aa062](https://github.com/dequelabs/axe-core/commit/c4aa0620468573777e43e1914f9995bc6cfb6d89)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) +- **region:** Decorative images ignored by region rule ([#4412](https://github.com/dequelabs/axe-core/issues/4412)) ([f8c918d](https://github.com/dequelabs/axe-core/commit/f8c918d221a78f202fe506c33a4f2e782e98c80d)), closes [/github.com/dequelabs/axe-core/issues/4145#issuecomment-1710302690](https://github.com/dequelabs//github.com/dequelabs/axe-core/issues/4145/issues/issuecomment-1710302690) [#4145](https://github.com/dequelabs/axe-core/issues/4145) +- **region:** img alt='' ignored by region rule ([ace25cd](https://github.com/dequelabs/axe-core/commit/ace25cd51fab327a9a5239608bdfba3bdad2f0ee)), closes [#4145](https://github.com/dequelabs/axe-core/issues/4145) +- **region:** replaces tabs for spaces in prior commit ([7c810e2](https://github.com/dequelabs/axe-core/commit/7c810e2462f41a7181218c108a5d5f8c95e122ba)), closes [#4145](https://github.com/dequelabs/axe-core/issues/4145) +- **target-size:** ignore descendant elements in shadow dom ([#4410](https://github.com/dequelabs/axe-core/issues/4410)) ([6091367](https://github.com/dequelabs/axe-core/commit/6091367a20f70e536fc7e8d77eae4fa7232bc7c0)) +- **target-size:** pass for element that has nearby elements that are obscured ([#4422](https://github.com/dequelabs/axe-core/issues/4422)) ([3a90bb7](https://github.com/dequelabs/axe-core/commit/3a90bb70c8db087b2f03cc30a4aee756995c311c)), closes [#4387](https://github.com/dequelabs/axe-core/issues/4387) + ## [4.9.0](https://github.com/dequelabs/axe-core/compare/v4.8.4...v4.9.0) (2024-03-25) ### Features diff --git a/bower.json b/bower.json index bff620abe..0019b4a63 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "axe-core", - "version": "4.9.0", + "version": "4.9.1", "deprecated": true, "contributors": [ { diff --git a/package-lock.json b/package-lock.json index c337ac05d..428aeba20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "axe-core", - "version": "4.9.0", + "version": "4.9.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "axe-core", - "version": "4.9.0", + "version": "4.9.1", "license": "MPL-2.0", "devDependencies": { "@axe-core/webdriverjs": "^4.5.2", diff --git a/package.json b/package.json index 0dda5cb33..7ba1ddfb1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "axe-core", "description": "Accessibility engine for automated Web UI testing", - "version": "4.9.0", + "version": "4.9.1", "license": "MPL-2.0", "engines": { "node": ">=4" diff --git a/sri-history.json b/sri-history.json index dea6ac5f9..3570d3186 100644 --- a/sri-history.json +++ b/sri-history.json @@ -374,5 +374,9 @@ "4.9.0": { "axe.js": "sha256-76H9rp5bFFzCQrHiNlIEZniM30DftZzZ5pUJd/ZG4Qg=", "axe.min.js": "sha256-leYBst5Y3dlncZ2YVBpe5s//BhrMC7XbK9yhUCAyPNA=" + }, + "4.9.1": { + "axe.js": "sha256-t7u8FiO2U54AN0dyGu2hAMcYdgpuXEkM6n+Eup6lMyQ=", + "axe.min.js": "sha256-GCpA3F2CB+YmwJhhrWUCfUXoXjpW0BBF0Gji6I7kMuo=" } } From a2b8da3385243a78bd3b4d527b07b067e3a73e32 Mon Sep 17 00:00:00 2001 From: Wilco Fiers Date: Mon, 6 May 2024 14:53:01 +0200 Subject: [PATCH 047/400] Update changelog --- CHANGELOG.md | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b4484f0b..5fea1731b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,33 +8,13 @@ All notable changes to this project will be documented in this file. See [standa - **aria-allowed-attr:** allow meter role allowed aria-\* attributes on meter element ([#4435](https://github.com/dequelabs/axe-core/issues/4435)) ([7ac6392](https://github.com/dequelabs/axe-core/commit/7ac63921e7fab21f3359dcfc8affa7585bc9c25b)) - **aria-allowed-role:** add gridcell, separator, slider and treeitem to allowed roles of button element ([#4398](https://github.com/dequelabs/axe-core/issues/4398)) ([4788bf8](https://github.com/dequelabs/axe-core/commit/4788bf8d6fd963d7b017dad950b122ffcea8d151)) -- **aria-roles:** address pr comments ([2d185f6](https://github.com/dequelabs/axe-core/commit/2d185f65e11c79cddcd48ac66a672866e3f083a3)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** correct abstract roles (types) for aria-roles ([69f778b](https://github.com/dequelabs/axe-core/commit/69f778b71b4c78f89334dcb0c75bedc2005609f5)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** correct abstract roles (types) for aria-roles ([#4421](https://github.com/dequelabs/axe-core/issues/4421)) ([19bde94](https://github.com/dequelabs/axe-core/commit/19bde947907189c22dd34ffd2d5d939aabddbd78)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** exception for focus-order-semantics ([facd65f](https://github.com/dequelabs/axe-core/commit/facd65f6f528122ba9c748e587ae3cf1ebd2a22a)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** inline widgets consider composite type ([aa1aa20](https://github.com/dequelabs/axe-core/commit/aa1aa20043b03bb24783a46e040931804f2a1c5a)) -- **aria-roles:** log and status allowed in focus-order-semantics ([9b15ae0](https://github.com/dequelabs/axe-core/commit/9b15ae0bccbe1dccc637c2de13085f6b7da7f74b)) -- **aria-roles:** reverted test change as well ([417e6b1](https://github.com/dequelabs/axe-core/commit/417e6b1a03d3359db37d87a67f5b2ee9687107c2)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** support window role in valid-scrollable-semantics ([f11c03f](https://github.com/dequelabs/axe-core/commit/f11c03fc73f6a932e320415d8a060dbd17b4a98a)) -- **aria-roles:** table with role application is structure ([ffe37f6](https://github.com/dequelabs/axe-core/commit/ffe37f6f3dfe58f945718581dcdc5c2aef74f498)), closes [#4421](https://github.com/dequelabs/axe-core/issues/4421) -- **aria-roles:** target-size tests consider changed aria roles ([5594d8f](https://github.com/dequelabs/axe-core/commit/5594d8f1ff45703bed81e4a137afb42b6449d0ee)) -- **aria-roles:** updated locales ([bfa95ae](https://github.com/dequelabs/axe-core/commit/bfa95ae2ff233de32390777f735cd35ef1e50fa4)), closes [#4371](https://github.com/dequelabs/axe-core/issues/4371) -- **aria-roles:** window roles and marque/timer expectations in focus-order-semantics ([d856316](https://github.com/dequelabs/axe-core/commit/d85631696321b0c2def1336d070f188011b779bc)) -- **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([551ba24](https://github.com/dequelabs/axe-core/commit/551ba24efa4108c18fe1a81ae9107d694fa9a5aa)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) -- **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([#4418](https://github.com/dequelabs/axe-core/issues/4418)) ([ef1e09d](https://github.com/dequelabs/axe-core/commit/ef1e09db3cb566e1c243ad797389a1821a4f8361)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) -- **aria-valid-attr-value:** more thorough test coverage ([a823712](https://github.com/dequelabs/axe-core/commit/a82371226d202899325ac661106519e70008cefe)), closes [#4363](https://github.com/dequelabs/axe-core/issues/4363) +- **aria-roles:** correct abstract roles (types) for aria-roles([#4421](https://github.com/dequelabs/axe-core/pull/4421)) +- **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([#4418](https://github.com/dequelabs/axe-core/pull/4418)) - fix building axe-core translation files with region locales ([#4396](https://github.com/dequelabs/axe-core/issues/4396)) ([5c318f3](https://github.com/dequelabs/axe-core/commit/5c318f3537056be5779cb53374bc6f4785947c91)), closes [#4388](https://github.com/dequelabs/axe-core/issues/4388) - **invalidrole:** allow upper and mixed case role names ([#4358](https://github.com/dequelabs/axe-core/issues/4358)) ([105016c](https://github.com/dequelabs/axe-core/commit/105016cfe9d82876cfed2ff5c656a7842c5b3761)), closes [#2695](https://github.com/dequelabs/axe-core/issues/2695) - **isVisibleOnScreen:** account for position: absolute elements inside overflow container ([#4405](https://github.com/dequelabs/axe-core/issues/4405)) ([2940f6e](https://github.com/dequelabs/axe-core/commit/2940f6ee36ba52d8cf089be2a3c8e7c516c81dd6)), closes [#4016](https://github.com/dequelabs/axe-core/issues/4016) -- **label-content-name-mismatch:** 0 for all single char, cjk & x test, ignore cap ([30d8388](https://github.com/dequelabs/axe-core/commit/30d8388976118a0cdc85de2bc939a3c6f9c601ef)), closes [#4402](https://github.com/dequelabs/axe-core/issues/4402) [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([c215a9d](https://github.com/dequelabs/axe-core/commit/c215a9d4888a3702a4d426cd8cddd8dbaeea8640)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([#4402](https://github.com/dequelabs/axe-core/issues/4402)) ([56e139a](https://github.com/dequelabs/axe-core/commit/56e139a6873c33544e946f5060e72cb541ab72c2)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **label-content-name-mismatch:** fewer blocklists, handle all single char alpha the same ([0cd9d71](https://github.com/dequelabs/axe-core/commit/0cd9d71fa3b53bca33905b2a676db522aa923912)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **label-content-name-mismatch:** refactor isHumanInterpretable, tests var -> const ([9ed16e6](https://github.com/dequelabs/axe-core/commit/9ed16e6ffad5343331b46011b27dc2ad28b42cac)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **label-content-name-mismatch:** simpler non-digit check, test added ([c4aa062](https://github.com/dequelabs/axe-core/commit/c4aa0620468573777e43e1914f9995bc6cfb6d89)), closes [#4386](https://github.com/dequelabs/axe-core/issues/4386) -- **region:** Decorative images ignored by region rule ([#4412](https://github.com/dequelabs/axe-core/issues/4412)) ([f8c918d](https://github.com/dequelabs/axe-core/commit/f8c918d221a78f202fe506c33a4f2e782e98c80d)), closes [/github.com/dequelabs/axe-core/issues/4145#issuecomment-1710302690](https://github.com/dequelabs//github.com/dequelabs/axe-core/issues/4145/issues/issuecomment-1710302690) [#4145](https://github.com/dequelabs/axe-core/issues/4145) -- **region:** img alt='' ignored by region rule ([ace25cd](https://github.com/dequelabs/axe-core/commit/ace25cd51fab327a9a5239608bdfba3bdad2f0ee)), closes [#4145](https://github.com/dequelabs/axe-core/issues/4145) -- **region:** replaces tabs for spaces in prior commit ([7c810e2](https://github.com/dequelabs/axe-core/commit/7c810e2462f41a7181218c108a5d5f8c95e122ba)), closes [#4145](https://github.com/dequelabs/axe-core/issues/4145) +- **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([#4402](https://github.com/dequelabs/axe-core/issues/4402)) +- **region:** Decorative images ignored by region rule ([#4412](https://github.com/dequelabs/axe-core/pull/4412)) - **target-size:** ignore descendant elements in shadow dom ([#4410](https://github.com/dequelabs/axe-core/issues/4410)) ([6091367](https://github.com/dequelabs/axe-core/commit/6091367a20f70e536fc7e8d77eae4fa7232bc7c0)) - **target-size:** pass for element that has nearby elements that are obscured ([#4422](https://github.com/dequelabs/axe-core/issues/4422)) ([3a90bb7](https://github.com/dequelabs/axe-core/commit/3a90bb70c8db087b2f03cc30a4aee756995c311c)), closes [#4387](https://github.com/dequelabs/axe-core/issues/4387) From 0f2b8accb80204bccac97513b50c9696327bffea Mon Sep 17 00:00:00 2001 From: Wilco Fiers Date: Mon, 6 May 2024 16:06:32 +0200 Subject: [PATCH 048/400] chore(changelog): Update for 4.9.1 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fea1731b..f46427060 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +- Prevent errors when loading axe in a page with prototype.js - **aria-allowed-attr:** allow meter role allowed aria-\* attributes on meter element ([#4435](https://github.com/dequelabs/axe-core/issues/4435)) ([7ac6392](https://github.com/dequelabs/axe-core/commit/7ac63921e7fab21f3359dcfc8affa7585bc9c25b)) - **aria-allowed-role:** add gridcell, separator, slider and treeitem to allowed roles of button element ([#4398](https://github.com/dequelabs/axe-core/issues/4398)) ([4788bf8](https://github.com/dequelabs/axe-core/commit/4788bf8d6fd963d7b017dad950b122ffcea8d151)) - **aria-roles:** correct abstract roles (types) for aria-roles([#4421](https://github.com/dequelabs/axe-core/pull/4421)) From ebb1b954251ae14402a5b6d402b9f0682819b967 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 6 May 2024 12:45:10 -0400 Subject: [PATCH 049/400] test: update `@axe-core/webdriverjs` package (#4442) update to use the latest version of `@axe-core/webdriverjs` --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 428aeba20..a350752a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "4.9.1", "license": "MPL-2.0", "devDependencies": { - "@axe-core/webdriverjs": "^4.5.2", + "@axe-core/webdriverjs": "^4.9.0", "@babel/core": "^7.20.12", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/preset-env": "^7.20.2", diff --git a/package.json b/package.json index 7ba1ddfb1..febd3e7a1 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "postbuild": "prettier --write ./locales/_template.json ./doc/rule-descriptions.md" }, "devDependencies": { - "@axe-core/webdriverjs": "^4.5.2", + "@axe-core/webdriverjs": "^4.9.0", "@babel/core": "^7.20.12", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/preset-env": "^7.20.2", From 3d36f977a5a50bac54bd5bfc5bef5a98e93306ef Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Tue, 7 May 2024 08:01:34 -0500 Subject: [PATCH 050/400] build: lint-staged prettier before eslint (#4445) prettier autofixes some issues eslint finds, letting prettier run first leads to less developer hassle for example, I've forgotten for weeks to change how my editor does tabs instead of spaces and I've been manually running `npm run fmt` to get around this. While yes I will also correct my editor, this feels like a positive change for all contributors << Describe the changes >> Closes: --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index febd3e7a1..9b02b6461 100644 --- a/package.json +++ b/package.json @@ -189,8 +189,8 @@ "prettier --write" ], "*.js": [ - "eslint --fix", - "prettier --write" + "prettier --write", + "eslint --fix" ] } } From b523acea66ff5788b7f04cb857972b1e90717c54 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Tue, 7 May 2024 17:26:04 -0500 Subject: [PATCH 051/400] style(lib/checks): var -> let and const codemod (#4451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a piece of a larger creative time PR so it's easier to review, the full scope can be seen here and includes eslint adjustments not seen here https://github.com/dequelabs/axe-core/pull/4444 --- Who else does this? - Google (JS style guide) https://google.github.io/styleguide/jsguide.html#features-local-variable-declarations - Airbnb (popular JS style guide) https://github.com/airbnb/javascript Why do this? Gaiety's explanation: "`let` works the way most devs think `var` works. scope leaking and variable hoisting is a messy confusing idea, JS got updated for a reason" also it's 2024, this isn't too controversial anymore - https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/ - https://blog.javascripttoday.com/blog/var-vs-let-vs-const/ "The var keyword was originally used for declaring variables in JavaScript. If you’ve browsed an old codebase or an older JavaScript tutorial, you have probably seen it." - https://medium.com/@rithinmenezes/understanding-let-var-and-const-in-javascript-a-guide-to-variable-declarations-f271c5b8dc79 - Airbnb's why https://airbnb.io/javascript/#variables --- .../aria/aria-required-parent-evaluate.js | 4 ++-- .../valid-scrollable-semantics-evaluate.js | 2 +- .../color/link-in-text-block-evaluate.js | 22 +++++++++---------- .../link-in-text-block-style-evaluate.js | 4 ++-- lib/checks/keyboard/accesskeys-after.js | 4 ++-- .../landmark-is-top-level-evaluate.js | 8 +++---- .../label/help-same-as-label-evaluate.js | 6 ++--- .../landmarks/landmark-is-unique-after.js | 6 ++--- .../landmarks/landmark-is-unique-evaluate.js | 4 ++-- .../lists/structured-dlitems-evaluate.js | 2 +- .../navigation/unique-frame-title-after.js | 2 +- .../navigation/unique-frame-title-evaluate.js | 2 +- lib/checks/parsing/duplicate-id-after.js | 2 +- lib/checks/shared/doc-has-title-evaluate.js | 2 +- lib/checks/tables/caption-faked-evaluate.js | 4 ++-- .../tables/same-caption-summary-evaluate.js | 6 ++--- lib/checks/tables/scope-value-evaluate.js | 2 +- 17 files changed, 41 insertions(+), 41 deletions(-) diff --git a/lib/checks/aria/aria-required-parent-evaluate.js b/lib/checks/aria/aria-required-parent-evaluate.js index c985cedc2..a374f0aea 100644 --- a/lib/checks/aria/aria-required-parent-evaluate.js +++ b/lib/checks/aria/aria-required-parent-evaluate.js @@ -48,8 +48,8 @@ function getMissingContext( } function getAriaOwners(element) { - var owners = [], - o = null; + const owners = []; + let o = null; while (element) { if (element.getAttribute('id')) { diff --git a/lib/checks/aria/valid-scrollable-semantics-evaluate.js b/lib/checks/aria/valid-scrollable-semantics-evaluate.js index fef446f35..0241f6cf8 100644 --- a/lib/checks/aria/valid-scrollable-semantics-evaluate.js +++ b/lib/checks/aria/valid-scrollable-semantics-evaluate.js @@ -51,7 +51,7 @@ function validScrollableTagName(node) { * region. */ function validScrollableRole(node, options) { - var role = getExplicitRole(node); + const role = getExplicitRole(node); if (!role) { return false; } diff --git a/lib/checks/color/link-in-text-block-evaluate.js b/lib/checks/color/link-in-text-block-evaluate.js index acadb1aec..1cda34473 100644 --- a/lib/checks/color/link-in-text-block-evaluate.js +++ b/lib/checks/color/link-in-text-block-evaluate.js @@ -6,8 +6,8 @@ import { } from '../../commons/color'; function getContrast(color1, color2) { - var c1lum = color1.getRelativeLuminance(); - var c2lum = color2.getRelativeLuminance(); + const c1lum = color1.getRelativeLuminance(); + const c2lum = color2.getRelativeLuminance(); return (Math.max(c1lum, c2lum) + 0.05) / (Math.min(c1lum, c2lum) + 0.05); } @@ -20,7 +20,7 @@ const blockLike = [ 'inline-block' ]; function isBlock(elm) { - var display = window.getComputedStyle(elm).getPropertyValue('display'); + const display = window.getComputedStyle(elm).getPropertyValue('display'); return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-'; } @@ -31,7 +31,7 @@ function linkInTextBlockEvaluate(node, options) { return false; } - var parentBlock = getComposedParent(node); + let parentBlock = getComposedParent(node); while (parentBlock && parentBlock.nodeType === 1 && !isBlock(parentBlock)) { parentBlock = getComposedParent(parentBlock); } @@ -43,13 +43,13 @@ function linkInTextBlockEvaluate(node, options) { this.relatedNodes([parentBlock]); // Capture colors - var nodeColor = getForegroundColor(node); - var parentColor = getForegroundColor(parentBlock); - var nodeBackgroundColor = getBackgroundColor(node); - var parentBackgroundColor = getBackgroundColor(parentBlock); + const nodeColor = getForegroundColor(node); + const parentColor = getForegroundColor(parentBlock); + const nodeBackgroundColor = getBackgroundColor(node); + const parentBackgroundColor = getBackgroundColor(parentBlock); // Compute contrasts, giving preference to foreground color and doing as little work as possible - var textContrast = + let textContrast = nodeColor && parentColor ? getContrast(nodeColor, parentColor) : undefined; if (textContrast) { textContrast = Math.floor(textContrast * 100) / 100; @@ -59,7 +59,7 @@ function linkInTextBlockEvaluate(node, options) { return true; } - var backgroundContrast = + let backgroundContrast = nodeBackgroundColor && parentBackgroundColor ? getContrast(nodeBackgroundColor, parentBackgroundColor) : undefined; @@ -74,7 +74,7 @@ function linkInTextBlockEvaluate(node, options) { // Report incomplete instead of failure if we're not sure if (!backgroundContrast) { - var reason = incompleteData.get('bgColor') ?? 'bgContrast'; + const reason = incompleteData.get('bgColor') ?? 'bgContrast'; this.data({ messageKey: reason }); diff --git a/lib/checks/color/link-in-text-block-style-evaluate.js b/lib/checks/color/link-in-text-block-style-evaluate.js index e07929ea4..e1e0f5373 100644 --- a/lib/checks/color/link-in-text-block-style-evaluate.js +++ b/lib/checks/color/link-in-text-block-style-evaluate.js @@ -15,7 +15,7 @@ export default function linkInTextBlockStyleEvaluate(node) { return false; } - var parentBlock = getComposedParent(node); + let parentBlock = getComposedParent(node); while (parentBlock && parentBlock.nodeType === 1 && !isBlock(parentBlock)) { parentBlock = getComposedParent(parentBlock); } @@ -37,7 +37,7 @@ export default function linkInTextBlockStyleEvaluate(node) { } function isBlock(elm) { - var display = window.getComputedStyle(elm).getPropertyValue('display'); + const display = window.getComputedStyle(elm).getPropertyValue('display'); return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-'; } diff --git a/lib/checks/keyboard/accesskeys-after.js b/lib/checks/keyboard/accesskeys-after.js index ec65c48f4..13a0ff489 100644 --- a/lib/checks/keyboard/accesskeys-after.js +++ b/lib/checks/keyboard/accesskeys-after.js @@ -1,11 +1,11 @@ function accesskeysAfter(results) { - var seen = {}; + const seen = {}; return results .filter(r => { if (!r.data) { return false; } - var key = r.data.toUpperCase(); + const key = r.data.toUpperCase(); if (!seen[key]) { seen[key] = r; r.relatedNodes = []; diff --git a/lib/checks/keyboard/landmark-is-top-level-evaluate.js b/lib/checks/keyboard/landmark-is-top-level-evaluate.js index 15ba47200..4fbd93d73 100644 --- a/lib/checks/keyboard/landmark-is-top-level-evaluate.js +++ b/lib/checks/keyboard/landmark-is-top-level-evaluate.js @@ -3,14 +3,14 @@ import { getAriaRolesByType } from '../../commons/standards'; import { getComposedParent } from '../../commons/dom'; function landmarkIsTopLevelEvaluate(node) { - var landmarks = getAriaRolesByType('landmark'); - var parent = getComposedParent(node); - var nodeRole = getRole(node); + const landmarks = getAriaRolesByType('landmark'); + let parent = getComposedParent(node); + const nodeRole = getRole(node); this.data({ role: nodeRole }); while (parent) { - var role = parent.getAttribute('role'); + let role = parent.getAttribute('role'); if (!role && parent.nodeName.toUpperCase() !== 'FORM') { role = implicitRole(parent); } diff --git a/lib/checks/label/help-same-as-label-evaluate.js b/lib/checks/label/help-same-as-label-evaluate.js index 61262e0fa..47b15769f 100644 --- a/lib/checks/label/help-same-as-label-evaluate.js +++ b/lib/checks/label/help-same-as-label-evaluate.js @@ -2,8 +2,8 @@ import { labelVirtual, accessibleText, sanitize } from '../../commons/text'; import { idrefs } from '../../commons/dom'; function helpSameAsLabelEvaluate(node, options, virtualNode) { - var labelText = labelVirtual(virtualNode), - check = node.getAttribute('title'); + const labelText = labelVirtual(virtualNode); + let check = node.getAttribute('title'); if (!labelText) { return false; @@ -13,7 +13,7 @@ function helpSameAsLabelEvaluate(node, options, virtualNode) { check = ''; if (node.getAttribute('aria-describedby')) { - var ref = idrefs(node, 'aria-describedby'); + const ref = idrefs(node, 'aria-describedby'); check = ref .map(thing => { return thing ? accessibleText(thing) : ''; diff --git a/lib/checks/landmarks/landmark-is-unique-after.js b/lib/checks/landmarks/landmark-is-unique-after.js index eb57c4da3..fd4eb2ec1 100644 --- a/lib/checks/landmarks/landmark-is-unique-after.js +++ b/lib/checks/landmarks/landmark-is-unique-after.js @@ -1,17 +1,17 @@ function landmarkIsUniqueAfter(results) { - var uniqueLandmarks = []; + const uniqueLandmarks = []; // filter out landmark elements that share the same role and accessible text // so every non-unique landmark isn't reported as a failure (just the first) return results.filter(currentResult => { - var findMatch = someResult => { + const findMatch = someResult => { return ( currentResult.data.role === someResult.data.role && currentResult.data.accessibleText === someResult.data.accessibleText ); }; - var matchedResult = uniqueLandmarks.find(findMatch); + const matchedResult = uniqueLandmarks.find(findMatch); if (matchedResult) { matchedResult.result = false; matchedResult.relatedNodes.push(currentResult.relatedNodes[0]); diff --git a/lib/checks/landmarks/landmark-is-unique-evaluate.js b/lib/checks/landmarks/landmark-is-unique-evaluate.js index f8f073d19..f8375fed5 100644 --- a/lib/checks/landmarks/landmark-is-unique-evaluate.js +++ b/lib/checks/landmarks/landmark-is-unique-evaluate.js @@ -2,8 +2,8 @@ import { getRole } from '../../commons/aria'; import { accessibleTextVirtual } from '../../commons/text'; function landmarkIsUniqueEvaluate(node, options, virtualNode) { - var role = getRole(node); - var accessibleText = accessibleTextVirtual(virtualNode); + const role = getRole(node); + let accessibleText = accessibleTextVirtual(virtualNode); accessibleText = accessibleText ? accessibleText.toLowerCase() : null; this.data({ role: role, accessibleText: accessibleText }); this.relatedNodes([node]); diff --git a/lib/checks/lists/structured-dlitems-evaluate.js b/lib/checks/lists/structured-dlitems-evaluate.js index b13fbc980..ad2d7f837 100644 --- a/lib/checks/lists/structured-dlitems-evaluate.js +++ b/lib/checks/lists/structured-dlitems-evaluate.js @@ -7,7 +7,7 @@ function structuredDlitemsEvaluate(node, options, virtualNode) { let hasDt = false, hasDd = false, nodeName; - for (var i = 0; i < children.length; i++) { + for (let i = 0; i < children.length; i++) { nodeName = children[i].props.nodeName.toUpperCase(); if (nodeName === 'DT') { hasDt = true; diff --git a/lib/checks/navigation/unique-frame-title-after.js b/lib/checks/navigation/unique-frame-title-after.js index a0f2bb4be..e4a017219 100644 --- a/lib/checks/navigation/unique-frame-title-after.js +++ b/lib/checks/navigation/unique-frame-title-after.js @@ -1,5 +1,5 @@ function uniqueFrameTitleAfter(results) { - var titles = {}; + const titles = {}; results.forEach(r => { titles[r.data] = titles[r.data] !== undefined ? ++titles[r.data] : 0; }); diff --git a/lib/checks/navigation/unique-frame-title-evaluate.js b/lib/checks/navigation/unique-frame-title-evaluate.js index 85e2eed58..e00595a6b 100644 --- a/lib/checks/navigation/unique-frame-title-evaluate.js +++ b/lib/checks/navigation/unique-frame-title-evaluate.js @@ -1,7 +1,7 @@ import { sanitize } from '../../commons/text'; function uniqueFrameTitleEvaluate(node, options, vNode) { - var title = sanitize(vNode.attr('title')).toLowerCase(); + const title = sanitize(vNode.attr('title')).toLowerCase(); this.data(title); return true; } diff --git a/lib/checks/parsing/duplicate-id-after.js b/lib/checks/parsing/duplicate-id-after.js index 7e170feb9..e6a587185 100644 --- a/lib/checks/parsing/duplicate-id-after.js +++ b/lib/checks/parsing/duplicate-id-after.js @@ -1,5 +1,5 @@ function duplicateIdAfter(results) { - var uniqueIds = []; + const uniqueIds = []; return results.filter(r => { if (uniqueIds.indexOf(r.data) === -1) { uniqueIds.push(r.data); diff --git a/lib/checks/shared/doc-has-title-evaluate.js b/lib/checks/shared/doc-has-title-evaluate.js index 9a1de035c..928154796 100644 --- a/lib/checks/shared/doc-has-title-evaluate.js +++ b/lib/checks/shared/doc-has-title-evaluate.js @@ -1,7 +1,7 @@ import { sanitize } from '../../commons/text'; function docHasTitleEvaluate() { - var title = document.title; + const title = document.title; return !!sanitize(title); } diff --git a/lib/checks/tables/caption-faked-evaluate.js b/lib/checks/tables/caption-faked-evaluate.js index 18a1bf2e0..2e9984971 100644 --- a/lib/checks/tables/caption-faked-evaluate.js +++ b/lib/checks/tables/caption-faked-evaluate.js @@ -1,8 +1,8 @@ import { toGrid } from '../../commons/table'; function captionFakedEvaluate(node) { - var table = toGrid(node); - var firstRow = table[0]; + const table = toGrid(node); + const firstRow = table[0]; if (table.length <= 1 || firstRow.length <= 1 || node.rows.length <= 1) { return true; diff --git a/lib/checks/tables/same-caption-summary-evaluate.js b/lib/checks/tables/same-caption-summary-evaluate.js index 6aafd3f08..2a2a9552e 100644 --- a/lib/checks/tables/same-caption-summary-evaluate.js +++ b/lib/checks/tables/same-caption-summary-evaluate.js @@ -7,9 +7,9 @@ function sameCaptionSummaryEvaluate(node, options, virtualNode) { return undefined; } - var summary = virtualNode.attr('summary'); - var captionNode = virtualNode.children.find(isCaptionNode); - var caption = captionNode ? sanitize(subtreeText(captionNode)) : false; + const summary = virtualNode.attr('summary'); + const captionNode = virtualNode.children.find(isCaptionNode); + const caption = captionNode ? sanitize(subtreeText(captionNode)) : false; if (!caption || !summary) { return false; diff --git a/lib/checks/tables/scope-value-evaluate.js b/lib/checks/tables/scope-value-evaluate.js index 91e6b87c0..170e8d7fc 100644 --- a/lib/checks/tables/scope-value-evaluate.js +++ b/lib/checks/tables/scope-value-evaluate.js @@ -1,5 +1,5 @@ function scopeValueEvaluate(node, options) { - var value = node.getAttribute('scope').toLowerCase(); + const value = node.getAttribute('scope').toLowerCase(); return options.values.indexOf(value) !== -1; } From 00b9fba1f6bd7f9d050f76da62f7623cf30bdfe8 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 8 May 2024 07:48:45 -0600 Subject: [PATCH 052/400] test: rename generic test titles (#4453) These tests failed while in-development of https://github.com/dequelabs/axe-core/pull/4452 and it really confused me. Based on how the title is written, I initially thought that it was making sure that `.selector` (etc.) for the DqElement prototype function was never called. But what it's really making sure is that the `.selector` (etc.) property is not called for the one node. The reason that distinction matters is because `processAggregate` calls `nodeSerializer` which in turn calls the `toJSON` method of a DqElement, which calls the `.selector` (etc.) property. So it would be impossible to never call the DqElement properties. --- test/core/reporters/helpers/process-aggregate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/core/reporters/helpers/process-aggregate.js b/test/core/reporters/helpers/process-aggregate.js index 32f4f072c..9265f67be 100644 --- a/test/core/reporters/helpers/process-aggregate.js +++ b/test/core/reporters/helpers/process-aggregate.js @@ -317,7 +317,7 @@ describe('helpers.processAggregate', function () { ); }); - it('should not call DqElement.selector', () => { + it('should not call the nodes selector property', () => { const dqElm = new axe.utils.DqElement(fixture); Object.defineProperty(dqElm, 'selector', { get() { @@ -381,7 +381,7 @@ describe('helpers.processAggregate', function () { ); }); - it('should not call DqElement.ancestry', () => { + it('should not call the nodes ancestry property', () => { const dqElm = new axe.utils.DqElement(fixture, options, { selector: ['div'] // prevent axe._selectorData error }); @@ -446,7 +446,7 @@ describe('helpers.processAggregate', function () { ); }); - it('should not call DqElement.xpath', () => { + it('should not call the nodes xpath property', () => { const dqElm = new axe.utils.DqElement(fixture, options, { selector: ['div'] // prevent axe._selectorData error }); From a32eb3aec5fe58f527e1eb0dfbfb1d9454c0a4e6 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Fri, 10 May 2024 13:31:02 -0500 Subject: [PATCH 053/400] style(lib/commons): var -> let and const codemod (#4455) Just like https://github.com/dequelabs/axe-core/pull/4451 but for `lib/commons` Smaller part of the full vision: https://github.com/dequelabs/axe-core/pull/4444 --- lib/commons/color/element-is-distinct.js | 12 +++++----- lib/commons/color/flatten-shadow-colors.js | 10 ++++----- lib/commons/color/get-background-stack.js | 2 +- lib/commons/color/get-contrast.js | 4 ++-- lib/commons/color/has-valid-contrast-ratio.js | 6 ++--- lib/commons/dom/get-composed-parent.js | 2 +- lib/commons/dom/get-element-coordinates.js | 2 +- lib/commons/dom/get-scroll-offset.js | 2 +- lib/commons/dom/has-content-virtual.js | 2 +- lib/commons/dom/is-focusable.js | 2 +- lib/commons/dom/is-in-text-block.js | 4 ++-- lib/commons/dom/visually-overlaps.js | 10 ++++----- lib/commons/index.js | 2 +- lib/commons/table/get-all-cells.js | 4 ++-- lib/commons/table/get-cell-position.js | 2 +- lib/commons/table/is-data-table.js | 22 +++++++++---------- lib/commons/table/to-grid.js | 16 +++++++------- lib/commons/text/label-virtual.js | 2 +- 18 files changed, 53 insertions(+), 53 deletions(-) diff --git a/lib/commons/color/element-is-distinct.js b/lib/commons/color/element-is-distinct.js index a3ff6a6fa..ddb6c91cd 100644 --- a/lib/commons/color/element-is-distinct.js +++ b/lib/commons/color/element-is-distinct.js @@ -25,7 +25,7 @@ function _getFonts(style) { * @return {Boolean} */ function elementIsDistinct(node, ancestorNode) { - var nodeStyle = window.getComputedStyle(node); + const nodeStyle = window.getComputedStyle(node); // Check if the link has a background if (nodeStyle.getPropertyValue('background-image') !== 'none') { @@ -33,9 +33,9 @@ function elementIsDistinct(node, ancestorNode) { } // Check if the link has a border or outline - var hasBorder = ['border-bottom', 'border-top', 'outline'].reduce( + const hasBorder = ['border-bottom', 'border-top', 'outline'].reduce( (result, edge) => { - var borderClr = new Color(); + const borderClr = new Color(); borderClr.parseString(nodeStyle.getPropertyValue(edge + '-color')); // Check if a border/outline was specified @@ -54,13 +54,13 @@ function elementIsDistinct(node, ancestorNode) { return true; } - var parentStyle = window.getComputedStyle(ancestorNode); + const parentStyle = window.getComputedStyle(ancestorNode); // Compare fonts if (_getFonts(nodeStyle)[0] !== _getFonts(parentStyle)[0]) { return true; } - var hasStyle = [ + let hasStyle = [ 'text-decoration-line', 'text-decoration-style', 'font-weight', @@ -74,7 +74,7 @@ function elementIsDistinct(node, ancestorNode) { ); }, false); - var tDec = nodeStyle.getPropertyValue('text-decoration'); + const tDec = nodeStyle.getPropertyValue('text-decoration'); if (tDec.split(' ').length < 3) { // old style CSS text decoration hasStyle = diff --git a/lib/commons/color/flatten-shadow-colors.js b/lib/commons/color/flatten-shadow-colors.js index 448462367..c4cfcba87 100644 --- a/lib/commons/color/flatten-shadow-colors.js +++ b/lib/commons/color/flatten-shadow-colors.js @@ -11,11 +11,11 @@ import Color from './color'; * @return {Color} Blended color */ export default function flattenShadowColors(fgColor, bgColor) { - var alpha = fgColor.alpha; - var r = (1 - alpha) * bgColor.red + alpha * fgColor.red; - var g = (1 - alpha) * bgColor.green + alpha * fgColor.green; - var b = (1 - alpha) * bgColor.blue + alpha * fgColor.blue; - var a = fgColor.alpha + bgColor.alpha * (1 - fgColor.alpha); + const alpha = fgColor.alpha; + const r = (1 - alpha) * bgColor.red + alpha * fgColor.red; + const g = (1 - alpha) * bgColor.green + alpha * fgColor.green; + const b = (1 - alpha) * bgColor.blue + alpha * fgColor.blue; + const a = fgColor.alpha + bgColor.alpha * (1 - fgColor.alpha); return new Color(r, g, b, a); } diff --git a/lib/commons/color/get-background-stack.js b/lib/commons/color/get-background-stack.js index cf417fcea..652c1596d 100644 --- a/lib/commons/color/get-background-stack.js +++ b/lib/commons/color/get-background-stack.js @@ -98,7 +98,7 @@ function shallowArraysEqual(a, b) { return false; } - for (var i = 0; i < a.length; ++i) { + for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) { return false; } diff --git a/lib/commons/color/get-contrast.js b/lib/commons/color/get-contrast.js index 1ece583cc..f70af85af 100644 --- a/lib/commons/color/get-contrast.js +++ b/lib/commons/color/get-contrast.js @@ -18,8 +18,8 @@ function getContrast(bgColor, fgColor) { fgColor = flattenColors(fgColor, bgColor); } - var bL = bgColor.getRelativeLuminance(); - var fL = fgColor.getRelativeLuminance(); + const bL = bgColor.getRelativeLuminance(); + const fL = fgColor.getRelativeLuminance(); return (Math.max(fL, bL) + 0.05) / (Math.min(fL, bL) + 0.05); } diff --git a/lib/commons/color/has-valid-contrast-ratio.js b/lib/commons/color/has-valid-contrast-ratio.js index 3259ed3fe..e68024eb7 100644 --- a/lib/commons/color/has-valid-contrast-ratio.js +++ b/lib/commons/color/has-valid-contrast-ratio.js @@ -14,11 +14,11 @@ import getContrast from './get-contrast'; * @deprecated */ function hasValidContrastRatio(bg, fg, fontSize, isBold) { - var contrast = getContrast(bg, fg); - var isSmallFont = + const contrast = getContrast(bg, fg); + const isSmallFont = (isBold && Math.ceil(fontSize * 72) / 96 < 14) || (!isBold && Math.ceil(fontSize * 72) / 96 < 18); - var expectedContrastRatio = isSmallFont ? 4.5 : 3; + const expectedContrastRatio = isSmallFont ? 4.5 : 3; return { isValid: contrast > expectedContrastRatio, diff --git a/lib/commons/dom/get-composed-parent.js b/lib/commons/dom/get-composed-parent.js index 3857a0bd4..ddb28945a 100644 --- a/lib/commons/dom/get-composed-parent.js +++ b/lib/commons/dom/get-composed-parent.js @@ -13,7 +13,7 @@ function getComposedParent(element) { // we'll skip this part for now. return getComposedParent(element.assignedSlot); // parent of a shadow DOM slot } else if (element.parentNode) { - var parentNode = element.parentNode; + const parentNode = element.parentNode; if (parentNode.nodeType === 1) { return parentNode; // Regular node } else if (parentNode.host) { diff --git a/lib/commons/dom/get-element-coordinates.js b/lib/commons/dom/get-element-coordinates.js index b3dfecd79..1bbf26e7b 100644 --- a/lib/commons/dom/get-element-coordinates.js +++ b/lib/commons/dom/get-element-coordinates.js @@ -20,7 +20,7 @@ import getScrollOffset from './get-scroll-offset'; * @property {Number} height The height of the element */ function getElementCoordinates(element) { - var scrollOffset = getScrollOffset(document), + const scrollOffset = getScrollOffset(document), xOffset = scrollOffset.left, yOffset = scrollOffset.top, coords = element.getBoundingClientRect(); diff --git a/lib/commons/dom/get-scroll-offset.js b/lib/commons/dom/get-scroll-offset.js index f1f4aec90..e5ca0d184 100644 --- a/lib/commons/dom/get-scroll-offset.js +++ b/lib/commons/dom/get-scroll-offset.js @@ -13,7 +13,7 @@ function getScrollOffset(element) { // 9 === Node.DOCUMENT_NODE if (element.nodeType === 9) { - var docElement = element.documentElement, + const docElement = element.documentElement, body = element.body; return { diff --git a/lib/commons/dom/has-content-virtual.js b/lib/commons/dom/has-content-virtual.js index ae71c1f7d..691555262 100644 --- a/lib/commons/dom/has-content-virtual.js +++ b/lib/commons/dom/has-content-virtual.js @@ -42,12 +42,12 @@ export function hasChildTextNodes(elm) { function hasContentVirtual(elm, noRecursion, ignoreAria) { return ( // It has text + // or one of it's descendants does hasChildTextNodes(elm) || // It is a graphical element isVisualContent(elm.actualNode) || // It has an ARIA label (!ignoreAria && !!labelVirtual(elm)) || - // or one of it's descendants does (!noRecursion && elm.children.some( child => child.actualNode.nodeType === 1 && hasContentVirtual(child) diff --git a/lib/commons/dom/is-focusable.js b/lib/commons/dom/is-focusable.js index 27b6dd133..b9411c9c0 100644 --- a/lib/commons/dom/is-focusable.js +++ b/lib/commons/dom/is-focusable.js @@ -23,7 +23,7 @@ export default function isFocusable(el) { return true; } // check if the tabindex is specified and a parseable number - var tabindex = vNode.attr('tabindex'); + const tabindex = vNode.attr('tabindex'); if (tabindex && !isNaN(parseInt(tabindex, 10))) { return true; } diff --git a/lib/commons/dom/is-in-text-block.js b/lib/commons/dom/is-in-text-block.js index fe390ce4d..3f4a4f39b 100644 --- a/lib/commons/dom/is-in-text-block.js +++ b/lib/commons/dom/is-in-text-block.js @@ -19,7 +19,7 @@ const blockLike = [ ]; function isBlock(elm) { - var display = window.getComputedStyle(elm).getPropertyValue('display'); + const display = window.getComputedStyle(elm).getPropertyValue('display'); return blockLike.includes(display) || display.substr(0, 6) === 'table-'; } @@ -72,7 +72,7 @@ function isInTextBlock(node, options) { return; } - var nodeName = (currNode.nodeName || '').toUpperCase(); + const nodeName = (currNode.nodeName || '').toUpperCase(); if (currNode === node) { inBrBlock = 1; } diff --git a/lib/commons/dom/visually-overlaps.js b/lib/commons/dom/visually-overlaps.js index ecfbcba9a..887fd6794 100644 --- a/lib/commons/dom/visually-overlaps.js +++ b/lib/commons/dom/visually-overlaps.js @@ -8,10 +8,10 @@ * @return {boolean} True if rect is visually contained within parent */ function visuallyOverlaps(rect, parent) { - var parentRect = parent.getBoundingClientRect(); - var parentTop = parentRect.top; - var parentLeft = parentRect.left; - var parentScrollArea = { + const parentRect = parent.getBoundingClientRect(); + const parentTop = parentRect.top; + const parentLeft = parentRect.left; + const parentScrollArea = { top: parentTop - parent.scrollTop, bottom: parentTop - parent.scrollTop + parent.scrollHeight, left: parentLeft - parent.scrollLeft, @@ -29,7 +29,7 @@ function visuallyOverlaps(rect, parent) { return false; } - var style = window.getComputedStyle(parent); + const style = window.getComputedStyle(parent); if (rect.left > parentRect.right || rect.top > parentRect.bottom) { return ( diff --git a/lib/commons/index.js b/lib/commons/index.js index cbbf9d7e4..9ab285a82 100644 --- a/lib/commons/index.js +++ b/lib/commons/index.js @@ -17,7 +17,7 @@ import * as table from './table'; import * as text from './text'; import * as utils from '../core/utils'; -var commons = { +const commons = { aria, color, dom, diff --git a/lib/commons/table/get-all-cells.js b/lib/commons/table/get-all-cells.js index a85480cd8..6f8beb5a4 100644 --- a/lib/commons/table/get-all-cells.js +++ b/lib/commons/table/get-all-cells.js @@ -7,8 +7,8 @@ * @return {Array} */ function getAllCells(tableElm) { - var rowIndex, cellIndex, rowLength, cellLength; - var cells = []; + let rowIndex, cellIndex, rowLength, cellLength; + const cells = []; for ( rowIndex = 0, rowLength = tableElm.rows.length; rowIndex < rowLength; diff --git a/lib/commons/table/get-cell-position.js b/lib/commons/table/get-cell-position.js index 8d7f6faf6..d251c4cab 100644 --- a/lib/commons/table/get-cell-position.js +++ b/lib/commons/table/get-cell-position.js @@ -11,7 +11,7 @@ import { memoize } from '../../core/utils'; * @return {Object} Object with `x` and `y` properties of the coordinates */ function getCellPosition(cell, tableGrid) { - var rowIndex, index; + let rowIndex, index; if (!tableGrid) { tableGrid = toGrid(findUp(cell, 'table')); } diff --git a/lib/commons/table/is-data-table.js b/lib/commons/table/is-data-table.js index 852c98c02..663f65e2c 100644 --- a/lib/commons/table/is-data-table.js +++ b/lib/commons/table/is-data-table.js @@ -14,7 +14,7 @@ import getViewportSize from '../dom/get-viewport-size'; * @see http://asurkov.blogspot.co.uk/2011/10/data-vs-layout-table.html */ function isDataTable(node) { - var role = (node.getAttribute('role') || '').toLowerCase(); + const role = (node.getAttribute('role') || '').toLowerCase(); // The element is not focusable and has role=presentation if ((role === 'presentation' || role === 'none') && !isFocusable(node)) { @@ -55,7 +55,7 @@ function isDataTable(node) { } // colgroup / col - colgroup is magically generated for ( - var childIndex = 0, childLength = node.children.length; + let childIndex = 0, childLength = node.children.length; childIndex < childLength; childIndex++ ) { @@ -64,14 +64,14 @@ function isDataTable(node) { } } - var cells = 0; - var rowLength = node.rows.length; - var row, cell; - var hasBorder = false; - for (var rowIndex = 0; rowIndex < rowLength; rowIndex++) { + let cells = 0; + const rowLength = node.rows.length; + let row, cell; + let hasBorder = false; + for (let rowIndex = 0; rowIndex < rowLength; rowIndex++) { row = node.rows[rowIndex]; for ( - var cellIndex = 0, cellLength = row.cells.length; + let cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++ ) { @@ -122,7 +122,7 @@ function isDataTable(node) { } // Table having only one row or column is layout table (column) - var sampleRow = node.rows[Math.ceil(rowLength / 2)]; + const sampleRow = node.rows[Math.ceil(rowLength / 2)]; if (sampleRow.cells.length === 1 && sampleRow.cells[0].colSpan === 1) { return false; } @@ -138,8 +138,8 @@ function isDataTable(node) { } // Table having differently colored rows is data table - var bgColor, bgImage; - for (rowIndex = 0; rowIndex < rowLength; rowIndex++) { + let bgColor, bgImage; + for (let rowIndex = 0; rowIndex < rowLength; rowIndex++) { row = node.rows[rowIndex]; if ( bgColor && diff --git a/lib/commons/table/to-grid.js b/lib/commons/table/to-grid.js index 0463c491c..89a369c44 100644 --- a/lib/commons/table/to-grid.js +++ b/lib/commons/table/to-grid.js @@ -9,16 +9,16 @@ import { memoize } from '../../core/utils'; * @return {Array} Array of HTMLTableCellElements */ function toGrid(node) { - var table = []; - var rows = node.rows; - for (var i = 0, rowLength = rows.length; i < rowLength; i++) { - var cells = rows[i].cells; + const table = []; + const rows = node.rows; + for (let i = 0, rowLength = rows.length; i < rowLength; i++) { + const cells = rows[i].cells; table[i] = table[i] || []; - var columnIndex = 0; + let columnIndex = 0; - for (var j = 0, cellLength = cells.length; j < cellLength; j++) { - for (var colSpan = 0; colSpan < cells[j].colSpan; colSpan++) { + for (let j = 0, cellLength = cells.length; j < cellLength; j++) { + for (let colSpan = 0; colSpan < cells[j].colSpan; colSpan++) { // if [the rowSpan] value is set to 0, it extends until the // end of the table section // @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-rowspan @@ -30,7 +30,7 @@ function toGrid(node) { ? rows.length : cells[j].rowSpan; - for (var rowSpan = 0; rowSpan < rowspanValue; rowSpan++) { + for (let rowSpan = 0; rowSpan < rowspanValue; rowSpan++) { table[i + rowSpan] = table[i + rowSpan] || []; while (table[i + rowSpan][columnIndex]) { columnIndex++; diff --git a/lib/commons/text/label-virtual.js b/lib/commons/text/label-virtual.js index acc82ec6a..0473a2e5e 100644 --- a/lib/commons/text/label-virtual.js +++ b/lib/commons/text/label-virtual.js @@ -14,7 +14,7 @@ import { closest, escapeSelector } from '../../core/utils'; * @return {Mixed} String of visible text, or `null` if no label is found */ function labelVirtual(virtualNode) { - var ref, candidate, doc; + let ref, candidate, doc; candidate = ariaLabelVirtual(virtualNode); if (candidate) { From 79f09086246d753ff22b6f27a8362003092c4621 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 15:21:12 -0600 Subject: [PATCH 054/400] chore: bump chromedriver from 123.0.2 to 124.0.1 (#4439) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 123.0.2 to 124.0.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=chromedriver&package-manager=npm_and_yarn&previous-version=123.0.2&new-version=124.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a350752a4..b1498f28f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3394,9 +3394,9 @@ } }, "node_modules/chromedriver": { - "version": "123.0.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.2.tgz", - "integrity": "sha512-Kx0r/IGULm7eciaUtX/OKaFbdBdHRDSguiV1Q4zuQncz11gvymDdMtELa7ppk+kTL5113NLPud92nuIMNTRhww==", + "version": "124.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-124.0.1.tgz", + "integrity": "sha512-hxd1tpAUhgMFBZd1h3W7KyMckxofOYCuKAMtcvBDAU0YKKorZcWuq6zP06+Ph0Z1ynPjtgAj0hP9VphCwesjZw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15648,9 +15648,9 @@ } }, "chromedriver": { - "version": "123.0.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.2.tgz", - "integrity": "sha512-Kx0r/IGULm7eciaUtX/OKaFbdBdHRDSguiV1Q4zuQncz11gvymDdMtELa7ppk+kTL5113NLPud92nuIMNTRhww==", + "version": "124.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-124.0.1.tgz", + "integrity": "sha512-hxd1tpAUhgMFBZd1h3W7KyMckxofOYCuKAMtcvBDAU0YKKorZcWuq6zP06+Ph0Z1ynPjtgAj0hP9VphCwesjZw==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", From c9d4bc9941747a23b8fbf162027bfcb70ea939f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 16:55:18 -0600 Subject: [PATCH 055/400] chore: bump stefanzweifel/git-auto-commit-action from 5.0.0 to 5.0.1 in the gha-low-risk group (#4437) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the gha-low-risk group with 1 update: [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action). Updates `stefanzweifel/git-auto-commit-action` from 5.0.0 to 5.0.1
Release notes

Sourced from stefanzweifel/git-auto-commit-action's releases.

v5.0.1

Fixed

  • Fail if attempting to execute git commands in a directory that is not a git-repo. (#326) @​ccomendant

Dependency Updates

Misc

Changelog

Sourced from stefanzweifel/git-auto-commit-action's changelog.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

Unreleased

TBD

v5.0.1 - 2024-04-12

Fixed

  • Fail if attempting to execute git commands in a directory that is not a git-repo. (#326) @​ccomendant

Dependency Updates

Misc

v5.0.0 - 2023-10-06

New major release that bumps the default runtime to Node 20. There are no other breaking changes.

Changed

Fixed

Dependency Updates

v4.16.0 - 2022-12-02

... (truncated)

Commits
  • 8621497 Fail if attempting to execute git commands in a directory that is not a git-r...
  • b0f4d47 Bump bats from 1.10.0 to 1.11.0 (#325)
  • 9b5e5ee Add step id explanation for output in README.md (#324)
  • e040c59 Linux is not UNIX (#321)
  • 4d160c5 Bump release-drafter/release-drafter from 5 to 6 (#319)
  • 12f6863 Clarify commit_author input option (#315)
  • 29183a2 Remove outdated docs
  • 2818fe7 Add Alert about pull_request_target
  • 8d90676 Little Doc Updates
  • 8036286 Use new Markdown Alerts in README
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=stefanzweifel/git-auto-commit-action&package-manager=github_actions&previous-version=5.0.0&new-version=5.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 74898ee2d..722093522 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -21,6 +21,6 @@ jobs: - run: npm run fmt # Prevent the prettierignore change from being committed. - run: git checkout .prettierignore - - uses: stefanzweifel/git-auto-commit-action@8756aa072ef5b4a080af5dc8fef36c5d586e521d # tag=v5 + - uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # tag=v5 with: commit_message: ':robot: Automated formatting fixes' From 7509518a563bb16aae47a408287a4123d0846b10 Mon Sep 17 00:00:00 2001 From: Masafumi Max NAKANE <2010678+ma10@users.noreply.github.com> Date: Thu, 16 May 2024 07:16:00 +0900 Subject: [PATCH 056/400] chore(i18n): update Japanese translation to reflect changes occurred after 2023-09-12 (#4459) Update Japanese translation to reflect the changes made after 2023-09-12. --- locales/ja.json | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/locales/ja.json b/locales/ja.json index f3efdc8c6..f157877e9 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -498,7 +498,8 @@ }, "aria-required-children": { "pass": { - "default": "必須のARIA子ロールが存在します" + "default": "必須のARIA子ロールが存在します", + "aria-busy": "要素にはaria-busy属性が指定されているため、必要な子要素を省略することが許可されています" }, "fail": { "singular": "必須のARIA子ロールが提供されていません: ${data.values}", @@ -537,7 +538,8 @@ "noIdShadow": "ARIA属性で指定されている要素のIDがページ上に存在しないか、別のshadow DOMツリーの小要素です: ${data.needsReview}", "ariaCurrent": "ARIA属性値が無効であるため、\"aria-current=true\"として扱われます: ${data.needsReview}", "idrefs": "ARIA属性で指定されている要素のIDがページ上に存在するかどうか判定できません: ${data.needsReview}", - "empty": "ARIA属性値が空のときは無視されます: ${data.needsReview}" + "empty": "ARIA属性値が空のときは無視されます: ${data.needsReview}", + "controlsWithinPopup": "aria-haspopupを使用している際にaria-controlsが参照するIDがページ上に存在するかどうかを判断できません: ${data.needsReview}" } }, "aria-valid-attr": { @@ -821,7 +823,7 @@ "pass": "リスト項目に
      、またはrole=\"list\"の親要素が存在します", "fail": { "default": "リスト項目に
          親要素が存在しません", - "roleNotValid": "リスト項目にroleが指定されていない
              親要素、またはrole=\"list\"の親要素が存在しません" + "roleNotValid": "リスト項目の親要素に、role=\"list\"以外のロールが指定されています" } }, "only-dlitems": { @@ -864,17 +866,22 @@ "fail": "タグの${data}がモバイルデバイスでの拡大を無効にします" }, "target-offset": { - "pass": "ターゲットに最も近い隣接要素との間の空白の大きさは十分です。クリッカブルな領域として十分な大きさは、直径${data.minOffset}pxで、${data.minOffset}px以上です。", + "pass": { + "default": "ターゲットは最も近い隣接する要素との間に充分な大きさの空白があります。クリッカブルな領域として十分な大きさは、${data.minOffset}px以上で直径${data.closestOffset}pxです。", + "large": "ターゲットの大きさは、最低${data.minOffset}pxの基準を大きく上回っています。" + }, "fail": "ターゲットに最も近い隣接要素との間の空白の大きさが不十分です。クリッカブルな領域として十分な大きさは、${data.minOffset}px以上ではなく、直径${data.closestOffset}pxです。", "incomplete": { "default": "tabindexが負の要素において、最も近い隣接要素との間の空白の大きさが不十分です。クリッカブルな領域として十分な大きさは、${data.minOffset}px以上ではなく、直径${data.closestOffset}pxです。これがターゲットであるか確認しましょう。", - "nonTabbableNeighbor": "ターゲットに最も近い隣接要素との間の空白の大きさが不十分です。クリッカブルな領域として十分な大きさは、${data.minOffset}px以上ではなく、直径${data.closestOffset}pxです。隣接要素がターゲットであるか確認しましょう。" + "nonTabbableNeighbor": "ターゲットに最も近い隣接要素との間の空白の大きさが不十分です。クリッカブルな領域として十分な大きさは、${data.minOffset}px以上ではなく、直径${data.closestOffset}pxです。隣接要素がターゲットであるか確認しましょう。", + "tooManyRects": "重複する要素が多すぎるため、ターゲットの大きさを取得できません。" } }, "target-size": { "pass": { "default": "コントロールには十分なサイズがあります (${data.width}px x ${data.height}pxであり、${data.minSize}px x ${data.minSize}px以上です)", - "obscured": "コントロールは完全に隠されていてクリックできないため無視されます" + "obscured": "コントロールは完全に隠されていてクリックできないため無視されます", + "large": "ターゲットの大きさはは最低${data.minSize}pxの基準を大きく上回っています。" }, "fail": { "default": "ターゲットのサイズが不十分です (${data.width}px x ${data.height}pxですが、${data.minSize}px x ${data.minSize}px以上でなければなりません)", @@ -884,7 +891,8 @@ "default": "tabindexが負の要素のサイズが不十分です (${data.width}px x ${data.height}pxですが、${data.minSize}px x ${data.minSize}px以上でなければなりません)。これがターゲットであるか確認しましょう", "contentOverflow": "コンテンツがオーバーフローしたため、要素のサイズを正確に決定できませんでした", "partiallyObscured": "tabindexが負の要素は、部分的に隠れているためサイズが不十分です (最小のスペースは${data.width}px x ${data.height}pxですが、${data.minSize}px x ${data.minSize}px以上でなければなりません)。これがターゲットであるか確認しましょう", - "partiallyObscuredNonTabbable": "ターゲットのサイズが不十分です。これはtabindexが負の隣接オブジェクトによって部分的に隠されているためです (最小のスペースは${data.width}px x ${data.height}pxですが、${data.minSize}px x ${data.minSize}px以上でなければなりません)。隣接要素がターゲットであるか確認しましょう" + "partiallyObscuredNonTabbable": "ターゲットのサイズが不十分です。これはtabindexが負の隣接オブジェクトによって部分的に隠されているためです (最小のスペースは${data.width}px x ${data.height}pxですが、${data.minSize}px x ${data.minSize}px以上でなければなりません)。隣接要素がターゲットであるか確認しましょう", + "tooManyRects": "重複する要素が多すぎるため、ターゲットの大きさを取得できません。" } }, "header-present": { From a58e846183a84007b9c9b3a63de3f75df1ff3c32 Mon Sep 17 00:00:00 2001 From: EvilKarter Date: Thu, 16 May 2024 00:18:15 +0200 Subject: [PATCH 057/400] chore: Update locale de.json (#4461) Update locale de.json --- locales/de.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index 8f35d0c65..dec1fb6b0 100644 --- a/locales/de.json +++ b/locales/de.json @@ -538,7 +538,8 @@ "noIdShadow": "ARIA-Attribut Element-ID existiert nicht auf der Seite oder ist ein Nachkomme (descendant) eines anderen Schatten-DOM-tree: ${data.needsReview}", "ariaCurrent": "Folgendes ARIA Attributwert ist ungültig und wird wie \"aria-current=true\" gesehen: ${data.needsReview}", "idrefs": "Es konnte nicht festgestellt werden, ob das ARIA-Attribut element ID auf der Seite existiert: ${data.needsReview}", - "empty": "ARIA-Attributwert wird ignoriert, wenn leer: ${data.needsReview}" + "empty": "ARIA-Attributwert wird ignoriert, wenn leer: ${data.needsReview}", + "controlsWithinPopup": "Bei der Verwendung von aria-haspopup konnte nicht festgestellt werden, ob die von aria-controls referenzierte ID auf der Seite existiert: ${data.needsReview}" } }, "aria-valid-attr": { @@ -872,7 +873,8 @@ "fail": "Das Ziel hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px.", "incomplete": { "default": "Element mit negativem Tabindex hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px. Ist dies ein Ziel?", - "nonTabbableNeighbor": "Das Ziel hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px. Ist der Nachbar ein Ziel?" + "nonTabbableNeighbor": "Das Ziel hat nicht genügend Abstand zu seinen nächsten Nachbarn. Der sichere klickbare Bereich hat einen Durchmesser von ${data.closestOffset}px statt mindestens ${data.minOffset}px. Ist der Nachbar ein Ziel?", + "tooManyRects": "Die Zielgröße konnte nicht ermittelt werden, da zu viele überlappende Elemente vorhanden sind." } }, "target-size": { From 518b345553d39898dfa6df569f3f750649f8b7f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 08:46:34 -0600 Subject: [PATCH 058/400] chore: bump the npm-low-risk group across 1 directory with 9 updates (#4449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the npm-low-risk group with 9 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.24.4` | `7.24.5` | | [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.24.4` | `7.24.5` | | [@babel/runtime-corejs3](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs3) | `7.24.4` | `7.24.5` | | [clean-jsdoc-theme](https://github.com/ankitskvmdam/clean-jsdoc-theme) | `4.2.18` | `4.3.0` | | [colorjs.io](https://github.com/LeaVerou/color.js) | `0.4.3` | `0.5.0` | | [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) | `3.36.1` | `3.37.0` | | [jsdoc](https://github.com/jsdoc/jsdoc) | `4.0.2` | `4.0.3` | | [selenium-webdriver](https://github.com/SeleniumHQ/selenium) | `4.19.0` | `4.20.0` | | [typescript](https://github.com/Microsoft/TypeScript) | `5.4.4` | `5.4.5` | Updates `@babel/core` from 7.24.4 to 7.24.5
              Release notes

              Sourced from @​babel/core's releases.

              v7.24.5 (2024-04-29)

              Thanks @​romgrk and @​sossost for your first PRs!

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3

              Committers: 6

              Changelog

              Sourced from @​babel/core's changelog.

              v7.24.5 (2024-04-29)

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3
              Commits

              Updates `@babel/preset-env` from 7.24.4 to 7.24.5
              Release notes

              Sourced from @​babel/preset-env's releases.

              v7.24.5 (2024-04-29)

              Thanks @​romgrk and @​sossost for your first PRs!

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3

              Committers: 6

              Changelog

              Sourced from @​babel/preset-env's changelog.

              v7.24.5 (2024-04-29)

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3
              Commits

              Updates `@babel/runtime-corejs3` from 7.24.4 to 7.24.5
              Release notes

              Sourced from @​babel/runtime-corejs3's releases.

              v7.24.5 (2024-04-29)

              Thanks @​romgrk and @​sossost for your first PRs!

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3

              Committers: 6

              Changelog

              Sourced from @​babel/runtime-corejs3's changelog.

              v7.24.5 (2024-04-29)

              :bug: Bug Fix

              • babel-plugin-transform-classes, babel-traverse
              • babel-helpers, babel-plugin-proposal-explicit-resource-management, babel-runtime-corejs3

              :nail_care: Polish

              :house: Internal

              • Other
              • babel-parser
              • babel-helper-create-class-features-plugin, babel-helper-member-expression-to-functions, babel-helper-module-transforms, babel-helper-split-export-declaration, babel-helper-wrap-function, babel-helpers, babel-plugin-bugfix-firefox-class-in-computed-class-key, babel-plugin-proposal-explicit-resource-management, babel-plugin-transform-block-scoping, babel-plugin-transform-destructuring, babel-plugin-transform-object-rest-spread, babel-plugin-transform-optional-chaining, babel-plugin-transform-parameters, babel-plugin-transform-private-property-in-object, babel-plugin-transform-react-jsx-self, babel-plugin-transform-typeof-symbol, babel-plugin-transform-typescript, babel-traverse
              • babel-plugin-proposal-partial-application, babel-types
              • babel-plugin-transform-class-properties, babel-preset-env

              :running_woman: Performance

              • babel-helpers, babel-preset-env, babel-runtime-corejs3
              Commits

              Updates `clean-jsdoc-theme` from 4.2.18 to 4.3.0
              Commits

              Updates `colorjs.io` from 0.4.3 to 0.5.0
              Release notes

              Sourced from colorjs.io's releases.

              v0.5.0

              It’s been a while since our last release, so this is a big one! Going forwards, we plan to make at least one release per month.

              Heads ups

              ⚠️ Future breaking change

              Color.js currently uses NaN values to represent CSS none (e.g. for achromatic colors). However, CSS also now has a NaN value, which is currently impossible to represent in Color.js. Therefore, In the next non-minor version, we will start using null to represent none. If you have code that handles these values, you can prepare for the change by detecting which value is being used and using that instead of a hardcoded NaN:

              const NONE_COORD = new Color("rgb(none none
              none)").coords[0].valueOf()
              

              🆕 Color.js Discord server

              We’ve just set up a Discord server so that people can help each other and discuss color science topics in a more immediate way. Join now!. Do note we also have a Discussions section for more long-form help.

              ⬇️ 2 million downloads!

              We’ve recently passed a big milestone: Color.js was downloaded 2 million times on npm!

              New in v0.5.0

              New Color Spaces

              Improved compatibility with CSS:

              Gamut mapping improvements

              ... (truncated)

              Commits
              • 58524b8 Release 0.5.0
              • e5e1280 Export types at top level of /fn entrypoint (#466)
              • f86150b update babel deps
              • c258d1d Audit function parameter and return types (3/2) (#461)
              • ae9ea42 Allow hwb to accept numbers (#464)
              • a1a11cb [elements/color-swatch] Fix case where value attribute is set before init
              • e48d472 [Gamut Mapping App] Hide deltas if mapped color is unchanged. (#459)
              • d082f35 Refactor out a clip and an LH correction and still retain ∆h ~4.4
              • c167531 Audit function parameter and return types (2/2) (#457)
              • 0d6b31b Always show delta display to help confirm it is in gamut (#458)
              • Additional commits viewable in compare view
              Maintainer changes

              This version was pushed to npm by jgerigmeyer, a new releaser for colorjs.io since your current version.


              Updates `core-js` from 3.36.1 to 3.37.0
              Changelog

              Sourced from core-js's changelog.

              3.37.0 - 2024.04.17
              Commits
              • 598d0b2 3.37.0
              • c978c8f add an entry for exactors proposal
              • 8957db1 update pattern matching proposal
              • d393ed4 some simplification
              • 51cb7c8 some simplification
              • 51ce5d0 simplify some constants definition
              • 9da401f add Math.sumPrecise
              • 80f1d23 add a fix of Safari { Object, Map }.groupBy bug that does not support itera...
              • 5b908c2 add a fix of Safari bug with double call of constructor in Array.fromAsync
              • 559081f move new Set methods to stable ES
              • Additional commits viewable in compare view

              Updates `jsdoc` from 4.0.2 to 4.0.3
              Changelog

              Sourced from jsdoc's changelog.

              4.0.3 (May 2024)

              Updates dependencies.

              Commits

              Updates `selenium-webdriver` from 4.19.0 to 4.20.0
              Release notes

              Sourced from selenium-webdriver's releases.

              Selenium 4.20.0

              Changelog

              For each component's detailed changelog, please check:

              Commits in this release

              • a12c3b56a9 - [build] Moving versions to nightly :: Diego Molina
              • 4fec60d2b8 - [rb] Update Gemfile.lock :: Alex Rodionov
              • 96cf53a454 - [rb] Fix document generation :: Alex Rodionov
              • 507970233b - [build] Bumping actions versions :: Diego Molina
              • 63e815627f - Update mirror info (Thu Mar 28 00:15:30 UTC 2024) :: Selenium CI Bot
              • b7d831db8c - [bidi][js] Update the capture screenshot APIs to include all parameters and remove scroll parameter (#13744) :: Puja Jagani
              • 0b29138fa7 - [rust] Bump to rules_rust 0.41.0 (Rust 1.77.0) :: Boni García
              • cc7f3402f8 - Update mirror info (Fri Mar 29 00:15:26 UTC 2024) :: Selenium CI Bot
              • acd9d0e77d - [bidi] [java] Fix the bazel file after the BiDi breaking change :: Puja Jagani
              • abe0ee07dc - [java] Updating change log and bumping version :: Puja Jagani
              • 3ef121c0b2 - Update mirror info (Fri Mar 29 12:14:17 UTC 2024) :: Selenium CI Bot
              • 6cda692993 - [grid] synchronize read from field written by other thread :: Jörg Sautter
              • 9c6ccdbf40 - Update mirror info (Sat Mar 30 00:14:35 UTC 2024) :: Selenium CI Bot
              • 1f88231e2b - [js] Fix linting (#13753) :: Puja Jagani
              • a2aa09f143 - Bumping to SNAPSHOT for Nightly :: Diego Molina
              • ec7c11fae8 - Update mirror info (Mon Apr 1 12:08:01 UTC 2024) :: Selenium CI Bot
              • e90e4a5001 - [rb] Return JRuby dependencies :: Alex Rodionov
              • ef3d9e870e - [rb][java][dotnet][py] Skipping Edge tests due to https://bugs.chromium.org/p/chromedriver/issues/detail?id=4743 :: Diego Molina
              • a169d905b4 - [JS][bidi] Impelments functionality to retrieve all top-level browsing contexts :: Sri Harsha
              • a663d280de - [js] Running format script :: Diego Molina
              • 37565afc72 - [dotnet] Simplify definition of building test web server for unit tests :: Nikolay Borisenko
              • 911b312090 - [js] Add JS comments for BiDi related files (#13763) :: Puja Jagani
              • 309b3e802f - [bidi][java] Deprecate using builder for Locate Node parameters. (#13767) :: Puja Jagani
              • baf6116541 - [bidi][java] Update Locator class to not use optional :: Puja Jagani
              • cca70e3eb4 - [JS] lint fixes :: Sri Harsha
              • 68ad9845aa - [grid] do not create unused HttpResponse instances :: Jörg Sautter
              • aaa7e791a4 - [bidi][java] Enable chrome tests (#13770) :: Puja Jagani
              • b49ae752c9 - [JS] Set browserName by default when browserOptions are used :: Sri Harsha
              • 111941bd3c - [JS] Implement fullPageScreenshot functionality for Firefox (#13301) :: Sri Harsha
              • 38829c7c63 - [bidi][java] Enable grid BiDi chrome test (#13778) :: Puja Jagani
              • 12ed6cc2d9 - [dotnet] use correct devtools session id after reinitialization (#13768) :: schrufygroovy
              • 44eba5952f - [js] Running format script :: Diego Molina
              • 8c8adec916 - [grid] handle baseRoute like the hubRoute and the graphqlRoute (#13772) :: Jörg Sautter
              • 392ffbc08d - [JS] Remove duplicate license agreement from files :: Sri Harsha
              • b800dfcde2 - [java] [bidi] Enable test that pass in chrome :: Puja Jagani

              ... (truncated)

              Commits
              • 866c76c Release 4.20.0 (#13870)
              • 8086b25 [build] Updating scripts for automated release
              • 4a6c384 [bidi] Update browsing context create method (#13766)
              • fee33dd Bump java deps
              • f3af582 Remove unused file
              • 753dec8 [bazel] Make unpinned_maven available
              • 5f127db [ci] Disable Ruby tests for Chrome/Edge on Windows
              • 04c9dfc [dotnet] Pushing missing changes to method names in dotnet SM
              • c4a6317 [build] Switching to a different command to pin maven deps
              • 85da948 [dotnet] Renaming methods to follow C# pattern.
              • Additional commits viewable in compare view

              Updates `typescript` from 5.4.4 to 5.4.5
              Release notes

              Sourced from typescript's releases.

              TypeScript 5.4.5

              For release notes, check out the release announcement.

              For the complete list of fixed issues, check out the

              Downloads are available on:

              Commits
              • 27bcd4c Update LKG
              • 9f33bf1 🤖 Pick PR #58098 (Fix constraints of nested homomorph...) into release-5.4 (#...
              • 71b2f84 Bump version to 5.4.5 and LKG
              • 892936f 🤖 Pick PR #58083 (Don't propagate partial union/inter...) into release-5.4 (#...
              • 38a7c05 release-5.4: Always set node-version for setup-node (#58117)
              • b754fc3 🤖 Pick PR #57778 (fix type import check for default-i...) into release-5.4 (#...
              • See full diff in compare view

              Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
              Dependabot commands and options
              You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
              --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steven Lambert <2433219+straker@users.noreply.github.com> --- package-lock.json | 725 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 382 insertions(+), 345 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1498f28f..a6c64c267 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "chromedriver": "latest", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", - "colorjs.io": "^0.4.3", + "colorjs.io": "0.4.3", "conventional-commits-parser": "^5.0.0", "core-js": "^3.27.1", "css-selector-parser": "^1.4.1", @@ -138,21 +138,21 @@ } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -168,12 +168,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -252,19 +252,19 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -342,12 +342,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -366,16 +366,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -397,9 +397,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -440,12 +440,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -464,30 +464,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -517,14 +517,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -617,9 +617,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -629,13 +629,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1024,12 +1024,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1072,18 +1072,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1110,12 +1110,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1429,15 +1429,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1479,12 +1479,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1496,12 +1496,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1527,14 +1527,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1652,12 +1652,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1730,16 +1730,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1766,12 +1766,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1791,13 +1791,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1805,7 +1805,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -1857,9 +1857,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", - "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", + "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", "dev": true, "dependencies": { "core-js-pure": "^3.30.2", @@ -1884,19 +1884,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1905,13 +1905,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2511,25 +2511,25 @@ } }, "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "node_modules/@types/minimist": { @@ -3437,9 +3437,9 @@ } }, "node_modules/clean-jsdoc-theme": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.18.tgz", - "integrity": "sha512-iPz34GEhTZGW33Oi25IUgW1suGFuQZoDoCjn82BEI7Ck83CvJisrrxYv3WLjHA/wz8g82wy8WsUyRiTGajUZdw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz", + "integrity": "sha512-QMrBdZ2KdPt6V2Ytg7dIt0/q32U4COpxvR0UDhPjRRKRL0o0MvRCR5YpY37/4rPF1SI1AYEKAWyof7ndCb/dzA==", "dev": true, "dependencies": { "@jsdoc/salty": "^0.2.4", @@ -4241,9 +4241,9 @@ } }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "dev": true, "hasInstallScript": true, "funding": { @@ -7805,21 +7805,21 @@ "dev": true }, "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -8346,12 +8346,12 @@ "dev": true }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/lint-staged": { @@ -8990,31 +8990,44 @@ "dev": true }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-anchor": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", - "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/marked": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.2.tgz", @@ -9046,9 +9059,9 @@ } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/media-typer": { @@ -10530,6 +10543,15 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -11248,9 +11270,9 @@ "dev": true }, "node_modules/selenium-webdriver": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.19.0.tgz", - "integrity": "sha512-8XHW8m9V2XN2/SC1kr4bWzMtGvjmKUEZ6S0UBoDBqonhmwEIzKOLbzhanBd08HCOg1s1O0XrDWCD71NnA8Zt0g==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.20.0.tgz", + "integrity": "sha512-s/G44lGQ1xB3tmtX6NNPomlkpL6CxLdmAvp/AGWWwi4qv5Te1+qji7tPSyr6gyuoPpdYiof1rKnWe3luy0MrYA==", "dev": true, "dependencies": { "jszip": "^3.10.1", @@ -12416,9 +12438,9 @@ } }, "node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12448,9 +12470,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/uglify-js": { @@ -13248,21 +13270,21 @@ "dev": true }, "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -13271,12 +13293,12 @@ } }, "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "requires": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -13344,19 +13366,19 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" } }, @@ -13410,12 +13432,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "requires": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" } }, "@babel/helper-module-imports": { @@ -13428,16 +13450,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" } }, "@babel/helper-optimise-call-expression": { @@ -13450,9 +13472,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -13478,12 +13500,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -13496,24 +13518,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true }, "@babel/helper-validator-option": { @@ -13534,14 +13556,14 @@ } }, "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "requires": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" } }, "@babel/highlight": { @@ -13615,19 +13637,19 @@ } }, "@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -13885,12 +13907,12 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" } }, "@babel/plugin-transform-class-properties": { @@ -13915,18 +13937,18 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" } }, @@ -13941,12 +13963,12 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" } }, "@babel/plugin-transform-dotall-regex": { @@ -14140,15 +14162,15 @@ } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" } }, "@babel/plugin-transform-object-super": { @@ -14172,23 +14194,23 @@ } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" } }, "@babel/plugin-transform-private-methods": { @@ -14202,14 +14224,14 @@ } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, @@ -14279,12 +14301,12 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" } }, "@babel/plugin-transform-unicode-escapes": { @@ -14327,16 +14349,16 @@ } }, "@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dev": true, "requires": { "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -14363,12 +14385,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -14388,13 +14410,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -14402,7 +14424,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -14442,9 +14464,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", - "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", + "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", "dev": true, "requires": { "core-js-pure": "^3.30.2", @@ -14463,31 +14485,31 @@ } }, "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" } }, @@ -14978,25 +15000,25 @@ } }, "@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "@types/minimist": { @@ -15680,9 +15702,9 @@ } }, "clean-jsdoc-theme": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.18.tgz", - "integrity": "sha512-iPz34GEhTZGW33Oi25IUgW1suGFuQZoDoCjn82BEI7Ck83CvJisrrxYv3WLjHA/wz8g82wy8WsUyRiTGajUZdw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz", + "integrity": "sha512-QMrBdZ2KdPt6V2Ytg7dIt0/q32U4COpxvR0UDhPjRRKRL0o0MvRCR5YpY37/4rPF1SI1AYEKAWyof7ndCb/dzA==", "dev": true, "requires": { "@jsdoc/salty": "^0.2.4", @@ -16306,9 +16328,9 @@ "dev": true }, "core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "dev": true }, "core-js-compat": { @@ -18951,21 +18973,21 @@ "dev": true }, "jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", "dev": true, "requires": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -19384,12 +19406,12 @@ "dev": true }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "lint-staged": { @@ -19823,22 +19845,31 @@ "dev": true }, "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } } }, "markdown-it-anchor": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", - "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, "requires": {} }, @@ -19861,9 +19892,9 @@ } }, "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "media-typer": { @@ -21008,6 +21039,12 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -21555,9 +21592,9 @@ "dev": true }, "selenium-webdriver": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.19.0.tgz", - "integrity": "sha512-8XHW8m9V2XN2/SC1kr4bWzMtGvjmKUEZ6S0UBoDBqonhmwEIzKOLbzhanBd08HCOg1s1O0XrDWCD71NnA8Zt0g==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.20.0.tgz", + "integrity": "sha512-s/G44lGQ1xB3tmtX6NNPomlkpL6CxLdmAvp/AGWWwi4qv5Te1+qji7tPSyr6gyuoPpdYiof1rKnWe3luy0MrYA==", "dev": true, "requires": { "jszip": "^3.10.1", @@ -22466,9 +22503,9 @@ "dev": true }, "typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true }, "ua-parser-js": { @@ -22478,9 +22515,9 @@ "dev": true }, "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 9b02b6461..958bd4cb6 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "chromedriver": "latest", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", - "colorjs.io": "^0.4.3", + "colorjs.io": "0.4.3", "conventional-commits-parser": "^5.0.0", "core-js": "^3.27.1", "css-selector-parser": "^1.4.1", From f584e8e4ea6305f5676b2c2e85690ed98afcbd26 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 17 May 2024 10:24:05 -0400 Subject: [PATCH 059/400] chore: upgrade to eslint9 (#4462) Upgrade to eslint v9 flat config. Custom eslint rules have been tested and work in the new config file. Removed unused vars in try catch blocks due to[ breaking change in eslint v9](https://github.com/eslint/eslint/pull/17932). Use [globals](https://www.npmjs.com/package/globals) to include [globals env](https://eslint.org/docs/latest/use/configure/language-options#predefined-global-variables) --- .eslintignore | 11 - .eslintrc.js | 181 ------- build/cherry-pick.js | 2 +- build/tasks/validate.js | 2 +- eslint.config.js | 196 +++++++ lib/checks/aria/aria-errormessage-evaluate.js | 2 +- .../aria/aria-valid-attr-value-evaluate.js | 2 +- .../no-implicit-explicit-label-evaluate.js | 2 +- .../generic/has-text-content-evaluate.js | 2 +- .../keyboard/focusable-no-name-evaluate.js | 2 +- .../frame-focusable-content-evaluate.js | 2 +- .../keyboard/no-focusable-content-evaluate.js | 2 +- lib/checks/label/explicit-evaluate.js | 2 +- .../label/hidden-explicit-label-evaluate.js | 2 +- lib/checks/label/implicit-evaluate.js | 2 +- lib/checks/mobile/target-size-evaluate.js | 2 +- lib/checks/shared/aria-labelledby-evaluate.js | 2 +- .../shared/svg-non-empty-title-evaluate.js | 2 +- lib/commons/aria/validate-attr-value.js | 2 +- lib/commons/color/color.js | 2 +- lib/commons/dom/idrefs.js | 2 +- lib/core/utils/extend-meta-data.js | 2 +- .../utils/frame-messenger/message-parser.js | 2 +- lib/core/utils/get-selector.js | 2 - lib/core/utils/publish-metadata.js | 2 +- lib/rules/svg-namespace-matches.js | 2 +- package-lock.json | 492 +++++++++--------- package.json | 7 +- test/core/base/rule.js | 2 +- test/core/utils/send-command-to-frame.js | 2 +- test/integration/rules/preprocessor.js | 2 +- 31 files changed, 474 insertions(+), 465 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index ca1d987e9..000000000 --- a/.eslintignore +++ /dev/null @@ -1,11 +0,0 @@ -**/node_modules/* -**/tmp/* - -build/tasks/aria-supported.js - -doc/api/* -doc/examples/jest_react/*.js - -lib/core/imports/*.js -axe.js -axe.min.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 37592b660..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,181 +0,0 @@ -module.exports = { - root: true, - extends: ['prettier'], - parserOptions: { - ecmaVersion: 2023 - }, - env: { - node: true, - es6: true - }, - globals: { - axe: true, - Promise: true - }, - rules: { - 'no-bitwise': 2, - camelcase: 2, - curly: 2, - eqeqeq: 2, - 'guard-for-in': 2, - 'wrap-iife': [2, 'any'], - 'no-use-before-define': [ - 2, - { - functions: false - } - ], - 'new-cap': 2, - 'no-caller': 2, - 'no-empty': 2, - 'no-new': 2, - 'no-plusplus': 0, - 'no-undef': 2, - 'no-unused-vars': 2, - strict: 0, - 'max-params': [2, 6], - 'max-depth': [2, 5], - 'max-len': 0, - semi: 0, - 'no-cond-assign': 0, - 'no-debugger': 2, - 'no-eq-null': 0, - 'no-eval': 2, - 'no-unused-expressions': 0, - 'block-scoped-var': 0, - 'no-iterator': 0, - 'linebreak-style': 0, - 'no-loop-func': 0, - 'no-multi-str': 0, - 'no-proto': 0, - 'no-script-url': 0, - 'dot-notation': 2, - 'no-new-func': 0, - 'no-new-wrappers': 0, - 'no-shadow': 2, - 'no-restricted-syntax': [ - 'error', - { - selector: 'MemberExpression[property.name=tagName]', - message: "Don't use node.tagName, use node.nodeName instead." - }, - // node.attributes can be clobbered so is unsafe to use - // @see https://github.com/dequelabs/axe-core/pull/1432 - { - // node.attributes - selector: - 'MemberExpression[object.name=node][property.name=attributes]', - message: - "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." - }, - { - // vNode.actualNode.attributes - selector: - 'MemberExpression[object.property.name=actualNode][property.name=attributes]', - message: - "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." - }, - // node.contains doesn't work with shadow dom - // @see https://github.com/dequelabs/axe-core/issues/4194 - { - // node.contains() - selector: - 'CallExpression[callee.object.name=node][callee.property.name=contains]', - message: - "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." - }, - { - // vNode.actualNode.contains() - selector: - 'CallExpression[callee.object.property.name=actualNode][callee.property.name=contains]', - message: - "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." - } - ] - }, - overrides: [ - { - files: ['lib/**/*.js'], - excludedFiles: ['lib/core/reporters/**/*.js', 'lib/**/*-after.js'], - parserOptions: { - sourceType: 'module' - }, - env: { - // do not access global window properties without going through window - browser: false, - es6: true - }, - globals: { - window: true, - document: true - }, - rules: { - 'func-names': [2, 'as-needed'], - 'prefer-const': 2, - 'no-use-before-define': 'off' - } - }, - { - // after functions and reporters will not be run inside the same context as axe.run so should not access browser globals that require context specific information (window.location, window.getComputedStyles, etc.) - files: ['lib/**/*-after.js', 'lib/core/reporters/**/*.js'], - parserOptions: { - sourceType: 'module' - }, - env: { - browser: false - }, - globals: {}, - rules: { - 'func-names': [2, 'as-needed'], - 'prefer-const': 2, - 'no-use-before-define': 'off' - } - }, - { - // polyfills are mostly copy-pasted from sources so we don't control their styling - files: [ - 'lib/core/imports/polyfills.js', - 'lib/core/utils/pollyfill-elements-from-point.js' - ], - env: { - browser: false - }, - rules: { - 'func-names': 0, - 'no-bitwise': 0, - curly: 0, - eqeqeq: 0 - } - }, - { - files: ['test/act-rules/**/*.js', 'test/aria-practices/**/*.js'], - env: { - mocha: true - } - }, - { - files: ['test/**/*.js'], - excludedFiles: ['test/act-rules/**/*.js', 'test/aria-practices/**/*.js'], - parserOptions: { - ecmaVersion: 2021 - }, - env: { - browser: true, - es6: false, - mocha: true - }, - globals: { - assert: true, - helpers: true, - checks: true, - sinon: true - }, - plugins: ['mocha-no-only'], - rules: { - 'new-cap': 0, - 'no-use-before-define': 0, - 'mocha-no-only/mocha-no-only': ['error'] - } - } - ] -}; diff --git a/build/cherry-pick.js b/build/cherry-pick.js index 2b3dc2afe..f8546c146 100644 --- a/build/cherry-pick.js +++ b/build/cherry-pick.js @@ -129,7 +129,7 @@ commitsToCherryPick.forEach(({ hash, type, scope, subject }) => { try { execSync(`git cherry-pick ${hash} -X theirs`); - } catch (e) { + } catch { console.error( chalk.red.bold('\nAborting cherry-pick and reseting to master') ); diff --git a/build/tasks/validate.js b/build/tasks/validate.js index 9af5edb28..8eb5a2eba 100644 --- a/build/tasks/validate.js +++ b/build/tasks/validate.js @@ -14,7 +14,7 @@ function fileExists(v, o) { var exists; try { exists = fs.existsSync(file); - } catch (e) { + } catch { return false; } return exists; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..731000262 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,196 @@ +const prettier = require('eslint-config-prettier'); +const globals = require('globals'); +const mochaNoOnly = require('eslint-plugin-mocha-no-only'); + +module.exports = [ + prettier, + { + rules: { + 'mocha-no-only/mocha-no-only': ['error'], + 'no-bitwise': 2, + camelcase: 2, + curly: 2, + eqeqeq: 2, + 'guard-for-in': 2, + 'wrap-iife': [2, 'any'], + 'no-use-before-define': [ + 2, + { + functions: false + } + ], + 'new-cap': 2, + 'no-caller': 2, + 'no-empty': 2, + 'no-new': 2, + 'no-plusplus': 0, + 'no-undef': 2, + 'no-unused-vars': 2, + strict: 0, + 'max-params': [2, 6], + 'max-depth': [2, 5], + 'max-len': 0, + semi: 0, + 'no-cond-assign': 0, + 'no-debugger': 2, + 'no-eq-null': 0, + 'no-eval': 2, + 'no-unused-expressions': 0, + 'block-scoped-var': 0, + 'no-iterator': 0, + 'linebreak-style': 0, + 'no-loop-func': 0, + 'no-multi-str': 0, + 'no-proto': 0, + 'no-script-url': 0, + 'dot-notation': 2, + 'no-new-func': 0, + 'no-new-wrappers': 0, + 'no-shadow': 2, + 'no-restricted-syntax': [ + 'error', + { + selector: 'MemberExpression[property.name=tagName]', + message: "Don't use node.tagName, use node.nodeName instead." + }, + // node.attributes can be clobbered so is unsafe to use + // @see https://github.com/dequelabs/axe-core/pull/1432 + { + // node.attributes + selector: + 'MemberExpression[object.name=node][property.name=attributes]', + message: + "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." + }, + { + // vNode.actualNode.attributes + selector: + 'MemberExpression[object.property.name=actualNode][property.name=attributes]', + message: + "Don't use node.attributes, use node.hasAttributes() or axe.utils.getNodeAttributes(node) instead." + }, + // node.contains doesn't work with shadow dom + // @see https://github.com/dequelabs/axe-core/issues/4194 + { + // node.contains() + selector: + 'CallExpression[callee.object.name=node][callee.property.name=contains]', + message: + "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." + }, + { + // vNode.actualNode.contains() + selector: + 'CallExpression[callee.object.property.name=actualNode][callee.property.name=contains]', + message: + "Don't use node.contains(node2) as it doesn't work across shadow DOM. Use axe.utils.contains(node, node2) instead." + } + ] + }, + plugins: { + 'mocha-no-only': mochaNoOnly + } + }, + { + languageOptions: { + ecmaVersion: 2023, + globals: { + axe: true, + Promise: true, + ...globals.node, + ...globals.es2015 + } + } + }, + { + files: ['lib/**/*.js'], + // reporters and check after methods should not have access to window or document + ignores: ['lib/core/reporters/**/*.js', 'lib/**/*-after.js'], + languageOptions: { + sourceType: 'module', + // lib files should not access global window properties without going through window (i.e. do not add globals.browser) + globals: { + window: true, + document: true, + ...globals.node, + ...globals.es2015 + } + }, + rules: { + 'func-names': [2, 'as-needed'], + 'prefer-const': 2, + 'no-use-before-define': 'off' + } + }, + { + files: ['doc/examples/chrome-debugging-protocol/axe-cdp.js'], + languageOptions: { + globals: { + window: true + } + } + }, + { + // after functions and reporters will not be run inside the same context as axe.run so should not access browser globals that require context specific information (window.location, window.getComputedStyles, etc.) + files: ['lib/**/*-after.js', 'lib/core/reporters/**/*.js'], + languageOptions: { + sourceType: 'module' + } + }, + { + // polyfills are mostly copy-pasted from sources so we don't control their styling + files: [ + 'lib/core/imports/polyfills.js', + 'lib/core/utils/pollyfill-elements-from-point.js' + ], + rules: { + 'func-names': 0, + 'no-bitwise': 0, + curly: 0, + eqeqeq: 0 + } + }, + { + files: ['test/act-rules/**/*.js', 'test/aria-practices/**/*.js'], + languageOptions: { + globals: { + ...globals.mocha + } + }, + rules: { + 'new-cap': 0, + 'no-use-before-define': 0 + } + }, + { + files: ['test/**/*.js'], + languageOptions: { + globals: { + ...globals.mocha, + ...globals.browser, + ...globals.es2015, + ...globals.node, + assert: true, + helpers: true, + checks: true, + sinon: true + } + }, + rules: { + 'new-cap': 0, + 'no-use-before-define': 0 + } + }, + { + ignores: [ + '**/node_modules/*', + '**/tmp/*', + 'build/tasks/aria-supported.js', + 'doc/api/*', + 'doc/examples/jest_react/*.js', + 'lib/core/imports/*.js', + 'axe.js', + 'axe.min.js' + ] + } +]; diff --git a/lib/checks/aria/aria-errormessage-evaluate.js b/lib/checks/aria/aria-errormessage-evaluate.js index b7b971d4e..26367c4b7 100644 --- a/lib/checks/aria/aria-errormessage-evaluate.js +++ b/lib/checks/aria/aria-errormessage-evaluate.js @@ -46,7 +46,7 @@ export default function ariaErrormessageEvaluate(node, options, virtualNode) { try { idref = attr && idrefs(virtualNode, 'aria-errormessage')[0]; - } catch (e) { + } catch { this.data({ messageKey: 'idrefs', values: tokenList(attr) diff --git a/lib/checks/aria/aria-valid-attr-value-evaluate.js b/lib/checks/aria/aria-valid-attr-value-evaluate.js index 79ea53fef..ad43d1393 100644 --- a/lib/checks/aria/aria-valid-attr-value-evaluate.js +++ b/lib/checks/aria/aria-valid-attr-value-evaluate.js @@ -115,7 +115,7 @@ export default function ariaValidAttrValueEvaluate(node, options, virtualNode) { try { validValue = validateAttrValue(virtualNode, attrName); - } catch (e) { + } catch { needsReview = `${attrName}="${attrValue}"`; messageKey = 'idrefs'; return; diff --git a/lib/checks/aria/no-implicit-explicit-label-evaluate.js b/lib/checks/aria/no-implicit-explicit-label-evaluate.js index 0fb727077..5fbe5d99a 100644 --- a/lib/checks/aria/no-implicit-explicit-label-evaluate.js +++ b/lib/checks/aria/no-implicit-explicit-label-evaluate.js @@ -32,7 +32,7 @@ function noImplicitExplicitLabelEvaluate(node, options, virtualNode) { try { label = sanitize(labelText(virtualNode)).toLowerCase(); accText = sanitize(accessibleTextVirtual(virtualNode)).toLowerCase(); - } catch (e) { + } catch { return undefined; } diff --git a/lib/checks/generic/has-text-content-evaluate.js b/lib/checks/generic/has-text-content-evaluate.js index a3d28d5a7..e487f7254 100644 --- a/lib/checks/generic/has-text-content-evaluate.js +++ b/lib/checks/generic/has-text-content-evaluate.js @@ -3,7 +3,7 @@ import { sanitize, subtreeText } from '../../commons/text'; export default function hasTextContentEvaluate(node, options, virtualNode) { try { return sanitize(subtreeText(virtualNode)) !== ''; - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/keyboard/focusable-no-name-evaluate.js b/lib/checks/keyboard/focusable-no-name-evaluate.js index 3d84a3755..490470a67 100644 --- a/lib/checks/keyboard/focusable-no-name-evaluate.js +++ b/lib/checks/keyboard/focusable-no-name-evaluate.js @@ -10,7 +10,7 @@ function focusableNoNameEvaluate(node, options, virtualNode) { try { return !accessibleTextVirtual(virtualNode); - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/keyboard/frame-focusable-content-evaluate.js b/lib/checks/keyboard/frame-focusable-content-evaluate.js index 0b48657c4..60c47a531 100644 --- a/lib/checks/keyboard/frame-focusable-content-evaluate.js +++ b/lib/checks/keyboard/frame-focusable-content-evaluate.js @@ -13,7 +13,7 @@ export default function frameFocusableContentEvaluate( return !virtualNode.children.some(child => { return focusableDescendants(child); }); - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/keyboard/no-focusable-content-evaluate.js b/lib/checks/keyboard/no-focusable-content-evaluate.js index cb0b38cf9..dd338a1de 100644 --- a/lib/checks/keyboard/no-focusable-content-evaluate.js +++ b/lib/checks/keyboard/no-focusable-content-evaluate.js @@ -25,7 +25,7 @@ export default function noFocusableContentEvaluate(node, options, virtualNode) { } return false; - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/label/explicit-evaluate.js b/lib/checks/label/explicit-evaluate.js index 585371989..59b0c123c 100644 --- a/lib/checks/label/explicit-evaluate.js +++ b/lib/checks/label/explicit-evaluate.js @@ -35,7 +35,7 @@ function explicitEvaluate(node, options, virtualNode) { return !!explicitLabel; } }); - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/label/hidden-explicit-label-evaluate.js b/lib/checks/label/hidden-explicit-label-evaluate.js index eafcc1409..f74f285f9 100644 --- a/lib/checks/label/hidden-explicit-label-evaluate.js +++ b/lib/checks/label/hidden-explicit-label-evaluate.js @@ -16,7 +16,7 @@ function hiddenExplicitLabelEvaluate(node, options, virtualNode) { let name; try { name = accessibleTextVirtual(virtualNode).trim(); - } catch (e) { + } catch { return undefined; } diff --git a/lib/checks/label/implicit-evaluate.js b/lib/checks/label/implicit-evaluate.js index 4d43d9f5e..094095e2d 100644 --- a/lib/checks/label/implicit-evaluate.js +++ b/lib/checks/label/implicit-evaluate.js @@ -18,7 +18,7 @@ function implicitEvaluate(node, options, virtualNode) { return !!implicitLabel; } return false; - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/mobile/target-size-evaluate.js b/lib/checks/mobile/target-size-evaluate.js index 88c029f34..1fb76e775 100644 --- a/lib/checks/mobile/target-size-evaluate.js +++ b/lib/checks/mobile/target-size-evaluate.js @@ -135,7 +135,7 @@ function getLargestUnobscuredArea(vNode, obscuredNodes) { let unobscuredRects; try { unobscuredRects = splitRects(nodeRect, obscuringRects); - } catch (err) { + } catch { return null; } diff --git a/lib/checks/shared/aria-labelledby-evaluate.js b/lib/checks/shared/aria-labelledby-evaluate.js index e9910ef52..f01fa7bc9 100644 --- a/lib/checks/shared/aria-labelledby-evaluate.js +++ b/lib/checks/shared/aria-labelledby-evaluate.js @@ -4,7 +4,7 @@ import { arialabelledbyText } from '../../commons/aria'; function ariaLabelledbyEvaluate(node, options, virtualNode) { try { return !!sanitize(arialabelledbyText(virtualNode)); - } catch (e) { + } catch { return undefined; } } diff --git a/lib/checks/shared/svg-non-empty-title-evaluate.js b/lib/checks/shared/svg-non-empty-title-evaluate.js index b614de247..348f0f00b 100644 --- a/lib/checks/shared/svg-non-empty-title-evaluate.js +++ b/lib/checks/shared/svg-non-empty-title-evaluate.js @@ -24,7 +24,7 @@ function svgNonEmptyTitleEvaluate(node, options, virtualNode) { }); return false; } - } catch (e) { + } catch { return undefined; } diff --git a/lib/commons/aria/validate-attr-value.js b/lib/commons/aria/validate-attr-value.js index 862d8affa..d6f96b65b 100644 --- a/lib/commons/aria/validate-attr-value.js +++ b/lib/commons/aria/validate-attr-value.js @@ -50,7 +50,7 @@ function validateAttrValue(vNode, attr) { try { const doc = getRootNode(vNode.actualNode); return !!(value && doc.getElementById(value)); - } catch (e) { + } catch { throw new TypeError('Cannot resolve id references for partial DOM'); } diff --git a/lib/commons/color/color.js b/lib/commons/color/color.js index c6cb6496a..7a5eaa3af 100644 --- a/lib/commons/color/color.js +++ b/lib/commons/color/color.js @@ -166,7 +166,7 @@ export default class Color { this.b = color.b; // color.alpha is a Number object so convert it to a number this.alpha = +color.alpha; - } catch (err) { + } catch { throw new Error(`Unable to parse color "${colorString}"`); } diff --git a/lib/commons/dom/idrefs.js b/lib/commons/dom/idrefs.js index 2d044f95c..be3dc56db 100644 --- a/lib/commons/dom/idrefs.js +++ b/lib/commons/dom/idrefs.js @@ -33,7 +33,7 @@ function idrefs(node, attr) { } return result; - } catch (e) { + } catch { throw new TypeError('Cannot resolve id references for non-DOM nodes'); } } diff --git a/lib/core/utils/extend-meta-data.js b/lib/core/utils/extend-meta-data.js index 3634915b7..c97d895ce 100644 --- a/lib/core/utils/extend-meta-data.js +++ b/lib/core/utils/extend-meta-data.js @@ -11,7 +11,7 @@ function extendMetaData(to, from) { to[prop] = null; try { to[prop] = from[prop](to); - } catch (e) { + } catch { // Ignore } }); diff --git a/lib/core/utils/frame-messenger/message-parser.js b/lib/core/utils/frame-messenger/message-parser.js index c7154f8e3..881ac07c8 100644 --- a/lib/core/utils/frame-messenger/message-parser.js +++ b/lib/core/utils/frame-messenger/message-parser.js @@ -43,7 +43,7 @@ export function parseMessage(dataString) { let data; try { data = JSON.parse(dataString); - } catch (e) { + } catch { return; // Wasn't meant for us. } if (!isRespondableMessage(data)) { diff --git a/lib/core/utils/get-selector.js b/lib/core/utils/get-selector.js index 470946705..d37354df5 100644 --- a/lib/core/utils/get-selector.js +++ b/lib/core/utils/get-selector.js @@ -97,8 +97,6 @@ function filterAttributes(at) { * the counts for how many elements with that feature exist */ export function getSelectorData(domTree) { - /* eslint no-loop-func:0*/ - // Initialize the return structure with the three maps const data = { classes: {}, diff --git a/lib/core/utils/publish-metadata.js b/lib/core/utils/publish-metadata.js index 8354ceab0..3ab459ccb 100644 --- a/lib/core/utils/publish-metadata.js +++ b/lib/core/utils/publish-metadata.js @@ -50,7 +50,7 @@ function getIncompleteReason(checkData, messages) { throw new Error(); } return msg; - } catch (e) { + } catch { if (typeof checkData.missingData === 'string') { // return a string with the appropriate reason return messages.incomplete[checkData.missingData]; diff --git a/lib/rules/svg-namespace-matches.js b/lib/rules/svg-namespace-matches.js index 095cc96b5..382073b90 100644 --- a/lib/rules/svg-namespace-matches.js +++ b/lib/rules/svg-namespace-matches.js @@ -10,7 +10,7 @@ function svgNamespaceMatches(node, virtualNode) { // element is svg namespace if its parent is an svg element return !!closest(virtualNode, 'svg'); - } catch (e) { + } catch { return false; } } diff --git a/package-lock.json b/package-lock.json index a6c64c267..05fcc9792 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,11 +30,12 @@ "emoji-regex": "^10.2.1", "es6-promise": "^4.2.8", "esbuild": "^0.10.x", - "eslint": "^8.31.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-mocha-no-only": "^1.1.1", + "eslint": "^9.2.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-mocha-no-only": "^1.2.0", "execa": "5.x", "glob": "^10.3.10", + "globals": "^15.2.0", "grunt": "^1.5.3", "grunt-babel": "^8.0.0", "grunt-bytesize": "^0.2.0", @@ -1093,6 +1094,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", @@ -1904,6 +1914,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", @@ -1964,15 +1983,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1980,46 +1999,31 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", + "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@hapi/hoek": { @@ -2038,12 +2042,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -2065,11 +2069,24 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@humanwhocodes/retry": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", + "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -2560,12 +2577,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2586,9 +2597,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4639,18 +4650,6 @@ "node": ">=0.3.1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -5142,41 +5141,37 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", + "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.2.0", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.2.3", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -5190,7 +5185,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5209,9 +5204,9 @@ } }, "node_modules/eslint-plugin-mocha-no-only": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.1.1.tgz", - "integrity": "sha512-b+vgjJQ3SjRQCygBhomtjzvRQRpIP8Yd9cqwNSbcoVJREuNajao7M1Kl1aObAUc4wx98qsZyQyUSUxiAbMS9yA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.2.0.tgz", + "integrity": "sha512-sgOilWiikVmYysUvt9q7oUMBYuv/Tka8lQH3766DNxOVqJAKwmP7QqmGYVBiVmqGnn5CDYAo3WWT0F8qw5BDMQ==", "dev": true, "dependencies": { "requireindex": "~1.1.0" @@ -5221,16 +5216,16 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5248,45 +5243,42 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/espree": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5627,15 +5619,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -5773,22 +5765,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -6315,12 +6307,15 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", + "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globule": { @@ -6375,12 +6370,6 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -7110,9 +7099,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -7930,6 +7919,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -8226,6 +8221,15 @@ "node": ">=0.10.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -13950,6 +13954,14 @@ "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/plugin-transform-computed-properties": { @@ -14500,6 +14512,14 @@ "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/types": { @@ -14541,15 +14561,15 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -14558,26 +14578,17 @@ }, "dependencies": { "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true } } }, "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", + "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", "dev": true }, "@hapi/hoek": { @@ -14596,12 +14607,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } @@ -14613,9 +14624,15 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@humanwhocodes/retry": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", + "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", "dev": true }, "@hutson/parse-repository-url": { @@ -15049,12 +15066,6 @@ "@types/node": "*" } }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -15072,9 +15083,9 @@ } }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -16617,15 +16628,6 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -17008,41 +17010,37 @@ } }, "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", + "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.2.0", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.2.3", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -17053,19 +17051,10 @@ "text-table": "^0.2.0" }, "dependencies": { - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true } } @@ -17078,18 +17067,18 @@ "requires": {} }, "eslint-plugin-mocha-no-only": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.1.1.tgz", - "integrity": "sha512-b+vgjJQ3SjRQCygBhomtjzvRQRpIP8Yd9cqwNSbcoVJREuNajao7M1Kl1aObAUc4wx98qsZyQyUSUxiAbMS9yA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha-no-only/-/eslint-plugin-mocha-no-only-1.2.0.tgz", + "integrity": "sha512-sgOilWiikVmYysUvt9q7oUMBYuv/Tka8lQH3766DNxOVqJAKwmP7QqmGYVBiVmqGnn5CDYAo3WWT0F8qw5BDMQ==", "dev": true, "requires": { "requireindex": "~1.1.0" } }, "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -17103,14 +17092,22 @@ "dev": true }, "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "requires": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true + } } }, "esprima": { @@ -17379,12 +17376,12 @@ } }, "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" } }, "fill-range": { @@ -17496,19 +17493,19 @@ "dev": true }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "follow-redirects": { @@ -17889,9 +17886,9 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", + "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", "dev": true }, "globule": { @@ -17936,12 +17933,6 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -18467,9 +18458,9 @@ "dev": true }, "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "immediate": { @@ -19067,6 +19058,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -19305,6 +19302,15 @@ } } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", diff --git a/package.json b/package.json index 958bd4cb6..1de701c7d 100644 --- a/package.json +++ b/package.json @@ -137,11 +137,12 @@ "emoji-regex": "^10.2.1", "es6-promise": "^4.2.8", "esbuild": "^0.10.x", - "eslint": "^8.31.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-mocha-no-only": "^1.1.1", + "eslint": "^9.2.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-mocha-no-only": "^1.2.0", "execa": "5.x", "glob": "^10.3.10", + "globals": "^15.2.0", "grunt": "^1.5.3", "grunt-babel": "^8.0.0", "grunt-bytesize": "^0.2.0", diff --git a/test/core/base/rule.js b/test/core/base/rule.js index 421c06d76..893fa92da 100644 --- a/test/core/base/rule.js +++ b/test/core/base/rule.js @@ -903,7 +903,7 @@ describe('Rule', () => { {} ); isNotCalled(); - } catch (err) { + } catch { assert.isFalse(success); } }); diff --git a/test/core/utils/send-command-to-frame.js b/test/core/utils/send-command-to-frame.js index 0fe4412e1..60c09a44a 100644 --- a/test/core/utils/send-command-to-frame.js +++ b/test/core/utils/send-command-to-frame.js @@ -51,7 +51,7 @@ describe('axe.utils.sendCommandToFrame', () => { frame.contentWindow.addEventListener('message', function (event) { try { topics.push(JSON.parse(event.data).topic); - } catch (_) { + } catch { /* ignore */ } }); diff --git a/test/integration/rules/preprocessor.js b/test/integration/rules/preprocessor.js index fb58dfc73..f4accb97b 100644 --- a/test/integration/rules/preprocessor.js +++ b/test/integration/rules/preprocessor.js @@ -22,7 +22,7 @@ var createIntegrationPreprocessor = function (logger) { var html = fs.readFileSync(htmlpath, 'utf-8'); try { var test = JSON.parse(content); - } catch (e) { + } catch { throw new Error('Unable to parse content of ' + file.originalPath); } test.content = html; From 3f13aa10ff58f48e2eeb7fd5c35596c247cd2dfc Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Mon, 20 May 2024 08:00:59 -0500 Subject: [PATCH 060/400] fix(all-rules): fix flakey all-rules firefox test (#4467) wilco and I believe marque is to blame because it is animated This fixes the `all-rules` check, particularly on Firefox. We believe the issue is because marque has a moving bounding client rect, leading to inconsistent results. So instead we set the motion to none for a consistent testing environment. --- To see that it works, I've run the CI tests on this branch five times. It only failed on one unrelated flakey test this does not address. Also, https://github.com/dequelabs/axe-core/pull/4456 finally builds after many consistent test failures in the same place in a row after rebasing on this change. We can see this test failing on other branches, such as `develop` in places like this: https://app.circleci.com/pipelines/github/dequelabs/axe-core/6332/workflows/b3e2a293-c89b-4201-898d-1c6c64ee2764 which shows it has nothing to do with the other PR. --- test/integration/full/all-rules/all-rules.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/full/all-rules/all-rules.html b/test/integration/full/all-rules/all-rules.html index 62eaae44e..fc982c3fb 100644 --- a/test/integration/full/all-rules/all-rules.html +++ b/test/integration/full/all-rules/all-rules.html @@ -94,7 +94,7 @@

              Ok

              Paragraph.

              - This content is inside a marquee. + This content is inside a marquee.
              From 9a22787f4e4cc9334b2904fd55aa16a24ed133db Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Thu, 23 May 2024 09:42:18 -0600 Subject: [PATCH 061/400] perf: memoize DqElement (#4452) Noticed this when trying to debug perf issues in `duplicate-id-aria`. We've run into problems on sites that have a module repeat 1000s of times on the page and the module has an aria id that is also then repeated. Axe-core would take a really long time to run the rule. Looking into it what I discovered is that a majority of the time was spent on resolving the `relatedNodes` for each check. Since each each duplicate id node was also in the `relatedNodes` for every other node, this caused the single node to [be converted to a DqElement](https://github.com/dequelabs/axe-core/blob/develop/lib/core/utils/check-helper.js#L46) _n_ times. This lead to many performance problems, but specifically calling the `getSelector` of a DqElement would call `outerHTML` for the node _n*2_ times which would be very slow. To solve this I decided to memoize the DqElement creation. That way a single node will only ever output a single DqElement, thus saving significant time in creation. Not only that but every time a node appears in a result (either as the check node or a related node) the memory is now shared so this change also reduces the in-memory size of the results object. Testing a simple page with 5000 nodes of duplicate id, here are the results for running the `duplicate-id-aria` check. | Before change (in ms) | After change (in ms) | | ------------- | ------------- | | 21,280.1 | 11,841.1 | _Flamechart before the change. The majority of the time is spent in getSelector_ _Chrome performance timer of getSelector showing it spent 12000ms total in the function_ _Flamechart after the change. Time is now spent mostly resolving the cache which results in no time spent in getSelector_ --- lib/core/utils/dq-element.js | 10 +- test/core/utils/dq-element.js | 241 +++++++++++++++-------------- test/core/utils/node-serializer.js | 15 +- 3 files changed, 141 insertions(+), 125 deletions(-) diff --git a/lib/core/utils/dq-element.js b/lib/core/utils/dq-element.js index 3cf790fe1..edf3b6d39 100644 --- a/lib/core/utils/dq-element.js +++ b/lib/core/utils/dq-element.js @@ -4,6 +4,7 @@ import getXpath from './get-xpath'; import getNodeFromTree from './get-node-from-tree'; import AbstractVirtualNode from '../base/virtual-node/abstract-virtual-node'; import cache from '../base/cache'; +import memoize from './memoize'; const CACHE_KEY = 'DqElm.RunOptions'; @@ -36,7 +37,10 @@ function getSource(element) { * @param {Object} options Propagated from axe.run/etc * @param {Object} spec Properties to use in place of the element when instantiated on Elements from other frames */ -function DqElement(elm, options = null, spec = {}) { +const DqElement = memoize(function DqElement(elm, options, spec) { + options ??= null; + spec ??= {}; + if (!options) { options = cache.get(CACHE_KEY) ?? {}; } @@ -82,7 +86,9 @@ function DqElement(elm, options = null, spec = {}) { if (!axe._audit.noHtml) { this.source = this.spec.source ?? getSource(this._element); } -} + + return this; +}); DqElement.prototype = { /** diff --git a/test/core/utils/dq-element.js b/test/core/utils/dq-element.js index 3e6f036f9..dbef96ea6 100644 --- a/test/core/utils/dq-element.js +++ b/test/core/utils/dq-element.js @@ -1,135 +1,140 @@ -describe('DqElement', function () { - 'use strict'; +describe('DqElement', () => { + const DqElement = axe.utils.DqElement; + const fixture = document.getElementById('fixture'); + const fixtureSetup = axe.testUtils.fixtureSetup; + const queryFixture = axe.testUtils.queryFixture; - var DqElement = axe.utils.DqElement; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; - var queryFixture = axe.testUtils.queryFixture; - - afterEach(function () { + afterEach(() => { axe.reset(); }); - it('should be exposed to utils', function () { + it('should be exposed to utils', () => { assert.equal(axe.utils.DqElement, DqElement); }); - it('should take a virtual node as a parameter and return an object', function () { - var vNode = queryFixture('
              '); - var result = new DqElement(vNode); + it('should take a virtual node as a parameter and return an object', () => { + const vNode = queryFixture('
              '); + const result = new DqElement(vNode); assert.equal(result.element, vNode.actualNode); }); - it('should take an actual node as a parameter and return an object', function () { - var vNode = queryFixture('
              '); - var result = new DqElement(vNode.actualNode); + it('should take an actual node as a parameter and return an object', () => { + const vNode = queryFixture('
              '); + const result = new DqElement(vNode.actualNode); assert.equal(result.element, vNode.actualNode); }); - describe('element', function () { - it('should store reference to the element', function () { - var vNode = queryFixture('
              '); - var dqEl = new DqElement(vNode); + it('should return the same DqElement when instantiated with the same element', () => { + const vNode = queryFixture('
              '); + const result = new DqElement(vNode); + const result2 = new DqElement(vNode); + assert.equal(result, result2); + }); + + describe('element', () => { + it('should store reference to the element', () => { + const vNode = queryFixture('
              '); + const dqEl = new DqElement(vNode); assert.equal(dqEl.element, vNode.actualNode); }); - it('should not be present in stringified version', function () { - var vNode = queryFixture('
              '); - var dqEl = new DqElement(vNode); + it('should not be present in stringified version', () => { + const vNode = queryFixture('
              '); + const dqEl = new DqElement(vNode); assert.isUndefined(JSON.parse(JSON.stringify(dqEl)).element); }); }); - describe('source', function () { - it('should include the outerHTML of the element', function () { - var vNode = queryFixture('
              Hello!
              '); - var outerHTML = vNode.actualNode.outerHTML; - var result = new DqElement(vNode); + describe('source', () => { + it('should include the outerHTML of the element', () => { + const vNode = queryFixture('
              Hello!
              '); + const outerHTML = vNode.actualNode.outerHTML; + const result = new DqElement(vNode); assert.equal(result.source, outerHTML); }); - it('should work with SVG elements', function () { - var vNode = queryFixture(''); - var result = new DqElement(vNode); + it('should work with SVG elements', () => { + const vNode = queryFixture(''); + const result = new DqElement(vNode); assert.equal(result.source, vNode.actualNode.outerHTML); }); - it('should work with MathML', function () { - var vNode = queryFixture( + it('should work with MathML', () => { + const vNode = queryFixture( '' + 'x2' + '' ); - var result = new DqElement(vNode); + const result = new DqElement(vNode); assert.equal(result.source, vNode.actualNode.outerHTML); }); - it('should truncate large elements', function () { - var div = '
              '; - for (var i = 0; i < 300; i++) { + it('should truncate large elements', () => { + let div = '
              '; + for (let i = 0; i < 300; i++) { div += i; } div += '
              '; - var vNode = queryFixture(div); - var result = new DqElement(vNode); + const vNode = queryFixture(div); + const result = new DqElement(vNode); assert.equal(result.source, '
              '); }); - it('should use spec object over passed element', function () { - var vNode = queryFixture('
              Hello!
              '); - var spec = { source: 'woot' }; - var result = new DqElement(vNode, {}, spec); + it('should use spec object over passed element', () => { + const vNode = queryFixture('
              Hello!
              '); + const spec = { source: 'woot' }; + const result = new DqElement(vNode, {}, spec); assert.equal(result.source, 'woot'); }); - it('should return null if audit.noHtml is set', function () { + it('should return null if audit.noHtml is set', () => { axe.configure({ noHtml: true }); - var vNode = queryFixture('
              Hello!
              '); - var result = new DqElement(vNode); + const vNode = queryFixture('
              Hello!
              '); + const result = new DqElement(vNode); assert.isNull(result.source); }); - it('should not use spec object over passed element if audit.noHtml is set', function () { + it('should not use spec object over passed element if audit.noHtml is set', () => { axe.configure({ noHtml: true }); - var vNode = queryFixture('
              Hello!
              '); - var spec = { source: 'woot' }; - var result = new DqElement(vNode, {}, spec); + const vNode = queryFixture('
              Hello!
              '); + const spec = { source: 'woot' }; + const result = new DqElement(vNode, {}, spec); assert.isNull(result.source); }); }); - describe('selector', function () { - it('should prefer selector from spec object', function () { - var vNode = queryFixture('
              Hello!
              '); - var spec = { selector: 'woot' }; - var result = new DqElement(vNode, {}, spec); + describe('selector', () => { + it('should prefer selector from spec object', () => { + const vNode = queryFixture('
              Hello!
              '); + const spec = { selector: 'woot' }; + const result = new DqElement(vNode, {}, spec); assert.equal(result.selector, 'woot'); }); }); - describe('ancestry', function () { - it('should prefer selector from spec object', function () { - var vNode = queryFixture('
              Hello!
              '); - var spec = { ancestry: 'woot' }; - var result = new DqElement(vNode, {}, spec); + describe('ancestry', () => { + it('should prefer selector from spec object', () => { + const vNode = queryFixture('
              Hello!
              '); + const spec = { ancestry: 'woot' }; + const result = new DqElement(vNode, {}, spec); assert.equal(result.ancestry, 'woot'); }); }); - describe('xpath', function () { - it('should prefer selector from spec object', function () { - var vNode = queryFixture('
              Hello!
              '); - var spec = { xpath: 'woot' }; - var result = new DqElement(vNode, {}, spec); + describe('xpath', () => { + it('should prefer selector from spec object', () => { + const vNode = queryFixture('
              Hello!
              '); + const spec = { xpath: 'woot' }; + const result = new DqElement(vNode, {}, spec); assert.equal(result.xpath, 'woot'); }); }); - describe('absolutePaths', function () { - it('creates a path all the way to root', function () { - var vNode = queryFixture('
              Hello!
              '); - var result = new DqElement(vNode, { + describe('absolutePaths', () => { + it('creates a path all the way to root', () => { + const vNode = queryFixture('
              Hello!
              '); + const result = new DqElement(vNode, { absolutePaths: true }); assert.include(result.selector[0], 'html > '); @@ -138,31 +143,31 @@ describe('DqElement', function () { }); }); - describe('nodeIndexes', function () { - it('is taken from virtualNode', function () { + describe('nodeIndexes', () => { + it('is taken from virtualNode', () => { fixtureSetup(''); assert.deepEqual(new DqElement(fixture.children[0]).nodeIndexes, [1]); assert.deepEqual(new DqElement(fixture.children[1]).nodeIndexes, [2]); assert.deepEqual(new DqElement(fixture.children[2]).nodeIndexes, [3]); }); - it('is taken from spec, over virtualNode', function () { - var vNode = queryFixture('
              '); - var spec = { nodeIndexes: [123, 456] }; - var dqElm = new DqElement(vNode, {}, spec); + it('is taken from spec, over virtualNode', () => { + const vNode = queryFixture('
              '); + const spec = { nodeIndexes: [123, 456] }; + const dqElm = new DqElement(vNode, {}, spec); assert.deepEqual(dqElm.nodeIndexes, [123, 456]); }); - it('is [] when the element is not in the virtual tree.', function () { - var div = document.createElement('div'); - var dqElm = new DqElement(div); + it('is [] when the element is not in the virtual tree.', () => { + const div = document.createElement('div'); + const dqElm = new DqElement(div); assert.deepEqual(dqElm.nodeIndexes, []); }); }); - describe('toJSON', function () { - it('should only stringify selector and source', function () { - var spec = { + describe('toJSON', () => { + it('should only stringify selector and source', () => { + const spec = { selector: ['foo > bar > joe'], source: '', xpath: ['/foo/bar/joe'], @@ -171,28 +176,28 @@ describe('DqElement', function () { fromFrame: false }; - var div = document.createElement('div'); - var result = new DqElement(div, {}, spec); + const div = document.createElement('div'); + const result = new DqElement(div, {}, spec); assert.deepEqual(result.toJSON(), spec); }); }); - describe('merging frames', function () { - var dqMain, dqIframe; - beforeEach(function () { - var tree = fixtureSetup( + describe('merging frames', () => { + let dqMain, dqIframe; + beforeEach(() => { + const tree = fixtureSetup( '
              ' ); - var main = axe.utils.querySelectorAll(tree, 'main')[0]; - var mainSpec = { + const main = axe.utils.querySelectorAll(tree, 'main')[0]; + const mainSpec = { selector: ['#main'], ancestry: ['html > body > main'], xpath: ['/main'] }; dqMain = new DqElement(main, {}, mainSpec); - var iframe = axe.utils.querySelectorAll(tree, 'iframe')[0]; - var iframeSpec = { + const iframe = axe.utils.querySelectorAll(tree, 'iframe')[0]; + const iframeSpec = { selector: ['#iframe'], ancestry: ['html > body > iframe'], xpath: ['/iframe'] @@ -200,15 +205,15 @@ describe('DqElement', function () { dqIframe = new DqElement(iframe, {}, iframeSpec); }); - describe('.mergeSpecs', function () { - var mainSpec, iframeSpec; - beforeEach(function () { + describe('.mergeSpecs', () => { + let mainSpec, iframeSpec; + beforeEach(() => { mainSpec = dqMain.toJSON(); iframeSpec = dqIframe.toJSON(); }); - it('merges node and frame selectors', function () { - var mergedSpec = DqElement.mergeSpecs(mainSpec, iframeSpec); + it('merges node and frame selectors', () => { + const mergedSpec = DqElement.mergeSpecs(mainSpec, iframeSpec); assert.deepEqual(mergedSpec.selector, [ iframeSpec.selector[0], mainSpec.selector[0] @@ -223,8 +228,8 @@ describe('DqElement', function () { ]); }); - it('merges nodeIndexes', function () { - var mergedSpec = DqElement.mergeSpecs(mainSpec, iframeSpec); + it('merges nodeIndexes', () => { + const mergedSpec = DqElement.mergeSpecs(mainSpec, iframeSpec); assert.deepEqual(mergedSpec.nodeIndexes, [ iframeSpec.nodeIndexes[0], mainSpec.nodeIndexes[0] @@ -232,48 +237,48 @@ describe('DqElement', function () { }); }); - describe('DqElement.fromFrame', function () { - it('returns a new DqElement', function () { + describe('DqElement.fromFrame', () => { + it('returns a new DqElement', () => { assert.instanceOf(DqElement.fromFrame(dqMain, {}, dqIframe), DqElement); }); - it('sets options for DqElement', function () { - var options = { absolutePaths: true }; - var dqElm = DqElement.fromFrame(dqMain, options, dqIframe); + it('sets options for DqElement', () => { + const options = { absolutePaths: true }; + const dqElm = DqElement.fromFrame(dqMain, options, dqIframe); assert.isTrue(dqElm._options.toRoot); }); - it('has props as from mergeSpecs', function () { - var spec = DqElement.mergeSpecs(dqMain.toJSON(), dqIframe.toJSON()); - var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe); + it('has props as from mergeSpecs', () => { + const spec = DqElement.mergeSpecs(dqMain.toJSON(), dqIframe.toJSON()); + const dqElm = DqElement.fromFrame(dqMain, {}, dqIframe); assert.deepEqual(dqElm.toJSON(), spec); }); }); - describe('DqElement.prototype.fromFrame', function () { - it('is false when created without a spec', function () { + describe('DqElement.prototype.fromFrame', () => { + it('is false when created without a spec', () => { assert.isFalse(dqMain.fromFrame); }); - it('is false when spec is not from a frame', function () { - var specMain = dqMain.toJSON(); - var dqElm = new DqElement(dqMain, {}, specMain); + it('is false when spec is not from a frame', () => { + const specMain = dqMain.toJSON(); + const dqElm = new DqElement(dqMain, {}, specMain); assert.isFalse(dqElm.fromFrame); }); - it('is true when created with a spec', function () { - var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe); + it('is true when created with a spec', () => { + const dqElm = DqElement.fromFrame(dqMain, {}, dqIframe); assert.isTrue(dqElm.fromFrame); }); }); }); - describe('DqElement.setRunOptions', function () { - it('sets options for DqElement', function () { + describe('DqElement.setRunOptions', () => { + it('sets options for DqElement', () => { axe.setup(); - var options = { absolutePaths: true, elementRef: true }; + const options = { absolutePaths: true, elementRef: true }; DqElement.setRunOptions(options); - var dqElm = new DqElement(document.body); + const dqElm = new DqElement(document.body); const { element, selector } = dqElm.toJSON(); assert.equal(element, document.body); @@ -281,12 +286,12 @@ describe('DqElement', function () { }); it('is reset by axe.teardown', () => { - var options = { absolutePaths: true, elementRef: true }; + const options = { absolutePaths: true, elementRef: true }; DqElement.setRunOptions(options); axe.teardown(); axe.setup(); - var dqElm = new DqElement(document.body); + const dqElm = new DqElement(document.body); const { element, selector } = dqElm.toJSON(); assert.isUndefined(element); assert.equal(selector, 'body'); diff --git a/test/core/utils/node-serializer.js b/test/core/utils/node-serializer.js index 5d170de02..897d166d0 100644 --- a/test/core/utils/node-serializer.js +++ b/test/core/utils/node-serializer.js @@ -91,14 +91,19 @@ describe('nodeSerializer', () => { }); it('skips computing props turned off with runOptions', () => { - const dqElm = new DqElement(fixture); - const throws = () => { throw new Error('Should not be called'); }; - Object.defineProperty(dqElm, 'selector', { get: throws }); - Object.defineProperty(dqElm, 'ancestry', { get: throws }); - Object.defineProperty(dqElm, 'xpath', { get: throws }); + + const dqElm = new DqElement( + fixture, + {}, + { + selector: { get: throws }, + ancestry: { get: throws }, + xpath: { get: throws } + } + ); assert.doesNotThrow(() => { nodeSerializer.dqElmToSpec(dqElm, { From 6699ee404b4a0d52d32b96851d1a52d76d4867e8 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Thu, 23 May 2024 09:42:39 -0600 Subject: [PATCH 062/400] chore: ignore colorjs.io updates from dependabot (#4464) Ref: https://github.com/dequelabs/axe-core/pull/4449#pullrequestreview-2061020322 --------- Co-authored-by: Dan Bjorge --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b7ba1c567..20a8df72b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -36,6 +36,10 @@ updates: # @see https://github.com/dequelabs/axe-core/issues/3771 - dependency-name: 'esbuild' versions: ['>=0.11.0'] + # Prevent colorjs.io issue caused by >v0.4.3 + # @see https://github.com/dequelabs/axe-core/issues/4428 + - dependency-name: 'colorjs.io' + versions: ['>0.4.3'] groups: # Any updates not caught by the group config will get individual PRs npm-low-risk: From d3db593991261ad44eef1c142d8a4646edde93fa Mon Sep 17 00:00:00 2001 From: Matt Isner Date: Mon, 3 Jun 2024 17:38:03 -0400 Subject: [PATCH 063/400] fix(build): limit locales to valid files when using the --all-lang option (#4486) This change updates the code path that is invoked when the build is run using the `--all-lang` option. When assembling the list of locale files from the `/locales` directory, this change only includes files that satisfy _both_ of the following criteria: - Does not start with `_` - Ends with `.json` This effectively excludes `_template.json` and `README.md`, and may proactively filter out future utility files that do not follow the typical locale-file naming standard. Closes: #4485 --- Gruntfile.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 0a888fe1c..64cfb9ab1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -22,9 +22,13 @@ module.exports = function (grunt) { }); } else if (grunt.option('all-lang')) { var localeFiles = require('fs').readdirSync('./locales'); - langs = localeFiles.map(function (file) { - return '.' + file.replace('.json', ''); - }); + langs = localeFiles + .filter(function (file) { + return !file.startsWith('_') && file.endsWith('.json'); + }) + .map(function (file) { + return '.' + file.replace('.json', ''); + }); langs.unshift(''); // Add default } else { langs = ['']; From db4ec05e24ed05031355cdbfaa4b97b93d86ef0b Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:50:25 -0600 Subject: [PATCH 064/400] chore: ignore conventional-commits-parser >= 6 as esm (#4489) Conventional commits upgraded to ESM only in v6. Closes: https://github.com/dequelabs/axe-core/pull/4476 --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 20a8df72b..dfe93aaf6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -32,6 +32,8 @@ updates: versions: ['>=9.0.0'] - dependency-name: 'chai' versions: ['>=5.0.0'] + - dependency-name: 'conventional-commits-parser' + versions: ['>=6.0.0'] # Prevent Webpack error caused by v0.11+ of esbuild # @see https://github.com/dequelabs/axe-core/issues/3771 - dependency-name: 'esbuild' From 879a3668fda187b3f051aa11cf93028d3ebc2293 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:52:05 -0600 Subject: [PATCH 065/400] chore: bump chromedriver from 124.0.1 to 125.0.1 (#4477) Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 124.0.1 to 125.0.1.
              Commits

              [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=chromedriver&package-manager=npm_and_yarn&previous-version=124.0.1&new-version=125.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
              Dependabot commands and options
              You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
              Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05fcc9792..da8076b59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3405,9 +3405,9 @@ } }, "node_modules/chromedriver": { - "version": "124.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-124.0.1.tgz", - "integrity": "sha512-hxd1tpAUhgMFBZd1h3W7KyMckxofOYCuKAMtcvBDAU0YKKorZcWuq6zP06+Ph0Z1ynPjtgAj0hP9VphCwesjZw==", + "version": "125.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-125.0.1.tgz", + "integrity": "sha512-8cNZTAZV1posaWzVbC0S9MG+Cf3Dq1oGRnr3pSxuKwhO9Jnjjd4/N71VmkUJq7pqk2IedRStbmlkUM/ACn22XA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15681,9 +15681,9 @@ } }, "chromedriver": { - "version": "124.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-124.0.1.tgz", - "integrity": "sha512-hxd1tpAUhgMFBZd1h3W7KyMckxofOYCuKAMtcvBDAU0YKKorZcWuq6zP06+Ph0Z1ynPjtgAj0hP9VphCwesjZw==", + "version": "125.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-125.0.1.tgz", + "integrity": "sha512-8cNZTAZV1posaWzVbC0S9MG+Cf3Dq1oGRnr3pSxuKwhO9Jnjjd4/N71VmkUJq7pqk2IedRStbmlkUM/ACn22XA==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", From ae320fa8b9a416747a6ec3438882dac090f0ff6c Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:34:21 -0600 Subject: [PATCH 066/400] chore: make cherry-pick script executable (#4490) The build script wasn't committed as executable, nor had the node comment. No QA needed --- build/cherry-pick.js | 2 ++ 1 file changed, 2 insertions(+) mode change 100644 => 100755 build/cherry-pick.js diff --git a/build/cherry-pick.js b/build/cherry-pick.js old mode 100644 new mode 100755 index f8546c146..f8040807b --- a/build/cherry-pick.js +++ b/build/cherry-pick.js @@ -1,3 +1,5 @@ +#!/usr/bin/env node + const { execSync } = require('child_process'); const conventionalCommitsParser = require('conventional-commits-parser'); const chalk = require('chalk'); From ed1c8743bb2c9562f470163384e79a443c95291a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:44:54 -0600 Subject: [PATCH 067/400] chore: bump the npm-low-risk group across 1 directory with 13 updates (#4491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the npm-low-risk group with 13 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@axe-core/webdriverjs](https://github.com/dequelabs/axe-core-npm) | `4.9.0` | `4.9.1` | | [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.24.5` | `7.24.6` | | [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.24.5` | `7.24.6` | | [@babel/runtime-corejs3](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs3) | `7.24.5` | `7.24.6` | | [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) | `3.37.0` | `3.37.1` | | [eslint](https://github.com/eslint/eslint) | `9.2.0` | `9.4.0` | | [glob](https://github.com/isaacs/node-glob) | `10.3.12` | `10.4.1` | | [globals](https://github.com/sindresorhus/globals) | `15.2.0` | `15.3.0` | | [jsdom](https://github.com/jsdom/jsdom) | `24.0.0` | `24.1.0` | | [lint-staged](https://github.com/okonet/lint-staged) | `15.2.2` | `15.2.5` | | [memoizee](https://github.com/medikoo/memoizee) | `0.4.15` | `0.4.17` | | [prettier](https://github.com/prettier/prettier) | `3.2.5` | `3.3.0` | | [selenium-webdriver](https://github.com/SeleniumHQ/selenium) | `4.20.0` | `4.21.0` | Updates `@axe-core/webdriverjs` from 4.9.0 to 4.9.1
              Release notes

              Sourced from @​axe-core/webdriverjs's releases.

              Release 4.9.1

              What's Changed

              Full Changelog: https://github.com/dequelabs/axe-core-npm/compare/v4.9.0...v4.9.1

              Changelog

              Sourced from @​axe-core/webdriverjs's changelog.

              4.9.1 (2024-05-15)

              Bug Fixes

              Commits

              Updates `@babel/core` from 7.24.5 to 7.24.6
              Release notes

              Sourced from @​babel/core's releases.

              v7.24.6 (2024-05-24)

              Thanks @​amjed-98, @​blakewilson, @​coelhucas, and @​SukkaW for your first PRs!

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other

              Committers: 9

              Changelog

              Sourced from @​babel/core's changelog.

              v7.24.6 (2024-05-24)

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other
              Commits

              Updates `@babel/preset-env` from 7.24.5 to 7.24.6
              Release notes

              Sourced from @​babel/preset-env's releases.

              v7.24.6 (2024-05-24)

              Thanks @​amjed-98, @​blakewilson, @​coelhucas, and @​SukkaW for your first PRs!

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other

              Committers: 9

              Changelog

              Sourced from @​babel/preset-env's changelog.

              v7.24.6 (2024-05-24)

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other
              Commits

              Updates `@babel/runtime-corejs3` from 7.24.5 to 7.24.6
              Release notes

              Sourced from @​babel/runtime-corejs3's releases.

              v7.24.6 (2024-05-24)

              Thanks @​amjed-98, @​blakewilson, @​coelhucas, and @​SukkaW for your first PRs!

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other

              Committers: 9

              Changelog

              Sourced from @​babel/runtime-corejs3's changelog.

              v7.24.6 (2024-05-24)

              :bug: Bug Fix

              • babel-helper-create-class-features-plugin, babel-plugin-transform-class-properties
              • babel-core, babel-generator, babel-plugin-transform-modules-commonjs
              • babel-helper-create-class-features-plugin, babel-plugin-proposal-decorators
              • babel-helpers, babel-plugin-proposal-decorators, babel-runtime-corejs3
                • #16483 Fix: throw TypeError if addInitializer is called after finished (@​JLHwung)
              • babel-parser, babel-plugin-transform-typescript

              :house: Internal

              • babel-core, babel-helpers, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-helpers
              • babel-cli, babel-helpers, babel-plugin-external-helpers, babel-plugin-proposal-decorators, babel-plugin-transform-class-properties, babel-plugin-transform-modules-commonjs, babel-plugin-transform-modules-systemjs, babel-plugin-transform-runtime, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
              • babel-parser, babel-traverse
              • Other
              Commits

              Updates `core-js` from 3.37.0 to 3.37.1
              Changelog

              Sourced from core-js's changelog.

              3.37.1 - 2024.05.14
              Commits

              Updates `eslint` from 9.2.0 to 9.4.0
              Release notes

              Sourced from eslint's releases.

              v9.4.0

              Features

              • 89a4a0a feat: ignore IIFE's in the no-loop-func rule (#17528) (Nitin Kumar)

              Bug Fixes

              • f6534d1 fix: skip processor code blocks that match only universal patterns (#18507) (Milos Djermanovic)
              • 7226ebd fix: allow implicit undefined return in no-constructor-return (#18515) (Ali Rezvani)
              • 389744b fix: use @eslint/config-inspector@latest (#18483) (唯然)
              • 70118a5 fix: func-style false positive with arrow functions and super (#18473) (Milos Djermanovic)

              Documentation

              • d7ab6f5 docs: update theme when when prefers-color-scheme changes (#18510) (Nitin Kumar)
              • 525fdff docs: fix components files (#18519) (Tanuj Kanti)
              • 80747d2 docs: refactor prefer-destructuring rule (#18472) (Tanuj Kanti)
              • f06e0b5 docs: clarify func-style (#18477) (Cameron Steffen)

              Chores

              • 010dd2e chore: upgrade to @eslint/js@9.4.0 (#18534) (Francesco Trotta)
              • 5e1b5dc chore: package.json update for @​eslint/js release (Jenkins)
              • 594145f refactor: switch to @eslint/config-array (#18527) (Francesco Trotta)

              v9.3.0

              Features

              • b32153c feat: add overrides.namedExports to func-style rule (#18444) (Percy Ma)
              • b67eba4 feat: add restrictedNamedExportsPattern to no-restricted-exports (#18431) (Akul Srivastava)
              • 069aa68 feat: add option allowEscape to no-misleading-character-class rule (#18208) (Francesco Trotta)
              • 05ef92d feat: deprecate multiline-comment-style & line-comment-position (#18435) (唯然)
              • db0b174 feat: add enforceForInnerExpressions option to no-extra-boolean-cast (#18222) (Kirk Waiblinger)

              Bug Fixes

              • 8db0eff fix: Improve config error messages (#18457) (Nicholas C. Zakas)
              • 5c28d9a fix: don't remove comments between key and value in object-shorthand (#18442) (Kuba Jastrzębski)
              • 39fb0ee fix: object-shorthand loses type parameters when auto-fixing (#18438) (dalaoshu)
              • 37eba48 fix: don't crash when fs.readFile returns promise from another realm (#18416) (Milos Djermanovic)

              Documentation

              • ceada8c docs: explain how to use "tsc waiting" label (#18466) (Francesco Trotta)
              • 62e686c docs: Add troubleshooting info for plugin compatibility (#18451) (Nicholas C. Zakas)
              • e17e1c0 docs: Update README (GitHub Actions Bot)
              • 2465a1e docs: Update README (GitHub Actions Bot)
              • d23574c docs: Clarify usage of no-unreachable with TypeScript (#18445) (benj-dobs)
              • 1db9bae docs: Fix typos (#18443) (Frieder Bluemle)
              • 7065196 docs: Update README (GitHub Actions Bot)
              • 04e7c6e docs: update deprecation notice of no-return-await (#18433) (Tanuj Kanti)
              • e763512 docs: Link global ignores section in config object property list (#18430) (MaoShizhong)
              • ac7f718 docs: reflect release of v9 in config migration guide (#18412) (Peter Briggs)
              • 0de0909 docs: fix grammar in configuration file resolution (#18419) (Mike McCready)

              Chores

              • 58e2719 chore: update dependencies for v9.3.0 release (#18469) (Francesco Trotta)

              ... (truncated)

              Changelog

              Sourced from eslint's changelog.

              v9.4.0 - May 31, 2024

              • 010dd2e chore: upgrade to @eslint/js@9.4.0 (#18534) (Francesco Trotta)
              • 5e1b5dc chore: package.json update for @​eslint/js release (Jenkins)
              • d7ab6f5 docs: update theme when when prefers-color-scheme changes (#18510) (Nitin Kumar)
              • 594145f refactor: switch to @eslint/config-array (#18527) (Francesco Trotta)
              • 525fdff docs: fix components files (#18519) (Tanuj Kanti)
              • 89a4a0a feat: ignore IIFE's in the no-loop-func rule (#17528) (Nitin Kumar)
              • 80747d2 docs: refactor prefer-destructuring rule (#18472) (Tanuj Kanti)
              • f6534d1 fix: skip processor code blocks that match only universal patterns (#18507) (Milos Djermanovic)
              • 7226ebd fix: allow implicit undefined return in no-constructor-return (#18515) (Ali Rezvani)
              • f06e0b5 docs: clarify func-style (#18477) (Cameron Steffen)
              • 389744b fix: use @eslint/config-inspector@latest (#18483) (唯然)
              • 70118a5 fix: func-style false positive with arrow functions and super (#18473) (Milos Djermanovic)

              v9.3.0 - May 17, 2024

              • 58e2719 chore: update dependencies for v9.3.0 release (#18469) (Francesco Trotta)
              • b681ecb chore: package.json update for @​eslint/js release (Jenkins)
              • 8db0eff fix: Improve config error messages (#18457) (Nicholas C. Zakas)
              • ceada8c docs: explain how to use "tsc waiting" label (#18466) (Francesco Trotta)
              • b32153c feat: add overrides.namedExports to func-style rule (#18444) (Percy Ma)
              • 06f1d1c chore: update dependency @​humanwhocodes/retry to ^0.3.0 (#18463) (renovate[bot])
              • 5c28d9a fix: don't remove comments between key and value in object-shorthand (#18442) (Kuba Jastrzębski)
              • 62e686c docs: Add troubleshooting info for plugin compatibility (#18451) (Nicholas C. Zakas)
              • e17e1c0 docs: Update README (GitHub Actions Bot)
              • 39fb0ee fix: object-shorthand loses type parameters when auto-fixing (#18438) (dalaoshu)
              • b67eba4 feat: add restrictedNamedExportsPattern to no-restricted-exports (#18431) (Akul Srivastava)
              • 2465a1e docs: Update README (GitHub Actions Bot)
              • d23574c docs: Clarify usage of no-unreachable with TypeScript (#18445) (benj-dobs)
              • 1db9bae docs: Fix typos (#18443) (Frieder Bluemle)
              • 069aa68 feat: add option allowEscape to no-misleading-character-class rule (#18208) (Francesco Trotta)
              • 7065196 docs: Update README (GitHub Actions Bot)
              • 05ef92d feat: deprecate multiline-comment-style & line-comment-position (#18435) (唯然)
              • a63ed72 refactor: Use node: protocol for built-in Node.js modules (#18434) (Milos Djermanovic)
              • 04e7c6e docs: update deprecation notice of no-return-await (#18433) (Tanuj Kanti)
              • e763512 docs: Link global ignores section in config object property list (#18430) (MaoShizhong)
              • 37eba48 fix: don't crash when fs.readFile returns promise from another realm (#18416) (Milos Djermanovic)
              • 040700a chore: update dependency markdownlint-cli to ^0.40.0 (#18425) (renovate[bot])
              • f47847c chore: update actions/stale action to v9 (#18426) (renovate[bot])
              • c18ad25 chore: update actions/upload-artifact action to v4 (#18427) (renovate[bot])
              • 27e3060 chore: Disable documentation label (#18423) (Nicholas C. Zakas)
              • ac7f718 docs: reflect release of v9 in config migration guide (#18412) (Peter Briggs)
              • db0b174 feat: add enforceForInnerExpressions option to no-extra-boolean-cast (#18222) (Kirk Waiblinger)
              • 0de0909 docs: fix grammar in configuration file resolution (#18419) (Mike McCready)... _Description has been truncated_ Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 2694 +++++++++++++++++++++++---------------------- 1 file changed, 1355 insertions(+), 1339 deletions(-) diff --git a/package-lock.json b/package-lock.json index da8076b59..2db745e90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "browser-driver-manager": "1.0.4", "chai": "^4.3.7", "chalk": "^4.x", - "chromedriver": "latest", + "chromedriver": "*", "clean-jsdoc-theme": "^4.2.17", "clone": "^2.1.2", "colorjs.io": "0.4.3", @@ -105,24 +105,24 @@ } }, "node_modules/@axe-core/webdriverjs": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.0.tgz", - "integrity": "sha512-eX9dtgrppYShyPy/xc58I+G/T0ENLbiqkOHk+cJn/jLOcdOYg2mO98fME3I/zMQiZ15cLiD747Fmcr2DAG1WFA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.1.tgz", + "integrity": "sha512-TslVeodkrkdZxmD9mKWKA7zyUhyRNzhpEjQ91XDjZUE493luRkHl/pyWk6awQQfrG8nAWFtGATn9KelGiLl/JQ==", "dev": true, "dependencies": { - "axe-core": "~4.9.0" + "axe-core": "~4.9.1" }, "peerDependencies": { "selenium-webdriver": ">3.0.0-beta || >=2.53.1 || >4.0.0-alpha" } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -130,30 +130,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -169,12 +169,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -198,37 +198,37 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -253,19 +253,19 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -276,12 +276,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -309,74 +309,74 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -386,35 +386,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -424,14 +424,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -441,103 +441,102 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -618,9 +617,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -630,13 +629,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -646,12 +645,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -661,14 +660,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -678,13 +677,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -788,12 +787,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -803,12 +802,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -960,12 +959,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -975,14 +974,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -993,14 +992,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1010,12 +1009,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1025,12 +1024,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1040,13 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1056,13 +1055,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1073,18 +1072,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1104,13 +1103,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1120,12 +1119,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1135,13 +1134,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1151,12 +1150,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1166,12 +1165,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1182,13 +1181,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1198,12 +1197,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1214,13 +1213,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1230,14 +1229,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1247,12 +1246,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1263,12 +1262,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1278,12 +1277,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1294,12 +1293,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1309,13 +1308,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1325,14 +1324,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1342,15 +1341,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1360,13 +1359,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1376,13 +1375,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1392,12 +1391,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1407,12 +1406,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1423,12 +1422,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1439,15 +1438,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1457,13 +1456,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1473,12 +1472,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1489,13 +1488,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1506,12 +1505,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1521,13 +1520,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1537,14 +1536,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1555,12 +1554,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1570,12 +1569,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1586,12 +1585,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1601,12 +1600,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1616,13 +1615,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1632,12 +1631,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1647,12 +1646,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1662,12 +1661,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1677,12 +1676,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1692,13 +1691,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1708,13 +1707,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1724,13 +1723,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1740,27 +1739,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1772,54 +1771,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1855,9 +1854,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1867,9 +1866,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", - "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz", + "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==", "dev": true, "dependencies": { "core-js-pure": "^3.30.2", @@ -1880,33 +1879,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1924,13 +1923,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1982,10 +1981,24 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", + "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2018,9 +2031,18 @@ } }, "node_modules/@eslint/js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", - "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", + "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", + "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2041,20 +2063,6 @@ "@hapi/hoek": "^9.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2068,16 +2076,10 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "node_modules/@humanwhocodes/retry": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", - "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true, "engines": { "node": ">=18.18" @@ -2812,9 +2814,9 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.0.tgz", - "integrity": "sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "dev": true, "engines": { "node": ">=4" @@ -3065,12 +3067,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3693,12 +3695,12 @@ } }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/compare-func": { @@ -4252,9 +4254,9 @@ } }, "node_modules/core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true, "hasInstallScript": true, "funding": { @@ -4381,13 +4383,16 @@ "dev": true }, "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dev": true, "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/dargs": { @@ -5019,14 +5024,15 @@ } }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -5141,18 +5147,18 @@ } }, "node_modules/eslint": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", - "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", + "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.2.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint/config-array": "^0.15.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.4.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", @@ -5255,6 +5261,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", @@ -5441,12 +5462,6 @@ "type": "^2.7.2" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5631,9 +5646,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6207,22 +6222,22 @@ } }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6250,9 +6265,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6307,9 +6322,9 @@ } }, "node_modules/globals": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", - "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz", + "integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==", "dev": true, "engines": { "node": ">=18" @@ -7724,9 +7739,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.2.3.tgz", + "integrity": "sha512-htOzIMPbpLid/Gq9/zaz9SfExABxqRe1sSCdxntlO/aMD6u0issZQiY25n2GKQUtJ02j7z5sfptlAOMpWWOmvw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -7832,9 +7847,9 @@ } }, "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", "dev": true, "dependencies": { "cssstyle": "^4.0.1", @@ -7842,21 +7857,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.10", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.17.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -7895,6 +7910,12 @@ "node": ">=0.10.0" } }, + "node_modules/jsdom/node_modules/rrweb-cssom": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.0.tgz", + "integrity": "sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==", + "dev": true + }, "node_modules/jsdom/node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -8335,12 +8356,15 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -8359,21 +8383,21 @@ } }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "version": "15.2.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz", + "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==", "dev": true, "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -8532,16 +8556,16 @@ } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", + "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.3.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -8738,13 +8762,10 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -8870,18 +8891,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -9078,19 +9087,22 @@ } }, "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", "dev": true, "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", + "d": "^1.0.2", + "es5-ext": "^0.10.64", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/memorystream": { @@ -9146,12 +9158,12 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -9245,9 +9257,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -9849,9 +9861,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", "dev": true }, "node_modules/object-assign": { @@ -10297,25 +10309,25 @@ } }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -10444,9 +10456,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz", + "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -11136,9 +11148,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, "node_modules/rimraf": { @@ -11274,9 +11286,9 @@ "dev": true }, "node_modules/selenium-webdriver": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.20.0.tgz", - "integrity": "sha512-s/G44lGQ1xB3tmtX6NNPomlkpL6CxLdmAvp/AGWWwi4qv5Te1+qji7tPSyr6gyuoPpdYiof1rKnWe3luy0MrYA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.21.0.tgz", + "integrity": "sha512-WaEJHZjOWNth1QG5FEpxpREER0qptZBMonFU6GtAqdCNLJVxbtC3E7oS/I/+Q1sf1W032Wg0Ebk+m46lANOXyQ==", "dev": true, "dependencies": { "jszip": "^3.10.1", @@ -11284,7 +11296,7 @@ "ws": ">=8.16.0" }, "engines": { - "node": ">= 14.20.0" + "node": ">= 14.21.0" } }, "node_modules/semver": { @@ -11978,9 +11990,9 @@ "dev": true }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -12312,9 +12324,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -12381,9 +12393,9 @@ "dev": true }, "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", "dev": true }, "node_modules/type-check": { @@ -13030,9 +13042,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13096,10 +13108,13 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -13249,46 +13264,46 @@ } }, "@axe-core/webdriverjs": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.0.tgz", - "integrity": "sha512-eX9dtgrppYShyPy/xc58I+G/T0ENLbiqkOHk+cJn/jLOcdOYg2mO98fME3I/zMQiZ15cLiD747Fmcr2DAG1WFA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@axe-core/webdriverjs/-/webdriverjs-4.9.1.tgz", + "integrity": "sha512-TslVeodkrkdZxmD9mKWKA7zyUhyRNzhpEjQ91XDjZUE493luRkHl/pyWk6awQQfrG8nAWFtGATn9KelGiLl/JQ==", "dev": true, "requires": { - "axe-core": "~4.9.0" + "axe-core": "~4.9.1" } }, "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dev": true, "requires": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "dev": true }, "@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -13297,12 +13312,12 @@ } }, "@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dev": true, "requires": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -13322,31 +13337,31 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dev": true, "requires": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -13370,29 +13385,29 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" } @@ -13411,172 +13426,171 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "dev": true }, "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" } }, "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dev": true, "requires": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dev": true, "requires": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" } }, "@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" } }, "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" } }, "@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" } }, "@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dev": true, "requires": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dev": true, "requires": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" } }, "@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" } }, "@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dev": true, "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" } }, "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -13641,49 +13655,49 @@ } }, "@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "dev": true }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-proposal-object-rest-spread": { @@ -13752,21 +13766,21 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-syntax-import-meta": { @@ -13870,89 +13884,89 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "dependencies": { @@ -13965,423 +13979,423 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" } }, "@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" } }, "@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -14393,54 +14407,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -14467,18 +14481,18 @@ "dev": true }, "@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/runtime-corejs3": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", - "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz", + "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==", "dev": true, "requires": { "core-js-pure": "^3.30.2", @@ -14486,30 +14500,30 @@ } }, "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" } }, "@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -14523,13 +14537,13 @@ } }, "@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" } }, @@ -14560,10 +14574,21 @@ "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true }, + "@eslint/config-array": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", + "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "dev": true, + "requires": { + "@eslint/object-schema": "^2.1.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, "@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -14586,9 +14611,15 @@ } }, "@eslint/js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", - "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", + "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", + "dev": true + }, + "@eslint/object-schema": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", + "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", "dev": true }, "@hapi/hoek": { @@ -14606,33 +14637,16 @@ "@hapi/hoek": "^9.0.0" } }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "@humanwhocodes/retry": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", - "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true }, "@hutson/parse-repository-url": { @@ -15246,9 +15260,9 @@ "dev": true }, "axe-core": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.0.tgz", - "integrity": "sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "dev": true }, "axios": { @@ -15457,12 +15471,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-driver-manager": { @@ -15899,9 +15913,9 @@ } }, "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true }, "compare-func": { @@ -16339,9 +16353,9 @@ "dev": true }, "core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true }, "core-js-compat": { @@ -16433,13 +16447,13 @@ "dev": true }, "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dev": true, "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" } }, "dargs": { @@ -16915,13 +16929,14 @@ } }, "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, @@ -17010,18 +17025,18 @@ } }, "eslint": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", - "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", + "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.2.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint/config-array": "^0.15.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.4.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", @@ -17091,6 +17106,18 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + } + }, "espree": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", @@ -17233,14 +17260,6 @@ "dev": true, "requires": { "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - } } }, "extend": { @@ -17385,9 +17404,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -17809,16 +17828,16 @@ } }, "glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "dependencies": { "brace-expansion": { @@ -17831,9 +17850,9 @@ } }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -17886,9 +17905,9 @@ } }, "globals": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", - "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz", + "integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==", "dev": true }, "globule": { @@ -18905,9 +18924,9 @@ "dev": true }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.2.3.tgz", + "integrity": "sha512-htOzIMPbpLid/Gq9/zaz9SfExABxqRe1sSCdxntlO/aMD6u0issZQiY25n2GKQUtJ02j7z5sfptlAOMpWWOmvw==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -18995,9 +19014,9 @@ } }, "jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", "dev": true, "requires": { "cssstyle": "^4.0.1", @@ -19005,21 +19024,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.10", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.17.0", "xml-name-validator": "^5.0.0" }, "dependencies": { @@ -19041,6 +19060,12 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "rrweb-cssom": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.0.tgz", + "integrity": "sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==", + "dev": true + }, "whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -19400,9 +19425,9 @@ } }, "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true }, "lines-and-columns": { @@ -19421,21 +19446,21 @@ } }, "lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "version": "15.2.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz", + "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==", "dev": true, "requires": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "dependencies": { "chalk": { @@ -19524,16 +19549,16 @@ } }, "listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", + "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==", "dev": true, "requires": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.3.1", "wrap-ansi": "^9.0.0" }, "dependencies": { @@ -19677,13 +19702,10 @@ }, "dependencies": { "ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "requires": { - "type-fest": "^3.0.0" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true }, "ansi-regex": { "version": "6.0.1", @@ -19755,12 +19777,6 @@ "ansi-regex": "^6.0.1" } }, - "type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true - }, "wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -19910,13 +19926,13 @@ "dev": true }, "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", "dev": true, "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", + "d": "^1.0.2", + "es5-ext": "^0.10.64", "es6-weak-map": "^2.0.3", "event-emitter": "^0.3.5", "is-promise": "^2.2.2", @@ -19965,12 +19981,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -20034,9 +20050,9 @@ } }, "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, "mkdirp": { @@ -20513,9 +20529,9 @@ } }, "nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", "dev": true }, "object-assign": { @@ -20852,9 +20868,9 @@ "dev": true }, "path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { "lru-cache": "^10.2.0", @@ -20862,9 +20878,9 @@ }, "dependencies": { "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true } } @@ -20967,9 +20983,9 @@ "dev": true }, "prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz", + "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==", "dev": true }, "pretty-bytes": { @@ -21493,9 +21509,9 @@ "dev": true }, "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, "rimraf": { @@ -21598,9 +21614,9 @@ "dev": true }, "selenium-webdriver": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.20.0.tgz", - "integrity": "sha512-s/G44lGQ1xB3tmtX6NNPomlkpL6CxLdmAvp/AGWWwi4qv5Te1+qji7tPSyr6gyuoPpdYiof1rKnWe3luy0MrYA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.21.0.tgz", + "integrity": "sha512-WaEJHZjOWNth1QG5FEpxpREER0qptZBMonFU6GtAqdCNLJVxbtC3E7oS/I/+Q1sf1W032Wg0Ebk+m46lANOXyQ==", "dev": true, "requires": { "jszip": "^3.10.1", @@ -22127,9 +22143,9 @@ "dev": true }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -22411,9 +22427,9 @@ "dev": true }, "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "requires": { "psl": "^1.1.33", @@ -22466,9 +22482,9 @@ "dev": true }, "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", "dev": true }, "type-check": { @@ -22939,9 +22955,9 @@ "dev": true }, "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "requires": {} }, @@ -22982,9 +22998,9 @@ "dev": true }, "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", "dev": true }, "yargs": { From 070bc0187cdf9aa2e60294c634bcb588a9ed6e15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:50:41 -0600 Subject: [PATCH 068/400] chore: bump sinon from 17.0.1 to 18.0.0 (#4475) Bumps [sinon](https://github.com/sinonjs/sinon) from 17.0.1 to 18.0.0.
                Changelog

                Sourced from sinon's changelog.

                18.0.0

                This is what 17.0.2 should have been, as that contained two breaking changes. After updating Nise we are down to one breaking change, which only affects sinon-test (which has been updated), so most people are not affected. The legacyRoutes flag that is currently enabled in Nise by default will at some later version be disabled. We will then issue a little migration note.

                • 01d45312 Use Nise 6 with legacyRoutes flag enabled (Carl-Erik Kopseng)

                  This should be disabled in a future Sinon version by default.

                • c618edc5 fix #2594: remove needless sandbox creation (Carl-Erik Kopseng)

                Released by Carl-Erik Kopseng on 2024-05-15.

                17.0.2

                • f6dca0ba upgrade packages (#2595) (Carl-Erik Kopseng)
                • 5025d001 Avoid return and callArg* clearing each other's state (#2593) (Carl-Erik Kopseng)
                  • Partially revert "fix returns does not override call through (#2567)"
                  • revert to the old manual clearing of props
                • ed068a88 Bump ip from 1.1.8 to 1.1.9 (#2587) (dependabot[bot])
                • ec4d592e fix #2589: avoid invoking getter as side-effect (#2592) (Carl-Erik Kopseng)
                • 9972e1e3 Fix typo in mocks documentation (#2591) (Eduardo de la Cruz Palacios)
                • 52e6e4c5 chore: prefer cache option of setup-node (Morgan Roderick)
                • 08da1235 Bump actions/cache from 3 to 4 (dependabot[bot])
                • 404ef47e Bump nokogiri from 1.14.3 to 1.16.2 (dependabot[bot])
                • fd79612c Update Bug_report.md (Carl-Erik Kopseng)
                • 1fbc812a Re-add about (Carl-Erik Kopseng)
                • fc8f6c3e Fix formatting :clown: (Carl-Erik Kopseng)
                • c57e38ae Remove old template (Carl-Erik Kopseng)
                • 754bf7a9 Update Bug_report.md (Carl-Erik Kopseng)
                • 87eed9d2 Fix some typos at code comments (#2581) (EliyahuMachluf)
                • cbae6997 Link to createStubInstance util.md docs in stubs.md (#2577) (Daniel Kaplan)

                ... (truncated)

                Commits

                [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sinon&package-manager=npm_and_yarn&previous-version=17.0.1&new-version=18.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
                Dependabot commands and options
                You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
                Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 188 ++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 58 insertions(+), 132 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2db745e90..aa200454f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "revalidator": "^0.3.1", "selenium-webdriver": "^4.7.1", "serve-handler": "^6.1.5", - "sinon": "^17.0.0", + "sinon": "^18.0.0", "sri-toolbox": "^0.2.0", "standard-version": "^9.5.0", "start-server-and-test": "^2.0.1", @@ -2453,9 +2453,9 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -7705,12 +7705,6 @@ "node": ">=v0.10.0" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -8035,9 +8029,9 @@ } }, "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, "node_modules/karma": { @@ -9446,53 +9440,23 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" } }, "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", @@ -11466,17 +11430,17 @@ "dev": true }, "node_modules/sinon": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", - "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0", + "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.5", - "supports-color": "^7.2.0" + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" }, "funding": { "type": "opencollective", @@ -11484,9 +11448,9 @@ } }, "node_modules/sinon/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -14952,9 +14916,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -18899,12 +18863,6 @@ "is-url": "^1.2.4" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, "isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -19163,9 +19121,9 @@ } }, "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, "karma": { @@ -20200,55 +20158,23 @@ "dev": true }, "nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" }, "dependencies": { - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - }, "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true } } }, @@ -21758,23 +21684,23 @@ "dev": true }, "sinon": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", - "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", + "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", "dev": true, "requires": { - "@sinonjs/commons": "^3.0.0", + "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.5", - "supports-color": "^7.2.0" + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" }, "dependencies": { "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true } } diff --git a/package.json b/package.json index 1de701c7d..7c99fba10 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,7 @@ "revalidator": "^0.3.1", "selenium-webdriver": "^4.7.1", "serve-handler": "^6.1.5", - "sinon": "^17.0.0", + "sinon": "^18.0.0", "sri-toolbox": "^0.2.0", "standard-version": "^9.5.0", "start-server-and-test": "^2.0.1", From e32f8034246a92e4132dc04f6310e2b414d6d43f Mon Sep 17 00:00:00 2001 From: gabalafou Date: Tue, 4 Jun 2024 15:47:38 -0400 Subject: [PATCH 069/400] fix(landmark-unique): follow spec, aside -> landmark (#4469) Update the landmark-unique rule matcher for aside elements so that they are treated as landmarks using the same criteria specified in [Sections 3.4.8 and 3.4.9 of the HTML Accessibility API Mappings 1.0](https://w3c.github.io/html-aam/#el-aside-ancestorbodymain). Closes: #4460 --------- Co-authored-by: Steven Lambert <2433219+straker@users.noreply.github.com> --- lib/commons/standards/implicit-html-roles.js | 62 +++++++--- lib/rules/landmark-unique-matches.js | 21 ---- test/commons/aria/implicit-role.js | 98 +++++++++++++++- test/rule-matches/landmark-unique-matches.js | 113 +++++++++++++++++-- 4 files changed, 251 insertions(+), 43 deletions(-) diff --git a/lib/commons/standards/implicit-html-roles.js b/lib/commons/standards/implicit-html-roles.js index b302f0319..579c16695 100644 --- a/lib/commons/standards/implicit-html-roles.js +++ b/lib/commons/standards/implicit-html-roles.js @@ -13,17 +13,32 @@ import { closest } from '../../core/utils'; import cache from '../../core/base/cache'; import getExplicitRole from '../aria/get-explicit-role'; -const getSectioningElementSelector = () => { - return cache.get('sectioningElementSelector', () => { +// Sectioning content elements: article, aside, nav, section +// https://html.spec.whatwg.org/multipage/dom.html#sectioning-content +const getSectioningContentSelector = () => { + return cache.get('sectioningContentSelector', () => { return ( getElementsByContentType('sectioning') .map(nodeName => `${nodeName}:not([role])`) .join(', ') + - ' , main:not([role]), [role=article], [role=complementary], [role=main], [role=navigation], [role=region]' + ' , [role=article], [role=complementary], [role=navigation], [role=region]' ); }); }; +const getSectioningContentPlusMainSelector = () => { + // Why is there this similar but slightly different selector? + // -> + // Asides can be scoped to body or main, but headers and footers must be + // scoped **only** to body (for landmark role mapping). + // - Header: https://w3c.github.io/html-aam/#el-header-ancestorbody + // - Footer: https://w3c.github.io/html-aam/#el-footer-ancestorbody + // - Aside: https://w3c.github.io/html-aam/#el-aside-ancestorbodymain + return cache.get('sectioningContentPlusMainSelector', () => { + return getSectioningContentSelector() + ' , main:not([role]), [role=main]'; + }); +}; + // sectioning elements only have an accessible name if the // aria-label, aria-labelledby, or title attribute has valid // content. @@ -36,18 +51,22 @@ const getSectioningElementSelector = () => { // specifically called out in the spec like section elements // (per Scott O'Hara) // Source: https://web-a11y.slack.com/archives/C042TSFGN/p1590607895241100?thread_ts=1590602189.217800&cid=C042TSFGN -function hasAccessibleName(vNode) { +// +// `checkTitle` means - also check the title attribute and +// return true if the node has a non-empty title +function hasAccessibleName(vNode, { checkTitle = false } = {}) { // testing for when browsers give a
                a region role: // chrome - always a region role // firefox - if non-empty aria-labelledby, aria-label, or title - // safari - if non-empty aria-lablledby or aria-label + // safari - if non-empty aria-labelledby or aria-label // - // we will go with safaris implantation as it is the least common + // we will go with safaris implementation as it is the least common // denominator - const ariaLabelledby = sanitize(arialabelledbyText(vNode)); - const ariaLabel = sanitize(arialabelText(vNode)); - - return !!(ariaLabelledby || ariaLabel); + return !!( + sanitize(arialabelledbyText(vNode)) || + sanitize(arialabelText(vNode)) || + (checkTitle && vNode?.props.nodeType === 1 && sanitize(vNode.attr('title'))) + ); } const implicitHtmlRoles = { @@ -58,7 +77,18 @@ const implicitHtmlRoles = { return vNode.hasAttr('href') ? 'link' : null; }, article: 'article', - aside: 'complementary', + aside: vNode => { + if ( + closest(vNode.parent, getSectioningContentSelector()) && + // An aside within sectioning content can still be mapped to + // role=complementary if it has an accessible name + !hasAccessibleName(vNode, { checkTitle: true }) + ) { + return null; + } + + return 'complementary'; + }, body: 'document', button: 'button', datalist: 'listbox', @@ -70,7 +100,10 @@ const implicitHtmlRoles = { fieldset: 'group', figure: 'figure', footer: vNode => { - const sectioningElement = closest(vNode, getSectioningElementSelector()); + const sectioningElement = closest( + vNode, + getSectioningContentPlusMainSelector() + ); return !sectioningElement ? 'contentinfo' : null; }, @@ -84,7 +117,10 @@ const implicitHtmlRoles = { h5: 'heading', h6: 'heading', header: vNode => { - const sectioningElement = closest(vNode, getSectioningElementSelector()); + const sectioningElement = closest( + vNode, + getSectioningContentPlusMainSelector() + ); return !sectioningElement ? 'banner' : null; }, diff --git a/lib/rules/landmark-unique-matches.js b/lib/rules/landmark-unique-matches.js index b1384e719..d65194976 100644 --- a/lib/rules/landmark-unique-matches.js +++ b/lib/rules/landmark-unique-matches.js @@ -1,22 +1,8 @@ import { isVisibleToScreenReaders } from '../commons/dom'; -import { closest } from '../core/utils'; import { getRole } from '../commons/aria'; import { getAriaRolesByType } from '../commons/standards'; import { accessibleTextVirtual } from '../commons/text'; -/* - * Since this is a best-practice rule, we are filtering elements as dictated by ARIA 1.1 Practices regardless of treatment by browser/AT combinations. - * - * Info: https://www.w3.org/TR/wai-aria-practices-1.1/#aria_landmark - */ -const excludedParentsForHeaderFooterLandmarks = [ - 'article', - 'aside', - 'main', - 'nav', - 'section' -].join(','); - export default function landmarkUniqueMatches(node, virtualNode) { return ( isLandmarkVirtual(virtualNode) && isVisibleToScreenReaders(virtualNode) @@ -31,9 +17,6 @@ function isLandmarkVirtual(vNode) { } const { nodeName } = vNode.props; - if (nodeName === 'header' || nodeName === 'footer') { - return isHeaderFooterLandmark(vNode); - } if (nodeName === 'section' || nodeName === 'form') { const accessibleText = accessibleTextVirtual(vNode); @@ -42,7 +25,3 @@ function isLandmarkVirtual(vNode) { return landmarkRoles.indexOf(role) >= 0 || role === 'region'; } - -function isHeaderFooterLandmark(headerFooterElement) { - return !closest(headerFooterElement, excludedParentsForHeaderFooterLandmarks); -} diff --git a/test/commons/aria/implicit-role.js b/test/commons/aria/implicit-role.js index 03b6ed56f..c970f6435 100644 --- a/test/commons/aria/implicit-role.js +++ b/test/commons/aria/implicit-role.js @@ -81,7 +81,7 @@ describe('aria.implicitRole', function () { assert.equal(implicitRole(node), 'contentinfo'); }); - it('should return null for footer with sectioning parent', function () { + it('should return null for footer with sectioning or main parent', function () { var nodes = ['article', 'aside', 'main', 'nav', 'section']; var roles = ['article', 'complementary', 'main', 'navigation', 'region']; @@ -131,6 +131,100 @@ describe('aria.implicitRole', function () { assert.isNull(implicitRole(node)); }); + it('should return complementary for aside scoped to body', function () { + fixture.innerHTML = ''; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + }); + + it('should return complementary for aside scoped to main', function () { + fixture.innerHTML = '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + }); + + it('should return complementary for aside scoped to element with role=main', function () { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + }); + + it('should return null for aside with sectioning parent', function () { + var nodes = ['article', 'aside', 'nav', 'section']; + var roles = ['article', 'complementary', 'navigation', 'region']; + + for (var i = 0; i < nodes.length; i++) { + fixture.innerHTML = + '<' + nodes[i] + '>
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.isNull(implicitRole(node), nodes[i] + ' not null'); + } + + for (var i = 0; i < roles.length; i++) { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.isNull(implicitRole(node), '[' + roles[i] + '] not null'); + } + }); + + it('should return complementary for aside with sectioning parent if aside has aria-label', function () { + var nodes = ['article', 'aside', 'nav', 'section']; + var roles = ['article', 'complementary', 'navigation', 'region']; + + for (var i = 0; i < nodes.length; i++) { + fixture.innerHTML = + '<' + + nodes[i] + + '>'; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + } + + for (var i = 0; i < roles.length; i++) { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + } + }); + + it('should return null for sectioned aside with empty aria-label', function () { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.isNull(implicitRole(node)); + }); + + it('should return complementary for sectioned aside with title', function () { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'complementary'); + }); + + it('should return null for sectioned aside with empty title', function () { + fixture.innerHTML = + '
                '; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.isNull(implicitRole(node)); + }); + it('should return banner for "body header"', function () { fixture.innerHTML = '
                '; var node = fixture.querySelector('#target'); @@ -138,7 +232,7 @@ describe('aria.implicitRole', function () { assert.equal(implicitRole(node), 'banner'); }); - it('should return null for header with sectioning parent', function () { + it('should return null for header with sectioning or main parent', function () { var nodes = ['article', 'aside', 'main', 'nav', 'section']; var roles = ['article', 'complementary', 'main', 'navigation', 'region']; diff --git a/test/rule-matches/landmark-unique-matches.js b/test/rule-matches/landmark-unique-matches.js index 539d83769..518763d95 100644 --- a/test/rule-matches/landmark-unique-matches.js +++ b/test/rule-matches/landmark-unique-matches.js @@ -4,13 +4,9 @@ describe('landmark-unique-matches', function () { var fixture; var axeFixtureSetup; var shadowSupport = axe.testUtils.shadowSupport.v1; - var excludedDescendantsForHeadersFooters = [ - 'article', - 'aside', - 'main', - 'nav', - 'section' - ]; + var sectioningContentElements = ['article', 'aside', 'nav', 'section']; + var excludedDescendantsForHeadersFooters = + sectioningContentElements.concat('main'); var headerFooterElements = ['header', 'footer']; beforeEach(function () { @@ -128,6 +124,51 @@ describe('landmark-unique-matches', function () { }); }); + describe('aside should not match when scoped to a sectioning content element unless it has an accessible name', function () { + sectioningContentElements.forEach(function (exclusionType) { + it( + 'should not match because aside is scoped to ' + + exclusionType + + ' and has no label', + function () { + axeFixtureSetup( + '<' + + exclusionType + + '>' + ); + var node = fixture.querySelector('aside[data-test]'); + var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + assert.isFalse(rule.matches(node, virtualNode)); + } + ); + + it( + 'should match because aside within ' + exclusionType + ' has a label', + function () { + axeFixtureSetup( + '<' + + exclusionType + + '>' + ); + var node = fixture.querySelector('aside[data-test]'); + var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + assert.isTrue(rule.matches(node, virtualNode)); + } + ); + }); + + it('should match because aside is not scoped to a sectioning content element', function () { + axeFixtureSetup(''); + var node = fixture.querySelector('aside'); + var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + assert.isTrue(rule.matches(node, virtualNode)); + }); + }); + if (shadowSupport) { it('return true for landmarks contained within shadow dom', function () { var container = document.createElement('div'); @@ -195,5 +236,63 @@ describe('landmark-unique-matches', function () { ); }); }); + + describe('aside should match inside shadow dom unless it is both within sectioning content and has no accessible name', function () { + var container; + var shadow; + + beforeEach(function () { + container = document.createElement('div'); + shadow = container.attachShadow({ mode: 'open' }); + }); + + sectioningContentElements.forEach(function (exclusionType) { + it( + 'should not match because aside is scoped to ' + + exclusionType + + ' and has no label', + function () { + shadow.innerHTML = + '<' + + exclusionType + + ' aria-label="sample label">'; + + axeFixtureSetup(container); + var virtualNode = axe.utils.querySelectorAll( + axe._tree[0], + 'aside[data-test]' + )[0]; + assert.isFalse(rule.matches(virtualNode.actualNode, virtualNode)); + } + ); + + it( + 'should match because aside within ' + exclusionType + ' has a label', + function () { + shadow.innerHTML = + '<' + + exclusionType + + '>'; + axeFixtureSetup(container); + var virtualNode = axe.utils.querySelectorAll( + axe._tree[0], + 'aside[data-test]' + )[0]; + assert.isTrue(rule.matches(virtualNode.actualNode, virtualNode)); + } + ); + }); + + it('should match because aside is not scoped to a sectioning content element', function () { + shadow.innerHTML = ''; + axeFixtureSetup(container); + var virtualNode = axe.utils.querySelectorAll(axe._tree[0], 'aside')[0]; + assert.isTrue(rule.matches(virtualNode.actualNode, virtualNode)); + }); + }); } }); From 68bae74edf3a243791500325217f914b15200b9e Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:06:27 -0500 Subject: [PATCH 070/400] style(lib/core): var -> let and const codemod (#4457) Just like https://github.com/dequelabs/axe-core/pull/4451 but for `lib/core` This does add an `.eslintignore` line, perhaps we'd rather skip a file a different way. Smaller part of the full vision: https://github.com/dequelabs/axe-core/pull/4444 --- .eslintignore | 12 ++++ eslint.config.js | 1 + lib/core/base/audit.js | 10 ++-- lib/core/base/context/create-frame-context.js | 2 +- lib/core/base/context/normalize-context.js | 3 +- lib/core/base/rule.js | 34 +++++------ lib/core/imports/polyfills.js | 46 +++++++-------- lib/core/index.js | 4 +- lib/core/public/cleanup.js | 8 +-- lib/core/public/configure.js | 3 +- lib/core/public/get-rules.js | 6 +- lib/core/public/load.js | 8 +-- lib/core/public/plugins.js | 4 +- lib/core/public/reset.js | 2 +- lib/core/public/run-rules.js | 6 +- lib/core/reporters/helpers/failure-summary.js | 4 +- lib/core/reporters/no-passes.js | 2 +- lib/core/reporters/v2.js | 2 +- lib/core/utils/aggregate-node-results.js | 4 +- lib/core/utils/aggregate-result.js | 2 +- lib/core/utils/aggregate.js | 2 +- lib/core/utils/are-styles-set.js | 6 +- lib/core/utils/collect-results-from-frames.js | 4 +- lib/core/utils/dq-element.js | 4 +- lib/core/utils/element-matches.js | 21 ++++--- lib/core/utils/escape-selector.js | 12 ++-- lib/core/utils/get-all-checks.js | 2 +- lib/core/utils/get-check-option.js | 8 +-- lib/core/utils/get-flattened-tree.js | 8 +-- lib/core/utils/get-root-node.js | 2 +- lib/core/utils/get-xpath.js | 8 +-- lib/core/utils/inject-style.js | 4 +- lib/core/utils/matches.js | 16 ++--- lib/core/utils/merge-results.js | 5 +- lib/core/utils/performance-timer.js | 13 +++-- .../utils/pollyfill-elements-from-point.js | 16 ++--- lib/core/utils/queue.js | 24 ++++---- lib/core/utils/respondable.js | 2 +- lib/core/utils/rule-should-run.js | 10 ++-- lib/core/utils/send-command-to-frame.js | 2 +- lib/core/utils/uuid.js | 58 +++++++++---------- 41 files changed, 202 insertions(+), 188 deletions(-) create mode 100644 .eslintignore diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..df541335e --- /dev/null +++ b/.eslintignore @@ -0,0 +1,12 @@ +**/node_modules/* +**/tmp/* + +build/tasks/aria-supported.js + +doc/api/* +doc/examples/jest_react/*.js + +lib/core/imports/*.js +lib/core/utils/uuid.js +axe.js +axe.min.js diff --git a/eslint.config.js b/eslint.config.js index 731000262..4d35954a6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -189,6 +189,7 @@ module.exports = [ 'doc/api/*', 'doc/examples/jest_react/*.js', 'lib/core/imports/*.js', + 'lib/core/utils/uuid.js', 'axe.js', 'axe.min.js' ] diff --git a/lib/core/base/audit.js b/lib/core/base/audit.js index 47b57f66d..dbddcdb8f 100644 --- a/lib/core/base/audit.js +++ b/lib/core/base/audit.js @@ -183,7 +183,7 @@ export default class Audit { * Initializes the rules and checks */ _init() { - var audit = getDefaultConfiguration(this.defaultConfig); + const audit = getDefaultConfiguration(this.defaultConfig); this.lang = audit.lang || 'en'; this.reporter = audit.reporter; this.commands = {}; @@ -366,9 +366,9 @@ export default class Audit { * @param {Mixed} options Options object to pass into rules and/or disable rules or checks */ after(results, options) { - var rules = this.rules; + const rules = this.rules; return results.map(ruleResult => { - var rule = findBy(rules, 'id', ruleResult.id); + const rule = findBy(rules, 'id', ruleResult.id); if (!rule) { // If you see this, you're probably running the Mocha tests with the axe extension installed throw new Error( @@ -393,7 +393,7 @@ export default class Audit { * @return {Object} Validated options object */ normalizeOptions(options) { - var audit = this; + const audit = this; const tags = []; const ruleIds = []; audit.rules.forEach(rule => { @@ -498,7 +498,7 @@ export default class Audit { } _constructHelpUrls(previous = null) { // TODO: es-modules-version - var version = (axe.version.match(/^[1-9][0-9]*\.[0-9]+/) || ['x.y'])[0]; + const version = (axe.version.match(/^[1-9][0-9]*\.[0-9]+/) || ['x.y'])[0]; this.rules.forEach(rule => { if (!this.data.rules[rule.id]) { this.data.rules[rule.id] = {}; diff --git a/lib/core/base/context/create-frame-context.js b/lib/core/base/context/create-frame-context.js index cbe52eb3a..abb396ecf 100644 --- a/lib/core/base/context/create-frame-context.js +++ b/lib/core/base/context/create-frame-context.js @@ -11,7 +11,7 @@ export function createFrameContext(frame, { focusable, page }) { } function frameFocusable(frame) { - var tabIndex = frame.getAttribute('tabindex'); + const tabIndex = frame.getAttribute('tabindex'); if (!tabIndex) { return true; } diff --git a/lib/core/base/context/normalize-context.js b/lib/core/base/context/normalize-context.js index 8187b3d64..3eb9bea77 100644 --- a/lib/core/base/context/normalize-context.js +++ b/lib/core/base/context/normalize-context.js @@ -159,10 +159,11 @@ function isShadowSelector(selector) { function isArrayLike(arr) { return ( + // Avoid DOM weirdness arr && typeof arr === 'object' && typeof arr.length === 'number' && - arr instanceof window.Node === false // Avoid DOM weirdness + arr instanceof window.Node === false ); } diff --git a/lib/core/base/rule.js b/lib/core/base/rule.js index a5995adfe..37b59904f 100644 --- a/lib/core/base/rule.js +++ b/lib/core/base/rule.js @@ -137,7 +137,7 @@ Rule.prototype.gather = function gather(context, options = {}) { performanceTimer.mark(markStart); } - var elements = select(this.selector, context); + let elements = select(this.selector, context); if (this.excludeHidden) { if (options.performanceTimer) { performanceTimer.mark(markHiddenStart); @@ -173,13 +173,13 @@ Rule.prototype.runChecks = function runChecks( resolve, reject ) { - var self = this; + const self = this; - var checkQueue = queue(); + const checkQueue = queue(); this[type].forEach(c => { - var check = self._audit.checks[c.id || c]; - var option = getCheckOption(check, self.id, options); + const check = self._audit.checks[c.id || c]; + const option = getCheckOption(check, self.id, options); checkQueue.defer((res, rej) => { check.run(node, option, context, res, rej); }); @@ -246,7 +246,7 @@ Rule.prototype.run = function run(context, options = {}, resolve, reject) { nodes.forEach(node => { q.defer((resolveNode, rejectNode) => { - var checkQueue = queue(); + const checkQueue = queue(); ['any', 'all', 'none'].forEach(type => { checkQueue.defer((res, rej) => { @@ -466,7 +466,7 @@ Rule.prototype.gatherAndMatchNodes = function gatherAndMatchNodes( function findAfterChecks(rule) { return getAllChecks(rule) .map(c => { - var check = rule._audit.checks[c.id || c]; + const check = rule._audit.checks[c.id || c]; return check && typeof check.after === 'function' ? check : null; }) .filter(Boolean); @@ -480,9 +480,9 @@ function findAfterChecks(rule) { * @return {Array} Matching CheckResults */ function findCheckResults(nodes, checkID) { - var checkResults = []; + const checkResults = []; nodes.forEach(nodeResult => { - var checks = getAllChecks(nodeResult); + const checks = getAllChecks(nodeResult); checks.forEach(checkResult => { if (checkResult.id === checkID) { checkResult.node = nodeResult.node; @@ -500,10 +500,10 @@ function filterChecks(checks) { } function sanitizeNodes(result) { - var checkTypes = ['any', 'all', 'none']; + const checkTypes = ['any', 'all', 'none']; - var nodes = result.nodes.filter(detail => { - var length = 0; + let nodes = result.nodes.filter(detail => { + let length = 0; checkTypes.forEach(type => { detail[type] = filterChecks(detail[type]); length += detail[type].length; @@ -533,13 +533,13 @@ function sanitizeNodes(result) { * @return {RuleResult} The RuleResult as filtered by after functions */ Rule.prototype.after = function after(result, options) { - var afterChecks = findAfterChecks(this); - var ruleID = this.id; + const afterChecks = findAfterChecks(this); + const ruleID = this.id; afterChecks.forEach(check => { - var beforeResults = findCheckResults(result.nodes, check.id); - var checkOption = getCheckOption(check, ruleID, options); + const beforeResults = findCheckResults(result.nodes, check.id); + const checkOption = getCheckOption(check, ruleID, options); - var afterResults = check.after(beforeResults, checkOption.options); + const afterResults = check.after(beforeResults, checkOption.options); if (this.reviewOnFail) { afterResults.forEach(checkResult => { diff --git a/lib/core/imports/polyfills.js b/lib/core/imports/polyfills.js index 7ad8adb4a..de47772a5 100644 --- a/lib/core/imports/polyfills.js +++ b/lib/core/imports/polyfills.js @@ -49,11 +49,11 @@ if (typeof Object.assign !== 'function') { throw new TypeError('Cannot convert undefined or null to object'); } - var output = Object(target); - for (var index = 1; index < arguments.length; index++) { - var source = arguments[index]; + let output = Object(target); + for (let index = 1; index < arguments.length; index++) { + let source = arguments[index]; if (source !== undefined && source !== null) { - for (var nextKey in source) { + for (let nextKey in source) { if (source.hasOwnProperty(nextKey)) { output[nextKey] = source[nextKey]; } @@ -74,12 +74,12 @@ if (!Array.prototype.find) { if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; + let list = Object(this); + let length = list.length >>> 0; + let thisArg = arguments[1]; + let value; - for (var i = 0; i < length; i++) { + for (let i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; @@ -99,11 +99,11 @@ if (!Array.prototype.findIndex) { if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } - var list = Object(this); - var length = list.length >>> 0; - var value; + let list = Object(this); + let length = list.length >>> 0; + let value; - for (var i = 0; i < length; i++) { + for (let i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return i; @@ -117,13 +117,13 @@ if (!Array.prototype.findIndex) { if (!Array.prototype.includes) { Object.defineProperty(Array.prototype, 'includes', { value: function (searchElement) { - var O = Object(this); - var len = parseInt(O.length, 10) || 0; + let O = Object(this); + let len = parseInt(O.length, 10) || 0; if (len === 0) { return false; } - var n = parseInt(arguments[1], 10) || 0; - var k; + let n = parseInt(arguments[1], 10) || 0; + let k; if (n >= 0) { k = n; } else { @@ -132,7 +132,7 @@ if (!Array.prototype.includes) { k = 0; } } - var currentElement; + let currentElement; while (k < len) { currentElement = O[k]; if ( @@ -162,11 +162,11 @@ if (!Array.prototype.some) { throw new TypeError(); } - var t = Object(this); - var len = t.length >>> 0; + let t = Object(this); + let len = t.length >>> 0; - var thisArg = arguments.length >= 2 ? arguments[1] : void 0; - for (var i = 0; i < len; i++) { + let thisArg = arguments.length >= 2 ? arguments[1] : void 0; + for (let i = 0; i < len; i++) { if (i in t && fun.call(thisArg, t[i], i, t)) { return true; } @@ -199,7 +199,7 @@ if (!Array.prototype.flat) { Object.defineProperty(Array.prototype, 'flat', { configurable: true, value: function flat() { - var depth = isNaN(arguments[0]) ? 1 : Number(arguments[0]); + let depth = isNaN(arguments[0]) ? 1 : Number(arguments[0]); return depth ? Array.prototype.reduce.call( diff --git a/lib/core/index.js b/lib/core/index.js index 6aa45e488..2d15d5282 100644 --- a/lib/core/index.js +++ b/lib/core/index.js @@ -2,7 +2,7 @@ /*global axeFunction, module, define */ // exported namespace for axe /*eslint no-use-before-define: 0, no-unused-vars: 0*/ -var axe = axe || {}; +const axe = axe || {}; axe.version = '<%= pkg.version %>'; if (typeof define === 'function' && define.amd) { @@ -24,7 +24,7 @@ if (typeof window.getComputedStyle === 'function') { window.axe = axe; } // local namespace for common functions -var commons; +let commons; function SupportError(error) { this.name = 'SupportError'; diff --git a/lib/core/public/cleanup.js b/lib/core/public/cleanup.js index 76492c592..6b5de2555 100644 --- a/lib/core/public/cleanup.js +++ b/lib/core/public/cleanup.js @@ -6,13 +6,13 @@ function cleanup(resolve, reject) { throw new Error('No audit configured'); } - var q = axe.utils.queue(); + const q = axe.utils.queue(); // If a plugin fails it's cleanup, we still want the others to run - var cleanupErrors = []; + const cleanupErrors = []; Object.keys(axe.plugins).forEach(key => { q.defer(res => { - var rej = function rej(err) { + const rej = function rej(err) { cleanupErrors.push(err); res(); }; @@ -24,7 +24,7 @@ function cleanup(resolve, reject) { }); }); - var flattenedTree = axe.utils.getFlattenedTree(document.body); + const flattenedTree = axe.utils.getFlattenedTree(document.body); axe.utils.querySelectorAll(flattenedTree, 'iframe, frame').forEach(node => { q.defer((res, rej) => { diff --git a/lib/core/public/configure.js b/lib/core/public/configure.js index cbd642483..afe73582b 100644 --- a/lib/core/public/configure.js +++ b/lib/core/public/configure.js @@ -3,9 +3,8 @@ import { configureStandards } from '../../standards'; import constants from '../constants'; function configure(spec) { - var audit; + const audit = axe._audit; - audit = axe._audit; if (!audit) { throw new Error('No audit configured'); } diff --git a/lib/core/public/get-rules.js b/lib/core/public/get-rules.js index d52216f77..fa23a3b5b 100644 --- a/lib/core/public/get-rules.js +++ b/lib/core/public/get-rules.js @@ -5,7 +5,7 @@ */ function getRules(tags) { tags = tags || []; - var matchingRules = !tags.length + const matchingRules = !tags.length ? axe._audit.rules : axe._audit.rules.filter(item => { return !!tags.filter(tag => { @@ -13,9 +13,9 @@ function getRules(tags) { }).length; }); - var ruleData = axe._audit.data.rules || {}; + const ruleData = axe._audit.data.rules || {}; return matchingRules.map(matchingRule => { - var rd = ruleData[matchingRule.id] || {}; + const rd = ruleData[matchingRule.id] || {}; return { ruleId: matchingRule.id, description: rd.description, diff --git a/lib/core/public/load.js b/lib/core/public/load.js index 124c849b1..a6dbe6972 100644 --- a/lib/core/public/load.js +++ b/lib/core/public/load.js @@ -14,19 +14,19 @@ export default function load(audit) { } function runCommand(data, keepalive, callback) { - var resolve = callback; - var reject = function reject(err) { + const resolve = callback; + const reject = function reject(err) { if (err instanceof Error === false) { err = new Error(err); } callback(err); }; - var context = (data && data.context) || {}; + const context = (data && data.context) || {}; if (context.hasOwnProperty('include') && !context.include.length) { context.include = [document]; } - var options = (data && data.options) || {}; + const options = (data && data.options) || {}; switch (data.command) { case 'rules': diff --git a/lib/core/public/plugins.js b/lib/core/public/plugins.js index 5b20b4f8c..4da9100d6 100644 --- a/lib/core/public/plugins.js +++ b/lib/core/public/plugins.js @@ -18,8 +18,8 @@ Plugin.prototype.collect = function collect() { }; Plugin.prototype.cleanup = function cleanup(done) { - var q = axe.utils.queue(); - var that = this; + const q = axe.utils.queue(); + const that = this; Object.keys(this._registry).forEach(key => { q.defer(_done => { that._registry[key].cleanup(_done); diff --git a/lib/core/public/reset.js b/lib/core/public/reset.js index 586224bb8..ae33123f0 100644 --- a/lib/core/public/reset.js +++ b/lib/core/public/reset.js @@ -1,7 +1,7 @@ import { resetStandards } from '../../standards'; function reset() { - var audit = axe._audit; + const audit = axe._audit; if (!audit) { throw new Error('No audit configured'); diff --git a/lib/core/public/run-rules.js b/lib/core/public/run-rules.js index 5eb26d7c9..782408082 100644 --- a/lib/core/public/run-rules.js +++ b/lib/core/public/run-rules.js @@ -29,8 +29,8 @@ export default function runRules(context, options, resolve, reject) { return reject(e); } - var q = queue(); - var audit = axe._audit; + const q = queue(); + const audit = axe._audit; if (options.performanceTimer) { performanceTimer.auditStart(); @@ -51,7 +51,7 @@ export default function runRules(context, options, resolve, reject) { } // Add wrapper object so that we may use the same "merge" function for results from inside and outside frames - var results = mergeResults( + let results = mergeResults( data.map(res => { return { results: res }; }) diff --git a/lib/core/reporters/helpers/failure-summary.js b/lib/core/reporters/helpers/failure-summary.js index a35c8554b..19f69e8d7 100644 --- a/lib/core/reporters/helpers/failure-summary.js +++ b/lib/core/reporters/helpers/failure-summary.js @@ -4,7 +4,7 @@ * @return {String} failure messages */ function failureSummary(nodeData) { - var failingChecks = {}; + const failingChecks = {}; // combine "all" and "none" as messaging is the same failingChecks.none = nodeData.none.concat(nodeData.all); failingChecks.any = nodeData.any; @@ -15,7 +15,7 @@ function failureSummary(nodeData) { return; } - var sum = axe._audit.data.failureSummaries[key]; + const sum = axe._audit.data.failureSummaries[key]; if (sum && typeof sum.failureMessage === 'function') { return sum.failureMessage( failingChecks[key].map(check => { diff --git a/lib/core/reporters/no-passes.js b/lib/core/reporters/no-passes.js index 3cc3cbe45..8c9c41c66 100644 --- a/lib/core/reporters/no-passes.js +++ b/lib/core/reporters/no-passes.js @@ -10,7 +10,7 @@ const noPassesReporter = (results, options, callback) => { // limit result processing to types we want to include in the output options.resultTypes = ['violations']; - var { violations } = processAggregate(results, options); + const { violations } = processAggregate(results, options); callback({ ...getEnvironmentData(environmentData), diff --git a/lib/core/reporters/v2.js b/lib/core/reporters/v2.js index f4a63333e..4597ca109 100644 --- a/lib/core/reporters/v2.js +++ b/lib/core/reporters/v2.js @@ -7,7 +7,7 @@ const v2Reporter = (results, options, callback) => { options = {}; } const { environmentData, ...toolOptions } = options; - var out = processAggregate(results, options); + const out = processAggregate(results, options); callback({ ...getEnvironmentData(environmentData), toolOptions, diff --git a/lib/core/utils/aggregate-node-results.js b/lib/core/utils/aggregate-node-results.js index 151880e57..d7ce70675 100644 --- a/lib/core/utils/aggregate-node-results.js +++ b/lib/core/utils/aggregate-node-results.js @@ -40,12 +40,12 @@ function aggregateNodeResults(nodeResults) { // Fill the array with nodes nodeResults.forEach(nodeResult => { - var groupName = constants.resultGroupMap[nodeResult.result]; + const groupName = constants.resultGroupMap[nodeResult.result]; ruleResult[groupName].push(nodeResult); }); // Take the highest impact of failed or canttell rules - var impactGroup = constants.FAIL_GROUP; + let impactGroup = constants.FAIL_GROUP; if (ruleResult[impactGroup].length === 0) { impactGroup = constants.CANTTELL_GROUP; } diff --git a/lib/core/utils/aggregate-result.js b/lib/core/utils/aggregate-result.js index d60122a06..ba7356d06 100644 --- a/lib/core/utils/aggregate-result.js +++ b/lib/core/utils/aggregate-result.js @@ -1,7 +1,7 @@ import constants from '../constants'; function copyToGroup(resultObject, subResult, group) { - var resultCopy = Object.assign({}, subResult); + const resultCopy = Object.assign({}, subResult); resultCopy.nodes = (resultCopy[group] || []).concat(); constants.resultGroups.forEach(resultGroup => { delete resultCopy[resultGroup]; diff --git a/lib/core/utils/aggregate.js b/lib/core/utils/aggregate.js index bdc186e01..16fcc0c01 100644 --- a/lib/core/utils/aggregate.js +++ b/lib/core/utils/aggregate.js @@ -13,7 +13,7 @@ function aggregate(map, values, initial) { values.push(initial); } - var sorting = values.map(val => map.indexOf(val)).sort(); // Stupid NodeJS array.sort functor doesn't work!! + const sorting = values.map(val => map.indexOf(val)).sort(); // Stupid NodeJS array.sort functor doesn't work!! return map[sorting.pop()]; } diff --git a/lib/core/utils/are-styles-set.js b/lib/core/utils/are-styles-set.js index 7192a83c9..c6332041f 100644 --- a/lib/core/utils/are-styles-set.js +++ b/lib/core/utils/are-styles-set.js @@ -1,10 +1,10 @@ function areStylesSet(el, styles, stopAt) { - var styl = window.getComputedStyle(el, null); + const styl = window.getComputedStyle(el, null); if (!styl) { return false; } - for (var i = 0; i < styles.length; ++i) { - var att = styles[i]; + for (let i = 0; i < styles.length; ++i) { + const att = styles[i]; if (styl.getPropertyValue(att.property) === att.value) { return true; } diff --git a/lib/core/utils/collect-results-from-frames.js b/lib/core/utils/collect-results-from-frames.js index be17f8ccf..7ca5de6e1 100644 --- a/lib/core/utils/collect-results-from-frames.js +++ b/lib/core/utils/collect-results-from-frames.js @@ -22,8 +22,8 @@ export default function collectResultsFromFrames( // elementRefs can't be passed across frame boundaries options = { ...options, elementRef: false }; - var q = queue(); - var frames = parentContent.frames; + const q = queue(); + const frames = parentContent.frames; // Tell each axe running in each frame to collect results frames.forEach(({ node: frameElement, ...context }) => { diff --git a/lib/core/utils/dq-element.js b/lib/core/utils/dq-element.js index edf3b6d39..ab259a0c4 100644 --- a/lib/core/utils/dq-element.js +++ b/lib/core/utils/dq-element.js @@ -12,7 +12,7 @@ function truncate(str, maxLength) { maxLength = maxLength || 300; if (str.length > maxLength) { - var index = str.indexOf('>'); + const index = str.indexOf('>'); str = str.substring(0, index + 1); } @@ -23,7 +23,7 @@ function getSource(element) { if (!element?.outerHTML) { return ''; } - var source = element.outerHTML; + let source = element.outerHTML; if (!source && typeof window.XMLSerializer === 'function') { source = new window.XMLSerializer().serializeToString(element); } diff --git a/lib/core/utils/element-matches.js b/lib/core/utils/element-matches.js index bad802d42..7399e59ff 100644 --- a/lib/core/utils/element-matches.js +++ b/lib/core/utils/element-matches.js @@ -5,19 +5,18 @@ * @return {Boolean} */ const matchesSelector = (() => { - var method; + let method; function getMethod(node) { - var index, - candidate, - candidates = [ - 'matches', - 'matchesSelector', - 'mozMatchesSelector', - 'webkitMatchesSelector', - 'msMatchesSelector' - ], - length = candidates.length; + const candidates = [ + 'matches', + 'matchesSelector', + 'mozMatchesSelector', + 'webkitMatchesSelector', + 'msMatchesSelector' + ]; + const length = candidates.length; + let index, candidate; for (index = 0; index < length; index++) { candidate = candidates[index]; diff --git a/lib/core/utils/escape-selector.js b/lib/core/utils/escape-selector.js index 7add6e89b..dc4bf0d68 100644 --- a/lib/core/utils/escape-selector.js +++ b/lib/core/utils/escape-selector.js @@ -7,12 +7,12 @@ */ function escapeSelector(value) { /*eslint no-bitwise: 0, eqeqeq: 0, one-var: 0 */ - var string = String(value); - var length = string.length; - var index = -1; - var codeUnit; - var result = ''; - var firstCodeUnit = string.charCodeAt(0); + const string = String(value); + const length = string.length; + let index = -1; + let codeUnit; + let result = ''; + const firstCodeUnit = string.charCodeAt(0); while (++index < length) { codeUnit = string.charCodeAt(index); // Note: there’s no need to special-case astral symbols, surrogate diff --git a/lib/core/utils/get-all-checks.js b/lib/core/utils/get-all-checks.js index 4c79e8368..78c203489 100644 --- a/lib/core/utils/get-all-checks.js +++ b/lib/core/utils/get-all-checks.js @@ -3,7 +3,7 @@ * @param {RuleResult|Rule} rule */ function getAllChecks(object) { - var result = []; + const result = []; return result .concat(object.any || []) .concat(object.all || []) diff --git a/lib/core/utils/get-check-option.js b/lib/core/utils/get-check-option.js index e159965e8..f438d8d41 100644 --- a/lib/core/utils/get-check-option.js +++ b/lib/core/utils/get-check-option.js @@ -6,12 +6,12 @@ * @return {Object} The resolved object with `options` and `enabled` keys */ function getCheckOption(check, ruleID, options) { - var ruleCheckOption = (((options.rules && options.rules[ruleID]) || {}) + const ruleCheckOption = (((options.rules && options.rules[ruleID]) || {}) .checks || {})[check.id]; - var checkOption = (options.checks || {})[check.id]; + const checkOption = (options.checks || {})[check.id]; - var enabled = check.enabled; - var opts = check.options; + let enabled = check.enabled; + let opts = check.options; if (checkOption) { if (checkOption.hasOwnProperty('enabled')) { diff --git a/lib/core/utils/get-flattened-tree.js b/lib/core/utils/get-flattened-tree.js index 2fb869e78..f95a6a929 100644 --- a/lib/core/utils/get-flattened-tree.js +++ b/lib/core/utils/get-flattened-tree.js @@ -61,7 +61,7 @@ export default function getFlattenedTree( * @return Array{Nodes} */ function getSlotChildren(node) { - var retVal = []; + const retVal = []; node = node.firstChild; while (node) { @@ -96,7 +96,7 @@ function createNode(node, parent, shadowId) { */ function flattenTree(node, shadowId, parent) { // using a closure here and therefore cannot easily refactor toreduce the statements - var retVal, realArray, nodeName; + let retVal, realArray; function reduceShadowDOM(res, child, parentVNode) { const replacements = flattenTree(child, shadowId, parentVNode); if (replacements) { @@ -109,7 +109,7 @@ function flattenTree(node, shadowId, parent) { // document node = node.documentElement; } - nodeName = node.nodeName.toLowerCase(); + const nodeName = node.nodeName.toLowerCase(); if (isShadowRoot(node)) { hasShadowRoot = true; @@ -142,7 +142,7 @@ function flattenTree(node, shadowId, parent) { // fallback content realArray = getSlotChildren(node); } - var styl = window.getComputedStyle(node); + const styl = window.getComputedStyle(node); // check the display property if (false && styl.display !== 'contents') { // intentionally commented out diff --git a/lib/core/utils/get-root-node.js b/lib/core/utils/get-root-node.js index 6eaf28d08..aaab8944a 100644 --- a/lib/core/utils/get-root-node.js +++ b/lib/core/utils/get-root-node.js @@ -6,7 +6,7 @@ * @returns {DocumentFragment|Document} */ function getRootNode(node) { - var doc = (node.getRootNode && node.getRootNode()) || document; // this is for backwards compatibility + let doc = (node.getRootNode && node.getRootNode()) || document; // this is for backwards compatibility if (doc === node) { // disconnected node doc = document; diff --git a/lib/core/utils/get-xpath.js b/lib/core/utils/get-xpath.js index b0b66ba9c..14298daab 100644 --- a/lib/core/utils/get-xpath.js +++ b/lib/core/utils/get-xpath.js @@ -1,7 +1,7 @@ import escapeSelector from './escape-selector'; function getXPathArray(node, path) { - var sibling, count; + let sibling, count; // Gets an XPath for an element which describes its hierarchical location. if (!node) { return []; @@ -46,10 +46,10 @@ function getXPathArray(node, path) { } if (node.nodeType === 1) { - var element = {}; + const element = {}; element.str = node.nodeName.toLowerCase(); // add the id and the count so we can construct robust versions of the xpath - var id = node.getAttribute && escapeSelector(node.getAttribute('id')); + const id = node.getAttribute && escapeSelector(node.getAttribute('id')); if (id && node.ownerDocument.querySelectorAll('#' + id).length === 1) { element.id = node.getAttribute('id'); } @@ -77,7 +77,7 @@ function xpathToString(xpathArray) { } function getXpath(node) { - var xpathArray = getXPathArray(node); + const xpathArray = getXPathArray(node); return xpathToString(xpathArray); } diff --git a/lib/core/utils/inject-style.js b/lib/core/utils/inject-style.js index 503300648..86ce8b03a 100644 --- a/lib/core/utils/inject-style.js +++ b/lib/core/utils/inject-style.js @@ -1,4 +1,4 @@ -var styleSheet; +let styleSheet; function injectStyle(style) { if (styleSheet && styleSheet.parentNode) { // append the style to the existing sheet @@ -14,7 +14,7 @@ function injectStyle(style) { return; } - var head = document.head || document.getElementsByTagName('head')[0]; + const head = document.head || document.getElementsByTagName('head')[0]; styleSheet = document.createElement('style'); styleSheet.type = 'text/css'; diff --git a/lib/core/utils/matches.js b/lib/core/utils/matches.js index f49bace8f..7bd28c650 100644 --- a/lib/core/utils/matches.js +++ b/lib/core/utils/matches.js @@ -29,7 +29,7 @@ function matchesAttributes(vNode, exp) { return ( !exp.attributes || exp.attributes.every(att => { - var nodeAtt = vNode.attr(att.key); + const nodeAtt = vNode.attr(att.key); return nodeAtt !== null && att.test(nodeAtt); }) ); @@ -72,10 +72,10 @@ function matchExpression(vNode, expression) { ); } -var escapeRegExp = (() => { +const escapeRegExp = (() => { /*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License */ - var from = /(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g; - var to = '\\'; + const from = /(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g; + const to = '\\'; return string => { return string.replace(from, to); }; @@ -168,7 +168,7 @@ function convertPseudos(pseudos) { return; } return pseudos.map(p => { - var expressions; + let expressions; if (['is', 'not'].includes(p.name)) { expressions = p.value; @@ -194,8 +194,8 @@ function convertPseudos(pseudos) { */ function convertExpressions(expressions) { return expressions.map(exp => { - var newExp = []; - var rule = exp.rule; + const newExp = []; + let rule = exp.rule; while (rule) { /* eslint no-restricted-syntax: 0 */ // `.tagName` is a property coming from the `CSSSelectorParser` library @@ -221,7 +221,7 @@ function convertExpressions(expressions) { * @returns {Object[]} Array of Slick format expressions */ export function convertSelector(selector) { - var expressions = cssParser.parse(selector); + let expressions = cssParser.parse(selector); expressions = expressions.selectors ? expressions.selectors : [expressions]; return convertExpressions(expressions); } diff --git a/lib/core/utils/merge-results.js b/lib/core/utils/merge-results.js index e5c9547ad..717eeb198 100644 --- a/lib/core/utils/merge-results.js +++ b/lib/core/utils/merge-results.js @@ -31,8 +31,9 @@ function pushFrame(resultSet, options, frameSpec) { */ function spliceNodes(target, to) { const firstFromFrame = to[0].node; + let node; for (let i = 0; i < target.length; i++) { - const node = target[i].node; + node = target[i].node; const resultSort = nodeIndexSort( node.nodeIndexes, firstFromFrame.nodeIndexes @@ -87,7 +88,7 @@ function mergeResults(frameResults, options) { pushFrame(ruleResult.nodes, options, frameSpec); } - var res = findBy(mergedResult, 'id', ruleResult.id); + const res = findBy(mergedResult, 'id', ruleResult.id); if (!res) { mergedResult.push(ruleResult); } else { diff --git a/lib/core/utils/performance-timer.js b/lib/core/utils/performance-timer.js index 78c25f404..a66d6348b 100644 --- a/lib/core/utils/performance-timer.js +++ b/lib/core/utils/performance-timer.js @@ -17,8 +17,8 @@ const performanceTimer = (() => { return window.performance.now(); } } - var originalTime = null; - var lastRecordedTime = now(); + let originalTime = null; + let lastRecordedTime = now(); /** * @typedef {utils.performanceTimer} Public API Methods @@ -90,12 +90,13 @@ const performanceTimer = (() => { ) { // only output measures that were started after axe started, otherwise // we get measures made by the page before axe ran (which is confusing) - var axeStart = window.performance.getEntriesByName('mark_axe_start')[0]; - var measures = window.performance + const axeStart = + window.performance.getEntriesByName('mark_axe_start')[0]; + const measures = window.performance .getEntriesByType('measure') .filter(measure => measure.startTime >= axeStart.startTime); - for (var i = 0; i < measures.length; ++i) { - var req = measures[i]; + for (let i = 0; i < measures.length; ++i) { + const req = measures[i]; if (req.name === measureName) { logMeasure(req); return; diff --git a/lib/core/utils/pollyfill-elements-from-point.js b/lib/core/utils/pollyfill-elements-from-point.js index 1783f1294..b306f74ad 100644 --- a/lib/core/utils/pollyfill-elements-from-point.js +++ b/lib/core/utils/pollyfill-elements-from-point.js @@ -3,24 +3,24 @@ export function pollyfillElementsFromPoint() { if (document.elementsFromPoint) return document.elementsFromPoint; if (document.msElementsFromPoint) return document.msElementsFromPoint; - var usePointer = (function () { - var element = document.createElement('x'); + const usePointer = (function () { + const element = document.createElement('x'); element.style.cssText = 'pointer-events:auto'; return element.style.pointerEvents === 'auto'; })(); - var cssProp = usePointer ? 'pointer-events' : 'visibility'; - var cssDisableVal = usePointer ? 'none' : 'hidden'; + const cssProp = usePointer ? 'pointer-events' : 'visibility'; + const cssDisableVal = usePointer ? 'none' : 'hidden'; - var style = document.createElement('style'); + const style = document.createElement('style'); style.innerHTML = usePointer ? '* { pointer-events: all }' : '* { visibility: visible }'; return function (x, y) { - var current, i, d; - var elements = []; - var previousPointerEvents = []; + let current, i, d; + const elements = []; + const previousPointerEvents = []; // startup document.head.appendChild(style); diff --git a/lib/core/utils/queue.js b/lib/core/utils/queue.js index 5d5e82053..fd27e4a5d 100644 --- a/lib/core/utils/queue.js +++ b/lib/core/utils/queue.js @@ -12,16 +12,16 @@ function funcGuard(f) { * @return {Queue} The newly generated "queue" */ function queue() { - var tasks = []; - var started = 0; - var remaining = 0; // number of tasks not yet finished - var completeQueue = noop; - var complete = false; - var err; + const tasks = []; + let started = 0; + let remaining = 0; // number of tasks not yet finished + let completeQueue = noop; + let complete = false; + let err; // By default, wait until the next tick, // if no catch was set, throw to console. - var defaultFail = e => { + const defaultFail = e => { err = e; setTimeout(() => { if (err !== undefined && err !== null) { @@ -29,7 +29,7 @@ function queue() { } }, 1); }; - var failed = defaultFail; + let failed = defaultFail; function createResolve(i) { return r => { @@ -53,9 +53,9 @@ function queue() { } function pop() { - var length = tasks.length; + const length = tasks.length; for (; started < length; started++) { - var task = tasks[started]; + const task = tasks[started]; try { task.call(null, createResolve(started), abort); @@ -65,7 +65,7 @@ function queue() { } } - var q = { + const q = { /** * Defer a function that may or may not run asynchronously. * @@ -74,7 +74,7 @@ function queue() { */ defer(fn) { if (typeof fn === 'object' && fn.then && fn.catch) { - var defer = fn; + const defer = fn; fn = (resolve, reject) => { defer.then(resolve).catch(reject); }; diff --git a/lib/core/utils/respondable.js b/lib/core/utils/respondable.js index a43a8332b..7a1c5c4da 100644 --- a/lib/core/utils/respondable.js +++ b/lib/core/utils/respondable.js @@ -64,7 +64,7 @@ respondable.updateMessenger = function updateMessenger({ open, post }) { closeHandler(); } - var close = open(messageListener); + const close = open(messageListener); if (close) { assert( diff --git a/lib/core/utils/rule-should-run.js b/lib/core/utils/rule-should-run.js index 70c1fef55..38fde1fcb 100644 --- a/lib/core/utils/rule-should-run.js +++ b/lib/core/utils/rule-should-run.js @@ -6,8 +6,8 @@ * @return {bool} */ function matchTags(rule, runOnly) { - var include, exclude, matching; - var defaultExclude = + let include, exclude; + const defaultExclude = // TODO: es-modules_audit axe._audit && axe._audit.tagExclude ? axe._audit.tagExclude : []; @@ -35,7 +35,7 @@ function matchTags(rule, runOnly) { }); } - matching = include.some(tag => { + const matching = include.some(tag => { return rule.tags.indexOf(tag) !== -1; }); if (matching || (include.length === 0 && rule.enabled !== false)) { @@ -55,8 +55,8 @@ function matchTags(rule, runOnly) { * @return {Boolean} */ function ruleShouldRun(rule, context, options) { - var runOnly = options.runOnly || {}; - var ruleOptions = (options.rules || {})[rule.id]; + const runOnly = options.runOnly || {}; + const ruleOptions = (options.rules || {})[rule.id]; // Never run page level rules if the context is not on the page if (rule.pageLevel && !context.page) { diff --git a/lib/core/utils/send-command-to-frame.js b/lib/core/utils/send-command-to-frame.js index 7d7f5b57e..f6b13fac3 100644 --- a/lib/core/utils/send-command-to-frame.js +++ b/lib/core/utils/send-command-to-frame.js @@ -63,7 +63,7 @@ function callAxeStart(node, parameters, resolve, reject) { } function err(message, node) { - var selector; + let selector; // TODO: es-modules_tree if (axe._tree) { selector = getSelector(node); diff --git a/lib/core/utils/uuid.js b/lib/core/utils/uuid.js index de8a9eb66..c10369a1f 100644 --- a/lib/core/utils/uuid.js +++ b/lib/core/utils/uuid.js @@ -3,20 +3,20 @@ // // Copyright (c) 2010-2012 Robert Kieffer // MIT License - http://opensource.org/licenses/mit-license.php -var uuid; +let uuid; // Unique ID creation requires a high quality random # generator. We feature // detect to determine the best RNG source, normalizing to a function that // returns 128-bits of randomness, since that's what's usually required -var _rng; +let _rng; // Allow for MSIE11 msCrypto -var _crypto = window.crypto || window.msCrypto; +let _crypto = window.crypto || window.msCrypto; if (!_rng && _crypto && _crypto.getRandomValues) { // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto // // Moderately fast, high quality - var _rnds8 = new Uint8Array(16); + let _rnds8 = new Uint8Array(16); _rng = function whatwgRNG() { _crypto.getRandomValues(_rnds8); return _rnds8; @@ -28,9 +28,9 @@ if (!_rng) { // // If all else fails, use Math.random(). It's fast, but is of unspecified // quality. - var _rnds = new Array(16); + let _rnds = new Array(16); _rng = () => { - for (var i = 0, r; i < 16; i++) { + for (let i = 0, r; i < 16; i++) { if ((i & 0x03) === 0) r = Math.random() * 0x100000000; _rnds[i] = (r >>> ((i & 0x03) << 3)) & 0xff; } @@ -40,19 +40,19 @@ if (!_rng) { } // Buffer class to use -var BufferClass = typeof window.Buffer == 'function' ? window.Buffer : Array; +let BufferClass = typeof window.Buffer == 'function' ? window.Buffer : Array; // Maps for number <-> hex string conversion -var _byteToHex = []; -var _hexToByte = {}; -for (var i = 0; i < 256; i++) { +let _byteToHex = []; +let _hexToByte = {}; +for (let i = 0; i < 256; i++) { _byteToHex[i] = (i + 0x100).toString(16).substr(1); _hexToByte[_byteToHex[i]] = i; } // **`parse()` - Parse a UUID into it's component bytes** function parse(s, buf, offset) { - var i = (buf && offset) || 0, + let i = (buf && offset) || 0, ii = 0; buf = buf || []; @@ -73,7 +73,7 @@ function parse(s, buf, offset) { // **`unparse()` - Convert UUID byte array (ala parse()) into a string** function unparse(buf, offset) { - var i = offset || 0, + let i = offset || 0, bth = _byteToHex; return ( bth[buf[i++]] + @@ -105,10 +105,10 @@ function unparse(buf, offset) { // and http://docs.python.org/library/uuid.html // random #'s we need to init node and clockseq -var _seedBytes = _rng(); +let _seedBytes = _rng(); // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) -var _nodeId = [ +let _nodeId = [ _seedBytes[0] | 0x01, _seedBytes[1], _seedBytes[2], @@ -118,33 +118,33 @@ var _nodeId = [ ]; // Per 4.2.2, randomize (14 bit) clockseq -var _clockseq = ((_seedBytes[6] << 8) | _seedBytes[7]) & 0x3fff; +let _clockseq = ((_seedBytes[6] << 8) | _seedBytes[7]) & 0x3fff; // Previous uuid creation time -var _lastMSecs = 0, +let _lastMSecs = 0, _lastNSecs = 0; // See https://github.com/broofa/node-uuid for API details function v1(options, buf, offset) { - var i = (buf && offset) || 0; - var b = buf || []; + let i = (buf && offset) || 0; + let b = buf || []; options = options || {}; - var clockseq = options.clockseq != null ? options.clockseq : _clockseq; + let clockseq = options.clockseq != null ? options.clockseq : _clockseq; // UUID timestamps are 100 nano-second units since the Gregorian epoch, // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - var msecs = options.msecs != null ? options.msecs : new Date().getTime(); + let msecs = options.msecs != null ? options.msecs : new Date().getTime(); // Per 4.2.1.2, use count of uuid's generated during the current clock // cycle to simulate higher resolution clock - var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; + let nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) - var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; + let dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression if (dt < 0 && options.clockseq == null) { @@ -170,14 +170,14 @@ function v1(options, buf, offset) { msecs += 12219292800000; // `time_low` - var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + let tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; b[i++] = (tl >>> 24) & 0xff; b[i++] = (tl >>> 16) & 0xff; b[i++] = (tl >>> 8) & 0xff; b[i++] = tl & 0xff; // `time_mid` - var tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff; + let tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff; b[i++] = (tmh >>> 8) & 0xff; b[i++] = tmh & 0xff; @@ -192,8 +192,8 @@ function v1(options, buf, offset) { b[i++] = clockseq & 0xff; // `node` - var node = options.node || _nodeId; - for (var n = 0; n < 6; n++) { + let node = options.node || _nodeId; + for (let n = 0; n < 6; n++) { b[i + n] = node[n]; } @@ -205,7 +205,7 @@ function v1(options, buf, offset) { // See https://github.com/broofa/node-uuid for API details function v4(options, buf, offset) { // Deprecated - 'format' argument, as supported in v1.2 - var i = (buf && offset) || 0; + let i = (buf && offset) || 0; if (typeof options == 'string') { buf = options == 'binary' ? new BufferClass(16) : null; @@ -213,7 +213,7 @@ function v4(options, buf, offset) { } options = options || {}; - var rnds = options.random || (options.rng || _rng)(); + let rnds = options.random || (options.rng || _rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` rnds[6] = (rnds[6] & 0x0f) | 0x40; @@ -221,7 +221,7 @@ function v4(options, buf, offset) { // Copy bytes to buffer, if provided if (buf) { - for (var ii = 0; ii < 16; ii++) { + for (let ii = 0; ii < 16; ii++) { buf[i + ii] = rnds[ii]; } } From 248137969a4c64d7fb42d741a28b3cf91e677d2b Mon Sep 17 00:00:00 2001 From: Hamir Mahal Date: Fri, 7 Jun 2024 06:08:16 -0700 Subject: [PATCH 071/400] ci: fix usage of deprecated `artifact` actions (#4495) Closes: #4494. --- .github/workflows/test.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5c5e1cdb2..0246bdaa3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,9 +19,7 @@ jobs: cache: 'npm' - run: npm ci - run: npm run build - # v4 download seems to have some flakiness with the download of artifacts so pinning to v3 for now - # @see https://github.com/actions/download-artifact/issues/249 - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: axe-core path: axe.js @@ -39,7 +37,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node}} - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: axe-core - run: npm run test:node From 23b43dcf0f0b7a9cc02fa3f461ec28db45d405f8 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Thu, 13 Jun 2024 08:39:54 -0500 Subject: [PATCH 072/400] style(lib/rules): var -> const & let (#4493) Just like https://github.com/dequelabs/axe-core/pull/4451 but for `lib/rules`. This is the last of `lib/*` Smaller part of the full vision: https://github.com/dequelabs/axe-core/pull/4444 --------- Co-authored-by: Wilco Fiers --- lib/rules/data-table-large-matches.js | 2 +- lib/rules/frame-title-has-text-matches.js | 2 +- lib/rules/label-matches.js | 2 +- lib/rules/link-in-text-block-matches.js | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/rules/data-table-large-matches.js b/lib/rules/data-table-large-matches.js index f2cab57d2..b4ea755ac 100644 --- a/lib/rules/data-table-large-matches.js +++ b/lib/rules/data-table-large-matches.js @@ -2,7 +2,7 @@ import { isDataTable, toArray } from '../commons/table'; function dataTableLargeMatches(node) { if (isDataTable(node)) { - var tableArray = toArray(node); + const tableArray = toArray(node); return ( tableArray.length >= 3 && tableArray[0].length >= 3 && diff --git a/lib/rules/frame-title-has-text-matches.js b/lib/rules/frame-title-has-text-matches.js index 651260f40..d821d84e0 100644 --- a/lib/rules/frame-title-has-text-matches.js +++ b/lib/rules/frame-title-has-text-matches.js @@ -1,7 +1,7 @@ import { sanitize } from '../commons/text'; function frameTitleHasTextMatches(node) { - var title = node.getAttribute('title'); + const title = node.getAttribute('title'); return !!sanitize(title); } diff --git a/lib/rules/label-matches.js b/lib/rules/label-matches.js index 561db2d41..8b020bc29 100644 --- a/lib/rules/label-matches.js +++ b/lib/rules/label-matches.js @@ -6,7 +6,7 @@ function labelMatches(node, virtualNode) { return true; } - var type = virtualNode.attr('type').toLowerCase(); + const type = virtualNode.attr('type').toLowerCase(); return ( ['hidden', 'image', 'button', 'submit', 'reset'].includes(type) === false ); diff --git a/lib/rules/link-in-text-block-matches.js b/lib/rules/link-in-text-block-matches.js index 448740e25..0fc9fc0f2 100644 --- a/lib/rules/link-in-text-block-matches.js +++ b/lib/rules/link-in-text-block-matches.js @@ -2,8 +2,8 @@ import { sanitize } from '../commons/text'; import { isVisibleOnScreen, isInTextBlock } from '../commons/dom'; function linkInTextBlockMatches(node) { - var text = sanitize(node.innerText); - var role = node.getAttribute('role'); + const text = sanitize(node.innerText); + const role = node.getAttribute('role'); if (role && role !== 'link') { return false; From 3ef93531a574c2be76a92d59599d978714cca9d0 Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Thu, 13 Jun 2024 08:40:19 -0500 Subject: [PATCH 073/400] fix: colorio.js patch mocking CSS (#4456) Adds `patch-package` as suggested in the issue this PR fixes. The goal is to allow `window.CSS` to be mocked `null` in situations such as using JSdom. Tests cover a version that is patched and one that is unpatched to demonstrate the patch truly fixes the issue. fixes: #4400 --- **Developer Notes/Questions** for review: - Someone mentioned the patch step should _not_ be `postinstall`, what should it be instead? - For test coverage purposes it's useful to keep an unpatched version, currently this is done manually in `patches/color.unpatched.js` but perhaps there's a better way - It's a bit gross modifying so many pre-compiled `dist` files - Instead of a patch, we could pull in colorjs.io as a submodule and build it ourselves, unsure how to propagate that to consumers of axe-core however - Perhaps this is fine and I could document how to update the patch in the future --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steven Lambert <2433219+straker@users.noreply.github.com> Co-authored-by: gaiety-deque --- .circleci/config.yml | 3 +- .github/workflows/test.yml | 1 + .gitignore | 1 - eslint.config.js | 1 + package-lock.json | 628 +++++++++++++++++++++++-- package.json | 5 +- patches/colorjs.io+0.4.3.patch | 22 + test/integration/full/patch/patch.html | 26 + test/integration/full/patch/patch.mjs | 49 ++ test/karma.conf.js | 10 +- 10 files changed, 705 insertions(+), 41 deletions(-) create mode 100644 patches/colorjs.io+0.4.3.patch create mode 100644 test/integration/full/patch/patch.html create mode 100644 test/integration/full/patch/patch.mjs diff --git a/.circleci/config.yml b/.circleci/config.yml index 7b3aa4221..78b66949d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,13 +61,14 @@ jobs: paths: - node_modules - # Build and cache axe.js + # Build and cache built files build_unix: <<: *defaults <<: *unix_box steps: - checkout - <<: *restore_dependency_cache_unix + - run: npm run prepare - run: npm run build - save_cache: key: v9-cache-build-<< pipeline.git.revision >> diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0246bdaa3..9b6e4cc28 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,6 +18,7 @@ jobs: node-version: 20 cache: 'npm' - run: npm ci + - run: npm run prepare - run: npm run build - uses: actions/upload-artifact@v4 with: diff --git a/.gitignore b/.gitignore index fe79e6d26..3331c6fdb 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,3 @@ typings/axe-core/axe-core-tests.js # doc doc/rule-descriptions.*.md - diff --git a/eslint.config.js b/eslint.config.js index 4d35954a6..db39951cb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -185,6 +185,7 @@ module.exports = [ ignores: [ '**/node_modules/*', '**/tmp/*', + 'patches/*', 'build/tasks/aria-supported.js', 'doc/api/*', 'doc/examples/jest_react/*.js', diff --git a/package-lock.json b/package-lock.json index aa200454f..620b5f51b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,6 +64,7 @@ "node-notifier": "^10.0.1", "npm-run-all": "^4.1.5", "outdent": "^0.8.0", + "patch-package": "^8.0.0", "prettier": "^3.0.3", "revalidator": "^0.3.1", "selenium-webdriver": "^4.7.1", @@ -2579,6 +2580,12 @@ "@types/node": "*" } }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2813,6 +2820,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/axe-core": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", @@ -3217,13 +3233,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3428,6 +3450,21 @@ "node": ">=18" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -4540,6 +4577,23 @@ "node": ">=0.8" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -5006,6 +5060,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -5718,6 +5793,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/findup-sync": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", @@ -5934,10 +6018,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -6018,14 +6105,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6379,6 +6471,18 @@ "node": "*" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -6800,12 +6904,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6838,6 +6954,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7958,12 +8086,36 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -7991,6 +8143,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -9951,6 +10112,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -10212,6 +10389,128 @@ "tslib": "^2.0.3" } }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/patch-package/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/patch-package/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11336,6 +11635,23 @@ "node": ">= 0.6" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -11456,6 +11772,15 @@ "node": ">=0.3.1" } }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -15044,6 +15369,12 @@ "@types/node": "*" } }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -15223,6 +15554,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "axe-core": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", @@ -15528,13 +15865,16 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -15673,6 +16013,12 @@ "tcp-port-used": "^1.0.2" } }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, "clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -16525,6 +16871,17 @@ } } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -16881,6 +17238,21 @@ "unbox-primitive": "^1.0.2" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -17427,6 +17799,15 @@ "path-exists": "^4.0.0" } }, + "find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "requires": { + "micromatch": "^4.0.2" + } + }, "findup-sync": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", @@ -17581,9 +17962,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { @@ -17638,14 +18019,16 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-pkg-repo": { @@ -17910,6 +18293,15 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -18231,14 +18623,20 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -18254,6 +18652,15 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -19065,6 +19472,26 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -19092,6 +19519,12 @@ "graceful-fs": "^4.1.6" } }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -20548,6 +20981,16 @@ "mimic-fn": "^2.1.0" } }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -20748,6 +21191,97 @@ "tslib": "^2.0.3" } }, + "patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -21610,6 +22144,20 @@ } } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -21705,6 +22253,12 @@ } } }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", diff --git a/package.json b/package.json index 7c99fba10..0a2adf6f9 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,8 @@ "develop": "grunt dev --force", "api-docs": "jsdoc --configure .jsdoc.json", "build": "grunt", + "patch": "npx patch-package", + "unpatch": "npx patch-package --reverse", "eslint": "eslint --color --format stylish '{lib,test,build,doc}/**/*.js' 'Gruntfile.js'", "test": "npm run test:tsc && run-s \"test:unit:* -- {@}\" --", "test:tsc": "tsc", @@ -110,7 +112,7 @@ "sri-update": "grunt build && node build/sri-update && git add sri-history.json", "sri-validate": "node build/sri-update --validate", "fmt": "prettier --write .", - "prepare": "husky", + "prepare": "husky && npm run patch", "prebuild": "node ./build/check-node-version.js", "pretest": "node ./build/check-node-version.js", "postbuild": "prettier --write ./locales/_template.json ./doc/rule-descriptions.md" @@ -171,6 +173,7 @@ "node-notifier": "^10.0.1", "npm-run-all": "^4.1.5", "outdent": "^0.8.0", + "patch-package": "^8.0.0", "prettier": "^3.0.3", "revalidator": "^0.3.1", "selenium-webdriver": "^4.7.1", diff --git a/patches/colorjs.io+0.4.3.patch b/patches/colorjs.io+0.4.3.patch new file mode 100644 index 000000000..6a4020171 --- /dev/null +++ b/patches/colorjs.io+0.4.3.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/colorjs.io/dist/color.js b/node_modules/colorjs.io/dist/color.js +index fa7a099..b3ccb68 100644 +--- a/node_modules/colorjs.io/dist/color.js ++++ b/node_modules/colorjs.io/dist/color.js +@@ -1967,7 +1967,7 @@ var P3 = new RGBColorSpace({ + // Default space for CSS output. Code in Color.js makes this wider if there's a DOM available + defaults.display_space = sRGB; + +-if (typeof CSS !== "undefined" && CSS.supports) { ++if (typeof CSS !== "undefined" && CSS?.supports) { + // Find widest supported color space for CSS + for (let space of [lab, REC2020, P3]) { + let coords = space.getMinCoords(); +@@ -1996,7 +1996,7 @@ if (typeof CSS !== "undefined" && CSS.supports) { + function display (color, {space = defaults.display_space, ...options} = {}) { + let ret = serialize(color, options); + +- if (typeof CSS === "undefined" || CSS.supports("color", ret) || !defaults.display_space) { ++ if (typeof CSS === "undefined" || CSS?.supports("color", ret) || !defaults.display_space) { + ret = new String(ret); + ret.color = color; + } diff --git a/test/integration/full/patch/patch.html b/test/integration/full/patch/patch.html new file mode 100644 index 000000000..79d5fcd7f --- /dev/null +++ b/test/integration/full/patch/patch.html @@ -0,0 +1,26 @@ + + + + patch test + + + + + + + +
                + + + + diff --git a/test/integration/full/patch/patch.mjs b/test/integration/full/patch/patch.mjs new file mode 100644 index 000000000..9a3573e5d --- /dev/null +++ b/test/integration/full/patch/patch.mjs @@ -0,0 +1,49 @@ +// Solves for situations where global code is mocked, like old Jest docs +// recommending to `null` out `window.CSS` for JSDOM's benefit +// https://github.com/thymikee/jest-preset-angular/commit/ac30648347ab41e0cbce741f66ae2a06b766fe13#diff-f2981abe444e6cc2b341b0d7cadb3932d2f1fbb6601aebeaf70f8bb387439d35 + +const originalWindowCSS = window.CSS; + +function resetWindowCSSMock() { + Object.defineProperty(window, 'CSS', { value: originalWindowCSS }); +} + +function mockWindowCSS() { + Object.defineProperty(window, 'CSS', { value: null }); +} + +describe('patch', function () { + 'use strict'; + + beforeEach(mockWindowCSS); + afterEach(resetWindowCSSMock); + + it('can mock window.CSS to `null` on its own', function () { + assert.isNull(window.CSS); + }); + + it('resets css window mock', function () { + resetWindowCSSMock(); + assert.equal(window.CSS, originalWindowCSS); + }); + + it('imports axe.js and works while patched and mocked', async function () { + assert.isNull(window.CSS); + try { + await import('/axe.js'); + } catch (error) { + // Should not hit this assertion + assert.notOk(error); + } + }); + + it('imports axe.min.js and works while patched and mocked', async function () { + assert.isNull(window.CSS); + try { + await import('/axe.min.js'); + } catch (error) { + // Should not hit this assertion + assert.notOk(error); + } + }); +}); diff --git a/test/karma.conf.js b/test/karma.conf.js index ff0f2ebf7..1e4f824d2 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -87,6 +87,12 @@ module.exports = function (config) { files: [ { pattern: 'test/mock/**/*.html', included: false, served: true }, { pattern: 'test/integration/**/*.css', included: false, served: true }, + { + pattern: 'test/integration/**/*.mjs', + included: false, + served: true, + type: 'module' + }, { pattern: 'test/assets/**/*.*', included: false, served: true }, { pattern: 'test/integration/rules/**/*.html', @@ -94,13 +100,15 @@ module.exports = function (config) { served: true }, 'axe.js', + 'axe.min.js', 'test/testutils.js' ].concat(testPaths), proxies: { '/test': '/base/test', '/mock': '/base/test/mock', '/integration': '/base/test/integration', - '/axe.js': '/base/axe.js' + '/axe.js': '/base/axe.js', + '/axe.min.js': '/base/axe.min.js' }, browsers: ['ChromeHeadless'], reporters: ['spec'], From 11fad598c25eadd29f35ef6be382d907057d4537 Mon Sep 17 00:00:00 2001 From: Mark Noonan Date: Mon, 17 Jun 2024 05:35:50 -0400 Subject: [PATCH 074/400] fix: correct typos in texts (#4499) Hi! I noticed some minor typos and inconsistent text capitalization, as well as what looks like flipped `help` and `description` text in one spot for the `landmark-unique` rule. This PR fixes the ones I was able to spot. I noticed some overlap with https://github.com/dequelabs/axe-core/issues/4385, I'd be happy to grab the text changes mentioned there in this PR as well, ("Ensures" -> "Ensure" in rule descriptions), if that's not stepping on anybody's toes. --- doc/rule-descriptions.md | 8 ++--- lib/checks/aria/aria-errormessage.json | 6 ++-- .../forms/autocomplete-appropriate.json | 4 +-- lib/checks/forms/autocomplete-valid.json | 4 +-- lib/checks/shared/aria-labelledby.json | 2 +- lib/checks/shared/presentational-role.json | 2 +- lib/checks/shared/role-none.json | 2 +- lib/checks/shared/role-presentation.json | 2 +- lib/rules/landmark-unique.json | 4 +-- lib/rules/table-duplicate-name.json | 2 +- lib/rules/target-size.json | 2 +- locales/_template.json | 30 +++++++++---------- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/doc/rule-descriptions.md b/doc/rule-descriptions.md index 75787363d..c2ac90427 100644 --- a/doc/rule-descriptions.md +++ b/doc/rule-descriptions.md @@ -86,9 +86,9 @@ These rules are disabled by default, until WCAG 2.2 is more widely adopted and required. -| Rule ID | Description | Impact | Tags | Issue Type | ACT Rules | -| :----------------------------------------------------------------------------------------------- | :------------------------------------------------- | :------ | :--------------------------------------------- | :------------------------- | :-------- | -| [target-size](https://dequeuniversity.com/rules/axe/4.9/target-size?application=RuleDescription) | Ensure touch target have sufficient size and space | Serious | cat.sensory-and-visual-cues, wcag22aa, wcag258 | failure, needs review | | +| Rule ID | Description | Impact | Tags | Issue Type | ACT Rules | +| :----------------------------------------------------------------------------------------------- | :-------------------------------------------------- | :------ | :--------------------------------------------- | :------------------------- | :-------- | +| [target-size](https://dequeuniversity.com/rules/axe/4.9/target-size?application=RuleDescription) | Ensure touch targets have sufficient size and space | Serious | cat.sensory-and-visual-cues, wcag22aa, wcag258 | failure, needs review | | ## Best Practices Rules @@ -115,7 +115,7 @@ Rules that do not necessarily conform to WCAG success criterion but are industry | [landmark-no-duplicate-contentinfo](https://dequeuniversity.com/rules/axe/4.9/landmark-no-duplicate-contentinfo?application=RuleDescription) | Ensures the document has at most one contentinfo landmark | Moderate | cat.semantics, best-practice | failure | | | [landmark-no-duplicate-main](https://dequeuniversity.com/rules/axe/4.9/landmark-no-duplicate-main?application=RuleDescription) | Ensures the document has at most one main landmark | Moderate | cat.semantics, best-practice | failure | | | [landmark-one-main](https://dequeuniversity.com/rules/axe/4.9/landmark-one-main?application=RuleDescription) | Ensures the document has a main landmark | Moderate | cat.semantics, best-practice | failure | | -| [landmark-unique](https://dequeuniversity.com/rules/axe/4.9/landmark-unique?application=RuleDescription) | Landmarks should have a unique role or role/label/title (i.e. accessible name) combination | Moderate | cat.semantics, best-practice | failure | | +| [landmark-unique](https://dequeuniversity.com/rules/axe/4.9/landmark-unique?application=RuleDescription) | Ensures landmarks are unique | Moderate | cat.semantics, best-practice | failure | | | [meta-viewport-large](https://dequeuniversity.com/rules/axe/4.9/meta-viewport-large?application=RuleDescription) | Ensures <meta name="viewport"> can scale a significant amount | Minor | cat.sensory-and-visual-cues, best-practice | failure | | | [page-has-heading-one](https://dequeuniversity.com/rules/axe/4.9/page-has-heading-one?application=RuleDescription) | Ensure that the page, or at least one of its frames contains a level-one heading | Moderate | cat.semantics, best-practice | failure | | | [presentation-role-conflict](https://dequeuniversity.com/rules/axe/4.9/presentation-role-conflict?application=RuleDescription) | Elements marked as presentational should not have global ARIA or tabindex to ensure all screen readers ignore them | Minor | cat.aria, best-practice, ACT | failure | [46ca7f](https://act-rules.github.io/rules/46ca7f) | diff --git a/lib/checks/aria/aria-errormessage.json b/lib/checks/aria/aria-errormessage.json index 84901729a..e238d7f65 100644 --- a/lib/checks/aria/aria-errormessage.json +++ b/lib/checks/aria/aria-errormessage.json @@ -11,9 +11,9 @@ "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element" }, "incomplete": { - "singular": "ensure aria-errormessage value `${data.values}` references an existing element", - "plural": "ensure aria-errormessage values `${data.values}` reference existing elements", - "idrefs": "unable to determine if aria-errormessage element exists on the page: ${data.values}" + "singular": "Ensure aria-errormessage value `${data.values}` references an existing element", + "plural": "Ensure aria-errormessage values `${data.values}` reference existing elements", + "idrefs": "Unable to determine if aria-errormessage element exists on the page: ${data.values}" } } } diff --git a/lib/checks/forms/autocomplete-appropriate.json b/lib/checks/forms/autocomplete-appropriate.json index dda69e3b0..0e9940de8 100644 --- a/lib/checks/forms/autocomplete-appropriate.json +++ b/lib/checks/forms/autocomplete-appropriate.json @@ -5,8 +5,8 @@ "metadata": { "impact": "serious", "messages": { - "pass": "the autocomplete value is on an appropriate element", - "fail": "the autocomplete value is inappropriate for this type of input" + "pass": "The autocomplete value is on an appropriate element", + "fail": "The autocomplete value is inappropriate for this type of input" } } } diff --git a/lib/checks/forms/autocomplete-valid.json b/lib/checks/forms/autocomplete-valid.json index 0906e4b89..25ca50724 100644 --- a/lib/checks/forms/autocomplete-valid.json +++ b/lib/checks/forms/autocomplete-valid.json @@ -4,8 +4,8 @@ "metadata": { "impact": "serious", "messages": { - "pass": "the autocomplete attribute is correctly formatted", - "fail": "the autocomplete attribute is incorrectly formatted" + "pass": "The autocomplete attribute is correctly formatted", + "fail": "The autocomplete attribute is incorrectly formatted" } }, "options": { diff --git a/lib/checks/shared/aria-labelledby.json b/lib/checks/shared/aria-labelledby.json index f09d75fda..0207baf86 100644 --- a/lib/checks/shared/aria-labelledby.json +++ b/lib/checks/shared/aria-labelledby.json @@ -6,7 +6,7 @@ "messages": { "pass": "aria-labelledby attribute exists and references elements that are visible to screen readers", "fail": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty", - "incomplete": "ensure aria-labelledby references an existing element" + "incomplete": "Ensure aria-labelledby references an existing element" } } } diff --git a/lib/checks/shared/presentational-role.json b/lib/checks/shared/presentational-role.json index 7b8dfb3b0..152477696 100644 --- a/lib/checks/shared/presentational-role.json +++ b/lib/checks/shared/presentational-role.json @@ -4,7 +4,7 @@ "metadata": { "impact": "minor", "messages": { - "pass": "Element's default semantics were overriden with role=\"${data.role}\"", + "pass": "Element's default semantics were overridden with role=\"${data.role}\"", "fail": { "default": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"", "globalAria": "Element's role is not presentational because it has a global ARIA attribute", diff --git a/lib/checks/shared/role-none.json b/lib/checks/shared/role-none.json index dfae40a5b..dd46b9148 100644 --- a/lib/checks/shared/role-none.json +++ b/lib/checks/shared/role-none.json @@ -12,7 +12,7 @@ "metadata": { "impact": "minor", "messages": { - "pass": "Element's default semantics were overriden with role=\"none\"", + "pass": "Element's default semantics were overridden with role=\"none\"", "fail": "Element's default semantics were not overridden with role=\"none\"" } } diff --git a/lib/checks/shared/role-presentation.json b/lib/checks/shared/role-presentation.json index 8615e6c35..d083000af 100644 --- a/lib/checks/shared/role-presentation.json +++ b/lib/checks/shared/role-presentation.json @@ -12,7 +12,7 @@ "metadata": { "impact": "minor", "messages": { - "pass": "Element's default semantics were overriden with role=\"presentation\"", + "pass": "Element's default semantics were overridden with role=\"presentation\"", "fail": "Element's default semantics were not overridden with role=\"presentation\"" } } diff --git a/lib/rules/landmark-unique.json b/lib/rules/landmark-unique.json index dff8639ad..2c5c2e3db 100644 --- a/lib/rules/landmark-unique.json +++ b/lib/rules/landmark-unique.json @@ -4,8 +4,8 @@ "selector": "[role=banner], [role=complementary], [role=contentinfo], [role=main], [role=navigation], [role=region], [role=search], [role=form], form, footer, header, aside, main, nav, section", "tags": ["cat.semantics", "best-practice"], "metadata": { - "help": "Ensures landmarks are unique", - "description": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination" + "description": "Ensures landmarks are unique", + "help": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination" }, "matches": "landmark-unique-matches", "all": [], diff --git a/lib/rules/table-duplicate-name.json b/lib/rules/table-duplicate-name.json index da3a076c0..e274b22ae 100644 --- a/lib/rules/table-duplicate-name.json +++ b/lib/rules/table-duplicate-name.json @@ -5,7 +5,7 @@ "tags": ["cat.tables", "best-practice"], "metadata": { "description": "Ensure the element does not contain the same text as the summary attribute", - "help": "tables should not have the same summary and caption" + "help": "Tables should not have the same summary and caption" }, "all": [], "any": [], diff --git a/lib/rules/target-size.json b/lib/rules/target-size.json index 7a03bd030..42b3e44de 100644 --- a/lib/rules/target-size.json +++ b/lib/rules/target-size.json @@ -6,7 +6,7 @@ "matches": "widget-not-inline-matches", "tags": ["cat.sensory-and-visual-cues", "wcag22aa", "wcag258"], "metadata": { - "description": "Ensure touch target have sufficient size and space", + "description": "Ensure touch targets have sufficient size and space", "help": "All touch targets must be 24px large, or leave sufficient space" }, "all": [], diff --git a/locales/_template.json b/locales/_template.json index 9aa84b106..e52124c82 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -282,8 +282,8 @@ "help": "Document should have one main landmark" }, "landmark-unique": { - "help": "Ensures landmarks are unique", - "description": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination" + "description": "Ensures landmarks are unique", + "help": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination" }, "link-in-text-block": { "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color", @@ -383,14 +383,14 @@ }, "table-duplicate-name": { "description": "Ensure the element does not contain the same text as the summary attribute", - "help": "tables should not have the same summary and caption" + "help": "Tables should not have the same summary and caption" }, "table-fake-caption": { "description": "Ensure that tables with a caption use the element.", "help": "Data or header cells must not be used to give caption to a data table." }, "target-size": { - "description": "Ensure touch target have sufficient size and space", + "description": "Ensure touch targets have sufficient size and space", "help": "All touch targets must be 24px large, or leave sufficient space" }, "td-has-header": { @@ -461,9 +461,9 @@ "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element" }, "incomplete": { - "singular": "ensure aria-errormessage value `${data.values}` references an existing element", - "plural": "ensure aria-errormessage values `${data.values}` reference existing elements", - "idrefs": "unable to determine if aria-errormessage element exists on the page: ${data.values}" + "singular": "Ensure aria-errormessage value `${data.values}` references an existing element", + "plural": "Ensure aria-errormessage values `${data.values}` reference existing elements", + "idrefs": "Unable to determine if aria-errormessage element exists on the page: ${data.values}" } }, "aria-hidden-body": { @@ -678,12 +678,12 @@ } }, "autocomplete-appropriate": { - "pass": "the autocomplete value is on an appropriate element", - "fail": "the autocomplete value is inappropriate for this type of input" + "pass": "The autocomplete value is on an appropriate element", + "fail": "The autocomplete value is inappropriate for this type of input" }, "autocomplete-valid": { - "pass": "the autocomplete attribute is correctly formatted", - "fail": "the autocomplete attribute is incorrectly formatted" + "pass": "The autocomplete attribute is correctly formatted", + "fail": "The autocomplete attribute is incorrectly formatted" }, "accesskeys": { "pass": "Accesskey attribute value is unique", @@ -961,7 +961,7 @@ "aria-labelledby": { "pass": "aria-labelledby attribute exists and references elements that are visible to screen readers", "fail": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty", - "incomplete": "ensure aria-labelledby references an existing element" + "incomplete": "Ensure aria-labelledby references an existing element" }, "avoid-inline-spacing": { "pass": "No inline styles with '!important' that affect text spacing has been specified", @@ -1044,7 +1044,7 @@ } }, "presentational-role": { - "pass": "Element's default semantics were overriden with role=\"${data.role}\"", + "pass": "Element's default semantics were overridden with role=\"${data.role}\"", "fail": { "default": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"", "globalAria": "Element's role is not presentational because it has a global ARIA attribute", @@ -1054,11 +1054,11 @@ } }, "role-none": { - "pass": "Element's default semantics were overriden with role=\"none\"", + "pass": "Element's default semantics were overridden with role=\"none\"", "fail": "Element's default semantics were not overridden with role=\"none\"" }, "role-presentation": { - "pass": "Element's default semantics were overriden with role=\"presentation\"", + "pass": "Element's default semantics were overridden with role=\"presentation\"", "fail": "Element's default semantics were not overridden with role=\"presentation\"" }, "svg-non-empty-title": { From 50e7c23ae98e42fbc729baaa1500223af315a06b Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Mon, 17 Jun 2024 06:09:26 -0500 Subject: [PATCH 075/400] chore(test/rule-matches): var -> const & let (#4497) For `test/rule-matches` Smaller part of the full vision: https://github.com/dequelabs/axe-core/pull/4444 --- .../rule-matches/aria-allowed-attr-matches.js | 8 +- .../rule-matches/aria-allowed-role-matches.js | 12 +- test/rule-matches/aria-has-attr-matches.js | 12 +- .../rule-matches/aria-hidden-focus-matches.js | 20 +-- .../aria-required-children-matches.js | 10 +- .../aria-required-parent-matches.js | 10 +- test/rule-matches/autocomplete-matches.js | 40 ++--- test/rule-matches/color-contrast-matches.js | 140 +++++++++--------- test/rule-matches/data-table-matches.js | 12 +- .../duplicate-id-active-matches.js | 22 +-- .../rule-matches/duplicate-id-aria-matches.js | 22 +-- .../rule-matches/duplicate-id-misc-matches.js | 22 +-- .../frame-focusable-content-matches.js | 12 +- .../frame-title-has-text-matches.js | 10 +- .../has-implicit-chromium-role-matches.js | 14 +- test/rule-matches/heading-matches.js | 24 +-- test/rule-matches/html-namespace-matches.js | 30 ++-- test/rule-matches/html-xml-lang-mismatch.js | 18 +-- .../identical-links-same-purpose-matches.js | 48 +++--- .../inserted-into-focus-order-matches.js | 16 +- test/rule-matches/is-initiator-matches.js | 4 +- test/rule-matches/is-visible-matches.js | 6 +- .../label-content-name-mismatch-matches.js | 74 ++++----- test/rule-matches/label-matches.js | 16 +- .../rule-matches/landmark-has-body-context.js | 18 +-- test/rule-matches/landmark-unique-matches.js | 83 ++++++----- test/rule-matches/layout-table-matches.js | 14 +- .../nested-interactive-matches.js | 14 +- .../rule-matches/no-autoplay-audio-matches.js | 20 +-- test/rule-matches/no-empty-role-matches.js | 36 ++--- .../no-explicit-name-required-matches.js | 34 ++--- test/rule-matches/no-naming-method-matches.js | 50 +++---- test/rule-matches/no-negative-tabindex.js | 26 ++-- test/rule-matches/p-as-heading-matches.js | 18 +-- .../scrollable-region-focusable-matches.js | 88 +++++------ test/rule-matches/skip-link-matches.js | 4 +- test/rule-matches/svg-namespace-matches.js | 36 ++--- 37 files changed, 527 insertions(+), 516 deletions(-) diff --git a/test/rule-matches/aria-allowed-attr-matches.js b/test/rule-matches/aria-allowed-attr-matches.js index 5b7dfb33a..e4177e0f7 100644 --- a/test/rule-matches/aria-allowed-attr-matches.js +++ b/test/rule-matches/aria-allowed-attr-matches.js @@ -1,8 +1,8 @@ describe('aria-allowed-attr-matches', function () { 'use strict'; - var queryFixture = axe.testUtils.queryFixture; - var rule; + const queryFixture = axe.testUtils.queryFixture; + let rule; beforeEach(function () { rule = axe.utils.getRule('aria-allowed-attr'); @@ -13,7 +13,7 @@ describe('aria-allowed-attr-matches', function () { }); it('should return true on elements that have aria attributes', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
                ' ); @@ -21,7 +21,7 @@ describe('aria-allowed-attr-matches', function () { }); it('should return false on elements that have no aria attributes', function () { - var vNode = queryFixture('
                '); + const vNode = queryFixture('
                '); assert.isFalse(rule.matches(null, vNode)); }); diff --git a/test/rule-matches/aria-allowed-role-matches.js b/test/rule-matches/aria-allowed-role-matches.js index 28992fde4..14769d0d7 100644 --- a/test/rule-matches/aria-allowed-role-matches.js +++ b/test/rule-matches/aria-allowed-role-matches.js @@ -1,27 +1,29 @@ describe('aria-allowed-role-matches', function () { 'use strict'; - var queryFixture = axe.testUtils.queryFixture; - var rule; + const queryFixture = axe.testUtils.queryFixture; + let rule; beforeEach(function () { rule = axe.utils.getRule('aria-allowed-role'); }); it('return false (no matches) for a with a href to have any invalid role', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); assert.isFalse(rule.matches(null, vNode)); }); it('return true for input with redundant role', function () { - var vNode = queryFixture(''); + const vNode = queryFixture( + '' + ); assert.isTrue(rule.matches(null, vNode)); }); it('return true for element with valid role', function () { - var vNode = queryFixture('
                  '); + const vNode = queryFixture('
                    '); assert.isTrue(rule.matches(null, vNode)); }); }); diff --git a/test/rule-matches/aria-has-attr-matches.js b/test/rule-matches/aria-has-attr-matches.js index c3e0adbb5..a724a68a0 100644 --- a/test/rule-matches/aria-has-attr-matches.js +++ b/test/rule-matches/aria-has-attr-matches.js @@ -1,9 +1,9 @@ describe('aria-has-attr-matches', function () { 'use strict'; - var queryFixture = axe.testUtils.queryFixture; - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const queryFixture = axe.testUtils.queryFixture; + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('aria-valid-attr-value'); @@ -14,16 +14,16 @@ describe('aria-has-attr-matches', function () { }); it('should return false if an element has no attributes', function () { - var vNode = fixtureSetup('
                    '); + const vNode = fixtureSetup('
                    '); assert.isFalse(rule.matches(null, vNode)); }); it('should return false if an element has no ARIA attributes', function () { - var vNode = queryFixture('
                    '); + const vNode = queryFixture('
                    '); assert.isFalse(rule.matches(null, vNode)); }); it('should return true if an element has ARIA attributes', function () { - var vNode = queryFixture('
                    '); + const vNode = queryFixture('
                    '); assert.isTrue(rule.matches(null, vNode)); }); }); diff --git a/test/rule-matches/aria-hidden-focus-matches.js b/test/rule-matches/aria-hidden-focus-matches.js index b770c8832..0a498004a 100644 --- a/test/rule-matches/aria-hidden-focus-matches.js +++ b/test/rule-matches/aria-hidden-focus-matches.js @@ -1,8 +1,8 @@ describe('aria-hidden-focus-matches', function () { 'use strict'; - var rule; - var queryFixture = axe.testUtils.queryFixture; + let rule; + const queryFixture = axe.testUtils.queryFixture; beforeEach(function () { rule = axe.utils.getRule('aria-hidden-focus'); @@ -13,24 +13,24 @@ describe('aria-hidden-focus-matches', function () { }); it('return true when there is no parent with aria-hidden', function () { - var vNode = queryFixture('
                    ' + '
                    '); - var actual = rule.matches(vNode.actualNode); + const vNode = queryFixture('
                    ' + '
                    '); + const actual = rule.matches(vNode.actualNode); assert.isTrue(actual); }); it('return false when has a parent element with aria-hidden', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode); + const actual = rule.matches(vNode.actualNode); assert.isFalse(actual); }); it('return false when has any parent element with aria-hidden', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
              `; - var target = fixture.querySelector('#target'); + const target = fixture.querySelector('#target'); axe.testUtils.flatTreeSetup(fixture); assert.isFalse(rule.matches(target, axe.utils.getNodeFromTree(target))); }); @@ -436,13 +436,13 @@ describe('color-contrast-matches', function () { fixture.innerHTML = '
              ' + '
              '; - var shadowRoot = document + const shadowRoot = document .getElementById('parent') .attachShadow({ mode: 'open' }); shadowRoot.innerHTML = '
              Text
              '; - var shadowTarget = + const shadowTarget = fixture.firstChild.shadowRoot.querySelector('#shadowTarget'); axe.testUtils.flatTreeSetup(fixture); assert.isTrue( @@ -453,7 +453,7 @@ describe('color-contrast-matches', function () { it('should look at the correct root node when looking up an explicit label and disabled input', function () { fixture.innerHTML = '
              ' + '' + '
              '; - var shadowRoot = document + const shadowRoot = document .getElementById('parent') .attachShadow({ mode: 'open' }); shadowRoot.innerHTML = @@ -462,7 +462,7 @@ describe('color-contrast-matches', function () { '' + '
              '; - var shadowLabel = + const shadowLabel = fixture.firstChild.shadowRoot.querySelector('#shadowLabel'); axe.testUtils.flatTreeSetup(fixture); assert.isFalse( @@ -473,7 +473,7 @@ describe('color-contrast-matches', function () { it('should look at the correct root node when looking up implicit label and disabled input', function () { fixture.innerHTML = '
              ' + '' + '
              '; - var shadowRoot = document + const shadowRoot = document .getElementById('parent') .attachShadow({ mode: 'open' }); shadowRoot.innerHTML = @@ -481,7 +481,7 @@ describe('color-contrast-matches', function () { '' + '
              '; - var shadowLabel = + const shadowLabel = fixture.firstChild.shadowRoot.querySelector('#shadowLabel'); axe.testUtils.flatTreeSetup(fixture); assert.isFalse( @@ -492,7 +492,7 @@ describe('color-contrast-matches', function () { it("should look at the correct root node for a disabled control's label associated w/ aria-labelledby", function () { fixture.innerHTML = '
              ' + '' + '
              '; - var shadowRoot = document + const shadowRoot = document .getElementById('parent') .attachShadow({ mode: 'open' }); shadowRoot.innerHTML = @@ -501,7 +501,7 @@ describe('color-contrast-matches', function () { '' + '
'; - var shadowLabel = + const shadowLabel = fixture.firstChild.shadowRoot.querySelector('#shadowLabel'); axe.testUtils.flatTreeSetup(fixture); assert.isFalse( @@ -512,11 +512,11 @@ describe('color-contrast-matches', function () { it('should handle input/label spread across the shadow boundary', function () { fixture.innerHTML = ''; - var container = document.getElementById('firstChild'); - var shadowRoot = container.attachShadow({ mode: 'open' }); + const container = document.getElementById('firstChild'); + const shadowRoot = container.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = ''; - var shadowTarget = container.shadowRoot.querySelector('#input'); + const shadowTarget = container.shadowRoot.querySelector('#input'); axe.testUtils.flatTreeSetup(fixture); assert.isFalse( rule.matches(shadowTarget, axe.utils.getNodeFromTree(shadowTarget)) @@ -529,14 +529,14 @@ describe('color-contrast-matches', function () { '
' + '
'; - var shadowRoot = document + const shadowRoot = document .getElementById('firstChild') .attachShadow({ mode: 'open' }); shadowRoot.innerHTML = 'Some text' + '

Other text

'; - var firstChild = fixture.querySelector('#firstChild'); + const firstChild = fixture.querySelector('#firstChild'); axe.testUtils.flatTreeSetup(fixture); assert.isTrue( rule.matches(firstChild, axe.utils.getNodeFromTree(firstChild)) @@ -550,16 +550,16 @@ describe('color-contrast-matches', function () { ''; function createContentSlotted() { - var group = document.createElement('span'); + const group = document.createElement('span'); group.innerHTML = ''; return group; } - var slotted = fixture.querySelector('.slotted'); - var shadowRoot = slotted.attachShadow({ mode: 'open' }); + const slotted = fixture.querySelector('.slotted'); + const shadowRoot = slotted.attachShadow({ mode: 'open' }); shadowRoot.appendChild(createContentSlotted()); - var input = slotted.querySelector('input'); + const input = slotted.querySelector('input'); axe.testUtils.flatTreeSetup(fixture); assert.isTrue(rule.matches(input, axe.utils.getNodeFromTree(input))); }); diff --git a/test/rule-matches/data-table-matches.js b/test/rule-matches/data-table-matches.js index ab1e92523..24e0fff16 100644 --- a/test/rule-matches/data-table-matches.js +++ b/test/rule-matches/data-table-matches.js @@ -1,9 +1,9 @@ describe('data-table-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const fixture = document.getElementById('fixture'); + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('th-has-data-cells'); @@ -25,7 +25,7 @@ describe('data-table-matches', function () { '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -37,7 +37,7 @@ describe('data-table-matches', function () { '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -50,7 +50,7 @@ describe('data-table-matches', function () { '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'table')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); }); diff --git a/test/rule-matches/duplicate-id-active-matches.js b/test/rule-matches/duplicate-id-active-matches.js index 60bb45d3c..f34db28c6 100644 --- a/test/rule-matches/duplicate-id-active-matches.js +++ b/test/rule-matches/duplicate-id-active-matches.js @@ -1,9 +1,9 @@ describe('duplicate-id-active matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const fixture = document.getElementById('fixture'); + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('duplicate-id-active'); @@ -19,31 +19,31 @@ describe('duplicate-id-active matches', function () { it('returns false if the ID is of an inactive non-referenced element', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an inactive non-referenced element with a duplicate', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns true if the ID is of an active non-referenced element', function () { fixtureSetup(''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns true if the ID is a duplicate of an active non-referenced element', function () { fixtureSetup('
' + ''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an inactive ARIA referenced element', function () { fixtureSetup('
' + '
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -53,7 +53,7 @@ describe('duplicate-id-active matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -61,7 +61,7 @@ describe('duplicate-id-active matches', function () { fixtureSetup( '' + '
' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -71,7 +71,7 @@ describe('duplicate-id-active matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); }); diff --git a/test/rule-matches/duplicate-id-aria-matches.js b/test/rule-matches/duplicate-id-aria-matches.js index 2ebd3a071..4ddf03f74 100644 --- a/test/rule-matches/duplicate-id-aria-matches.js +++ b/test/rule-matches/duplicate-id-aria-matches.js @@ -1,9 +1,9 @@ describe('duplicate-id-aria matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const fixture = document.getElementById('fixture'); + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('duplicate-id-aria'); @@ -19,31 +19,31 @@ describe('duplicate-id-aria matches', function () { it('returns false if the ID is of an inactive non-referenced element', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an inactive non-referenced element with a duplicate', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an active non-referenced element', function () { fixtureSetup(''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is a duplicate of an active non-referenced element', function () { fixtureSetup('
' + ''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns true if the ID is of an inactive ARIA referenced element', function () { fixtureSetup('
' + '
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); @@ -53,7 +53,7 @@ describe('duplicate-id-aria matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); @@ -61,7 +61,7 @@ describe('duplicate-id-aria matches', function () { fixtureSetup( '' + '
' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); @@ -71,7 +71,7 @@ describe('duplicate-id-aria matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); }); diff --git a/test/rule-matches/duplicate-id-misc-matches.js b/test/rule-matches/duplicate-id-misc-matches.js index 77f2331b2..d44c94059 100644 --- a/test/rule-matches/duplicate-id-misc-matches.js +++ b/test/rule-matches/duplicate-id-misc-matches.js @@ -1,9 +1,9 @@ describe('duplicate-id-misc matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const fixture = document.getElementById('fixture'); + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('duplicate-id'); @@ -19,31 +19,31 @@ describe('duplicate-id-misc matches', function () { it('returns true if the ID is of an inactive non-referenced element', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns true if the ID is of an inactive non-referenced element with a duplicate', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an active non-referenced element', function () { fixtureSetup(''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is a duplicate of an active non-referenced element', function () { fixtureSetup('
' + ''); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); it('returns false if the ID is of an inactive ARIA referenced element', function () { fixtureSetup('
' + '
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'div[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -53,7 +53,7 @@ describe('duplicate-id-misc matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -61,7 +61,7 @@ describe('duplicate-id-misc matches', function () { fixtureSetup( '' + '
' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'button[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -71,7 +71,7 @@ describe('duplicate-id-misc matches', function () { '
' + '' ); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'span[id=foo]')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); }); diff --git a/test/rule-matches/frame-focusable-content-matches.js b/test/rule-matches/frame-focusable-content-matches.js index 8adc9ef5b..996397bc2 100644 --- a/test/rule-matches/frame-focusable-content-matches.js +++ b/test/rule-matches/frame-focusable-content-matches.js @@ -1,13 +1,13 @@ describe('frame-focusable-content-matches', function () { 'use strict'; - var rule; + let rule; beforeEach(function () { rule = axe.utils.getRule('frame-focusable-content'); }); it('returns false for the top-level context', function () { - var result = rule.matches(null, null, { + const result = rule.matches(null, null, { initiator: true, focusable: false, size: { @@ -19,7 +19,7 @@ describe('frame-focusable-content-matches', function () { }); it('returns false for focusable iframes', function () { - var result = rule.matches(null, null, { + const result = rule.matches(null, null, { initiator: false, focusable: true, size: { @@ -31,7 +31,7 @@ describe('frame-focusable-content-matches', function () { }); it('returns false for non-focusable iframes that are too small (1x1)', function () { - var result = rule.matches(null, null, { + const result = rule.matches(null, null, { initiator: false, focusable: false, size: { @@ -43,7 +43,7 @@ describe('frame-focusable-content-matches', function () { }); it('returns false for non-focusable iframes that are too small (0x0)', function () { - var result = rule.matches(null, null, { + const result = rule.matches(null, null, { initiator: false, focusable: false, size: { @@ -55,7 +55,7 @@ describe('frame-focusable-content-matches', function () { }); it('returns true for non-focusable iframes', function () { - var result = rule.matches(null, null, { + const result = rule.matches(null, null, { initiator: false, focusable: false, size: { diff --git a/test/rule-matches/frame-title-has-text-matches.js b/test/rule-matches/frame-title-has-text-matches.js index cb9bbe42f..c72859888 100644 --- a/test/rule-matches/frame-title-has-text-matches.js +++ b/test/rule-matches/frame-title-has-text-matches.js @@ -1,8 +1,8 @@ describe('layout-table-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var rule; + const fixture = document.getElementById('fixture'); + let rule; beforeEach(function () { rule = axe.utils.getRule('frame-title-unique'); @@ -14,19 +14,19 @@ describe('layout-table-matches', function () { it('should return true if title attribute has text', function () { fixture.innerHTML = ''; - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isTrue(rule.matches(node)); }); it('should return false if title attribute is empty', function () { fixture.innerHTML = ''; - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); it('should return false if title attribute contains only whitespace', function () { fixture.innerHTML = ''; - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); }); diff --git a/test/rule-matches/has-implicit-chromium-role-matches.js b/test/rule-matches/has-implicit-chromium-role-matches.js index 55c54807c..448cb2070 100644 --- a/test/rule-matches/has-implicit-chromium-role-matches.js +++ b/test/rule-matches/has-implicit-chromium-role-matches.js @@ -1,9 +1,9 @@ describe('has-implicit-chromium-role-matches', function () { 'use strict'; - var rule; - var fixture = document.getElementById('fixture'); - var queryFixture = axe.testUtils.queryFixture; + let rule; + const fixture = document.getElementById('fixture'); + const queryFixture = axe.testUtils.queryFixture; beforeEach(function () { rule = axe.utils.getRule('presentation-role-conflict'); @@ -18,22 +18,22 @@ describe('has-implicit-chromium-role-matches', function () { }); it('matches elements with an implicit role', function () { - var vNode = queryFixture('
'); + const vNode = queryFixture('
'); assert.isTrue(rule.matches(null, vNode)); }); it('does not match elements with no implicit role', function () { - var vNode = queryFixture('
'); + const vNode = queryFixture('
'); assert.isFalse(rule.matches(null, vNode)); }); it('matches elements with an implicit role in chromium', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); }); it('does not match elements with no implicit role even if they are focusable and have an explicit role', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
' ); assert.isFalse(rule.matches(null, vNode)); diff --git a/test/rule-matches/heading-matches.js b/test/rule-matches/heading-matches.js index 4939f16b9..59f825054 100644 --- a/test/rule-matches/heading-matches.js +++ b/test/rule-matches/heading-matches.js @@ -1,8 +1,8 @@ describe('heading-matches', function () { 'use strict'; - var queryFixture = axe.testUtils.queryFixture; - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; + const queryFixture = axe.testUtils.queryFixture; + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('empty-heading'); @@ -13,39 +13,41 @@ describe('heading-matches', function () { }); it('should return false on elements that are not headings', function () { - var vNode = fixtureSetup('
'); + const vNode = fixtureSetup('
'); assert.isFalse(rule.matches(null, vNode)); }); it('should return true on elements with role="heading"', function () { - var vNode = queryFixture('
'); + const vNode = queryFixture('
'); assert.isTrue(rule.matches(null, vNode)); }); it('should return true on regular headings without roles', function () { - for (var i = 1; i <= 6; i++) { - var vNode = queryFixture(''); + for (let i = 1; i <= 6; i++) { + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); } }); it('should return false on headings with their role changes', function () { - var vNode = queryFixture('

'); + const vNode = queryFixture('

'); assert.isFalse(rule.matches(null, vNode)); }); it('should return true on headings with their role changes to an invalid role', function () { - var vNode = queryFixture('

'); + const vNode = queryFixture('

'); assert.isTrue(rule.matches(null, vNode)); }); it('should return true on headings with their role changes to an abstract role', function () { - var vNode = queryFixture('

'); + const vNode = queryFixture('

'); assert.isTrue(rule.matches(null, vNode)); }); it('should return true on headings with explicit role="none" and an empty aria-label to account for presentation conflict resolution', function () { - var vNode = queryFixture('

'); + const vNode = queryFixture( + '

' + ); assert.isTrue(rule.matches(null, vNode)); }); }); diff --git a/test/rule-matches/html-namespace-matches.js b/test/rule-matches/html-namespace-matches.js index 48ff0a266..c6582e7ee 100644 --- a/test/rule-matches/html-namespace-matches.js +++ b/test/rule-matches/html-namespace-matches.js @@ -1,8 +1,8 @@ describe('html-namespace-matches', function () { 'use strict'; - var rule; - var fixture; - var axeFixtureSetup; + let rule; + let fixture; + let axeFixtureSetup; beforeEach(function () { fixture = document.getElementById('fixture'); @@ -16,22 +16,22 @@ describe('html-namespace-matches', function () { it('returns true when passed an HTML element', function () { axeFixtureSetup('

Hello world

'); - var node = fixture.querySelector('h1'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('h1'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); }); it('returns true when passed a custom HTML element', function () { axeFixtureSetup('Hello world'); - var node = fixture.querySelector('xx-heading'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('xx-heading'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); }); it('returns false when passed an SVG element', function () { axeFixtureSetup('Pretty picture'); - var node = fixture.querySelector('svg'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('svg'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); }); @@ -39,14 +39,14 @@ describe('html-namespace-matches', function () { axeFixtureSetup( 'Pretty picture' ); - var node = fixture.querySelector('circle'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('circle'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); }); describe('Serial Virtual Node', function () { it('returns true when passed an HTML element', function () { - var serialNode = new axe.SerialVirtualNode({ + const serialNode = new axe.SerialVirtualNode({ nodeName: 'h1' }); serialNode.parent = null; @@ -55,7 +55,7 @@ describe('html-namespace-matches', function () { }); it('returns true when passed a custom HTML element', function () { - var serialNode = new axe.SerialVirtualNode({ + const serialNode = new axe.SerialVirtualNode({ nodeName: 'xx-heading' }); serialNode.parent = null; @@ -64,10 +64,10 @@ describe('html-namespace-matches', function () { }); it('returns false when passed an SVG circle element', function () { - var serialNode = new axe.SerialVirtualNode({ + const serialNode = new axe.SerialVirtualNode({ nodeName: 'circle' }); - var parent = new axe.SerialVirtualNode({ + const parent = new axe.SerialVirtualNode({ nodeName: 'svg' }); serialNode.parent = parent; diff --git a/test/rule-matches/html-xml-lang-mismatch.js b/test/rule-matches/html-xml-lang-mismatch.js index b710aef5c..cbac5a1fd 100644 --- a/test/rule-matches/html-xml-lang-mismatch.js +++ b/test/rule-matches/html-xml-lang-mismatch.js @@ -3,9 +3,9 @@ describe('xml-lang-mismatch-matches', function () { // nested this on a per rule basis, for future-proofing writing tests for multiple rules using the same matches describe('for rule: html-xml-lang-mismatch', function () { - var rule; - var dom; - var fixture = document.getElementById('fixture'); + let rule; + let dom; + const fixture = document.getElementById('fixture'); beforeEach(function () { rule = axe.utils.getRule('html-xml-lang-mismatch'); @@ -17,33 +17,33 @@ describe('xml-lang-mismatch-matches', function () { }); it('is a function', function () { - var actual = rule.matches; + const actual = rule.matches; assert.isFunction(actual); }); it('returns false if the element does not contain lang or xml:lang attribute', function () { - var actual = rule.matches(dom); + const actual = rule.matches(dom); assert.isFalse(actual); }); it('returns false if the element contains either/ only one of the lang or xml:lang attribute', function () { dom.setAttribute('lang', 'nl'); - var actual = rule.matches(dom); + const actual = rule.matches(dom); assert.isFalse(actual); }); it('returns true if the element contains both lang and xml:lang attribute', function () { dom.setAttribute('lang', 'en'); dom.setAttribute('xml:lang', 'nl'); - var actual = rule.matches(dom); + const actual = rule.matches(dom); assert.isTrue(actual); }); it('returns false for element of type that is not HTML', function () { - var node = document.createElement('svg'); + const node = document.createElement('svg'); node.setAttribute('lang', ''); node.setAttribute('xml:lang', 'nl'); - var actual = rule.matches(node); + const actual = rule.matches(node); assert.isFalse(actual); }); }); diff --git a/test/rule-matches/identical-links-same-purpose-matches.js b/test/rule-matches/identical-links-same-purpose-matches.js index 9aa044bd0..7e130d8c8 100644 --- a/test/rule-matches/identical-links-same-purpose-matches.js +++ b/test/rule-matches/identical-links-same-purpose-matches.js @@ -1,9 +1,9 @@ describe('identical-links-same-purpose-matches tests', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var queryFixture = axe.testUtils.queryFixture; - var rule = axe.utils.getRule('identical-links-same-purpose'); + const fixture = document.getElementById('fixture'); + const queryFixture = axe.testUtils.queryFixture; + const rule = axe.utils.getRule('identical-links-same-purpose'); afterEach(function () { fixture.innerHTML = ''; @@ -11,79 +11,81 @@ describe('identical-links-same-purpose-matches tests', function () { }); it('returns false when native link without accessible name', function () { - var vNode = queryFixture(''); - var actual = rule.matches(vNode.actualNode, vNode); + const vNode = queryFixture(''); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for ARIA link without accessible name', function () { - var vNode = queryFixture(''); - var actual = rule.matches(vNode.actualNode, vNode); + const vNode = queryFixture(''); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for native link with a role !== link', function () { - var vNode = queryFixture( + const vNode = queryFixture( 'Go to Checkout' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false when `area` has no parent `map` element', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false when `area` has parent `map` that is not referred by `img[usemap]`', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' + '' + '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns true when native link without href', function () { - var vNode = queryFixture('Book Now'); - var actual = rule.matches(vNode.actualNode, vNode); + const vNode = queryFixture('Book Now'); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true when ARIA link without href', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true when native link has an accessible name', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true for ARIA link has an accessible name', function () { - var vNode = queryFixture('Book Tour'); - var actual = rule.matches(vNode.actualNode, vNode); + const vNode = queryFixture( + 'Book Tour' + ); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true when `area` has parent `map` that is referred by `img`', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' + '' + '' + 'MDN infographic' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); }); diff --git a/test/rule-matches/inserted-into-focus-order-matches.js b/test/rule-matches/inserted-into-focus-order-matches.js index f9a56f3ed..ff7ec134f 100644 --- a/test/rule-matches/inserted-into-focus-order-matches.js +++ b/test/rule-matches/inserted-into-focus-order-matches.js @@ -1,9 +1,9 @@ describe('inserted-into-focus-order-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var flatTreeSetup = axe.testUtils.flatTreeSetup; - var rule; + const fixture = document.getElementById('fixture'); + const flatTreeSetup = axe.testUtils.flatTreeSetup; + let rule; beforeEach(function () { rule = axe.utils.getRule('focus-order-semantics'); @@ -16,35 +16,35 @@ describe('inserted-into-focus-order-matches', function () { it('should return true for a non-focusable element with tabindex > -1', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isTrue(rule.matches(node)); }); it('should return false for a non-focusable element with tabindex == -1', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); it('should return false for a native focusable element with tabindex > 0', function () { fixture.innerHTML = ''; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); it('should return false for a native focusable element with no tabindex', function () { fixture.innerHTML = ''; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); it('should return false for non-numeric tabindex value', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); }); diff --git a/test/rule-matches/is-initiator-matches.js b/test/rule-matches/is-initiator-matches.js index 8007f1f56..91199ed24 100644 --- a/test/rule-matches/is-initiator-matches.js +++ b/test/rule-matches/is-initiator-matches.js @@ -1,14 +1,14 @@ describe('is-initiator-matches', function () { 'use strict'; - var rule; + let rule; beforeEach(function () { rule = axe.utils.getRule('html-has-lang'); }); afterEach(function () { - var fixture = document.getElementById('fixture'); + const fixture = document.getElementById('fixture'); fixture.innerHTML = ''; }); diff --git a/test/rule-matches/is-visible-matches.js b/test/rule-matches/is-visible-matches.js index 847b796c2..b86098684 100644 --- a/test/rule-matches/is-visible-matches.js +++ b/test/rule-matches/is-visible-matches.js @@ -1,12 +1,12 @@ describe('is-visible-matches', function () { 'use strict'; - var isVisibleMatches = + let isVisibleMatches = axe._thisWillBeDeletedDoNotUse.base.metadataFunctionMap[ 'is-visible-matches' ]; - var fixture = document.getElementById('fixture'); - var fixtureSetup = axe.testUtils.fixtureSetup; + let fixture = document.getElementById('fixture'); + let fixtureSetup = axe.testUtils.fixtureSetup; it('returns true for visible elements', function () { fixtureSetup('

Hello world

'); diff --git a/test/rule-matches/label-content-name-mismatch-matches.js b/test/rule-matches/label-content-name-mismatch-matches.js index b47d2847d..7252a98e8 100644 --- a/test/rule-matches/label-content-name-mismatch-matches.js +++ b/test/rule-matches/label-content-name-mismatch-matches.js @@ -1,9 +1,9 @@ describe('label-content-name-mismatch-matches tests', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var queryFixture = axe.testUtils.queryFixture; - var rule = axe.utils.getRule('label-content-name-mismatch'); + const fixture = document.getElementById('fixture'); + const queryFixture = axe.testUtils.queryFixture; + const rule = axe.utils.getRule('label-content-name-mismatch'); afterEach(function () { fixture.innerHTML = ''; @@ -11,145 +11,145 @@ describe('label-content-name-mismatch-matches tests', function () { }); it('returns false if given element has no role', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false if element role is not supported with name from contents', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
20 %
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false if implicit element role is overridden to a role that does not support name from contents', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
Status message
' + '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false if element does not have accessible name attributes (`aria-label` or `aria-labelledby`)', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false if element has empty accessible name via `aria-label`', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns true if element has accessible name via `aria-label`', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true if element has accessible name via `aria-labelledby`', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
some content
' + '
Foo text
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns false if element has empty accessible name (`aria-labelledby`)', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
some content
' + '
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false if element has empty accessible name (`aria-labelledby`) because idref does not exist', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
some content
' + '
Right Label
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns true if element has accessible name (`aria-labelledby`) - multiple refs', function () { - var vNode = queryFixture( + const vNode = queryFixture( '
some content
' + '
Foo
' + '
Bar
' + '
Baz
' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns false for non-widget role', function () { - var vNode = queryFixture( + const vNode = queryFixture( 'Content Information' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for non-widget role that does support name from content', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for empty text content', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for non text content', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns false for hidden (non visible) text content', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isFalse(actual); }); it('returns true when visible text is combination of alphanumeric and emoji characters', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); it('returns true when visible text is combination of alphanumeric and punctuation characters', function () { - var vNode = queryFixture( + const vNode = queryFixture( '' ); - var actual = rule.matches(vNode.actualNode, vNode); + const actual = rule.matches(vNode.actualNode, vNode); assert.isTrue(actual); }); }); diff --git a/test/rule-matches/label-matches.js b/test/rule-matches/label-matches.js index 8dbdc304d..4e4058920 100644 --- a/test/rule-matches/label-matches.js +++ b/test/rule-matches/label-matches.js @@ -1,9 +1,9 @@ describe('label-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var queryFixture = axe.testUtils.queryFixture; - var rule; + const fixture = document.getElementById('fixture'); + const queryFixture = axe.testUtils.queryFixture; + let rule; beforeEach(function () { fixture.innerHTML = ''; @@ -11,25 +11,25 @@ describe('label-matches', function () { }); it('returns true for non-input elements', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); }); it('returns true for input elements without type', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); }); it('returns false for input buttons', function () { ['button', 'submit', 'image', 'reset'].forEach(function (type) { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isFalse(rule.matches(null, vNode)); }); }); it('returns false for input elements type=hidden', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isFalse(rule.matches(null, vNode)); }); @@ -37,7 +37,7 @@ describe('label-matches', function () { it('returns true for other input types', function () { ['text', 'password', 'url', 'range', 'date', 'checkbox', 'radio'].forEach( function (type) { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); } ); diff --git a/test/rule-matches/landmark-has-body-context.js b/test/rule-matches/landmark-has-body-context.js index 124ba3dc9..3afa72e0b 100644 --- a/test/rule-matches/landmark-has-body-context.js +++ b/test/rule-matches/landmark-has-body-context.js @@ -1,8 +1,8 @@ describe('landmark-has-body-context', function () { 'use strict'; - var fixtureSetup = axe.testUtils.fixtureSetup; - var rule; - var shadowSupport = axe.testUtils.shadowSupport.v1; + const fixtureSetup = axe.testUtils.fixtureSetup; + let rule; + const shadowSupport = axe.testUtils.shadowSupport.v1; beforeEach(function () { rule = axe.utils.getRule('landmark-banner-is-top-level'); @@ -11,21 +11,21 @@ describe('landmark-has-body-context', function () { it('returns true for elements with a role', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns true for elements not contained in a landmark', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); it('returns false for elements contained in a landmark', function () { fixtureSetup('
'); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); }); @@ -35,12 +35,12 @@ describe('landmark-has-body-context', function () { // Safari has a bug in 12.0 that throws an error when calling // attachShadow on
// @see https://bugs.webkit.org/show_bug.cgi?id=197726 - var article = document.createElement('article'); - var shadow = article.attachShadow({ mode: 'open' }); + const article = document.createElement('article'); + const shadow = article.attachShadow({ mode: 'open' }); shadow.innerHTML = '
'; fixtureSetup(article); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; assert.isFalse(rule.matches(vNode.actualNode, vNode)); } ); diff --git a/test/rule-matches/landmark-unique-matches.js b/test/rule-matches/landmark-unique-matches.js index 518763d95..cb3cef7bd 100644 --- a/test/rule-matches/landmark-unique-matches.js +++ b/test/rule-matches/landmark-unique-matches.js @@ -1,13 +1,13 @@ describe('landmark-unique-matches', function () { 'use strict'; - var rule; - var fixture; - var axeFixtureSetup; - var shadowSupport = axe.testUtils.shadowSupport.v1; - var sectioningContentElements = ['article', 'aside', 'nav', 'section']; - var excludedDescendantsForHeadersFooters = + let rule; + let fixture; + let axeFixtureSetup; + const shadowSupport = axe.testUtils.shadowSupport.v1; + const sectioningContentElements = ['article', 'aside', 'nav', 'section']; + const excludedDescendantsForHeadersFooters = sectioningContentElements.concat('main'); - var headerFooterElements = ['header', 'footer']; + const headerFooterElements = ['header', 'footer']; beforeEach(function () { fixture = document.getElementById('fixture'); @@ -17,30 +17,30 @@ describe('landmark-unique-matches', function () { it('should not match because not a landmark', function () { axeFixtureSetup('

some heading

'); - var node = fixture.querySelector('h1'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('h1'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); }); it('should pass because is a landmark', function () { axeFixtureSetup('
some banner
'); - var node = fixture.querySelector('div'); + const node = fixture.querySelector('div'); fixture.appendChild(node); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); }); it('should not match because landmark is hidden', function () { axeFixtureSetup('
some banner
'); - var node = fixture.querySelector('div'); + const node = fixture.querySelector('div'); node.style.display = 'none'; fixture.appendChild(node); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); }); describe('form and section elements must have accessible names to be matched', function () { - var sectionFormElements = ['section', 'form']; + const sectionFormElements = ['section', 'form']; sectionFormElements.forEach(function (elementType) { it( @@ -55,8 +55,8 @@ describe('landmark-unique-matches', function () { elementType + '>' ); - var node = fixture.querySelector(elementType); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector(elementType); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); } ); @@ -73,8 +73,8 @@ describe('landmark-unique-matches', function () { elementType + '>' ); - var node = fixture.querySelector(elementType); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector(elementType); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); } ); @@ -101,8 +101,8 @@ describe('landmark-unique-matches', function () { exclusionType + '>' ); - var node = fixture.querySelector(elementType); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector(elementType); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); } ); @@ -116,8 +116,8 @@ describe('landmark-unique-matches', function () { axeFixtureSetup( '<' + elementType + '>an element' ); - var node = fixture.querySelector(elementType); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector(elementType); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); } ); @@ -138,8 +138,8 @@ describe('landmark-unique-matches', function () { exclusionType + '>' ); - var node = fixture.querySelector('aside[data-test]'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('aside[data-test]'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isFalse(rule.matches(node, virtualNode)); } ); @@ -154,8 +154,8 @@ describe('landmark-unique-matches', function () { exclusionType + '>' ); - var node = fixture.querySelector('aside[data-test]'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('aside[data-test]'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); } ); @@ -163,26 +163,26 @@ describe('landmark-unique-matches', function () { it('should match because aside is not scoped to a sectioning content element', function () { axeFixtureSetup(''); - var node = fixture.querySelector('aside'); - var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); + const node = fixture.querySelector('aside'); + const virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); assert.isTrue(rule.matches(node, virtualNode)); }); }); if (shadowSupport) { it('return true for landmarks contained within shadow dom', function () { - var container = document.createElement('div'); - var shadow = container.attachShadow({ mode: 'open' }); + const container = document.createElement('div'); + const shadow = container.attachShadow({ mode: 'open' }); shadow.innerHTML = '
'; axeFixtureSetup(container); - var vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; + const vNode = axe.utils.querySelectorAll(axe._tree[0], 'footer')[0]; assert.isTrue(rule.matches(vNode.actualNode, vNode)); }); describe('header/footers should only match when not inside the excluded descendants within shadow dom', function () { - var container; - var shadow; + let container; + let shadow; beforeEach(function () { container = document.createElement('div'); @@ -210,7 +210,7 @@ describe('landmark-unique-matches', function () { '>'; axeFixtureSetup(container); - var virtualNode = axe.utils.querySelectorAll( + const virtualNode = axe.utils.querySelectorAll( axe._tree[0], elementType )[0]; @@ -227,7 +227,7 @@ describe('landmark-unique-matches', function () { shadow.innerHTML = '<' + elementType + '>an element'; axeFixtureSetup(container); - var virtualNode = axe.utils.querySelectorAll( + const virtualNode = axe.utils.querySelectorAll( axe._tree[0], elementType )[0]; @@ -238,8 +238,8 @@ describe('landmark-unique-matches', function () { }); describe('aside should match inside shadow dom unless it is both within sectioning content and has no accessible name', function () { - var container; - var shadow; + let container; + let shadow; beforeEach(function () { container = document.createElement('div'); @@ -260,7 +260,7 @@ describe('landmark-unique-matches', function () { '>'; axeFixtureSetup(container); - var virtualNode = axe.utils.querySelectorAll( + const virtualNode = axe.utils.querySelectorAll( axe._tree[0], 'aside[data-test]' )[0]; @@ -278,7 +278,7 @@ describe('landmark-unique-matches', function () { exclusionType + '>'; axeFixtureSetup(container); - var virtualNode = axe.utils.querySelectorAll( + const virtualNode = axe.utils.querySelectorAll( axe._tree[0], 'aside[data-test]' )[0]; @@ -290,7 +290,10 @@ describe('landmark-unique-matches', function () { it('should match because aside is not scoped to a sectioning content element', function () { shadow.innerHTML = ''; axeFixtureSetup(container); - var virtualNode = axe.utils.querySelectorAll(axe._tree[0], 'aside')[0]; + const virtualNode = axe.utils.querySelectorAll( + axe._tree[0], + 'aside' + )[0]; assert.isTrue(rule.matches(virtualNode.actualNode, virtualNode)); }); }); diff --git a/test/rule-matches/layout-table-matches.js b/test/rule-matches/layout-table-matches.js index cae2b1ff7..c86cb5ac3 100644 --- a/test/rule-matches/layout-table-matches.js +++ b/test/rule-matches/layout-table-matches.js @@ -1,9 +1,9 @@ describe('layout-table-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var flatTreeSetup = axe.testUtils.flatTreeSetup; - var rule; + const fixture = document.getElementById('fixture'); + const flatTreeSetup = axe.testUtils.flatTreeSetup; + let rule; beforeEach(function () { axe.configure({ @@ -26,7 +26,7 @@ describe('layout-table-matches', function () { it('should return false for data table', function () { fixture.innerHTML = '
Hello>
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); @@ -34,7 +34,7 @@ describe('layout-table-matches', function () { it('should return false if the table is focusable', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isFalse(rule.matches(node)); }); @@ -42,7 +42,7 @@ describe('layout-table-matches', function () { it('should return true if table has role=presentation', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isTrue(rule.matches(node)); }); @@ -50,7 +50,7 @@ describe('layout-table-matches', function () { it('should return true if table has role=none', function () { fixture.innerHTML = '
'; flatTreeSetup(fixture); - var node = fixture.firstChild; + const node = fixture.firstChild; assert.isTrue(rule.matches(node)); }); diff --git a/test/rule-matches/nested-interactive-matches.js b/test/rule-matches/nested-interactive-matches.js index c4bebe514..9c76d7082 100644 --- a/test/rule-matches/nested-interactive-matches.js +++ b/test/rule-matches/nested-interactive-matches.js @@ -1,7 +1,7 @@ describe('nested-interactive-matches', function () { - var fixture = document.querySelector('#fixture'); - var queryFixture = axe.testUtils.queryFixture; - var rule; + const fixture = document.querySelector('#fixture'); + const queryFixture = axe.testUtils.queryFixture; + let rule; beforeEach(function () { rule = axe.utils.getRule('nested-interactive'); @@ -12,22 +12,22 @@ describe('nested-interactive-matches', function () { }); it('should match if element has children presentational', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isTrue(rule.matches(null, vNode)); }); it('should match if aria element has children presentational', function () { - var vNode = queryFixture('
'); + const vNode = queryFixture('
'); assert.isTrue(rule.matches(null, vNode)); }); it('should not match if element does not have children presentational', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isFalse(rule.matches(null, vNode)); }); it('should not match if element has no role', function () { - var vNode = queryFixture(''); + const vNode = queryFixture(''); assert.isFalse(rule.matches(null, vNode)); }); }); diff --git a/test/rule-matches/no-autoplay-audio-matches.js b/test/rule-matches/no-autoplay-audio-matches.js index 1769e3e89..037582cbf 100644 --- a/test/rule-matches/no-autoplay-audio-matches.js +++ b/test/rule-matches/no-autoplay-audio-matches.js @@ -1,10 +1,10 @@ describe('no-autoplay-audio-matches', function () { 'use strict'; - var fixture = document.getElementById('fixture'); - var queryFixture = axe.testUtils.queryFixture; - var preloadOptions = { preload: { assets: ['media'] } }; - var rule; + const fixture = document.getElementById('fixture'); + const queryFixture = axe.testUtils.queryFixture; + const preloadOptions = { preload: { assets: ['media'] } }; + let rule; beforeEach(function () { rule = axe.utils.getRule('no-autoplay-audio'); @@ -15,37 +15,37 @@ describe('no-autoplay-audio-matches', function () { }); it('returns false for