pub mod large_component;
pub mod no_array_index_key;
pub mod no_component_in_component;
pub mod no_expensive_in_render;
pub mod no_inline_jsx_fn;
pub mod no_json_in_render;
pub mod no_math_random_in_render;
pub mod no_new_context_value;
pub mod no_new_in_jsx_prop;
pub mod no_object_entries_in_render;
pub mod no_regex_in_render;
pub mod no_unstable_hook_deps;
pub mod no_use_state_lazy_init_missing;
pub mod no_useless_memo;
pub mod unstable_props;
use std::path::{Path, PathBuf};
use oxc_ast::ast::Program;
use crate::rules::large_component::LargeComponent;
use crate::rules::no_array_index_key::NoArrayIndexKey;
use crate::rules::no_component_in_component::NoComponentInComponent;
use crate::rules::no_expensive_in_render::NoExpensiveInRender;
use crate::rules::no_inline_jsx_fn::NoInlineJsxFn;
use crate::rules::no_json_in_render::NoJsonInRender;
use crate::rules::no_math_random_in_render::NoMathRandomInRender;
use crate::rules::no_new_context_value::NoNewContextValue;
use crate::rules::no_new_in_jsx_prop::NoNewInJsxProp;
use crate::rules::no_object_entries_in_render::NoObjectEntriesInRender;
use crate::rules::no_regex_in_render::NoRegexInRender;
use crate::rules::no_unstable_hook_deps::NoUnstableHookDeps;
use crate::rules::no_use_state_lazy_init_missing::NoUseStateLazyInitMissing;
use crate::rules::no_useless_memo::NoUselessMemo;
use crate::rules::unstable_props::UnstableProps;
#[derive(Debug, Clone, serde::Serialize)]
pub struct Issue {
pub rule: String,
pub message: String,
pub file: PathBuf,
pub line: u32,
pub column: u32,
pub severity: Severity,
}
#[derive(Debug, Clone, serde::Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Severity {
Warning,
#[allow(dead_code)] Error,
}
impl std::fmt::Display for Severity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Severity::Warning => write!(f, "warning"),
Severity::Error => write!(f, "error"),
}
}
}
pub struct RuleContext<'a> {
pub program: &'a Program<'a>,
pub source_text: &'a str,
pub file_path: &'a Path,
pub max_component_lines: usize,
}
pub trait Rule: Send + Sync {
#[allow(dead_code)]
fn name(&self) -> &str;
fn run(&self, ctx: &RuleContext<'_>) -> Vec<Issue>;
}
pub fn all_rules() -> Vec<Box<dyn Rule>> {
vec![
Box::new(NoInlineJsxFn),
Box::new(UnstableProps),
Box::new(LargeComponent),
Box::new(NoNewContextValue),
Box::new(NoArrayIndexKey),
Box::new(NoExpensiveInRender),
Box::new(NoComponentInComponent),
Box::new(NoUnstableHookDeps),
Box::new(NoNewInJsxProp),
Box::new(NoUseStateLazyInitMissing),
Box::new(NoJsonInRender),
Box::new(NoObjectEntriesInRender),
Box::new(NoRegexInRender),
Box::new(NoMathRandomInRender),
Box::new(NoUselessMemo),
]
}