@pierrad/web-carbon-analyzer
Version:
A tool to measure the carbon footprint of websites using CO2.js
225 lines (224 loc) • 5.7 kB
TypeScript
/**
* 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;
}