use crate::ascii_ci::{ci_find, contains_path_segment, contains_path_segment_two};
pub(crate) fn looks_like_secret_scanner_source(path: Option<&str>) -> bool {
let Some(p) = path else {
return false;
};
let bytes = p.as_bytes();
const NEEDLES: &[&[u8]] = &[
b"secretscanner",
b"secret-scanner",
b"secret_scanner",
b"credentialscanner",
b"credential-scanner",
b"credential_scanner",
b"trufflehog",
b"gitleaks",
b"detect-secrets",
b"detect_secrets",
];
NEEDLES.iter().any(|n| ci_find(bytes, n))
}
pub(crate) fn looks_like_vendored_minified_path(path: Option<&str>) -> bool {
let Some(p) = path else {
return false;
};
if contains_path_segment(p, "node_modules")
|| contains_path_segment_two(p, "public", "plugins")
|| contains_path_segment_two(p, "public", "static")
|| contains_path_segment_two(p, "public", "vendor")
|| contains_path_segment_two(p, "static", "vendor")
|| contains_path_segment(p, "wp-includes")
|| contains_path_segment_two(p, "wp-content", "plugins")
|| contains_path_segment_two(p, "wp-content", "themes")
|| contains_path_segment(p, "bower_components")
|| contains_path_segment(p, "jspm_packages")
|| contains_path_segment(p, "site-packages")
|| p.contains("/dist/vendor")
|| p.contains("\\dist\\vendor")
|| contains_path_segment_two(p, "dist", "assets")
|| contains_path_segment_two(p, "vendor", "assets")
|| p.ends_with(".min.js")
|| p.ends_with(".bundle.js")
|| p.ends_with(".min.css")
{
return true;
}
if p.contains("/app/assets/javascripts/")
|| p.contains("\\app\\assets\\javascripts\\")
|| p.contains("/vendor/javascripts/")
|| p.contains("\\vendor\\javascripts\\")
{
let basename = p.rsplit(['/', '\\']).next().unwrap_or(p);
let basename_bytes = basename.as_bytes();
const VENDORED_JS_PREFIXES: &[&[u8]] = &[
b"bootstrap",
b"jquery",
b"react.",
b"react-",
b"vue.",
b"vue-",
b"angular",
b"ember",
b"backbone",
b"lodash",
b"underscore",
b"moment",
b"alertify",
b"fullcalendar",
b"datatables",
b"highcharts",
b"chart.",
b"chart-",
b"select2",
b"tinymce",
b"ckeditor",
b"codemirror",
b"html5",
b"modernizr",
b"respond",
];
if VENDORED_JS_PREFIXES.iter().any(|prefix| {
basename_bytes
.get(..prefix.len())
.is_some_and(|p| p.eq_ignore_ascii_case(prefix))
}) {
return true;
}
}
false
}