diff --git a/.gitignore b/.gitignore
index 75877581..0c6b94b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/.eslintcache
/.husky/
+/dist/
/node_modules/
diff --git a/.prettierignore b/.prettierignore
index 41d2a028..2dde3ffa 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,3 +4,4 @@
.prettierignore
LICENSE
yarn.lock
+dist
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 917e6d92..158aa907 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
### Changed
- Ensure directives that have identifiers for values are counted as present in the element.
+- Convert over to using TypeScript for development.
## [0.6.2] - 2021-05-26
diff --git a/bin/lint b/bin/lint
index aee16a0b..9d079b62 100755
--- a/bin/lint
+++ b/bin/lint
@@ -1,10 +1,10 @@
#!/usr/bin/env node
-const { CLIEngine } = require("eslint");
-const a11yPlugin = require("../src");
+const { ESLint } = require("eslint");
+const a11yPlugin = require("../dist");
(async function () {
- const cli = new CLIEngine({ baseConfig: a11yPlugin.configs.recommended });
+ const cli = new ESLint({ baseConfig: a11yPlugin.configs.recommended });
cli.addPlugin("eslint-plugin-vuejs-accessibility", a11yPlugin);
const report = cli.executeOnFiles(process.argv.slice(2));
diff --git a/jest.setup.js b/jest.setup.js
deleted file mode 100644
index 464f2bde..00000000
--- a/jest.setup.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const { RuleTester } = require("eslint");
-
-RuleTester.describe = (text, callback) => {
- RuleTester.it.title = text;
- return callback.call(this);
-};
-
-RuleTester.it = (text, callback) => {
- test(`${RuleTester.it.title}: ${text}`, callback);
-};
diff --git a/jest.setup.ts b/jest.setup.ts
new file mode 100644
index 00000000..f9b3e5a3
--- /dev/null
+++ b/jest.setup.ts
@@ -0,0 +1,17 @@
+import { RuleTester } from "eslint";
+
+interface JestRuleTester extends RuleTester {
+ describe: (text: string, callback: () => void) => void;
+ it: { title?: string } & ((text: string, callback: () => void) => void);
+}
+
+const ruleTester = RuleTester as unknown as JestRuleTester;
+
+ruleTester.describe = (text: string, callback: () => void) => {
+ ruleTester.it.title = text;
+ return callback.call(this);
+};
+
+ruleTester.it = (text: string, callback: () => void) => {
+ test(`${ruleTester.it.title}: ${text}`, callback);
+};
diff --git a/package.json b/package.json
index 29dc7296..c39326e3 100644
--- a/package.json
+++ b/package.json
@@ -2,9 +2,10 @@
"name": "eslint-plugin-vuejs-accessibility",
"version": "0.6.2",
"description": "An eslint plugin for checking Vue.js files for accessibility",
- "main": "src/index.js",
+ "main": "dist/src/index.js",
"scripts": {
"lint": "eslint --cache .",
+ "prepublishOnly": "tsc -p tsconfig.build.json",
"test": "jest"
},
"author": "Kevin Newton",
@@ -31,12 +32,20 @@
"vue-eslint-parser": "^7.0.0"
},
"devDependencies": {
+ "@types/aria-query": "^4.2.1",
+ "@types/eslint-scope": "^3.7.0",
+ "@types/eslint-visitor-keys": "^1.0.0",
+ "@types/jest": "^26.0.23",
+ "@typescript-eslint/eslint-plugin": "^4.26.0",
+ "@typescript-eslint/parser": "^4.26.0",
"eslint": "^7.3.1",
"eslint-plugin-eslint-plugin": "^3.0.0",
"husky": "^6.0.0",
"jest": "^27.0.1",
"prettier": "^2.1.1",
- "pretty-quick": "^3.0.0"
+ "pretty-quick": "^3.0.0",
+ "ts-jest": "^27.0.1",
+ "typescript": "^4.2.4"
},
"eslintConfig": {
"env": {
@@ -46,25 +55,33 @@
},
"extends": [
"eslint:recommended",
- "plugin:eslint-plugin/recommended"
+ "plugin:eslint-plugin/recommended",
+ "plugin:@typescript-eslint/recommended"
],
- "parserOptions": {
- "ecmaVersion": 2015
- },
+ "parser": "@typescript-eslint/parser",
"plugins": [
- "eslint-plugin"
- ]
+ "eslint-plugin",
+ "@typescript-eslint"
+ ],
+ "rules": {
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "@typescript-eslint/no-explicit-any": "off"
+ }
},
+ "eslintIgnore": [
+ "dist"
+ ],
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged"
}
},
"jest": {
+ "preset": "ts-jest",
"setupFilesAfterEnv": [
- "./jest.setup.js"
+ "./jest.setup.ts"
],
- "testRegex": ".test.js$"
+ "testRegex": ".test.ts$"
},
"prettier": {
"trailingComma": "none"
diff --git a/src/index.js b/src/index.ts
similarity index 99%
rename from src/index.js
rename to src/index.ts
index 61db9215..ee7939b1 100644
--- a/src/index.js
+++ b/src/index.ts
@@ -1,4 +1,4 @@
-module.exports = {
+export default {
rules: {
"accessible-emoji": require("./rules/accessible-emoji"),
"alt-text": require("./rules/alt-text"),
diff --git a/src/rules/__tests__/accessible-emoji.test.js b/src/rules/__tests__/accessible-emoji.test.ts
similarity index 82%
rename from src/rules/__tests__/accessible-emoji.test.js
rename to src/rules/__tests__/accessible-emoji.test.ts
index 09f1755d..c1ba9589 100644
--- a/src/rules/__tests__/accessible-emoji.test.js
+++ b/src/rules/__tests__/accessible-emoji.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../accessible-emoji");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../accessible-emoji";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("accessible-emoji", rule, {
valid: [
diff --git a/src/rules/__tests__/alt-text.test.js b/src/rules/__tests__/alt-text.test.ts
similarity index 91%
rename from src/rules/__tests__/alt-text.test.js
rename to src/rules/__tests__/alt-text.test.ts
index c84fcb77..ba8b3674 100644
--- a/src/rules/__tests__/alt-text.test.js
+++ b/src/rules/__tests__/alt-text.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../alt-text");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../alt-text";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("alt-text", rule, {
valid: [
diff --git a/src/rules/__tests__/anchor-has-content.test.js b/src/rules/__tests__/anchor-has-content.test.ts
similarity index 86%
rename from src/rules/__tests__/anchor-has-content.test.js
rename to src/rules/__tests__/anchor-has-content.test.ts
index 180a0cb5..8a30897f 100644
--- a/src/rules/__tests__/anchor-has-content.test.js
+++ b/src/rules/__tests__/anchor-has-content.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../anchor-has-content");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../anchor-has-content";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("anchor-has-content", rule, {
valid: [
diff --git a/src/rules/__tests__/aria-props.test.js b/src/rules/__tests__/aria-props.test.ts
similarity index 72%
rename from src/rules/__tests__/aria-props.test.js
rename to src/rules/__tests__/aria-props.test.ts
index fd6bfb1d..07190679 100644
--- a/src/rules/__tests__/aria-props.test.js
+++ b/src/rules/__tests__/aria-props.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../aria-props");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../aria-props";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("aria-props", rule, {
valid: [""],
diff --git a/src/rules/__tests__/aria-role.test.js b/src/rules/__tests__/aria-role.test.ts
similarity index 75%
rename from src/rules/__tests__/aria-role.test.js
rename to src/rules/__tests__/aria-role.test.ts
index 8ae7b5e3..41a4f660 100644
--- a/src/rules/__tests__/aria-role.test.js
+++ b/src/rules/__tests__/aria-role.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../aria-role");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../aria-role";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("aria-role", rule, {
valid: [
diff --git a/src/rules/__tests__/aria-unsupported-elements.test.js b/src/rules/__tests__/aria-unsupported-elements.test.ts
similarity index 69%
rename from src/rules/__tests__/aria-unsupported-elements.test.js
rename to src/rules/__tests__/aria-unsupported-elements.test.ts
index 97564619..831bdd83 100644
--- a/src/rules/__tests__/aria-unsupported-elements.test.js
+++ b/src/rules/__tests__/aria-unsupported-elements.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../aria-unsupported-elements");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../aria-unsupported-elements";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("aria-unsupported-elements", rule, {
valid: ["
"],
diff --git a/src/rules/__tests__/click-events-have-key-events.test.js b/src/rules/__tests__/click-events-have-key-events.test.ts
similarity index 93%
rename from src/rules/__tests__/click-events-have-key-events.test.js
rename to src/rules/__tests__/click-events-have-key-events.test.ts
index 6b0c2095..a279194c 100644
--- a/src/rules/__tests__/click-events-have-key-events.test.js
+++ b/src/rules/__tests__/click-events-have-key-events.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../click-events-have-key-events");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../click-events-have-key-events";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("click-events-have-key-events", rule, {
valid: [
diff --git a/src/rules/__tests__/form-control-has-label.test.js b/src/rules/__tests__/form-control-has-label.test.ts
similarity index 84%
rename from src/rules/__tests__/form-control-has-label.test.js
rename to src/rules/__tests__/form-control-has-label.test.ts
index 3209b368..25c1d0f9 100644
--- a/src/rules/__tests__/form-control-has-label.test.js
+++ b/src/rules/__tests__/form-control-has-label.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../form-control-has-label");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../form-control-has-label";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("form-control-has-label", rule, {
valid: [
diff --git a/src/rules/__tests__/heading-has-content.test.js b/src/rules/__tests__/heading-has-content.test.ts
similarity index 85%
rename from src/rules/__tests__/heading-has-content.test.js
rename to src/rules/__tests__/heading-has-content.test.ts
index 4ef23f32..313ce841 100644
--- a/src/rules/__tests__/heading-has-content.test.js
+++ b/src/rules/__tests__/heading-has-content.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../heading-has-content");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../heading-has-content";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("heading-has-content", rule, {
valid: [
diff --git a/src/rules/__tests__/iframe-has-title.test.js b/src/rules/__tests__/iframe-has-title.test.ts
similarity index 66%
rename from src/rules/__tests__/iframe-has-title.test.js
rename to src/rules/__tests__/iframe-has-title.test.ts
index 9c9a3052..09efa768 100644
--- a/src/rules/__tests__/iframe-has-title.test.js
+++ b/src/rules/__tests__/iframe-has-title.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../iframe-has-title");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../iframe-has-title";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("iframe-has-title", rule, {
valid: ["", ""],
diff --git a/src/rules/__tests__/interactive-supports-focus.test.js b/src/rules/__tests__/interactive-supports-focus.test.ts
similarity index 97%
rename from src/rules/__tests__/interactive-supports-focus.test.js
rename to src/rules/__tests__/interactive-supports-focus.test.ts
index 3895385d..d7658125 100644
--- a/src/rules/__tests__/interactive-supports-focus.test.js
+++ b/src/rules/__tests__/interactive-supports-focus.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../interactive-supports-focus");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../interactive-supports-focus";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("interactive-supports-focus", rule, {
valid: [
diff --git a/src/rules/__tests__/label-has-for.test.js b/src/rules/__tests__/label-has-for.test.ts
similarity index 92%
rename from src/rules/__tests__/label-has-for.test.js
rename to src/rules/__tests__/label-has-for.test.ts
index b040b6dc..efdcfee9 100644
--- a/src/rules/__tests__/label-has-for.test.js
+++ b/src/rules/__tests__/label-has-for.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../label-has-for");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../label-has-for";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("label-has-for", rule, {
valid: [
diff --git a/src/rules/__tests__/makeRuleTester.js b/src/rules/__tests__/makeRuleTester.js
deleted file mode 100644
index b1211af2..00000000
--- a/src/rules/__tests__/makeRuleTester.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const { RuleTester } = require("eslint");
-
-const filename = "test.vue";
-const makeTemplate = (code) => `${code}`;
-
-const makeValidExample = (example) => {
- if (typeof example === "string") {
- return { filename, code: makeTemplate(example) };
- }
-
- return Object.assign(example, { filename, code: makeTemplate(example.code) });
-};
-
-const makeInvalidExample = (example) => {
- if (typeof example === "string") {
- return {
- filename,
- code: makeTemplate(example),
- errors: [{ messageId: "default" }]
- };
- }
-
- return Object.assign(example, { filename, code: makeTemplate(example.code) });
-};
-
-module.exports = (name, rule, config) => {
- const ruleTester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
- ecmaVersion: 2015,
- sourceType: "module"
- }
- });
-
- ruleTester.run(name, rule, {
- valid: config.valid.map(makeValidExample),
- invalid: config.invalid.map(makeInvalidExample)
- });
-};
diff --git a/src/rules/__tests__/makeRuleTester.ts b/src/rules/__tests__/makeRuleTester.ts
new file mode 100644
index 00000000..f2164058
--- /dev/null
+++ b/src/rules/__tests__/makeRuleTester.ts
@@ -0,0 +1,46 @@
+import type { Rule } from "eslint";
+import { RuleTester } from "eslint";
+
+type ValidCase = string | { code: string; options?: any[] };
+type InvalidCase = string | { code: string; options?: any[]; errors: any[] };
+type Config = { valid: ValidCase[]; invalid: InvalidCase[] };
+
+const filename = "test.vue";
+const makeTemplate = (code: string) => `${code}`;
+
+function makeValidExample(example: ValidCase) {
+ if (typeof example === "string") {
+ return { filename, code: makeTemplate(example) };
+ }
+
+ return { ...example, filename, code: makeTemplate(example.code) };
+}
+
+function makeInvalidExample(example: InvalidCase) {
+ if (typeof example === "string") {
+ return {
+ filename,
+ code: makeTemplate(example),
+ errors: [{ messageId: "default" }]
+ };
+ }
+
+ return { ...example, filename, code: makeTemplate(example.code) };
+}
+
+function makeRuleTester(name: string, rule: Rule.RuleModule, config: Config) {
+ const ruleTester = new RuleTester({
+ parser: require.resolve("vue-eslint-parser"),
+ parserOptions: {
+ ecmaVersion: 2015,
+ sourceType: "module"
+ }
+ });
+
+ ruleTester.run(name, rule, {
+ valid: config.valid.map(makeValidExample),
+ invalid: config.invalid.map(makeInvalidExample)
+ });
+}
+
+export default makeRuleTester;
diff --git a/src/rules/__tests__/media-has-caption.test.js b/src/rules/__tests__/media-has-caption.test.ts
similarity index 96%
rename from src/rules/__tests__/media-has-caption.test.js
rename to src/rules/__tests__/media-has-caption.test.ts
index 511eb24b..4218366e 100644
--- a/src/rules/__tests__/media-has-caption.test.js
+++ b/src/rules/__tests__/media-has-caption.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../media-has-caption");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../media-has-caption";
+import makeRuleTester from "./makeRuleTester";
const options = [
{
diff --git a/src/rules/__tests__/mouse-events-have-key-events.test.js b/src/rules/__tests__/mouse-events-have-key-events.test.ts
similarity index 85%
rename from src/rules/__tests__/mouse-events-have-key-events.test.js
rename to src/rules/__tests__/mouse-events-have-key-events.test.ts
index 1860c2c8..629198c4 100644
--- a/src/rules/__tests__/mouse-events-have-key-events.test.js
+++ b/src/rules/__tests__/mouse-events-have-key-events.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../mouse-events-have-key-events");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../mouse-events-have-key-events";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("mouse-events-have-key-events", rule, {
valid: [
diff --git a/src/rules/__tests__/no-access-key.test.js b/src/rules/__tests__/no-access-key.test.ts
similarity index 61%
rename from src/rules/__tests__/no-access-key.test.js
rename to src/rules/__tests__/no-access-key.test.ts
index 87532b24..e689fc13 100644
--- a/src/rules/__tests__/no-access-key.test.js
+++ b/src/rules/__tests__/no-access-key.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../no-access-key");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../no-access-key";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("no-access-key", rule, {
valid: ["", ""],
diff --git a/src/rules/__tests__/no-autofocus.test.js b/src/rules/__tests__/no-autofocus.test.ts
similarity index 75%
rename from src/rules/__tests__/no-autofocus.test.js
rename to src/rules/__tests__/no-autofocus.test.ts
index 2a8db92e..bc00408a 100644
--- a/src/rules/__tests__/no-autofocus.test.js
+++ b/src/rules/__tests__/no-autofocus.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../no-autofocus");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../no-autofocus";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("no-autofocus", rule, {
valid: [
diff --git a/src/rules/__tests__/no-distracting-elements.test.js b/src/rules/__tests__/no-distracting-elements.test.ts
similarity index 82%
rename from src/rules/__tests__/no-distracting-elements.test.js
rename to src/rules/__tests__/no-distracting-elements.test.ts
index ece06afb..0088a252 100644
--- a/src/rules/__tests__/no-distracting-elements.test.js
+++ b/src/rules/__tests__/no-distracting-elements.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../no-distracting-elements");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../no-distracting-elements";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("no-distracting-elements", rule, {
valid: [""],
diff --git a/src/rules/__tests__/no-onchange.test.js b/src/rules/__tests__/no-onchange.test.ts
similarity index 65%
rename from src/rules/__tests__/no-onchange.test.js
rename to src/rules/__tests__/no-onchange.test.ts
index bbb8db3b..c682a536 100644
--- a/src/rules/__tests__/no-onchange.test.js
+++ b/src/rules/__tests__/no-onchange.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../no-onchange");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../no-onchange";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("no-onchange", rule, {
valid: [""],
diff --git a/src/rules/__tests__/no-redundant-roles.test.js b/src/rules/__tests__/no-redundant-roles.test.ts
similarity index 84%
rename from src/rules/__tests__/no-redundant-roles.test.js
rename to src/rules/__tests__/no-redundant-roles.test.ts
index 0ae5c8b3..28c8a617 100644
--- a/src/rules/__tests__/no-redundant-roles.test.js
+++ b/src/rules/__tests__/no-redundant-roles.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../no-redundant-roles");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../no-redundant-roles";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("no-redundant-roles", rule, {
valid: ["", ""],
diff --git a/src/rules/__tests__/role-has-required-aria-props.test.js b/src/rules/__tests__/role-has-required-aria-props.test.ts
similarity index 87%
rename from src/rules/__tests__/role-has-required-aria-props.test.js
rename to src/rules/__tests__/role-has-required-aria-props.test.ts
index 701d24da..bec5936c 100644
--- a/src/rules/__tests__/role-has-required-aria-props.test.js
+++ b/src/rules/__tests__/role-has-required-aria-props.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../role-has-required-aria-props");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../role-has-required-aria-props";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("role-has-required-aria-props", rule, {
valid: [
diff --git a/src/rules/__tests__/tabindex-no-positive.test.js b/src/rules/__tests__/tabindex-no-positive.test.ts
similarity index 75%
rename from src/rules/__tests__/tabindex-no-positive.test.js
rename to src/rules/__tests__/tabindex-no-positive.test.ts
index 256a16cb..7db1d4f7 100644
--- a/src/rules/__tests__/tabindex-no-positive.test.js
+++ b/src/rules/__tests__/tabindex-no-positive.test.ts
@@ -1,5 +1,5 @@
-const rule = require("../tabindex-no-positive");
-const makeRuleTester = require("./makeRuleTester");
+import rule from "../tabindex-no-positive";
+import makeRuleTester from "./makeRuleTester";
makeRuleTester("tabindex-no-positive", rule, {
valid: [
diff --git a/src/rules/accessible-emoji.js b/src/rules/accessible-emoji.ts
similarity index 69%
rename from src/rules/accessible-emoji.js
rename to src/rules/accessible-emoji.ts
index fb45aec6..27d98d7b 100644
--- a/src/rules/accessible-emoji.js
+++ b/src/rules/accessible-emoji.ts
@@ -1,14 +1,16 @@
-const emojiRegex = require("emoji-regex");
-const {
+import type { Rule } from "eslint";
+import emojiRegex from "emoji-regex";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
getElementType,
hasAriaLabel,
isAriaHidden,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("accessible-emoji")
@@ -20,21 +22,22 @@ module.exports = {
create(context) {
return defineTemplateBodyVisitor(context, {
VText(node) {
- const { value } = node;
-
- if (value && emojiRegex().test(value)) {
+ if (node.value && emojiRegex().test(node.value)) {
const element = node.parent;
if (
+ element.type === "VElement" &&
!isAriaHidden(element) &&
(!hasAriaLabel(element) ||
getElementType(element) !== "span" ||
getElementAttributeValue(element, "role") !== "img")
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/alt-text.js b/src/rules/alt-text.ts
similarity index 73%
rename from src/rules/alt-text.js
rename to src/rules/alt-text.ts
index 9bfa63aa..bce4f52b 100644
--- a/src/rules/alt-text.js
+++ b/src/rules/alt-text.ts
@@ -1,4 +1,7 @@
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import {
defineTemplateBodyVisitor,
getAttributeValue,
getElementAttribute,
@@ -8,23 +11,26 @@ const {
hasAriaLabel,
isPresentationRole,
makeDocsURL
-} = require("../utils");
+} from "../utils";
+
+type ElementRule = (context: Rule.RuleContext, node: AST.VElement) => void;
+type RuleByElement = { [key: string]: ElementRule };
-const ruleByElement = {
+const ruleByElement: RuleByElement = {
img(context, node) {
const altAttribute = getElementAttribute(node, "alt");
if (!altAttribute) {
if (isPresentationRole(node)) {
- context.report({ node, messageId: "imgPresentation" });
+ context.report({ node: node as any, messageId: "imgPresentation" });
} else {
- context.report({ node, messageId: "imgMissingAlt" });
+ context.report({ node: node as any, messageId: "imgMissingAlt" });
}
} else {
const altValue = getAttributeValue(altAttribute);
if (!altValue && altValue !== "") {
- context.report({ node, messageId: "imgInvalidAlt" });
+ context.report({ node: node as any, messageId: "imgInvalidAlt" });
}
}
},
@@ -34,12 +40,12 @@ const ruleByElement = {
!getElementAttributeValue(node, "title") &&
!hasAccessibleChild(node)
) {
- context.report({ node, messageId: "object" });
+ context.report({ node: node as any, messageId: "object" });
}
},
area(context, node) {
if (!hasAriaLabel(node) && !getElementAttributeValue(node, "alt")) {
- context.report({ node, messageId: "area" });
+ context.report({ node: node as any, messageId: "area" });
}
},
'input[type="image"]'(context, node) {
@@ -48,12 +54,12 @@ const ruleByElement = {
!hasAriaLabel(node) &&
!getElementAttributeValue(node, "alt")
) {
- context.report({ node, messageId: "input" });
+ context.report({ node: node as any, messageId: "input" });
}
}
};
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("alt-text")
@@ -89,11 +95,11 @@ module.exports = {
},
create(context) {
const options = context.options[0] || {};
- const { elements = Object.keys(ruleByElement) } = options;
+ const elements: string[] = options.elements || Object.keys(ruleByElement);
- const elementTypes = new Set(
+ const elementTypes: Set = new Set(
elements.reduce(
- (accum, element) => [
+ (accum: string[], element: string) => [
...accum,
element === 'input[type="image"]' ? "input" : element,
...(options[element] || [])
@@ -104,7 +110,7 @@ module.exports = {
return defineTemplateBodyVisitor(context, {
VElement(node) {
- let elementType = getElementType(node);
+ let elementType: string | undefined = getElementType(node);
if (!elementTypes.has(elementType)) {
return;
}
@@ -119,8 +125,10 @@ module.exports = {
);
}
- ruleByElement[elementType](context, node);
+ elementType && ruleByElement[elementType](context, node);
}
});
}
};
+
+export default rule;
diff --git a/src/rules/anchor-has-content.js b/src/rules/anchor-has-content.ts
similarity index 86%
rename from src/rules/anchor-has-content.js
rename to src/rules/anchor-has-content.ts
index 53feff0c..afaeb82f 100644
--- a/src/rules/anchor-has-content.js
+++ b/src/rules/anchor-has-content.ts
@@ -1,13 +1,15 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getElementType,
hasAriaLabel,
hasContent,
makeDocsURL,
makeKebabCase
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("anchor-has-content")
@@ -48,9 +50,11 @@ module.exports = {
!hasContent(node, accessibleChildTypes) &&
!hasAriaLabel(node)
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/aria-props.js b/src/rules/aria-props.ts
similarity index 51%
rename from src/rules/aria-props.js
rename to src/rules/aria-props.ts
index 08870f70..5d98feb2 100644
--- a/src/rules/aria-props.js
+++ b/src/rules/aria-props.ts
@@ -1,11 +1,13 @@
-const { aria } = require("aria-query");
-const {
+import type { Rule } from "eslint";
+
+import { aria } from "aria-query";
+import {
defineTemplateBodyVisitor,
getAttributeName,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("aria-props")
@@ -20,10 +22,20 @@ module.exports = {
const name = getAttributeName(node);
const lowered = name && name.toLowerCase();
- if (lowered && lowered.startsWith("aria-") && !aria.has(lowered)) {
- context.report({ node, messageId: "default", data: { name } });
+ if (
+ lowered &&
+ lowered.startsWith("aria-") &&
+ !aria.has(lowered as any)
+ ) {
+ context.report({
+ node: node as any,
+ messageId: "default",
+ data: { name: name as string }
+ });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/aria-role.js b/src/rules/aria-role.ts
similarity index 69%
rename from src/rules/aria-role.js
rename to src/rules/aria-role.ts
index 785159d3..7a079e11 100644
--- a/src/rules/aria-role.js
+++ b/src/rules/aria-role.ts
@@ -1,13 +1,20 @@
-const { dom, roles } = require("aria-query");
-const {
+import type { Rule } from "eslint";
+import { dom, roles } from "aria-query";
+
+import {
defineTemplateBodyVisitor,
getAttributeValue,
getElementType,
isAttribute,
makeDocsURL
-} = require("../utils");
+} from "../utils";
+
+function isValidRole(value: any) {
+ const ariaRole = roles.get(value as any);
+ return ariaRole && !ariaRole.abstract;
+}
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("aria-role")
@@ -45,15 +52,12 @@ module.exports = {
return;
}
- const valid = value
- .toLowerCase()
- .split(" ")
- .every((role) => roles.has(role) && !roles.get(role).abstract);
-
- if (!valid) {
- context.report({ node, messageId: "default" });
+ if (!value.toLowerCase().split(" ").every(isValidRole)) {
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/aria-unsupported-elements.js b/src/rules/aria-unsupported-elements.ts
similarity index 63%
rename from src/rules/aria-unsupported-elements.js
rename to src/rules/aria-unsupported-elements.ts
index 947f3ec0..7f5e1d1c 100644
--- a/src/rules/aria-unsupported-elements.js
+++ b/src/rules/aria-unsupported-elements.ts
@@ -1,12 +1,14 @@
-const { aria, dom } = require("aria-query");
-const {
+import type { Rule } from "eslint";
+import { aria, dom } from "aria-query";
+
+import {
defineTemplateBodyVisitor,
getAttributeName,
getElementType,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("aria-unsupported-elements")
@@ -25,11 +27,17 @@ module.exports = {
node.startTag.attributes.forEach((attribute) => {
const name = getAttributeName(attribute);
- if (aria.has(name) || name === "role") {
- context.report({ node, messageId: "default", data: { name } });
+ if (name && (aria.has(name as any) || name === "role")) {
+ context.report({
+ node: node as any,
+ messageId: "default",
+ data: { name }
+ });
}
});
}
});
}
};
+
+export default rule;
diff --git a/src/rules/click-events-have-key-events.js b/src/rules/click-events-have-key-events.ts
similarity index 54%
rename from src/rules/click-events-have-key-events.js
rename to src/rules/click-events-have-key-events.ts
index 2c0ad1e9..d63b4e61 100644
--- a/src/rules/click-events-have-key-events.js
+++ b/src/rules/click-events-have-key-events.ts
@@ -1,29 +1,34 @@
-const vueEslintParser = require("vue-eslint-parser");
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import htmlElements from "../utils/htmlElements.json";
+import {
defineTemplateBodyVisitor,
getElementAttribute,
- getElementAttributeValue,
hasOnDirective,
hasOnDirectives,
isHiddenFromScreenReader,
isInteractiveElement,
+ isPresentationRole,
makeDocsURL
-} = require("../utils");
-const htmlElements = require("../utils/htmlElements.json");
+} from "../utils";
-const isHtmlElementNode = (node) =>
- node.namespace === vueEslintParser.AST.NS.HTML;
+// Why can I not import this like normal? Unclear.
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const vueEslintParser = require("vue-eslint-parser");
-const isCustomComponent = (node) =>
- (isHtmlElementNode(node) && !htmlElements.includes(node.rawName)) ||
- getElementAttribute(node, "is");
+function isHtmlElementNode(node: AST.VElement) {
+ return node.namespace === vueEslintParser.AST.NS.HTML;
+}
-const isPresentationRole = (node) => {
- const role = getElementAttributeValue(node, "role");
- return role && ["presentation", "none"].includes(role);
-};
+function isCustomComponent(node: AST.VElement) {
+ return (
+ (isHtmlElementNode(node) && !htmlElements.includes(node.rawName)) ||
+ !!getElementAttribute(node, "is")
+ );
+}
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("click-events-have-key-events")
@@ -44,9 +49,11 @@ module.exports = {
!isInteractiveElement(node) &&
!hasOnDirectives(node, ["keydown", "keyup", "keypress"])
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/form-control-has-label.js b/src/rules/form-control-has-label.ts
similarity index 67%
rename from src/rules/form-control-has-label.js
rename to src/rules/form-control-has-label.ts
index 95e9bf7d..770dfac2 100644
--- a/src/rules/form-control-has-label.js
+++ b/src/rules/form-control-has-label.ts
@@ -1,25 +1,35 @@
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
getElementType,
hasAriaLabel,
isAriaHidden,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-const isLabelElement = (node) =>
- node.type === "VElement" && getElementType(node) === "label";
+function isLabelElement(
+ node:
+ | AST.VElement
+ | AST.VDocumentFragment
+ | AST.VText
+ | AST.VExpressionContainer
+) {
+ return node.type === "VElement" && getElementType(node) === "label";
+}
-const hasLabelElement = (node) => {
+function hasLabelElement(node: AST.VElement): boolean {
const { parent } = node;
return (
[parent, ...parent.children].some(isLabelElement) ||
(parent && parent.type === "VElement" && hasLabelElement(parent))
);
-};
+}
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("form-has-label")
@@ -42,7 +52,9 @@ module.exports = {
if (
!type ||
- ["hidden", "button", "image", "submit", "reset"].includes(type)
+ ["hidden", "button", "image", "submit", "reset"].includes(
+ type as any
+ )
) {
return;
}
@@ -53,9 +65,11 @@ module.exports = {
!hasAriaLabel(node) &&
!hasLabelElement(node)
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/heading-has-content.js b/src/rules/heading-has-content.ts
similarity index 86%
rename from src/rules/heading-has-content.js
rename to src/rules/heading-has-content.ts
index f3d74286..2af69d53 100644
--- a/src/rules/heading-has-content.js
+++ b/src/rules/heading-has-content.ts
@@ -1,14 +1,16 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getElementType,
hasContent,
makeDocsURL,
makeKebabCase
-} = require("../utils");
+} from "../utils";
const headings = ["h1", "h2", "h3", "h4", "h5", "h6"];
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("heading-has-content")
@@ -48,9 +50,11 @@ module.exports = {
elementTypes.includes(elementType) &&
!hasContent(node, accessibleChildTypes)
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/iframe-has-title.js b/src/rules/iframe-has-title.ts
similarity index 56%
rename from src/rules/iframe-has-title.js
rename to src/rules/iframe-has-title.ts
index 9a865365..e68947fd 100644
--- a/src/rules/iframe-has-title.js
+++ b/src/rules/iframe-has-title.ts
@@ -1,10 +1,14 @@
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
+ getElementType,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("iframe-has-title")
@@ -15,13 +19,19 @@ module.exports = {
},
create(context) {
return defineTemplateBodyVisitor(context, {
- "VElement[name='iframe']"(node) {
+ VElement(node: AST.VElement) {
+ if (getElementType(node) !== "iframe") {
+ return;
+ }
+
const title = getElementAttributeValue(node, "title");
if (title === null || !["string", "object"].includes(typeof title)) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/interactive-supports-focus.js b/src/rules/interactive-supports-focus.ts
similarity index 63%
rename from src/rules/interactive-supports-focus.js
rename to src/rules/interactive-supports-focus.ts
index c35b7de5..c7a205b2 100644
--- a/src/rules/interactive-supports-focus.js
+++ b/src/rules/interactive-supports-focus.ts
@@ -1,6 +1,8 @@
-const { dom, roles } = require("aria-query");
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+import { ARIARoleDefintionKey, dom, roles } from "aria-query";
-const {
+import {
defineTemplateBodyVisitor,
getAttributeValue,
getElementAttribute,
@@ -11,9 +13,9 @@ const {
isInteractiveElement,
isPresentationRole,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-const interactiveRoles = [];
+const interactiveRoles: ARIARoleDefintionKey[] = [];
for (const [role, definition] of roles) {
if (
@@ -49,23 +51,28 @@ const interactiveHandlers = [
"mouseup"
];
-const isDisabledElement = (node) =>
- getElementAttributeValue(node, "disabled") ||
- (getElementAttributeValue(node, "aria-disabled") || "").toString() === "true";
+function isDisabledElement(node: AST.VElement) {
+ return (
+ getElementAttributeValue(node, "disabled") ||
+ (getElementAttributeValue(node, "aria-disabled") || "").toString() ===
+ "true"
+ );
+}
-const hasInteractiveRole = (node) => {
- const roleValue = getElementAttributeValue(node, "role");
- if (typeof roleValue !== "string") {
+function isInteractiveRole(value: any): value is string {
+ if (typeof value !== "string") {
return false;
}
- return roleValue
+ return value
.toLowerCase()
.split(" ")
- .some((role) => roles.has(role) && interactiveRoles.includes(role));
-};
+ .some(
+ (role) => roles.has(role as any) && interactiveRoles.includes(role as any)
+ );
+}
-const hasTabIndex = (node) => {
+function hasTabIndex(node: AST.VElement) {
const attribute = getElementAttribute(node, "tabindex");
if (!attribute) {
@@ -86,9 +93,14 @@ const hasTabIndex = (node) => {
}
return value === null;
-};
+}
-module.exports = {
+interface InteractiveSupportsFocus extends Rule.RuleModule {
+ interactiveHandlers: string[];
+ interactiveRoles: ARIARoleDefintionKey[];
+}
+
+const rule: InteractiveSupportsFocus = {
meta: {
docs: {
url: makeDocsURL("interactive-supports-focus")
@@ -117,6 +129,8 @@ module.exports = {
create(context) {
return defineTemplateBodyVisitor(context, {
VElement(node) {
+ const role = getElementAttributeValue(node, "role");
+
if (
dom.has(getElementType(node)) &&
hasOnDirectives(node, interactiveHandlers) &&
@@ -124,18 +138,25 @@ module.exports = {
!isDisabledElement(node) &&
!isHiddenFromScreenReader(node) &&
!isPresentationRole(node) &&
- hasInteractiveRole(node) &&
+ isInteractiveRole(role) &&
!isInteractiveElement(node)
) {
- const role = getElementAttributeValue(node, "role");
- const { tabbable = [] } = context.options[0] || {};
+ const tabbable: string[] = (context.options[0] || {}).tabbable || [];
- if (role && tabbable.includes(role)) {
+ if (tabbable.includes(role)) {
// Always tabbable, tabIndex = 0
- context.report({ node, messageId: "tabbable", data: { role } });
+ context.report({
+ node: node as any,
+ messageId: "tabbable",
+ data: { role }
+ });
} else {
// Focusable, tabIndex = -1 or 0
- context.report({ node, messageId: "focusable", data: { role } });
+ context.report({
+ node: node as any,
+ messageId: "focusable",
+ data: { role }
+ });
}
}
}
@@ -144,3 +165,5 @@ module.exports = {
interactiveHandlers,
interactiveRoles
};
+
+export default rule;
diff --git a/src/rules/label-has-for.js b/src/rules/label-has-for.ts
similarity index 78%
rename from src/rules/label-has-for.js
rename to src/rules/label-has-for.ts
index 13ab89f9..1b1096f5 100644
--- a/src/rules/label-has-for.js
+++ b/src/rules/label-has-for.ts
@@ -1,19 +1,30 @@
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
getElementType,
isHiddenFromScreenReader,
makeDocsURL,
makeKebabCase
-} = require("../utils");
+} from "../utils";
+
+type Association = "nesting" | "id";
+type Required =
+ | Association
+ | { some: Association[]; every: undefined }
+ | { some: undefined; every: Association[] };
+
+type Options = { allowChildren: boolean; controlComponents: string[] };
const controlTypes = ["input", "meter", "progress", "select", "textarea"];
-const validateNesting = (node, options) =>
- node.children.some((child) => {
+function validateNesting(node: AST.VElement, options: Options): boolean {
+ return node.children.some((child) => {
const { allowChildren, controlComponents } = options;
- if (child.rawName === "slot") {
+ if (child.type === "VElement" && child.rawName === "slot") {
return allowChildren;
}
@@ -29,8 +40,9 @@ const validateNesting = (node, options) =>
return false;
});
+}
-const validate = (node, rule, options) => {
+function validate(node: AST.VElement, rule: Association, options: Options) {
switch (rule) {
case "nesting":
return validateNesting(node, options);
@@ -39,9 +51,17 @@ const validate = (node, rule, options) => {
default:
return false;
}
-};
+}
+
+function isValidLabel(
+ node: AST.VElement,
+ required: Required,
+ options: Options
+) {
+ if (typeof required === "string") {
+ return validate(node, required, options);
+ }
-const isValidLabel = (node, required, options) => {
if (Array.isArray(required.some)) {
return required.some.some((rule) => validate(node, rule, options));
}
@@ -49,11 +69,9 @@ const isValidLabel = (node, required, options) => {
if (Array.isArray(required.every)) {
return required.every.every((rule) => validate(node, rule, options));
}
+}
- return validate(node, required, options);
-};
-
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("label-has-for")
@@ -142,9 +160,11 @@ module.exports = {
labelComponents.includes(getElementType(node)) &&
!isValidLabel(node, required, options)
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/media-has-caption.js b/src/rules/media-has-caption.ts
similarity index 80%
rename from src/rules/media-has-caption.js
rename to src/rules/media-has-caption.ts
index 4e210e95..674b0675 100644
--- a/src/rules/media-has-caption.js
+++ b/src/rules/media-has-caption.ts
@@ -1,4 +1,7 @@
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+import {
defineTemplateBodyVisitor,
getAttributeValue,
getElementAttribute,
@@ -6,14 +9,18 @@ const {
getElementType,
makeDocsURL,
makeKebabCase
-} = require("../utils");
+} from "../utils";
+
+function isCaptionsTrackElement(
+ node: AST.VElement | AST.VExpressionContainer | AST.VText
+) {
+ const kind =
+ node.type === "VElement" && getElementAttributeValue(node, "kind");
-const isCaptionsTrackElement = (node) => {
- const kind = getElementAttributeValue(node, "kind");
return kind && typeof kind === "string" && kind.toLowerCase() === "captions";
-};
+}
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("media-has-caption")
@@ -71,9 +78,11 @@ module.exports = {
trackElements.length === 0 ||
!trackElements.some(isCaptionsTrackElement)
) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/mouse-events-have-key-events.js b/src/rules/mouse-events-have-key-events.ts
similarity index 76%
rename from src/rules/mouse-events-have-key-events.js
rename to src/rules/mouse-events-have-key-events.ts
index 8123595f..3dcb4e13 100644
--- a/src/rules/mouse-events-have-key-events.js
+++ b/src/rules/mouse-events-have-key-events.ts
@@ -1,10 +1,12 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
hasOnDirectives,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("mouse-events-have-key-events")
@@ -23,16 +25,18 @@ module.exports = {
hasOnDirectives(node, ["mouseover", "mouseenter", "hover"]) &&
!hasOnDirectives(node, ["focus", "focusin"])
) {
- context.report({ node, messageId: "mouseOver" });
+ context.report({ node: node as any, messageId: "mouseOver" });
}
if (
hasOnDirectives(node, ["mouseout", "mouseleave"]) &&
!hasOnDirectives(node, ["blur", "focusout"])
) {
- context.report({ node, messageId: "mouseOut" });
+ context.report({ node: node as any, messageId: "mouseOut" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/no-access-key.js b/src/rules/no-access-key.ts
similarity index 74%
rename from src/rules/no-access-key.js
rename to src/rules/no-access-key.ts
index de5dd3cb..9a87b3bd 100644
--- a/src/rules/no-access-key.js
+++ b/src/rules/no-access-key.ts
@@ -1,10 +1,12 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("no-access-key")
@@ -18,9 +20,11 @@ module.exports = {
return defineTemplateBodyVisitor(context, {
VElement(node) {
if (getElementAttributeValue(node, "accesskey")) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/no-autofocus.js b/src/rules/no-autofocus.ts
similarity index 79%
rename from src/rules/no-autofocus.js
rename to src/rules/no-autofocus.ts
index ce8ba944..c74732c3 100644
--- a/src/rules/no-autofocus.js
+++ b/src/rules/no-autofocus.ts
@@ -1,12 +1,14 @@
-const { dom } = require("aria-query");
-const {
+import type { Rule } from "eslint";
+import { dom } from "aria-query";
+
+import {
defineTemplateBodyVisitor,
getElementType,
isAttribute,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("no-autofocus")
@@ -39,8 +41,10 @@ module.exports = {
return;
}
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
});
}
};
+
+export default rule;
diff --git a/src/rules/no-distracting-elements.js b/src/rules/no-distracting-elements.ts
similarity index 77%
rename from src/rules/no-distracting-elements.js
rename to src/rules/no-distracting-elements.ts
index 142fc7ed..67f32af5 100644
--- a/src/rules/no-distracting-elements.js
+++ b/src/rules/no-distracting-elements.ts
@@ -1,13 +1,15 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getElementType,
makeDocsURL,
makeKebabCase
-} = require("../utils");
+} from "../utils";
const defaultElements = ["marquee", "blink"];
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("no-distracting-elements")
@@ -36,9 +38,15 @@ module.exports = {
const elementType = getElementType(node);
if (elements.map(makeKebabCase).includes(elementType)) {
- context.report({ node, messageId: "default", data: { elementType } });
+ context.report({
+ node: node as any,
+ messageId: "default",
+ data: { elementType }
+ });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/no-onchange.js b/src/rules/no-onchange.ts
similarity index 77%
rename from src/rules/no-onchange.js
rename to src/rules/no-onchange.ts
index bdebdeed..7fed5031 100644
--- a/src/rules/no-onchange.js
+++ b/src/rules/no-onchange.ts
@@ -1,11 +1,13 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getElementType,
hasOnDirective,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("no-onchange")
@@ -23,9 +25,11 @@ module.exports = {
}
if (hasOnDirective(node, "change") && !hasOnDirective(node, "blur")) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/no-redundant-roles.js b/src/rules/no-redundant-roles.ts
similarity index 74%
rename from src/rules/no-redundant-roles.js
rename to src/rules/no-redundant-roles.ts
index 6f46a3cb..ff8ec806 100644
--- a/src/rules/no-redundant-roles.js
+++ b/src/rules/no-redundant-roles.ts
@@ -1,15 +1,18 @@
-const { elementRoles } = require("aria-query");
-const {
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+import { elementRoles } from "aria-query";
+
+import {
defineTemplateBodyVisitor,
getElementAttributeValue,
getElementType,
makeDocsURL,
matchesElementRole
-} = require("../utils");
+} from "../utils";
-const exceptions = { nav: ["navigation"] };
+const exceptions: { [type: string]: string[] } = { nav: ["navigation"] };
-const getImplicitRoleSet = (node) => {
+function getImplicitRoleSet(node: AST.VElement) {
for (const [elementRole, roleSet] of elementRoles) {
if (matchesElementRole(node, elementRole)) {
return roleSet;
@@ -17,9 +20,9 @@ const getImplicitRoleSet = (node) => {
}
return null;
-};
+}
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("no-redundant-roles")
@@ -61,14 +64,16 @@ module.exports = {
return;
}
- if (implicitRoleSet.has(explicitRole)) {
+ if (implicitRoleSet.has(explicitRole as any)) {
context.report({
- node,
+ node: node as any,
messageId: "default",
- data: { type, role: explicitRole }
+ data: { type, role: explicitRole.toString() }
});
}
}
});
}
};
+
+export default rule;
diff --git a/src/rules/role-has-required-aria-props.js b/src/rules/role-has-required-aria-props.js
deleted file mode 100644
index 490131b9..00000000
--- a/src/rules/role-has-required-aria-props.js
+++ /dev/null
@@ -1,61 +0,0 @@
-const { dom, roles } = require("aria-query");
-const {
- defineTemplateBodyVisitor,
- getElementAttribute,
- getElementAttributeValue,
- getElementType,
- makeDocsURL
-} = require("../utils");
-
-const hasAttributes = (node, names) =>
- names.every((name) => getElementAttribute(node, name) !== null);
-
-module.exports = {
- meta: {
- docs: {
- url: makeDocsURL("role-has-required-aria-props")
- },
- messages: {
- default: `Elements with the ARIA role "{{role}}" must have the following attributes defined: {{attributes}}`
- }
- },
- create(context) {
- return defineTemplateBodyVisitor(context, {
- VElement(node) {
- const elementType = getElementType(node);
- if (!dom.get(elementType)) {
- return;
- }
-
- const roleValue = getElementAttributeValue(node, "role");
- if (!roleValue || typeof roleValue !== "string") {
- return;
- }
-
- roleValue
- .toLowerCase()
- .split(" ")
- .forEach((role) => {
- if (!roles.has(role)) {
- return;
- }
-
- const requiredAttributes = Object.keys(
- roles.get(role).requiredProps
- );
-
- if (!hasAttributes(node, requiredAttributes)) {
- context.report({
- node,
- messageId: "default",
- data: {
- role: role.toLowerCase(),
- attributes: requiredAttributes.join(", ").toLowerCase()
- }
- });
- }
- });
- }
- });
- }
-};
diff --git a/src/rules/role-has-required-aria-props.ts b/src/rules/role-has-required-aria-props.ts
new file mode 100644
index 00000000..42ad4094
--- /dev/null
+++ b/src/rules/role-has-required-aria-props.ts
@@ -0,0 +1,68 @@
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+import { ARIARoleDefintionKey, dom, roles } from "aria-query";
+
+import {
+ defineTemplateBodyVisitor,
+ getElementAttribute,
+ getElementAttributeValue,
+ getElementType,
+ makeDocsURL
+} from "../utils";
+
+function hasAttributes(node: AST.VElement, names: string[]) {
+ return names.every((name) => getElementAttribute(node, name) !== null);
+}
+
+function isAriaRoleDefinitionKey(role: any): role is ARIARoleDefintionKey {
+ return roles.has(role);
+}
+
+const rule: Rule.RuleModule = {
+ meta: {
+ docs: {
+ url: makeDocsURL("role-has-required-aria-props")
+ },
+ messages: {
+ default: `Elements with the ARIA role "{{role}}" must have the following attributes defined: {{attributes}}`
+ }
+ },
+ create(context) {
+ return defineTemplateBodyVisitor(context, {
+ VElement(node) {
+ const elementType = getElementType(node);
+ if (!dom.get(elementType)) {
+ return;
+ }
+
+ const roleValue = getElementAttributeValue(node, "role");
+ if (!roleValue || typeof roleValue !== "string") {
+ return;
+ }
+
+ roleValue
+ .toLowerCase()
+ .split(" ")
+ .forEach((role) => {
+ if (isAriaRoleDefinitionKey(role)) {
+ const roleDefinition = roles.get(role) as any;
+ const requiredProps = Object.keys(roleDefinition.requiredProps);
+
+ if (requiredProps && !hasAttributes(node, requiredProps)) {
+ context.report({
+ node: node as any,
+ messageId: "default",
+ data: {
+ role: role.toLowerCase(),
+ attributes: requiredProps.join(", ").toLowerCase()
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+ }
+};
+
+export default rule;
diff --git a/src/rules/tabindex-no-positive.js b/src/rules/tabindex-no-positive.ts
similarity index 71%
rename from src/rules/tabindex-no-positive.js
rename to src/rules/tabindex-no-positive.ts
index db950ba0..576b5153 100644
--- a/src/rules/tabindex-no-positive.js
+++ b/src/rules/tabindex-no-positive.ts
@@ -1,10 +1,12 @@
-const {
+import type { Rule } from "eslint";
+
+import {
defineTemplateBodyVisitor,
getLiteralAttributeValue,
makeDocsURL
-} = require("../utils");
+} from "../utils";
-module.exports = {
+const rule: Rule.RuleModule = {
meta: {
docs: {
url: makeDocsURL("tabindex-no-positive")
@@ -19,9 +21,11 @@ module.exports = {
const tabIndex = getLiteralAttributeValue(node, "tabindex");
if (tabIndex && +tabIndex > 0) {
- context.report({ node, messageId: "default" });
+ context.report({ node: node as any, messageId: "default" });
}
}
});
}
};
+
+export default rule;
diff --git a/src/utils.js b/src/utils.js
deleted file mode 100644
index f1d5b321..00000000
--- a/src/utils.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = {
- defineTemplateBodyVisitor: require("./utils/defineTemplateBodyVisitor"),
- getAttributeName: require("./utils/getAttributeName"),
- getAttributeValue: require("./utils/getAttributeValue"),
- getElementAttribute: require("./utils/getElementAttribute"),
- getElementAttributeValue: require("./utils/getElementAttributeValue"),
- getElementType: require("./utils/getElementType"),
- getLiteralAttributeValue: require("./utils/getLiteralAttributeValue"),
- hasAccessibleChild: require("./utils/hasAccessibleChild"),
- hasAriaLabel: require("./utils/hasAriaLabel"),
- hasContent: require("./utils/hasContent"),
- hasOnDirective: require("./utils/hasOnDirective"),
- hasOnDirectives: require("./utils/hasOnDirectives"),
- isAriaHidden: require("./utils/isAriaHidden"),
- isAttribute: require("./utils/isAttribute"),
- isHiddenFromScreenReader: require("./utils/isHiddenFromScreenReader"),
- isInteractiveElement: require("./utils/isInteractiveElement"),
- isPresentationRole: require("./utils/isPresentationRole"),
- makeDocsURL: require("./utils/makeDocsURL"),
- makeKebabCase: require("./utils/makeKebabCase"),
- matchesElementRole: require("./utils/matchesElementRole")
-};
diff --git a/src/utils.ts b/src/utils.ts
new file mode 100644
index 00000000..55bf2921
--- /dev/null
+++ b/src/utils.ts
@@ -0,0 +1,20 @@
+export { default as defineTemplateBodyVisitor } from "./utils/defineTemplateBodyVisitor";
+export { default as getAttributeName } from "./utils/getAttributeName";
+export { default as getAttributeValue } from "./utils/getAttributeValue";
+export { default as getElementAttribute } from "./utils/getElementAttribute";
+export { default as getElementAttributeValue } from "./utils/getElementAttributeValue";
+export { default as getElementType } from "./utils/getElementType";
+export { default as getLiteralAttributeValue } from "./utils/getLiteralAttributeValue";
+export { default as hasAccessibleChild } from "./utils/hasAccessibleChild";
+export { default as hasAriaLabel } from "./utils/hasAriaLabel";
+export { default as hasContent } from "./utils/hasContent";
+export { default as hasOnDirective } from "./utils/hasOnDirective";
+export { default as hasOnDirectives } from "./utils/hasOnDirectives";
+export { default as isAriaHidden } from "./utils/isAriaHidden";
+export { default as isAttribute } from "./utils/isAttribute";
+export { default as isHiddenFromScreenReader } from "./utils/isHiddenFromScreenReader";
+export { default as isInteractiveElement } from "./utils/isInteractiveElement";
+export { default as isPresentationRole } from "./utils/isPresentationRole";
+export { default as makeDocsURL } from "./utils/makeDocsURL";
+export { default as makeKebabCase } from "./utils/makeKebabCase";
+export { default as matchesElementRole } from "./utils/matchesElementRole";
diff --git a/src/utils/defineTemplateBodyVisitor.js b/src/utils/defineTemplateBodyVisitor.js
deleted file mode 100644
index 3186a132..00000000
--- a/src/utils/defineTemplateBodyVisitor.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Taken directly from eslint-plugin-vue
-const defineTemplateBodyVisitor = (context, templateVisitor, scriptVisitor) => {
- if (context.parserServices.defineTemplateBodyVisitor === null) {
- context.report({
- loc: { line: 1, column: 0 },
- message:
- "Use the latest vue-eslint-parser. See also https://eslint.vuejs.org/user-guide/#what-is-the-use-the-latest-vue-eslint-parser-error"
- });
-
- return {};
- }
-
- return context.parserServices.defineTemplateBodyVisitor(
- templateVisitor,
- scriptVisitor
- );
-};
-
-module.exports = defineTemplateBodyVisitor;
diff --git a/src/utils/defineTemplateBodyVisitor.ts b/src/utils/defineTemplateBodyVisitor.ts
new file mode 100644
index 00000000..a5e0d7aa
--- /dev/null
+++ b/src/utils/defineTemplateBodyVisitor.ts
@@ -0,0 +1,32 @@
+import type { Rule } from "eslint";
+import type { AST } from "vue-eslint-parser";
+
+interface TemplateListener extends Rule.NodeListener {
+ VAttribute?: (node: AST.VAttribute) => void;
+ VElement?: (node: AST.VElement) => void;
+ VText?: (node: AST.VText) => void;
+}
+
+// Taken directly from eslint-plugin-vue
+function defineTemplateBodyVisitor(
+ context: Rule.RuleContext,
+ templateVisitor: TemplateListener,
+ scriptVisitor?: Rule.RuleListener
+) {
+ if (context.parserServices.defineTemplateBodyVisitor === null) {
+ context.report({
+ loc: { line: 1, column: 0 },
+ message:
+ "Use the latest vue-eslint-parser. See also https://eslint.vuejs.org/user-guide/#what-is-the-use-the-latest-vue-eslint-parser-error"
+ });
+
+ return {};
+ }
+
+ return context.parserServices.defineTemplateBodyVisitor(
+ templateVisitor,
+ scriptVisitor
+ );
+}
+
+export default defineTemplateBodyVisitor;
diff --git a/src/utils/getAttributeName.js b/src/utils/getAttributeName.js
deleted file mode 100644
index 7874a589..00000000
--- a/src/utils/getAttributeName.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const getAttributeName = (node) => {
- const { key } = node;
-
- if (!node.directive) {
- return key.name;
- }
- return key.name.name === "bind" && key.argument && key.argument.name;
-};
-
-module.exports = getAttributeName;
diff --git a/src/utils/getAttributeName.ts b/src/utils/getAttributeName.ts
new file mode 100644
index 00000000..cf1525f6
--- /dev/null
+++ b/src/utils/getAttributeName.ts
@@ -0,0 +1,20 @@
+import type { AST } from "vue-eslint-parser";
+
+function getAttributeName(node: AST.VAttribute | AST.VDirective) {
+ if (!node.directive) {
+ return node.key.name;
+ }
+
+ const { key } = node;
+ if (
+ key.name.name === "bind" &&
+ key.argument &&
+ key.argument.type === "VIdentifier"
+ ) {
+ return key.argument.name;
+ }
+
+ return null;
+}
+
+export default getAttributeName;
diff --git a/src/utils/getAttributeValue.js b/src/utils/getAttributeValue.js
deleted file mode 100644
index 5a19827d..00000000
--- a/src/utils/getAttributeValue.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const getAttributeValue = (node) => {
- const { key, value } = node;
-
- if (!value) {
- return null;
- }
-
- if (!node.directive) {
- return value.value;
- }
-
- if (key.name.name === "bind" && value.expression) {
- //
- if (value.expression.type === "Literal") {
- return value.expression.value;
- }
-
- // TODO we're effectively using this as just a placeholder to let rules know
- // that a value has been passed in for this attribute. We should replace
- // this with a stronger API to either explicitly handel all of the different
- // types of values or just return a special symbol or something else.
- return value.expression;
- }
-
- return null;
-};
-
-module.exports = getAttributeValue;
diff --git a/src/utils/getAttributeValue.ts b/src/utils/getAttributeValue.ts
new file mode 100644
index 00000000..0378ff36
--- /dev/null
+++ b/src/utils/getAttributeValue.ts
@@ -0,0 +1,28 @@
+import type { AST } from "vue-eslint-parser";
+
+function getAttributeValue(node: AST.VAttribute | AST.VDirective) {
+ if (!node.value) {
+ return null;
+ }
+
+ if (!node.directive) {
+ return node.value.value;
+ }
+
+ if (node.key.name.name === "bind" && node.value.expression) {
+ //
+ if (node.value.expression.type === "Literal") {
+ return node.value.expression.value;
+ }
+
+ // TODO we're effectively using this as just a placeholder to let rules know
+ // that a value has been passed in for this attribute. We should replace
+ // this with a stronger API to either explicitly handle all of the different
+ // types of values or just return a special symbol or something else.
+ return node.value.expression;
+ }
+
+ return null;
+}
+
+export default getAttributeValue;
diff --git a/src/utils/getElementAttribute.js b/src/utils/getElementAttribute.js
deleted file mode 100644
index a6887f89..00000000
--- a/src/utils/getElementAttribute.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const getElementAttribute = (node, name) => {
- for (const attribute of node.startTag.attributes) {
- const { key } = attribute;
-
- if (
- (!attribute.directive && key.name === name) ||
- (attribute.directive &&
- key.name.name === "bind" &&
- key.argument &&
- key.argument.name === name)
- ) {
- return attribute;
- }
- }
-
- return null;
-};
-
-module.exports = getElementAttribute;
diff --git a/src/utils/getElementAttribute.ts b/src/utils/getElementAttribute.ts
new file mode 100644
index 00000000..88930893
--- /dev/null
+++ b/src/utils/getElementAttribute.ts
@@ -0,0 +1,20 @@
+import type { AST } from "vue-eslint-parser";
+
+function getElementAttribute(node: AST.VElement, name: string) {
+ for (const attribute of node.startTag.attributes) {
+ if (
+ (!attribute.directive && attribute.key.name === name) ||
+ (attribute.directive &&
+ attribute.key.name.name === "bind" &&
+ attribute.key.argument &&
+ attribute.key.argument.type === "VIdentifier" &&
+ attribute.key.argument.name === name)
+ ) {
+ return attribute;
+ }
+ }
+
+ return null;
+}
+
+export default getElementAttribute;
diff --git a/src/utils/getElementAttributeValue.js b/src/utils/getElementAttributeValue.js
deleted file mode 100644
index 627a4805..00000000
--- a/src/utils/getElementAttributeValue.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const getAttributeValue = require("./getAttributeValue");
-const getElementAttribute = require("./getElementAttribute");
-
-const getElementAttributeValue = (node, name) => {
- const attribute = getElementAttribute(node, name);
- return attribute && getAttributeValue(attribute);
-};
-
-module.exports = getElementAttributeValue;
diff --git a/src/utils/getElementAttributeValue.ts b/src/utils/getElementAttributeValue.ts
new file mode 100644
index 00000000..3a23d214
--- /dev/null
+++ b/src/utils/getElementAttributeValue.ts
@@ -0,0 +1,11 @@
+import type { AST } from "vue-eslint-parser";
+
+import getAttributeValue from "./getAttributeValue";
+import getElementAttribute from "./getElementAttribute";
+
+function getElementAttributeValue(node: AST.VElement, name: string) {
+ const attribute = getElementAttribute(node, name);
+ return attribute && getAttributeValue(attribute);
+}
+
+export default getElementAttributeValue;
diff --git a/src/utils/getElementType.js b/src/utils/getElementType.ts
similarity index 57%
rename from src/utils/getElementType.js
rename to src/utils/getElementType.ts
index e5885576..6f439fab 100644
--- a/src/utils/getElementType.js
+++ b/src/utils/getElementType.ts
@@ -1,7 +1,9 @@
-const getElementAttributeValue = require("./getElementAttributeValue");
-const makeKebabCase = require("./makeKebabCase");
+import type { AST } from "vue-eslint-parser";
-const getElementType = (node) => {
+import getElementAttributeValue from "./getElementAttributeValue";
+import makeKebabCase from "./makeKebabCase";
+
+function getElementType(node: AST.VElement) {
let is = getElementAttributeValue(node, "is");
// If we could not parse the `is` value into a simple literal, we're going to
@@ -12,6 +14,6 @@ const getElementType = (node) => {
}
return makeKebabCase(is || node.rawName);
-};
+}
-module.exports = getElementType;
+export default getElementType;
diff --git a/src/utils/getLiteralAttributeValue.js b/src/utils/getLiteralAttributeValue.js
deleted file mode 100644
index dd0fc57d..00000000
--- a/src/utils/getLiteralAttributeValue.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const getLiteralAttributeValue = (node, name) => {
- for (const attribute of node.startTag.attributes) {
- const { key, value } = attribute;
-
- if (!attribute.directive && key.name === name && value) {
- return value.value;
- }
-
- if (
- attribute.directive &&
- key.name.name === "bind" &&
- key.argument &&
- key.argument.name === name &&
- value &&
- value.expression &&
- value.expression.type === "Literal"
- ) {
- return value.expression.value;
- }
- }
-
- return null;
-};
-
-module.exports = getLiteralAttributeValue;
diff --git a/src/utils/getLiteralAttributeValue.ts b/src/utils/getLiteralAttributeValue.ts
new file mode 100644
index 00000000..c57352a5
--- /dev/null
+++ b/src/utils/getLiteralAttributeValue.ts
@@ -0,0 +1,30 @@
+import type { AST } from "vue-eslint-parser";
+
+function getLiteralAttributeValue(node: AST.VElement, name: string) {
+ for (const attribute of node.startTag.attributes) {
+ if (
+ !attribute.directive &&
+ attribute.key.name === name &&
+ attribute.value
+ ) {
+ return attribute.value.value;
+ }
+
+ if (
+ attribute.directive &&
+ attribute.key.name.name === "bind" &&
+ attribute.key.argument &&
+ attribute.key.argument.type === "VIdentifier" &&
+ attribute.key.argument.name === name &&
+ attribute.value &&
+ attribute.value.expression &&
+ attribute.value.expression.type === "Literal"
+ ) {
+ return attribute.value.expression.value;
+ }
+ }
+
+ return null;
+}
+
+export default getLiteralAttributeValue;
diff --git a/src/utils/hasAccessibleChild.js b/src/utils/hasAccessibleChild.ts
similarity index 65%
rename from src/utils/hasAccessibleChild.js
rename to src/utils/hasAccessibleChild.ts
index 9c03e1d4..354cc53c 100644
--- a/src/utils/hasAccessibleChild.js
+++ b/src/utils/hasAccessibleChild.ts
@@ -1,8 +1,13 @@
-const getElementType = require("./getElementType");
-const isHiddenFromScreenReader = require("./isHiddenFromScreenReader");
+import type { AST } from "vue-eslint-parser";
-const hasAccessibleChild = (node, accessibleChildTypes = []) =>
- node.children.some((child) => {
+import getElementType from "./getElementType";
+import isHiddenFromScreenReader from "./isHiddenFromScreenReader";
+
+function hasAccessibleChild(
+ node: AST.VElement,
+ accessibleChildTypes: string[] = []
+): boolean {
+ return node.children.some((child) => {
switch (child.type) {
case "VText":
return child.value.trim().length > 0;
@@ -25,5 +30,6 @@ const hasAccessibleChild = (node, accessibleChildTypes = []) =>
return false;
}
});
+}
-module.exports = hasAccessibleChild;
+export default hasAccessibleChild;
diff --git a/src/utils/hasAriaLabel.js b/src/utils/hasAriaLabel.js
deleted file mode 100644
index 2620dc7f..00000000
--- a/src/utils/hasAriaLabel.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const getElementAttributeValue = require("./getElementAttributeValue");
-
-const hasAriaLabel = (node) =>
- getElementAttributeValue(node, "aria-label") ||
- getElementAttributeValue(node, "aria-labelledby");
-
-module.exports = hasAriaLabel;
diff --git a/src/utils/hasAriaLabel.ts b/src/utils/hasAriaLabel.ts
new file mode 100644
index 00000000..ee950f96
--- /dev/null
+++ b/src/utils/hasAriaLabel.ts
@@ -0,0 +1,12 @@
+import type { AST } from "vue-eslint-parser";
+
+import getElementAttributeValue from "./getElementAttributeValue";
+
+function hasAriaLabel(node: AST.VElement) {
+ return (
+ getElementAttributeValue(node, "aria-label") ||
+ getElementAttributeValue(node, "aria-labelledby")
+ );
+}
+
+export default hasAriaLabel;
diff --git a/src/utils/hasContent.js b/src/utils/hasContent.js
deleted file mode 100644
index 91b28a41..00000000
--- a/src/utils/hasContent.js
+++ /dev/null
@@ -1,31 +0,0 @@
-const getElementAttributeValue = require("./getElementAttributeValue");
-const getElementType = require("./getElementType");
-const hasAccessibleChild = require("./hasAccessibleChild");
-const isHiddenFromScreenReader = require("./isHiddenFromScreenReader");
-
-const hasDirective = (node, name) =>
- node.startTag.attributes.some(
- (attribute) => attribute.directive && attribute.key.name.name === name
- );
-
-const hasChildImageWithAlt = (node) =>
- node.children.some((child) => {
- if (child.type === "VElement") {
- if (
- !isHiddenFromScreenReader(child) &&
- getElementType(child) === "img" &&
- getElementAttributeValue(child, "alt")
- ) {
- return true;
- }
- return hasChildImageWithAlt(child);
- }
- });
-
-const hasContent = (node, accessibleChildTypes) =>
- hasAccessibleChild(node, accessibleChildTypes) ||
- hasDirective(node, "text") ||
- hasDirective(node, "html") ||
- hasChildImageWithAlt(node);
-
-module.exports = hasContent;
diff --git a/src/utils/hasContent.ts b/src/utils/hasContent.ts
new file mode 100644
index 00000000..103dd840
--- /dev/null
+++ b/src/utils/hasContent.ts
@@ -0,0 +1,38 @@
+import type { AST } from "vue-eslint-parser";
+
+import getElementAttributeValue from "./getElementAttributeValue";
+import getElementType from "./getElementType";
+import hasAccessibleChild from "./hasAccessibleChild";
+import isHiddenFromScreenReader from "./isHiddenFromScreenReader";
+
+function hasDirective(node: AST.VElement, name: string) {
+ return node.startTag.attributes.some(
+ (attribute) => attribute.directive && attribute.key.name.name === name
+ );
+}
+
+function hasChildImageWithAlt(node: AST.VElement): boolean {
+ return node.children.some((child) => {
+ if (child.type === "VElement") {
+ if (
+ !isHiddenFromScreenReader(child) &&
+ getElementType(child) === "img" &&
+ getElementAttributeValue(child, "alt")
+ ) {
+ return true;
+ }
+ return hasChildImageWithAlt(child);
+ }
+ });
+}
+
+function hasContent(node: AST.VElement, accessibleChildTypes: string[]) {
+ return (
+ hasAccessibleChild(node, accessibleChildTypes) ||
+ hasDirective(node, "text") ||
+ hasDirective(node, "html") ||
+ hasChildImageWithAlt(node)
+ );
+}
+
+export default hasContent;
diff --git a/src/utils/hasOnDirective.js b/src/utils/hasOnDirective.js
deleted file mode 100644
index 50aae24f..00000000
--- a/src/utils/hasOnDirective.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const hasOnDirective = (node, name) =>
- node.startTag.attributes.some((attribute) => {
- const { key, value } = attribute;
-
- return (
- attribute.directive &&
- key.name.name === "on" &&
- key.argument &&
- key.argument.name === name &&
- value &&
- value.expression &&
- (value.expression.type === "Identifier" || !!value.expression.body)
- );
- });
-
-module.exports = hasOnDirective;
diff --git a/src/utils/hasOnDirective.ts b/src/utils/hasOnDirective.ts
new file mode 100644
index 00000000..c7a53a29
--- /dev/null
+++ b/src/utils/hasOnDirective.ts
@@ -0,0 +1,19 @@
+import type { AST } from "vue-eslint-parser";
+
+function hasOnDirective(node: AST.VElement, name: string) {
+ return node.startTag.attributes.some((attribute) => {
+ return (
+ attribute.directive &&
+ attribute.key.name.name === "on" &&
+ attribute.key.argument &&
+ attribute.key.argument.type === "VIdentifier" &&
+ attribute.key.argument.name === name &&
+ attribute.value &&
+ attribute.value.expression &&
+ (attribute.value.expression.type === "Identifier" ||
+ !!(attribute.value.expression as any).body)
+ );
+ });
+}
+
+export default hasOnDirective;
diff --git a/src/utils/hasOnDirectives.js b/src/utils/hasOnDirectives.js
deleted file mode 100644
index b86c663a..00000000
--- a/src/utils/hasOnDirectives.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const hasOnDirective = require("./hasOnDirective");
-
-const hasOnDirectives = (node, names) =>
- names.some((name) => hasOnDirective(node, name));
-
-module.exports = hasOnDirectives;
diff --git a/src/utils/hasOnDirectives.ts b/src/utils/hasOnDirectives.ts
new file mode 100644
index 00000000..72af247d
--- /dev/null
+++ b/src/utils/hasOnDirectives.ts
@@ -0,0 +1,9 @@
+import type { AST } from "vue-eslint-parser";
+
+import hasOnDirective from "./hasOnDirective";
+
+function hasOnDirectives(node: AST.VElement, names: string[]) {
+ return names.some((name) => hasOnDirective(node, name));
+}
+
+export default hasOnDirectives;
diff --git a/src/utils/isAriaHidden.js b/src/utils/isAriaHidden.js
deleted file mode 100644
index 0c08398c..00000000
--- a/src/utils/isAriaHidden.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const isHiddenFromScreenReader = require("./isHiddenFromScreenReader");
-
-const isAriaHidden = (node) => {
- if (!node || node.type !== "VElement") {
- return false;
- }
-
- return isHiddenFromScreenReader(node) || isAriaHidden(node.parent);
-};
-
-module.exports = isAriaHidden;
diff --git a/src/utils/isAriaHidden.ts b/src/utils/isAriaHidden.ts
new file mode 100644
index 00000000..b30e2933
--- /dev/null
+++ b/src/utils/isAriaHidden.ts
@@ -0,0 +1,13 @@
+import type { AST } from "vue-eslint-parser";
+
+import isHiddenFromScreenReader from "./isHiddenFromScreenReader";
+
+function isAriaHidden(node: AST.VDocumentFragment | AST.VElement): boolean {
+ if (node.type !== "VElement") {
+ return false;
+ }
+
+ return isHiddenFromScreenReader(node) || isAriaHidden(node.parent);
+}
+
+export default isAriaHidden;
diff --git a/src/utils/isAttribute.js b/src/utils/isAttribute.js
deleted file mode 100644
index bff218dc..00000000
--- a/src/utils/isAttribute.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const isAttribute = (node, name) => {
- const { key } = node;
-
- return (
- (!node.directive && key.name === name) ||
- (node.directive &&
- key.name.name === "bind" &&
- key.argument &&
- key.argument.name === name)
- );
-};
-
-module.exports = isAttribute;
diff --git a/src/utils/isAttribute.ts b/src/utils/isAttribute.ts
new file mode 100644
index 00000000..0f683d18
--- /dev/null
+++ b/src/utils/isAttribute.ts
@@ -0,0 +1,16 @@
+import type { AST } from "vue-eslint-parser";
+
+function isAttribute(node: AST.VAttribute | AST.VDirective, name: string) {
+ if (!node.directive) {
+ return node.key.name === name;
+ }
+
+ return (
+ node.key.name.name === "bind" &&
+ node.key.argument &&
+ node.key.argument.type === "VIdentifier" &&
+ node.key.argument.name === name
+ );
+}
+
+export default isAttribute;
diff --git a/src/utils/isHiddenFromScreenReader.js b/src/utils/isHiddenFromScreenReader.js
deleted file mode 100644
index 0f874bc7..00000000
--- a/src/utils/isHiddenFromScreenReader.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const getElementAttribute = require("./getElementAttribute");
-const getAttributeValue = require("./getAttributeValue");
-
-const isHiddenFromScreenReader = (node) => {
- const attribute = getElementAttribute(node, "aria-hidden");
- if (!attribute) {
- return false;
- }
-
- const value = getAttributeValue(attribute);
- return (value || "").toString() !== "false";
-};
-
-module.exports = isHiddenFromScreenReader;
diff --git a/src/utils/isHiddenFromScreenReader.ts b/src/utils/isHiddenFromScreenReader.ts
new file mode 100644
index 00000000..5a2186da
--- /dev/null
+++ b/src/utils/isHiddenFromScreenReader.ts
@@ -0,0 +1,16 @@
+import type { AST } from "vue-eslint-parser";
+
+import getElementAttribute from "./getElementAttribute";
+import getAttributeValue from "./getAttributeValue";
+
+function isHiddenFromScreenReader(node: AST.VElement) {
+ const attribute = getElementAttribute(node, "aria-hidden");
+ if (!attribute) {
+ return false;
+ }
+
+ const value = getAttributeValue(attribute);
+ return (value || "").toString() !== "false";
+}
+
+export default isHiddenFromScreenReader;
diff --git a/src/utils/isInteractiveElement.js b/src/utils/isInteractiveElement.ts
similarity index 75%
rename from src/utils/isInteractiveElement.js
rename to src/utils/isInteractiveElement.ts
index 52955c2e..5222f46f 100644
--- a/src/utils/isInteractiveElement.js
+++ b/src/utils/isInteractiveElement.ts
@@ -1,7 +1,8 @@
-const { elementRoles, dom, roles } = require("aria-query");
+import type { AST } from "vue-eslint-parser";
+import { elementRoles, dom, roles } from "aria-query";
-const getElementType = require("./getElementType");
-const matchesElementRole = require("./matchesElementRole");
+import getElementType from "./getElementType";
+import matchesElementRole from "./matchesElementRole";
// "toolbar" does not descend from widget, but it does support
// aria-activedescendant, thus in practice we treat it as a widget.
@@ -26,7 +27,7 @@ for (const [element, names] of elementRoles) {
}
}
-const isInteractiveElement = (node) => {
+function isInteractiveElement(node: AST.VElement) {
const elementType = getElementType(node);
if (!dom.has(elementType)) {
@@ -36,6 +37,6 @@ const isInteractiveElement = (node) => {
return interactiveElements.some((elementRole) =>
matchesElementRole(node, elementRole)
);
-};
+}
-module.exports = isInteractiveElement;
+export default isInteractiveElement;
diff --git a/src/utils/isPresentationRole.js b/src/utils/isPresentationRole.js
deleted file mode 100644
index 72a883cb..00000000
--- a/src/utils/isPresentationRole.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const getElementAttributeValue = require("./getElementAttributeValue");
-
-const isPresentationRole = (node) => {
- const role = getElementAttributeValue(node, "role");
- return role && ["presentation", "none"].includes(role);
-};
-
-module.exports = isPresentationRole;
diff --git a/src/utils/isPresentationRole.ts b/src/utils/isPresentationRole.ts
new file mode 100644
index 00000000..ad4ddf1f
--- /dev/null
+++ b/src/utils/isPresentationRole.ts
@@ -0,0 +1,10 @@
+import type { AST } from "vue-eslint-parser";
+
+import getElementAttributeValue from "./getElementAttributeValue";
+
+function isPresentationRole(node: AST.VElement) {
+ const role = getElementAttributeValue(node, "role");
+ return role === "presentation" || role === "none";
+}
+
+export default isPresentationRole;
diff --git a/src/utils/makeDocsURL.js b/src/utils/makeDocsURL.js
deleted file mode 100644
index 01818817..00000000
--- a/src/utils/makeDocsURL.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const makeDocsURL = (name) =>
- `https://github.com/vue-a11y/eslint-plugin-vuejs-accessibility/blob/master/docs/${name}.md`;
-
-module.exports = makeDocsURL;
diff --git a/src/utils/makeDocsURL.ts b/src/utils/makeDocsURL.ts
new file mode 100644
index 00000000..3f041d8b
--- /dev/null
+++ b/src/utils/makeDocsURL.ts
@@ -0,0 +1,5 @@
+function makeDocsURL(name: string) {
+ return `https://github.com/vue-a11y/eslint-plugin-vuejs-accessibility/blob/master/docs/${name}.md`;
+}
+
+export default makeDocsURL;
diff --git a/src/utils/makeKebabCase.js b/src/utils/makeKebabCase.js
deleted file mode 100644
index 80e43a01..00000000
--- a/src/utils/makeKebabCase.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const makeKebabCase = (value) =>
- value
- .replace(/_/gu, "-")
- .replace(/\B([A-Z])/gu, "-$1")
- .toLowerCase();
-
-module.exports = makeKebabCase;
diff --git a/src/utils/makeKebabCase.ts b/src/utils/makeKebabCase.ts
new file mode 100644
index 00000000..d83befee
--- /dev/null
+++ b/src/utils/makeKebabCase.ts
@@ -0,0 +1,8 @@
+function makeKebabCase(value: string) {
+ return value
+ .replace(/_/gu, "-")
+ .replace(/\B([A-Z])/gu, "-$1")
+ .toLowerCase();
+}
+
+export default makeKebabCase;
diff --git a/src/utils/matchesElementRole.js b/src/utils/matchesElementRole.js
deleted file mode 100644
index 1ba57b91..00000000
--- a/src/utils/matchesElementRole.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const getElementType = require("./getElementType");
-const getElementAttributeValue = require("./getElementAttributeValue");
-
-const matchesElementRole = (node, elementRole) => {
- const { name, attributes } = elementRole;
- if (name !== getElementType(node)) {
- return false;
- }
-
- return (attributes || []).every((attribute) => {
- const value = getElementAttributeValue(node, attribute.name);
-
- if (attribute.value) {
- return value === attribute.value;
- }
-
- if (attribute.constraints) {
- switch (attribute.constraints[0]) {
- case "set":
- return value;
- case "undefined":
- return !value;
- default:
- return null;
- }
- }
-
- return value;
- });
-};
-
-module.exports = matchesElementRole;
diff --git a/src/utils/matchesElementRole.ts b/src/utils/matchesElementRole.ts
new file mode 100644
index 00000000..95ffad51
--- /dev/null
+++ b/src/utils/matchesElementRole.ts
@@ -0,0 +1,43 @@
+import type { AST } from "vue-eslint-parser";
+import type { ARIARoleRelationConcept } from "aria-query";
+
+import getElementType from "./getElementType";
+import getElementAttributeValue from "./getElementAttributeValue";
+
+function matchesElementRole(
+ node: AST.VElement,
+ elementRole: ARIARoleRelationConcept
+) {
+ const { name, attributes } = elementRole;
+ if (name !== getElementType(node)) {
+ return false;
+ }
+
+ return (attributes || []).every((attribute) => {
+ const value = getElementAttributeValue(node, attribute.name);
+
+ if (attribute.value) {
+ return value === attribute.value;
+ }
+
+ if (attribute.constraints) {
+ // TODO: We shouldn't have to cast this to any. Are we using the wrong
+ // comparison function here? Is this maybe for an old version of
+ // aria-query?
+ const constraint = attribute.constraints[0] as any;
+
+ switch (constraint) {
+ case "set":
+ return value;
+ case "undefined":
+ return !value;
+ default:
+ return null;
+ }
+ }
+
+ return value;
+ });
+}
+
+export default matchesElementRole;
diff --git a/tsconfig.build.json b/tsconfig.build.json
new file mode 100644
index 00000000..fa35499c
--- /dev/null
+++ b/tsconfig.build.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "exclude": ["src/rules/__tests__", "jest.setup.ts"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..8f674cd6
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "target": "es2019",
+ "module": "commonjs",
+ "strict": true,
+ "esModuleInterop": true,
+ "resolveJsonModule": true,
+ "outDir": "./dist"
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 7385ff91..a4ce5b1e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -16,10 +16,10 @@
dependencies:
"@babel/highlight" "^7.12.13"
-"@babel/compat-data@^7.13.15":
- version "7.14.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919"
- integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==
+"@babel/compat-data@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58"
+ integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==
"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
version "7.14.3"
@@ -52,13 +52,13 @@
source-map "^0.5.0"
"@babel/helper-compilation-targets@^7.13.16":
- version "7.13.16"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c"
- integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516"
+ integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==
dependencies:
- "@babel/compat-data" "^7.13.15"
+ "@babel/compat-data" "^7.14.4"
"@babel/helper-validator-option" "^7.12.17"
- browserslist "^4.14.5"
+ browserslist "^4.16.6"
semver "^6.3.0"
"@babel/helper-function-name@^7.14.2":
@@ -118,14 +118,14 @@
integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
"@babel/helper-replace-supers@^7.13.12":
- version "7.14.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600"
- integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836"
+ integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==
dependencies:
"@babel/helper-member-expression-to-functions" "^7.13.12"
"@babel/helper-optimise-call-expression" "^7.12.13"
"@babel/traverse" "^7.14.2"
- "@babel/types" "^7.14.2"
+ "@babel/types" "^7.14.4"
"@babel/helper-simple-access@^7.13.12":
version "7.13.12"
@@ -170,9 +170,9 @@
js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.7.2":
- version "7.14.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298"
- integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18"
+ integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -303,10 +303,10 @@
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
- version "7.14.2"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3"
- integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==
+"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0"
+ integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==
dependencies:
"@babel/helper-validator-identifier" "^7.14.0"
to-fast-properties "^2.0.0"
@@ -505,6 +505,17 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
+"@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+
"@jest/types@^27.0.2":
version "27.0.2"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.2.tgz#e153d6c46bda0f2589f0702b071f9898c7bbd37e"
@@ -516,6 +527,27 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
+"@nodelib/fs.scandir@2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
+ integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.4"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
+ integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
+ integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.4"
+ fastq "^1.6.0"
+
"@sinonjs/commons@^1.7.0":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
@@ -524,9 +556,9 @@
type-detect "4.0.8"
"@sinonjs/fake-timers@^7.0.2":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e"
- integrity sha512-hAEzXi6Wbvlb67NnGMGSNOeAflLVnMa4yliPU/ty1qjgW/vAletH15/v/esJwASSIA0YlIyjnloenFbEZc9q9A==
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
dependencies:
"@sinonjs/commons" "^1.7.0"
@@ -535,6 +567,11 @@
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+"@types/aria-query@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b"
+ integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==
+
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
version "7.1.14"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402"
@@ -568,6 +605,32 @@
dependencies:
"@babel/types" "^7.3.0"
+"@types/eslint-scope@^3.7.0":
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
+ integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint-visitor-keys@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
+ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
+
+"@types/eslint@*":
+ version "7.2.12"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.12.tgz#fefaa48a4db2415b621fe315e4baeedde525927e"
+ integrity sha512-HjikV/jX6e0Pg4DcB+rtOBKSrG6w5IaxWpmi3efL/eLxMz5lZTK+W1DKERrX5a+mNzL78axfsDNXu7JHFP4uLg==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "0.0.47"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
+ integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
+
"@types/graceful-fs@^4.1.2":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
@@ -594,6 +657,19 @@
dependencies:
"@types/istanbul-lib-report" "*"
+"@types/jest@^26.0.23":
+ version "26.0.23"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7"
+ integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==
+ dependencies:
+ jest-diff "^26.0.0"
+ pretty-format "^26.0.0"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.7":
+ version "7.0.7"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
+ integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+
"@types/minimatch@^3.0.3":
version "3.0.4"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
@@ -619,6 +695,13 @@
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9"
integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==
+"@types/yargs@^15.0.0":
+ version "15.0.13"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc"
+ integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@types/yargs@^16.0.0":
version "16.0.3"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01"
@@ -626,6 +709,76 @@
dependencies:
"@types/yargs-parser" "*"
+"@typescript-eslint/eslint-plugin@^4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.0.tgz#12bbd6ebd5e7fabd32e48e1e60efa1f3554a3242"
+ integrity sha512-yA7IWp+5Qqf+TLbd8b35ySFOFzUfL7i+4If50EqvjT6w35X8Lv0eBHb6rATeWmucks37w+zV+tWnOXI9JlG6Eg==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "4.26.0"
+ "@typescript-eslint/scope-manager" "4.26.0"
+ debug "^4.3.1"
+ functional-red-black-tree "^1.0.1"
+ lodash "^4.17.21"
+ regexpp "^3.1.0"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/experimental-utils@4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.0.tgz#ba7848b3f088659cdf71bce22454795fc55be99a"
+ integrity sha512-TH2FO2rdDm7AWfAVRB5RSlbUhWxGVuxPNzGT7W65zVfl8H/WeXTk1e69IrcEVsBslrQSTDKQSaJD89hwKrhdkw==
+ dependencies:
+ "@types/json-schema" "^7.0.7"
+ "@typescript-eslint/scope-manager" "4.26.0"
+ "@typescript-eslint/types" "4.26.0"
+ "@typescript-eslint/typescript-estree" "4.26.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/parser@^4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.0.tgz#31b6b732c9454f757b020dab9b6754112aa5eeaf"
+ integrity sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "4.26.0"
+ "@typescript-eslint/types" "4.26.0"
+ "@typescript-eslint/typescript-estree" "4.26.0"
+ debug "^4.3.1"
+
+"@typescript-eslint/scope-manager@4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.0.tgz#60d1a71df162404e954b9d1c6343ff3bee496194"
+ integrity sha512-G6xB6mMo4xVxwMt5lEsNTz3x4qGDt0NSGmTBNBPJxNsrTXJSm21c6raeYroS2OwQsOyIXqKZv266L/Gln1BWqg==
+ dependencies:
+ "@typescript-eslint/types" "4.26.0"
+ "@typescript-eslint/visitor-keys" "4.26.0"
+
+"@typescript-eslint/types@4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.0.tgz#7c6732c0414f0a69595f4f846ebe12616243d546"
+ integrity sha512-rADNgXl1kS/EKnDr3G+m7fB9yeJNnR9kF7xMiXL6mSIWpr3Wg5MhxyfEXy/IlYthsqwBqHOr22boFbf/u6O88A==
+
+"@typescript-eslint/typescript-estree@4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.0.tgz#aea17a40e62dc31c63d5b1bbe9a75783f2ce7109"
+ integrity sha512-GHUgahPcm9GfBuy3TzdsizCcPjKOAauG9xkz9TR8kOdssz2Iz9jRCSQm6+aVFa23d5NcSpo1GdHGSQKe0tlcbg==
+ dependencies:
+ "@typescript-eslint/types" "4.26.0"
+ "@typescript-eslint/visitor-keys" "4.26.0"
+ debug "^4.3.1"
+ globby "^11.0.3"
+ is-glob "^4.0.1"
+ semver "^7.3.5"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/visitor-keys@4.26.0":
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.0.tgz#26d2583169222815be4dcd1da4fe5459bc3bcc23"
+ integrity sha512-cw4j8lH38V1ycGBbF+aFiLUls9Z0Bw8QschP3mkth50BbWzgFS33ISIgBzUMuQ2IdahoEv/rXstr8Zhlz4B1Zg==
+ dependencies:
+ "@typescript-eslint/types" "4.26.0"
+ eslint-visitor-keys "^2.0.0"
+
abab@^2.0.3, abab@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
@@ -655,9 +808,9 @@ acorn@^7.1.1, acorn@^7.4.0:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.2.4:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0"
- integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88"
+ integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==
agent-base@6:
version "6.0.2"
@@ -856,7 +1009,7 @@ browser-process-hrtime@^1.0.0:
resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
-browserslist@^4.14.5:
+browserslist@^4.16.6:
version "4.16.6"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
@@ -867,6 +1020,13 @@ browserslist@^4.14.5:
escalade "^3.1.1"
node-releases "^1.1.71"
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
bser@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
@@ -874,7 +1034,7 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
-buffer-from@^1.0.0:
+buffer-from@1.x, buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
@@ -895,9 +1055,9 @@ camelcase@^6.2.0:
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
caniuse-lite@^1.0.30001219:
- version "1.0.30001230"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71"
- integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==
+ version "1.0.30001232"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001232.tgz#2ebc8b6a77656fd772ab44a82a332a26a17e9527"
+ integrity sha512-e4Gyp7P8vqC2qV2iHA+cJNf/yqUKOShXQOJHQt81OHxlIZl/j/j3soEA0adAQi8CPUQgvOdDENyQ5kd6a6mNSg==
chalk@^2.0.0:
version "2.4.2"
@@ -930,9 +1090,9 @@ char-regex@^1.0.2:
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
ci-info@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a"
- integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6"
+ integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==
cjs-module-lexer@^1.0.0:
version "1.2.1"
@@ -1007,9 +1167,9 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
safe-buffer "~5.1.1"
core-js-pure@^3.0.0:
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.0.tgz#9d267fb47d1d7046cfbc05e7b67bb235b6735355"
- integrity sha512-7VTvXbsMxROvzPAVczLgfizR8CyYnvWPrb1eGrtlZAJfjQWEHLofVfCKljLHdpazTfpaziRORwUH/kfGDKvpdA==
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1"
+ integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw==
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
@@ -1046,7 +1206,7 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
@@ -1083,11 +1243,23 @@ detect-newline@^3.0.0:
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+diff-sequences@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
+ integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
+
diff-sequences@^27.0.1:
version "27.0.1"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.1.tgz#9c9801d52ed5f576ff0a20e3022a13ee6e297e7c"
integrity sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -1103,9 +1275,9 @@ domexception@^2.0.1:
webidl-conversions "^5.0.0"
electron-to-chromium@^1.3.723:
- version "1.3.739"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9"
- integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==
+ version "1.3.743"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz#fcec24d6d647cb84fd796b42caa1b4039a180894"
+ integrity sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg==
emittery@^0.8.1:
version "0.8.1"
@@ -1190,6 +1362,13 @@ eslint-utils@^2.1.0:
dependencies:
eslint-visitor-keys "^1.1.0"
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
@@ -1313,9 +1492,9 @@ execa@^4.0.0:
strip-final-newline "^2.0.0"
execa@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376"
- integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.1.tgz#aee63b871c9b2cb56bc9addcd3c70a785c6bf0d1"
+ integrity sha512-4hFTjFbFzQa3aCLobpbPJR/U+VoL1wdV5ozOWjeet0AWDeYr9UFGM1eUFWHX+VtOWFq4p0xXUXfW1YxUaP4fpw==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.0"
@@ -1349,7 +1528,19 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-json-stable-stringify@^2.0.0:
+fast-glob@^3.1.1:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+ integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
+
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@@ -1359,6 +1550,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+fastq@^1.6.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
+ integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+ dependencies:
+ reusify "^1.0.4"
+
fb-watchman@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
@@ -1457,7 +1655,7 @@ get-stream@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-glob-parent@^5.0.0:
+glob-parent@^5.0.0, glob-parent@^5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -1489,12 +1687,24 @@ globals@^12.1.0:
type-fest "^0.8.1"
globals@^13.6.0:
- version "13.8.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3"
- integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==
+ version "13.9.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb"
+ integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==
dependencies:
type-fest "^0.20.2"
+globby@^11.0.3:
+ version "11.0.3"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
+ integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
graceful-fs@^4.2.4:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
@@ -1793,6 +2003,16 @@ jest-config@^27.0.3:
micromatch "^4.0.4"
pretty-format "^27.0.2"
+jest-diff@^26.0.0:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
+ integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
jest-diff@^27.0.2:
version "27.0.2"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.2.tgz#f315b87cee5dc134cf42c2708ab27375cc3f5a7e"
@@ -1846,6 +2066,11 @@ jest-environment-node@^27.0.3:
jest-mock "^27.0.3"
jest-util "^27.0.2"
+jest-get-type@^26.3.0:
+ version "26.3.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
+ integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
+
jest-get-type@^27.0.1:
version "27.0.1"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815"
@@ -2066,7 +2291,7 @@ jest-snapshot@^27.0.2:
pretty-format "^27.0.2"
semver "^7.3.2"
-jest-util@^27.0.2:
+jest-util@^27.0.0, jest-util@^27.0.2:
version "27.0.2"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.2.tgz#fc2c7ace3c75ae561cf1e5fdb643bf685a5be7c7"
integrity sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==
@@ -2187,7 +2412,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-json5@^2.1.2:
+json5@2.x, json5@^2.1.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
@@ -2242,7 +2467,7 @@ lodash.truncate@^4.4.2:
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
-lodash@^4.17.15, lodash@^4.7.0:
+lodash@4.x, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -2261,6 +2486,11 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
+make-error@1.x:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
makeerror@1.0.x:
version "1.0.11"
resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
@@ -2273,7 +2503,12 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-micromatch@^4.0.4:
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.2, micromatch@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
@@ -2310,6 +2545,11 @@ minimist@^1.2.5:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+mkdirp@1.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
mri@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6"
@@ -2462,7 +2702,12 @@ path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-picomatch@^2.0.4, picomatch@^2.2.3:
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
@@ -2496,6 +2741,16 @@ prettier@^2.1.1:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18"
integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==
+pretty-format@^26.0.0, pretty-format@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
+ integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^17.0.1"
+
pretty-format@^27.0.2:
version "27.0.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.2.tgz#9283ff8c4f581b186b2d4da461617143dca478a4"
@@ -2549,6 +2804,11 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
react-is@^17.0.1:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
@@ -2599,6 +2859,11 @@ resolve@^1.20.0:
is-core-module "^2.2.0"
path-parse "^1.0.6"
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
@@ -2606,6 +2871,13 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -2623,18 +2895,18 @@ saxes@^5.0.1:
dependencies:
xmlchars "^2.2.0"
-semver@^6.0.0, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@^7.2.1, semver@^7.3.2:
+semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -2851,6 +3123,34 @@ tr46@^2.0.2:
dependencies:
punycode "^2.1.1"
+ts-jest@^27.0.1:
+ version "27.0.2"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.2.tgz#acc1525d5fd25c107c777c3b80a11365db579aa1"
+ integrity sha512-pozjHOOfm+sbv9kXCvTFVyDntWvuJztzkNFql/akD75hSMZ2jsbidVauOhBRImAopXohqcLtPK/NTTIS8Y49Ug==
+ dependencies:
+ bs-logger "0.x"
+ buffer-from "1.x"
+ fast-json-stable-stringify "2.x"
+ jest-util "^27.0.0"
+ json5 "2.x"
+ lodash "4.x"
+ make-error "1.x"
+ mkdirp "1.x"
+ semver "7.x"
+ yargs-parser "20.x"
+
+tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -2892,6 +3192,11 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
+typescript@^4.2.4:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805"
+ integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==
+
universalify@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -3043,7 +3348,7 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-yargs-parser@^20.2.2:
+yargs-parser@20.x, yargs-parser@^20.2.2:
version "20.2.7"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==