Skip to main content

sniff/
roles_surface_hooks.rs

1use crate::roles::{file_name, normalize_path};
2use crate::types::FileRecord;
3
4fn is_common_hydration_hook_name(name: &str) -> bool {
5    matches!(
6        name,
7        "usehasmounted.ts"
8            | "usehasmounted.tsx"
9            | "useismounted.ts"
10            | "useismounted.tsx"
11            | "usebrowser.ts"
12            | "usebrowser.tsx"
13    )
14}
15
16pub fn is_hydration_hook_module(file: &FileRecord) -> bool {
17    let normalized = normalize_path(&file.file_path);
18    if !normalized.contains("/hooks/") {
19        return false;
20    }
21
22    let name = file_name(&normalized);
23    if is_common_hydration_hook_name(name) {
24        return true;
25    }
26
27    let lowered = file.source.to_lowercase();
28    lowered.contains("useeffect(")
29        && lowered.contains("settimeout(")
30        && lowered.contains("cleartimeout(")
31        && lowered.contains("usestate(false)")
32        && lowered.contains("return hasmounted")
33}