UNPKG

website-carbon-meter

Version:

Tracks the carbon emissions of a website as live metrics. Based on CO2.js and the actual grid intensity.

1 lines 87.6 kB
{"version":3,"file":"website-carbon-meter.umd.cjs","sources":["../node_modules/@tgwf/co2/dist/esm/1byte.js","../node_modules/@tgwf/co2/dist/esm/constants/file-size.js","../node_modules/@tgwf/co2/dist/esm/data/average-intensities.min.js","../node_modules/@tgwf/co2/dist/esm/constants/index.js","../node_modules/@tgwf/co2/dist/esm/helpers/index.js","../node_modules/@tgwf/co2/dist/esm/sustainable-web-design-v3.js","../node_modules/@tgwf/co2/dist/esm/sustainable-web-design-v4.js","../node_modules/@tgwf/co2/dist/esm/co2.js","../node_modules/@tgwf/co2/dist/esm/hosting-json.js","../node_modules/@tgwf/co2/dist/esm/hosting-api.js","../node_modules/@tgwf/co2/dist/esm/hosting.js","../node_modules/@tgwf/co2/dist/esm/data/marginal-intensities-2021.min.js","../node_modules/@tgwf/co2/dist/esm/index.js","../lib/carbon.js"],"sourcesContent":["const CO2_PER_KWH_IN_DC_GREY = 519;\nconst CO2_PER_KWH_NETWORK_GREY = 475;\nconst CO2_PER_KWH_IN_DC_GREEN = 0;\nconst KWH_PER_BYTE_IN_DC = 72e-12;\nconst FIXED_NETWORK_WIRED = 429e-12;\nconst FIXED_NETWORK_WIFI = 152e-12;\nconst FOUR_G_MOBILE = 884e-12;\nconst KWH_PER_BYTE_FOR_NETWORK = (FIXED_NETWORK_WIRED + FIXED_NETWORK_WIFI + FOUR_G_MOBILE) / 3;\nconst KWH_PER_BYTE_FOR_DEVICES = 13e-11;\nclass OneByte {\n constructor(options) {\n this.allowRatings = false;\n this.options = options;\n this.KWH_PER_BYTE_FOR_NETWORK = KWH_PER_BYTE_FOR_NETWORK;\n }\n perByte(bytes, green) {\n if (bytes < 1) {\n return 0;\n }\n if (green) {\n const Co2ForDC = bytes * KWH_PER_BYTE_IN_DC * CO2_PER_KWH_IN_DC_GREEN;\n const Co2forNetwork = bytes * KWH_PER_BYTE_FOR_NETWORK * CO2_PER_KWH_NETWORK_GREY;\n return Co2ForDC + Co2forNetwork;\n }\n const KwHPerByte = KWH_PER_BYTE_IN_DC + KWH_PER_BYTE_FOR_NETWORK;\n return bytes * KwHPerByte * CO2_PER_KWH_IN_DC_GREY;\n }\n}\nvar byte_default = OneByte;\nexport {\n OneByte,\n byte_default as default\n};\n","const GIGABYTE = 1e3 * 1e3 * 1e3;\nvar file_size_default = {\n GIGABYTE\n};\nexport {\n GIGABYTE,\n file_size_default as default\n};\n","const data = { \"AFG\": 132.53, \"AFRICA\": 547.83, \"ALB\": 24.29, \"DZA\": 634.61, \"ASM\": 611.11, \"AGO\": 174.73, \"ATG\": 611.11, \"ARG\": 353.96, \"ARM\": 264.54, \"ABW\": 561.22, \"ASEAN\": 570.43, \"ASIA\": 591.02, \"AUS\": 556.3, \"AUT\": 110.14, \"AZE\": 671.39, \"BHS\": 660.1, \"BHR\": 904.62, \"BGD\": 691.41, \"BRB\": 605.51, \"BLR\": 441.74, \"BEL\": 138.11, \"BLZ\": 225.81, \"BEN\": 584.07, \"BTN\": 23.33, \"BOL\": 531.69, \"BIH\": 600.94, \"BWA\": 847.91, \"BRA\": 96.4, \"BRN\": 893.91, \"BGR\": 335.33, \"BFA\": 467.53, \"BDI\": 250, \"CPV\": 558.14, \"KHM\": 417.71, \"CMR\": 305.42, \"CAN\": 165.15, \"CYM\": 642.86, \"CAF\": 0, \"TCD\": 628.57, \"CHL\": 291.11, \"CHN\": 583.61, \"COL\": 259.51, \"COM\": 642.86, \"COG\": 700, \"COD\": 24.46, \"COK\": 250, \"CRI\": 53.38, \"CIV\": 393.89, \"HRV\": 202.68, \"CUB\": 637.61, \"CYP\": 526.02, \"CZE\": 449.72, \"DNK\": 151.65, \"DJI\": 692.31, \"DMA\": 529.41, \"DOM\": 578.41, \"ECU\": 166.91, \"EGY\": 574.04, \"SLV\": 224.76, \"GNQ\": 591.84, \"ERI\": 631.58, \"EST\": 416.67, \"SWZ\": 172.41, \"ETH\": 24.64, \"EU\": 243.55, \"EUROPE\": 302.09, \"FLK\": 500, \"FRO\": 404.76, \"FJI\": 288.46, \"FIN\": 79.39, \"FRA\": 56.02, \"GUF\": 217.82, \"PYF\": 442.86, \"G20\": 477.79, \"G7\": 341.49, \"GAB\": 491.6, \"GMB\": 666.67, \"GEO\": 167.59, \"DEU\": 381.41, \"GHA\": 484, \"GRC\": 336.57, \"GRL\": 178.57, \"GRD\": 640, \"GLP\": 500, \"GUM\": 622.86, \"GTM\": 328.27, \"GIN\": 236.84, \"GNB\": 625, \"GUY\": 640.35, \"HTI\": 567.31, \"HND\": 282.27, \"HKG\": 699.5, \"HUN\": 204.01, \"ISL\": 27.68, \"IND\": 713.01, \"IDN\": 682.43, \"IRN\": 641.73, \"IRQ\": 688.81, \"IRL\": 283.71, \"ISR\": 582.93, \"ITA\": 330.72, \"JAM\": 555.56, \"JPN\": 493.59, \"JOR\": 540.92, \"KAZ\": 821.9, \"KEN\": 71.2, \"KIR\": 666.67, \"XKX\": 894.65, \"KWT\": 649.16, \"KGZ\": 147.29, \"LAO\": 265.51, \"LATIN AMERICA AND CARIBBEAN\": 259.77, \"LVA\": 123.99, \"LBN\": 599.01, \"LSO\": 20, \"LBR\": 227.85, \"LBY\": 818.69, \"LTU\": 160.07, \"LUX\": 105.26, \"MAC\": 448.98, \"MDG\": 436.44, \"MWI\": 66.67, \"MYS\": 607.88, \"MDV\": 611.77, \"MLI\": 408, \"MLT\": 444.03, \"MTQ\": 523.18, \"MRT\": 464.71, \"MUS\": 632.48, \"MEX\": 492.34, \"MIDDLE EAST\": 643.04, \"MDA\": 643.46, \"MNG\": 775.31, \"MNE\": 418.09, \"MSR\": 1e3, \"MAR\": 624.45, \"MOZ\": 135.65, \"MMR\": 440.37, \"NAM\": 59.26, \"NRU\": 750, \"NPL\": 24.44, \"NLD\": 268.48, \"NCL\": 660.58, \"NZL\": 112.76, \"NIC\": 265.12, \"NER\": 670.89, \"NGA\": 523.25, \"NORTH AMERICA\": 343.03, \"PRK\": 389.59, \"MKD\": 539.55, \"NOR\": 30.05, \"OCEANIA\": 495.74, \"OECD\": 341.25, \"OMN\": 564.55, \"PAK\": 440.61, \"PSE\": 516.13, \"PAN\": 161.68, \"PNG\": 507.25, \"PRY\": 24.31, \"PER\": 266.48, \"POL\": 661.93, \"PRT\": 164.86, \"PRI\": 677.96, \"QAT\": 602.5, \"REU\": 572.82, \"ROU\": 238.65, \"RUS\": 445.02, \"RWA\": 316.33, \"KNA\": 636.36, \"LCA\": 666.67, \"SPM\": 600, \"VCT\": 529.41, \"WSM\": 473.68, \"STP\": 642.86, \"SAU\": 696.31, \"SEN\": 511.6, \"SRB\": 648.2, \"SYC\": 564.52, \"SLE\": 50, \"SGP\": 470.87, \"SVK\": 116.77, \"SVN\": 230.87, \"SLB\": 700, \"SOM\": 578.95, \"ZAF\": 709.69, \"KOR\": 432.11, \"SSD\": 629.03, \"ESP\": 172.2, \"LKA\": 509.78, \"SDN\": 263.16, \"SUR\": 349.28, \"SWE\": 40.77, \"CHE\": 29.56, \"SYR\": 701.66, \"TWN\": 644.36, \"TJK\": 116.86, \"TZA\": 339.25, \"THA\": 549.85, \"PHL\": 610.74, \"TGO\": 443.18, \"TON\": 625, \"TTO\": 681.53, \"TUN\": 563.96, \"TUR\": 464.59, \"TKM\": 1306.03, \"TCA\": 653.85, \"UGA\": 44.53, \"UKR\": 256.21, \"ARE\": 492.7, \"GBR\": 228.25, \"USA\": 369.53, \"URY\": 128.79, \"UZB\": 1167.6, \"VUT\": 571.43, \"VEN\": 185.8, \"VNM\": 472.47, \"VGB\": 647.06, \"VIR\": 632.35, \"WORLD\": 481.6, \"YEM\": 566.1, \"ZMB\": 111.97, \"ZWE\": 297.87 };\nconst type = \"average\";\nvar average_intensities_min_default = { data, type };\nexport {\n data,\n average_intensities_min_default as default,\n type\n};\n","import fileSize from \"./file-size.js\";\nimport averageIntensity from \"../data/average-intensities.min.js\";\nconst KWH_PER_GB = 0.81;\nconst END_USER_DEVICE_ENERGY = 0.52;\nconst NETWORK_ENERGY = 0.14;\nconst DATACENTER_ENERGY = 0.15;\nconst PRODUCTION_ENERGY = 0.19;\nconst GLOBAL_GRID_INTENSITY = averageIntensity.data[\"WORLD\"];\nconst RENEWABLES_GRID_INTENSITY = 50;\nconst FIRST_TIME_VIEWING_PERCENTAGE = 0.75;\nconst RETURNING_VISITOR_PERCENTAGE = 0.25;\nconst PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD = 0.02;\nconst SWDV4 = {\n OPERATIONAL_KWH_PER_GB_DATACENTER: 0.055,\n OPERATIONAL_KWH_PER_GB_NETWORK: 0.059,\n OPERATIONAL_KWH_PER_GB_DEVICE: 0.08,\n EMBODIED_KWH_PER_GB_DATACENTER: 0.012,\n EMBODIED_KWH_PER_GB_NETWORK: 0.013,\n EMBODIED_KWH_PER_GB_DEVICE: 0.081,\n GLOBAL_GRID_INTENSITY: 494\n};\nconst SWDMV3_RATINGS = {\n FIFTH_PERCENTILE: 0.095,\n TENTH_PERCENTILE: 0.186,\n TWENTIETH_PERCENTILE: 0.341,\n THIRTIETH_PERCENTILE: 0.493,\n FORTIETH_PERCENTILE: 0.656,\n FIFTIETH_PERCENTILE: 0.846\n};\nconst SWDMV4_RATINGS = {\n FIFTH_PERCENTILE: 0.04,\n TENTH_PERCENTILE: 0.079,\n TWENTIETH_PERCENTILE: 0.145,\n THIRTIETH_PERCENTILE: 0.209,\n FORTIETH_PERCENTILE: 0.278,\n FIFTIETH_PERCENTILE: 0.359\n};\nexport {\n DATACENTER_ENERGY,\n END_USER_DEVICE_ENERGY,\n FIRST_TIME_VIEWING_PERCENTAGE,\n GLOBAL_GRID_INTENSITY,\n KWH_PER_GB,\n NETWORK_ENERGY,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD,\n PRODUCTION_ENERGY,\n RENEWABLES_GRID_INTENSITY,\n RETURNING_VISITOR_PERCENTAGE,\n SWDMV3_RATINGS,\n SWDMV4_RATINGS,\n SWDV4,\n fileSize\n};\n","import { averageIntensity } from \"../index.js\";\nimport {\n GLOBAL_GRID_INTENSITY as SWDM3_GLOBAL_GRID_INTENSITY,\n SWDV4,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD,\n FIRST_TIME_VIEWING_PERCENTAGE,\n RETURNING_VISITOR_PERCENTAGE,\n SWDMV3_RATINGS,\n SWDMV4_RATINGS\n} from \"../constants/index.js\";\nconst SWDM4_GLOBAL_GRID_INTENSITY = SWDV4.GLOBAL_GRID_INTENSITY;\nconst formatNumber = (num) => parseFloat(num.toFixed(2));\nconst lessThanEqualTo = (num, limit) => num <= limit;\nfunction parseByteTraceOptions(options = {}, version = 3, green = false) {\n const globalGridIntensity = version === 4 ? SWDM4_GLOBAL_GRID_INTENSITY : SWDM3_GLOBAL_GRID_INTENSITY;\n if (typeof options !== \"object\") {\n throw new Error(\"Options must be an object\");\n }\n const adjustments = {};\n function setIntensity(segment, segmentIntensity) {\n var _a, _b;\n if (segmentIntensity || segmentIntensity === 0) {\n if (typeof segmentIntensity === \"object\") {\n if (!averageIntensity.data[(_a = segmentIntensity.country) == null ? void 0 : _a.toUpperCase()]) {\n console.warn(\n `\"${segmentIntensity.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity\n };\n }\n adjustments.gridIntensity[segment] = {\n country: segmentIntensity.country,\n value: parseFloat(\n averageIntensity.data[(_b = segmentIntensity.country) == null ? void 0 : _b.toUpperCase()]\n )\n };\n } else if (typeof segmentIntensity === \"number\") {\n adjustments.gridIntensity[segment] = {\n value: segmentIntensity\n };\n } else {\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity\n };\n console.warn(\n `The ${segment} grid intensity must be a number or an object. You passed in a ${typeof segmentIntensity}. \nFalling back to global average grid intensity.`\n );\n }\n } else {\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity\n };\n }\n }\n if (options == null ? void 0 : options.gridIntensity) {\n adjustments.gridIntensity = {};\n const { device, dataCenter, network } = options.gridIntensity;\n setIntensity(\"device\", device);\n setIntensity(\"dataCenter\", dataCenter);\n setIntensity(\"network\", network);\n } else {\n adjustments.gridIntensity = {\n device: { value: globalGridIntensity },\n dataCenter: { value: globalGridIntensity },\n network: { value: globalGridIntensity }\n };\n }\n if ((options == null ? void 0 : options.greenHostingFactor) || options.greenHostingFactor === 0 && version === 4) {\n if (typeof options.greenHostingFactor === \"number\") {\n if (options.greenHostingFactor >= 0 && options.greenHostingFactor <= 1) {\n adjustments.greenHostingFactor = options.greenHostingFactor;\n } else {\n adjustments.greenHostingFactor = 0;\n console.warn(\n `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.greenHostingFactor = 0;\n console.warn(\n `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else if (version === 4) {\n adjustments.greenHostingFactor = 0;\n }\n if (green) {\n adjustments.greenHostingFactor = 1;\n }\n return adjustments;\n}\nfunction parseVisitTraceOptions(options = {}, version = 3, green = false) {\n if (typeof options !== \"object\") {\n throw new Error(\"Options must be an object\");\n }\n const adjustments = parseByteTraceOptions(options, version, green);\n if ((options == null ? void 0 : options.dataReloadRatio) || options.dataReloadRatio === 0) {\n if (typeof options.dataReloadRatio === \"number\") {\n if (options.dataReloadRatio >= 0 && options.dataReloadRatio <= 1) {\n adjustments.dataReloadRatio = options.dataReloadRatio;\n } else {\n adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\n console.warn(\n `The dataReloadRatio option must be a number between 0 and 1. You passed in ${options.dataReloadRatio}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\n console.warn(\n `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\n console.warn(\n `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}. \nFalling back to default value.`\n );\n }\n if ((options == null ? void 0 : options.firstVisitPercentage) || options.firstVisitPercentage === 0) {\n if (typeof options.firstVisitPercentage === \"number\") {\n if (options.firstVisitPercentage >= 0 && options.firstVisitPercentage <= 1) {\n adjustments.firstVisitPercentage = options.firstVisitPercentage;\n } else {\n adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\n console.warn(\n `The firstVisitPercentage option must be a number between 0 and 1. You passed in ${options.firstVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\n console.warn(\n `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\n console.warn(\n `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}. \nFalling back to default value.`\n );\n }\n if ((options == null ? void 0 : options.returnVisitPercentage) || options.returnVisitPercentage === 0) {\n if (typeof options.returnVisitPercentage === \"number\") {\n if (options.returnVisitPercentage >= 0 && options.returnVisitPercentage <= 1) {\n adjustments.returnVisitPercentage = options.returnVisitPercentage;\n } else {\n adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\n console.warn(\n `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\n console.warn(\n `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}. \nFalling back to default value.`\n );\n }\n } else {\n adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\n console.warn(\n `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}. \nFalling back to default value.`\n );\n }\n return adjustments;\n}\nfunction getApiRequestHeaders(comment = \"\") {\n return { \"User-Agent\": `co2js/${\"0.16.4\"} ${comment}` };\n}\nfunction outputRating(co2e, swdmVersion) {\n let {\n FIFTH_PERCENTILE,\n TENTH_PERCENTILE,\n TWENTIETH_PERCENTILE,\n THIRTIETH_PERCENTILE,\n FORTIETH_PERCENTILE,\n FIFTIETH_PERCENTILE\n } = SWDMV3_RATINGS;\n if (swdmVersion === 4) {\n FIFTH_PERCENTILE = SWDMV4_RATINGS.FIFTH_PERCENTILE;\n TENTH_PERCENTILE = SWDMV4_RATINGS.TENTH_PERCENTILE;\n TWENTIETH_PERCENTILE = SWDMV4_RATINGS.TWENTIETH_PERCENTILE;\n THIRTIETH_PERCENTILE = SWDMV4_RATINGS.THIRTIETH_PERCENTILE;\n FORTIETH_PERCENTILE = SWDMV4_RATINGS.FORTIETH_PERCENTILE;\n FIFTIETH_PERCENTILE = SWDMV4_RATINGS.FIFTIETH_PERCENTILE;\n }\n if (lessThanEqualTo(co2e, FIFTH_PERCENTILE)) {\n return \"A+\";\n } else if (lessThanEqualTo(co2e, TENTH_PERCENTILE)) {\n return \"A\";\n } else if (lessThanEqualTo(co2e, TWENTIETH_PERCENTILE)) {\n return \"B\";\n } else if (lessThanEqualTo(co2e, THIRTIETH_PERCENTILE)) {\n return \"C\";\n } else if (lessThanEqualTo(co2e, FORTIETH_PERCENTILE)) {\n return \"D\";\n } else if (lessThanEqualTo(co2e, FIFTIETH_PERCENTILE)) {\n return \"E\";\n } else {\n return \"F\";\n }\n}\nexport {\n formatNumber,\n getApiRequestHeaders,\n lessThanEqualTo,\n outputRating,\n parseByteTraceOptions,\n parseVisitTraceOptions\n};\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nimport {\n fileSize,\n KWH_PER_GB,\n END_USER_DEVICE_ENERGY,\n NETWORK_ENERGY,\n DATACENTER_ENERGY,\n PRODUCTION_ENERGY,\n GLOBAL_GRID_INTENSITY,\n RENEWABLES_GRID_INTENSITY,\n FIRST_TIME_VIEWING_PERCENTAGE,\n RETURNING_VISITOR_PERCENTAGE,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD\n} from \"./constants/index.js\";\nimport { formatNumber, outputRating } from \"./helpers/index.js\";\nclass SustainableWebDesign {\n constructor(options) {\n this.allowRatings = true;\n this.options = options;\n this.version = 3;\n }\n energyPerByteByComponent(bytes) {\n const transferedBytesToGb = bytes / fileSize.GIGABYTE;\n const energyUsage = transferedBytesToGb * KWH_PER_GB;\n return {\n consumerDeviceEnergy: energyUsage * END_USER_DEVICE_ENERGY,\n networkEnergy: energyUsage * NETWORK_ENERGY,\n productionEnergy: energyUsage * PRODUCTION_ENERGY,\n dataCenterEnergy: energyUsage * DATACENTER_ENERGY\n };\n }\n co2byComponent(energyByComponent, carbonIntensity = GLOBAL_GRID_INTENSITY, options = {}) {\n let deviceCarbonIntensity = GLOBAL_GRID_INTENSITY;\n let networkCarbonIntensity = GLOBAL_GRID_INTENSITY;\n let dataCenterCarbonIntensity = GLOBAL_GRID_INTENSITY;\n let globalEmissions = GLOBAL_GRID_INTENSITY;\n if (options == null ? void 0 : options.gridIntensity) {\n const { device, network, dataCenter } = options.gridIntensity;\n if ((device == null ? void 0 : device.value) || (device == null ? void 0 : device.value) === 0) {\n deviceCarbonIntensity = device.value;\n }\n if ((network == null ? void 0 : network.value) || (network == null ? void 0 : network.value) === 0) {\n networkCarbonIntensity = network.value;\n }\n if ((dataCenter == null ? void 0 : dataCenter.value) || (dataCenter == null ? void 0 : dataCenter.value) === 0) {\n dataCenterCarbonIntensity = dataCenter.value;\n }\n }\n if (carbonIntensity === true) {\n dataCenterCarbonIntensity = RENEWABLES_GRID_INTENSITY;\n }\n const returnCO2ByComponent = {};\n for (const [key, value] of Object.entries(energyByComponent)) {\n if (key.startsWith(\"dataCenterEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] = value * dataCenterCarbonIntensity;\n } else if (key.startsWith(\"consumerDeviceEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] = value * deviceCarbonIntensity;\n } else if (key.startsWith(\"networkEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] = value * networkCarbonIntensity;\n } else {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] = value * globalEmissions;\n }\n }\n return returnCO2ByComponent;\n }\n perByte(bytes, carbonIntensity = false, segmentResults = false, ratingResults = false, options = {}) {\n if (bytes < 1) {\n bytes = 0;\n }\n const energyBycomponent = this.energyPerByteByComponent(bytes, options);\n if (typeof carbonIntensity !== \"boolean\") {\n throw new Error(\n `perByte expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`\n );\n }\n const co2ValuesbyComponent = this.co2byComponent(\n energyBycomponent,\n carbonIntensity,\n options\n );\n const co2Values = Object.values(co2ValuesbyComponent);\n const co2ValuesSum = co2Values.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(co2ValuesSum);\n }\n if (segmentResults) {\n if (ratingResults) {\n return __spreadProps(__spreadValues({}, co2ValuesbyComponent), {\n total: co2ValuesSum,\n rating\n });\n }\n return __spreadProps(__spreadValues({}, co2ValuesbyComponent), { total: co2ValuesSum });\n }\n if (ratingResults) {\n return { total: co2ValuesSum, rating };\n }\n return co2ValuesSum;\n }\n perVisit(bytes, carbonIntensity = false, segmentResults = false, ratingResults = false, options = {}) {\n const energyBycomponent = this.energyPerVisitByComponent(bytes, options);\n if (typeof carbonIntensity !== \"boolean\") {\n throw new Error(\n `perVisit expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`\n );\n }\n const co2ValuesbyComponent = this.co2byComponent(\n energyBycomponent,\n carbonIntensity,\n options\n );\n const co2Values = Object.values(co2ValuesbyComponent);\n const co2ValuesSum = co2Values.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(co2ValuesSum);\n }\n if (segmentResults) {\n if (ratingResults) {\n return __spreadProps(__spreadValues({}, co2ValuesbyComponent), {\n total: co2ValuesSum,\n rating\n });\n }\n return __spreadProps(__spreadValues({}, co2ValuesbyComponent), { total: co2ValuesSum });\n }\n if (ratingResults) {\n return { total: co2ValuesSum, rating };\n }\n return co2ValuesSum;\n }\n energyPerByte(bytes) {\n const energyByComponent = this.energyPerByteByComponent(bytes);\n const energyValues = Object.values(energyByComponent);\n return energyValues.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n }\n energyPerVisitByComponent(bytes, options = {}, firstView = FIRST_TIME_VIEWING_PERCENTAGE, returnView = RETURNING_VISITOR_PERCENTAGE, dataReloadRatio = PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD) {\n if (options.dataReloadRatio || options.dataReloadRatio === 0) {\n dataReloadRatio = options.dataReloadRatio;\n }\n if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {\n firstView = options.firstVisitPercentage;\n }\n if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {\n returnView = options.returnVisitPercentage;\n }\n const energyBycomponent = this.energyPerByteByComponent(bytes);\n const cacheAdjustedSegmentEnergy = {};\n const energyValues = Object.values(energyBycomponent);\n for (const [key, value] of Object.entries(energyBycomponent)) {\n cacheAdjustedSegmentEnergy[`${key} - first`] = value * firstView;\n cacheAdjustedSegmentEnergy[`${key} - subsequent`] = value * returnView * dataReloadRatio;\n }\n return cacheAdjustedSegmentEnergy;\n }\n energyPerVisit(bytes) {\n let firstVisits = 0;\n let subsequentVisits = 0;\n const energyBycomponent = Object.entries(\n this.energyPerVisitByComponent(bytes)\n );\n for (const [key, val] of energyBycomponent) {\n if (key.indexOf(\"first\") > 0) {\n firstVisits += val;\n }\n }\n for (const [key, val] of energyBycomponent) {\n if (key.indexOf(\"subsequent\") > 0) {\n subsequentVisits += val;\n }\n }\n return firstVisits + subsequentVisits;\n }\n emissionsPerVisitInGrams(energyPerVisit, carbonintensity = GLOBAL_GRID_INTENSITY) {\n return formatNumber(energyPerVisit * carbonintensity);\n }\n annualEnergyInKwh(energyPerVisit, monthlyVisitors = 1e3) {\n return energyPerVisit * monthlyVisitors * 12;\n }\n annualEmissionsInGrams(co2grams, monthlyVisitors = 1e3) {\n return co2grams * monthlyVisitors * 12;\n }\n annualSegmentEnergy(annualEnergy) {\n return {\n consumerDeviceEnergy: formatNumber(annualEnergy * END_USER_DEVICE_ENERGY),\n networkEnergy: formatNumber(annualEnergy * NETWORK_ENERGY),\n dataCenterEnergy: formatNumber(annualEnergy * DATACENTER_ENERGY),\n productionEnergy: formatNumber(annualEnergy * PRODUCTION_ENERGY)\n };\n }\n ratingScale(co2e) {\n return outputRating(co2e, this.version);\n }\n}\nvar sustainable_web_design_v3_default = SustainableWebDesign;\nexport {\n SustainableWebDesign,\n sustainable_web_design_v3_default as default\n};\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nimport { fileSize, SWDV4 } from \"./constants/index.js\";\nimport { outputRating } from \"./helpers/index.js\";\nconst {\n OPERATIONAL_KWH_PER_GB_DATACENTER,\n OPERATIONAL_KWH_PER_GB_NETWORK,\n OPERATIONAL_KWH_PER_GB_DEVICE,\n EMBODIED_KWH_PER_GB_DATACENTER,\n EMBODIED_KWH_PER_GB_NETWORK,\n EMBODIED_KWH_PER_GB_DEVICE,\n GLOBAL_GRID_INTENSITY\n} = SWDV4;\nfunction outputSegments(operationalEmissions, embodiedEmissions) {\n const totalOperationalCO2e = operationalEmissions.dataCenter + operationalEmissions.network + operationalEmissions.device;\n const totalEmbodiedCO2e = embodiedEmissions.dataCenter + embodiedEmissions.network + embodiedEmissions.device;\n const dataCenterCO2e = operationalEmissions.dataCenter + embodiedEmissions.dataCenter;\n const networkCO2e = operationalEmissions.network + embodiedEmissions.network;\n const consumerDeviceCO2e = operationalEmissions.device + embodiedEmissions.device;\n return {\n dataCenterOperationalCO2e: operationalEmissions.dataCenter,\n networkOperationalCO2e: operationalEmissions.network,\n consumerDeviceOperationalCO2e: operationalEmissions.device,\n dataCenterEmbodiedCO2e: embodiedEmissions.dataCenter,\n networkEmbodiedCO2e: embodiedEmissions.network,\n consumerDeviceEmbodiedCO2e: embodiedEmissions.device,\n totalEmbodiedCO2e,\n totalOperationalCO2e,\n dataCenterCO2e,\n networkCO2e,\n consumerDeviceCO2e\n };\n}\nfunction getGreenHostingFactor(green, options) {\n if (green) {\n return 1;\n } else if ((options == null ? void 0 : options.greenHostingFactor) || (options == null ? void 0 : options.greenHostingFactor) === 0) {\n return options.greenHostingFactor;\n }\n return 0;\n}\nclass SustainableWebDesign {\n constructor(options) {\n this.allowRatings = true;\n this.options = options;\n this.version = 4;\n }\n operationalEnergyPerSegment(bytes) {\n const transferedBytesToGb = bytes / fileSize.GIGABYTE;\n const dataCenter = transferedBytesToGb * OPERATIONAL_KWH_PER_GB_DATACENTER;\n const network = transferedBytesToGb * OPERATIONAL_KWH_PER_GB_NETWORK;\n const device = transferedBytesToGb * OPERATIONAL_KWH_PER_GB_DEVICE;\n return {\n dataCenter,\n network,\n device\n };\n }\n operationalEmissions(bytes, options = {}) {\n const { dataCenter, network, device } = this.operationalEnergyPerSegment(bytes);\n let dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;\n let networkGridIntensity = GLOBAL_GRID_INTENSITY;\n let deviceGridIntensity = GLOBAL_GRID_INTENSITY;\n if (options == null ? void 0 : options.gridIntensity) {\n const { device: device2, network: network2, dataCenter: dataCenter2 } = options.gridIntensity;\n if ((device2 == null ? void 0 : device2.value) || (device2 == null ? void 0 : device2.value) === 0) {\n deviceGridIntensity = device2.value;\n }\n if ((network2 == null ? void 0 : network2.value) || (network2 == null ? void 0 : network2.value) === 0) {\n networkGridIntensity = network2.value;\n }\n if ((dataCenter2 == null ? void 0 : dataCenter2.value) || (dataCenter2 == null ? void 0 : dataCenter2.value) === 0) {\n dataCenterGridIntensity = dataCenter2.value;\n }\n }\n const dataCenterEmissions = dataCenter * dataCenterGridIntensity;\n const networkEmissions = network * networkGridIntensity;\n const deviceEmissions = device * deviceGridIntensity;\n return {\n dataCenter: dataCenterEmissions,\n network: networkEmissions,\n device: deviceEmissions\n };\n }\n embodiedEnergyPerSegment(bytes) {\n const transferedBytesToGb = bytes / fileSize.GIGABYTE;\n const dataCenter = transferedBytesToGb * EMBODIED_KWH_PER_GB_DATACENTER;\n const network = transferedBytesToGb * EMBODIED_KWH_PER_GB_NETWORK;\n const device = transferedBytesToGb * EMBODIED_KWH_PER_GB_DEVICE;\n return {\n dataCenter,\n network,\n device\n };\n }\n embodiedEmissions(bytes) {\n const { dataCenter, network, device } = this.embodiedEnergyPerSegment(bytes);\n const dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;\n const networkGridIntensity = GLOBAL_GRID_INTENSITY;\n const deviceGridIntensity = GLOBAL_GRID_INTENSITY;\n const dataCenterEmissions = dataCenter * dataCenterGridIntensity;\n const networkEmissions = network * networkGridIntensity;\n const deviceEmissions = device * deviceGridIntensity;\n return {\n dataCenter: dataCenterEmissions,\n network: networkEmissions,\n device: deviceEmissions\n };\n }\n perByte(bytes, green = false, segmented = false, ratingResults = false, options = {}) {\n if (bytes < 1) {\n return 0;\n }\n const operationalEmissions = this.operationalEmissions(bytes, options);\n const embodiedEmissions = this.embodiedEmissions(bytes);\n const greenHostingFactor = getGreenHostingFactor(green, options);\n const totalEmissions = {\n dataCenter: operationalEmissions.dataCenter * (1 - greenHostingFactor) + embodiedEmissions.dataCenter,\n network: operationalEmissions.network + embodiedEmissions.network,\n device: operationalEmissions.device + embodiedEmissions.device\n };\n const total = totalEmissions.dataCenter + totalEmissions.network + totalEmissions.device;\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(total);\n }\n if (segmented) {\n const segments = __spreadValues({}, outputSegments(operationalEmissions, embodiedEmissions));\n if (ratingResults) {\n return __spreadProps(__spreadValues({}, segments), {\n total,\n rating\n });\n }\n return __spreadProps(__spreadValues({}, segments), { total });\n }\n if (ratingResults) {\n return { total, rating };\n }\n return total;\n }\n perVisit(bytes, green = false, segmented = false, ratingResults = false, options = {}) {\n let firstViewRatio = 1;\n let returnViewRatio = 0;\n let dataReloadRatio = 0;\n const greenHostingFactor = getGreenHostingFactor(green, options);\n const operationalEmissions = this.operationalEmissions(bytes, options);\n const embodiedEmissions = this.embodiedEmissions(bytes);\n if (bytes < 1) {\n return 0;\n }\n if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {\n firstViewRatio = options.firstVisitPercentage;\n }\n if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {\n returnViewRatio = options.returnVisitPercentage;\n }\n if (options.dataReloadRatio || options.dataReloadRatio === 0) {\n dataReloadRatio = options.dataReloadRatio;\n }\n const firstVisitEmissions = operationalEmissions.dataCenter * (1 - greenHostingFactor) + embodiedEmissions.dataCenter + operationalEmissions.network + embodiedEmissions.network + operationalEmissions.device + embodiedEmissions.device;\n const returnVisitEmissions = (operationalEmissions.dataCenter * (1 - greenHostingFactor) + embodiedEmissions.dataCenter + operationalEmissions.network + embodiedEmissions.network + operationalEmissions.device + embodiedEmissions.device) * (1 - dataReloadRatio);\n const total = firstVisitEmissions * firstViewRatio + returnVisitEmissions * returnViewRatio;\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(total);\n }\n if (segmented) {\n const segments = __spreadProps(__spreadValues({}, outputSegments(operationalEmissions, embodiedEmissions)), {\n firstVisitCO2e: firstVisitEmissions,\n returnVisitCO2e: returnVisitEmissions\n });\n if (ratingResults) {\n return __spreadProps(__spreadValues({}, segments), {\n total,\n rating\n });\n }\n return __spreadProps(__spreadValues({}, segments), { total });\n }\n if (ratingResults) {\n return { total, rating };\n }\n return total;\n }\n ratingScale(co2e) {\n return outputRating(co2e, this.version);\n }\n}\nvar sustainable_web_design_v4_default = SustainableWebDesign;\nexport {\n SustainableWebDesign,\n sustainable_web_design_v4_default as default\n};\n","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nimport OneByte from \"./1byte.js\";\nimport SustainableWebDesignV3 from \"./sustainable-web-design-v3.js\";\nimport SustainableWebDesignV4 from \"./sustainable-web-design-v4.js\";\nimport {\n parseByteTraceOptions,\n parseVisitTraceOptions\n} from \"./helpers/index.js\";\nclass CO2 {\n constructor(options) {\n this.model = new SustainableWebDesignV3();\n if ((options == null ? void 0 : options.model) === \"1byte\") {\n this.model = new OneByte();\n } else if ((options == null ? void 0 : options.model) === \"swd\") {\n this.model = new SustainableWebDesignV3();\n if ((options == null ? void 0 : options.version) === 4) {\n this.model = new SustainableWebDesignV4();\n }\n } else if (options == null ? void 0 : options.model) {\n throw new Error(\n `\"${options.model}\" is not a valid model. Please use \"1byte\" for the OneByte model, and \"swd\" for the Sustainable Web Design model.\nSee https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`\n );\n }\n if ((options == null ? void 0 : options.rating) && typeof options.rating !== \"boolean\") {\n throw new Error(\n `The rating option must be a boolean. Please use true or false.\nSee https://developers.thegreenwebfoundation.org/co2js/options/ to learn more about the options available in CO2.js.`\n );\n }\n const allowRatings = !!this.model.allowRatings;\n this._segment = (options == null ? void 0 : options.results) === \"segment\";\n this._rating = (options == null ? void 0 : options.rating) === true;\n if (!allowRatings && this._rating) {\n throw new Error(\n `The rating system is not supported in the model you are using. Try using the Sustainable Web Design model instead.\nSee https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`\n );\n }\n }\n perByte(bytes, green = false) {\n return this.model.perByte(bytes, green, this._segment, this._rating);\n }\n perVisit(bytes, green = false) {\n var _a;\n if ((_a = this.model) == null ? void 0 : _a.perVisit) {\n return this.model.perVisit(bytes, green, this._segment, this._rating);\n } else {\n throw new Error(\n `The perVisit() method is not supported in the model you are using. Try using perByte() instead.\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n perByteTrace(bytes, green = false, options = {}) {\n const adjustments = parseByteTraceOptions(\n options,\n this.model.version,\n green\n );\n const _a = adjustments, { gridIntensity } = _a, traceVariables = __objRest(_a, [\"gridIntensity\"]);\n const _b = traceVariables, {\n dataReloadRatio,\n firstVisitPercentage,\n returnVisitPercentage\n } = _b, otherVariables = __objRest(_b, [\n \"dataReloadRatio\",\n \"firstVisitPercentage\",\n \"returnVisitPercentage\"\n ]);\n return {\n co2: this.model.perByte(\n bytes,\n green,\n this._segment,\n this._rating,\n adjustments\n ),\n green,\n variables: __spreadValues({\n description: \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: __spreadValues({\n description: \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\"\n }, adjustments.gridIntensity)\n }, otherVariables)\n };\n }\n perVisitTrace(bytes, green = false, options = {}) {\n var _a;\n if ((_a = this.model) == null ? void 0 : _a.perVisit) {\n const adjustments = parseVisitTraceOptions(\n options,\n this.model.version,\n green\n );\n const _b = adjustments, { gridIntensity } = _b, variables = __objRest(_b, [\"gridIntensity\"]);\n return {\n co2: this.model.perVisit(\n bytes,\n green,\n this._segment,\n this._rating,\n adjustments\n ),\n green,\n variables: __spreadValues({\n description: \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: __spreadValues({\n description: \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\"\n }, adjustments.gridIntensity)\n }, variables)\n };\n } else {\n throw new Error(\n `The perVisitTrace() method is not supported in the model you are using. Try using perByte() instead.\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n SustainableWebDesignV3() {\n return new SustainableWebDesignV3();\n }\n SustainableWebDesignV4() {\n return new SustainableWebDesignV4();\n }\n OneByte() {\n return new OneByte();\n }\n}\nvar co2_default = CO2;\nexport {\n CO2,\n co2_default as default\n};\n","var __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar require_hosting_json = __commonJS({\n \"src/hosting-json.js\"(exports, module) {\n async function check(domain, db) {\n if (typeof domain === \"string\") {\n return checkInJSON(domain, db);\n } else {\n return checkDomainsInJSON(domain, db);\n }\n }\n function checkInJSON(domain, db) {\n if (db.indexOf(domain) > -1) {\n return true;\n }\n return false;\n }\n function greenDomainsFromResults(greenResults) {\n const entries = Object.entries(greenResults);\n const greenEntries = entries.filter(([key, val]) => val.green);\n return greenEntries.map(([key, val]) => val.url);\n }\n function checkDomainsInJSON(domains, db) {\n let greenDomains = [];\n for (let domain of domains) {\n if (db.indexOf(domain) > -1) {\n greenDomains.push(domain);\n }\n }\n return greenDomains;\n }\n function find(domain, db) {\n if (typeof domain === \"string\") {\n return findInJSON(domain, db);\n } else {\n return findDomainsInJSON(domain, db);\n }\n }\n function findInJSON(domain, db) {\n if (db.indexOf(domain) > -1) {\n return domain;\n }\n return {\n url: domain,\n green: false\n };\n }\n function findDomainsInJSON(domains, db) {\n const result = {};\n for (let domain of domains) {\n result[domain] = findInJSON(domain, db);\n }\n return result;\n }\n module.exports = {\n check,\n greenDomainsFromResults,\n find\n };\n }\n});\nexport default require_hosting_json();\n","import { getApiRequestHeaders } from \"./helpers/index.js\";\nimport hostingJSON from \"./hosting-json.js\";\nfunction check(domain, optionsOrAgentId) {\n const options = typeof optionsOrAgentId === \"string\" ? { userAgentIdentifier: optionsOrAgentId } : optionsOrAgentId;\n if ((options == null ? void 0 : options.db) && options.verbose) {\n throw new Error(\"verbose mode cannot be used with a local lookup database\");\n }\n if (typeof domain === \"string\") {\n return checkAgainstAPI(domain, options);\n } else {\n return checkDomainsAgainstAPI(domain, options);\n }\n}\nasync function checkAgainstAPI(domain, options = {}) {\n const req = await fetch(\n `https://api.thegreenwebfoundation.org/greencheck/${domain}`,\n {\n headers: getApiRequestHeaders(options.userAgentIdentifier)\n }\n );\n if (options == null ? void 0 : options.db) {\n return hostingJSON.check(domain, options.db);\n }\n const res = await req.json();\n return options.verbose ? res : res.green;\n}\nasync function checkDomainsAgainstAPI(domains, options = {}) {\n try {\n const apiPath = \"https://api.thegreenwebfoundation.org/v2/greencheckmulti\";\n const domainsString = JSON.stringify(domains);\n const req = await fetch(`${apiPath}/${domainsString}`, {\n headers: getApiRequestHeaders(options.userAgentIdentifier)\n });\n const allGreenCheckResults = await req.json();\n return options.verbose ? allGreenCheckResults : greenDomainsFromResults(allGreenCheckResults);\n } catch (e) {\n return options.verbose ? {} : [];\n }\n}\nfunction greenDomainsFromResults(greenResults) {\n const entries = Object.entries(greenResults);\n const greenEntries = entries.filter(([key, val]) => val.green);\n return greenEntries.map(([key, val]) => val.url);\n}\nvar hosting_api_default = {\n check\n};\nexport {\n hosting_api_default as default\n};\n","import hostingAPI from \"./hosting-api.js\";\nfunction check(domain, optionsOrAgentId) {\n return hostingAPI.check(domain, optionsOrAgentId);\n}\nvar hosting_default = check;\nexport {\n hosting_default as default\n};\n","const data = { \"AFG\": \"414\", \"ALB\": \"0\", \"DZA\": \"528\", \"ASM\": \"753\", \"AND\": \"188\", \"AGO\": \"1476\", \"AIA\": \"753\", \"ATG\": \"753\", \"ARG\": \"478\", \"ARM\": \"390\", \"ABW\": \"753\", \"AUS\": \"808\", \"AUT\": \"242\", \"AZE\": \"534\", \"AZORES (PORTUGAL)\": \"753\", \"BHS\": \"753\", \"BHR\": \"726\", \"BGD\": \"528\", \"BRB\": \"749\", \"BLR\": \"400\", \"BEL\": \"252\", \"BLZ\": \"403\", \"BEN\": \"745\", \"BMU\": \"753\", \"BTN\": \"0\", \"BOL\": \"604\", \"BES\": \"753\", \"BIH\": \"1197\", \"BWA\": \"1486\", \"BRA\": \"284\", \"VGB\": \"753\", \"BRN\": \"681\", \"BGR\": \"911\", \"BFA\": \"753\", \"BDI\": \"414\", \"KHM\": \"1046\", \"CMR\": \"659\", \"CAN\": \"372\", \"CYM\": \"753\", \"CPV\": \"753\", \"CAF\": \"188\", \"TCD\": \"753\", \"CHANNEL ISLANDS (U.K)\": \"753\", \"CHL\": \"657\", \"CHN\": \"899\", \"COL\": \"410\", \"COM\": \"753\", \"COD\": \"0\", \"COG\": \"659\", \"COK\": \"753\", \"CRI\": \"108\", \"CIV\": \"466\", \"HRV\": \"294\", \"CUB\": \"559\", \"CUW\": \"876\", \"CYP\": \"751\", \"CZE\": \"902\", \"DNK\": \"362\", \"DJI\": \"753\", \"DMA\": \"753\", \"DOM\": \"601\", \"ECU\": \"560\", \"EGY\": \"554\", \"SLV\": \"547\", \"GNQ\": \"632\", \"ERI\": \"915\", \"EST\": \"1057\", \"SWZ\": \"0\", \"ETH\": \"0\", \"FLK\": \"753\", \"FRO\": \"753\", \"FJI\": \"640\", \"FIN\": \"267\", \"FRA\": \"158\", \"GUF\": \"423\", \"PYF\": \"753\", \"GAB\": \"946\", \"GMB\": \"753\", \"GEO\": \"289\", \"DEU\": \"650\", \"GHA\": \"495\", \"GIB\": \"779\", \"GRC\": \"507\", \"GRL\": \"264\", \"GRD\": \"753\", \"GLP\": \"753\", \"GUM\": \"753\", \"GTM\": \"798\", \"GIN\": \"753\", \"GNB\": \"753\", \"GUY\": \"847\", \"HTI\": \"1048\", \"HND\": \"662\", \"HUN\": \"296\", \"ISL\": \"0\", \"IND\": \"951\", \"IDN\": \"783\", \"IRN\": \"592\", \"IRQ\": \"1080\", \"IRL\": \"380\", \"IMN\": \"436\", \"ISR\": \"394\", \"ITA\": \"414\", \"JAM\": \"711\", \"JPN\": \"471\", \"JOR\": \"529\", \"KAZ\": \"797\", \"KEN\": \"574\", \"KIR\": \"753\", \"PRK\": \"754\", \"KOR\": \"555\", \"XKX\": \"1145\", \"KWT\": \"675\", \"KGZ\": \"217\", \"LAO\": \"1069\", \"LVA\": \"240\", \"LBN\": \"794\", \"LSO\": \"0\", \"LBR\": \"677\", \"LBY\": \"668\", \"LIE\": \"151\", \"LTU\": \"211\", \"LUX\": \"220\", \"MDG\": \"876\", \"MADEIRA (PORTUGAL)\": \"663\", \"MWI\": \"489\", \"MYS\": \"551\", \"MDV\": \"753\", \"MLI\": \"1076\", \"MLT\": \"520\", \"MHL\": \"753\", \"MTQ\": \"753\", \"MRT\": \"753\", \"MUS\": \"700\", \"MYT\": \"753\", \"MEX\": \"531\", \"FSM\": \"753\", \"MDA\": \"541\", \"MCO\": \"158\", \"MNG\": \"1366\", \"MNE\": \"899\", \"MSR\": \"753\", \"MAR\": \"729\", \"MOZ\": \"234\", \"MMR\": \"719\", \"NAM\": \"355\", \"NRU\": \"753\", \"NPL\": \"0\", \"NLD\": \"326\", \"NCL\": \"779\", \"NZL\": \"246\", \"NIC\": \"675\", \"NER\": \"772\", \"NGA\": \"526\", \"NIU\": \"753\", \"MKD\": \"851\", \"MNP\": \"753\", \"NOR\": \"47\", \"OMN\": \"479\", \"PAK\": \"592\", \"PLW\": \"753\", \"PSE\": \"719\", \"PAN\": \"477\", \"PNG\": \"597\", \"PRY\": \"0\", \"PER\": \"473\", \"PHL\": \"672\", \"POL\": \"828\", \"PRT\": \"389\", \"PRI\": \"596\", \"QAT\": \"503\", \"REU\": \"772\", \"ROU\": \"489\", \"RUS\": \"476\", \"RWA\": \"712\", \"SHN\": \"753\", \"KNA\": \"753\", \"LCA\": \"753\", \"MAF\": \"753\", \"SPM\": \"753\", \"VCT\": \"753\", \"WSM\": \"753\", \"SMR\": \"414\", \"STP\": \"753\", \"SAU\": \"592\", \"SEN\": \"870\", \"SRB\": \"1086\", \"SYC\": \"753\", \"SLE\": \"489\", \"SGP\": \"379\", \"SXM\": \"753\", \"SVK\": \"332\", \"SVN\": \"620\", \"SLB\": \"753\", \"SOM\": \"753\", \"ZAF\": \"1070\", \"SSD\": \"890\", \"ESP\": \"402\", \"LKA\": \"731\", \"SDN\": \"736\", \"SUR\": \"1029\", \"SWE\": \"68\", \"CHE\": \"48\", \"SYR\": \"713\", \"TWN\": \"484\", \"TJK\": \"255\", \"TZA\": \"531\", \"THA\": \"450\", \"TLS\": \"753\", \"TGO\": \"859\", \"TON\": \"753\", \"TTO\": \"559\", \"TUN\": \"468\", \"TUR\": \"376\", \"TKM\": \"927\", \"TCA\": \"753\", \"TUV\": \"753\", \"UGA\": \"279\", \"UKR\": \"768\", \"ARE\": \"556\", \"GBR\": \"380\", \"USA\": \"416\", \"URY\": \"174\", \"UZB\": \"612\", \"VUT\": \"753\", \"VEN\": \"711\", \"VNM\": \"560\", \"VIR\": \"650\", \"YEM\": \"807\", \"ZMB\": \"416\", \"ZWE\": \"1575\", \"MEMO: EU 27\": \"409\" };\nconst type = \"marginal\";\nconst year = \"2021\";\nvar marginal_intensities_2021_min_default = { data, type, year };\nexport {\n data,\n marginal_intensities_2021_min_default as default,\n type,\n year\n};\n","import co2 from \"./co2.js\";\nimport hosting from \"./hosting.js\";\nimport averageIntensity from \"./data/average-intensities.min.js\";\nimport marginalIntensity from \"./data/marginal-intensities-2021.min.js\";\nvar src_default = { co2, hosting, averageIntensity, marginalIntensity };\nexport {\n averageIntensity,\n co2,\n src_default as default,\n hosting,\n marginalIntensity\n};\n","import tgwf from '@tgwf/co2';\r\n\r\nexport default class CarbonMeter {\r\n\r\n #listner = (totalEmission, estimatedCO2) => { };\r\n #location = 'de';\r\n #co2 = undefined;\r\n #totalEmissionsCacheEntry = new CacheEntry(window