Skip to content

Commit

Permalink
feat: adding missing-data-tid rule
Browse files Browse the repository at this point in the history
  • Loading branch information
Jairo Suarez committed Jul 22, 2023
1 parent 82556f2 commit db6b027
Show file tree
Hide file tree
Showing 8 changed files with 3,128 additions and 1 deletion.
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.DS_Store
node_modules/
.env
.nyc_output/
coverage/

# IDE user config
.vscode/
.idea/
.neovim/
.vs/

# Logs
yarn-error.log
npm-debug.log

# Build output
lib/
5 changes: 5 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }],
],
}
16 changes: 15 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"description": "An eslint plugin for vue tids",
"main": "lib/index.js",
"scripts": {
"build": "rimraf lib && babel src --out-dir lib",
"test": "mocha tests --recursive --reporter dot"
},
"repository": {
Expand All @@ -20,5 +21,18 @@
"bugs": {
"url": "https://github.com/xyos/eslint-plugin-vue-data-tids/issues"
},
"homepage": "https://github.com/xyos/eslint-plugin-vue-data-tids#readme"
"homepage": "https://github.com/xyos/eslint-plugin-vue-data-tids#readme",
"devDependencies": {
"@babel/cli": "^7.22.9",
"@babel/core": "^7.22.9",
"@babel/preset-env": "^7.22.9",
"mocha": "^10.2.0",
"nyc": "^15.1.0",
"rimraf": "^5.0.1"
},
"dependencies": {
"eslint": "^8.45.0",
"eslint-plugin-vue": "^9.15.1",
"requireindex": "^1.2.0"
}
}
10 changes: 10 additions & 0 deletions src/configs/base.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
'use strict'

module.exports = {
plugins: [
'data-tids',
],
rules: {
'data-tids/missing-data-tid': 'error',
},
}
12 changes: 12 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"use strict";
const path = require("path");
const requireindex = require("requireindex");

module.exports = {
meta: {
name: "eslint-plugin-vue-data-tids",
version: require("../package.json").version,
},
configs: requireindex(path.join(__dirname, "./configs")),
rules: requireindex(path.join(__dirname, "./rules")),
};
56 changes: 56 additions & 0 deletions src/rules/missing-data-tid.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"use strict";

function kebabToPascalCase(str) {
return str
.replace(/(?:^|[-_])(\w)/g, (c) => c.toUpperCase())
.replace(/[-_]/g, "");
}

const testableTagNames = [
"Input",
"Button",
"Checkbox",
"Radio",
"Select",
"Textarea",
"Link",
];

module.exports = {
meta: {
docs: {
description: "Enforce data-tid attribute on all elements",
category: "recommended",
},
fixable: "code",
schema: [],
messages: {
missingDataTid: "Missing data-tid attribute",
},
},
create(context) {
return context.parserServices.defineTemplateBodyVisitor({
VElement(node) {
const tag = kebabToPascalCase(node.rawName);
const tokens = context.parserServices.getTemplateBodyTokenStore();
if (testableTagNames.includes(tag)) {
const dataTid = node.startTag.attributes.find(
(attr) => attr.key.name === "data-tid"
);
if (!dataTid) {
context.report({
node,
loc: tokens.getFirstToken(node).loc,
messageId: "missingDataTid",
fix: (fixer) =>
fixer.insertTextAfter(
tokens.getFirstToken(node),
' data-tid=""'
),
});
}
}
},
});
},
};
27 changes: 27 additions & 0 deletions tests/rules/missing-data-tid.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const RuleTester = require("eslint").RuleTester;

const rule = require("../../src/rules/missing-data-tid");

const ruleTester = new RuleTester({
parser: require.resolve("vue-eslint-parser"),
parserOptions: {
ecmaVersion: 2018,
sourceType: "module",
},
});

ruleTester.run("missing-data-tid", rule, {
valid: ['<template><input data-tid="foo" /></template>'],
invalid: [
{
code: "<template><input /></template>",
errors: [
{
message: "Missing data-tid attribute",
type: "VElement",
},
],
output: '<template><input data-tid="" /></template>',
},
],
});
Loading

0 comments on commit db6b027

Please sign in to comment.