sniff/
roles_surface_hooks.rs1use 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}