feat(linter): eslint no-nonoctal-decimal-escape (#2428)

Rule
[source](https://github.com/eslint/eslint/blob/main/lib/rules/no-nonoctal-decimal-escape.js)
Rule
[tests](https://github.com/eslint/eslint/blob/main/tests/lib/rules/no-nonoctal-decimal-escape.js)

I created a basic sticky regex implementation based on what I could find
about it, since rust does not have support for that.
There might be a better place to keep it instead of this rule file

---------

Co-authored-by: Boshen <boshenc@gmail.com>
This commit is contained in:
tudorbarbu 2024-02-21 09:02:20 +02:00 committed by GitHub
parent c76312359c
commit f7e15769da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 904 additions and 0 deletions

View file

@ -73,6 +73,7 @@ mod eslint {
pub mod no_mixed_operators;
pub mod no_new_symbol;
pub mod no_new_wrappers;
pub mod no_nonoctal_decimal_escape;
pub mod no_obj_calls;
pub mod no_prototype_builtins;
pub mod no_redeclare;
@ -372,6 +373,7 @@ oxc_macros::declare_all_lint_rules! {
eslint::no_mixed_operators,
eslint::no_new_symbol,
eslint::no_new_wrappers,
eslint::no_nonoctal_decimal_escape,
eslint::no_obj_calls,
eslint::no_prototype_builtins,
eslint::no_redeclare,

View file

@ -0,0 +1,254 @@
use lazy_static::lazy_static;
use oxc_ast::AstKind;
use oxc_diagnostics::{
miette::{self, Diagnostic},
thiserror::{self, Error},
};
use oxc_macros::declare_oxc_lint;
use oxc_span::Span;
use regex::{Captures, Match, Regex};
use crate::{context::LintContext, rule::Rule, AstNode};
#[derive(Debug, Error, Diagnostic)]
enum NoNonoctalDecimalEscapeDiagnostic {
#[error("eslint(no-nonoctal-decimal-escape): Don't use '{0}' escape sequence.")]
#[diagnostic(
severity(warning),
help("Replace '{0}' with '{1}'. This maintains the current functionality.")
)]
Replacement(String, String, #[label] Span),
#[error("eslint(no-nonoctal-decimal-escape): Don't use '{0}' escape sequence.")]
#[diagnostic(
severity(warning),
help("Replace '{0}' with '{1}' to include the actual backslash character.")
)]
EscapeBackslash(String, String, #[label] Span),
}
#[derive(Debug, Default, Clone)]
pub struct NoNonoctalDecimalEscape;
declare_oxc_lint!(
/// ### What it does
/// This rule disallows \8 and \9 escape sequences in string literals
///
/// ### Why is this bad?
/// ECMAScript specification treats \8 and \9 in string literals as a legacy feature
///
/// ### Example
/// ```javascript
/// incorrect:
/// "\8"
/// "\9"
/// correct:
/// "8"
/// "\\9"
/// ```
NoNonoctalDecimalEscape,
correctness
);
impl Rule for NoNonoctalDecimalEscape {
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
if let AstKind::StringLiteral(literal) = node.kind() {
check_string(ctx, literal.span.source_text(ctx.source_text()));
}
}
}
trait StickyRegex {
// takes the start position and returns the match and the nextPosition
fn sticky_find<'h>(&self, haystack: &'h str, start: usize) -> (Option<Match<'h>>, usize);
fn sticky_captures<'h>(&self, haystack: &'h str, start: usize)
-> (Option<Captures<'h>>, usize);
}
impl StickyRegex for Regex {
fn sticky_find<'h>(&self, haystack: &'h str, start: usize) -> (Option<Match<'h>>, usize) {
let m_opt = self.find_at(haystack, start);
if let Some(m) = m_opt {
if m.start() == start {
return (m_opt, m.end());
}
}
(None, 0)
}
fn sticky_captures<'h>(
&self,
haystack: &'h str,
start: usize,
) -> (Option<Captures<'h>>, usize) {
let c_opt = self.captures_at(haystack, start);
if let Some(captures) = c_opt {
let capture = captures.get(0).unwrap();
if capture.start() == start {
return (Some(captures), capture.end());
}
}
(None, 0)
}
}
fn quick_test(s: &str) -> bool {
let mut chars = s.chars().peekable();
while let Some(c) = chars.next() {
if c == '\\' && chars.peek().is_some_and(|c| *c == '8' || *c == '9') {
return true;
}
}
false
}
#[allow(clippy::cast_possible_truncation)]
fn check_string(ctx: &LintContext<'_>, string: &str) {
lazy_static! {
static ref NONOCTAL_REGEX: Regex =
Regex::new(r"(?:[^\\]|(?P<previousEscape>\\.))*?(?P<decimalEscape>\\[89])").unwrap();
}
// Need at least 2 characters
if string.len() <= 1 {
return;
}
if !quick_test(string) {
return;
}
let mut start: usize = 0;
while let (Some(captures), new_start) = NONOCTAL_REGEX.sticky_captures(string, start) {
let previous_escape = captures.name("previousEscape");
let decimal_escape = captures.name("decimalEscape").unwrap();
let decimal_escape_span =
Span::new(decimal_escape.start() as u32, decimal_escape.end() as u32);
let decimal_escape_str = decimal_escape.as_str();
if let Some(prev_match) = previous_escape {
if prev_match.as_str().eq("\\0") {
ctx.diagnostic(NoNonoctalDecimalEscapeDiagnostic::Replacement(
prev_match.as_str().to_string() + decimal_escape_str,
"\\u00008".to_string(),
Span::new(prev_match.start() as u32, decimal_escape_span.end),
));
ctx.diagnostic(NoNonoctalDecimalEscapeDiagnostic::Replacement(
decimal_escape_str.to_string(),
"\\u0038".to_string(),
decimal_escape_span,
));
}
} else {
ctx.diagnostic(NoNonoctalDecimalEscapeDiagnostic::Replacement(
decimal_escape_str.to_string(),
decimal_escape_str[1..].to_string(),
decimal_escape_span,
));
}
ctx.diagnostic(NoNonoctalDecimalEscapeDiagnostic::EscapeBackslash(
decimal_escape_str.to_string(),
format!("\\{decimal_escape_str}"),
decimal_escape_span,
));
start = new_start;
}
}
#[test]
fn test() {
use crate::tester::Tester;
let pass = vec![
r"8",
r"var \u8888",
r"/\8/",
r"''",
r"'foo'",
r"'8'",
r"'9'",
r"'foo8'",
r"'foo9bar'",
r"'\ '",
r"'\\'",
r"'\a'",
r"'\n'",
r"'\0'",
r"'\1'",
r"'\7'",
r"'\01'",
r"'\08'",
r"'\19'",
r"'\t9'",
r"'\👍8'",
r"'\\8'",
r"'\\9'",
r"'\\8\\9'",
r"'\\ \\8'",
r"'\\\\9'",
r"'\\9bar'",
r"'a\\8'",
r"'foo\\8'",
r"'foo\\8bar'",
r"'9\\9'",
r"'n\n8'",
r"'n\nn\n8'",
r"'\1.8'",
r"'\1\28'",
r"'\x99'",
r"'\\\x38'",
r"\u99999",
r"'\\\n8'",
r"'\\\n\\\\9'",
];
let fail = vec![
r"'\8'",
r"'\9'",
r#""\8""#,
r"'f\9'",
r"'xo\9'",
r"'foo\9'",
r"'foo\8bar'",
r"'👍\8'",
r"'\\\8'",
r"'\\\\\9'",
r"'foo\\\8'",
r"'\ \8'",
r"'\1\9'",
r"'foo\1\9'",
r"'\n\n\8\n'",
r"'\n.\n\8\n'",
r"'\n.\nn\8\n'",
r"'\👍\8'",
r"'\\8\9'",
r"'\8\\9'",
r"'\8 \\9'",
r"'\8\8'",
r"'\9\8'",
r"'foo\8bar\9baz'",
r"'\8\1\9'",
r"'\9\n9\\9\9'",
r"'\8\\\9'",
r"var foo = '\8'; bar('\9')",
r"var foo = '8'\n bar = '\\9'",
r"'\\n\8'",
r"'\\n\9'",
r"'\\\\n\8'",
r"'foo\\nbar\9baz'",
r"'\0\8'",
r"'foo\0\9bar'",
r"'\1\0\8'",
r"'\0\8\9'",
r"'\8\0\9'",
r"'0\8'",
r"'\\0\8'",
r"'\0 \8'",
r"'\01\8'",
r"'\0\1\8'",
r"'\0\\n\8'",
];
Tester::new(NoNonoctalDecimalEscape::NAME, pass, fail).test_and_snapshot();
}

View file

@ -0,0 +1,648 @@
---
source: crates/oxc_linter/src/tester.rs
expression: no_nonoctal_decimal_escape
---
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ "\8"
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ "\8"
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:3]
1 │ 'f\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:3]
1 │ 'f\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ 'xo\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ 'xo\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\8bar'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\8bar'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '👍\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '👍\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\\\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\\\\\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ 'foo\\\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\ \8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\1\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ 'foo\1\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\n\n\8\n'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ '\n.\n\8\n'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:8]
1 │ '\n.\nn\8\n'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\👍\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\\8\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\\9'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8 \\9'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8 \\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\8\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\8\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9\8'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9\8'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\9\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\9\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\8bar\9baz'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\8bar\9baz'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:10]
1 │ 'foo\8bar\9baz'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:10]
1 │ 'foo\8bar\9baz'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\1\9'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\1\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\8\1\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9\n9\\9\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\9\n9\\9\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:10]
1 │ '\9\n9\\9\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\\\9'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\\\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\8\\\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ var foo = '\8'; bar('\9')
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ var foo = '\8'; bar('\9')
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ var foo = '\8'; bar('\9')
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ var foo = '\8'; bar('\9')
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
× Invalid Unicode escape sequence
╭─[no_nonoctal_decimal_escape.tsx:1:15]
1 │ var foo = '8'\n bar = '\\9'
· ─
╰────
× Expected a semicolon or an implicit semicolon after a statement, but found none
╭─[no_nonoctal_decimal_escape.tsx:1:14]
1 │ var foo = '8'\n bar = '\\9'
· ▲
╰────
help: Try insert a semicolon here
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\\n\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\\n\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ '\\\\n\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:11]
1 │ 'foo\\nbar\9baz'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\0\8'
· ────
╰────
help: Replace '\0\8' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\0\8'
· ──
╰────
help: Replace '\8' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\0\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ 'foo\0\9bar'
· ────
╰────
help: Replace '\0\9' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ 'foo\0\9bar'
· ──
╰────
help: Replace '\9' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ 'foo\0\9bar'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\1\0\8'
· ────
╰────
help: Replace '\0\8' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\1\0\8'
· ──
╰────
help: Replace '\8' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\1\0\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\0\8\9'
· ────
╰────
help: Replace '\0\8' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\0\8\9'
· ──
╰────
help: Replace '\8' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\0\8\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\0\8\9'
· ──
╰────
help: Replace '\9' with '9'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\0\8\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\0\9'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\8\0\9'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:4]
1 │ '\8\0\9'
· ────
╰────
help: Replace '\0\9' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\8\0\9'
· ──
╰────
help: Replace '\9' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\9' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\8\0\9'
· ──
╰────
help: Replace '\9' with '\\9' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:3]
1 │ '0\8'
· ──
╰────
help: Replace '\8' with '8'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:3]
1 │ '0\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\\0\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\0 \8'
· ─────
╰────
help: Replace '\0\8' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\0 \8'
· ──
╰────
help: Replace '\8' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\0 \8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\0\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:2]
1 │ '\01\8'
· ─────
╰────
help: Replace '\0\8' with '\u00008'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\01\8'
· ──
╰────
help: Replace '\8' with '\u0038'. This maintains the current functionality.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:5]
1 │ '\01\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:6]
1 │ '\0\1\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.
⚠ eslint(no-nonoctal-decimal-escape): Don't use '\8' escape sequence.
╭─[no_nonoctal_decimal_escape.tsx:1:7]
1 │ '\0\\n\8'
· ──
╰────
help: Replace '\8' with '\\8' to include the actual backslash character.