Skip to content

Commit

Permalink
tools: stricter eslint rule for globals
Browse files Browse the repository at this point in the history
PR-URL: #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>
  • Loading branch information
BridgeAR authored and MylesBorins committed May 22, 2018
1 parent bd13193 commit 2361f64
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 38 deletions.
2 changes: 1 addition & 1 deletion lib/.eslintrc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions test/parallel/test-eslint-require-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand All @@ -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;',
Expand Down
35 changes: 0 additions & 35 deletions tools/eslint-rules/require-buffer.js

This file was deleted.

50 changes: 50 additions & 0 deletions tools/eslint-rules/require-globals.js
Original file line number Diff line number Diff line change
@@ -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));
}
}
};
};

0 comments on commit 2361f64

Please sign in to comment.