@tgwf/co2 0.16.6 → 0.16.8

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cjs/1byte.js +6 -0
  3. package/dist/cjs/1byte.js.map +1 -1
  4. package/dist/cjs/co2.js +42 -0
  5. package/dist/cjs/co2.js.map +1 -1
  6. package/dist/cjs/constants/index.js +4 -0
  7. package/dist/cjs/constants/index.js.map +1 -1
  8. package/dist/cjs/data/average-intensities.min.js +1 -1
  9. package/dist/cjs/data/average-intensities.min.js.map +2 -2
  10. package/dist/cjs/helpers/index.js +1 -1
  11. package/dist/cjs/helpers/index.js.map +1 -1
  12. package/dist/cjs/hosting-api.js +4 -0
  13. package/dist/cjs/hosting-api.js.map +1 -1
  14. package/dist/cjs/hosting-json.js.map +1 -1
  15. package/dist/cjs/hosting-json.node.js +4 -0
  16. package/dist/cjs/hosting-json.node.js.map +1 -1
  17. package/dist/cjs/hosting-node.js +4 -0
  18. package/dist/cjs/hosting-node.js.map +1 -1
  19. package/dist/cjs/hosting.js +4 -0
  20. package/dist/cjs/hosting.js.map +1 -1
  21. package/dist/cjs/index-node.js +4 -0
  22. package/dist/cjs/index-node.js.map +1 -1
  23. package/dist/cjs/index.js +9 -5
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/sustainable-web-design-v3.js +74 -0
  26. package/dist/cjs/sustainable-web-design-v3.js.map +1 -1
  27. package/dist/cjs/sustainable-web-design-v4.js +33 -1
  28. package/dist/cjs/sustainable-web-design-v4.js.map +2 -2
  29. package/dist/esm/1byte.js +6 -0
  30. package/dist/esm/co2.js +43 -10
  31. package/dist/esm/data/average-intensities.min.js +1 -1
  32. package/dist/esm/helpers/index.js +14 -28
  33. package/dist/esm/hosting-api.js +2 -2
  34. package/dist/esm/index.js +2 -2
  35. package/dist/esm/sustainable-web-design-v3.js +78 -4
  36. package/dist/esm/sustainable-web-design-v4.js +33 -1
  37. package/package.json +3 -3
@@ -30,6 +30,14 @@ class SustainableWebDesign {
30
30
  this.options = options;
31
31
  this.version = 3;
32
32
  }
33
+ /**
34
+ * Accept a figure for bytes transferred and return an object representing
35
+ * the share of the total enrgy use of the entire system, broken down
36
+ * by each corresponding system component
37
+ *
38
+ * @param {number} bytes - the data transferred in bytes
39
+ * @return {object} Object containing the energy in kilowatt hours, keyed by system component
40
+ */
33
41
  energyPerByteByComponent(bytes) {
34
42
  const transferedBytesToGb = bytes / import_constants.fileSize.GIGABYTE;
35
43
  const energyUsage = transferedBytesToGb * import_constants.KWH_PER_GB;
@@ -40,6 +48,14 @@ class SustainableWebDesign {
40
48
  dataCenterEnergy: energyUsage * import_constants.DATACENTER_ENERGY
41
49
  };
42
50
  }
51
+ /**
52
+ * Accept an object keys by the different system components, and
53
+ * return an object with the co2 figures key by the each component
54
+ *
55
+ * @param {object} energyByComponent - energy grouped by the four system components
56
+ * @param {number} [carbonIntensity] - carbon intensity to apply to the datacentre values
57
+ * @return {number} the total number in grams of CO2 equivalent emissions
58
+ */
43
59
  co2byComponent(energyByComponent, carbonIntensity = import_constants.GLOBAL_GRID_INTENSITY, options = {}) {
44
60
  let deviceCarbonIntensity = import_constants.GLOBAL_GRID_INTENSITY;
45
61
  let networkCarbonIntensity = import_constants.GLOBAL_GRID_INTENSITY;
@@ -74,6 +90,19 @@ class SustainableWebDesign {
74
90
  }
75
91
  return returnCO2ByComponent;
76
92
  }
93
+ /**
94
+ * Accept a figure for bytes transferred and return a single figure for CO2
95
+ * emissions. Where information exists about the origin data is being
96
+ * fetched from, a different carbon intensity figure
97
+ * is applied for the data centre share of the carbon intensity.
98
+ *
99
+ * @param {number} bytes - the data transferred in bytes
100
+ * @param {boolean} carbonIntensity - a boolean indicating whether the data center is green or not
101
+ * @param {boolean} segmentResults - a boolean indicating whether to return the results broken down by component
102
+ * @param {boolean} ratingResults - a boolean indicating whether to return the rating based on the Sustainable Web Design Model
103
+ * @param {object} options - an object containing the grid intensity and first/return visitor values
104
+ * @return {number|object} the total number in grams of CO2 equivalent emissions, or an object containing the breakdown by component
105
+ */
77
106
  perByte(bytes, carbonIntensity = false, segmentResults = false, ratingResults = false, options = {}) {
78
107
  if (bytes < 1) {
79
108
  bytes = 0;
@@ -112,6 +141,17 @@ class SustainableWebDesign {
112
141
  }
113
142
  return co2ValuesSum;
114
143
  }
144
+ /**
145
+ * Accept a figure for bytes transferred and return a single figure for CO2
146
+ * emissions. This method applies caching assumptions from the original Sustainable Web Design model.
147
+ *
148
+ * @param {number} bytes - the data transferred in bytes
149
+ * @param {boolean} carbonIntensity - a boolean indicating whether the data center is green or not
150
+ * @param {boolean} segmentResults - a boolean indicating whether to return the results broken down by component
151
+ * @param {boolean} ratingResults - a boolean indicating whether to return the rating based on the Sustainable Web Design Model
152
+ * @param {object} options - an object containing the grid intensity and first/return visitor values
153
+ * @return {number|object} the total number in grams of CO2 equivalent emissions, or an object containing the breakdown by component
154
+ */
115
155
  perVisit(bytes, carbonIntensity = false, segmentResults = false, ratingResults = false, options = {}) {
116
156
  const energyBycomponent = this.energyPerVisitByComponent(bytes, options);
117
157
  if (typeof carbonIntensity !== "boolean") {
@@ -147,6 +187,13 @@ class SustainableWebDesign {
147
187
  }
148
188
  return co2ValuesSum;
149
189
  }
190
+ /**
191
+ * Accept a figure for bytes transferred and return the number of kilowatt hours used
192
+ * by the total system for this data transfer
193
+ *
194
+ * @param {number} bytes
195
+ * @return {number} the number of kilowatt hours used
196
+ */
150
197
  energyPerByte(bytes) {
151
198
  const energyByComponent = this.energyPerByteByComponent(bytes);
152
199
  const energyValues = Object.values(energyByComponent);
@@ -154,6 +201,20 @@ class SustainableWebDesign {
154
201
  (prevValue, currentValue) => prevValue + currentValue
155
202
  );
156
203
  }
204
+ /**
205
+ * Accept a figure for bytes transferred, and return an object containing figures
206
+ * per system component, with the caching assumptions applied. This tries to account
207
+ * for webpages being loaded from a cache by browsers, so if you had a thousand page views,
208
+ * and tried to work out the energy per visit, the numbers would reflect the reduced amounts
209
+ * of transfer.
210
+ *
211
+ * @param {number} bytes - the data transferred in bytes for loading a webpage
212
+ * @param {number} firstView - what percentage of visits are loading this page for the first time
213
+ * @param {number} returnView - what percentage of visits are loading this page for subsequent times
214
+ * @param {number} dataReloadRatio - what percentage of a page is reloaded on each subsequent page view
215
+ *
216
+ * @return {object} Object containing the energy in kilowatt hours, keyed by system component
217
+ */
157
218
  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) {
158
219
  if (options.dataReloadRatio || options.dataReloadRatio === 0) {
159
220
  dataReloadRatio = options.dataReloadRatio;
@@ -173,6 +234,13 @@ class SustainableWebDesign {
173
234
  }
174
235
  return cacheAdjustedSegmentEnergy;
175
236
  }
237
+ /**
238
+ * Accept a figure for bytes, and return the total figure for energy per visit
239
+ * using the default caching assumptions for loading a single website
240
+ *
241
+ * @param {number} bytes
242
+ * @return {number} the total energy use for the visit, after applying the caching assumptions
243
+ */
176
244
  energyPerVisit(bytes) {
177
245
  let firstVisits = 0;
178
246
  let subsequentVisits = 0;
@@ -208,6 +276,12 @@ class SustainableWebDesign {
208
276
  productionEnergy: (0, import_helpers.formatNumber)(annualEnergy * import_constants.PRODUCTION_ENERGY)
209
277
  };
210
278
  }
279
+ /**
280
+ * Determines the rating of a website's sustainability based on its CO2 emissions.
281
+ *
282
+ * @param {number} co2e - The CO2 emissions of the website in grams.
283
+ * @returns {string} The sustainability rating, ranging from "A+" (best) to "F" (worst).
284
+ */
211
285
  ratingScale(co2e) {
212
286
  return (0, import_helpers.outputRating)(co2e, this.version);
213
287
  }
@@ -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": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -67,6 +67,12 @@ class SustainableWebDesign {
67
67
  this.options = options;
68
68
  this.version = 4;
69
69
  }
70
+ /**
71
+ * Calculate the operational energy of data transfer for each system segment
72
+ *
73
+ * @param {number} bytes
74
+ * @returns {object}
75
+ */
70
76
  operationalEnergyPerSegment(bytes) {
71
77
  const transferedBytesToGb = bytes / import_constants.fileSize.GIGABYTE;
72
78
  const dataCenter = transferedBytesToGb * OPERATIONAL_KWH_PER_GB_DATACENTER;
@@ -78,6 +84,13 @@ class SustainableWebDesign {
78
84
  device
79
85
  };
80
86
  }
87
+ /**
88
+ * Calculate the operational emissions of data transfer for each system segment
89
+ *
90
+ * @param {number} bytes
91
+ * @param {object} options
92
+ * @returns {object}
93
+ */
81
94
  operationalEmissions(bytes, options = {}) {
82
95
  const { dataCenter, network, device } = this.operationalEnergyPerSegment(bytes);
83
96
  let dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;
@@ -104,6 +117,12 @@ class SustainableWebDesign {
104
117
  device: deviceEmissions
105
118
  };
106
119
  }
120
+ /**
121
+ * Calculate the embodied energy of data transfer for each system segment
122
+ *
123
+ * @param {number} bytes
124
+ * @returns {object}
125
+ */
107
126
  embodiedEnergyPerSegment(bytes) {
108
127
  const transferedBytesToGb = bytes / import_constants.fileSize.GIGABYTE;
109
128
  const dataCenter = transferedBytesToGb * EMBODIED_KWH_PER_GB_DATACENTER;
@@ -115,6 +134,12 @@ class SustainableWebDesign {
115
134
  device
116
135
  };
117
136
  }
137
+ /**
138
+ * Calculate the embodied emissions of data transfer for each system segment
139
+ *
140
+ * @param {number} bytes
141
+ * @returns {object}
142
+ */
118
143
  embodiedEmissions(bytes) {
119
144
  const { dataCenter, network, device } = this.embodiedEnergyPerSegment(bytes);
120
145
  const dataCenterGridIntensity = GLOBAL_GRID_INTENSITY;
@@ -129,6 +154,7 @@ class SustainableWebDesign {
129
154
  device: deviceEmissions
130
155
  };
131
156
  }
157
+ // NOTE: Setting green: true should result in a greenHostingFactor of 1.0
132
158
  perByte(bytes, green = false, segmented = false, ratingResults = false, options = {}) {
133
159
  if (bytes < 1) {
134
160
  return 0;
@@ -184,7 +210,7 @@ class SustainableWebDesign {
184
210
  dataReloadRatio = options.dataReloadRatio;
185
211
  }
186
212
  const firstVisitEmissions = operationalEmissions.dataCenter * (1 - greenHostingFactor) + embodiedEmissions.dataCenter + operationalEmissions.network + embodiedEmissions.network + operationalEmissions.device + embodiedEmissions.device;
187
- const returnVisitEmissions = (operationalEmissions.dataCenter * (1 - greenHostingFactor) + embodiedEmissions.dataCenter + operationalEmissions.network + embodiedEmissions.network + operationalEmissions.device + embodiedEmissions.device) * (1 - dataReloadRatio);
213
+ const returnVisitEmissions = firstVisitEmissions * dataReloadRatio;
188
214
  const total = firstVisitEmissions * firstViewRatio + returnVisitEmissions * returnViewRatio;
189
215
  let rating = null;
190
216
  if (ratingResults) {
@@ -210,6 +236,12 @@ class SustainableWebDesign {
210
236
  }
211
237
  return total;
212
238
  }
239
+ /**
240
+ * Determines the rating of a website's sustainability based on its CO2 emissions.
241
+ *
242
+ * @param {number} co2e - The CO2 emissions of the website in grams.
243
+ * @returns {string} The sustainability rating, ranging from "A+" (best) to "F" (worst).
244
+ */
213
245
  ratingScale(co2e) {
214
246
  return (0, import_helpers.outputRating)(co2e, this.version);
215
247
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/sustainable-web-design-v4.js"],
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;AACF,IAAI;AAQJ,SAAS,eAAe,sBAAsB,mBAAmB;AAC/D,QAAM,uBACJ,qBAAqB,aACrB,qBAAqB,UACrB,qBAAqB;AACvB,QAAM,oBACJ,kBAAkB,aAClB,kBAAkB,UAClB,kBAAkB;AAEpB,QAAM,iBACJ,qBAAqB,aAAa,kBAAkB;AACtD,QAAM,cAAc,qBAAqB,UAAU,kBAAkB;AACrE,QAAM,qBACJ,qBAAqB,SAAS,kBAAkB;AAElD,SAAO;AAAA,IACL,2BAA2B,qBAAqB;AAAA,IAChD,wBAAwB,qBAAqB;AAAA,IAC7C,+BAA+B,qBAAqB;AAAA,IACpD,wBAAwB,kBAAkB;AAAA,IAC1C,qBAAqB,kBAAkB;AAAA,IACvC,4BAA4B,kBAAkB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,sBAAsB,OAAO,SAAS;AAC7C,MAAI,OAAO;AACT,WAAO;AAAA,EACT,YAAW,mCAAS,wBAAsB,mCAAS,wBAAuB,GAAG;AAC3E,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AACA,MAAM,qBAAqB;AAAA,EACzB,YAAY,SAAS;AACnB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAQA,4BAA4B,OAAO;AACjC,UAAM,sBAAsB,QAAQ,0BAAS;AAC7C,UAAM,aAAa,sBAAsB;AACzC,UAAM,UAAU,sBAAsB;AACtC,UAAM,SAAS,sBAAsB;AAErC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EASA,qBAAqB,OAAO,UAAU,CAAC,GAAG;AACxC,UAAM,EAAE,YAAY,SAAS,OAAO,IAClC,KAAK,4BAA4B,KAAK;AAExC,QAAI,0BAA0B;AAC9B,QAAI,uBAAuB;AAC3B,QAAI,sBAAsB;AAE1B,QAAI,mCAAS,eAAe;AAC1B,YAAM,EAAE,QAAAA,SAAQ,SAAAC,UAAS,YAAAC,YAAW,IAAI,QAAQ;AAEhD,WAAIF,WAAA,gBAAAA,QAAQ,WAASA,WAAA,gBAAAA,QAAQ,WAAU,GAAG;AACxC,8BAAsBA,QAAO;AAAA,MAC/B;AAEA,WAAIC,YAAA,gBAAAA,SAAS,WAASA,YAAA,gBAAAA,SAAS,WAAU,GAAG;AAC1C,+BAAuBA,SAAQ;AAAA,MACjC;AAEA,WAAIC,eAAA,gBAAAA,YAAY,WAASA,eAAA,gBAAAA,YAAY,WAAU,GAAG;AAChD,kCAA0BA,YAAW;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,sBAAsB,aAAa;AACzC,UAAM,mBAAmB,UAAU;AACnC,UAAM,kBAAkB,SAAS;AAEjC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAQA,yBAAyB,OAAO;AAC9B,UAAM,sBAAsB,QAAQ,0BAAS;AAC7C,UAAM,aAAa,sBAAsB;AACzC,UAAM,UAAU,sBAAsB;AACtC,UAAM,SAAS,sBAAsB;AAErC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAQA,kBAAkB,OAAO;AACvB,UAAM,EAAE,YAAY,SAAS,OAAO,IAClC,KAAK,yBAAyB,KAAK;AAErC,UAAM,0BAA0B;AAChC,UAAM,uBAAuB;AAC7B,UAAM,sBAAsB;AAI5B,UAAM,sBAAsB,aAAa;AACzC,UAAM,mBAAmB,UAAU;AACnC,UAAM,kBAAkB,SAAS;AAEjC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAGA,QACE,OACA,QAAQ,OACR,YAAY,OACZ,gBAAgB,OAChB,UAAU,CAAC,GACX;AACA,QAAI,QAAQ,GAAG;AACb,aAAO;AAAA,IACT;AAEA,UAAM,uBAAuB,KAAK,qBAAqB,OAAO,OAAO;AACrE,UAAM,oBAAoB,KAAK,kBAAkB,KAAK;AACtD,UAAM,qBAAqB,sBAAsB,OAAO,OAAO;AAE/D,UAAM,iBAAiB;AAAA,MACrB,YACE,qBAAqB,cAAc,IAAI,sBACvC,kBAAkB;AAAA,MACpB,SAAS,qBAAqB,UAAU,kBAAkB;AAAA,MAC1D,QAAQ,qBAAqB,SAAS,kBAAkB;AAAA,IAC1D;AAEA,UAAM,QACJ,eAAe,aACf,eAAe,UACf,eAAe;AAEjB,QAAI,SAAS;AACb,QAAI,eAAe;AACjB,eAAS,KAAK,YAAY,KAAK;AAAA,IACjC;AAEA,QAAI,WAAW;AACb,YAAM,WAAW;AAAA,QACf,GAAG,eAAe,sBAAsB,iBAAiB;AAAA,MAC3D;AAEA,UAAI,eAAe;AACjB,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,GAAG,UAAU,MAAM;AAAA,IAC9B;AAEA,QAAI,eAAe;AACjB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,OACA,QAAQ,OACR,YAAY,OACZ,gBAAgB,OAChB,UAAU,CAAC,GACX;AACA,QAAI,iBAAiB;AACrB,QAAI,kBAAkB;AACtB,QAAI,kBAAkB;AACtB,UAAM,qBAAqB,sBAAsB,OAAO,OAAO;AAC/D,UAAM,uBAAuB,KAAK,qBAAqB,OAAO,OAAO;AACrE,UAAM,oBAAoB,KAAK,kBAAkB,KAAK;AAEtD,QAAI,QAAQ,GAAG;AACb,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,wBAAwB,QAAQ,yBAAyB,GAAG;AACtE,uBAAiB,QAAQ;AAAA,IAC3B;AAEA,QAAI,QAAQ,yBAAyB,QAAQ,0BAA0B,GAAG;AACxE,wBAAkB,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,mBAAmB,QAAQ,oBAAoB,GAAG;AAC5D,wBAAkB,QAAQ;AAAA,IAC5B;AAIA,UAAM,sBACJ,qBAAqB,cAAc,IAAI,sBACvC,kBAAkB,aAClB,qBAAqB,UACrB,kBAAkB,UAClB,qBAAqB,SACrB,kBAAkB;AAIpB,UAAM,wBACH,qBAAqB,cAAc,IAAI,sBACtC,kBAAkB,aAClB,qBAAqB,UACrB,kBAAkB,UAClB,qBAAqB,SACrB,kBAAkB,WACnB,IAAI;AAGP,UAAM,QACJ,sBAAsB,iBACtB,uBAAuB;AAEzB,QAAI,SAAS;AACb,QAAI,eAAe;AACjB,eAAS,KAAK,YAAY,KAAK;AAAA,IACjC;AAEA,QAAI,WAAW;AACb,YAAM,WAAW;AAAA,QACf,GAAG,eAAe,sBAAsB,iBAAiB;AAAA,QACzD,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAEA,UAAI,eAAe;AACjB,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,UAAU,MAAM;AAAA,IAC9B;AAEA,QAAI,eAAe;AACjB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAQA,YAAY,MAAM;AAChB,eAAO,6BAAa,MAAM,KAAK,OAAO;AAAA,EACxC;AACF;AAGA,IAAO,oCAAQ;",
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 // NOTE: Our current implementation of the SWDMv4 calculation diverges slightly from the original calculation that is shown on the SWDM website https://sustainablewebdesign.org/estimating-digital-emissions/\n // The original calculation uses \"Data Cache Ratio\" representing the portion of data that is loaded from cache for returning visitors.\n // Our implementation uses \"Data Reload Ratio\" representing the portion of data that is downloaded again for returning visitors.\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 = firstVisitEmissions * 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": "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",
6
6
  "names": ["device", "network", "dataCenter"]
7
7
  }
package/dist/esm/1byte.js CHANGED
@@ -13,6 +13,12 @@ class OneByte {
13
13
  this.options = options;
14
14
  this.KWH_PER_BYTE_FOR_NETWORK = KWH_PER_BYTE_FOR_NETWORK;
15
15
  }
16
+ /**
17
+ * Calculates the carbon footprint of a website using the OneByte model
18
+ * @param {number} bytes - The number of bytes to calculate the carbon footprint for
19
+ * @param {boolean} green - Whether the energy is green or not
20
+ * @returns {number} The carbon footprint in grams of CO2
21
+ */
16
22
  perByte(bytes, green) {
17
23
  if (bytes < 1) {
18
24
  return 0;
package/dist/esm/co2.js CHANGED
@@ -45,14 +45,12 @@ class CO2 {
45
45
  }
46
46
  } else if (options == null ? void 0 : options.model) {
47
47
  throw new Error(
48
- `"${options.model}" is not a valid model. Please use "1byte" for the OneByte model, and "swd" for the Sustainable Web Design model.
49
- See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`
48
+ '"'.concat(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.')
50
49
  );
51
50
  }
52
51
  if ((options == null ? void 0 : options.rating) && typeof options.rating !== "boolean") {
53
52
  throw new Error(
54
- `The rating option must be a boolean. Please use true or false.
55
- See https://developers.thegreenwebfoundation.org/co2js/options/ to learn more about the options available in CO2.js.`
53
+ "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."
56
54
  );
57
55
  }
58
56
  const allowRatings = !!this.model.allowRatings;
@@ -60,25 +58,51 @@ See https://developers.thegreenwebfoundation.org/co2js/options/ to learn more ab
60
58
  this._rating = (options == null ? void 0 : options.rating) === true;
61
59
  if (!allowRatings && this._rating) {
62
60
  throw new Error(
63
- `The rating system is not supported in the model you are using. Try using the Sustainable Web Design model instead.
64
- See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`
61
+ "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."
65
62
  );
66
63
  }
67
64
  }
65
+ /**
66
+ * Accept a figure in bytes for data transfer, and a boolean for whether
67
+ * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding
68
+ * the data transfer.
69
+ *
70
+ * @param {number} bytes
71
+ * @param {boolean} green
72
+ * @return {number|CO2EstimateComponentsPerByte} the amount of CO2 in grammes or its separate components
73
+ */
68
74
  perByte(bytes, green = false) {
69
75
  return this.model.perByte(bytes, green, this._segment, this._rating);
70
76
  }
77
+ /**
78
+ * Accept a figure in bytes for data transfer, and a boolean for whether
79
+ * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding
80
+ * the data transfer.
81
+ *
82
+ * @param {number} bytes
83
+ * @param {boolean} green
84
+ * @return {number|CO2EstimateComponentsPerVisit} the amount of CO2 in grammes or its separate components
85
+ */
71
86
  perVisit(bytes, green = false) {
72
87
  var _a;
73
88
  if ((_a = this.model) == null ? void 0 : _a.perVisit) {
74
89
  return this.model.perVisit(bytes, green, this._segment, this._rating);
75
90
  } else {
76
91
  throw new Error(
77
- `The perVisit() method is not supported in the model you are using. Try using perByte() instead.
78
- See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`
92
+ "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."
79
93
  );
80
94
  }
81
95
  }
96
+ /**
97
+ * Accept a figure in bytes for data transfer, a boolean for whether
98
+ * the domain shows as 'green', and an options object.
99
+ * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.
100
+ *
101
+ * @param {number} bytes
102
+ * @param {boolean} green
103
+ * @param {Object} options
104
+ * @return {CO2EstimateTraceResultPerByte} the amount of CO2 in grammes
105
+ */
82
106
  perByteTrace(bytes, green = false, options = {}) {
83
107
  const adjustments = parseByteTraceOptions(
84
108
  options,
@@ -113,6 +137,16 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
113
137
  }, otherVariables)
114
138
  };
115
139
  }
140
+ /**
141
+ * Accept a figure in bytes for data transfer, a boolean for whether
142
+ * the domain shows as 'green', and an options object.
143
+ * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.
144
+ *
145
+ * @param {number} bytes
146
+ * @param {boolean} green
147
+ * @param {Object} options
148
+ * @return {CO2EstimateTraceResultPerVisit} the amount of CO2 in grammes
149
+ */
116
150
  perVisitTrace(bytes, green = false, options = {}) {
117
151
  var _a;
118
152
  if ((_a = this.model) == null ? void 0 : _a.perVisit) {
@@ -141,8 +175,7 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
141
175
  };
142
176
  } else {
143
177
  throw new Error(
144
- `The perVisitTrace() method is not supported in the model you are using. Try using perByte() instead.
145
- See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`
178
+ "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."
146
179
  );
147
180
  }
148
181
  }
@@ -1,4 +1,4 @@
1
- const data = { "AFG": 123.71, "AFRICA": 541.25, "ALB": 24.42, "DZA": 633.65, "ASM": 647.06, "AGO": 167.22, "ATG": 611.11, "ARG": 353.96, "ARM": 262.43, "ABW": 550, "ASEAN": 567.48, "ASIA": 590.48, "AUS": 556.3, "AUT": 101.71, "AZE": 669.99, "BHS": 653.66, "BHR": 902.41, "BGD": 683.12, "BRB": 600, "BLR": 314.91, "BEL": 117.74, "BLZ": 155.56, "BEN": 590, "BTN": 24.19, "BOL": 489.11, "BIH": 623.4, "BWA": 849.42, "BRA": 96.4, "BRN": 892.67, "BGR": 264.71, "BFA": 554.91, "BDI": 230.77, "CPV": 480, "KHM": 470.59, "CMR": 285.71, "CAN": 165.15, "CYM": 642.86, "CAF": 0, "TCD": 615.39, "CHL": 272.1, "CHN": 583.61, "COL": 268.97, "COM": 642.86, "COG": 713.73, "COD": 27.04, "COK": 250, "CRI": 24.77, "CIV": 393.53, "HRV": 173.21, "CUB": 638.98, "CYP": 505.32, "CZE": 413.8, "DNK": 144.15, "DJI": 450, "DMA": 600, "DOM": 579.4, "ECU": 176.28, "EGY": 574.04, "SLV": 118.46, "GNQ": 605.1, "ERI": 590.91, "EST": 343.85, "SWZ": 142.86, "ETH": 23.55, "EU": 213.39, "EUROPE": 281.75, "FLK": 1e3, "FRO": 354.17, "FJI": 278.26, "FIN": 72.48, "FRA": 44.13, "GUF": 204.08, "PYF": 436.62, "G20": 477.2, "G7": 340.32, "GAB": 429.47, "GMB": 666.67, "GEO": 168.06, "DEU": 343.96, "GHA": 452.86, "GRC": 319.6, "GRL": 111.11, "GRD": 666.67, "GLP": 493.9, "GUM": 611.11, "GTM": 272.66, "GIN": 182.72, "GNB": 625, "GUY": 634.33, "HTI": 534.65, "HND": 289.5, "HKG": 681.99, "HUN": 182.25, "ISL": 28.33, "IND": 713.01, "IDN": 682.43, "IRN": 641.73, "IRQ": 689.4, "IRL": 284.05, "ISR": 567.26, "ITA": 286.9, "JAM": 561.25, "JPN": 493.59, "JOR": 539.21, "KAZ": 821.9, "KEN": 96.95, "KIR": 500, "XKX": 919.36, "KWT": 636.91, "KGZ": 150.77, "LAO": 232.12, "LATIN AMERICA AND CARIBBEAN": 256.14, "LVA": 136.36, "LBN": 369.47, "LSO": 20.83, "LBR": 435.9, "LBY": 830.53, "LTU": 137.84, "LUX": 134.62, "MAC": 448.98, "MDG": 477.27, "MWI": 54.65, "MYS": 607.88, "MDV": 611.77, "MLI": 394.5, "MLT": 477.48, "MTQ": 516.78, "MRT": 481.71, "MUS": 633.03, "MEX": 492.34, "MIDDLE EAST": 641.43, "MDA": 632.89, "MNG": 785.08, "MNE": 422.22, "MSR": 1e3, "MAR": 616.82, "MOZ": 127.81, "MMR": 588.95, "NAM": 47.62, "NRU": 750, "NPL": 23.36, "NLD": 255.67, "NCL": 585.76, "NZL": 104.42, "NIC": 288.33, "NER": 687.5, "NGA": 508.82, "NORTH AMERICA": 343.02, "PRK": 344.26, "MKD": 524.62, "NOR": 30.32, "OCEANIA": 494.88, "OECD": 339.53, "OMN": 545.88, "PAK": 445.52, "PSE": 460.78, "PAN": 258.74, "PNG": 513.74, "PRY": 24.86, "PER": 287.81, "POL": 616.2, "PRT": 112.24, "PRI": 660.8, "QAT": 602.65, "REU": 525.22, "ROU": 246.02, "RUS": 447.87, "RWA": 301.89, "KNA": 636.36, "LCA": 650, "SPM": 600, "VCT": 600, "WSM": 400, "STP": 555.56, "SAU": 696.31, "SEN": 535.4, "SRB": 678.9, "SYC": 571.43, "SLE": 47.62, "SGP": 470.87, "SVK": 96.52, "SVN": 229.22, "SLB": 636.36, "SOM": 523.81, "ZAF": 709.69, "KOR": 432.11, "SSD": 610.17, "ESP": 146.26, "LKA": 509.78, "SDN": 214.33, "SUR": 383.18, "SWE": 35.92, "CHE": 29.44, "SYR": 682.27, "TWN": 644.36, "TJK": 87.5, "TZA": 371.59, "THA": 549.85, "PHL": 601.15, "TGO": 478.26, "TON": 571.43, "TTO": 682.11, "TUN": 560.36, "TUR": 441.76, "TKM": 1306.3, "TCA": 653.85, "UGA": 57.39, "UKR": 162.13, "ARE": 492.7, "GBR": 209.81, "USA": 369.53, "URY": 115.68, "UZB": 1121.18, "VUT": 500, "VEN": 180.25, "VNM": 472.47, "VGB": 647.06, "VIR": 641.79, "WORLD": 480.69, "YEM": 586.32, "ZMB": 111, "ZWE": 298.44 };
1
+ const data = { "AFG": 123.71, "AFRICA": 542.68, "ALB": 24.42, "DZA": 633.65, "ASM": 647.06, "AGO": 167.22, "ATG": 611.11, "ARG": 358.95, "ARM": 244.34, "ABW": 550, "ASEAN": 570.86, "ASIA": 573.11, "AUS": 551.59, "AUT": 102.62, "AZE": 633.07, "BHS": 653.66, "BHR": 902.41, "BGD": 694.63, "BRB": 600, "BLR": 313.62, "BEL": 117.58, "BLZ": 155.56, "BEN": 590, "BTN": 24.19, "BOL": 468.02, "BIH": 637.76, "BWA": 849.42, "BRA": 103.21, "BRN": 892.67, "BGR": 264.21, "BFA": 554.91, "BDI": 230.77, "CPV": 480, "KHM": 497.46, "CMR": 285.71, "CAN": 174.81, "CYM": 642.86, "CAF": 0, "TCD": 615.39, "CHL": 265.52, "CHN": 559.55, "COL": 285.8, "COM": 642.86, "COG": 713.73, "COD": 27.04, "COK": 250, "CRI": 63.01, "CIV": 393.53, "HRV": 174.48, "CUB": 638.98, "CYP": 512.24, "CZE": 413.86, "DNK": 143.3, "DJI": 450, "DMA": 600, "DOM": 566.05, "ECU": 209.7, "EGY": 571.92, "SLV": 103.13, "GNQ": 605.1, "ERI": 590.91, "EST": 341.02, "SWZ": 142.86, "ETH": 23.55, "EU": 213.31, "EUROPE": 284.17, "FLK": 1e3, "FRO": 354.17, "FJI": 278.26, "FIN": 72.25, "FRA": 44.18, "GUF": 204.08, "PYF": 436.62, "G20": 468.99, "G7": 342.59, "GAB": 429.47, "GMB": 666.67, "GEO": 143.06, "DEU": 344.14, "GHA": 452.86, "GRC": 319.76, "GRL": 111.11, "GRD": 666.67, "GLP": 493.9, "GUM": 611.11, "GTM": 272.66, "GIN": 182.72, "GNB": 625, "GUY": 634.33, "HTI": 534.65, "HND": 289.5, "HKG": 681.99, "HUN": 182.82, "ISL": 28.33, "IND": 708.32, "IDN": 682.43, "IRN": 641.94, "IRQ": 689.4, "IRL": 279.7, "ISR": 567.26, "ITA": 287.53, "JAM": 561.25, "JPN": 482.32, "JOR": 539.21, "KAZ": 801.95, "KEN": 88.79, "KIR": 500, "XKX": 958.72, "KWT": 637.24, "KGZ": 162.71, "LAO": 232.12, "LATIN AMERICA AND CARIBBEAN": 255.13, "LVA": 136.22, "LBN": 369.47, "LSO": 20.83, "LBR": 435.9, "LBY": 830.53, "LTU": 139.34, "LUX": 134.62, "MAC": 448.98, "MDG": 477.27, "MWI": 54.65, "MYS": 609.85, "MDV": 611.77, "MLI": 394.5, "MLT": 484.16, "MTQ": 516.78, "MRT": 481.71, "MUS": 633.03, "MEX": 484.83, "MIDDLE EAST": 636.41, "MDA": 631.68, "MNG": 784.01, "MNE": 413.51, "MSR": 1e3, "MAR": 577.65, "MOZ": 127.81, "MMR": 578.82, "NAM": 47.62, "NRU": 750, "NPL": 23.36, "NLD": 253.31, "NCL": 585.76, "NZL": 120.11, "NIC": 288.33, "NER": 687.5, "NGA": 507.85, "NORTH AMERICA": 357.42, "PRK": 344.26, "MKD": 568.97, "NOR": 30.75, "OCEANIA": 493.42, "OECD": 337.48, "OMN": 545.25, "PAK": 398.61, "PSE": 460.78, "PAN": 258.74, "PNG": 513.74, "PRY": 24.86, "PER": 263.27, "POL": 614.98, "PRT": 112.29, "PRI": 664.53, "QAT": 602.83, "REU": 525.22, "ROU": 245.55, "RUS": 449.2, "RWA": 301.89, "KNA": 636.36, "LCA": 650, "SPM": 600, "VCT": 600, "WSM": 400, "STP": 555.56, "SAU": 696.31, "SEN": 535.4, "SRB": 673.16, "SYC": 571.43, "SLE": 47.62, "SGP": 498.74, "SVK": 96.49, "SVN": 227.65, "SLB": 636.36, "SOM": 523.81, "ZAF": 708.88, "KOR": 414.27, "SSD": 610.17, "ESP": 146.15, "LKA": 509.78, "SDN": 214.33, "SUR": 383.18, "SWE": 35.82, "CHE": 36.6, "SYR": 682.27, "TWN": 635.65, "TJK": 112.79, "TZA": 371.59, "THA": 554.5, "PHL": 613.38, "TGO": 478.26, "TON": 571.43, "TTO": 682.11, "TUN": 560.25, "TUR": 469.7, "TKM": 1306.3, "TCA": 653.85, "UGA": 57.39, "UKR": 256.21, "ARE": 492.7, "GBR": 210.89, "USA": 383.55, "URY": 96.7, "UZB": 1121.18, "VUT": 500, "VEN": 180.25, "VNM": 471.16, "VGB": 647.06, "VIR": 641.79, "WORLD": 473.05, "YEM": 586.32, "ZMB": 111, "ZWE": 298.44 };
2
2
  const type = "average";
3
3
  var average_intensities_min_default = { data, type };
4
4
  export {
@@ -23,9 +23,7 @@ function parseByteTraceOptions(options = {}, version = 3, green = false) {
23
23
  if (typeof segmentIntensity === "object") {
24
24
  if (!averageIntensity.data[(_a = segmentIntensity.country) == null ? void 0 : _a.toUpperCase()]) {
25
25
  console.warn(
26
- `"${segmentIntensity.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
27
- See https://developers.thegreenwebfoundation.org/co2js/data/ for more information.
28
- Falling back to global average grid intensity.`
26
+ '"'.concat(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.')
29
27
  );
30
28
  adjustments.gridIntensity[segment] = {
31
29
  value: globalGridIntensity
@@ -46,8 +44,7 @@ Falling back to global average grid intensity.`
46
44
  value: globalGridIntensity
47
45
  };
48
46
  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.`
47
+ "The ".concat(segment, " grid intensity must be a number or an object. You passed in a ").concat(typeof segmentIntensity, ". \nFalling back to global average grid intensity.")
51
48
  );
52
49
  }
53
50
  } else {
@@ -76,15 +73,13 @@ Falling back to global average grid intensity.`
76
73
  } else {
77
74
  adjustments.greenHostingFactor = 0;
78
75
  console.warn(
79
- `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}.
80
- Falling back to default value.`
76
+ "The returnVisitPercentage option must be a number between 0 and 1. You passed in ".concat(options.returnVisitPercentage, ". \nFalling back to default value.")
81
77
  );
82
78
  }
83
79
  } else {
84
80
  adjustments.greenHostingFactor = 0;
85
81
  console.warn(
86
- `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
87
- Falling back to default value.`
82
+ "The returnVisitPercentage option must be a number. You passed in a ".concat(typeof options.returnVisitPercentage, ". \nFalling back to default value.")
88
83
  );
89
84
  }
90
85
  } else if (version === 4) {
@@ -107,22 +102,19 @@ function parseVisitTraceOptions(options = {}, version = 3, green = false) {
107
102
  } else {
108
103
  adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
109
104
  console.warn(
110
- `The dataReloadRatio option must be a number between 0 and 1. You passed in ${options.dataReloadRatio}.
111
- Falling back to default value.`
105
+ "The dataReloadRatio option must be a number between 0 and 1. You passed in ".concat(options.dataReloadRatio, ". \nFalling back to default value.")
112
106
  );
113
107
  }
114
108
  } else {
115
109
  adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
116
110
  console.warn(
117
- `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}.
118
- Falling back to default value.`
111
+ "The dataReloadRatio option must be a number. You passed in a ".concat(typeof options.dataReloadRatio, ". \nFalling back to default value.")
119
112
  );
120
113
  }
121
114
  } else {
122
115
  adjustments.dataReloadRatio = version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;
123
116
  console.warn(
124
- `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}.
125
- Falling back to default value.`
117
+ "The dataReloadRatio option must be a number. You passed in a ".concat(typeof options.dataReloadRatio, ". \nFalling back to default value.")
126
118
  );
127
119
  }
128
120
  if ((options == null ? void 0 : options.firstVisitPercentage) || options.firstVisitPercentage === 0) {
@@ -132,22 +124,19 @@ Falling back to default value.`
132
124
  } else {
133
125
  adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
134
126
  console.warn(
135
- `The firstVisitPercentage option must be a number between 0 and 1. You passed in ${options.firstVisitPercentage}.
136
- Falling back to default value.`
127
+ "The firstVisitPercentage option must be a number between 0 and 1. You passed in ".concat(options.firstVisitPercentage, ". \nFalling back to default value.")
137
128
  );
138
129
  }
139
130
  } else {
140
131
  adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
141
132
  console.warn(
142
- `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}.
143
- Falling back to default value.`
133
+ "The firstVisitPercentage option must be a number. You passed in a ".concat(typeof options.firstVisitPercentage, ". \nFalling back to default value.")
144
134
  );
145
135
  }
146
136
  } else {
147
137
  adjustments.firstVisitPercentage = version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;
148
138
  console.warn(
149
- `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}.
150
- Falling back to default value.`
139
+ "The firstVisitPercentage option must be a number. You passed in a ".concat(typeof options.firstVisitPercentage, ". \nFalling back to default value.")
151
140
  );
152
141
  }
153
142
  if ((options == null ? void 0 : options.returnVisitPercentage) || options.returnVisitPercentage === 0) {
@@ -157,28 +146,25 @@ Falling back to default value.`
157
146
  } else {
158
147
  adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
159
148
  console.warn(
160
- `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}.
161
- Falling back to default value.`
149
+ "The returnVisitPercentage option must be a number between 0 and 1. You passed in ".concat(options.returnVisitPercentage, ". \nFalling back to default value.")
162
150
  );
163
151
  }
164
152
  } else {
165
153
  adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
166
154
  console.warn(
167
- `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
168
- Falling back to default value.`
155
+ "The returnVisitPercentage option must be a number. You passed in a ".concat(typeof options.returnVisitPercentage, ". \nFalling back to default value.")
169
156
  );
170
157
  }
171
158
  } else {
172
159
  adjustments.returnVisitPercentage = version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;
173
160
  console.warn(
174
- `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}.
175
- Falling back to default value.`
161
+ "The returnVisitPercentage option must be a number. You passed in a ".concat(typeof options.returnVisitPercentage, ". \nFalling back to default value.")
176
162
  );
177
163
  }
178
164
  return adjustments;
179
165
  }
180
166
  function getApiRequestHeaders(comment = "") {
181
- return { "User-Agent": `co2js/${"0.16.6"} ${comment}` };
167
+ return { "User-Agent": "co2js/".concat("0.16.8", " ").concat(comment) };
182
168
  }
183
169
  function outputRating(co2e, swdmVersion) {
184
170
  let {
@@ -13,7 +13,7 @@ function check(domain, optionsOrAgentId) {
13
13
  }
14
14
  async function checkAgainstAPI(domain, options = {}) {
15
15
  const req = await fetch(
16
- `https://api.thegreenwebfoundation.org/greencheck/${domain}`,
16
+ "https://api.thegreenwebfoundation.org/greencheck/".concat(domain),
17
17
  {
18
18
  headers: getApiRequestHeaders(options.userAgentIdentifier)
19
19
  }
@@ -28,7 +28,7 @@ async function checkDomainsAgainstAPI(domains, options = {}) {
28
28
  try {
29
29
  const apiPath = "https://api.thegreenwebfoundation.org/v2/greencheckmulti";
30
30
  const domainsString = JSON.stringify(domains);
31
- const req = await fetch(`${apiPath}/${domainsString}`, {
31
+ const req = await fetch("".concat(apiPath, "/").concat(domainsString), {
32
32
  headers: getApiRequestHeaders(options.userAgentIdentifier)
33
33
  });
34
34
  const allGreenCheckResults = await req.json();