From 448ff1e53734c503fb9e7e6802c1c7e441d4c019 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Wed, 13 Nov 2019 05:07:45 +0100 Subject: [PATCH] Update: Report '\08' and '\09' in no-octal-escape (fixes #12080) (#12526) --- lib/rules/no-octal-escape.js | 2 +- tests/lib/rules/no-octal-escape.js | 86 +++++++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/lib/rules/no-octal-escape.js b/lib/rules/no-octal-escape.js index 7f6845ec70f..5b4c7b2ebb4 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-3][0-7]{1,2}|[4-7][0-7]|[1-7])/u + /^(?:[^\\]|\\.)*?\\([0-3][0-7]{1,2}|[4-7][0-7]|0(?=[89])|[1-7])/su ); if (match) { diff --git a/tests/lib/rules/no-octal-escape.js b/tests/lib/rules/no-octal-escape.js index cd555ab607e..d89910f8663 100644 --- a/tests/lib/rules/no-octal-escape.js +++ b/tests/lib/rules/no-octal-escape.js @@ -25,33 +25,107 @@ ruleTester.run("no-octal-escape", rule, { "var foo = \"foo \\\\251 bar\";", "var foo = /([abc]) \\1/g;", "var foo = '\\0';", + "'\\0'", + "'\\8'", + "'\\9'", "'\\0 '", + "' \\0'", + "'a\\0'", "'\\0a'", + "'a\\8a'", + "'\\0\\8'", + "'\\8\\0'", + "'\\80'", + "'\\81'", + "'\\\\'", + "'\\\\0'", + "'\\\\08'", "'\\\\1'", "'\\\\01'", - "'\\08'", - "'\\09'" + "'\\\\12'", + "'\\\\\\0'", + "'\\\\\\8'", + "'\\0\\\\'", + "'0'", + "'1'", + "'8'", + "'01'", + "'08'", + "'80'", + "'12'", + "'\\a'", + "'\\n'" ], 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 \\000 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "000" }, type: "Literal" }] }, + { code: "var foo = \"foo \\377 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "377" }, type: "Literal" }] }, + { code: "var foo = \"foo \\378 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "37" }, type: "Literal" }] }, + { code: "var foo = \"foo \\37a bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "37" }, type: "Literal" }] }, + { code: "var foo = \"foo \\381 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "3" }, type: "Literal" }] }, + { code: "var foo = \"foo \\3a1 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "3" }, 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 = \"foo \\258 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "25" }, type: "Literal" }] }, + { code: "var foo = \"foo \\25a bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "25" }, type: "Literal" }] }, { code: "var foo = \"\\3s51\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "3" }, type: "Literal" }] }, + { code: "var foo = \"\\77\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "77" }, type: "Literal" }] }, + { code: "var foo = \"\\78\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "7" }, type: "Literal" }] }, + { code: "var foo = \"\\5a\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "5" }, type: "Literal" }] }, + { code: "var foo = \"\\751\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "75" }, type: "Literal" }] }, + { code: "var foo = \"foo \\400 bar\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "40" }, type: "Literal" }] }, + + { code: "var foo = \"\\t\\1\";", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, 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" }] }, + { code: "'\\0a\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\0a\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\0\\08'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + + { code: "'\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\2'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "2" }, type: "Literal" }] }, + { code: "'\\7'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "7" }, type: "Literal" }] }, + { code: "'\\00'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "00" }, type: "Literal" }] }, + { code: "'\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\02'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "02" }, type: "Literal" }] }, + { code: "'\\07'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "07" }, type: "Literal" }] }, + { code: "'\\08'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + { code: "'\\09'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + { code: "'\\10'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "10" }, type: "Literal" }] }, + { code: "'\\12'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "12" }, type: "Literal" }] }, + { code: "' \\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\1 '", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'a\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\1a'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'a\\1a'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "' \\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\01 '", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'a\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\01a'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'a\\01a'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'a\\08a'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + { code: "'\\n\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\n\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\n\\08'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + { code: "'\\\\\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, + { code: "'\\\\\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "01" }, type: "Literal" }] }, + { code: "'\\\\\\08'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + + // Multiline string + { code: "'\\\n\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] }, // Only the first one is reported { 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" }] } + { code: "'\\2\\01'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "2" }, type: "Literal" }] }, + { code: "'\\08\\1'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "0" }, type: "Literal" }] }, + { code: "'foo \\1 bar \\2'", errors: [{ messageId: "octalEscapeSequence", data: { sequence: "1" }, type: "Literal" }] } ] });