axe-core 4.2.4 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -2
- package/README.md +24 -2
- package/axe.d.ts +60 -4
- package/axe.js +1198 -830
- package/axe.min.js +2 -2
- package/locales/de.json +1 -1
- package/locales/pt_BR.json +163 -44
- package/package.json +7 -1
- package/.eslintrc.js +0 -112
- package/.prettierrc.json +0 -10
- package/CONTRIBUTING.md +0 -242
- package/bower.json +0 -40
- package/doc/API.md +0 -963
- package/doc/accessibility-supported.md +0 -37
- package/doc/act-rules-format.md +0 -37
- package/doc/aria-supported.md +0 -13
- package/doc/backwards-compatibility-doc.md +0 -94
- package/doc/check-message-template.md +0 -124
- package/doc/check-options.md +0 -437
- package/doc/code-submission-guidelines.md +0 -171
- package/doc/developer-guide.md +0 -515
- package/doc/examples/chrome-debugging-protocol/README.md +0 -13
- package/doc/examples/chrome-debugging-protocol/axe-cdp.js +0 -81
- package/doc/examples/chrome-debugging-protocol/package.json +0 -11
- package/doc/examples/html-handlebars.md +0 -164
- package/doc/examples/jasmine/README.md +0 -35
- package/doc/examples/jasmine/karma.conf.js +0 -29
- package/doc/examples/jasmine/package-lock.json +0 -1489
- package/doc/examples/jasmine/package.json +0 -21
- package/doc/examples/jasmine/spec/a11y.js +0 -36
- package/doc/examples/jest_react/README.md +0 -41
- package/doc/examples/jest_react/link.js +0 -7
- package/doc/examples/jest_react/link.test.js +0 -24
- package/doc/examples/jest_react/package-lock.json +0 -7525
- package/doc/examples/jest_react/package.json +0 -28
- package/doc/examples/jest_react/test-helpers.js +0 -21
- package/doc/examples/jsdom/package.json +0 -15
- package/doc/examples/mocha/README.md +0 -35
- package/doc/examples/mocha/karma.conf.js +0 -29
- package/doc/examples/mocha/package-lock.json +0 -1671
- package/doc/examples/mocha/package.json +0 -22
- package/doc/examples/phantomjs/README.md +0 -17
- package/doc/examples/phantomjs/axe-phantom.js +0 -53
- package/doc/examples/phantomjs/package-lock.json +0 -862
- package/doc/examples/phantomjs/package.json +0 -19
- package/doc/examples/puppeteer/README.md +0 -12
- package/doc/examples/puppeteer/axe-puppeteer.js +0 -60
- package/doc/examples/puppeteer/package.json +0 -13
- package/doc/examples/qunit/README.md +0 -37
- package/doc/examples/qunit/package-lock.json +0 -2951
- package/doc/examples/qunit/package.json +0 -21
- package/doc/examples/test-examples.js +0 -40
- package/doc/frame-messenger.md +0 -107
- package/doc/plugins.md +0 -123
- package/doc/projects.md +0 -56
- package/doc/rule-descriptions.md +0 -135
- package/doc/rule-development.md +0 -123
- package/doc/rule-proposal.md +0 -106
- package/doc/standards-object.md +0 -147
- package/lib/checks/aria/abstractrole-evaluate.js +0 -40
- package/lib/checks/aria/abstractrole.json +0 -14
- package/lib/checks/aria/aria-allowed-attr-evaluate.js +0 -58
- package/lib/checks/aria/aria-allowed-attr.json +0 -14
- package/lib/checks/aria/aria-allowed-role-evaluate.js +0 -42
- package/lib/checks/aria/aria-allowed-role.json +0 -22
- package/lib/checks/aria/aria-errormessage-evaluate.js +0 -68
- package/lib/checks/aria/aria-errormessage.json +0 -18
- package/lib/checks/aria/aria-hidden-body-evaluate.js +0 -11
- package/lib/checks/aria/aria-hidden-body.json +0 -11
- package/lib/checks/aria/aria-prohibited-attr-evaluate.js +0 -68
- package/lib/checks/aria/aria-prohibited-attr.json +0 -15
- package/lib/checks/aria/aria-required-attr-evaluate.js +0 -67
- package/lib/checks/aria/aria-required-attr.json +0 -14
- package/lib/checks/aria/aria-required-children-evaluate.js +0 -137
- package/lib/checks/aria/aria-required-children.json +0 -32
- package/lib/checks/aria/aria-required-parent-evaluate.js +0 -120
- package/lib/checks/aria/aria-required-parent.json +0 -17
- package/lib/checks/aria/aria-roledescription-evaluate.js +0 -25
- package/lib/checks/aria/aria-roledescription.json +0 -23
- package/lib/checks/aria/aria-unsupported-attr-evaluate.js +0 -53
- package/lib/checks/aria/aria-unsupported-attr.json +0 -11
- package/lib/checks/aria/aria-valid-attr-evaluate.js +0 -51
- package/lib/checks/aria/aria-valid-attr-value-evaluate.js +0 -122
- package/lib/checks/aria/aria-valid-attr-value.json +0 -19
- package/lib/checks/aria/aria-valid-attr.json +0 -15
- package/lib/checks/aria/fallbackrole-evaluate.js +0 -13
- package/lib/checks/aria/fallbackrole.json +0 -11
- package/lib/checks/aria/has-global-aria-attribute-evaluate.js +0 -11
- package/lib/checks/aria/has-global-aria-attribute.json +0 -14
- package/lib/checks/aria/has-widget-role-evaluate.js +0 -20
- package/lib/checks/aria/has-widget-role.json +0 -12
- package/lib/checks/aria/invalidrole-evaluate.js +0 -45
- package/lib/checks/aria/invalidrole.json +0 -14
- package/lib/checks/aria/is-element-focusable-evaluate.js +0 -7
- package/lib/checks/aria/is-element-focusable.json +0 -11
- package/lib/checks/aria/no-implicit-explicit-label-evaluate.js +0 -54
- package/lib/checks/aria/no-implicit-explicit-label.json +0 -11
- package/lib/checks/aria/unsupportedrole-evaluate.js +0 -15
- package/lib/checks/aria/unsupportedrole.json +0 -11
- package/lib/checks/aria/valid-scrollable-semantics-evaluate.js +0 -70
- package/lib/checks/aria/valid-scrollable-semantics.json +0 -14
- package/lib/checks/color/color-contrast-evaluate.js +0 -178
- package/lib/checks/color/color-contrast.json +0 -42
- package/lib/checks/color/link-in-text-block-evaluate.js +0 -94
- package/lib/checks/color/link-in-text-block.json +0 -19
- package/lib/checks/forms/autocomplete-appropriate-evaluate.js +0 -84
- package/lib/checks/forms/autocomplete-appropriate.json +0 -11
- package/lib/checks/forms/autocomplete-valid-evaluate.js +0 -8
- package/lib/checks/forms/autocomplete-valid.json +0 -11
- package/lib/checks/generic/README.md +0 -13
- package/lib/checks/generic/attr-non-space-content-evaluate.js +0 -28
- package/lib/checks/generic/has-descendant-after.js +0 -15
- package/lib/checks/generic/has-descendant-evaluate.js +0 -20
- package/lib/checks/generic/has-text-content-evaluate.js +0 -11
- package/lib/checks/generic/matches-definition-evaluate.js +0 -7
- package/lib/checks/generic/page-no-duplicate-after.js +0 -6
- package/lib/checks/generic/page-no-duplicate-evaluate.js +0 -42
- package/lib/checks/index.js +0 -11
- package/lib/checks/keyboard/accesskeys-after.js +0 -23
- package/lib/checks/keyboard/accesskeys-evaluate.js +0 -11
- package/lib/checks/keyboard/accesskeys.json +0 -12
- package/lib/checks/keyboard/focusable-content-evaluate.js +0 -20
- package/lib/checks/keyboard/focusable-content.json +0 -11
- package/lib/checks/keyboard/focusable-disabled-evaluate.js +0 -36
- package/lib/checks/keyboard/focusable-disabled.json +0 -11
- package/lib/checks/keyboard/focusable-element-evaluate.js +0 -47
- package/lib/checks/keyboard/focusable-element.json +0 -11
- package/lib/checks/keyboard/focusable-modal-open-evaluate.js +0 -20
- package/lib/checks/keyboard/focusable-modal-open.json +0 -11
- package/lib/checks/keyboard/focusable-no-name-evaluate.js +0 -18
- package/lib/checks/keyboard/focusable-no-name.json +0 -12
- package/lib/checks/keyboard/focusable-not-tabbable-evaluate.js +0 -36
- package/lib/checks/keyboard/focusable-not-tabbable.json +0 -11
- package/lib/checks/keyboard/frame-focusable-content.json +0 -12
- package/lib/checks/keyboard/landmark-is-top-level-evaluate.js +0 -31
- package/lib/checks/keyboard/landmark-is-top-level.json +0 -11
- package/lib/checks/keyboard/no-focusable-content-evaluate.js +0 -35
- package/lib/checks/keyboard/no-focusable-content.json +0 -12
- package/lib/checks/keyboard/page-has-heading-one.json +0 -15
- package/lib/checks/keyboard/page-has-main.json +0 -15
- package/lib/checks/keyboard/page-no-duplicate-banner.json +0 -16
- package/lib/checks/keyboard/page-no-duplicate-contentinfo.json +0 -16
- package/lib/checks/keyboard/page-no-duplicate-main.json +0 -15
- package/lib/checks/keyboard/tabindex-evaluate.js +0 -10
- package/lib/checks/keyboard/tabindex.json +0 -11
- package/lib/checks/label/alt-space-value-evaluate.js +0 -7
- package/lib/checks/label/alt-space-value.json +0 -11
- package/lib/checks/label/duplicate-img-label-evaluate.js +0 -23
- package/lib/checks/label/duplicate-img-label.json +0 -14
- package/lib/checks/label/explicit-evaluate.js +0 -34
- package/lib/checks/label/explicit.json +0 -12
- package/lib/checks/label/help-same-as-label-evaluate.js +0 -28
- package/lib/checks/label/help-same-as-label.json +0 -12
- package/lib/checks/label/hidden-explicit-label-evaluate.js +0 -30
- package/lib/checks/label/hidden-explicit-label.json +0 -12
- package/lib/checks/label/implicit-evaluate.js +0 -16
- package/lib/checks/label/implicit.json +0 -12
- package/lib/checks/label/label-content-name-mismatch-evaluate.js +0 -71
- package/lib/checks/label/label-content-name-mismatch.json +0 -15
- package/lib/checks/label/multiple-label-evaluate.js +0 -44
- package/lib/checks/label/multiple-label.json +0 -11
- package/lib/checks/label/title-only-evaluate.js +0 -11
- package/lib/checks/label/title-only.json +0 -11
- package/lib/checks/landmarks/landmark-is-unique-after.js +0 -27
- package/lib/checks/landmarks/landmark-is-unique-evaluate.js +0 -14
- package/lib/checks/landmarks/landmark-is-unique.json +0 -12
- package/lib/checks/language/has-lang-evaluate.js +0 -39
- package/lib/checks/language/has-lang.json +0 -17
- package/lib/checks/language/valid-lang-evaluate.js +0 -36
- package/lib/checks/language/valid-lang.json +0 -14
- package/lib/checks/language/xml-lang-mismatch-evaluate.js +0 -10
- package/lib/checks/language/xml-lang-mismatch.json +0 -11
- package/lib/checks/lists/dlitem-evaluate.js +0 -30
- package/lib/checks/lists/dlitem.json +0 -11
- package/lib/checks/lists/listitem-evaluate.js +0 -28
- package/lib/checks/lists/listitem.json +0 -14
- package/lib/checks/lists/only-dlitems-evaluate.js +0 -51
- package/lib/checks/lists/only-dlitems.json +0 -11
- package/lib/checks/lists/only-listitems-evaluate.js +0 -63
- package/lib/checks/lists/only-listitems.json +0 -14
- package/lib/checks/lists/structured-dlitems-evaluate.js +0 -26
- package/lib/checks/lists/structured-dlitems.json +0 -11
- package/lib/checks/media/caption-evaluate.js +0 -13
- package/lib/checks/media/caption.json +0 -11
- package/lib/checks/media/frame-tested-after.js +0 -31
- package/lib/checks/media/frame-tested-evaluate.js +0 -6
- package/lib/checks/media/frame-tested.json +0 -16
- package/lib/checks/media/no-autoplay-audio-evaluate.js +0 -97
- package/lib/checks/media/no-autoplay-audio.json +0 -15
- package/lib/checks/mobile/css-orientation-lock-evaluate.js +0 -254
- package/lib/checks/mobile/css-orientation-lock.json +0 -15
- package/lib/checks/mobile/meta-viewport-large.json +0 -15
- package/lib/checks/mobile/meta-viewport-scale-evaluate.js +0 -71
- package/lib/checks/mobile/meta-viewport.json +0 -14
- package/lib/checks/navigation/header-present.json +0 -15
- package/lib/checks/navigation/heading-order-after.js +0 -132
- package/lib/checks/navigation/heading-order-evaluate.js +0 -58
- package/lib/checks/navigation/heading-order.json +0 -13
- package/lib/checks/navigation/identical-links-same-purpose-after.js +0 -106
- package/lib/checks/navigation/identical-links-same-purpose-evaluate.js +0 -35
- package/lib/checks/navigation/identical-links-same-purpose.json +0 -12
- package/lib/checks/navigation/internal-link-present-evaluate.js +0 -10
- package/lib/checks/navigation/internal-link-present.json +0 -11
- package/lib/checks/navigation/landmark.json +0 -14
- package/lib/checks/navigation/meta-refresh-evaluate.js +0 -8
- package/lib/checks/navigation/meta-refresh.json +0 -11
- package/lib/checks/navigation/p-as-heading-evaluate.js +0 -98
- package/lib/checks/navigation/p-as-heading.json +0 -30
- package/lib/checks/navigation/region-evaluate.js +0 -106
- package/lib/checks/navigation/region.json +0 -14
- package/lib/checks/navigation/skip-link-evaluate.js +0 -11
- package/lib/checks/navigation/skip-link.json +0 -12
- package/lib/checks/navigation/unique-frame-title-after.js +0 -13
- package/lib/checks/navigation/unique-frame-title-evaluate.js +0 -9
- package/lib/checks/navigation/unique-frame-title.json +0 -12
- package/lib/checks/parsing/duplicate-id-active.json +0 -12
- package/lib/checks/parsing/duplicate-id-after.js +0 -12
- package/lib/checks/parsing/duplicate-id-aria.json +0 -12
- package/lib/checks/parsing/duplicate-id-evaluate.js +0 -24
- package/lib/checks/parsing/duplicate-id.json +0 -12
- package/lib/checks/shared/aria-label-evaluate.js +0 -8
- package/lib/checks/shared/aria-label.json +0 -11
- package/lib/checks/shared/aria-labelledby-evaluate.js +0 -12
- package/lib/checks/shared/aria-labelledby.json +0 -12
- package/lib/checks/shared/avoid-inline-spacing-evaluate.js +0 -16
- package/lib/checks/shared/avoid-inline-spacing.json +0 -17
- package/lib/checks/shared/button-has-visible-text.json +0 -12
- package/lib/checks/shared/doc-has-title-evaluate.js +0 -8
- package/lib/checks/shared/doc-has-title.json +0 -11
- package/lib/checks/shared/exists-evaluate.js +0 -5
- package/lib/checks/shared/exists.json +0 -11
- package/lib/checks/shared/has-alt-evaluate.js +0 -10
- package/lib/checks/shared/has-alt.json +0 -11
- package/lib/checks/shared/has-visible-text.json +0 -12
- package/lib/checks/shared/is-on-screen-evaluate.js +0 -8
- package/lib/checks/shared/is-on-screen.json +0 -11
- package/lib/checks/shared/non-empty-alt.json +0 -17
- package/lib/checks/shared/non-empty-if-present-evaluate.js +0 -19
- package/lib/checks/shared/non-empty-if-present.json +0 -14
- package/lib/checks/shared/non-empty-placeholder.json +0 -17
- package/lib/checks/shared/non-empty-title.json +0 -17
- package/lib/checks/shared/non-empty-value.json +0 -17
- package/lib/checks/shared/presentational-role-evaluate.js +0 -42
- package/lib/checks/shared/presentational-role.json +0 -16
- package/lib/checks/shared/role-none.json +0 -19
- package/lib/checks/shared/role-presentation.json +0 -19
- package/lib/checks/shared/svg-non-empty-title-evaluate.js +0 -33
- package/lib/checks/shared/svg-non-empty-title.json +0 -15
- package/lib/checks/tables/caption-faked-evaluate.js +0 -16
- package/lib/checks/tables/caption-faked.json +0 -11
- package/lib/checks/tables/html5-scope-evaluate.js +0 -11
- package/lib/checks/tables/html5-scope.json +0 -11
- package/lib/checks/tables/same-caption-summary-evaluate.js +0 -12
- package/lib/checks/tables/same-caption-summary.json +0 -11
- package/lib/checks/tables/scope-value-evaluate.js +0 -7
- package/lib/checks/tables/scope-value.json +0 -14
- package/lib/checks/tables/td-has-header-evaluate.js +0 -33
- package/lib/checks/tables/td-has-header.json +0 -11
- package/lib/checks/tables/td-headers-attr-evaluate.js +0 -67
- package/lib/checks/tables/td-headers-attr.json +0 -12
- package/lib/checks/tables/th-has-data-cells-evaluate.js +0 -82
- package/lib/checks/tables/th-has-data-cells.json +0 -12
- package/lib/checks/visibility/hidden-content-evaluate.js +0 -34
- package/lib/checks/visibility/hidden-content.json +0 -12
- package/lib/commons/aria/allowed-attr.js +0 -31
- package/lib/commons/aria/arialabel-text.js +0 -21
- package/lib/commons/aria/arialabelledby-text.js +0 -65
- package/lib/commons/aria/get-accessible-refs.js +0 -73
- package/lib/commons/aria/get-element-unallowed-roles.js +0 -110
- package/lib/commons/aria/get-explicit-role.js +0 -26
- package/lib/commons/aria/get-owned-virtual.js +0 -27
- package/lib/commons/aria/get-role-type.js +0 -21
- package/lib/commons/aria/get-role.js +0 -178
- package/lib/commons/aria/get-roles-by-type.js +0 -16
- package/lib/commons/aria/get-roles-with-name-from-contents.js +0 -15
- package/lib/commons/aria/implicit-nodes.js +0 -23
- package/lib/commons/aria/implicit-role.js +0 -44
- package/lib/commons/aria/index.js +0 -32
- package/lib/commons/aria/is-accessible-ref.js +0 -12
- package/lib/commons/aria/is-aria-role-allowed-on-element.js +0 -32
- package/lib/commons/aria/is-unsupported-role.js +0 -16
- package/lib/commons/aria/is-valid-role.js +0 -22
- package/lib/commons/aria/label-virtual.js +0 -46
- package/lib/commons/aria/label.js +0 -17
- package/lib/commons/aria/lookup-table.js +0 -2435
- package/lib/commons/aria/named-from-contents.js +0 -39
- package/lib/commons/aria/required-attr.js +0 -21
- package/lib/commons/aria/required-context.js +0 -21
- package/lib/commons/aria/required-owned.js +0 -21
- package/lib/commons/aria/validate-attr-value.js +0 -70
- package/lib/commons/aria/validate-attr.js +0 -16
- package/lib/commons/color/center-point-of-rect.js +0 -31
- package/lib/commons/color/color.js +0 -250
- package/lib/commons/color/element-has-image.js +0 -35
- package/lib/commons/color/element-is-distinct.js +0 -87
- package/lib/commons/color/filtered-rect-stack.js +0 -51
- package/lib/commons/color/flatten-colors.js +0 -22
- package/lib/commons/color/get-background-color.js +0 -84
- package/lib/commons/color/get-background-stack.js +0 -130
- package/lib/commons/color/get-contrast.js +0 -27
- package/lib/commons/color/get-foreground-color.js +0 -69
- package/lib/commons/color/get-own-background-color.js +0 -24
- package/lib/commons/color/get-rect-stack.js +0 -32
- package/lib/commons/color/get-text-shadow-colors.js +0 -121
- package/lib/commons/color/has-valid-contrast-ratio.js +0 -30
- package/lib/commons/color/incomplete-data.js +0 -47
- package/lib/commons/color/index.js +0 -20
- package/lib/commons/dom/find-elms-in-context.js +0 -31
- package/lib/commons/dom/find-up-virtual.js +0 -52
- package/lib/commons/dom/find-up.js +0 -20
- package/lib/commons/dom/focus-disabled.js +0 -30
- package/lib/commons/dom/get-composed-parent.js +0 -26
- package/lib/commons/dom/get-element-by-reference.js +0 -34
- package/lib/commons/dom/get-element-coordinates.js +0 -38
- package/lib/commons/dom/get-element-stack.js +0 -28
- package/lib/commons/dom/get-rect-stack.js +0 -514
- package/lib/commons/dom/get-root-node.js +0 -12
- package/lib/commons/dom/get-scroll-offset.js +0 -32
- package/lib/commons/dom/get-tabbable-elements.js +0 -26
- package/lib/commons/dom/get-text-element-stack.js +0 -89
- package/lib/commons/dom/get-viewport-size.js +0 -35
- package/lib/commons/dom/has-content-virtual.js +0 -53
- package/lib/commons/dom/has-content.js +0 -21
- package/lib/commons/dom/idrefs.js +0 -41
- package/lib/commons/dom/index.js +0 -38
- package/lib/commons/dom/inserted-into-focus-order.js +0 -24
- package/lib/commons/dom/is-focusable.js +0 -36
- package/lib/commons/dom/is-hidden-with-css.js +0 -76
- package/lib/commons/dom/is-html5.js +0 -17
- package/lib/commons/dom/is-in-text-block.js +0 -107
- package/lib/commons/dom/is-modal-open.js +0 -104
- package/lib/commons/dom/is-natively-focusable.js +0 -41
- package/lib/commons/dom/is-node.js +0 -14
- package/lib/commons/dom/is-offscreen.js +0 -66
- package/lib/commons/dom/is-opaque.js +0 -16
- package/lib/commons/dom/is-skip-link.js +0 -49
- package/lib/commons/dom/is-visible.js +0 -201
- package/lib/commons/dom/is-visual-content.js +0 -49
- package/lib/commons/dom/reduce-to-elements-below-floating.js +0 -36
- package/lib/commons/dom/shadow-elements-from-point.js +0 -47
- package/lib/commons/dom/url-props-from-attribute.js +0 -152
- package/lib/commons/dom/visually-contains.js +0 -113
- package/lib/commons/dom/visually-overlaps.js +0 -46
- package/lib/commons/forms/index.js +0 -12
- package/lib/commons/forms/is-aria-combobox.js +0 -15
- package/lib/commons/forms/is-aria-listbox.js +0 -15
- package/lib/commons/forms/is-aria-range.js +0 -17
- package/lib/commons/forms/is-aria-textbox.js +0 -15
- package/lib/commons/forms/is-disabled.js +0 -40
- package/lib/commons/forms/is-native-select.js +0 -17
- package/lib/commons/forms/is-native-textbox.js +0 -34
- package/lib/commons/index.js +0 -31
- package/lib/commons/matches/attributes.js +0 -32
- package/lib/commons/matches/condition.js +0 -20
- package/lib/commons/matches/explicit-role.js +0 -24
- package/lib/commons/matches/from-definition.js +0 -73
- package/lib/commons/matches/from-function.js +0 -40
- package/lib/commons/matches/from-primative.js +0 -44
- package/lib/commons/matches/implicit-role.js +0 -24
- package/lib/commons/matches/index.js +0 -29
- package/lib/commons/matches/matches.js +0 -39
- package/lib/commons/matches/node-name.js +0 -29
- package/lib/commons/matches/properties.js +0 -32
- package/lib/commons/matches/semantic-role.js +0 -24
- package/lib/commons/standards/get-aria-roles-by-type.js +0 -14
- package/lib/commons/standards/get-aria-roles-supporting-name-from-content.js +0 -22
- package/lib/commons/standards/get-element-spec.js +0 -54
- package/lib/commons/standards/get-elements-by-content-type.js +0 -30
- package/lib/commons/standards/get-global-aria-attrs.js +0 -22
- package/lib/commons/standards/implicit-html-roles.js +0 -186
- package/lib/commons/standards/index.js +0 -11
- package/lib/commons/table/get-all-cells.js +0 -28
- package/lib/commons/table/get-cell-position.js +0 -32
- package/lib/commons/table/get-headers.js +0 -102
- package/lib/commons/table/get-scope.js +0 -58
- package/lib/commons/table/index.js +0 -19
- package/lib/commons/table/is-column-header.js +0 -15
- package/lib/commons/table/is-data-cell.js +0 -24
- package/lib/commons/table/is-data-table.js +0 -195
- package/lib/commons/table/is-header.js +0 -26
- package/lib/commons/table/is-row-header.js +0 -15
- package/lib/commons/table/to-grid.js +0 -48
- package/lib/commons/table/traverse.js +0 -76
- package/lib/commons/text/accessible-text-virtual.js +0 -152
- package/lib/commons/text/accessible-text.js +0 -19
- package/lib/commons/text/form-control-value.js +0 -216
- package/lib/commons/text/has-unicode.js +0 -38
- package/lib/commons/text/index.js +0 -32
- package/lib/commons/text/is-human-interpretable.js +0 -54
- package/lib/commons/text/is-icon-ligature.js +0 -214
- package/lib/commons/text/is-valid-autocomplete.js +0 -118
- package/lib/commons/text/label-text.js +0 -70
- package/lib/commons/text/label-virtual.js +0 -50
- package/lib/commons/text/label.js +0 -19
- package/lib/commons/text/native-element-type.js +0 -101
- package/lib/commons/text/native-text-alternative.js +0 -46
- package/lib/commons/text/native-text-methods.js +0 -136
- package/lib/commons/text/remove-unicode.js +0 -38
- package/lib/commons/text/sanitize.js +0 -21
- package/lib/commons/text/subtree-text.js +0 -74
- package/lib/commons/text/title-text.js +0 -33
- package/lib/commons/text/unicode.js +0 -85
- package/lib/commons/text/unsupported.js +0 -5
- package/lib/commons/text/visible-text-nodes.js +0 -27
- package/lib/commons/text/visible-virtual.js +0 -46
- package/lib/commons/text/visible.js +0 -18
- package/lib/core/base/audit.js +0 -767
- package/lib/core/base/cache.js +0 -30
- package/lib/core/base/check-result.js +0 -31
- package/lib/core/base/check.js +0 -215
- package/lib/core/base/context.js +0 -280
- package/lib/core/base/metadata-function-map.js +0 -353
- package/lib/core/base/rule-result.js +0 -39
- package/lib/core/base/rule.js +0 -611
- package/lib/core/base/virtual-node/abstract-virtual-node.js +0 -43
- package/lib/core/base/virtual-node/serial-virtual-node.js +0 -117
- package/lib/core/base/virtual-node/virtual-node.js +0 -194
- package/lib/core/constants.js +0 -70
- package/lib/core/core.js +0 -91
- package/lib/core/imports/index.js +0 -39
- package/lib/core/index.js +0 -40
- package/lib/core/log.js +0 -13
- package/lib/core/public/cleanup.js +0 -51
- package/lib/core/public/configure.js +0 -134
- package/lib/core/public/frame-messenger.js +0 -5
- package/lib/core/public/get-rules.js +0 -29
- package/lib/core/public/load.js +0 -65
- package/lib/core/public/plugins.js +0 -39
- package/lib/core/public/reporter.js +0 -25
- package/lib/core/public/reset.js +0 -13
- package/lib/core/public/run-rules.js +0 -83
- package/lib/core/public/run-virtual-rule.js +0 -63
- package/lib/core/public/run.js +0 -186
- package/lib/core/public/setup.js +0 -20
- package/lib/core/public/teardown.js +0 -21
- package/lib/core/reporters/helpers/failure-summary.js +0 -33
- package/lib/core/reporters/helpers/get-environment-data.js +0 -39
- package/lib/core/reporters/helpers/incomplete-fallback-msg.js +0 -12
- package/lib/core/reporters/helpers/index.js +0 -21
- package/lib/core/reporters/helpers/process-aggregate.js +0 -110
- package/lib/core/reporters/na.js +0 -24
- package/lib/core/reporters/no-passes.js +0 -20
- package/lib/core/reporters/raw-env.js +0 -17
- package/lib/core/reporters/raw.js +0 -32
- package/lib/core/reporters/v1.js +0 -33
- package/lib/core/reporters/v2.js +0 -19
- package/lib/core/utils/aggregate-checks.js +0 -90
- package/lib/core/utils/aggregate-node-results.js +0 -65
- package/lib/core/utils/aggregate-result.js +0 -39
- package/lib/core/utils/aggregate.js +0 -21
- package/lib/core/utils/are-styles-set.js +0 -18
- package/lib/core/utils/assert.js +0 -12
- package/lib/core/utils/check-helper.js +0 -36
- package/lib/core/utils/clone.js +0 -28
- package/lib/core/utils/closest.js +0 -30
- package/lib/core/utils/collect-results-from-frames.js +0 -84
- package/lib/core/utils/contains.js +0 -46
- package/lib/core/utils/css-parser.js +0 -9
- package/lib/core/utils/deep-merge.js +0 -31
- package/lib/core/utils/dq-element.js +0 -131
- package/lib/core/utils/element-matches.js +0 -43
- package/lib/core/utils/escape-selector.js +0 -79
- package/lib/core/utils/extend-meta-data.js +0 -20
- package/lib/core/utils/filter-html-attrs.js +0 -75
- package/lib/core/utils/finalize-result.js +0 -28
- package/lib/core/utils/find-by.js +0 -16
- package/lib/core/utils/frame-messenger/assert-window.js +0 -21
- package/lib/core/utils/frame-messenger/channel-store.js +0 -23
- package/lib/core/utils/frame-messenger/create-responder.js +0 -15
- package/lib/core/utils/frame-messenger/message-handler.js +0 -72
- package/lib/core/utils/frame-messenger/message-id.js +0 -22
- package/lib/core/utils/frame-messenger/message-parser.js +0 -109
- package/lib/core/utils/frame-messenger/post-message.js +0 -54
- package/lib/core/utils/frame-messenger/process-error.js +0 -30
- package/lib/core/utils/frame-messenger.js +0 -40
- package/lib/core/utils/get-all-checks.js +0 -13
- package/lib/core/utils/get-ancestry.js +0 -31
- package/lib/core/utils/get-base-lang.js +0 -18
- package/lib/core/utils/get-check-message.js +0 -24
- package/lib/core/utils/get-check-option.js +0 -41
- package/lib/core/utils/get-flattened-tree.js +0 -151
- package/lib/core/utils/get-friendly-uri-end.js +0 -143
- package/lib/core/utils/get-node-attributes.js +0 -22
- package/lib/core/utils/get-node-from-tree.js +0 -14
- package/lib/core/utils/get-root-node.js +0 -17
- package/lib/core/utils/get-rule.js +0 -17
- package/lib/core/utils/get-scroll-state.js +0 -43
- package/lib/core/utils/get-scroll.js +0 -41
- package/lib/core/utils/get-selector.js +0 -395
- package/lib/core/utils/get-shadow-selector.js +0 -31
- package/lib/core/utils/get-standards.js +0 -6
- package/lib/core/utils/get-stylesheet-factory.js +0 -53
- package/lib/core/utils/get-xpath.js +0 -84
- package/lib/core/utils/index.js +0 -90
- package/lib/core/utils/inject-style.js +0 -33
- package/lib/core/utils/is-hidden.js +0 -55
- package/lib/core/utils/is-html-element.js +0 -137
- package/lib/core/utils/is-node-in-context.js +0 -46
- package/lib/core/utils/is-shadow-root.js +0 -40
- package/lib/core/utils/is-xhtml.js +0 -15
- package/lib/core/utils/matches.js +0 -263
- package/lib/core/utils/memoize.js +0 -22
- package/lib/core/utils/merge-results.js +0 -134
- package/lib/core/utils/node-sorter.js +0 -23
- package/lib/core/utils/parse-crossorigin-stylesheet.js +0 -66
- package/lib/core/utils/parse-sameorigin-stylesheet.js +0 -100
- package/lib/core/utils/parse-stylesheet.js +0 -75
- package/lib/core/utils/performance-timer.js +0 -126
- package/lib/core/utils/pollyfills.js +0 -347
- package/lib/core/utils/preload-cssom.js +0 -249
- package/lib/core/utils/preload-media.js +0 -70
- package/lib/core/utils/preload.js +0 -150
- package/lib/core/utils/process-message.js +0 -77
- package/lib/core/utils/publish-metadata.js +0 -109
- package/lib/core/utils/query-selector-all-filter.js +0 -104
- package/lib/core/utils/query-selector-all.js +0 -15
- package/lib/core/utils/queue.js +0 -137
- package/lib/core/utils/respondable.js +0 -108
- package/lib/core/utils/rule-should-run.js +0 -83
- package/lib/core/utils/select.js +0 -87
- package/lib/core/utils/send-command-to-frame.js +0 -65
- package/lib/core/utils/set-scroll-state.js +0 -21
- package/lib/core/utils/to-array.js +0 -10
- package/lib/core/utils/token-list.js +0 -15
- package/lib/core/utils/unique-array.js +0 -13
- package/lib/core/utils/uuid.js +0 -253
- package/lib/core/utils/valid-input-type.js +0 -35
- package/lib/core/utils/valid-langs.js +0 -105
- package/lib/intro.stub +0 -15
- package/lib/misc/any-failure-summary.json +0 -6
- package/lib/misc/incomplete-fallback.json +0 -3
- package/lib/misc/none-failure-summary.json +0 -6
- package/lib/outro.stub +0 -2
- package/lib/rules/accesskeys.json +0 -13
- package/lib/rules/area-alt.json +0 -22
- package/lib/rules/aria-allowed-attr-matches.js +0 -15
- package/lib/rules/aria-allowed-attr.json +0 -12
- package/lib/rules/aria-allowed-role-matches.js +0 -12
- package/lib/rules/aria-allowed-role.json +0 -14
- package/lib/rules/aria-command-name.json +0 -18
- package/lib/rules/aria-dialog-name.json +0 -13
- package/lib/rules/aria-has-attr-matches.js +0 -9
- package/lib/rules/aria-hidden-body.json +0 -14
- package/lib/rules/aria-hidden-focus-matches.js +0 -22
- package/lib/rules/aria-hidden-focus.json +0 -18
- package/lib/rules/aria-input-field-name.json +0 -13
- package/lib/rules/aria-meter-name.json +0 -13
- package/lib/rules/aria-progressbar-name.json +0 -13
- package/lib/rules/aria-required-attr.json +0 -12
- package/lib/rules/aria-required-children-matches.js +0 -8
- package/lib/rules/aria-required-children.json +0 -13
- package/lib/rules/aria-required-parent-matches.js +0 -8
- package/lib/rules/aria-required-parent.json +0 -13
- package/lib/rules/aria-roledescription.json +0 -12
- package/lib/rules/aria-roles.json +0 -13
- package/lib/rules/aria-text.json +0 -12
- package/lib/rules/aria-toggle-field-name.json +0 -18
- package/lib/rules/aria-tooltip-name.json +0 -18
- package/lib/rules/aria-treeitem-name.json +0 -18
- package/lib/rules/aria-valid-attr-value.json +0 -12
- package/lib/rules/aria-valid-attr.json +0 -12
- package/lib/rules/audio-caption.json +0 -20
- package/lib/rules/autocomplete-matches.js +0 -58
- package/lib/rules/autocomplete-valid.json +0 -12
- package/lib/rules/avoid-inline-spacing.json +0 -12
- package/lib/rules/blink.json +0 -19
- package/lib/rules/button-name.json +0 -26
- package/lib/rules/bypass-matches.js +0 -14
- package/lib/rules/bypass.json +0 -21
- package/lib/rules/color-contrast-matches.js +0 -156
- package/lib/rules/color-contrast.json +0 -13
- package/lib/rules/css-orientation-lock.json +0 -13
- package/lib/rules/data-table-large-matches.js +0 -17
- package/lib/rules/data-table-matches.js +0 -7
- package/lib/rules/definition-list.json +0 -13
- package/lib/rules/dlitem.json +0 -13
- package/lib/rules/document-title.json +0 -13
- package/lib/rules/duplicate-id-active-matches.js +0 -15
- package/lib/rules/duplicate-id-active.json +0 -14
- package/lib/rules/duplicate-id-aria-matches.js +0 -7
- package/lib/rules/duplicate-id-aria.json +0 -14
- package/lib/rules/duplicate-id-misc-matches.js +0 -17
- package/lib/rules/duplicate-id.json +0 -14
- package/lib/rules/empty-heading.json +0 -19
- package/lib/rules/empty-table-header.json +0 -13
- package/lib/rules/focus-order-semantics.json +0 -13
- package/lib/rules/form-field-multiple-labels.json +0 -13
- package/lib/rules/frame-focusable-content-matches.js +0 -9
- package/lib/rules/frame-focusable-content.json +0 -13
- package/lib/rules/frame-tested.json +0 -12
- package/lib/rules/frame-title-has-text-matches.js +0 -8
- package/lib/rules/frame-title-unique.json +0 -13
- package/lib/rules/frame-title.json +0 -24
- package/lib/rules/has-implicit-chromium-role-matches.js +0 -7
- package/lib/rules/heading-matches.js +0 -19
- package/lib/rules/heading-order.json +0 -13
- package/lib/rules/hidden-content.json +0 -13
- package/lib/rules/html-has-lang.json +0 -13
- package/lib/rules/html-lang-valid.json +0 -12
- package/lib/rules/html-namespace-matches.js +0 -7
- package/lib/rules/html-xml-lang-mismatch.json +0 -13
- package/lib/rules/identical-links-same-purpose-matches.js +0 -18
- package/lib/rules/identical-links-same-purpose.json +0 -14
- package/lib/rules/image-alt.json +0 -26
- package/lib/rules/img-redundant-alt.json +0 -12
- package/lib/rules/input-button-name.json +0 -26
- package/lib/rules/input-image-alt.json +0 -20
- package/lib/rules/inserted-into-focus-order-matches.js +0 -7
- package/lib/rules/is-initiator-matches.js +0 -5
- package/lib/rules/label-content-name-mismatch-matches.js +0 -52
- package/lib/rules/label-content-name-mismatch.json +0 -12
- package/lib/rules/label-matches.js +0 -15
- package/lib/rules/label-title-only.json +0 -13
- package/lib/rules/label.json +0 -29
- package/lib/rules/landmark-banner-is-top-level.json +0 -13
- package/lib/rules/landmark-complementary-is-top-level.json +0 -12
- package/lib/rules/landmark-contentinfo-is-top-level.json +0 -13
- package/lib/rules/landmark-has-body-context-matches.js +0 -13
- package/lib/rules/landmark-main-is-top-level.json +0 -12
- package/lib/rules/landmark-no-duplicate-banner.json +0 -12
- package/lib/rules/landmark-no-duplicate-contentinfo.json +0 -12
- package/lib/rules/landmark-no-duplicate-main.json +0 -12
- package/lib/rules/landmark-one-main.json +0 -12
- package/lib/rules/landmark-unique-matches.js +0 -50
- package/lib/rules/landmark-unique.json +0 -13
- package/lib/rules/layout-table-matches.js +0 -8
- package/lib/rules/link-in-text-block-matches.js +0 -21
- package/lib/rules/link-in-text-block.json +0 -14
- package/lib/rules/link-name.json +0 -25
- package/lib/rules/list.json +0 -13
- package/lib/rules/listitem.json +0 -13
- package/lib/rules/marquee.json +0 -13
- package/lib/rules/meta-refresh.json +0 -20
- package/lib/rules/meta-viewport-large.json +0 -14
- package/lib/rules/meta-viewport.json +0 -14
- package/lib/rules/nested-interactive-matches.js +0 -13
- package/lib/rules/nested-interactive.json +0 -12
- package/lib/rules/no-autoplay-audio-matches.js +0 -22
- package/lib/rules/no-autoplay-audio.json +0 -15
- package/lib/rules/no-empty-role-matches.js +0 -13
- package/lib/rules/no-explicit-name-required-matches.js +0 -22
- package/lib/rules/no-naming-method-matches.js +0 -24
- package/lib/rules/no-role-matches.js +0 -5
- package/lib/rules/not-html-matches.js +0 -5
- package/lib/rules/object-alt.json +0 -24
- package/lib/rules/p-as-heading-matches.js +0 -21
- package/lib/rules/p-as-heading.json +0 -13
- package/lib/rules/page-has-heading-one.json +0 -12
- package/lib/rules/presentation-role-conflict-matches.js +0 -7
- package/lib/rules/presentation-role-conflict.json +0 -13
- package/lib/rules/region.json +0 -12
- package/lib/rules/role-img-alt.json +0 -20
- package/lib/rules/scope-attr-valid.json +0 -12
- package/lib/rules/scrollable-region-focusable-matches.js +0 -75
- package/lib/rules/scrollable-region-focusable.json +0 -12
- package/lib/rules/select-name.json +0 -27
- package/lib/rules/server-side-image-map.json +0 -18
- package/lib/rules/skip-link-matches.js +0 -7
- package/lib/rules/skip-link.json +0 -13
- package/lib/rules/svg-img-alt.json +0 -25
- package/lib/rules/svg-namespace-matches.js +0 -18
- package/lib/rules/tabindex.json +0 -12
- package/lib/rules/table-duplicate-name.json +0 -12
- package/lib/rules/table-fake-caption.json +0 -20
- package/lib/rules/td-has-header.json +0 -20
- package/lib/rules/td-headers-attr.json +0 -12
- package/lib/rules/th-has-data-cells.json +0 -13
- package/lib/rules/valid-lang.json +0 -13
- package/lib/rules/video-caption.json +0 -19
- package/lib/rules/window-is-top-matches.js +0 -8
- package/lib/rules/xml-lang-mismatch-matches.js +0 -14
- package/lib/standards/aria-attrs.js +0 -209
- package/lib/standards/aria-roles.js +0 -835
- package/lib/standards/css-colors.js +0 -153
- package/lib/standards/dpub-roles.js +0 -219
- package/lib/standards/graphics-roles.js +0 -22
- package/lib/standards/html-elms.js +0 -933
- package/lib/standards/index.js +0 -37
- package/sri-history.json +0 -274
- package/typings/axe-core/axe-core-tests.js +0 -203
- package/typings/axe-core/axe-core-tests.ts +0 -233
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { matchesExpression, convertSelector } from './matches';
|
|
2
|
-
|
|
3
|
-
function createLocalVariables(vNodes, anyLevel, thisLevel, parentShadowId) {
|
|
4
|
-
const retVal = {
|
|
5
|
-
vNodes: vNodes.slice(),
|
|
6
|
-
anyLevel: anyLevel,
|
|
7
|
-
thisLevel: thisLevel,
|
|
8
|
-
parentShadowId: parentShadowId
|
|
9
|
-
};
|
|
10
|
-
retVal.vNodes.reverse();
|
|
11
|
-
return retVal;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function matchExpressions(domTree, expressions, filter) {
|
|
15
|
-
const stack = [];
|
|
16
|
-
const vNodes = Array.isArray(domTree) ? domTree : [domTree];
|
|
17
|
-
let currentLevel = createLocalVariables(
|
|
18
|
-
vNodes,
|
|
19
|
-
expressions,
|
|
20
|
-
[],
|
|
21
|
-
domTree[0].shadowId
|
|
22
|
-
);
|
|
23
|
-
const result = [];
|
|
24
|
-
|
|
25
|
-
while (currentLevel.vNodes.length) {
|
|
26
|
-
const vNode = currentLevel.vNodes.pop();
|
|
27
|
-
const childOnly = []; // we will add hierarchical '>' selectors here
|
|
28
|
-
const childAny = [];
|
|
29
|
-
const combined = currentLevel.anyLevel
|
|
30
|
-
.slice()
|
|
31
|
-
.concat(currentLevel.thisLevel);
|
|
32
|
-
let added = false;
|
|
33
|
-
// see if node matches
|
|
34
|
-
for (let i = 0; i < combined.length; i++) {
|
|
35
|
-
const exp = combined[i];
|
|
36
|
-
if (
|
|
37
|
-
(!exp[0].id || vNode.shadowId === currentLevel.parentShadowId) &&
|
|
38
|
-
matchesExpression(vNode, exp[0])
|
|
39
|
-
) {
|
|
40
|
-
if (exp.length === 1) {
|
|
41
|
-
if (!added && (!filter || filter(vNode))) {
|
|
42
|
-
result.push(vNode);
|
|
43
|
-
added = true;
|
|
44
|
-
}
|
|
45
|
-
} else {
|
|
46
|
-
const rest = exp.slice(1);
|
|
47
|
-
if ([' ', '>'].includes(rest[0].combinator) === false) {
|
|
48
|
-
throw new Error(
|
|
49
|
-
'axe.utils.querySelectorAll does not support the combinator: ' +
|
|
50
|
-
exp[1].combinator
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
if (rest[0].combinator === '>') {
|
|
54
|
-
// add the rest to the childOnly array
|
|
55
|
-
childOnly.push(rest);
|
|
56
|
-
} else {
|
|
57
|
-
// add the rest to the childAny array
|
|
58
|
-
childAny.push(rest);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (
|
|
63
|
-
(!exp[0].id || vNode.shadowId === currentLevel.parentShadowId) &&
|
|
64
|
-
currentLevel.anyLevel.includes(exp)
|
|
65
|
-
) {
|
|
66
|
-
childAny.push(exp);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (vNode.children && vNode.children.length) {
|
|
71
|
-
stack.push(currentLevel);
|
|
72
|
-
currentLevel = createLocalVariables(
|
|
73
|
-
vNode.children,
|
|
74
|
-
childAny,
|
|
75
|
-
childOnly,
|
|
76
|
-
vNode.shadowId
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
// check for "return"
|
|
80
|
-
while (!currentLevel.vNodes.length && stack.length) {
|
|
81
|
-
currentLevel = stack.pop();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* querySelectorAllFilter implements querySelectorAll on the virtual DOM with
|
|
89
|
-
* ability to filter the returned nodes using an optional supplied filter function
|
|
90
|
-
*
|
|
91
|
-
* @method querySelectorAllFilter
|
|
92
|
-
* @memberof axe.utils
|
|
93
|
-
* @param {NodeList} domTree flattened tree collection to search
|
|
94
|
-
* @param {String} selector String containing one or more CSS selectors separated by commas
|
|
95
|
-
* @param {Function} filter function (optional)
|
|
96
|
-
* @return {Array} Elements matched by any of the selectors and filtered by the filter function
|
|
97
|
-
*/
|
|
98
|
-
function querySelectorAllFilter(domTree, selector, filter) {
|
|
99
|
-
domTree = Array.isArray(domTree) ? domTree : [domTree];
|
|
100
|
-
const expressions = convertSelector(selector);
|
|
101
|
-
return matchExpressions(domTree, expressions, filter);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export default querySelectorAllFilter;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import querySelectorAllFilter from './query-selector-all-filter';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* querySelectorAll implementation that operates on the flattened tree (supports shadow DOM)
|
|
5
|
-
* @method querySelectorAll
|
|
6
|
-
* @memberof axe.utils
|
|
7
|
-
* @param {NodeList} domTree flattened tree collection to search
|
|
8
|
-
* @param {String} selector String containing one or more CSS selectors separated by commas
|
|
9
|
-
* @return {NodeList} Elements matched by any of the selectors
|
|
10
|
-
*/
|
|
11
|
-
export function querySelectorAll(domTree, selector) {
|
|
12
|
-
return querySelectorAllFilter(domTree, selector);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default querySelectorAll;
|
package/lib/core/utils/queue.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import log from '../log';
|
|
2
|
-
|
|
3
|
-
function noop() {}
|
|
4
|
-
function funcGuard(f) {
|
|
5
|
-
if (typeof f !== 'function') {
|
|
6
|
-
throw new TypeError('Queue methods require functions as arguments');
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Create an asynchronous "queue", list of functions to be invoked in parallel, but not necessarily returned in order
|
|
12
|
-
* @return {Queue} The newly generated "queue"
|
|
13
|
-
*/
|
|
14
|
-
function queue() {
|
|
15
|
-
var tasks = [];
|
|
16
|
-
var started = 0;
|
|
17
|
-
var remaining = 0; // number of tasks not yet finished
|
|
18
|
-
var completeQueue = noop;
|
|
19
|
-
var complete = false;
|
|
20
|
-
var err;
|
|
21
|
-
|
|
22
|
-
// By default, wait until the next tick,
|
|
23
|
-
// if no catch was set, throw to console.
|
|
24
|
-
var defaultFail = e => {
|
|
25
|
-
err = e;
|
|
26
|
-
setTimeout(() => {
|
|
27
|
-
if (err !== undefined && err !== null) {
|
|
28
|
-
log('Uncaught error (of queue)', err);
|
|
29
|
-
}
|
|
30
|
-
}, 1);
|
|
31
|
-
};
|
|
32
|
-
var failed = defaultFail;
|
|
33
|
-
|
|
34
|
-
function createResolve(i) {
|
|
35
|
-
return r => {
|
|
36
|
-
tasks[i] = r;
|
|
37
|
-
remaining -= 1;
|
|
38
|
-
if (!remaining && completeQueue !== noop) {
|
|
39
|
-
complete = true;
|
|
40
|
-
completeQueue(tasks);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function abort(msg) {
|
|
46
|
-
// reset tasks
|
|
47
|
-
completeQueue = noop;
|
|
48
|
-
|
|
49
|
-
// notify catch
|
|
50
|
-
failed(msg);
|
|
51
|
-
// return unfinished work
|
|
52
|
-
return tasks;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function pop() {
|
|
56
|
-
var length = tasks.length;
|
|
57
|
-
for (; started < length; started++) {
|
|
58
|
-
var task = tasks[started];
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
task.call(null, createResolve(started), abort);
|
|
62
|
-
} catch (e) {
|
|
63
|
-
abort(e);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
var q = {
|
|
69
|
-
/**
|
|
70
|
-
* Defer a function that may or may not run asynchronously.
|
|
71
|
-
*
|
|
72
|
-
* First parameter should be the function to execute with subsequent
|
|
73
|
-
* parameters being passed as arguments to that function
|
|
74
|
-
*/
|
|
75
|
-
defer(fn) {
|
|
76
|
-
if (typeof fn === 'object' && fn.then && fn.catch) {
|
|
77
|
-
var defer = fn;
|
|
78
|
-
fn = (resolve, reject) => {
|
|
79
|
-
defer.then(resolve).catch(reject);
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
funcGuard(fn);
|
|
83
|
-
if (err !== undefined) {
|
|
84
|
-
return;
|
|
85
|
-
} else if (complete) {
|
|
86
|
-
throw new Error('Queue already completed');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
tasks.push(fn);
|
|
90
|
-
++remaining;
|
|
91
|
-
pop();
|
|
92
|
-
return q;
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* The callback to execute once all "deferred" functions have completed. Will only be invoked once.
|
|
97
|
-
* @param {Function} f The callback, receives an array of the return/callbacked
|
|
98
|
-
* values of each of the "deferred" functions
|
|
99
|
-
*/
|
|
100
|
-
then(fn) {
|
|
101
|
-
funcGuard(fn);
|
|
102
|
-
if (completeQueue !== noop) {
|
|
103
|
-
throw new Error('queue `then` already set');
|
|
104
|
-
}
|
|
105
|
-
if (!err) {
|
|
106
|
-
completeQueue = fn;
|
|
107
|
-
if (!remaining) {
|
|
108
|
-
complete = true;
|
|
109
|
-
completeQueue(tasks);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return q;
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
catch: function(fn) {
|
|
116
|
-
funcGuard(fn);
|
|
117
|
-
if (failed !== defaultFail) {
|
|
118
|
-
throw new Error('queue `catch` already set');
|
|
119
|
-
}
|
|
120
|
-
if (!err) {
|
|
121
|
-
failed = fn;
|
|
122
|
-
} else {
|
|
123
|
-
fn(err);
|
|
124
|
-
err = null;
|
|
125
|
-
}
|
|
126
|
-
return q;
|
|
127
|
-
},
|
|
128
|
-
/**
|
|
129
|
-
* Abort the "queue" and prevent `then` function from firing
|
|
130
|
-
* @param {Function} fn The callback to execute; receives an array of the results which have completed
|
|
131
|
-
*/
|
|
132
|
-
abort: abort
|
|
133
|
-
};
|
|
134
|
-
return q;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export default queue;
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { v4 as createUuid } from './uuid';
|
|
2
|
-
import assert from './assert';
|
|
3
|
-
import { setDefaultFrameMessenger } from './frame-messenger';
|
|
4
|
-
|
|
5
|
-
let closeHandler;
|
|
6
|
-
let postMessage;
|
|
7
|
-
|
|
8
|
-
const topicHandlers = {};
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Post a message to a window who may or may not respond to it.
|
|
12
|
-
* @param {Window} win The window to post the message to
|
|
13
|
-
* @param {String} topic The topic of the message
|
|
14
|
-
* @param {Object} message The message content
|
|
15
|
-
* @param {Boolean} keepalive Whether to allow multiple responses - default is false
|
|
16
|
-
* @param {Function} replyHandler The function to invoke when/if the message is responded to
|
|
17
|
-
*/
|
|
18
|
-
export default function respondable(
|
|
19
|
-
win,
|
|
20
|
-
topic,
|
|
21
|
-
message,
|
|
22
|
-
keepalive,
|
|
23
|
-
replyHandler
|
|
24
|
-
) {
|
|
25
|
-
const data = {
|
|
26
|
-
topic,
|
|
27
|
-
message,
|
|
28
|
-
channelId: `${createUuid()}:${createUuid()}`,
|
|
29
|
-
keepalive
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
return postMessage(win, data, replyHandler);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Handle incoming window messages
|
|
37
|
-
* @param {Object} data
|
|
38
|
-
* @param {Function} responder
|
|
39
|
-
*/
|
|
40
|
-
function messageListener(data, responder) {
|
|
41
|
-
const { topic, message, keepalive } = data;
|
|
42
|
-
const topicHandler = topicHandlers[topic];
|
|
43
|
-
if (!topicHandler) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
topicHandler(message, keepalive, responder);
|
|
49
|
-
} catch (error) {
|
|
50
|
-
axe.log(error);
|
|
51
|
-
responder(error, keepalive);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Update how respondable communicates with iframes.
|
|
57
|
-
* @param {Function} frameHandler Object with open, post, and close functions
|
|
58
|
-
*/
|
|
59
|
-
respondable.updateMessenger = function updateMessenger({ open, post }) {
|
|
60
|
-
assert(typeof open === 'function', 'open callback must be a function');
|
|
61
|
-
assert(typeof post === 'function', 'post callback must be a function');
|
|
62
|
-
|
|
63
|
-
if (closeHandler) {
|
|
64
|
-
closeHandler();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
var close = open(messageListener);
|
|
68
|
-
|
|
69
|
-
if (close) {
|
|
70
|
-
assert(
|
|
71
|
-
typeof close === 'function',
|
|
72
|
-
'open callback must return a cleanup function'
|
|
73
|
-
);
|
|
74
|
-
closeHandler = close;
|
|
75
|
-
} else {
|
|
76
|
-
closeHandler = null;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
postMessage = post;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Subscribe to messages sent via the `respondable` module.
|
|
84
|
-
*
|
|
85
|
-
* Axe._load uses this to listen for messages from other frames
|
|
86
|
-
*
|
|
87
|
-
* @param {String} topic The topic to listen to
|
|
88
|
-
* @param {Function} topicHandler The function to invoke when a message is received
|
|
89
|
-
*/
|
|
90
|
-
respondable.subscribe = function subscribe(topic, topicHandler) {
|
|
91
|
-
assert(
|
|
92
|
-
typeof topicHandler === 'function',
|
|
93
|
-
'Subscriber callback must be a function'
|
|
94
|
-
);
|
|
95
|
-
assert(!topicHandlers[topic], `Topic ${topic} is already registered to.`);
|
|
96
|
-
|
|
97
|
-
topicHandlers[topic] = topicHandler;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* checks if the current context is inside a frame
|
|
102
|
-
* @return {Boolean}
|
|
103
|
-
*/
|
|
104
|
-
respondable.isInFrame = function isInFrame(win = window) {
|
|
105
|
-
return !!win.frameElement;
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
setDefaultFrameMessenger(respondable);
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Check if a rule matches the value of runOnly type=tag
|
|
3
|
-
* @private
|
|
4
|
-
* @param {object} rule
|
|
5
|
-
* @param {object} runOnly Value of runOnly with type=tags
|
|
6
|
-
* @return {bool}
|
|
7
|
-
*/
|
|
8
|
-
function matchTags(rule, runOnly) {
|
|
9
|
-
var include, exclude, matching;
|
|
10
|
-
var defaultExclude =
|
|
11
|
-
// TODO: es-modules_audit
|
|
12
|
-
axe._audit && axe._audit.tagExclude ? axe._audit.tagExclude : [];
|
|
13
|
-
|
|
14
|
-
// normalize include/exclude
|
|
15
|
-
if (runOnly.hasOwnProperty('include') || runOnly.hasOwnProperty('exclude')) {
|
|
16
|
-
// Wrap include and exclude if it's not already an array
|
|
17
|
-
include = runOnly.include || [];
|
|
18
|
-
include = Array.isArray(include) ? include : [include];
|
|
19
|
-
|
|
20
|
-
exclude = runOnly.exclude || [];
|
|
21
|
-
exclude = Array.isArray(exclude) ? exclude : [exclude];
|
|
22
|
-
// add defaults, unless mentioned in include
|
|
23
|
-
exclude = exclude.concat(
|
|
24
|
-
defaultExclude.filter(tag => {
|
|
25
|
-
return include.indexOf(tag) === -1;
|
|
26
|
-
})
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
// Otherwise, only use the include value, ignore exclude
|
|
30
|
-
} else {
|
|
31
|
-
include = Array.isArray(runOnly) ? runOnly : [runOnly];
|
|
32
|
-
// exclude the defaults not included
|
|
33
|
-
exclude = defaultExclude.filter(tag => {
|
|
34
|
-
return include.indexOf(tag) === -1;
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
matching = include.some(tag => {
|
|
39
|
-
return rule.tags.indexOf(tag) !== -1;
|
|
40
|
-
});
|
|
41
|
-
if (matching || (include.length === 0 && rule.enabled !== false)) {
|
|
42
|
-
return exclude.every(tag => {
|
|
43
|
-
return rule.tags.indexOf(tag) === -1;
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Determines whether a rule should run
|
|
52
|
-
* @param {Rule} rule The rule to test
|
|
53
|
-
* @param {Context} context The context of the Audit
|
|
54
|
-
* @param {Object} options Options object
|
|
55
|
-
* @return {Boolean}
|
|
56
|
-
*/
|
|
57
|
-
function ruleShouldRun(rule, context, options) {
|
|
58
|
-
var runOnly = options.runOnly || {};
|
|
59
|
-
var ruleOptions = (options.rules || {})[rule.id];
|
|
60
|
-
|
|
61
|
-
// Never run page level rules if the context is not on the page
|
|
62
|
-
if (rule.pageLevel && !context.page) {
|
|
63
|
-
return false;
|
|
64
|
-
|
|
65
|
-
// First, runOnly type rule overrides anything else
|
|
66
|
-
} else if (runOnly.type === 'rule') {
|
|
67
|
-
return runOnly.values.indexOf(rule.id) !== -1;
|
|
68
|
-
|
|
69
|
-
// Second, if options.rules[rule].enabled is set, it overrides all
|
|
70
|
-
} else if (ruleOptions && typeof ruleOptions.enabled === 'boolean') {
|
|
71
|
-
return ruleOptions.enabled;
|
|
72
|
-
|
|
73
|
-
// Third, if tags are set, look at those
|
|
74
|
-
} else if (runOnly.type === 'tag' && runOnly.values) {
|
|
75
|
-
return matchTags(rule, runOnly.values);
|
|
76
|
-
|
|
77
|
-
// If nothing is set, only check for default excludes
|
|
78
|
-
} else {
|
|
79
|
-
return matchTags(rule, []);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export default ruleShouldRun;
|
package/lib/core/utils/select.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import contains from './contains';
|
|
2
|
-
import querySelectorAllFilter from './query-selector-all-filter';
|
|
3
|
-
import isNodeInContext from './is-node-in-context';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Pushes unique nodes that are in context to an array
|
|
7
|
-
* @private
|
|
8
|
-
* @param {Array} result The array to push to
|
|
9
|
-
* @param {Array} nodes The list of nodes to push
|
|
10
|
-
* @param {Object} context The "resolved" context object, @see resolveContext
|
|
11
|
-
*/
|
|
12
|
-
function pushNode(result, nodes) {
|
|
13
|
-
let temp;
|
|
14
|
-
|
|
15
|
-
if (result.length === 0) {
|
|
16
|
-
return nodes;
|
|
17
|
-
}
|
|
18
|
-
if (result.length < nodes.length) {
|
|
19
|
-
// switch so the comparison is shortest
|
|
20
|
-
temp = result;
|
|
21
|
-
result = nodes;
|
|
22
|
-
nodes = temp;
|
|
23
|
-
}
|
|
24
|
-
for (let i = 0, l = nodes.length; i < l; i++) {
|
|
25
|
-
if (!result.includes(nodes[i])) {
|
|
26
|
-
result.push(nodes[i]);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* reduces the includes list to only the outermost includes
|
|
34
|
-
* @param {Array} the array of include nodes
|
|
35
|
-
* @return {Array} the modified array of nodes
|
|
36
|
-
*/
|
|
37
|
-
function reduceIncludes(includes) {
|
|
38
|
-
return includes.reduce((res, el) => {
|
|
39
|
-
if (!res.length || !contains(res[res.length - 1], el)) {
|
|
40
|
-
res.push(el);
|
|
41
|
-
}
|
|
42
|
-
return res;
|
|
43
|
-
}, []);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Selects elements which match `selector` that are included and excluded via the `Context` object
|
|
48
|
-
* @param {String} selector CSS selector of the HTMLElements to select
|
|
49
|
-
* @param {Context} context The "resolved" context object, @see Context
|
|
50
|
-
* @return {Array} Matching virtual DOM nodes sorted by DOM order
|
|
51
|
-
*/
|
|
52
|
-
function select(selector, context) {
|
|
53
|
-
let result = [];
|
|
54
|
-
let candidate;
|
|
55
|
-
if (axe._selectCache) {
|
|
56
|
-
// if used outside of run, it will still work
|
|
57
|
-
for (let j = 0, l = axe._selectCache.length; j < l; j++) {
|
|
58
|
-
// First see whether the item exists in the cache
|
|
59
|
-
const item = axe._selectCache[j];
|
|
60
|
-
if (item.selector === selector) {
|
|
61
|
-
return item.result;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const curried = (context => {
|
|
66
|
-
return node => {
|
|
67
|
-
return isNodeInContext(node, context);
|
|
68
|
-
};
|
|
69
|
-
})(context);
|
|
70
|
-
const reducedIncludes = reduceIncludes(context.include);
|
|
71
|
-
for (let i = 0; i < reducedIncludes.length; i++) {
|
|
72
|
-
candidate = reducedIncludes[i];
|
|
73
|
-
result = pushNode(
|
|
74
|
-
result,
|
|
75
|
-
querySelectorAllFilter(candidate, selector, curried)
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
if (axe._selectCache) {
|
|
79
|
-
axe._selectCache.push({
|
|
80
|
-
selector: selector,
|
|
81
|
-
result: result
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export default select;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import getSelector from './get-selector';
|
|
2
|
-
import respondable from './respondable';
|
|
3
|
-
import log from '../log';
|
|
4
|
-
|
|
5
|
-
function err(message, node) {
|
|
6
|
-
var selector;
|
|
7
|
-
// TODO: es-modules_tree
|
|
8
|
-
if (axe._tree) {
|
|
9
|
-
selector = getSelector(node);
|
|
10
|
-
}
|
|
11
|
-
return new Error(message + ': ' + (selector || node));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Sends a command to an instance of axe in the specified frame
|
|
16
|
-
* @param {Element} node The frame element to send the message to
|
|
17
|
-
* @param {Object} parameters Parameters to pass to the frame
|
|
18
|
-
* @param {Function} callback Function to call when results from the frame has returned
|
|
19
|
-
*/
|
|
20
|
-
function sendCommandToFrame(node, parameters, resolve, reject) {
|
|
21
|
-
var win = node.contentWindow;
|
|
22
|
-
if (!win) {
|
|
23
|
-
log('Frame does not have a content window', node);
|
|
24
|
-
resolve(null);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// give the frame .5s to respond to 'axe.ping', else log failed response
|
|
29
|
-
var timeout = setTimeout(() => {
|
|
30
|
-
// This double timeout is important for allowing iframes to respond
|
|
31
|
-
// DO NOT REMOVE
|
|
32
|
-
timeout = setTimeout(() => {
|
|
33
|
-
if (!parameters.debug) {
|
|
34
|
-
resolve(null);
|
|
35
|
-
} else {
|
|
36
|
-
reject(err('No response from frame', node));
|
|
37
|
-
}
|
|
38
|
-
}, 0);
|
|
39
|
-
}, parameters.options?.pingWaitTime ?? 500);
|
|
40
|
-
|
|
41
|
-
// send 'axe.ping' to the frame
|
|
42
|
-
respondable(win, 'axe.ping', null, undefined, () => {
|
|
43
|
-
clearTimeout(timeout);
|
|
44
|
-
|
|
45
|
-
// Give axe 60s (or user-supplied value) to respond to 'axe.start'
|
|
46
|
-
var frameWaitTime =
|
|
47
|
-
(parameters.options && parameters.options.frameWaitTime) || 60000;
|
|
48
|
-
|
|
49
|
-
timeout = setTimeout(function collectResultFramesTimeout() {
|
|
50
|
-
reject(err('Axe in frame timed out', node));
|
|
51
|
-
}, frameWaitTime);
|
|
52
|
-
|
|
53
|
-
// send 'axe.start' and send the callback if it responded
|
|
54
|
-
respondable(win, 'axe.start', parameters, undefined, data => {
|
|
55
|
-
clearTimeout(timeout);
|
|
56
|
-
if (data instanceof Error === false) {
|
|
57
|
-
resolve(data);
|
|
58
|
-
} else {
|
|
59
|
-
reject(data);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export default sendCommandToFrame;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* set the scroll position of an element
|
|
3
|
-
*/
|
|
4
|
-
function setScroll(elm, top, left) {
|
|
5
|
-
if (elm === window) {
|
|
6
|
-
return elm.scroll(left, top);
|
|
7
|
-
} else {
|
|
8
|
-
elm.scrollTop = top;
|
|
9
|
-
elm.scrollLeft = left;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* set the scroll position of all items in the scrollState array
|
|
15
|
-
* @deprecated
|
|
16
|
-
*/
|
|
17
|
-
export function setScrollState(scrollState) {
|
|
18
|
-
scrollState.forEach(({ elm, top, left }) => setScroll(elm, top, left));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export default setScrollState;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts array-like (numerical indicies and `length` property) structures to actual, real arrays
|
|
3
|
-
* @param {Mixed} thing Array-like thing to convert
|
|
4
|
-
* @return {Array}
|
|
5
|
-
*/
|
|
6
|
-
function toArray(thing) {
|
|
7
|
-
return Array.prototype.slice.call(thing);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export default toArray;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts space delimited token list to an Array
|
|
3
|
-
* @method tokenList
|
|
4
|
-
* @memberof axe.utils
|
|
5
|
-
* @param {String} str
|
|
6
|
-
* @return {Array}
|
|
7
|
-
*/
|
|
8
|
-
function tokenList(str) {
|
|
9
|
-
return (str || '')
|
|
10
|
-
.trim()
|
|
11
|
-
.replace(/\s{2,}/g, ' ')
|
|
12
|
-
.split(' ');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default tokenList;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates an array without duplicate values from 2 array inputs
|
|
3
|
-
* @param {Array} arr1 First array
|
|
4
|
-
* @param {Array} arr2 Second array
|
|
5
|
-
* @return {Array}
|
|
6
|
-
*/
|
|
7
|
-
function uniqueArray(arr1, arr2) {
|
|
8
|
-
return arr1.concat(arr2).filter((elem, pos, arr) => {
|
|
9
|
-
return arr.indexOf(elem) === pos;
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export default uniqueArray;
|