use bitcode::{Decode, Encode};
use crate::MemberKind;
pub(super) const CACHE_VERSION: u32 = 309;
pub const DUPES_CACHE_VERSION: u32 = 14;
pub const DEFAULT_CACHE_MAX_SIZE: usize = 256 * 1024 * 1024;
pub(super) const EVICTION_TRIGGER_BPS: usize = 8000;
pub(super) const EVICTION_TARGET_BPS: usize = 6000;
pub(super) const EVICTION_SIGNIFICANT_BPS: usize = 2500;
pub(super) const IMPORT_KIND_NAMED: u8 = 0;
pub(super) const IMPORT_KIND_DEFAULT: u8 = 1;
pub(super) const IMPORT_KIND_NAMESPACE: u8 = 2;
pub(super) const IMPORT_KIND_SIDE_EFFECT: u8 = 3;
macro_rules! assert_cached_type_size {
($ty:ty, $size:expr) => {
const _: () = assert!(
std::mem::size_of::<$ty>() == $size,
concat!(
stringify!($ty),
" size changed; bump CACHE_VERSION if the cached wire shape or extraction semantics changed, then update this assertion"
)
);
};
}
assert_cached_type_size!(CachedModule, 1368);
assert_cached_type_size!(CachedNamespaceObjectAlias, 72);
assert_cached_type_size!(CachedLocalTypeDeclaration, 32);
assert_cached_type_size!(CachedPublicSignatureTypeReference, 56);
assert_cached_type_size!(CachedSuppression, 88);
assert_cached_type_size!(CachedUnknownSuppressionKind, 56);
assert_cached_type_size!(CachedExport, 152);
assert_cached_type_size!(CachedImport, 96);
assert_cached_type_size!(CachedDynamicImport, 88);
assert_cached_type_size!(CachedRequireCall, 96);
assert_cached_type_size!(CachedReExport, 104);
assert_cached_type_size!(CachedMember, 64);
assert_cached_type_size!(CachedDynamicImportPattern, 64);
assert_cached_type_size!(crate::MemberAccess, 48);
assert_cached_type_size!(fallow_types::extract::SemanticFact, 96);
assert_cached_type_size!(fallow_types::extract::CalleeUse, 32);
assert_cached_type_size!(fallow_types::extract::MisplacedDirectiveSite, 8);
assert_cached_type_size!(fallow_types::extract::SinkSite, 216);
assert_cached_type_size!(fallow_types::extract::FunctionComplexity, 96);
assert_cached_type_size!(fallow_types::extract::ComplexityContribution, 16);
assert_cached_type_size!(fallow_types::extract::FlagUse, 80);
assert_cached_type_size!(fallow_types::extract::ClassHeritageInfo, 168);
assert_cached_type_size!(fallow_types::extract::FactoryReturnExport, 48);
assert_cached_type_size!(fallow_types::extract::TypeMemberTypeEntry, 72);
assert_cached_type_size!(fallow_types::extract::LoadReturnKey, 32);
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedModule {
pub content_hash: u64,
pub mtime_ns: u64,
pub ctime_ns: u64,
pub file_size: u64,
pub last_access_secs: u64,
pub exports: Vec<CachedExport>,
pub imports: Vec<CachedImport>,
pub re_exports: Vec<CachedReExport>,
pub dynamic_imports: Vec<CachedDynamicImport>,
pub require_calls: Vec<CachedRequireCall>,
pub package_path_references: Box<[String]>,
pub member_accesses: Vec<crate::MemberAccess>,
pub semantic_facts: Option<Box<[fallow_types::extract::SemanticFact]>>,
pub whole_object_uses: Box<[String]>,
pub dynamic_import_patterns: Vec<CachedDynamicImportPattern>,
pub parse_error_count: u32,
pub parse_panicked: bool,
pub has_cjs_exports: bool,
pub has_angular_component_template_url: bool,
pub unused_import_bindings: Vec<String>,
pub type_referenced_import_bindings: Vec<String>,
pub value_referenced_import_bindings: Vec<String>,
pub suppressions: Vec<CachedSuppression>,
pub unknown_suppression_kinds: Vec<CachedUnknownSuppressionKind>,
pub line_offsets: Vec<u32>,
pub complexity: Vec<fallow_types::extract::FunctionComplexity>,
pub complexity_extracted: bool,
pub flag_uses: Vec<fallow_types::extract::FlagUse>,
pub flag_registry_facts: Option<Box<fallow_types::extract::FlagRegistryFacts>>,
pub class_heritage: Vec<fallow_types::extract::ClassHeritageInfo>,
pub exported_factory_returns: Option<Box<[fallow_types::extract::FactoryReturnExport]>>,
pub exported_factory_return_object_shapes:
Option<Box<[fallow_types::extract::FactoryReturnObjectShapeExport]>>,
pub type_member_types: Option<Box<[fallow_types::extract::TypeMemberTypeEntry]>>,
pub injection_tokens: Vec<(String, String)>,
pub local_type_declarations: Vec<CachedLocalTypeDeclaration>,
pub public_signature_type_references: Vec<CachedPublicSignatureTypeReference>,
pub namespace_object_aliases: Vec<CachedNamespaceObjectAlias>,
pub iconify_prefixes: Vec<String>,
pub iconify_icon_names: Vec<String>,
pub auto_import_candidates: Vec<String>,
pub directives: Vec<String>,
pub client_only_dynamic_import_spans: Vec<u32>,
pub security_sinks: Vec<fallow_types::extract::SinkSite>,
pub security_sinks_skipped: u32,
pub security_unresolved_callee_sites: Vec<fallow_types::extract::SkippedSecurityCalleeSite>,
pub tainted_bindings: Vec<fallow_types::extract::TaintedBinding>,
pub sanitized_sink_args: Vec<fallow_types::extract::SanitizedSinkArg>,
pub security_control_sites: Vec<fallow_types::extract::SecurityControlSite>,
pub callee_uses: Vec<fallow_types::extract::CalleeUse>,
pub misplaced_directives: Vec<fallow_types::extract::MisplacedDirectiveSite>,
pub inline_server_action_exports: Vec<String>,
pub di_key_sites: Vec<fallow_types::extract::DiKeySite>,
pub has_dynamic_provide: bool,
pub component_props: Vec<fallow_types::extract::ComponentProp>,
pub has_props_attrs_fallthrough: bool,
pub has_define_expose: bool,
pub has_define_model: bool,
pub has_unharvestable_props: bool,
pub component_emits: Vec<fallow_types::extract::ComponentEmit>,
pub angular_inputs: Vec<fallow_types::extract::AngularInputMember>,
pub angular_outputs: Vec<fallow_types::extract::AngularOutputMember>,
pub angular_component_selectors: Vec<fallow_types::extract::AngularComponentSelector>,
pub registered_custom_elements: Vec<fallow_types::extract::RegisteredCustomElement>,
pub used_custom_element_tags: Vec<String>,
pub angular_used_selectors: Vec<String>,
pub angular_entry_component_refs: Vec<String>,
pub has_dynamic_component_render: bool,
pub has_unharvestable_emits: bool,
pub has_dynamic_emit: bool,
pub has_emit_whole_object_use: bool,
pub load_return_keys: Vec<fallow_types::extract::LoadReturnKey>,
pub has_unharvestable_load: bool,
pub has_load_data_whole_use: bool,
pub component_functions: Vec<fallow_types::extract::ComponentFunction>,
pub react_props: Vec<fallow_types::extract::ComponentProp>,
pub hook_uses: Vec<fallow_types::extract::HookUse>,
pub render_edges: Vec<fallow_types::extract::RenderEdge>,
pub svelte_dispatched_events: Vec<fallow_types::extract::DispatchedEvent>,
pub svelte_listened_events: Vec<String>,
pub has_dynamic_dispatch: bool,
}
impl CachedModule {
#[must_use]
pub fn source_fingerprint(&self) -> fallow_types::source_fingerprint::SourceFingerprint {
fallow_types::source_fingerprint::SourceFingerprint::with_ctime(
self.mtime_ns,
self.ctime_ns,
self.file_size,
)
}
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedNamespaceObjectAlias {
pub via_export_name: String,
pub suffix: String,
pub namespace_local: String,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedLocalTypeDeclaration {
pub name: String,
pub span_start: u32,
pub span_end: u32,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedPublicSignatureTypeReference {
pub export_name: String,
pub type_name: String,
pub span_start: u32,
pub span_end: u32,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedSuppression {
pub(crate) line: u32,
pub(crate) comment_line: u32,
pub(crate) kind: u8,
pub(crate) policy_pack: String,
pub(crate) policy_rule_id: String,
pub(crate) reason: Option<String>,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedUnknownSuppressionKind {
pub comment_line: u32,
pub is_file_level: bool,
pub token: String,
pub reason: Option<String>,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedExport {
pub(crate) name: String,
pub(crate) is_default: bool,
pub(crate) is_type_only: bool,
pub(crate) is_side_effect_used: bool,
pub(crate) visibility: u8,
pub(crate) expected_unused_reason: Option<String>,
pub(crate) deprecated: bool,
pub(crate) deprecated_reason: Option<Box<str>>,
pub(crate) local_name: Option<String>,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) members: Vec<CachedMember>,
pub(crate) super_class: Option<String>,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedImport {
pub(crate) source: String,
pub(crate) imported_name: String,
pub(crate) local_name: String,
pub(crate) is_type_only: bool,
pub(crate) is_type_only_star: bool,
pub(crate) from_style: bool,
pub(crate) kind: u8,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) source_span_start: u32,
pub(crate) source_span_end: u32,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedDynamicImport {
pub(crate) source: String,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) destructured_names: Vec<String>,
pub(crate) local_name: Option<String>,
pub(crate) is_speculative: bool,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedRequireCall {
pub(crate) source: String,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) source_span_start: u32,
pub(crate) source_span_end: u32,
pub(crate) destructured_names: Vec<String>,
pub(crate) local_name: Option<String>,
pub(crate) is_type_only: bool,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedReExport {
pub(crate) source: String,
pub(crate) imported_name: String,
pub(crate) exported_name: String,
pub(crate) is_type_only: bool,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) statement_span_start: u32,
pub(crate) statement_span_end: u32,
pub(crate) source_span_start: u32,
pub(crate) source_span_end: u32,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedMember {
pub(crate) name: String,
pub(crate) kind: MemberKind,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) has_decorator: bool,
pub(crate) decorator_names: Vec<String>,
pub(crate) is_instance_returning_static: bool,
pub(crate) is_self_returning: bool,
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CachedDynamicImportPattern {
pub(crate) prefix: String,
pub(crate) suffix: Option<String>,
pub(crate) span_start: u32,
pub(crate) span_end: u32,
pub(crate) mechanism: crate::ModuleLoadMechanism,
}