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: ["