@tgwf/co2 0.16.1 → 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/CONTRIBUTING.md +10 -10
- package/README.md +10 -4
- package/dist/cjs/1byte.js.map +1 -1
- package/dist/cjs/co2.js +38 -13
- package/dist/cjs/co2.js.map +2 -2
- package/dist/cjs/constants/index.js +4 -1
- package/dist/cjs/constants/index.js.map +2 -2
- package/dist/cjs/data/average-intensities.min.js +1 -1
- package/dist/cjs/data/average-intensities.min.js.map +2 -2
- package/dist/cjs/data/marginal-intensities-2021.min.js.map +2 -2
- package/dist/cjs/helpers/index.js +79 -94
- package/dist/cjs/helpers/index.js.map +3 -3
- package/dist/cjs/hosting-api.js +10 -4
- package/dist/cjs/hosting-api.js.map +2 -2
- package/dist/cjs/hosting-json.js.map +1 -1
- package/dist/cjs/hosting-json.node.js +4 -1
- package/dist/cjs/hosting-json.node.js.map +2 -2
- package/dist/cjs/hosting-node.js +35 -12
- package/dist/cjs/hosting-node.js.map +2 -2
- package/dist/cjs/hosting.js +4 -1
- package/dist/cjs/hosting.js.map +2 -2
- package/dist/cjs/index-node.js +4 -1
- package/dist/cjs/index-node.js.map +2 -2
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/sustainable-web-design-v3.js +30 -10
- package/dist/cjs/sustainable-web-design-v3.js.map +1 -1
- package/dist/cjs/sustainable-web-design-v4.js.map +2 -2
- package/dist/esm/co2.js +34 -13
- package/dist/esm/data/average-intensities.min.js +1 -1
- package/dist/esm/helpers/index.js +79 -94
- package/dist/esm/hosting-api.js +6 -4
- package/dist/esm/hosting-json.js +0 -1
- package/dist/esm/hosting.js +0 -1
- package/dist/esm/sustainable-web-design-v3.js +30 -11
- package/dist/esm/sustainable-web-design-v4.js +0 -1
- package/package.json +2 -2
|
@@ -80,11 +80,19 @@ class SustainableWebDesign {
|
|
|
80
80
|
}
|
|
81
81
|
const energyBycomponent = this.energyPerByteByComponent(bytes, options);
|
|
82
82
|
if (typeof carbonIntensity !== "boolean") {
|
|
83
|
-
throw new Error(
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
throw new Error(
|
|
84
|
+
`perByte expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
const co2ValuesbyComponent = this.co2byComponent(
|
|
88
|
+
energyBycomponent,
|
|
89
|
+
carbonIntensity,
|
|
90
|
+
options
|
|
91
|
+
);
|
|
86
92
|
const co2Values = Object.values(co2ValuesbyComponent);
|
|
87
|
-
const co2ValuesSum = co2Values.reduce(
|
|
93
|
+
const co2ValuesSum = co2Values.reduce(
|
|
94
|
+
(prevValue, currentValue) => prevValue + currentValue
|
|
95
|
+
);
|
|
88
96
|
let rating = null;
|
|
89
97
|
if (ratingResults) {
|
|
90
98
|
rating = this.ratingScale(co2ValuesSum);
|
|
@@ -107,11 +115,19 @@ class SustainableWebDesign {
|
|
|
107
115
|
perVisit(bytes, carbonIntensity = false, segmentResults = false, ratingResults = false, options = {}) {
|
|
108
116
|
const energyBycomponent = this.energyPerVisitByComponent(bytes, options);
|
|
109
117
|
if (typeof carbonIntensity !== "boolean") {
|
|
110
|
-
throw new Error(
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
throw new Error(
|
|
119
|
+
`perVisit expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
const co2ValuesbyComponent = this.co2byComponent(
|
|
123
|
+
energyBycomponent,
|
|
124
|
+
carbonIntensity,
|
|
125
|
+
options
|
|
126
|
+
);
|
|
113
127
|
const co2Values = Object.values(co2ValuesbyComponent);
|
|
114
|
-
const co2ValuesSum = co2Values.reduce(
|
|
128
|
+
const co2ValuesSum = co2Values.reduce(
|
|
129
|
+
(prevValue, currentValue) => prevValue + currentValue
|
|
130
|
+
);
|
|
115
131
|
let rating = null;
|
|
116
132
|
if (ratingResults) {
|
|
117
133
|
rating = this.ratingScale(co2ValuesSum);
|
|
@@ -134,7 +150,9 @@ class SustainableWebDesign {
|
|
|
134
150
|
energyPerByte(bytes) {
|
|
135
151
|
const energyByComponent = this.energyPerByteByComponent(bytes);
|
|
136
152
|
const energyValues = Object.values(energyByComponent);
|
|
137
|
-
return energyValues.reduce(
|
|
153
|
+
return energyValues.reduce(
|
|
154
|
+
(prevValue, currentValue) => prevValue + currentValue
|
|
155
|
+
);
|
|
138
156
|
}
|
|
139
157
|
energyPerVisitByComponent(bytes, options = {}, firstView = import_constants.FIRST_TIME_VIEWING_PERCENTAGE, returnView = import_constants.RETURNING_VISITOR_PERCENTAGE, dataReloadRatio = import_constants.PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD) {
|
|
140
158
|
if (options.dataReloadRatio || options.dataReloadRatio === 0) {
|
|
@@ -158,7 +176,9 @@ class SustainableWebDesign {
|
|
|
158
176
|
energyPerVisit(bytes) {
|
|
159
177
|
let firstVisits = 0;
|
|
160
178
|
let subsequentVisits = 0;
|
|
161
|
-
const energyBycomponent = Object.entries(
|
|
179
|
+
const energyBycomponent = Object.entries(
|
|
180
|
+
this.energyPerVisitByComponent(bytes)
|
|
181
|
+
);
|
|
162
182
|
for (const [key, val] of energyBycomponent) {
|
|
163
183
|
if (key.indexOf("first") > 0) {
|
|
164
184
|
firstVisits += val;
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/sustainable-web-design-v3.js"],
|
|
4
4
|
"sourcesContent": ["\"use strict\";\n\n/**\n * Sustainable Web Design\n *\n * Updated calculations and figures from\n * https://sustainablewebdesign.org/calculating-digital-emissions/\n *\n */\n\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\";\n\nclass SustainableWebDesign {\n constructor(options) {\n this.allowRatings = true;\n this.options = options;\n this.version = 3;\n }\n\n /**\n * Accept a figure for bytes transferred and return an object representing\n * the share of the total enrgy use of the entire system, broken down\n * by each corresponding system component\n *\n * @param {number} bytes - the data transferred in bytes\n * @return {object} Object containing the energy in kilowatt hours, keyed by system component\n */\n energyPerByteByComponent(bytes) {\n const transferedBytesToGb = bytes / fileSize.GIGABYTE;\n const energyUsage = transferedBytesToGb * KWH_PER_GB;\n\n // return the total energy, with breakdown by component\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 /**\n * Accept an object keys by the different system components, and\n * return an object with the co2 figures key by the each component\n *\n * @param {object} energyByComponent - energy grouped by the four system components\n * @param {number} [carbonIntensity] - carbon intensity to apply to the datacentre values\n * @return {number} the total number in grams of CO2 equivalent emissions\n */\n co2byComponent(\n energyByComponent,\n carbonIntensity = GLOBAL_GRID_INTENSITY,\n options = {}\n ) {\n let deviceCarbonIntensity = GLOBAL_GRID_INTENSITY;\n let networkCarbonIntensity = GLOBAL_GRID_INTENSITY;\n let dataCenterCarbonIntensity = GLOBAL_GRID_INTENSITY;\n\n let globalEmissions = GLOBAL_GRID_INTENSITY;\n\n if (options?.gridIntensity) {\n const { device, network, dataCenter } = options.gridIntensity;\n\n if (device?.value || device?.value === 0) {\n deviceCarbonIntensity = device.value;\n }\n if (network?.value || network?.value === 0) {\n networkCarbonIntensity = network.value;\n }\n // If the user has set a carbon intensity value for the datacentre, then that overrides everything and is used\n if (dataCenter?.value || dataCenter?.value === 0) {\n dataCenterCarbonIntensity = dataCenter.value;\n }\n }\n\n // If the user passes in a TRUE value (green web host), then use the renewables intensity value\n if (carbonIntensity === true) {\n dataCenterCarbonIntensity = RENEWABLES_GRID_INTENSITY;\n }\n\n const returnCO2ByComponent = {};\n for (const [key, value] of Object.entries(energyByComponent)) {\n // we update the datacentre, as that's what we have information\n // about.\n if (key.startsWith(\"dataCenterEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] =\n value * dataCenterCarbonIntensity;\n } else if (key.startsWith(\"consumerDeviceEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] =\n value * deviceCarbonIntensity;\n } else if (key.startsWith(\"networkEnergy\")) {\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] =\n value * networkCarbonIntensity;\n } else {\n // Use the global intensity for the remaining segments\n returnCO2ByComponent[key.replace(\"Energy\", \"CO2\")] =\n value * globalEmissions;\n }\n }\n\n return returnCO2ByComponent;\n }\n\n /**\n * Accept a figure for bytes transferred and return a single figure for CO2\n * emissions. Where information exists about the origin data is being\n * fetched from, a different carbon intensity figure\n * is applied for the data centre share of the carbon intensity.\n *\n * @param {number} bytes - the data transferred in bytes\n * @param {boolean} carbonIntensity - a boolean indicating whether the data center is green or not\n * @param {boolean} segmentResults - a boolean indicating whether to return the results broken down by component\n * @param {boolean} ratingResults - a boolean indicating whether to return the rating based on the Sustainable Web Design Model\n * @param {object} options - an object containing the grid intensity and first/return visitor values\n * @return {number|object} the total number in grams of CO2 equivalent emissions, or an object containing the breakdown by component\n */\n perByte(\n bytes,\n carbonIntensity = false,\n segmentResults = false,\n ratingResults = false,\n options = {}\n ) {\n if (bytes < 1) {\n bytes = 0;\n }\n\n const energyBycomponent = this.energyPerByteByComponent(bytes, options);\n\n // otherwise when faced with non numeric values throw an error\n if (typeof carbonIntensity !== \"boolean\") {\n throw new Error(\n `perByte expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`\n );\n }\n\n const co2ValuesbyComponent = this.co2byComponent(\n energyBycomponent,\n carbonIntensity,\n options\n );\n\n // pull out our values\u2026\n const co2Values = Object.values(co2ValuesbyComponent);\n const co2ValuesSum = co2Values.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(co2ValuesSum);\n }\n\n if (segmentResults) {\n if (ratingResults) {\n return {\n ...co2ValuesbyComponent,\n total: co2ValuesSum,\n rating: rating,\n };\n }\n\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\n }\n\n if (ratingResults) {\n return { total: co2ValuesSum, rating: rating };\n }\n\n return co2ValuesSum;\n }\n\n /**\n * Accept a figure for bytes transferred and return a single figure for CO2\n * emissions. This method applies caching assumptions from the original Sustainable Web Design model.\n *\n * @param {number} bytes - the data transferred in bytes\n * @param {boolean} carbonIntensity - a boolean indicating whether the data center is green or not\n * @param {boolean} segmentResults - a boolean indicating whether to return the results broken down by component\n * @param {boolean} ratingResults - a boolean indicating whether to return the rating based on the Sustainable Web Design Model\n * @param {object} options - an object containing the grid intensity and first/return visitor values\n * @return {number|object} the total number in grams of CO2 equivalent emissions, or an object containing the breakdown by component\n */\n perVisit(\n bytes,\n carbonIntensity = false,\n segmentResults = false,\n ratingResults = false,\n options = {}\n ) {\n const energyBycomponent = this.energyPerVisitByComponent(bytes, options);\n\n if (typeof carbonIntensity !== \"boolean\") {\n // otherwise when faced with non numeric values throw an error\n throw new Error(\n `perVisit expects a boolean for the carbon intensity value. Received: ${carbonIntensity}`\n );\n }\n\n const co2ValuesbyComponent = this.co2byComponent(\n energyBycomponent,\n carbonIntensity,\n options\n );\n\n // pull out our values\u2026\n const co2Values = Object.values(co2ValuesbyComponent);\n const co2ValuesSum = co2Values.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(co2ValuesSum);\n }\n\n if (segmentResults) {\n if (ratingResults) {\n return {\n ...co2ValuesbyComponent,\n total: co2ValuesSum,\n rating: rating,\n };\n }\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\n }\n\n if (ratingResults) {\n return { total: co2ValuesSum, rating: rating };\n }\n\n // so we can return their sum\n return co2ValuesSum;\n }\n\n /**\n * Accept a figure for bytes transferred and return the number of kilowatt hours used\n * by the total system for this data transfer\n *\n * @param {number} bytes\n * @return {number} the number of kilowatt hours used\n */\n energyPerByte(bytes) {\n const energyByComponent = this.energyPerByteByComponent(bytes);\n\n // pull out our values\u2026\n const energyValues = Object.values(energyByComponent);\n\n // so we can return their sum\n return energyValues.reduce(\n (prevValue, currentValue) => prevValue + currentValue\n );\n }\n\n /**\n * Accept a figure for bytes transferred, and return an object containing figures\n * per system component, with the caching assumptions applied. This tries to account\n * for webpages being loaded from a cache by browsers, so if you had a thousand page views,\n * and tried to work out the energy per visit, the numbers would reflect the reduced amounts\n * of transfer.\n *\n * @param {number} bytes - the data transferred in bytes for loading a webpage\n * @param {number} firstView - what percentage of visits are loading this page for the first time\n * @param {number} returnView - what percentage of visits are loading this page for subsequent times\n * @param {number} dataReloadRatio - what percentage of a page is reloaded on each subsequent page view\n *\n * @return {object} Object containing the energy in kilowatt hours, keyed by system component\n */\n energyPerVisitByComponent(\n bytes,\n options = {},\n firstView = FIRST_TIME_VIEWING_PERCENTAGE,\n returnView = RETURNING_VISITOR_PERCENTAGE,\n dataReloadRatio = PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD\n ) {\n if (options.dataReloadRatio || options.dataReloadRatio === 0) {\n dataReloadRatio = options.dataReloadRatio;\n }\n\n if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {\n firstView = options.firstVisitPercentage;\n }\n\n if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {\n returnView = options.returnVisitPercentage;\n }\n\n const energyBycomponent = this.energyPerByteByComponent(bytes);\n const cacheAdjustedSegmentEnergy = {};\n\n const energyValues = Object.values(energyBycomponent);\n\n // for this, we want\n for (const [key, value] of Object.entries(energyBycomponent)) {\n // represent the first load\n cacheAdjustedSegmentEnergy[`${key} - first`] = value * firstView;\n\n // then represent the subsequent load\n cacheAdjustedSegmentEnergy[`${key} - subsequent`] =\n value * returnView * dataReloadRatio;\n }\n\n return cacheAdjustedSegmentEnergy;\n }\n\n /**\n * Accept a figure for bytes, and return the total figure for energy per visit\n * using the default caching assumptions for loading a single website\n *\n * @param {number} bytes\n * @return {number} the total energy use for the visit, after applying the caching assumptions\n */\n energyPerVisit(bytes) {\n // fetch the values using the default caching assumptions\n // const energyValues = Object.values(this.energyPerVisitByComponent(bytes));\n\n let firstVisits = 0;\n let subsequentVisits = 0;\n\n const energyBycomponent = Object.entries(\n this.energyPerVisitByComponent(bytes)\n );\n\n for (const [key, val] of energyBycomponent) {\n if (key.indexOf(\"first\") > 0) {\n firstVisits += val;\n }\n }\n\n for (const [key, val] of energyBycomponent) {\n if (key.indexOf(\"subsequent\") > 0) {\n subsequentVisits += val;\n }\n }\n\n return firstVisits + subsequentVisits;\n }\n\n emissionsPerVisitInGrams(\n energyPerVisit,\n carbonintensity = GLOBAL_GRID_INTENSITY\n ) {\n return formatNumber(energyPerVisit * carbonintensity);\n }\n\n annualEnergyInKwh(energyPerVisit, monthlyVisitors = 1000) {\n return energyPerVisit * monthlyVisitors * 12;\n }\n\n annualEmissionsInGrams(co2grams, monthlyVisitors = 1000) {\n return co2grams * monthlyVisitors * 12;\n }\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\n /**\n * Determines the rating of a website's sustainability based on its CO2 emissions.\n *\n * @param {number} co2e - The CO2 emissions of the website in grams.\n * @returns {string} The sustainability rating, ranging from \"A+\" (best) to \"F\" (worst).\n */\n ratingScale(co2e) {\n return outputRating(co2e, this.version);\n }\n}\n\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,uBAYO;AACP,qBAA2C;AAE3C,MAAM,qBAAqB;AAAA,EACzB,YAAY,SAAS;AACnB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAUA,yBAAyB,OAAO;AAC9B,UAAM,sBAAsB,QAAQ,0BAAS;AAC7C,UAAM,cAAc,sBAAsB;AAG1C,WAAO;AAAA,MACL,sBAAsB,cAAc;AAAA,MACpC,eAAe,cAAc;AAAA,MAC7B,kBAAkB,cAAc;AAAA,MAChC,kBAAkB,cAAc;AAAA,IAClC;AAAA,EACF;AAAA,EASA,eACE,mBACA,kBAAkB,wCAClB,UAAU,CAAC,GACX;AACA,QAAI,wBAAwB;AAC5B,QAAI,yBAAyB;AAC7B,QAAI,4BAA4B;AAEhC,QAAI,kBAAkB;AAEtB,QAAI,mCAAS,eAAe;AAC1B,YAAM,EAAE,QAAQ,SAAS,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/sustainable-web-design-v4.js"],
|
|
4
4
|
"sourcesContent": ["\"use strict\";\n\n/**\n * Sustainable Web Design version 4\n *\n * Updated calculations and figures from\n * https://sustainablewebdesign.org/estimating-digital-emissions/\n *\n */\n\nimport { fileSize, SWDV4 } from \"./constants/index.js\";\nimport { outputRating } from \"./helpers/index.js\";\n\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;\n\n/**\n * Output the CO2e emissions for each system segment\n * @param {object} operationalEmissions\n * @param {object} embodiedEmissions\n * @returns {object}\n */\nfunction outputSegments(operationalEmissions, embodiedEmissions) {\n const totalOperationalCO2e =\n operationalEmissions.dataCenter +\n operationalEmissions.network +\n operationalEmissions.device;\n const totalEmbodiedCO2e =\n embodiedEmissions.dataCenter +\n embodiedEmissions.network +\n embodiedEmissions.device;\n\n const dataCenterCO2e =\n operationalEmissions.dataCenter + embodiedEmissions.dataCenter;\n const networkCO2e = operationalEmissions.network + embodiedEmissions.network;\n const consumerDeviceCO2e =\n operationalEmissions.device + embodiedEmissions.device;\n\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}\n\n/**\n * Determine the green hosting factor\n * @param {boolean} green\n * @param {object} options\n * @returns {number}\n */\nfunction getGreenHostingFactor(green, options) {\n if (green) {\n return 1.0;\n } else if (options?.greenHostingFactor || 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\n /**\n * Calculate the operational energy of data transfer for each system segment\n *\n * @param {number} bytes\n * @returns {object}\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\n return {\n dataCenter,\n network,\n device,\n };\n }\n\n /**\n * Calculate the operational emissions of data transfer for each system segment\n *\n * @param {number} bytes\n * @param {object} options\n * @returns {object}\n */\n operationalEmissions(bytes, options = {}) {\n const { dataCenter, network, device } =\n this.operationalEnergyPerSegment(bytes);\n\n let dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;\n let networkGridIntensity = GLOBAL_GRID_INTENSITY;\n let deviceGridIntensity = GLOBAL_GRID_INTENSITY;\n\n if (options?.gridIntensity) {\n const { device, network, dataCenter } = options.gridIntensity;\n\n if (device?.value || device?.value === 0) {\n deviceGridIntensity = device.value;\n }\n\n if (network?.value || network?.value === 0) {\n networkGridIntensity = network.value;\n }\n\n if (dataCenter?.value || dataCenter?.value === 0) {\n dataCenterGridIntensity = dataCenter.value;\n }\n }\n\n const dataCenterEmissions = dataCenter * dataCenterGridIntensity;\n const networkEmissions = network * networkGridIntensity;\n const deviceEmissions = device * deviceGridIntensity;\n\n return {\n dataCenter: dataCenterEmissions,\n network: networkEmissions,\n device: deviceEmissions,\n };\n }\n\n /**\n * Calculate the embodied energy of data transfer for each system segment\n *\n * @param {number} bytes\n * @returns {object}\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\n return {\n dataCenter,\n network,\n device,\n };\n }\n\n /**\n * Calculate the embodied emissions of data transfer for each system segment\n *\n * @param {number} bytes\n * @returns {object}\n */\n embodiedEmissions(bytes) {\n const { dataCenter, network, device } =\n this.embodiedEnergyPerSegment(bytes);\n\n const dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;\n const networkGridIntensity = GLOBAL_GRID_INTENSITY;\n const deviceGridIntensity = GLOBAL_GRID_INTENSITY;\n\n // NOTE: Per the guidance in the SWDM v4, the grid intensity values for embodied emissions are fixed to the global grid intensity.\n\n const dataCenterEmissions = dataCenter * dataCenterGridIntensity;\n const networkEmissions = network * networkGridIntensity;\n const deviceEmissions = device * deviceGridIntensity;\n\n return {\n dataCenter: dataCenterEmissions,\n network: networkEmissions,\n device: deviceEmissions,\n };\n }\n\n // NOTE: Setting green: true should result in a greenHostingFactor of 1.0\n perByte(\n bytes,\n green = false,\n segmented = false,\n ratingResults = false,\n options = {}\n ) {\n if (bytes < 1) {\n return 0;\n }\n\n const operationalEmissions = this.operationalEmissions(bytes, options);\n const embodiedEmissions = this.embodiedEmissions(bytes);\n const greenHostingFactor = getGreenHostingFactor(green, options);\n\n const totalEmissions = {\n dataCenter:\n operationalEmissions.dataCenter * (1 - greenHostingFactor) +\n embodiedEmissions.dataCenter,\n network: operationalEmissions.network + embodiedEmissions.network,\n device: operationalEmissions.device + embodiedEmissions.device,\n };\n\n const total =\n totalEmissions.dataCenter +\n totalEmissions.network +\n totalEmissions.device;\n\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(total);\n }\n\n if (segmented) {\n const segments = {\n ...outputSegments(operationalEmissions, embodiedEmissions),\n };\n\n if (ratingResults) {\n return {\n ...segments,\n total,\n rating,\n };\n }\n return { ...segments, total };\n }\n\n if (ratingResults) {\n return { total, rating };\n }\n\n return total;\n }\n\n perVisit(\n bytes,\n green = false,\n segmented = false,\n ratingResults = false,\n options = {}\n ) {\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\n if (bytes < 1) {\n return 0;\n }\n\n if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {\n firstViewRatio = options.firstVisitPercentage;\n }\n\n if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {\n returnViewRatio = options.returnVisitPercentage;\n }\n\n if (options.dataReloadRatio || options.dataReloadRatio === 0) {\n dataReloadRatio = options.dataReloadRatio;\n }\n\n // NOTE: First visit emissions are calculated as the sum of all three segments without any caching.\n\n const firstVisitEmissions =\n operationalEmissions.dataCenter * (1 - greenHostingFactor) +\n embodiedEmissions.dataCenter +\n operationalEmissions.network +\n embodiedEmissions.network +\n operationalEmissions.device +\n embodiedEmissions.device;\n\n // NOTE: First visit emissions are calculated as the sum of all three segments with caching applied.\n\n const returnVisitEmissions =\n (operationalEmissions.dataCenter * (1 - greenHostingFactor) +\n embodiedEmissions.dataCenter +\n operationalEmissions.network +\n embodiedEmissions.network +\n operationalEmissions.device +\n embodiedEmissions.device) *\n (1 - dataReloadRatio);\n\n // NOTE: The total emissions account for the percentage of first and return visits.\n const total =\n firstVisitEmissions * firstViewRatio +\n returnVisitEmissions * returnViewRatio;\n\n let rating = null;\n if (ratingResults) {\n rating = this.ratingScale(total);\n }\n\n if (segmented) {\n const segments = {\n ...outputSegments(operationalEmissions, embodiedEmissions),\n firstVisitCO2e: firstVisitEmissions,\n returnVisitCO2e: returnVisitEmissions,\n };\n\n if (ratingResults) {\n return {\n ...segments,\n total,\n rating,\n };\n }\n\n return { ...segments, total };\n }\n\n if (ratingResults) {\n return { total, rating };\n }\n\n return total;\n }\n\n /**\n * Determines the rating of a website's sustainability based on its CO2 emissions.\n *\n * @param {number} co2e - The CO2 emissions of the website in grams.\n * @returns {string} The sustainability rating, ranging from \"A+\" (best) to \"F\" (worst).\n */\n ratingScale(co2e) {\n return outputRating(co2e, this.version);\n }\n}\n\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,uBAAgC;AAChC,qBAA6B;AAE7B,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;
|
|
6
|
-
"names": []
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["device", "network", "dataCenter"]
|
|
7
7
|
}
|
package/dist/esm/co2.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __defProp = Object.defineProperty;
|
|
3
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
4
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
@@ -46,19 +45,25 @@ class CO2 {
|
|
|
46
45
|
this.model = new SustainableWebDesignV4();
|
|
47
46
|
}
|
|
48
47
|
} else if (options == null ? void 0 : options.model) {
|
|
49
|
-
throw new Error(
|
|
50
|
-
|
|
48
|
+
throw new Error(
|
|
49
|
+
`"${options.model}" is not a valid model. Please use "1byte" for the OneByte model, and "swd" for the Sustainable Web Design model.
|
|
50
|
+
See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`
|
|
51
|
+
);
|
|
51
52
|
}
|
|
52
53
|
if ((options == null ? void 0 : options.rating) && typeof options.rating !== "boolean") {
|
|
53
|
-
throw new Error(
|
|
54
|
-
|
|
54
|
+
throw new Error(
|
|
55
|
+
`The rating option must be a boolean. Please use true or false.
|
|
56
|
+
See https://developers.thegreenwebfoundation.org/co2js/options/ to learn more about the options available in CO2.js.`
|
|
57
|
+
);
|
|
55
58
|
}
|
|
56
59
|
const allowRatings = !!this.model.allowRatings;
|
|
57
60
|
this._segment = (options == null ? void 0 : options.results) === "segment";
|
|
58
61
|
this._rating = (options == null ? void 0 : options.rating) === true;
|
|
59
62
|
if (!allowRatings && this._rating) {
|
|
60
|
-
throw new Error(
|
|
61
|
-
|
|
63
|
+
throw new Error(
|
|
64
|
+
`The rating system is not supported in the model you are using. Try using the Sustainable Web Design model instead.
|
|
65
|
+
See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`
|
|
66
|
+
);
|
|
62
67
|
}
|
|
63
68
|
}
|
|
64
69
|
perByte(bytes, green = false) {
|
|
@@ -69,8 +74,10 @@ See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more abo
|
|
|
69
74
|
if ((_a = this.model) == null ? void 0 : _a.perVisit) {
|
|
70
75
|
return this.model.perVisit(bytes, green, this._segment, this._rating);
|
|
71
76
|
} else {
|
|
72
|
-
throw new Error(
|
|
73
|
-
|
|
77
|
+
throw new Error(
|
|
78
|
+
`The perVisit() method is not supported in the model you are using. Try using perByte() instead.
|
|
79
|
+
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`
|
|
80
|
+
);
|
|
74
81
|
}
|
|
75
82
|
}
|
|
76
83
|
perByteTrace(bytes, green = false, options = {}) {
|
|
@@ -86,7 +93,13 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
|
|
|
86
93
|
"returnVisitPercentage"
|
|
87
94
|
]);
|
|
88
95
|
return {
|
|
89
|
-
co2: this.model.perByte(
|
|
96
|
+
co2: this.model.perByte(
|
|
97
|
+
bytes,
|
|
98
|
+
green,
|
|
99
|
+
this._segment,
|
|
100
|
+
this._rating,
|
|
101
|
+
adjustments
|
|
102
|
+
),
|
|
90
103
|
green,
|
|
91
104
|
variables: __spreadValues({
|
|
92
105
|
description: "Below are the variables used to calculate this CO2 estimate.",
|
|
@@ -103,7 +116,13 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
|
|
|
103
116
|
const adjustments = parseOptions(options, this.model.version, green);
|
|
104
117
|
const _b = adjustments, { gridIntensity } = _b, variables = __objRest(_b, ["gridIntensity"]);
|
|
105
118
|
return {
|
|
106
|
-
co2: this.model.perVisit(
|
|
119
|
+
co2: this.model.perVisit(
|
|
120
|
+
bytes,
|
|
121
|
+
green,
|
|
122
|
+
this._segment,
|
|
123
|
+
this._rating,
|
|
124
|
+
adjustments
|
|
125
|
+
),
|
|
107
126
|
green,
|
|
108
127
|
variables: __spreadValues({
|
|
109
128
|
description: "Below are the variables used to calculate this CO2 estimate.",
|
|
@@ -114,8 +133,10 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
|
|
|
114
133
|
}, variables)
|
|
115
134
|
};
|
|
116
135
|
} else {
|
|
117
|
-
throw new Error(
|
|
118
|
-
|
|
136
|
+
throw new Error(
|
|
137
|
+
`The perVisitTrace() method is not supported in the model you are using. Try using perByte() instead.
|
|
138
|
+
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`
|
|
139
|
+
);
|
|
119
140
|
}
|
|
120
141
|
}
|
|
121
142
|
SustainableWebDesignV3() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
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.41, "ASIA": 591.13, "AUS": 556.3, "AUT": 110.
|
|
1
|
+
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.41, "ASIA": 591.13, "AUS": 556.3, "AUT": 110.78, "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": 204.96, "CUB": 637.61, "CYP": 526.02, "CZE": 449.72, "DNK": 151.65, "DJI": 692.31, "DMA": 529.41, "DOM": 580.78, "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.89, "EUROPE": 302.27, "FLK": 500, "FRO": 404.76, "FJI": 288.46, "FIN": 79.12, "FRA": 56.02, "GUF": 217.82, "PYF": 442.86, "G20": 477.87, "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": 282.98, "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": 256.03, "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": 436.92, "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.31, "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": 165.55, "PRI": 677.96, "QAT": 602.5, "REU": 572.82, "ROU": 240.58, "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.78, "SVK": 116.77, "SVN": 231.28, "SLB": 700, "SOM": 578.95, "ZAF": 709.69, "KOR": 432.11, "SSD": 629.03, "ESP": 174.05, "LKA": 509.78, "SDN": 263.16, "SUR": 349.28, "SWE": 40.7, "CHE": 34.7, "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.63, "YEM": 566.1, "ZMB": 111.97, "ZWE": 297.87 };
|
|
2
2
|
const type = "average";
|
|
3
3
|
var average_intensities_min_default = { data, type };
|
|
4
4
|
export {
|
|
@@ -12,93 +12,56 @@ const SWDM4_GLOBAL_GRID_INTENSITY = SWDV4.GLOBAL_GRID_INTENSITY;
|
|
|
12
12
|
const formatNumber = (num) => parseFloat(num.toFixed(2));
|
|
13
13
|
const lessThanEqualTo = (num, limit) => num <= limit;
|
|
14
14
|
function parseOptions(options = {}, version = 3, green = false) {
|
|
15
|
-
var _a, _b, _c, _d, _e, _f;
|
|
16
15
|
const globalGridIntensity = version === 4 ? SWDM4_GLOBAL_GRID_INTENSITY : SWDM3_GLOBAL_GRID_INTENSITY;
|
|
17
16
|
if (typeof options !== "object") {
|
|
18
17
|
throw new Error("Options must be an object");
|
|
19
18
|
}
|
|
20
19
|
const adjustments = {};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
function setIntensity(segment, segmentIntensity) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
if (segmentIntensity || segmentIntensity === 0) {
|
|
23
|
+
if (typeof segmentIntensity === "object") {
|
|
24
|
+
if (!averageIntensity.data[(_a = segmentIntensity.country) == null ? void 0 : _a.toUpperCase()]) {
|
|
25
|
+
console.warn(
|
|
26
|
+
`"${segmentIntensity.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
28
27
|
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information.
|
|
29
|
-
Falling back to global average grid intensity.`
|
|
30
|
-
|
|
28
|
+
Falling back to global average grid intensity.`
|
|
29
|
+
);
|
|
30
|
+
adjustments.gridIntensity[segment] = {
|
|
31
31
|
value: globalGridIntensity
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
adjustments.gridIntensity[
|
|
35
|
-
country:
|
|
36
|
-
value: parseFloat(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
adjustments.gridIntensity["device"] = {
|
|
40
|
-
value: device
|
|
41
|
-
};
|
|
42
|
-
} else {
|
|
43
|
-
adjustments.gridIntensity["device"] = {
|
|
44
|
-
value: globalGridIntensity
|
|
45
|
-
};
|
|
46
|
-
console.warn(`The device grid intensity must be a number or an object. You passed in a ${typeof device}.
|
|
47
|
-
Falling back to global average grid intensity.`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (dataCenter || dataCenter === 0) {
|
|
51
|
-
if (typeof dataCenter === "object") {
|
|
52
|
-
if (!averageIntensity.data[(_c = dataCenter.country) == null ? void 0 : _c.toUpperCase()]) {
|
|
53
|
-
console.warn(`"${dataCenter.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
54
|
-
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information.
|
|
55
|
-
Falling back to global average grid intensity.`);
|
|
56
|
-
adjustments.gridIntensity["dataCenter"] = {
|
|
57
|
-
value: SWDM3_GLOBAL_GRID_INTENSITY
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
adjustments.gridIntensity["dataCenter"] = {
|
|
61
|
-
country: dataCenter.country,
|
|
62
|
-
value: parseFloat(averageIntensity.data[(_d = dataCenter.country) == null ? void 0 : _d.toUpperCase()])
|
|
34
|
+
adjustments.gridIntensity[segment] = {
|
|
35
|
+
country: segmentIntensity.country,
|
|
36
|
+
value: parseFloat(
|
|
37
|
+
averageIntensity.data[(_b = segmentIntensity.country) == null ? void 0 : _b.toUpperCase()]
|
|
38
|
+
)
|
|
63
39
|
};
|
|
64
|
-
} else if (typeof
|
|
65
|
-
adjustments.gridIntensity[
|
|
66
|
-
value:
|
|
40
|
+
} else if (typeof segmentIntensity === "number") {
|
|
41
|
+
adjustments.gridIntensity[segment] = {
|
|
42
|
+
value: segmentIntensity
|
|
67
43
|
};
|
|
68
44
|
} else {
|
|
69
|
-
adjustments.gridIntensity[
|
|
45
|
+
adjustments.gridIntensity[segment] = {
|
|
70
46
|
value: globalGridIntensity
|
|
71
47
|
};
|
|
72
|
-
console.warn(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (network || network === 0) {
|
|
77
|
-
if (typeof network === "object") {
|
|
78
|
-
if (!averageIntensity.data[(_e = network.country) == null ? void 0 : _e.toUpperCase()]) {
|
|
79
|
-
console.warn(`"${network.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
80
|
-
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information. Falling back to global average grid intensity.
|
|
81
|
-
Falling back to global average grid intensity.`);
|
|
82
|
-
adjustments.gridIntensity["network"] = {
|
|
83
|
-
value: globalGridIntensity
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
adjustments.gridIntensity["network"] = {
|
|
87
|
-
country: network.country,
|
|
88
|
-
value: parseFloat(averageIntensity.data[(_f = network.country) == null ? void 0 : _f.toUpperCase()])
|
|
89
|
-
};
|
|
90
|
-
} else if (typeof network === "number") {
|
|
91
|
-
adjustments.gridIntensity["network"] = {
|
|
92
|
-
value: network
|
|
93
|
-
};
|
|
94
|
-
} else {
|
|
95
|
-
adjustments.gridIntensity["network"] = {
|
|
96
|
-
value: globalGridIntensity
|
|
97
|
-
};
|
|
98
|
-
console.warn(`The network grid intensity must be a number or an object. You passed in a ${typeof network}.
|
|
99
|
-
Falling back to global average grid intensity.`);
|
|
48
|
+
console.warn(
|
|
49
|
+
`The ${segment} grid intensity must be a number or an object. You passed in a ${typeof segmentIntensity}.
|
|
50
|
+
Falling back to global average grid intensity.`
|
|
51
|
+
);
|
|
100
52
|
}
|
|
53
|
+
} else {
|
|
54
|
+
adjustments.gridIntensity[segment] = {
|
|
55
|
+
value: globalGridIntensity
|
|
56
|
+
};
|
|
101
57
|
}
|
|
58
|
+
}
|
|
59
|
+
if (options == null ? void 0 : options.gridIntensity) {
|
|
60
|
+
adjustments.gridIntensity = {};
|
|
61
|
+
const { device, dataCenter, network } = options.gridIntensity;
|
|
62
|
+
setIntensity("device", device);
|
|
63
|
+
setIntensity("dataCenter", dataCenter);
|
|
64
|
+
setIntensity("network", network);
|
|
102
65
|
} else {
|
|
103
66
|
adjustments.gridIntensity = {
|
|
104
67
|
device: { value: globalGridIntensity },
|
|
@@ -112,18 +75,24 @@ Falling back to global average grid intensity.`);
|
|
|
112
75
|
adjustments.dataReloadRatio = options.dataReloadRatio;
|
|
113
76
|
} else {
|
|
114
77
|
adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
|
|
115
|
-
console.warn(
|
|
116
|
-
|
|
78
|
+
console.warn(
|
|
79
|
+
`The dataReloadRatio option must be a number between 0 and 1. You passed in ${options.dataReloadRatio}.
|
|
80
|
+
Falling back to default value.`
|
|
81
|
+
);
|
|
117
82
|
}
|
|
118
83
|
} else {
|
|
119
84
|
adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
|
|
120
|
-
console.warn(
|
|
121
|
-
|
|
85
|
+
console.warn(
|
|
86
|
+
`The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}.
|
|
87
|
+
Falling back to default value.`
|
|
88
|
+
);
|
|
122
89
|
}
|
|
123
90
|
} else {
|
|
124
91
|
adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
|
|
125
|
-
console.warn(
|
|
126
|
-
|
|
92
|
+
console.warn(
|
|
93
|
+
`The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}.
|
|
94
|
+
Falling back to default value.`
|
|
95
|
+
);
|
|
127
96
|
}
|
|
128
97
|
if ((options == null ? void 0 : options.firstVisitPercentage) || options.firstVisitPercentage === 0) {
|
|
129
98
|
if (typeof options.firstVisitPercentage === "number") {
|
|
@@ -131,18 +100,24 @@ Falling back to default value.`);
|
|
|
131
100
|
adjustments.firstVisitPercentage = options.firstVisitPercentage;
|
|
132
101
|
} else {
|
|
133
102
|
adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
|
|
134
|
-
console.warn(
|
|
135
|
-
|
|
103
|
+
console.warn(
|
|
104
|
+
`The firstVisitPercentage option must be a number between 0 and 1. You passed in ${options.firstVisitPercentage}.
|
|
105
|
+
Falling back to default value.`
|
|
106
|
+
);
|
|
136
107
|
}
|
|
137
108
|
} else {
|
|
138
109
|
adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
|
|
139
|
-
console.warn(
|
|
140
|
-
|
|
110
|
+
console.warn(
|
|
111
|
+
`The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}.
|
|
112
|
+
Falling back to default value.`
|
|
113
|
+
);
|
|
141
114
|
}
|
|
142
115
|
} else {
|
|
143
116
|
adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
|
|
144
|
-
console.warn(
|
|
145
|
-
|
|
117
|
+
console.warn(
|
|
118
|
+
`The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}.
|
|
119
|
+
Falling back to default value.`
|
|
120
|
+
);
|
|
146
121
|
}
|
|
147
122
|
if ((options == null ? void 0 : options.returnVisitPercentage) || options.returnVisitPercentage === 0) {
|
|
148
123
|
if (typeof options.returnVisitPercentage === "number") {
|
|
@@ -150,18 +125,24 @@ Falling back to default value.`);
|
|
|
150
125
|
adjustments.returnVisitPercentage = options.returnVisitPercentage;
|
|
151
126
|
} else {
|
|
152
127
|
adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
|
|
153
|
-
console.warn(
|
|
154
|
-
|
|
128
|
+
console.warn(
|
|
129
|
+
`The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}.
|
|
130
|
+
Falling back to default value.`
|
|
131
|
+
);
|
|
155
132
|
}
|
|
156
133
|
} else {
|
|
157
134
|
adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
|
|
158
|
-
console.warn(
|
|
159
|
-
|
|
135
|
+
console.warn(
|
|
136
|
+
`The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
|
|
137
|
+
Falling back to default value.`
|
|
138
|
+
);
|
|
160
139
|
}
|
|
161
140
|
} else {
|
|
162
141
|
adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
|
|
163
|
-
console.warn(
|
|
164
|
-
|
|
142
|
+
console.warn(
|
|
143
|
+
`The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
|
|
144
|
+
Falling back to default value.`
|
|
145
|
+
);
|
|
165
146
|
}
|
|
166
147
|
if ((options == null ? void 0 : options.greenHostingFactor) || options.greenHostingFactor === 0 && version === 4) {
|
|
167
148
|
if (typeof options.greenHostingFactor === "number") {
|
|
@@ -169,13 +150,17 @@ Falling back to default value.`);
|
|
|
169
150
|
adjustments.greenHostingFactor = options.greenHostingFactor;
|
|
170
151
|
} else {
|
|
171
152
|
adjustments.greenHostingFactor = 0;
|
|
172
|
-
console.warn(
|
|
173
|
-
|
|
153
|
+
console.warn(
|
|
154
|
+
`The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}.
|
|
155
|
+
Falling back to default value.`
|
|
156
|
+
);
|
|
174
157
|
}
|
|
175
158
|
} else {
|
|
176
159
|
adjustments.greenHostingFactor = 0;
|
|
177
|
-
console.warn(
|
|
178
|
-
|
|
160
|
+
console.warn(
|
|
161
|
+
`The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
|
|
162
|
+
Falling back to default value.`
|
|
163
|
+
);
|
|
179
164
|
}
|
|
180
165
|
} else if (version === 4) {
|
|
181
166
|
adjustments.greenHostingFactor = 0;
|
|
@@ -186,7 +171,7 @@ Falling back to default value.`);
|
|
|
186
171
|
return adjustments;
|
|
187
172
|
}
|
|
188
173
|
function getApiRequestHeaders(comment = "") {
|
|
189
|
-
return { "User-Agent": `co2js/${"0.16.
|
|
174
|
+
return { "User-Agent": `co2js/${"0.16.3"} ${comment}` };
|
|
190
175
|
}
|
|
191
176
|
function outputRating(co2e, swdmVersion) {
|
|
192
177
|
let {
|
package/dist/esm/hosting-api.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
import { getApiRequestHeaders } from "./helpers/index.js";
|
|
3
2
|
import hostingJSON from "./hosting-json.js";
|
|
4
3
|
function check(domain, optionsOrAgentId) {
|
|
@@ -13,9 +12,12 @@ function check(domain, optionsOrAgentId) {
|
|
|
13
12
|
}
|
|
14
13
|
}
|
|
15
14
|
async function checkAgainstAPI(domain, options = {}) {
|
|
16
|
-
const req = await fetch(
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const req = await fetch(
|
|
16
|
+
`https://api.thegreenwebfoundation.org/greencheck/${domain}`,
|
|
17
|
+
{
|
|
18
|
+
headers: getApiRequestHeaders(options.userAgentIdentifier)
|
|
19
|
+
}
|
|
20
|
+
);
|
|
19
21
|
if (options == null ? void 0 : options.db) {
|
|
20
22
|
return hostingJSON.check(domain, options.db);
|
|
21
23
|
}
|
package/dist/esm/hosting-json.js
CHANGED
package/dist/esm/hosting.js
CHANGED