From 1393def21a3f666e78412a81c7689f66bb076334 Mon Sep 17 00:00:00 2001 From: Bamieh Date: Mon, 20 Nov 2017 03:22:28 +0200 Subject: [PATCH 1/3] Fixes: https://github.com/nodejs/node/issues/16636 Adds `require-buffer` lint fixer. If the buffer module is not required while `Buffer` is used, require the `buffer` module. If the file has a `'use strict';` line, add the require after it on a separate line. If the file does not have any (currently impossible with the `strict` rule) add it after the first comment (before the real code starts). --- tools/eslint-rules/require-buffer.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/eslint-rules/require-buffer.js b/tools/eslint-rules/require-buffer.js index c9818cb758f7bd..ad0b4b17ce695c 100644 --- a/tools/eslint-rules/require-buffer.js +++ b/tools/eslint-rules/require-buffer.js @@ -1,10 +1,26 @@ 'use strict'; +const BUFFER_REQUIRE = 'const { Buffer } = require(\'buffer\');\n'; module.exports = function(context) { + function flagIt(reference) { const msg = 'Use const Buffer = require(\'buffer\').Buffer; ' + 'at the beginning of this file'; - context.report(reference.identifier, msg); + + context.report({ + node: reference.identifier, + message: msg, + fix: (fixer) => { + const sourceCode = context.getSourceCode(); + console.log('getAllComments()::', sourceCode.ast.range[0]); + 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); + } + }); } return { From 04bcdd3c77d88639c5eb2127cb2550c6c39fca9a Mon Sep 17 00:00:00 2001 From: Bamieh Date: Mon, 20 Nov 2017 04:08:38 +0200 Subject: [PATCH 2/3] add require-buffer fixer tests --- test/parallel/test-eslint-require-buffer.js | 21 ++++++++++++++++++--- tools/eslint-rules/require-buffer.js | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-eslint-require-buffer.js b/test/parallel/test-eslint-require-buffer.js index 21be41f995a44e..ff2a582e42743c 100644 --- a/test/parallel/test-eslint-require-buffer.js +++ b/test/parallel/test-eslint-require-buffer.js @@ -12,15 +12,30 @@ const ruleTester = new RuleTester({ const message = "Use const Buffer = require('buffer').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'; ruleTester.run('require-buffer', rule, { valid: [ 'foo', - 'const Buffer = require("Buffer"); Buffer;' + 'const Buffer = require("Buffer"); Buffer;', + 'const { Buffer } = require(\'buffer\'); Buffer;', ], invalid: [ { code: 'Buffer;', - errors: [{ message }] - } + errors: [{ message }], + output: 'const { Buffer } = require(\'buffer\');\nBuffer;', + }, + { + code: useStrict + 'Buffer;', + errors: [{ message }], + output: useStrict + bufferModule + 'Buffer;', + }, + { + code: mockComment + 'Buffer;', + errors: [{ message }], + output: mockComment + bufferModule + 'Buffer;', + }, ] }); diff --git a/tools/eslint-rules/require-buffer.js b/tools/eslint-rules/require-buffer.js index ad0b4b17ce695c..c6040b43a181fb 100644 --- a/tools/eslint-rules/require-buffer.js +++ b/tools/eslint-rules/require-buffer.js @@ -12,7 +12,7 @@ module.exports = function(context) { message: msg, fix: (fixer) => { const sourceCode = context.getSourceCode(); - console.log('getAllComments()::', sourceCode.ast.range[0]); + const useStrict = /'use strict';\n\n?/g; const hasUseStrict = !!useStrict.exec(sourceCode.text); const firstLOC = sourceCode.ast.range[0]; From 694a8c982622761b027d644138112dd0840beb65 Mon Sep 17 00:00:00 2001 From: Bamieh Date: Mon, 20 Nov 2017 04:15:47 +0200 Subject: [PATCH 3/3] add final test scenario --- test/parallel/test-eslint-require-buffer.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/test/parallel/test-eslint-require-buffer.js b/test/parallel/test-eslint-require-buffer.js index ff2a582e42743c..282f983c782d4e 100644 --- a/test/parallel/test-eslint-require-buffer.js +++ b/test/parallel/test-eslint-require-buffer.js @@ -15,6 +15,7 @@ const message = "Use const Buffer = require('buffer').Buffer; " + 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, { valid: [ 'foo', @@ -23,19 +24,24 @@ ruleTester.run('require-buffer', rule, { ], invalid: [ { - code: 'Buffer;', + code: useBuffer, errors: [{ message }], - output: 'const { Buffer } = require(\'buffer\');\nBuffer;', + output: bufferModule + useBuffer, }, { - code: useStrict + 'Buffer;', + code: useStrict + useBuffer, errors: [{ message }], - output: useStrict + bufferModule + 'Buffer;', + output: useStrict + bufferModule + useBuffer, }, { - code: mockComment + 'Buffer;', + code: mockComment + useBuffer, errors: [{ message }], - output: mockComment + bufferModule + 'Buffer;', + output: mockComment + bufferModule + useBuffer, + }, + { + code: mockComment + useStrict + useBuffer, + errors: [{ message }], + output: mockComment + useStrict + bufferModule + useBuffer, }, ] });