diff --git a/.github/workflows/node-4+.yml b/.github/workflows/node-4+.yml index fba82fd3..17968fc2 100644 --- a/.github/workflows/node-4+.yml +++ b/.github/workflows/node-4+.yml @@ -25,6 +25,7 @@ jobs: matrix: node-version: ${{ fromJson(needs.matrix.outputs.latest) }} eslint: + - 10 - 9 - 8 - 7 @@ -33,6 +34,38 @@ jobs: - 4 - 3 exclude: + - node-version: 19 + eslint: 10 + - node-version: 18 + eslint: 10 + - node-version: 17 + eslint: 10 + - node-version: 16 + eslint: 10 + - node-version: 15 + eslint: 10 + - node-version: 14 + eslint: 10 + - node-version: 13 + eslint: 10 + - node-version: 12 + eslint: 10 + - node-version: 11 + eslint: 10 + - node-version: 10 + eslint: 10 + - node-version: 9 + eslint: 10 + - node-version: 8 + eslint: 10 + - node-version: 7 + eslint: 10 + - node-version: 6 + eslint: 10 + - node-version: 5 + eslint: 10 + - node-version: 4 + eslint: 10 - node-version: 16 eslint: 9 - node-version: 15 diff --git a/__tests__/__util__/RuleTester.js b/__tests__/__util__/RuleTester.js index a41dea76..80df99d9 100644 --- a/__tests__/__util__/RuleTester.js +++ b/__tests__/__util__/RuleTester.js @@ -1,23 +1,11 @@ import test from 'tape'; -import mockProperty from 'mock-property'; import { RuleTester } from 'eslint'; -const orig = RuleTester.prototype.run; -RuleTester.prototype.run = function (name, rule, tests) { - test(`RuleTester: ${name}`, (t) => { - t.teardown(mockProperty(RuleTester.describe, 't', { value: t })); - orig.call(this, name, rule, tests); - - t.end(); - }); -}; - RuleTester.describe = function (text, method) { - RuleTester.it.title = text; - const self = this; - RuleTester.describe.t.test(text, (t) => { - t.teardown(mockProperty(RuleTester.it, 't', { value: t })); - method.call(self); + test(`RuleTester: ${text}`, (t) => { + RuleTester.it.t = t; + RuleTester.it.title = text; + method.call(this); t.end(); }); }; diff --git a/__tests__/src/rules/accessible-emoji-test.js b/__tests__/src/rules/accessible-emoji-test.js index 120b3767..836382b6 100644 --- a/__tests__/src/rules/accessible-emoji-test.js +++ b/__tests__/src/rules/accessible-emoji-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: 'Emojis should be wrapped in , have role="img", and have an accessible description with aria-label or aria-labelledby.', - type: 'JSXOpeningElement', }; ruleTester.run('accessible-emoji', rule, { diff --git a/__tests__/src/rules/alt-text-test.js b/__tests__/src/rules/alt-text-test.js index 7c6bce9c..42bd5a0c 100644 --- a/__tests__/src/rules/alt-text-test.js +++ b/__tests__/src/rules/alt-text-test.js @@ -20,13 +20,11 @@ const ruleTester = new RuleTester(); const missingPropError = (type) => ({ message: `${type} elements must have an alt prop, either with meaningful text, or an empty string for decorative images.`, - type: 'JSXOpeningElement', }); const altValueError = (type) => ({ message: `Invalid alt value for ${type}. \ Use alt="" for presentational images.`, - type: 'JSXOpeningElement', }); const ariaLabelValueError = { @@ -38,7 +36,6 @@ const ariaLabelledbyValueError = { const preferAltError = () => ({ message: 'Prefer alt="" over a presentational role. First rule of aria is to not use aria if it can be achieved via native HTML.', - type: 'JSXOpeningElement', }); const objectError = { diff --git a/__tests__/src/rules/anchor-ambiguous-text-test.js b/__tests__/src/rules/anchor-ambiguous-text-test.js index f794d873..e8654d94 100644 --- a/__tests__/src/rules/anchor-ambiguous-text-test.js +++ b/__tests__/src/rules/anchor-ambiguous-text-test.js @@ -28,7 +28,6 @@ const DEFAULT_AMBIGUOUS_WORDS = [ const expectedErrorGenerator = (words) => ({ message: `Ambiguous text within anchor. Screen reader users rely on link text for context; the words "${words.join('", "')}" are ambiguous and do not provide enough context.`, - type: 'JSXOpeningElement', }); const expectedError = expectedErrorGenerator(DEFAULT_AMBIGUOUS_WORDS); diff --git a/__tests__/src/rules/anchor-has-content-test.js b/__tests__/src/rules/anchor-has-content-test.js index 346eea5c..f9bb2a33 100644 --- a/__tests__/src/rules/anchor-has-content-test.js +++ b/__tests__/src/rules/anchor-has-content-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: 'Anchors must have content and the content must be accessible by a screen reader.', - type: 'JSXOpeningElement', }; ruleTester.run('anchor-has-content', rule, { diff --git a/__tests__/src/rules/anchor-is-valid-test.js b/__tests__/src/rules/anchor-is-valid-test.js index 0e9352cb..e9e51262 100644 --- a/__tests__/src/rules/anchor-is-valid-test.js +++ b/__tests__/src/rules/anchor-is-valid-test.js @@ -26,15 +26,12 @@ const invalidHrefErrorMessage = 'The href attribute requires a valid value to be const preferButtonexpectedError = { message: preferButtonErrorMessage, - type: 'JSXOpeningElement', }; const noHrefexpectedError = { message: noHrefErrorMessage, - type: 'JSXOpeningElement', }; const invalidHrefexpectedError = { message: invalidHrefErrorMessage, - type: 'JSXOpeningElement', }; const components = [{ diff --git a/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js b/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js index 1ccb3170..ed763dd8 100644 --- a/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js +++ b/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: 'An element that manages focus with `aria-activedescendant` must have a tabindex', - type: 'JSXOpeningElement', }; ruleTester.run('aria-activedescendant-has-tabindex', rule, { diff --git a/__tests__/src/rules/aria-props-test.js b/__tests__/src/rules/aria-props-test.js index 77234733..a874e5d1 100644 --- a/__tests__/src/rules/aria-props-test.js +++ b/__tests__/src/rules/aria-props-test.js @@ -27,13 +27,11 @@ const errorMessage = (name) => { if (suggestions.length > 0) { return { - type: 'JSXAttribute', message: `${message} Did you mean to use ${suggestions}?`, }; } return { - type: 'JSXAttribute', message, }; }; diff --git a/__tests__/src/rules/aria-role-test.js b/__tests__/src/rules/aria-role-test.js index 7a9c3371..916bb396 100644 --- a/__tests__/src/rules/aria-role-test.js +++ b/__tests__/src/rules/aria-role-test.js @@ -21,7 +21,6 @@ const ruleTester = new RuleTester(); const errorMessage = { message: 'Elements with ARIA roles must use a valid, non-abstract ARIA role.', - type: 'JSXAttribute', }; const roleKeys = roles.keys(); diff --git a/__tests__/src/rules/aria-unsupported-elements-test.js b/__tests__/src/rules/aria-unsupported-elements-test.js index 0d51bb2d..b42ed923 100644 --- a/__tests__/src/rules/aria-unsupported-elements-test.js +++ b/__tests__/src/rules/aria-unsupported-elements-test.js @@ -23,7 +23,6 @@ const ruleTester = new RuleTester(); const errorMessage = (invalidProp) => ({ message: `This element does not support ARIA roles, states and properties. \ Try removing the prop '${invalidProp}'.`, - type: 'JSXOpeningElement', }); const domElements = dom.keys(); @@ -46,7 +45,6 @@ const ariaValidityTests = domElements.map((element) => { }; }).concat({ code: '', - errors: [errorMessage('aria-hidden')], }); // Generate invalid test cases. diff --git a/__tests__/src/rules/autocomplete-valid-test.js b/__tests__/src/rules/autocomplete-valid-test.js index 0fb058c3..2fa99b18 100644 --- a/__tests__/src/rules/autocomplete-valid-test.js +++ b/__tests__/src/rules/autocomplete-valid-test.js @@ -21,12 +21,6 @@ const ruleTester = new RuleTester(); const invalidAutocomplete = [{ message: axeFailMessage('autocomplete-valid'), - type: 'JSXOpeningElement', -}]; - -const inappropriateAutocomplete = [{ - message: axeFailMessage('autocomplete-appropriate'), - type: 'JSXOpeningElement', }]; const componentsSettings = { @@ -60,10 +54,10 @@ ruleTester.run('autocomplete-valid', rule, { // PASSED "autocomplete-appropriate" // see also: https://github.com/dequelabs/axe-core/issues/2912 - { code: ';', errors: inappropriateAutocomplete }, - { code: ';', errors: inappropriateAutocomplete }, - { code: ';', errors: inappropriateAutocomplete }, - { code: ';', errors: inappropriateAutocomplete, options: [{ inputComponents: ['Foo'] }] }, + { code: ';' }, + { code: ';' }, + { code: ';' }, + { code: ';', options: [{ inputComponents: ['Foo'] }] }, )).map(parserOptionsMapper), invalid: parsers.all([].concat( // FAILED "autocomplete-valid" diff --git a/__tests__/src/rules/click-events-have-key-events-test.js b/__tests__/src/rules/click-events-have-key-events-test.js index 0f69b7dd..ea11005a 100644 --- a/__tests__/src/rules/click-events-have-key-events-test.js +++ b/__tests__/src/rules/click-events-have-key-events-test.js @@ -22,7 +22,6 @@ const errorMessage = 'Visible, non-interactive elements with click handlers must const expectedError = { message: errorMessage, - type: 'JSXOpeningElement', }; ruleTester.run('click-events-have-key-events', rule, { diff --git a/__tests__/src/rules/control-has-associated-label-test.js b/__tests__/src/rules/control-has-associated-label-test.js index 7918e428..dca9cb37 100644 --- a/__tests__/src/rules/control-has-associated-label-test.js +++ b/__tests__/src/rules/control-has-associated-label-test.js @@ -24,7 +24,6 @@ const ruleName = 'jsx-a11y/control-has-associated-label'; const expectedError = { message: 'A control must be associated with a text label.', - type: 'JSXOpeningElement', }; const alwaysValid = [ diff --git a/__tests__/src/rules/heading-has-content-test.js b/__tests__/src/rules/heading-has-content-test.js index 32a9eb32..3e3c79e0 100644 --- a/__tests__/src/rules/heading-has-content-test.js +++ b/__tests__/src/rules/heading-has-content-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: 'Headings must have content and the content must be accessible by a screen reader.', - type: 'JSXOpeningElement', }; const components = [{ diff --git a/__tests__/src/rules/html-has-lang-test.js b/__tests__/src/rules/html-has-lang-test.js index 4230b749..e1325bff 100644 --- a/__tests__/src/rules/html-has-lang-test.js +++ b/__tests__/src/rules/html-has-lang-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: ' elements must have the lang prop.', - type: 'JSXOpeningElement', }; ruleTester.run('html-has-lang', rule, { @@ -31,7 +30,7 @@ ruleTester.run('html-has-lang', rule, { { code: '' }, { code: '' }, { code: '' }, - { code: '', errors: [expectedError], settings: { 'jsx-a11y': { components: { HTMLTop: 'html' } } } }, + { code: '', settings: { 'jsx-a11y': { components: { HTMLTop: 'html' } } } }, )).map(parserOptionsMapper), invalid: parsers.all([].concat( { code: '', errors: [expectedError] }, diff --git a/__tests__/src/rules/iframe-has-title-test.js b/__tests__/src/rules/iframe-has-title-test.js index 4a5e4188..8c0d43fa 100644 --- a/__tests__/src/rules/iframe-has-title-test.js +++ b/__tests__/src/rules/iframe-has-title-test.js @@ -20,7 +20,6 @@ const ruleTester = new RuleTester(); const expectedError = { message: '