#![allow(unused_imports)]
pub mod browser {
pub use bao_browser::*;
}
pub mod engine {
pub use bao_engine::*;
}
pub mod runtime {
pub use bun_runtime::*;
}
pub mod cdp {
pub use bao_cdp::*;
}
pub mod cdp_client {
pub use bao_cdp_client::*;
}
pub mod stealth {
pub use bao_stealth::*;
}
pub mod uloop {
pub use bao_uloop::*;
}
pub use bao_browser::{
BaoConfig, BaoRuntime, BrowserConfig, BrowserError, PageConfig, PageHandle, PagePool,
PageState, Permission, PermissionDenied, PermissionGuard, ScreenshotFormat, encode_image,
run_browser,
};
pub use bao_stealth::{
AudioProfile, BehaviorConfig, BehaviorSimulator, CanvasNoise, FontConfig, Http2Fingerprint,
NavigatorProfile, ScreenProfile, StealthEngine, StealthHooks, StealthProfile,
StealthTlsWireConfig, TlsFingerprint, WebGLProfile,
};
pub use bao_cdp_client::{
Browser, CdpError, ConnectError, Connection, ConnectionConfig, Cookie, DeviceDescriptor,
Viewport, WaitUntilState,
};
pub use bao_cdp::{BackendKind, CdpRouter, CdpServer, CdpSession};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cargo_toml_always_depends_on_full_stack() {
let manifest = include_str!("../Cargo.toml");
let required = [
"bao_browser",
"bao_engine",
"bun_runtime",
"bao_cdp",
"bao_cdp_client",
"bao_stealth",
"bao_uloop",
];
for dep in required {
assert!(
manifest.contains(dep),
"public package must always depend on {dep} (unified full stack)"
);
}
let code_lines = || {
manifest.lines().filter(|l| {
let t = l.trim_start();
!t.is_empty() && !t.starts_with('#')
})
};
assert!(
code_lines().all(|l| !l.contains("native-stubs")),
"native-stubs feature must be removed (product never force-links stubs)"
);
assert!(
code_lines().all(|l| !l.contains("bao_native_stubs")),
"bao must not declare dep on bao_native_stubs (even optional)"
);
assert!(
manifest.contains("default = []"),
"product has no capability features; default remains empty"
);
}
#[test]
fn stealth_profile_firefox_default_is_available() {
let profile = StealthProfile::firefox_default();
let engine = StealthEngine::new(profile);
let _tls = engine.tls_config();
let _nav = engine.navigator();
assert!(std::mem::size_of_val(engine.profile()) > 0);
}
#[test]
fn browser_config_defaults_construct() {
let cfg = BaoConfig::default();
let page = PageConfig::default();
let _ = (cfg, page, ScreenshotFormat::Png);
let _name = std::any::type_name::<BaoRuntime>();
assert!(_name.contains("BaoRuntime"));
}
#[test]
fn cdp_browser_type_is_reexported() {
let name = std::any::type_name::<Browser>();
assert!(name.contains("Browser"));
let _ = std::any::type_name::<ConnectError>();
let _ = std::any::type_name::<CdpRouter>();
let _ = std::any::type_name::<CdpServer>();
}
#[test]
fn namespaced_modules_resolve_core_types() {
let _ = std::any::type_name::<browser::PagePool>();
let _ = std::any::type_name::<stealth::StealthEngine>();
let _ = std::any::type_name::<cdp_client::Browser>();
let _ = std::any::type_name::<cdp::CdpRouter>();
}
}