From 4a1c035b42cf68ecdcb61008a4120dec2829cbd5 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 9 Aug 2019 02:29:33 +0200 Subject: [PATCH 1/4] Update: fix no-octal-escape false negatives after \0 --- lib/rules/no-octal-escape.js | 22 ++++++++++++++-------- tests/lib/rules/no-octal-escape.js | 20 ++++++++++++++++++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/rules/no-octal-escape.js b/lib/rules/no-octal-escape.js index a2860ca5bf8..2323a49c63c 100644 --- a/lib/rules/no-octal-escape.js +++ b/lib/rules/no-octal-escape.js @@ -20,7 +20,11 @@ module.exports = { url: "https://eslint.org/docs/rules/no-octal-escape" }, - schema: [] + schema: [], + + messages: { + octalEscapeSequence: "Don't use octal: '\\{{sequence}}'. Use '\\u....' instead." + } }, create(context) { @@ -32,15 +36,17 @@ module.exports = { return; } - const match = node.raw.match(/^([^\\]|\\[^0-7])*\\([0-3][0-7]{1,2}|[4-7][0-7]|[0-7])/u); + // \0 represents a valid NULL character if it isn't followed by a digit. + const match = node.raw.match( + /^(?:[^\\]|\\[^0-7]|\\0(?!\d))*\\([0-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u + ); if (match) { - const octalDigit = match[2]; - - // \0 is actually not considered an octal - if (match[2] !== "0" || typeof match[3] !== "undefined") { - context.report({ node, message: "Don't use octal: '\\{{octalDigit}}'. Use '\\u....' instead.", data: { octalDigit } }); - } + context.report({ + node, + messageId: "octalEscapeSequence", + data: { sequence: match[1] } + }); } } diff --git a/tests/lib/rules/no-octal-escape.js b/tests/lib/rules/no-octal-escape.js index b15416ebf95..fe4e04d2c3d 100644 --- a/tests/lib/rules/no-octal-escape.js +++ b/tests/lib/rules/no-octal-escape.js @@ -24,13 +24,29 @@ ruleTester.run("no-octal-escape", rule, { "var foo = \"\\x51\";", "var foo = \"foo \\\\251 bar\";", "var foo = /([abc]) \\1/g;", - "var foo = '\\0';" + "var foo = '\\0';", + "'\\0 '", + "'\\0a'", + "'\\\\1'", + "'\\\\01'", + "'\\08'", + "'\\09'" ], invalid: [ { code: "var foo = \"foo \\01 bar\";", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, { code: "var foo = \"foo \\251 bar\";", errors: [{ message: "Don't use octal: '\\251'. Use '\\u....' instead.", type: "Literal" }] }, { code: "var foo = \"\\751\";", errors: [{ message: "Don't use octal: '\\75'. Use '\\u....' instead.", type: "Literal" }] }, { code: "var foo = \"\\3s51\";", errors: [{ message: "Don't use octal: '\\3'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "var foo = \"\\\\\\751\";", errors: [{ message: "Don't use octal: '\\75'. Use '\\u....' instead.", type: "Literal" }] } + { code: "var foo = \"\\\\\\751\";", errors: [{ message: "Don't use octal: '\\75'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\0\\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\0 \\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\0\\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\0 \\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + + // Only the first one is reported + { code: "'\\01\\02'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\02\\01'", errors: [{ message: "Don't use octal: '\\02'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\01\\2'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\2\\01'", errors: [{ message: "Don't use octal: '\\2'. Use '\\u....' instead.", type: "Literal" }] } ] }); From 03fb18c5aebc93ceb22fceec4539b0bdb69ae089 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 9 Aug 2019 06:21:24 +0200 Subject: [PATCH 2/4] Fix '\08\1' --- lib/rules/no-octal-escape.js | 2 +- tests/lib/rules/no-octal-escape.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/rules/no-octal-escape.js b/lib/rules/no-octal-escape.js index 2323a49c63c..d4f897c795f 100644 --- a/lib/rules/no-octal-escape.js +++ b/lib/rules/no-octal-escape.js @@ -38,7 +38,7 @@ module.exports = { // \0 represents a valid NULL character if it isn't followed by a digit. const match = node.raw.match( - /^(?:[^\\]|\\[^0-7]|\\0(?!\d))*\\([0-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u + /^(?:[^\\]|\\[^0-7]|\\0(?![0-7]))*\\([0-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u ); if (match) { diff --git a/tests/lib/rules/no-octal-escape.js b/tests/lib/rules/no-octal-escape.js index fe4e04d2c3d..cc0dba378c9 100644 --- a/tests/lib/rules/no-octal-escape.js +++ b/tests/lib/rules/no-octal-escape.js @@ -42,6 +42,8 @@ ruleTester.run("no-octal-escape", rule, { { code: "'\\0 \\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, { code: "'\\0\\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, { code: "'\\0 \\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\08\\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, + { code: "'\\08\\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, // Only the first one is reported { code: "'\\01\\02'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, From 97ac21555cef471c893bff4a2859417781e1f296 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Mon, 19 Aug 2019 16:16:24 +0200 Subject: [PATCH 3/4] Change message to messageId + data in tests --- tests/lib/rules/no-octal-escape.js | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/lib/rules/no-octal-escape.js b/tests/lib/rules/no-octal-escape.js index cc0dba378c9..cd555ab607e 100644 --- a/tests/lib/rules/no-octal-escape.js +++ b/tests/lib/rules/no-octal-escape.js @@ -33,22 +33,25 @@ ruleTester.run("no-octal-escape", rule, { "'\\09'" ], invalid: [ + + // Test full message { code: "var foo = \"foo \\01 bar\";", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "var foo = \"foo \\251 bar\";", errors: [{ message: "Don't use octal: '\\251'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "var foo = \"\\751\";", errors: [{ message: "Don't use octal: '\\75'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "var foo = \"\\3s51\";", errors: [{ message: "Don't use octal: '\\3'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "var foo = \"\\\\\\751\";", errors: [{ message: "Don't use octal: '\\75'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\0\\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\0 \\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\0\\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\0 \\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\08\\1'", errors: [{ message: "Don't use octal: '\\1'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\08\\01'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, + + { code: "var foo = \"foo \\251 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "251" }, type: "Literal" }] }, + { code: "var foo = \"\\751\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "75" }, type: "Literal" }] }, + { code: "var foo = \"\\3s51\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "3" }, type: "Literal" }] }, + { code: "var foo = \"\\\\\\751\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "75" }, type: "Literal" }] }, + { code: "'\\0\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\0 \\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\0\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\0 \\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\08\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\08\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, // Only the first one is reported - { code: "'\\01\\02'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\02\\01'", errors: [{ message: "Don't use octal: '\\02'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\01\\2'", errors: [{ message: "Don't use octal: '\\01'. Use '\\u....' instead.", type: "Literal" }] }, - { code: "'\\2\\01'", errors: [{ message: "Don't use octal: '\\2'. Use '\\u....' instead.", type: "Literal" }] } + { code: "'\\01\\02'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\02\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "02" }, type: "Literal" }] }, + { code: "'\\01\\2'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\2\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "2" }, type: "Literal" }] } ] }); From 7488c3ee3d28d619daad48c5993f1df664b10a1f Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 13 Sep 2019 00:47:32 +0200 Subject: [PATCH 4/4] Change regex start to *? --- lib/rules/no-octal-escape.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/no-octal-escape.js b/lib/rules/no-octal-escape.js index d4f897c795f..7f6845ec70f 100644 --- a/lib/rules/no-octal-escape.js +++ b/lib/rules/no-octal-escape.js @@ -38,7 +38,7 @@ module.exports = { // \0 represents a valid NULL character if it isn't followed by a digit. const match = node.raw.match( - /^(?:[^\\]|\\[^0-7]|\\0(?![0-7]))*\\([0-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u + /^(?:[^\\]|\\.)*?\\([0-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u ); if (match) {