From 839988c34ac7896a7797bf4d2ee3985c41c4dcd3 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sun, 8 Aug 2021 17:08:06 +0800 Subject: [PATCH 1/2] `prefer-module`: Use suggestions for `'use strict'` directive --- rules/prefer-module.js | 25 ++++++++++++------- test/snapshots/prefer-module.mjs.md | 34 +++++++++++--------------- test/snapshots/prefer-module.mjs.snap | Bin 4346 -> 4346 bytes 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/rules/prefer-module.js b/rules/prefer-module.js index 479a83102a..7888bcdcd2 100644 --- a/rules/prefer-module.js +++ b/rules/prefer-module.js @@ -10,6 +10,7 @@ const {replaceReferenceIdentifier, removeSpacesAfter} = require('./fix/index.js' const ERROR_USE_STRICT_DIRECTIVE = 'error/use-strict-directive'; const ERROR_GLOBAL_RETURN = 'error/global-return'; const ERROR_IDENTIFIER = 'error/identifier'; +const SUGGESTION_USE_STRICT_DIRECTIVE = 'suggestion/use-strict-directive'; const SUGGESTION_DIRNAME = 'suggestion/dirname'; const SUGGESTION_FILENAME = 'suggestion/filename'; const SUGGESTION_IMPORT = 'suggestion/import'; @@ -18,6 +19,7 @@ const messages = { [ERROR_USE_STRICT_DIRECTIVE]: 'Do not use "use strict" directive.', [ERROR_GLOBAL_RETURN]: '"return" should be used inside a function.', [ERROR_IDENTIFIER]: 'Do not use "{{name}}".', + [SUGGESTION_USE_STRICT_DIRECTIVE]: 'Remove "use strict" directive.', [SUGGESTION_DIRNAME]: 'Replace "__dirname" with `"…(import.meta.url)"`.', [SUGGESTION_FILENAME]: 'Replace "__filename" with `"…(import.meta.url)"`.', [SUGGESTION_IMPORT]: 'Switch to `import`.', @@ -212,9 +214,9 @@ function fixModuleExports(node, sourceCode) { } function create(context) { - const filename = context.getFilename(); + const filename = context.getFilename().toLowerCase(); - if (filename.toLowerCase().endsWith('.cjs')) { + if (filename.endsWith('.cjs')) { return {}; } @@ -222,14 +224,19 @@ function create(context) { return { 'ExpressionStatement[directive="use strict"]'(node) { - return { - node, - messageId: ERROR_USE_STRICT_DIRECTIVE, - * fix(fixer) { - yield fixer.remove(node); - yield removeSpacesAfter(node, sourceCode, fixer); - }, + const problem = {node, messageId: ERROR_USE_STRICT_DIRECTIVE}; + const fix = function * (fixer) { + yield fixer.remove(node); + yield removeSpacesAfter(node, sourceCode, fixer); }; + + if (filename.endsWith('.mjs')) { + problem.fix = fix; + } else { + problem.suggest = [{messageId: SUGGESTION_USE_STRICT_DIRECTIVE, fix}]; + } + + return problem; }, 'ReturnStatement:not(:function ReturnStatement)'(node) { return { diff --git a/test/snapshots/prefer-module.mjs.md b/test/snapshots/prefer-module.mjs.md index 3ab79063c3..e17b8db339 100644 --- a/test/snapshots/prefer-module.mjs.md +++ b/test/snapshots/prefer-module.mjs.md @@ -9,12 +9,6 @@ Generated by [AVA](https://avajs.dev). 2 | 3 | console.log(1); -> Output - - `␊ - 1 | console.log(1);␊ - ` - > Error 1/1 `␊ @@ -22,6 +16,10 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^ Do not use "use strict" directive.␊ 2 |␊ 3 | console.log(1);␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove "use strict" directive.␊ + 1 | console.log(1);␊ ` ## Invalid #2 @@ -29,12 +27,6 @@ Generated by [AVA](https://avajs.dev). 2 | 3 | console.log(1); -> Output - - `␊ - 1 | console.log(1);␊ - ` - > Error 1/1 `␊ @@ -42,6 +34,10 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^ Do not use "use strict" directive.␊ 2 |␊ 3 | console.log(1);␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove "use strict" directive.␊ + 1 | console.log(1);␊ ` ## Invalid #3 @@ -50,14 +46,6 @@ Generated by [AVA](https://avajs.dev). 3 | console.log(1); 4 | } -> Output - - `␊ - 1 | function foo () {␊ - 2 | console.log(1);␊ - 3 | }␊ - ` - > Error 1/1 `␊ @@ -66,6 +54,12 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^ Do not use "use strict" directive.␊ 3 | console.log(1);␊ 4 | }␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove "use strict" directive.␊ + 1 | function foo () {␊ + 2 | console.log(1);␊ + 3 | }␊ ` ## Invalid #1 diff --git a/test/snapshots/prefer-module.mjs.snap b/test/snapshots/prefer-module.mjs.snap index 53cbbb0647cdf15149c9fb367cedd05569da8533..c5698025fcfb7a152818dad3ef21e1703fd00f45 100644 GIT binary patch literal 4346 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 literal 4346 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 Date: Sun, 8 Aug 2021 17:09:49 +0800 Subject: [PATCH 2/2] Add `.mjs` file test --- test/prefer-module.mjs | 8 ++++++++ test/snapshots/prefer-module.mjs.md | 26 ++++++++++++++++++++++++++ test/snapshots/prefer-module.mjs.snap | Bin 4346 -> 4401 bytes 3 files changed, 34 insertions(+) diff --git a/test/prefer-module.mjs b/test/prefer-module.mjs index 96e3789348..2ee5cbaefa 100644 --- a/test/prefer-module.mjs +++ b/test/prefer-module.mjs @@ -29,6 +29,14 @@ test.snapshot({ console.log(1); } `, + { + code: outdent` + 'use strict'; + + console.log(1); + `, + filename: 'example.mjs', + }, ], }); diff --git a/test/snapshots/prefer-module.mjs.md b/test/snapshots/prefer-module.mjs.md index e17b8db339..62d7792a55 100644 --- a/test/snapshots/prefer-module.mjs.md +++ b/test/snapshots/prefer-module.mjs.md @@ -62,6 +62,32 @@ Generated by [AVA](https://avajs.dev). 3 | }␊ ` +## Invalid #4 + 1 | 'use strict'; + 2 | + 3 | console.log(1); + +> Filename + + `␊ + example.mjs␊ + ` + +> Output + + `␊ + 1 | console.log(1);␊ + ` + +> Error 1/1 + + `␊ + > 1 | 'use strict';␊ + | ^^^^^^^^^^^^^ Do not use "use strict" directive.␊ + 2 |␊ + 3 | console.log(1);␊ + ` + ## Invalid #1 1 | const dirname = __dirname; diff --git a/test/snapshots/prefer-module.mjs.snap b/test/snapshots/prefer-module.mjs.snap index c5698025fcfb7a152818dad3ef21e1703fd00f45..2e91adb24ae141e2022e752bcc6ff132f9005f78 100644 GIT binary patch literal 4401 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 literal 4346 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