UNPKG

@pierrad/web-carbon-analyzer

Version:

A tool to measure the carbon footprint of websites using CO2.js

225 lines (224 loc) 5.7 kB
/** * Core TypeScript interfaces for the Web Carbon Analyzer */ export interface BrowserConfig { type: 'chromium' | 'firefox' | 'webkit'; headless: boolean; timeout: number; networkIdleTimeout: number; waitForNetworkIdle: boolean; viewport: { width: number; height: number; }; userAgent?: string; httpCredentials?: { username: string; password: string; }; remoteDebuggingPort?: number; } export interface UserBehaviorConfig { scrollDepth: number; scrollDelay: number; maxScrollTime: number; } export interface CO2Config { model: 'swd' | '1byte'; includeGreenHostingCheck: boolean; } export interface OutputConfig { format: 'json' | 'csv'; includeResourceDetails: boolean; includeComparisons: boolean; } export interface LoggingConfig { level: string; console: boolean; file: boolean; filePath: string; } export interface LighthouseConfig { enabled?: boolean; port?: number; thresholds?: { performance?: number; accessibility?: number; 'best-practices'?: number; seo?: number; pwa?: number; }; opts?: Record<string, any>; config?: Record<string, any>; reports?: { formats?: { json?: boolean; html?: boolean; csv?: boolean; }; name?: string; directory?: string; }; } export interface AppConfig { browser: BrowserConfig; userBehavior: UserBehaviorConfig; co2: CO2Config; output: OutputConfig; logging: LoggingConfig; lighthouse?: LighthouseConfig; } export interface Resource { id: string; url: string; resourceType: string; method: string; requestTime: number; responseTime: number | null; size: { compressed: number | null; uncompressed: number | null; }; status: number | null; headers: { request: Record<string, string>; response: Record<string, string> | null; }; fromCache: boolean; error: string | null; } export interface ResourcesData { allResources: Resource[]; totalResources: number; totalSize: number; totalDuration: number; sizeByType: Record<string, number>; resourcesByType: Record<string, Resource[]>; domains: Record<string, DomainData>; } export interface DomainData { size: number; count: number; } export interface EmissionsData { totalEmissions: number; byType: Record<string, TypeEmissions>; byDomain: Record<string, DomainEmissions>; byGreenHosting: GreenHostingEmissions; perResource: ResourceEmissions[]; comparisons: Comparisons; } export interface TypeEmissions { size: number; emissions: number; count: number; } export interface DomainEmissions { size: number; emissions: number; count: number; isGreen: boolean | null; } export interface GreenHostingEmissions { green: TypeEmissions; nonGreen: TypeEmissions; unknown: TypeEmissions; } export interface ResourceEmissions { url: string; type: string; size: number; domain: string; isGreen: boolean | null; emissions: number; } export interface Comparisons { treeSeconds: number; carMeters: number; smartphoneCharges: number; waterBoiledML: number; } export interface LighthouseScores { performance: number; accessibility: number; bestPractices: number; seo: number; pwa: number; } export interface LighthouseMetrics { firstContentfulPaint: number | undefined; largestContentfulPaint: number | undefined; totalBlockingTime: number | undefined; speedIndex: number | undefined; timeToInteractive: number | undefined; cumulativeLayoutShift: number | undefined; } export interface LighthouseResults { scores: LighthouseScores; metrics: LighthouseMetrics; rawData?: Record<string, any>; } export interface FormattedResults { metadata: ResultsMetadata; summary: ResultsSummary; breakdowns: ResultsBreakdowns; resources?: ResourceEmissions[]; lighthouse?: LighthouseResults; } export interface ResultsMetadata { url: string; timestamp: string; duration: number; configuration: Record<string, any>; [key: string]: any; } export interface ResultsSummary { totalEmissions: number; totalSize: number; totalRequests: number; percentageGreen: number; comparisons: Comparisons; } export interface ResultsBreakdowns { byType: Record<string, TypeEmissions>; byDomain: Record<string, DomainEmissions>; byHosting: Record<string, TypeEmissions>; } export interface ResultsSummary { totalEmissions: number; totalSize: number; totalRequests: number; percentageGreen: number; comparisons: Comparisons; } export interface ResultsBreakdowns { byType: Record<string, TypeEmissions>; byDomain: Record<string, DomainEmissions>; byHosting: Record<string, TypeEmissions>; } export interface CLIOptions { url?: string; output?: string; format?: 'json' | 'csv'; timeout?: number; wait?: number; model?: 'swd' | '1byte'; scrollDepth?: number; verbose?: boolean; quiet?: boolean; detailed?: boolean; headless?: boolean; viewport?: string; userAgent?: string; cookies?: string; htaccessUsername?: string; htaccessPassword?: string; greenHostingCheck?: boolean; lighthouse?: boolean; lighthousePort?: number; lighthousePerformanceThreshold?: number; lighthouseAccessibilityThreshold?: number; lighthouseBestPracticesThreshold?: number; lighthouseSeoThreshold?: number; [key: string]: any; }