Леонид Лебедев, Яндекс.Маркет
Леонид Лебедев, Яндекс.Маркет
Модуль, который расширяет набор встроенных правил
Встроенные правила: no-var
, no-tabs
eslint-plugin-react:
react/jsx-uses-vars
, react/display-name
Создать плагин можно с помощью Yeoman генератора от ESLint
yo eslint:plugin
eslint-plugin-market
/docs
/lib
/tests
package.json
module.exports = {
rules: {
'no-only': {...},
},
};
.eslintrc.js
подключаем созданный плагин
module.exports = {
plugins: ['market'],
rules: {
'market/no-only': 'error',
},
};
AST — это древовидное представление абстрактной синтаксической структуры исходного кода. Каждый узел дерева обозначает конструкцию, встречающуюся в исходном коде.
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
function sum(a, b) {
return a + b;
}
Файл, содержащий условия, при котором ESLint сообщает о проблеме
module.exports = {
meta: {...},
create(context) {...},
};
meta: {
type: 'problem',
docs: {
description: 'Function declarations are disallowed',
category: 'Possible Errors',
},
fixable: 'code',
schema: [],
},
create(context) {
return {
[selector](node) {
context.report ({...});
},
};
}
create(context) {
return {
[selector](node) {
context.report ({...});
},
};
}
context: {
id,
options,
report({...}),
... (опции парсера)
}
context: {
id,
options,
report({...}),
... (опции парсера)
}
context.report({
node,
message: 'Don\'t use "only"',
loc: {start: ..., end: ...},
fix(fixer) {...},
});
create(context) {
return {
[selector](node) {
context.report ({...});
},
};
}
Селектор — это строка, которая будет использоваться для сопоставления узлам AST.
function sum(a, b) {
return a + b;
}
'FunctionDeclaration'
, 'BinaryExpression'
'ReturnStatement Literal[value = null]'
return null;
'Identifier[name=/.*\d+$/]'
const picture2 = 'https://...'
'FunctionDeclaration:nth-child(2)'
create(context) {
return {
[selector](node) {
context.report ({
node,
message: 'Don\'t use "only"',
});
},
};
}
const {makeSuite} = require('ginny');
module.exports = makeSuite('Проверка кнопки «Купить»', {
id: 'market-215',
test() {
return this.expect(this.button.name).toBe('Купить');
},
});
const {makeSuite} = require('ginny');
module.exports = makeSuite('Проверка кнопки «Купить» only', {
id: 'market-215',
test() {
return this.expect(this.button.name).toBe('Купить');
},
});
'no-restricted-syntax': ['error', {
selector: 'ReturnStatement',
message: 'No return!',
}]