Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
137
rated 0 times [  138] [ 1]  / answers: 1 / hits: 5189  / 4 Years ago, wed, march 11, 2020, 12:00:00

If I add any given ESLint rule, for example no-param-reassign in an existing codebase I'm likely to get many violations.


Is there a good way to programmatically add, on line-by-line bases, suppressions for all existing violations?


In the example case:


// eslint-diable-next-line no-param-reassign
param = foo;

To clarify


I do want the rule in my project, guarding all new code we write. I don't want to fix all the old code that is emitting violations by hand (I want a script to do that for me or eslint itself if possible). This is why I would like to suppress all existing violations but respect all new violations. My main goal is to comply with the new rule as fast as possible to get the value from it on all new code. I don't mind old lingering suppressed violations.


More From » eslint

 Answers
7

I was having this same issue with a bunch of react-hooks/exhaustive-deps lint warnings ended up using the json formatter and a script to insert the eslint disable comment. I ran yarn lint . -f json -o warnings.json to get the json list of lints and then this


const json = require('./warnings.json');
const fs = require('fs');

json.forEach(({ filePath, messages, source }) => {
// if there is no source we have nothing that needs to be eslint-ignore'd
if (!source) {
return;
}

const data = source.split('n');

// if the source has multiple lines which need to be eslint-ignored our offset changes per addition
// offset is 1 because line numbers start at 1 but index numbers in an array start at 0
let offset = 1;

// group errors/warnings by line because we want to have one eslint disable comment with all the rules to disable
const groupedMessages = messages.reduce((acc, next) => {
const prevMessages = acc[next.line] ? acc[next.line] : [];
// some lines may have the same rule twice
const duplicateRuleForLine = prevMessages.find(message => message.ruleId === next.ruleId);
// ignore jsx and graphql lint rules
const applicableRule = next.ruleId && !next.ruleId.includes('jsx') && !next.ruleId.includes('graphql');

// ignore the eslint-ignore addition for duplicates and non applicable rules
if (duplicateRuleForLine || !applicableRule) {
return acc;
}

return {
...acc,
[next.line]: [...prevMessages, next],
};
}, {});

Object.entries(groupedMessages).forEach(([line, messages]) => {
// grouped ignores
const ignore = `// eslint-disable-next-line ${messages.map(({ ruleId }) => ruleId).join(' ')}`;
data.splice(line - offset, 0, ignore);
offset--;
});

const updated = data.join('n');

fs.writeFile(filePath, updated, function(err) {
if (err) return console.log(err);
});
});

Worked out well for me, although I wish these comments I inserted were auto-formatted.


[#4520] Saturday, March 7, 2020, 4 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
aliah

Total Points: 118
Total Questions: 132
Total Answers: 94

Location: Tajikistan
Member since Fri, Sep 11, 2020
4 Years ago
;