tools: stricter eslint rule for globals

PR-URL: https://github.com/nodejs/node/pull/20567
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
This commit is contained in:
Ruben Bridgewater 2018-05-07 02:18:23 +02:00
parent 7afb73715f
commit e0c71ca3eb
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
4 changed files with 53 additions and 38 deletions

View File

@ -20,7 +20,7 @@ rules:
- selector: "NewExpression[callee.name=/Error$/]:not([callee.name=/^(AssertionError|NghttpError)$/])"
message: "Use an error exported by the internal/errors module."
# Custom rules in tools/eslint-rules
node-core/require-buffer: error
node-core/require-globals: error
node-core/buffer-constructor: error
node-core/no-let-in-for-declaration: error
node-core/lowercase-name-for-primitive: error

View File

@ -5,7 +5,7 @@ const common = require('../common');
common.skipIfEslintMissing();
const RuleTester = require('../../tools/node_modules/eslint').RuleTester;
const rule = require('../../tools/eslint-rules/require-buffer');
const rule = require('../../tools/eslint-rules/require-globals');
const ruleTester = new RuleTester({
parserOptions: { ecmaVersion: 6 },
env: { node: true }
@ -18,7 +18,7 @@ const useStrict = '\'use strict\';\n\n';
const bufferModule = 'const { Buffer } = require(\'buffer\');\n';
const mockComment = '// Some Comment\n//\n// Another Comment\n\n';
const useBuffer = 'Buffer;';
ruleTester.run('require-buffer', rule, {
ruleTester.run('require-globals', rule, {
valid: [
'foo',
'const Buffer = require("Buffer"); Buffer;',

View File

@ -1,35 +0,0 @@
'use strict';
const BUFFER_REQUIRE = 'const { Buffer } = require(\'buffer\');';
module.exports = function(context) {
function flagIt(reference) {
const msg = `Use ${BUFFER_REQUIRE} at the beginning of this file`;
context.report({
node: reference.identifier,
message: msg,
fix: (fixer) => {
const sourceCode = context.getSourceCode();
const useStrict = /'use strict';\n\n?/g;
const hasUseStrict = !!useStrict.exec(sourceCode.text);
const firstLOC = sourceCode.ast.range[0];
const rangeNeedle = hasUseStrict ? useStrict.lastIndex : firstLOC;
return fixer.insertTextBeforeRange([rangeNeedle],
`${BUFFER_REQUIRE}\n`);
}
});
}
return {
'Program:exit': function() {
const globalScope = context.getScope();
const variable = globalScope.set.get('Buffer');
if (variable) {
variable.references.forEach(flagIt);
}
}
};
};

View File

@ -0,0 +1,50 @@
'use strict';
// This rule makes sure that no Globals are going to be used in /lib.
// That could otherwise result in problems with the repl.
module.exports = function(context) {
function flagIt(msg, fix) {
return (reference) => {
context.report({
node: reference.identifier,
message: msg,
fix: (fixer) => {
const sourceCode = context.getSourceCode();
const useStrict = /'use strict';\n\n?/g;
const hasUseStrict = !!useStrict.exec(sourceCode.text);
const firstLOC = sourceCode.ast.range[0];
const rangeNeedle = hasUseStrict ? useStrict.lastIndex : firstLOC;
return fixer.insertTextBeforeRange([rangeNeedle], `${fix}\n`);
}
});
};
}
return {
'Program:exit': function() {
const globalScope = context.getScope();
let variable = globalScope.set.get('Buffer');
if (variable) {
const fix = "const { Buffer } = require('buffer');";
const msg = `Use ${fix} at the beginning of this file`;
variable.references.forEach(flagIt(msg, fix));
}
variable = globalScope.set.get('URL');
if (variable) {
const fix = "const { URL } = require('url');";
const msg = `Use ${fix} at the beginning of this file`;
variable.references.forEach(flagIt(msg, fix));
}
variable = globalScope.set.get('URLSearchParams');
if (variable) {
const fix = "const { URLSearchParams } = require('url');";
const msg = `Use ${fix} at the beginning of this file`;
variable.references.forEach(flagIt(msg, fix));
}
}
};
};