void 0} onFocus={undefined} />;',
+ errors: [mouseOverError],
+ },
+ {
+ code: '
void 0} onBlur={undefined} />',
+ errors: [mouseOutError],
+ },
+ {
+ code: '
void 0} {...props} />',
+ errors: [mouseOverError],
+ },
+ {
+ code: '
void 0} {...props} />',
+ errors: [mouseOutError],
+ },
+ ].map(parserOptionsMapper),
+});
diff --git a/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js
new file mode 100644
index 0000000..ea2ee66
--- /dev/null
+++ b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js
@@ -0,0 +1,48 @@
+/* eslint-env jest */
+/**
+ * @fileoverview Enforce no accesskey attribute on element.
+ * @author Ethan Cohen
+ */
+
+// -----------------------------------------------------------------------------
+// Requirements
+// -----------------------------------------------------------------------------
+
+import { RuleTester } from 'eslint';
+import parserOptionsMapper from '../../__util__/parserOptionsMapper';
+import rule from '../../../src/rules/no-access-key';
+
+// -----------------------------------------------------------------------------
+// Tests
+// -----------------------------------------------------------------------------
+
+const ruleTester = new RuleTester();
+
+const expectedError = {
+ message: 'No access key attribute allowed. Inconsistencies between keyboard shortcuts and keyboard comments used by screenreader and keyboard only users create a11y complications.',
+ type: 'JSXOpeningElement',
+};
+
+ruleTester.run('no-access-key', rule, {
+ valid: [
+ { code: '
;' },
+ { code: '
' },
+ { code: '
' },
+ ].map(parserOptionsMapper),
+ invalid: [
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ {
+ code: '
',
+ errors: [expectedError],
+ },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ ].map(parserOptionsMapper),
+});
diff --git a/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js
new file mode 100644
index 0000000..7562862
--- /dev/null
+++ b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js
@@ -0,0 +1,51 @@
+/* eslint-env jest */
+/**
+ * @fileoverview Enforce autoFocus prop is not used.
+ * @author Ethan Cohen <@evcohen>
+ */
+
+// -----------------------------------------------------------------------------
+// Requirements
+// -----------------------------------------------------------------------------
+
+import { RuleTester } from 'eslint';
+import parserOptionsMapper from '../../__util__/parserOptionsMapper';
+import rule from '../../../src/rules/no-autofocus';
+
+// -----------------------------------------------------------------------------
+// Tests
+// -----------------------------------------------------------------------------
+
+const ruleTester = new RuleTester();
+
+const expectedError = {
+ message: 'The autoFocus prop should not be used, as it can reduce usability and accessibility for users.',
+ type: 'JSXAttribute',
+};
+
+const ignoreNonDOMSchema = [
+ {
+ ignoreNonDOM: true,
+ },
+];
+
+ruleTester.run('no-autofocus', rule, {
+ valid: [
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
' },
+ { code: '
', options: ignoreNonDOMSchema },
+ { code: '
', options: ignoreNonDOMSchema },
+ ].map(parserOptionsMapper),
+ invalid: [
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ ].map(parserOptionsMapper),
+});
diff --git a/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js
new file mode 100644
index 0000000..7ca6f51
--- /dev/null
+++ b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js
@@ -0,0 +1,42 @@
+/* eslint-env jest */
+/**
+ * @fileoverview Enforce distracting elements are not used.
+ * @author Ethan Cohen
+ */
+
+// -----------------------------------------------------------------------------
+// Requirements
+// -----------------------------------------------------------------------------
+
+import { RuleTester } from 'eslint';
+import parserOptionsMapper from '../../__util__/parserOptionsMapper';
+import rule from '../../../src/rules/no-distracting-elements';
+
+// -----------------------------------------------------------------------------
+// Tests
+// -----------------------------------------------------------------------------
+
+const ruleTester = new RuleTester();
+
+const expectedError = element => ({
+ message: `Do not use <${element}> elements as they can create visual accessibility issues and are deprecated.`,
+ type: 'JSXOpeningElement',
+});
+
+ruleTester.run('no-marquee', rule, {
+ valid: [
+ { code: '
;' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ ].map(parserOptionsMapper),
+ invalid: [
+ { code: '
', errors: [expectedError('marquee')] },
+ { code: '
', errors: [expectedError('marquee')] },
+ { code: '
', errors: [expectedError('marquee')] },
+ { code: '
', errors: [expectedError('blink')] },
+ { code: '
', errors: [expectedError('blink')] },
+ { code: '
', errors: [expectedError('blink')] },
+ ].map(parserOptionsMapper),
+});
diff --git a/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js
new file mode 100644
index 0000000..fc788da
--- /dev/null
+++ b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js
@@ -0,0 +1,389 @@
+/* eslint-env jest */
+/**
+ * @fileoverview Disallow inherently interactive elements to be assigned
+ * non-interactive roles.
+ * @author Jesse Beach
+ */
+
+// -----------------------------------------------------------------------------
+// Requirements
+// -----------------------------------------------------------------------------
+
+import { RuleTester } from 'eslint';
+import { configs } from '../../../src/index';
+import parserOptionsMapper from '../../__util__/parserOptionsMapper';
+import rule from '../../../src/rules/no-interactive-element-to-noninteractive-role';
+import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
+
+// -----------------------------------------------------------------------------
+// Tests
+// -----------------------------------------------------------------------------
+const ruleTester = new RuleTester();
+
+const errorMessage = 'Interactive elements should not be assigned non-interactive roles.';
+
+const expectedError = {
+ message: errorMessage,
+ type: 'JSXAttribute',
+};
+
+const ruleName = 'jsx-a11y/no-interactive-element-to-noninteractive-role';
+
+const alwaysValid = [
+ { code: '
' },
+ { code: '
' },
+ /* Interactive elements */
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ /* All flavors of input */
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ /* End all flavors of input */
+ { code: '
;' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
|
;' },
+ /* HTML elements with neither an interactive or non-interactive valence (static) */
+ { code: '
' },
+ { code: '
;' },
+ { code: '
' },
+ { code: '
' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
void 0} aria-hidden={false} role="button" />;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: ';' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: ';' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
| ;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ /* HTML elements attributed with an interactive role */
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ /* Presentation is a special case role that indicates intentional static semantics */
+ { code: '
;' },
+ /* HTML elements attributed with an abstract role */
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ /* HTML elements with an inherent, non-interactive role, assigned an
+ * interactive role. */
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
![]()
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
| ;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ /* HTML elements attributed with a non-interactive role */
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ { code: '
;' },
+ /* Namespaced roles are not checked */
+ { code: '
' },
+ { code: '
' },
+];
+
+const neverValid = [
+ /* Interactive elements */
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ /* All flavors of input */
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ /* End all flavors of input */
+ { code: '
;', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
|
;', errors: [expectedError] },
+ /* Interactive elements */
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ /* All flavors of input */
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ /* End all flavors of input */
+ { code: '
;', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
', errors: [expectedError] },
+ { code: '
|
;', errors: [expectedError] },
+];
+
+const recommendedOptions = (configs.recommended.rules[ruleName][1] || {});
+ruleTester.run(`${ruleName}:recommended`, rule, {
+ valid: [
+ ...alwaysValid,
+ { code: '
|
;' },
+ { code: '
;' },
+ ]
+ .map(ruleOptionsMapperFactory(recommendedOptions))
+ .map(parserOptionsMapper),
+ invalid: [
+ ...neverValid,
+ ]
+ .map(ruleOptionsMapperFactory(recommendedOptions))
+ .map(parserOptionsMapper),
+});
+
+ruleTester.run(`${ruleName}:strict`, rule, {
+ valid: [
+ ...alwaysValid,
+ ].map(parserOptionsMapper),
+ invalid: [
+ ...neverValid,
+ { code: '
|
;', errors: [expectedError] },
+ ].map(parserOptionsMapper),
+});
diff --git a/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js
new file mode 100644
index 0000000..10d5d54
--- /dev/null
+++ b/tic-tac-toe-app/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js
@@ -0,0 +1,465 @@
+/* eslint-env jest */
+/**
+ * @fileoverview Enforce non-interactive elements have no interactive handlers.
+ * @author Ethan Cohen
+ */
+
+// -----------------------------------------------------------------------------
+// Requirements
+// -----------------------------------------------------------------------------
+
+import { RuleTester } from 'eslint';
+import { configs } from '../../../src/index';
+import parserOptionsMapper from '../../__util__/parserOptionsMapper';
+import rule from '../../../src/rules/no-noninteractive-element-interactions';
+import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
+
+// -----------------------------------------------------------------------------
+// Tests
+// -----------------------------------------------------------------------------
+
+const ruleTester = new RuleTester();
+
+const errorMessage = 'Non-interactive elements should not be assigned mouse or keyboard event listeners.';
+
+const expectedError = {
+ message: errorMessage,
+ type: 'JSXOpeningElement',
+};
+
+const ruleName = 'no-noninteractive-element-interactions';
+
+const alwaysValid = [
+ { code: '
' },
+ { code: '
' },
+ /* All flavors of input */
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ { code: '
void 0} />' },
+ /* End all flavors of input */
+ { code: '
void 0} />' },
+ { code: ' {}} />;' },
+ { code: ' void 0} />' },
+ { code: ' void 0} href="http://x.y.z" />' },
+ { code: ' void 0} href="http://x.y.z" tabIndex="0" />' },
+ { code: ' {}} />;' },
+ { code: '