AST и
плагины:
давайте
пошалим!
AST и
плагины:
давайте
пошалим!
AST?
$ mkdir eslint-plugin-demoforfix
$ cd eslint-plugin-demoforfix
$ npm init
// package.json
{
"name": "eslint-plugin-demoforfix",
"version": "1.0.0",
"main": "no-string-classname.js",
}
// no-string-classname.js
module.exports = {
rules: {
"no-string-classname": {
create: function (context) {
return {…}
}}}};
context.report({
message,
node,
//…
});
return {
"JSXAttribute": function (node) {
// …
}
}
if ((node.name.name === 'className')
&& (node.value.type === 'Literal')) {
context.report({
node,
message: 'You should use
css modules instead'
});
}
$ npm version minor
$ npm publish
$ npm i -D eslint-plugin-demoforfix
// .eslintrc
{
"rules": {
"demoforfix/no-string-classname": 2
},
"plugins": [
"demoforfix"
],
}
$ sudo npm install -g yo
$ sudo npm install -g generator-eslint
$ mkdir eslint-plugin-demoforfix
$ cd eslint-plugin-demoforfix
$ yo eslint:plugin
$ npm i
// package.json
{
"name": "eslint-plugin-demoforfix",
"version": "1.0.0",
"main": "lib/index.js",
}
var requireIndex =
require("requireindex");
module.exports.rules =
requireIndex(__dirname + "/rules");
// no-string-classname.js
module.exports = {
rules: {
"no-string-classname": {
create: function (context) {
return {…}
}}}};
// no-string-classname.js
module.exports = {
meta: {…},
"no-string-classname": {
create: function (context) {
return {…}
}}};
const rule =
require("../../../lib/rules/no-string-classname");
const RuleTester = require("eslint").RuleTester;
const parserOptions = {
ecmaVersion: 2018,
sourceType: 'module',
ecmaFeatures: {jsx: true}};
const ruleTester =
new RuleTester({parserOptions});
ruleTester.run(
"no-string-classname",
rule, {
valid: [{…}, {…}],
invalid: [{…}, {…}],
});
{
code: '…'
}
{ code: '…',
errors: [{
message: "You should use
css modules instead",
type: "JSXAttribute"
}]}
$ npm t
Антон Немцев
http://silentimp.info/
@silentimp
thesilentimp@gmail.com
skype: ravencry