Skip to content

Commit 3af30ec

Browse files
authored
Merge pull request #148 from vue-a11y/ts
TypeScript
2 parents b6d87b3 + 5f883b6 commit 3af30ec

File tree

95 files changed

+1283
-686
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+1283
-686
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/.eslintcache
22
/.husky/
3+
/dist/
34
/node_modules/

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
.prettierignore
55
LICENSE
66
yarn.lock
7+
dist

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
99
### Changed
1010

1111
- Ensure directives that have identifiers for values are counted as present in the element.
12+
- Convert over to using TypeScript for development.
1213

1314
## [0.6.2] - 2021-05-26
1415

bin/lint

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#!/usr/bin/env node
22

3-
const { CLIEngine } = require("eslint");
4-
const a11yPlugin = require("../src");
3+
const { ESLint } = require("eslint");
4+
const a11yPlugin = require("../dist");
55

66
(async function () {
7-
const cli = new CLIEngine({ baseConfig: a11yPlugin.configs.recommended });
7+
const cli = new ESLint({ baseConfig: a11yPlugin.configs.recommended });
88
cli.addPlugin("eslint-plugin-vuejs-accessibility", a11yPlugin);
99

1010
const report = cli.executeOnFiles(process.argv.slice(2));

jest.setup.js

Lines changed: 0 additions & 10 deletions
This file was deleted.

jest.setup.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { RuleTester } from "eslint";
2+
3+
interface JestRuleTester extends RuleTester {
4+
describe: (text: string, callback: () => void) => void;
5+
it: { title?: string } & ((text: string, callback: () => void) => void);
6+
}
7+
8+
const ruleTester = RuleTester as unknown as JestRuleTester;
9+
10+
ruleTester.describe = (text: string, callback: () => void) => {
11+
ruleTester.it.title = text;
12+
return callback.call(this);
13+
};
14+
15+
ruleTester.it = (text: string, callback: () => void) => {
16+
test(`${ruleTester.it.title}: ${text}`, callback);
17+
};

package.json

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
"name": "eslint-plugin-vuejs-accessibility",
33
"version": "0.6.2",
44
"description": "An eslint plugin for checking Vue.js files for accessibility",
5-
"main": "src/index.js",
5+
"main": "dist/src/index.js",
66
"scripts": {
77
"lint": "eslint --cache .",
8+
"prepublishOnly": "tsc -p tsconfig.build.json",
89
"test": "jest"
910
},
1011
"author": "Kevin Newton",
@@ -31,12 +32,20 @@
3132
"vue-eslint-parser": "^7.0.0"
3233
},
3334
"devDependencies": {
35+
"@types/aria-query": "^4.2.1",
36+
"@types/eslint-scope": "^3.7.0",
37+
"@types/eslint-visitor-keys": "^1.0.0",
38+
"@types/jest": "^26.0.23",
39+
"@typescript-eslint/eslint-plugin": "^4.26.0",
40+
"@typescript-eslint/parser": "^4.26.0",
3441
"eslint": "^7.3.1",
3542
"eslint-plugin-eslint-plugin": "^3.0.0",
3643
"husky": "^6.0.0",
3744
"jest": "^27.0.1",
3845
"prettier": "^2.1.1",
39-
"pretty-quick": "^3.0.0"
46+
"pretty-quick": "^3.0.0",
47+
"ts-jest": "^27.0.1",
48+
"typescript": "^4.2.4"
4049
},
4150
"eslintConfig": {
4251
"env": {
@@ -46,25 +55,33 @@
4655
},
4756
"extends": [
4857
"eslint:recommended",
49-
"plugin:eslint-plugin/recommended"
58+
"plugin:eslint-plugin/recommended",
59+
"plugin:@typescript-eslint/recommended"
5060
],
51-
"parserOptions": {
52-
"ecmaVersion": 2015
53-
},
61+
"parser": "@typescript-eslint/parser",
5462
"plugins": [
55-
"eslint-plugin"
56-
]
63+
"eslint-plugin",
64+
"@typescript-eslint"
65+
],
66+
"rules": {
67+
"@typescript-eslint/explicit-module-boundary-types": "off",
68+
"@typescript-eslint/no-explicit-any": "off"
69+
}
5770
},
71+
"eslintIgnore": [
72+
"dist"
73+
],
5874
"husky": {
5975
"hooks": {
6076
"pre-commit": "pretty-quick --staged"
6177
}
6278
},
6379
"jest": {
80+
"preset": "ts-jest",
6481
"setupFilesAfterEnv": [
65-
"./jest.setup.js"
82+
"./jest.setup.ts"
6683
],
67-
"testRegex": ".test.js$"
84+
"testRegex": ".test.ts$"
6885
},
6986
"prettier": {
7087
"trailingComma": "none"

src/index.js renamed to src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module.exports = {
1+
export default {
22
rules: {
33
"accessible-emoji": require("./rules/accessible-emoji"),
44
"alt-text": require("./rules/alt-text"),

src/rules/__tests__/accessible-emoji.test.js renamed to src/rules/__tests__/accessible-emoji.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../accessible-emoji");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../accessible-emoji";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("accessible-emoji", rule, {
55
valid: [

src/rules/__tests__/alt-text.test.js renamed to src/rules/__tests__/alt-text.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../alt-text");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../alt-text";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("alt-text", rule, {
55
valid: [

src/rules/__tests__/anchor-has-content.test.js renamed to src/rules/__tests__/anchor-has-content.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../anchor-has-content");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../anchor-has-content";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("anchor-has-content", rule, {
55
valid: [

src/rules/__tests__/aria-props.test.js renamed to src/rules/__tests__/aria-props.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../aria-props");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../aria-props";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("aria-props", rule, {
55
valid: ["<input aria-labelledby='address' />"],

src/rules/__tests__/aria-role.test.js renamed to src/rules/__tests__/aria-role.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../aria-role");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../aria-role";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("aria-role", rule, {
55
valid: [

src/rules/__tests__/aria-unsupported-elements.test.js renamed to src/rules/__tests__/aria-unsupported-elements.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../aria-unsupported-elements");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../aria-unsupported-elements";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("aria-unsupported-elements", rule, {
55
valid: ["<html />"],

src/rules/__tests__/click-events-have-key-events.test.js renamed to src/rules/__tests__/click-events-have-key-events.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../click-events-have-key-events");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../click-events-have-key-events";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("click-events-have-key-events", rule, {
55
valid: [

src/rules/__tests__/form-control-has-label.test.js renamed to src/rules/__tests__/form-control-has-label.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../form-control-has-label");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../form-control-has-label";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("form-control-has-label", rule, {
55
valid: [

src/rules/__tests__/heading-has-content.test.js renamed to src/rules/__tests__/heading-has-content.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../heading-has-content");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../heading-has-content";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("heading-has-content", rule, {
55
valid: [

src/rules/__tests__/iframe-has-title.test.js renamed to src/rules/__tests__/iframe-has-title.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../iframe-has-title");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../iframe-has-title";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("iframe-has-title", rule, {
55
valid: ["<iframe title='test' />", "<iframe :title='test' />"],

src/rules/__tests__/interactive-supports-focus.test.js renamed to src/rules/__tests__/interactive-supports-focus.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../interactive-supports-focus");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../interactive-supports-focus";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("interactive-supports-focus", rule, {
55
valid: [

src/rules/__tests__/label-has-for.test.js renamed to src/rules/__tests__/label-has-for.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../label-has-for");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../label-has-for";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("label-has-for", rule, {
55
valid: [

src/rules/__tests__/makeRuleTester.js

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/rules/__tests__/makeRuleTester.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import type { Rule } from "eslint";
2+
import { RuleTester } from "eslint";
3+
4+
type ValidCase = string | { code: string; options?: any[] };
5+
type InvalidCase = string | { code: string; options?: any[]; errors: any[] };
6+
type Config = { valid: ValidCase[]; invalid: InvalidCase[] };
7+
8+
const filename = "test.vue";
9+
const makeTemplate = (code: string) => `<template>${code}</template>`;
10+
11+
function makeValidExample(example: ValidCase) {
12+
if (typeof example === "string") {
13+
return { filename, code: makeTemplate(example) };
14+
}
15+
16+
return { ...example, filename, code: makeTemplate(example.code) };
17+
}
18+
19+
function makeInvalidExample(example: InvalidCase) {
20+
if (typeof example === "string") {
21+
return {
22+
filename,
23+
code: makeTemplate(example),
24+
errors: [{ messageId: "default" }]
25+
};
26+
}
27+
28+
return { ...example, filename, code: makeTemplate(example.code) };
29+
}
30+
31+
function makeRuleTester(name: string, rule: Rule.RuleModule, config: Config) {
32+
const ruleTester = new RuleTester({
33+
parser: require.resolve("vue-eslint-parser"),
34+
parserOptions: {
35+
ecmaVersion: 2015,
36+
sourceType: "module"
37+
}
38+
});
39+
40+
ruleTester.run(name, rule, {
41+
valid: config.valid.map(makeValidExample),
42+
invalid: config.invalid.map(makeInvalidExample)
43+
});
44+
}
45+
46+
export default makeRuleTester;

src/rules/__tests__/media-has-caption.test.js renamed to src/rules/__tests__/media-has-caption.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../media-has-caption");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../media-has-caption";
2+
import makeRuleTester from "./makeRuleTester";
33

44
const options = [
55
{

src/rules/__tests__/mouse-events-have-key-events.test.js renamed to src/rules/__tests__/mouse-events-have-key-events.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../mouse-events-have-key-events");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../mouse-events-have-key-events";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("mouse-events-have-key-events", rule, {
55
valid: [

src/rules/__tests__/no-access-key.test.js renamed to src/rules/__tests__/no-access-key.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../no-access-key");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../no-access-key";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("no-access-key", rule, {
55
valid: ["<div />", "<div accesskey />"],

src/rules/__tests__/no-autofocus.test.js renamed to src/rules/__tests__/no-autofocus.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../no-autofocus");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../no-autofocus";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("no-autofocus", rule, {
55
valid: [

src/rules/__tests__/no-distracting-elements.test.js renamed to src/rules/__tests__/no-distracting-elements.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../no-distracting-elements");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../no-distracting-elements";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("no-distracting-elements", rule, {
55
valid: ["<div />"],

src/rules/__tests__/no-onchange.test.js renamed to src/rules/__tests__/no-onchange.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../no-onchange");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../no-onchange";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("no-onchange", rule, {
55
valid: ["<select><option @blur='void 0' @change='void 0' /></select>"],

src/rules/__tests__/no-redundant-roles.test.js renamed to src/rules/__tests__/no-redundant-roles.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../no-redundant-roles");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../no-redundant-roles";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("no-redundant-roles", rule, {
55
valid: ["<a role='link' />", "<div role='link' />"],

src/rules/__tests__/role-has-required-aria-props.test.js renamed to src/rules/__tests__/role-has-required-aria-props.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../role-has-required-aria-props");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../role-has-required-aria-props";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("role-has-required-aria-props", rule, {
55
valid: [

src/rules/__tests__/tabindex-no-positive.test.js renamed to src/rules/__tests__/tabindex-no-positive.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const rule = require("../tabindex-no-positive");
2-
const makeRuleTester = require("./makeRuleTester");
1+
import rule from "../tabindex-no-positive";
2+
import makeRuleTester from "./makeRuleTester";
33

44
makeRuleTester("tabindex-no-positive", rule, {
55
valid: [

0 commit comments

Comments
 (0)