lib: remove `env: node` in eslint config for lib files
This patch removes the redundant `require-globals` custom eslint rule by removing `env: node` in the eslint config and whitelist the globals that can be accessed in native modules instead of black listing them. This makes sense for our `lib/` files because here we are creating the Node.js environment instead of running in a normal user land Node.js environment. PR-URL: https://github.com/nodejs/node/pull/27082 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
Родитель
217387fd1f
Коммит
91b4115a2b
|
@ -1,5 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
/* eslint-env node */
|
||||
|
||||
const Module = require('module');
|
||||
const path = require('path');
|
||||
|
||||
|
@ -31,7 +33,6 @@ Module._findPath = (request, paths, isMain) => {
|
|||
module.exports = {
|
||||
root: true,
|
||||
plugins: ['markdown', 'node-core'],
|
||||
env: { node: true, es6: true },
|
||||
parser: 'babel-eslint',
|
||||
parserOptions: { sourceType: 'script' },
|
||||
overrides: [
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
## Benchmark-specific linter rules
|
||||
|
||||
env:
|
||||
node: true
|
||||
es6: true
|
||||
|
||||
rules:
|
||||
comma-dangle:
|
||||
- error
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
env:
|
||||
es6: true
|
||||
|
||||
rules:
|
||||
prefer-object-spread: error
|
||||
no-buffer-constructor: error
|
||||
|
@ -19,10 +22,11 @@ rules:
|
|||
- selector: "CallExpression[callee.object.name='Error'][callee.property.name='captureStackTrace']"
|
||||
message: "Please use `require('internal/errors').hideStackFrames()` instead."
|
||||
# Custom rules in tools/eslint-rules
|
||||
node-core/require-globals: error
|
||||
node-core/lowercase-name-for-primitive: error
|
||||
node-core/non-ascii-character: error
|
||||
globals:
|
||||
Intl: false
|
||||
# Assertions
|
||||
CHECK: false
|
||||
CHECK_EQ: false
|
||||
CHECK_GE: false
|
||||
|
@ -37,5 +41,21 @@ globals:
|
|||
DCHECK_LE: false
|
||||
DCHECK_LT: false
|
||||
DCHECK_NE: false
|
||||
# Parameters passed to internal modules
|
||||
global: false
|
||||
require: false
|
||||
process: false
|
||||
exports: false
|
||||
module: false
|
||||
internalBinding: false
|
||||
primordials: false
|
||||
# Globals
|
||||
# TODO(joyeecheung): if possible, get these in native modules
|
||||
# through `require` instead of grabbing them from the global proxy.
|
||||
clearTimeout: false
|
||||
setTimeout: false
|
||||
clearInterval: false
|
||||
setInterval: false
|
||||
setImmediate: false
|
||||
clearImmediate: false
|
||||
console: false
|
||||
|
|
|
@ -655,9 +655,10 @@ Buffer.prototype.equals = function equals(otherBuffer) {
|
|||
return _compare(this, otherBuffer) === 0;
|
||||
};
|
||||
|
||||
let INSPECT_MAX_BYTES = 50;
|
||||
// Override how buffers are presented by util.inspect().
|
||||
Buffer.prototype[customInspectSymbol] = function inspect(recurseTimes, ctx) {
|
||||
const max = exports.INSPECT_MAX_BYTES;
|
||||
const max = INSPECT_MAX_BYTES;
|
||||
const actualMax = Math.min(max, this.length);
|
||||
const remaining = this.length - max;
|
||||
let str = this.hexSlice(0, actualMax).replace(/(.{2})/g, '$1 ').trim();
|
||||
|
@ -1090,19 +1091,25 @@ if (internalBinding('config').hasIntl) {
|
|||
};
|
||||
}
|
||||
|
||||
module.exports = exports = {
|
||||
module.exports = {
|
||||
Buffer,
|
||||
SlowBuffer,
|
||||
transcode,
|
||||
INSPECT_MAX_BYTES: 50,
|
||||
|
||||
// Legacy
|
||||
kMaxLength,
|
||||
kStringMaxLength
|
||||
};
|
||||
|
||||
Object.defineProperty(exports, 'constants', {
|
||||
configurable: false,
|
||||
enumerable: true,
|
||||
value: constants
|
||||
Object.defineProperties(module.exports, {
|
||||
constants: {
|
||||
configurable: false,
|
||||
enumerable: true,
|
||||
value: constants
|
||||
},
|
||||
INSPECT_MAX_BYTES: {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get() { return INSPECT_MAX_BYTES; },
|
||||
set(val) { INSPECT_MAX_BYTES = val; }
|
||||
}
|
||||
});
|
||||
|
|
|
@ -145,7 +145,7 @@ function createVerify(algorithm, options) {
|
|||
return new Verify(algorithm, options);
|
||||
}
|
||||
|
||||
module.exports = exports = {
|
||||
module.exports = {
|
||||
// Methods
|
||||
createCipheriv,
|
||||
createDecipheriv,
|
||||
|
@ -218,7 +218,7 @@ function getFipsForced() {
|
|||
return 1;
|
||||
}
|
||||
|
||||
Object.defineProperties(exports, {
|
||||
Object.defineProperties(module.exports, {
|
||||
createCipher: {
|
||||
enumerable: false,
|
||||
value: deprecate(createCipher,
|
||||
|
|
|
@ -124,6 +124,7 @@ const internalBindingWhitelist = new SafeSet([
|
|||
let internalBinding;
|
||||
{
|
||||
const bindingObj = Object.create(null);
|
||||
// eslint-disable-next-line no-global-assign
|
||||
internalBinding = function internalBinding(module) {
|
||||
let mod = bindingObj[module];
|
||||
if (typeof mod !== 'object') {
|
||||
|
|
|
@ -129,7 +129,7 @@ function normalizeReferrerURL(referrer) {
|
|||
return new URL(referrer).href;
|
||||
}
|
||||
|
||||
module.exports = exports = {
|
||||
module.exports = {
|
||||
addBuiltinLibsToObject,
|
||||
builtinLibs,
|
||||
makeRequireFunction,
|
||||
|
|
|
@ -113,8 +113,8 @@ function timestamp() {
|
|||
}
|
||||
|
||||
// Log is just a thin wrapper to console.log that prepends a timestamp
|
||||
function log() {
|
||||
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
||||
function log(...args) {
|
||||
console.log('%s - %s', timestamp(), format(...args));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -218,7 +218,7 @@ function getSystemErrorName(err) {
|
|||
}
|
||||
|
||||
// Keep the `exports =` so that various functions can still be monkeypatched
|
||||
module.exports = exports = {
|
||||
module.exports = {
|
||||
_errnoException: errnoException,
|
||||
_exceptionWithHostPort: exceptionWithHostPort,
|
||||
_extend,
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
## Test-specific linter rules
|
||||
|
||||
env:
|
||||
node: true
|
||||
es6: true
|
||||
|
||||
rules:
|
||||
# ECMAScript 6
|
||||
# http://eslint.org/docs/rules/#ecmascript-6
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
if (!common.hasCrypto)
|
||||
common.skip('missing crypto');
|
||||
|
||||
common.skipIfEslintMissing();
|
||||
|
||||
const RuleTester = require('../../tools/node_modules/eslint').RuleTester;
|
||||
const rule = require('../../tools/eslint-rules/require-globals');
|
||||
const ruleTester = new RuleTester({
|
||||
parserOptions: { ecmaVersion: 6 },
|
||||
env: { node: true }
|
||||
});
|
||||
|
||||
const message = "Use const { Buffer } = require('buffer'); " +
|
||||
'at the beginning of this file';
|
||||
|
||||
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-globals', rule, {
|
||||
valid: [
|
||||
'foo',
|
||||
'const Buffer = require("Buffer"); Buffer;',
|
||||
'const { Buffer } = require(\'buffer\'); Buffer;',
|
||||
],
|
||||
invalid: [
|
||||
{
|
||||
code: useBuffer,
|
||||
errors: [{ message }],
|
||||
output: bufferModule + useBuffer,
|
||||
},
|
||||
{
|
||||
code: useStrict + useBuffer,
|
||||
errors: [{ message }],
|
||||
output: useStrict + bufferModule + useBuffer,
|
||||
},
|
||||
{
|
||||
code: mockComment + useBuffer,
|
||||
errors: [{ message }],
|
||||
output: mockComment + bufferModule + useBuffer,
|
||||
},
|
||||
{
|
||||
code: mockComment + useStrict + useBuffer,
|
||||
errors: [{ message }],
|
||||
output: mockComment + useStrict + bufferModule + useBuffer,
|
||||
},
|
||||
]
|
||||
});
|
|
@ -1,3 +1,7 @@
|
|||
env:
|
||||
node: true
|
||||
es6: true
|
||||
|
||||
rules:
|
||||
comma-dangle:
|
||||
- error
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
'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));
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
Загрузка…
Ссылка в новой задаче