use regex::Regex;
use std::sync::LazyLock;
static GENERATED_COMMENT: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(r"(?i)(?:generated\s+(?:by|from|using)|auto[- ]?generated|do\s+not\s+edit|machine\s+generated|this\s+file\s+is\s+generated)").expect("valid regex")
});
static UMD_WRAPPER: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(r"^\s*\(function\s*\(\s*\w+\s*,\s*\w+\s*\)\s*\{").expect("valid regex")
});
static COMMONJS_WRAPPER: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(r#"^(?:'use strict';\s*)?(?:Object\.defineProperty\(exports|exports\.\w+\s*=|module\.exports\s*=)"#).expect("valid regex")
});
pub fn is_likely_bundled_path(path: &str) -> bool {
let path_lower = path.to_lowercase();
let p = if path_lower.starts_with('/') {
path_lower
} else {
format!("/{}", path_lower)
};
p.contains("/dist/")
|| p.contains("/build/")
|| p.contains("/npm/")
|| p.contains("/cjs/")
|| p.contains("/esm/")
|| p.contains("/umd/")
|| p.contains(".min.")
|| p.contains(".bundle.")
|| p.contains("/fixtures/")
|| p.contains("/__fixtures__/")
|| p.contains("/legacy-")
|| p.contains("/devtools-")
|| p.contains("-devtools/")
}
pub fn is_non_production_path(path: &str) -> bool {
let path_lower = path.to_lowercase();
path_lower.starts_with("scripts/")
|| path_lower.contains("/scripts/")
|| path_lower.starts_with(".github/")
|| path_lower.contains("/.github/")
|| path_lower.starts_with("ci/")
|| path_lower.contains("/ci/")
|| path_lower.starts_with("test/")
|| path_lower.contains("/test/")
|| path_lower.starts_with("tests/")
|| path_lower.contains("/tests/")
|| path_lower.contains("/__tests__/")
|| path_lower.contains("/__mocks__/")
|| path_lower.starts_with("spec/")
|| path_lower.contains("/spec/")
|| path_lower.contains("_test.")
|| path_lower.contains(".test.")
|| path_lower.contains(".spec.")
|| path_lower.contains("/fixtures/")
|| path_lower.contains("/__fixtures__/")
|| path_lower.starts_with("examples/")
|| path_lower.contains("/examples/")
|| path_lower.starts_with("example/")
|| path_lower.contains("/example/")
|| path_lower.starts_with("docs/")
|| path_lower.contains("/docs/")
|| path_lower.contains("/benchmark/")
|| path_lower.contains("/benchmarks/")
|| path_lower.starts_with("tools/")
|| path_lower.contains("/tools/")
|| path_lower.contains("/devtools/")
}
pub fn is_compiler_code_path(path: &str) -> bool {
let path_lower = path.to_lowercase();
path_lower.contains("/compiler/")
|| path_lower.contains("/babel-plugin-")
|| path_lower.contains("/hir/")
|| path_lower.contains("/mir/")
|| path_lower.contains("/ast/")
|| path_lower.contains("/parser/")
|| path_lower.contains("/transform")
}
pub fn is_bundled_code(content: &str) -> bool {
let header: String = content.chars().take(1000).collect();
if header.starts_with("/*!")
|| header.starts_with("/** @license")
|| header.starts_with("/**\n * @license")
{
return true;
}
if header.contains("__webpack_require__")
|| header.contains("__webpack_exports__")
|| header.contains("System.register")
|| header.contains("define([\"require\"")
|| header.contains("define(['require'")
{
return true;
}
if UMD_WRAPPER.is_match(&header) {
return true;
}
if COMMONJS_WRAPPER.is_match(&header) {
if content.contains("process.env.NODE_ENV") {
return true;
}
}
if GENERATED_COMMENT.is_match(&header) {
return true;
}
if content.contains("//# sourceMappingURL=") {
return true;
}
false
}
pub fn is_minified_code(content: &str) -> bool {
let line_count = content.lines().count();
if line_count == 0 {
return false;
}
let avg_line_len = content.len() / line_count;
if avg_line_len > 500 {
return true;
}
for line in content.lines().take(5) {
let trimmed = line.trim();
if trimmed.len() > 500 {
let semicolons = trimmed.matches(';').count();
if semicolons > 20 {
return true;
}
}
}
false
}
pub fn is_ast_manipulation_code(func_name: &str, content: &str) -> bool {
let name_lower = func_name.to_lowercase();
if name_lower.starts_with("visit")
|| name_lower.starts_with("transform")
|| name_lower.starts_with("traverse")
|| name_lower.starts_with("enter")
|| name_lower.starts_with("exit")
|| name_lower.starts_with("parse")
|| name_lower.starts_with("emit")
|| name_lower.starts_with("lower")
|| name_lower.starts_with("infer")
{
return true;
}
let ast_keywords = [
"AST",
"Node",
"visitor",
"Expr",
"Stmt",
"Decl",
"Identifier",
"Literal",
"BinaryExpression",
"CallExpression",
"FunctionDeclaration",
"VariableDeclaration",
"BlockStatement",
];
let content_sample: String = content.chars().take(2000).collect();
let matches = ast_keywords
.iter()
.filter(|kw| content_sample.contains(*kw))
.count();
matches >= 3
}
#[allow(dead_code)] pub fn is_test_infrastructure(file_path: &str, content: &str) -> bool {
let path_lower = file_path.to_lowercase();
let header: String = content.chars().take(500).collect();
if header.contains("@fixture")
|| header.contains("@mock")
|| header.contains("// test fixture")
|| header.contains("// mock")
|| header.contains("/* fixture")
{
return true;
}
if path_lower.contains("setuptest")
|| path_lower.contains("testsetup")
|| path_lower.contains("jest.config")
|| path_lower.contains("jest.setup")
{
return true;
}
if header.contains("jest.fn()")
|| header.contains("jest.mock(")
|| header.contains("vi.fn()")
|| header.contains("sinon.stub")
|| header.contains("Mock")
{
let mock_count = content.matches("mock").count()
+ content.matches("Mock").count()
+ content.matches("stub").count()
+ content.matches("fake").count();
if mock_count >= 3 {
return true;
}
}
false
}
pub fn is_fixture_code(_file_path: &str, content: &str) -> bool {
let header: String = content.chars().take(1000).collect();
if header.contains("@fixture")
|| header.contains("// fixture")
|| header.contains("/* fixture")
|| header.contains("# fixture")
|| header.contains("test fixture")
{
return true;
}
let placeholder_count = content.matches("foo").count()
+ content.matches("bar").count()
+ content.matches("baz").count()
+ content.matches("qux").count();
if placeholder_count >= 4 && content.len() < 5000 {
return true;
}
let example_markers = [
"// input:",
"// output:",
"// expected:",
"// before:",
"// after:",
];
let marker_count = example_markers
.iter()
.filter(|m| content.contains(*m))
.count();
if marker_count >= 2 {
return true;
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_webpack_detection() {
let code = r#"(function(modules) { __webpack_require__(0); })"#;
assert!(is_bundled_code(code));
}
#[test]
fn test_minified_detection() {
let code = "a={b:c,d:e,f:g,h:i,j:k,l:m,n:o,p:q,r:s,t:u,v:w,x:y,z:0};".repeat(100);
assert!(is_minified_code(&code));
}
#[test]
fn test_ast_code_detection() {
let code = "function visitExpression(node: AST.Expression) { traverse(node.Identifier); }";
assert!(is_ast_manipulation_code("visitExpression", code));
}
}
#[cfg(test)]
mod react_tests {
use super::*;
#[test]
fn test_react_license_header() {
let content = r#"/** @license React v0.14.10
* react-jsx-dev-runtime.development.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*/
'use strict';
"#;
assert!(
is_bundled_code(content),
"Should detect React license header as bundled"
);
}
}