use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::semantic::{
ApiSurfaceResult, SemanticAnalysisIdentity, SemanticCandidateDecision, SemanticGapReason,
SemanticQuerySummary, SemanticSymbolImpact, SemanticSymbolTrace, TypeCouplingReport,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(transparent)]
pub struct SchemaVersion(pub u32);
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(transparent)]
pub struct ToolVersion(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(transparent)]
pub struct ElapsedMs(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(transparent)]
pub struct AuditIntroduced(pub bool);
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct EntryPoints {
pub total: usize,
pub sources: BTreeMap<String, usize>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct CheckSummary {
pub total_issues: usize,
pub unused_files: usize,
pub unused_exports: usize,
pub unused_types: usize,
pub private_type_leaks: usize,
pub unused_dependencies: usize,
pub unused_enum_members: usize,
pub unused_class_members: usize,
#[serde(default)]
pub unused_store_members: usize,
#[serde(default)]
pub unprovided_injects: usize,
#[serde(default)]
pub unrendered_components: usize,
#[serde(default)]
pub unused_component_props: usize,
#[serde(default)]
pub unused_component_emits: usize,
#[serde(default)]
pub unused_component_inputs: usize,
#[serde(default)]
pub unused_component_outputs: usize,
#[serde(default)]
pub unused_svelte_events: usize,
#[serde(default)]
pub unused_server_actions: usize,
#[serde(default)]
pub unused_load_data_keys: usize,
pub unresolved_imports: usize,
pub unlisted_dependencies: usize,
pub duplicate_exports: usize,
pub type_only_dependencies: usize,
pub test_only_dependencies: usize,
pub dev_dependencies_in_production: usize,
pub circular_dependencies: usize,
#[serde(default)]
pub re_export_cycles: usize,
pub boundary_violations: usize,
#[serde(default)]
pub boundary_coverage_violations: usize,
#[serde(default)]
pub boundary_call_violations: usize,
#[serde(default)]
pub policy_violations: usize,
pub stale_suppressions: usize,
pub unused_catalog_entries: usize,
pub empty_catalog_groups: usize,
pub unresolved_catalog_references: usize,
pub unused_dependency_overrides: usize,
pub misconfigured_dependency_overrides: usize,
#[serde(default)]
pub invalid_client_exports: usize,
#[serde(default)]
pub mixed_client_server_barrels: usize,
#[serde(default)]
pub misplaced_directives: usize,
#[serde(default)]
pub route_collisions: usize,
#[serde(default)]
pub dynamic_segment_name_conflicts: usize,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BaselineDeltas {
pub total_delta: i64,
pub per_category: BTreeMap<String, BaselineCategoryDelta>,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BaselineCategoryDelta {
pub current: usize,
pub baseline: usize,
pub delta: i64,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BaselineMatch {
pub entries: usize,
pub matched: usize,
}
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RegressionResult {
pub status: RegressionStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub baseline_total: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub current_total: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delta: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tolerance: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tolerance_kind: Option<RegressionToleranceKind>,
pub exceeded: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum RegressionStatus {
Pass,
Exceeded,
Skipped,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum RegressionToleranceKind {
Absolute,
Percentage,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Meta {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub docs: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub telemetry: Option<TelemetryMeta>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub type_aware: Option<TypeAwareMeta>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub field_definitions: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub metrics: BTreeMap<String, MetaMetric>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub rules: BTreeMap<String, MetaRule>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TypeAwareMeta {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identity: Option<SemanticAnalysisIdentity>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required_completeness: Option<crate::semantic::SemanticCompletenessRequirement>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub queries: Vec<SemanticQuerySummary>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub candidate_decisions: Vec<SemanticCandidateDecision>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub symbol_traces: Vec<SemanticSymbolTrace>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub api_surface: Option<ApiSurfaceResult>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub symbol_impacts: Vec<SemanticSymbolImpact>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub type_coupling: Option<TypeCouplingReport>,
pub executed: bool,
pub protocol_version: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sidecar_version: Option<String>,
pub backend: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub backend_version: Option<String>,
pub selected_tsconfigs: Vec<String>,
pub candidate_count: usize,
pub confirmed_used_count: usize,
pub contract_preserved_count: usize,
pub no_static_references_count: usize,
pub fix_eligible_count: usize,
pub unresolved_count: usize,
pub abstained_count: usize,
pub abstention_reasons: TypeAwareAbstentionCounts,
pub projects: Vec<TypeAwareProjectMeta>,
pub warning_count: usize,
pub warnings: Vec<String>,
pub elapsed_ms: u64,
pub phase_timings_ms: TypeAwarePhaseTimings,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum TypeAwareAbstentionReason {
#[default]
NoProject,
AmbiguousProject,
BlockingDiagnostics,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TypeAwareAbstentionCounts {
pub no_project: usize,
pub ambiguous_project: usize,
pub blocking_diagnostics: usize,
pub unknown_symbol: usize,
pub unsupported_syntax: usize,
pub capacity: usize,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum TypeAwareProjectSource {
#[default]
Auto,
Explicit,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum TypeAwareProjectStatus {
#[default]
Refined,
Abstained,
Complete,
Unavailable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum TypeAwareInvalidationKind {
Full,
Incremental,
None,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TypeAwarePhaseTimings {
pub project_setup: u64,
pub diagnostics: u64,
pub symbol_scan: u64,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TypeAwareProjectMeta {
pub config: String,
pub source: TypeAwareProjectSource,
pub status: TypeAwareProjectStatus,
pub candidate_count: usize,
pub confirmed_used_count: usize,
pub contract_preserved_count: usize,
pub no_static_references_count: usize,
pub fix_eligible_count: usize,
pub unresolved_count: usize,
pub abstained_count: usize,
pub blocking_diagnostic_count: usize,
pub source_file_count: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub program_reused: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub program_shared_across_queries: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub program_reused_from_previous_snapshot: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub snapshot_revision: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invalidation_kind: Option<TypeAwareInvalidationKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason_code: Option<SemanticGapReason>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "schema", schemars(with = "TypeAwareAbstentionReason"))]
pub abstain_reason: Option<TypeAwareAbstentionReason>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TelemetryMeta {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub analysis_run_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct MetaMetric {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub range: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub interpretation: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct MetaRule {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub docs: Option<String>,
}