@tgwf/co2 0.13.8 → 0.13.9
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 +5 -0
- package/data/output/average-intensities.js +11 -11
- package/data/output/average-intensities.json +11 -11
- package/dist/cjs/data/average-intensities.min.js +1 -1
- package/dist/cjs/data/average-intensities.min.js.map +2 -2
- package/dist/cjs/sustainable-web-design.js +6 -6
- package/dist/cjs/sustainable-web-design.js.map +2 -2
- package/dist/esm/data/average-intensities.min.js +1 -1
- package/dist/esm/sustainable-web-design.js +6 -6
- package/dist/iife/index.js +15 -15
- package/dist/iife/index.js.map +2 -2
- package/package.json +1 -1
- package/src/data/average-intensities.min.js +1 -1
- package/src/sustainable-web-design.js +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -18,6 +18,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
18
18
|
|
|
19
19
|
# Released
|
|
20
20
|
|
|
21
|
+
## [0.13.8] - 2023-10-09
|
|
22
|
+
|
|
23
|
+
- Fix: Properly use value of 0 for system segments and variables in the perByteTrace and perVisitTrace functions.
|
|
24
|
+
- Automated monthly update of annual average grid intensity data.
|
|
25
|
+
|
|
21
26
|
## [0.13.7] - 2023-09-13
|
|
22
27
|
|
|
23
28
|
- Automated monthly update of annual average grid intensity data.
|
|
@@ -63,8 +63,8 @@ const data = {
|
|
|
63
63
|
EST: 464.03,
|
|
64
64
|
SWZ: 189.19,
|
|
65
65
|
ETH: 25.19,
|
|
66
|
-
EU:
|
|
67
|
-
EUROPE:
|
|
66
|
+
EU: 276.5,
|
|
67
|
+
EUROPE: 297.16,
|
|
68
68
|
FLK: 500,
|
|
69
69
|
FRO: 428.57,
|
|
70
70
|
FJI: 289.47,
|
|
@@ -72,12 +72,12 @@ const data = {
|
|
|
72
72
|
FRA: 84.82,
|
|
73
73
|
GUF: 254.72,
|
|
74
74
|
PYF: 471.43,
|
|
75
|
-
G20: 442.
|
|
76
|
-
G7:
|
|
75
|
+
G20: 442.62,
|
|
76
|
+
G7: 344.29,
|
|
77
77
|
GAB: 397.38,
|
|
78
78
|
GMB: 700,
|
|
79
79
|
GEO: 134.83,
|
|
80
|
-
DEU:
|
|
80
|
+
DEU: 385.38,
|
|
81
81
|
GHA: 361.2,
|
|
82
82
|
GRC: 343.82,
|
|
83
83
|
GRL: 133.33,
|
|
@@ -146,12 +146,12 @@ const data = {
|
|
|
146
146
|
NIC: 354.21,
|
|
147
147
|
NER: 622.22,
|
|
148
148
|
NGA: 368.11,
|
|
149
|
-
"NORTH AMERICA": 336.
|
|
149
|
+
"NORTH AMERICA": 336.68,
|
|
150
150
|
PRK: 157.79,
|
|
151
151
|
MKD: 529.33,
|
|
152
152
|
NOR: 28.82,
|
|
153
153
|
OCEANIA: 449.71,
|
|
154
|
-
OECD:
|
|
154
|
+
OECD: 341.2,
|
|
155
155
|
OMN: 488.27,
|
|
156
156
|
PAK: 344.16,
|
|
157
157
|
PSE: 465.12,
|
|
@@ -183,7 +183,7 @@ const data = {
|
|
|
183
183
|
SVN: 237.38,
|
|
184
184
|
SLB: 727.27,
|
|
185
185
|
SOM: 634.15,
|
|
186
|
-
ZAF: 708.
|
|
186
|
+
ZAF: 708.21,
|
|
187
187
|
KOR: 437.6,
|
|
188
188
|
SSD: 684.21,
|
|
189
189
|
ESP: 217.37,
|
|
@@ -206,10 +206,10 @@ const data = {
|
|
|
206
206
|
TKM: 490.19,
|
|
207
207
|
TCA: 703.7,
|
|
208
208
|
UGA: 52.27,
|
|
209
|
-
UKR:
|
|
209
|
+
UKR: 230.89,
|
|
210
210
|
ARE: 407.98,
|
|
211
211
|
GBR: 261.24,
|
|
212
|
-
USA:
|
|
212
|
+
USA: 368.1,
|
|
213
213
|
URY: 114.89,
|
|
214
214
|
UZB: 505.41,
|
|
215
215
|
VUT: 571.43,
|
|
@@ -217,7 +217,7 @@ const data = {
|
|
|
217
217
|
VNM: 386.49,
|
|
218
218
|
VGB: 714.29,
|
|
219
219
|
VIR: 685.71,
|
|
220
|
-
WORLD: 437.
|
|
220
|
+
WORLD: 437.67,
|
|
221
221
|
YEM: 543.91,
|
|
222
222
|
ZMB: 84.7,
|
|
223
223
|
ZWE: 392.28,
|
|
@@ -387,13 +387,13 @@
|
|
|
387
387
|
"country_code": "",
|
|
388
388
|
"country_or_region": "EU",
|
|
389
389
|
"year": 2022,
|
|
390
|
-
"emissions_intensity_gco2_per_kwh":
|
|
390
|
+
"emissions_intensity_gco2_per_kwh": 276.5
|
|
391
391
|
},
|
|
392
392
|
"Europe": {
|
|
393
393
|
"country_code": "",
|
|
394
394
|
"country_or_region": "Europe",
|
|
395
395
|
"year": 2022,
|
|
396
|
-
"emissions_intensity_gco2_per_kwh":
|
|
396
|
+
"emissions_intensity_gco2_per_kwh": 297.16
|
|
397
397
|
},
|
|
398
398
|
"FLK": {
|
|
399
399
|
"country_code": "FLK",
|
|
@@ -441,13 +441,13 @@
|
|
|
441
441
|
"country_code": "",
|
|
442
442
|
"country_or_region": "G20",
|
|
443
443
|
"year": 2022,
|
|
444
|
-
"emissions_intensity_gco2_per_kwh": 442.
|
|
444
|
+
"emissions_intensity_gco2_per_kwh": 442.62
|
|
445
445
|
},
|
|
446
446
|
"G7": {
|
|
447
447
|
"country_code": "",
|
|
448
448
|
"country_or_region": "G7",
|
|
449
449
|
"year": 2022,
|
|
450
|
-
"emissions_intensity_gco2_per_kwh":
|
|
450
|
+
"emissions_intensity_gco2_per_kwh": 344.29
|
|
451
451
|
},
|
|
452
452
|
"GAB": {
|
|
453
453
|
"country_code": "GAB",
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
"country_code": "DEU",
|
|
472
472
|
"country_or_region": "Germany",
|
|
473
473
|
"year": 2022,
|
|
474
|
-
"emissions_intensity_gco2_per_kwh":
|
|
474
|
+
"emissions_intensity_gco2_per_kwh": 385.38
|
|
475
475
|
},
|
|
476
476
|
"GHA": {
|
|
477
477
|
"country_code": "GHA",
|
|
@@ -885,7 +885,7 @@
|
|
|
885
885
|
"country_code": "",
|
|
886
886
|
"country_or_region": "North America",
|
|
887
887
|
"year": 2022,
|
|
888
|
-
"emissions_intensity_gco2_per_kwh": 336.
|
|
888
|
+
"emissions_intensity_gco2_per_kwh": 336.68
|
|
889
889
|
},
|
|
890
890
|
"PRK": {
|
|
891
891
|
"country_code": "PRK",
|
|
@@ -915,7 +915,7 @@
|
|
|
915
915
|
"country_code": "",
|
|
916
916
|
"country_or_region": "OECD",
|
|
917
917
|
"year": 2022,
|
|
918
|
-
"emissions_intensity_gco2_per_kwh":
|
|
918
|
+
"emissions_intensity_gco2_per_kwh": 341.2
|
|
919
919
|
},
|
|
920
920
|
"OMN": {
|
|
921
921
|
"country_code": "OMN",
|
|
@@ -1107,7 +1107,7 @@
|
|
|
1107
1107
|
"country_code": "ZAF",
|
|
1108
1108
|
"country_or_region": "South Africa",
|
|
1109
1109
|
"year": 2022,
|
|
1110
|
-
"emissions_intensity_gco2_per_kwh": 708.
|
|
1110
|
+
"emissions_intensity_gco2_per_kwh": 708.21
|
|
1111
1111
|
},
|
|
1112
1112
|
"KOR": {
|
|
1113
1113
|
"country_code": "KOR",
|
|
@@ -1245,7 +1245,7 @@
|
|
|
1245
1245
|
"country_code": "UKR",
|
|
1246
1246
|
"country_or_region": "Ukraine",
|
|
1247
1247
|
"year": 2022,
|
|
1248
|
-
"emissions_intensity_gco2_per_kwh":
|
|
1248
|
+
"emissions_intensity_gco2_per_kwh": 230.89
|
|
1249
1249
|
},
|
|
1250
1250
|
"ARE": {
|
|
1251
1251
|
"country_code": "ARE",
|
|
@@ -1263,7 +1263,7 @@
|
|
|
1263
1263
|
"country_code": "USA",
|
|
1264
1264
|
"country_or_region": "United States",
|
|
1265
1265
|
"year": 2022,
|
|
1266
|
-
"emissions_intensity_gco2_per_kwh":
|
|
1266
|
+
"emissions_intensity_gco2_per_kwh": 368.1
|
|
1267
1267
|
},
|
|
1268
1268
|
"URY": {
|
|
1269
1269
|
"country_code": "URY",
|
|
@@ -1311,7 +1311,7 @@
|
|
|
1311
1311
|
"country_code": "",
|
|
1312
1312
|
"country_or_region": "World",
|
|
1313
1313
|
"year": 2022,
|
|
1314
|
-
"emissions_intensity_gco2_per_kwh": 437.
|
|
1314
|
+
"emissions_intensity_gco2_per_kwh": 437.67
|
|
1315
1315
|
},
|
|
1316
1316
|
"YEM": {
|
|
1317
1317
|
"country_code": "YEM",
|
|
@@ -22,7 +22,7 @@ __export(average_intensities_min_exports, {
|
|
|
22
22
|
type: () => type
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(average_intensities_min_exports);
|
|
25
|
-
const data = { "AFG": 120.48, "AFRICA": 484.16, "ALB": 23.44, "DZA": 498.9, "ASM": 687.5, "AGO": 195.98, "ATG": 657.14, "ARG": 344.31, "ARM": 222.68, "ABW": 591.4, "ASEAN": 508.06, "ASIA": 535.23, "AUS": 501.7, "AUT": 157.52, "AZE": 532.9, "BHS": 698.11, "BHR": 494.02, "BGD": 577.03, "BRB": 644.86, "BLR": 415.64, "BEL": 165.36, "BLZ": 484.38, "BEN": 666.67, "BTN": 24.44, "BOL": 322.09, "BIH": 516.01, "BWA": 794.52, "BRA": 102.09, "BRN": 658.85, "BGR": 399.57, "BFA": 611.43, "BDI": 250, "CPV": 600, "KHM": 400.46, "CMR": 278.26, "CAN": 125.84, "CYM": 684.93, "CAF": 0, "TCD": 677.42, "CHL": 332.61, "CHN": 533.98, "COL": 168.95, "COM": 714.29, "COG": 395.52, "COD": 25.36, "COK": 400, "CRI": 37.21, "CIV": 410.75, "HRV": 246.46, "CUB": 602.23, "CYP": 589.35, "CZE": 415.35, "DNK": 180.71, "DJI": 666.67, "DMA": 529.41, "DOM": 549.8, "ECU": 188.71, "EGY": 469.63, "SLV": 194.23, "GNQ": 492.96, "ERI": 688.89, "EST": 464.03, "SWZ": 189.19, "ETH": 25.19, "EU":
|
|
25
|
+
const data = { "AFG": 120.48, "AFRICA": 484.16, "ALB": 23.44, "DZA": 498.9, "ASM": 687.5, "AGO": 195.98, "ATG": 657.14, "ARG": 344.31, "ARM": 222.68, "ABW": 591.4, "ASEAN": 508.06, "ASIA": 535.23, "AUS": 501.7, "AUT": 157.52, "AZE": 532.9, "BHS": 698.11, "BHR": 494.02, "BGD": 577.03, "BRB": 644.86, "BLR": 415.64, "BEL": 165.36, "BLZ": 484.38, "BEN": 666.67, "BTN": 24.44, "BOL": 322.09, "BIH": 516.01, "BWA": 794.52, "BRA": 102.09, "BRN": 658.85, "BGR": 399.57, "BFA": 611.43, "BDI": 250, "CPV": 600, "KHM": 400.46, "CMR": 278.26, "CAN": 125.84, "CYM": 684.93, "CAF": 0, "TCD": 677.42, "CHL": 332.61, "CHN": 533.98, "COL": 168.95, "COM": 714.29, "COG": 395.52, "COD": 25.36, "COK": 400, "CRI": 37.21, "CIV": 410.75, "HRV": 246.46, "CUB": 602.23, "CYP": 589.35, "CZE": 415.35, "DNK": 180.71, "DJI": 666.67, "DMA": 529.41, "DOM": 549.8, "ECU": 188.71, "EGY": 469.63, "SLV": 194.23, "GNQ": 492.96, "ERI": 688.89, "EST": 464.03, "SWZ": 189.19, "ETH": 25.19, "EU": 276.5, "EUROPE": 297.16, "FLK": 500, "FRO": 428.57, "FJI": 289.47, "FIN": 130.98, "FRA": 84.82, "GUF": 254.72, "PYF": 471.43, "G20": 442.62, "G7": 344.29, "GAB": 397.38, "GMB": 700, "GEO": 134.83, "DEU": 385.38, "GHA": 361.2, "GRC": 343.82, "GRL": 133.33, "GRD": 714.29, "GLP": 623.53, "GUM": 670.33, "GTM": 291.55, "GIN": 208.63, "GNB": 750, "GUY": 642.28, "HTI": 606.06, "HND": 373.96, "HKG": 683.97, "HUN": 222.97, "ISL": 28.56, "IND": 633.4, "IDN": 619.02, "IRN": 487.86, "IRQ": 498.87, "IRL": 346.33, "ISR": 548.03, "ITA": 371.69, "JAM": 537.93, "JPN": 494.86, "JOR": 399.91, "KAZ": 635.57, "KEN": 100.57, "KIR": 666.67, "XKX": 768.73, "KWT": 551.74, "KGZ": 104.43, "LAO": 242.18, "LATIN AMERICA AND CARIBBEAN": 238.68, "LVA": 181.82, "LBN": 605.74, "LSO": 20, "LBR": 304.35, "LBY": 550.42, "LTU": 194.25, "LUX": 168.14, "MAC": 491.53, "MDG": 483.25, "MWI": 133.8, "MYS": 543.87, "MDV": 651.52, "MLI": 463.13, "MLT": 495, "MTQ": 698.63, "MRT": 526.6, "MUS": 611.11, "MEX": 423.81, "MIDDLE EAST": 516.02, "MDA": 677.18, "MNG": 749.66, "MNE": 399.38, "MSR": 1e3, "MAR": 610.41, "MOZ": 126.63, "MMR": 344.37, "NAM": 63.69, "NRU": 750, "NPL": 24.51, "NLD": 355.78, "NCL": 610.12, "NZL": 97.73, "NIC": 354.21, "NER": 622.22, "NGA": 368.11, "NORTH AMERICA": 336.68, "PRK": 157.79, "MKD": 529.33, "NOR": 28.82, "OCEANIA": 449.71, "OECD": 341.2, "OMN": 488.27, "PAK": 344.16, "PSE": 465.12, "PAN": 186.61, "PNG": 526.75, "PRY": 25.49, "PER": 256.51, "POL": 633.1, "PRT": 234.03, "PRI": 681.47, "QAT": 489.88, "REU": 519.03, "ROU": 264.12, "RUS": 363.68, "RWA": 294.12, "KNA": 681.82, "LCA": 685.71, "SPM": 800, "VCT": 500, "WSM": 470.59, "STP": 600, "SAU": 557.78, "SEN": 523.13, "SRB": 569.38, "SYC": 615.39, "SLE": 47.62, "SGP": 488.78, "SVK": 140.67, "SVN": 237.38, "SLB": 727.27, "SOM": 634.15, "ZAF": 708.21, "KOR": 437.6, "SSD": 684.21, "ESP": 217.37, "LKA": 463, "SDN": 264.01, "SUR": 356.44, "SWE": 45.08, "CHE": 45.62, "SYR": 541.17, "TWN": 560.98, "TJK": 83.63, "TZA": 366.75, "THA": 501.57, "PHL": 582.84, "TGO": 460.32, "TON": 625, "TTO": 491.41, "TUN": 469.43, "TUR": 413.63, "TKM": 490.19, "TCA": 703.7, "UGA": 52.27, "UKR": 230.89, "ARE": 407.98, "GBR": 261.24, "USA": 368.1, "URY": 114.89, "UZB": 505.41, "VUT": 571.43, "VEN": 212.48, "VNM": 386.49, "VGB": 714.29, "VIR": 685.71, "WORLD": 437.67, "YEM": 543.91, "ZMB": 84.7, "ZWE": 392.28 };
|
|
26
26
|
const type = "average";
|
|
27
27
|
var average_intensities_min_default = { data, type };
|
|
28
28
|
//# sourceMappingURL=average-intensities.min.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/data/average-intensities.min.js"],
|
|
4
|
-
"sourcesContent": ["const data = {\"AFG\":120.48,\"AFRICA\":484.16,\"ALB\":23.44,\"DZA\":498.9,\"ASM\":687.5,\"AGO\":195.98,\"ATG\":657.14,\"ARG\":344.31,\"ARM\":222.68,\"ABW\":591.4,\"ASEAN\":508.06,\"ASIA\":535.23,\"AUS\":501.7,\"AUT\":157.52,\"AZE\":532.9,\"BHS\":698.11,\"BHR\":494.02,\"BGD\":577.03,\"BRB\":644.86,\"BLR\":415.64,\"BEL\":165.36,\"BLZ\":484.38,\"BEN\":666.67,\"BTN\":24.44,\"BOL\":322.09,\"BIH\":516.01,\"BWA\":794.52,\"BRA\":102.09,\"BRN\":658.85,\"BGR\":399.57,\"BFA\":611.43,\"BDI\":250,\"CPV\":600,\"KHM\":400.46,\"CMR\":278.26,\"CAN\":125.84,\"CYM\":684.93,\"CAF\":0,\"TCD\":677.42,\"CHL\":332.61,\"CHN\":533.98,\"COL\":168.95,\"COM\":714.29,\"COG\":395.52,\"COD\":25.36,\"COK\":400,\"CRI\":37.21,\"CIV\":410.75,\"HRV\":246.46,\"CUB\":602.23,\"CYP\":589.35,\"CZE\":415.35,\"DNK\":180.71,\"DJI\":666.67,\"DMA\":529.41,\"DOM\":549.8,\"ECU\":188.71,\"EGY\":469.63,\"SLV\":194.23,\"GNQ\":492.96,\"ERI\":688.89,\"EST\":464.03,\"SWZ\":189.19,\"ETH\":25.19,\"EU\":
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,OAAO,EAAC,OAAM,QAAO,UAAS,QAAO,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,SAAQ,QAAO,QAAO,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,GAAE,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,KAAI,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,MAAK,
|
|
4
|
+
"sourcesContent": ["const data = {\"AFG\":120.48,\"AFRICA\":484.16,\"ALB\":23.44,\"DZA\":498.9,\"ASM\":687.5,\"AGO\":195.98,\"ATG\":657.14,\"ARG\":344.31,\"ARM\":222.68,\"ABW\":591.4,\"ASEAN\":508.06,\"ASIA\":535.23,\"AUS\":501.7,\"AUT\":157.52,\"AZE\":532.9,\"BHS\":698.11,\"BHR\":494.02,\"BGD\":577.03,\"BRB\":644.86,\"BLR\":415.64,\"BEL\":165.36,\"BLZ\":484.38,\"BEN\":666.67,\"BTN\":24.44,\"BOL\":322.09,\"BIH\":516.01,\"BWA\":794.52,\"BRA\":102.09,\"BRN\":658.85,\"BGR\":399.57,\"BFA\":611.43,\"BDI\":250,\"CPV\":600,\"KHM\":400.46,\"CMR\":278.26,\"CAN\":125.84,\"CYM\":684.93,\"CAF\":0,\"TCD\":677.42,\"CHL\":332.61,\"CHN\":533.98,\"COL\":168.95,\"COM\":714.29,\"COG\":395.52,\"COD\":25.36,\"COK\":400,\"CRI\":37.21,\"CIV\":410.75,\"HRV\":246.46,\"CUB\":602.23,\"CYP\":589.35,\"CZE\":415.35,\"DNK\":180.71,\"DJI\":666.67,\"DMA\":529.41,\"DOM\":549.8,\"ECU\":188.71,\"EGY\":469.63,\"SLV\":194.23,\"GNQ\":492.96,\"ERI\":688.89,\"EST\":464.03,\"SWZ\":189.19,\"ETH\":25.19,\"EU\":276.5,\"EUROPE\":297.16,\"FLK\":500,\"FRO\":428.57,\"FJI\":289.47,\"FIN\":130.98,\"FRA\":84.82,\"GUF\":254.72,\"PYF\":471.43,\"G20\":442.62,\"G7\":344.29,\"GAB\":397.38,\"GMB\":700,\"GEO\":134.83,\"DEU\":385.38,\"GHA\":361.2,\"GRC\":343.82,\"GRL\":133.33,\"GRD\":714.29,\"GLP\":623.53,\"GUM\":670.33,\"GTM\":291.55,\"GIN\":208.63,\"GNB\":750,\"GUY\":642.28,\"HTI\":606.06,\"HND\":373.96,\"HKG\":683.97,\"HUN\":222.97,\"ISL\":28.56,\"IND\":633.4,\"IDN\":619.02,\"IRN\":487.86,\"IRQ\":498.87,\"IRL\":346.33,\"ISR\":548.03,\"ITA\":371.69,\"JAM\":537.93,\"JPN\":494.86,\"JOR\":399.91,\"KAZ\":635.57,\"KEN\":100.57,\"KIR\":666.67,\"XKX\":768.73,\"KWT\":551.74,\"KGZ\":104.43,\"LAO\":242.18,\"LATIN AMERICA AND CARIBBEAN\":238.68,\"LVA\":181.82,\"LBN\":605.74,\"LSO\":20,\"LBR\":304.35,\"LBY\":550.42,\"LTU\":194.25,\"LUX\":168.14,\"MAC\":491.53,\"MDG\":483.25,\"MWI\":133.8,\"MYS\":543.87,\"MDV\":651.52,\"MLI\":463.13,\"MLT\":495,\"MTQ\":698.63,\"MRT\":526.6,\"MUS\":611.11,\"MEX\":423.81,\"MIDDLE EAST\":516.02,\"MDA\":677.18,\"MNG\":749.66,\"MNE\":399.38,\"MSR\":1000,\"MAR\":610.41,\"MOZ\":126.63,\"MMR\":344.37,\"NAM\":63.69,\"NRU\":750,\"NPL\":24.51,\"NLD\":355.78,\"NCL\":610.12,\"NZL\":97.73,\"NIC\":354.21,\"NER\":622.22,\"NGA\":368.11,\"NORTH AMERICA\":336.68,\"PRK\":157.79,\"MKD\":529.33,\"NOR\":28.82,\"OCEANIA\":449.71,\"OECD\":341.2,\"OMN\":488.27,\"PAK\":344.16,\"PSE\":465.12,\"PAN\":186.61,\"PNG\":526.75,\"PRY\":25.49,\"PER\":256.51,\"POL\":633.1,\"PRT\":234.03,\"PRI\":681.47,\"QAT\":489.88,\"REU\":519.03,\"ROU\":264.12,\"RUS\":363.68,\"RWA\":294.12,\"KNA\":681.82,\"LCA\":685.71,\"SPM\":800,\"VCT\":500,\"WSM\":470.59,\"STP\":600,\"SAU\":557.78,\"SEN\":523.13,\"SRB\":569.38,\"SYC\":615.39,\"SLE\":47.62,\"SGP\":488.78,\"SVK\":140.67,\"SVN\":237.38,\"SLB\":727.27,\"SOM\":634.15,\"ZAF\":708.21,\"KOR\":437.6,\"SSD\":684.21,\"ESP\":217.37,\"LKA\":463,\"SDN\":264.01,\"SUR\":356.44,\"SWE\":45.08,\"CHE\":45.62,\"SYR\":541.17,\"TWN\":560.98,\"TJK\":83.63,\"TZA\":366.75,\"THA\":501.57,\"PHL\":582.84,\"TGO\":460.32,\"TON\":625,\"TTO\":491.41,\"TUN\":469.43,\"TUR\":413.63,\"TKM\":490.19,\"TCA\":703.7,\"UGA\":52.27,\"UKR\":230.89,\"ARE\":407.98,\"GBR\":261.24,\"USA\":368.1,\"URY\":114.89,\"UZB\":505.41,\"VUT\":571.43,\"VEN\":212.48,\"VNM\":386.49,\"VGB\":714.29,\"VIR\":685.71,\"WORLD\":437.67,\"YEM\":543.91,\"ZMB\":84.7,\"ZWE\":392.28}; const type = \"average\"; export { data, type }; export default { data, type };"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,OAAO,EAAC,OAAM,QAAO,UAAS,QAAO,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,SAAQ,QAAO,QAAO,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,GAAE,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,KAAI,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,MAAK,OAAM,UAAS,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,MAAK,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,+BAA8B,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,IAAG,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,eAAc,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAK,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,KAAI,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,iBAAgB,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,WAAU,QAAO,QAAO,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,KAAI,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,KAAI,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,OAAM,QAAO,SAAQ,QAAO,OAAM,QAAO,OAAM,MAAK,OAAM,OAAM;AAAG,MAAM,OAAO;AAAkC,IAAO,kCAAQ,EAAE,MAAM,KAAK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -45,13 +45,13 @@ class SustainableWebDesign {
|
|
|
45
45
|
let globalEmissions = import_constants.GLOBAL_GRID_INTENSITY;
|
|
46
46
|
if (options == null ? void 0 : options.gridIntensity) {
|
|
47
47
|
const { device, network, dataCenter } = options.gridIntensity;
|
|
48
|
-
if (device == null ? void 0 : device.value) {
|
|
48
|
+
if ((device == null ? void 0 : device.value) || (device == null ? void 0 : device.value) === 0) {
|
|
49
49
|
deviceCarbonIntensity = device.value;
|
|
50
50
|
}
|
|
51
|
-
if (network == null ? void 0 : network.value) {
|
|
51
|
+
if ((network == null ? void 0 : network.value) || (network == null ? void 0 : network.value) === 0) {
|
|
52
52
|
networkCarbonIntensity = network.value;
|
|
53
53
|
}
|
|
54
|
-
if (dataCenter == null ? void 0 : dataCenter.value) {
|
|
54
|
+
if ((dataCenter == null ? void 0 : dataCenter.value) || (dataCenter == null ? void 0 : dataCenter.value) === 0) {
|
|
55
55
|
dataCenterCarbonIntensity = dataCenter.value;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
@@ -107,13 +107,13 @@ class SustainableWebDesign {
|
|
|
107
107
|
return energyValues.reduce((prevValue, currentValue) => prevValue + currentValue);
|
|
108
108
|
}
|
|
109
109
|
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) {
|
|
110
|
-
if (options.dataReloadRatio) {
|
|
110
|
+
if (options.dataReloadRatio || options.dataReloadRatio === 0) {
|
|
111
111
|
dataReloadRatio = options.dataReloadRatio;
|
|
112
112
|
}
|
|
113
|
-
if (options.firstVisitPercentage) {
|
|
113
|
+
if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {
|
|
114
114
|
firstView = options.firstVisitPercentage;
|
|
115
115
|
}
|
|
116
|
-
if (options.returnVisitPercentage) {
|
|
116
|
+
if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {
|
|
117
117
|
returnView = options.returnVisitPercentage;
|
|
118
118
|
}
|
|
119
119
|
const energyBycomponent = this.energyPerByteByComponent(bytes);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/sustainable-web-design.js"],
|
|
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 } from \"./helpers/index.js\";\n\nclass SustainableWebDesign {\n constructor(options) {\n this.options = options;\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) {\n deviceCarbonIntensity = device.value;\n }\n if (network?.value) {\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) {\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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) {\n dataReloadRatio = options.dataReloadRatio;\n }\n\n if (options.firstVisitPercentage) {\n firstView = options.firstVisitPercentage;\n }\n\n if (options.returnVisitPercentage) {\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\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,uBAYO;AACP,qBAA6B;AAE7B,MAAM,qBAAqB;AAAA,EACzB,YAAY,SAAS;AACnB,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,eAAe,QAAQ;AAEhD,UAAI,
|
|
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 } from \"./helpers/index.js\";\n\nclass SustainableWebDesign {\n constructor(options) {\n this.options = options;\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const data = { "AFG": 120.48, "AFRICA": 484.16, "ALB": 23.44, "DZA": 498.9, "ASM": 687.5, "AGO": 195.98, "ATG": 657.14, "ARG": 344.31, "ARM": 222.68, "ABW": 591.4, "ASEAN": 508.06, "ASIA": 535.23, "AUS": 501.7, "AUT": 157.52, "AZE": 532.9, "BHS": 698.11, "BHR": 494.02, "BGD": 577.03, "BRB": 644.86, "BLR": 415.64, "BEL": 165.36, "BLZ": 484.38, "BEN": 666.67, "BTN": 24.44, "BOL": 322.09, "BIH": 516.01, "BWA": 794.52, "BRA": 102.09, "BRN": 658.85, "BGR": 399.57, "BFA": 611.43, "BDI": 250, "CPV": 600, "KHM": 400.46, "CMR": 278.26, "CAN": 125.84, "CYM": 684.93, "CAF": 0, "TCD": 677.42, "CHL": 332.61, "CHN": 533.98, "COL": 168.95, "COM": 714.29, "COG": 395.52, "COD": 25.36, "COK": 400, "CRI": 37.21, "CIV": 410.75, "HRV": 246.46, "CUB": 602.23, "CYP": 589.35, "CZE": 415.35, "DNK": 180.71, "DJI": 666.67, "DMA": 529.41, "DOM": 549.8, "ECU": 188.71, "EGY": 469.63, "SLV": 194.23, "GNQ": 492.96, "ERI": 688.89, "EST": 464.03, "SWZ": 189.19, "ETH": 25.19, "EU":
|
|
1
|
+
const data = { "AFG": 120.48, "AFRICA": 484.16, "ALB": 23.44, "DZA": 498.9, "ASM": 687.5, "AGO": 195.98, "ATG": 657.14, "ARG": 344.31, "ARM": 222.68, "ABW": 591.4, "ASEAN": 508.06, "ASIA": 535.23, "AUS": 501.7, "AUT": 157.52, "AZE": 532.9, "BHS": 698.11, "BHR": 494.02, "BGD": 577.03, "BRB": 644.86, "BLR": 415.64, "BEL": 165.36, "BLZ": 484.38, "BEN": 666.67, "BTN": 24.44, "BOL": 322.09, "BIH": 516.01, "BWA": 794.52, "BRA": 102.09, "BRN": 658.85, "BGR": 399.57, "BFA": 611.43, "BDI": 250, "CPV": 600, "KHM": 400.46, "CMR": 278.26, "CAN": 125.84, "CYM": 684.93, "CAF": 0, "TCD": 677.42, "CHL": 332.61, "CHN": 533.98, "COL": 168.95, "COM": 714.29, "COG": 395.52, "COD": 25.36, "COK": 400, "CRI": 37.21, "CIV": 410.75, "HRV": 246.46, "CUB": 602.23, "CYP": 589.35, "CZE": 415.35, "DNK": 180.71, "DJI": 666.67, "DMA": 529.41, "DOM": 549.8, "ECU": 188.71, "EGY": 469.63, "SLV": 194.23, "GNQ": 492.96, "ERI": 688.89, "EST": 464.03, "SWZ": 189.19, "ETH": 25.19, "EU": 276.5, "EUROPE": 297.16, "FLK": 500, "FRO": 428.57, "FJI": 289.47, "FIN": 130.98, "FRA": 84.82, "GUF": 254.72, "PYF": 471.43, "G20": 442.62, "G7": 344.29, "GAB": 397.38, "GMB": 700, "GEO": 134.83, "DEU": 385.38, "GHA": 361.2, "GRC": 343.82, "GRL": 133.33, "GRD": 714.29, "GLP": 623.53, "GUM": 670.33, "GTM": 291.55, "GIN": 208.63, "GNB": 750, "GUY": 642.28, "HTI": 606.06, "HND": 373.96, "HKG": 683.97, "HUN": 222.97, "ISL": 28.56, "IND": 633.4, "IDN": 619.02, "IRN": 487.86, "IRQ": 498.87, "IRL": 346.33, "ISR": 548.03, "ITA": 371.69, "JAM": 537.93, "JPN": 494.86, "JOR": 399.91, "KAZ": 635.57, "KEN": 100.57, "KIR": 666.67, "XKX": 768.73, "KWT": 551.74, "KGZ": 104.43, "LAO": 242.18, "LATIN AMERICA AND CARIBBEAN": 238.68, "LVA": 181.82, "LBN": 605.74, "LSO": 20, "LBR": 304.35, "LBY": 550.42, "LTU": 194.25, "LUX": 168.14, "MAC": 491.53, "MDG": 483.25, "MWI": 133.8, "MYS": 543.87, "MDV": 651.52, "MLI": 463.13, "MLT": 495, "MTQ": 698.63, "MRT": 526.6, "MUS": 611.11, "MEX": 423.81, "MIDDLE EAST": 516.02, "MDA": 677.18, "MNG": 749.66, "MNE": 399.38, "MSR": 1e3, "MAR": 610.41, "MOZ": 126.63, "MMR": 344.37, "NAM": 63.69, "NRU": 750, "NPL": 24.51, "NLD": 355.78, "NCL": 610.12, "NZL": 97.73, "NIC": 354.21, "NER": 622.22, "NGA": 368.11, "NORTH AMERICA": 336.68, "PRK": 157.79, "MKD": 529.33, "NOR": 28.82, "OCEANIA": 449.71, "OECD": 341.2, "OMN": 488.27, "PAK": 344.16, "PSE": 465.12, "PAN": 186.61, "PNG": 526.75, "PRY": 25.49, "PER": 256.51, "POL": 633.1, "PRT": 234.03, "PRI": 681.47, "QAT": 489.88, "REU": 519.03, "ROU": 264.12, "RUS": 363.68, "RWA": 294.12, "KNA": 681.82, "LCA": 685.71, "SPM": 800, "VCT": 500, "WSM": 470.59, "STP": 600, "SAU": 557.78, "SEN": 523.13, "SRB": 569.38, "SYC": 615.39, "SLE": 47.62, "SGP": 488.78, "SVK": 140.67, "SVN": 237.38, "SLB": 727.27, "SOM": 634.15, "ZAF": 708.21, "KOR": 437.6, "SSD": 684.21, "ESP": 217.37, "LKA": 463, "SDN": 264.01, "SUR": 356.44, "SWE": 45.08, "CHE": 45.62, "SYR": 541.17, "TWN": 560.98, "TJK": 83.63, "TZA": 366.75, "THA": 501.57, "PHL": 582.84, "TGO": 460.32, "TON": 625, "TTO": 491.41, "TUN": 469.43, "TUR": 413.63, "TKM": 490.19, "TCA": 703.7, "UGA": 52.27, "UKR": 230.89, "ARE": 407.98, "GBR": 261.24, "USA": 368.1, "URY": 114.89, "UZB": 505.41, "VUT": 571.43, "VEN": 212.48, "VNM": 386.49, "VGB": 714.29, "VIR": 685.71, "WORLD": 437.67, "YEM": 543.91, "ZMB": 84.7, "ZWE": 392.28 };
|
|
2
2
|
const type = "average";
|
|
3
3
|
var average_intensities_min_default = { data, type };
|
|
4
4
|
export {
|
|
@@ -53,13 +53,13 @@ class SustainableWebDesign {
|
|
|
53
53
|
let globalEmissions = GLOBAL_GRID_INTENSITY;
|
|
54
54
|
if (options == null ? void 0 : options.gridIntensity) {
|
|
55
55
|
const { device, network, dataCenter } = options.gridIntensity;
|
|
56
|
-
if (device == null ? void 0 : device.value) {
|
|
56
|
+
if ((device == null ? void 0 : device.value) || (device == null ? void 0 : device.value) === 0) {
|
|
57
57
|
deviceCarbonIntensity = device.value;
|
|
58
58
|
}
|
|
59
|
-
if (network == null ? void 0 : network.value) {
|
|
59
|
+
if ((network == null ? void 0 : network.value) || (network == null ? void 0 : network.value) === 0) {
|
|
60
60
|
networkCarbonIntensity = network.value;
|
|
61
61
|
}
|
|
62
|
-
if (dataCenter == null ? void 0 : dataCenter.value) {
|
|
62
|
+
if ((dataCenter == null ? void 0 : dataCenter.value) || (dataCenter == null ? void 0 : dataCenter.value) === 0) {
|
|
63
63
|
dataCenterCarbonIntensity = dataCenter.value;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -115,13 +115,13 @@ class SustainableWebDesign {
|
|
|
115
115
|
return energyValues.reduce((prevValue, currentValue) => prevValue + currentValue);
|
|
116
116
|
}
|
|
117
117
|
energyPerVisitByComponent(bytes, options = {}, firstView = FIRST_TIME_VIEWING_PERCENTAGE, returnView = RETURNING_VISITOR_PERCENTAGE, dataReloadRatio = PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD) {
|
|
118
|
-
if (options.dataReloadRatio) {
|
|
118
|
+
if (options.dataReloadRatio || options.dataReloadRatio === 0) {
|
|
119
119
|
dataReloadRatio = options.dataReloadRatio;
|
|
120
120
|
}
|
|
121
|
-
if (options.firstVisitPercentage) {
|
|
121
|
+
if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {
|
|
122
122
|
firstView = options.firstVisitPercentage;
|
|
123
123
|
}
|
|
124
|
-
if (options.returnVisitPercentage) {
|
|
124
|
+
if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {
|
|
125
125
|
returnView = options.returnVisitPercentage;
|
|
126
126
|
}
|
|
127
127
|
const energyBycomponent = this.energyPerByteByComponent(bytes);
|
package/dist/iife/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var co2=(()=>{var
|
|
1
|
+
var co2=(()=>{var A=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var F=(a,e)=>{for(var t in e)A(a,t,{get:e[t],enumerable:!0})},W=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of K(e))!w.call(a,r)&&r!==t&&A(a,r,{get:()=>e[r],enumerable:!(n=U(e,r))||n.enumerable});return a};var Y=a=>W(A({},"__esModule",{value:!0}),a);var ee={};F(ee,{averageIntensity:()=>E,co2:()=>M,default:()=>X,hosting:()=>b,marginalIntensity:()=>V});var T=4883333333333333e-25;var m=class{constructor(e){this.options=e,this.KWH_PER_BYTE_FOR_NETWORK=T}perByte(e,t){if(e<1)return 0;if(t){let r=e*72e-12*0,i=e*T*475;return r+i}let n=72e-12+T;return e*n*519}};var L=m;var C={GIGABYTE:1e9};var H={AFG:120.48,AFRICA:484.16,ALB:23.44,DZA:498.9,ASM:687.5,AGO:195.98,ATG:657.14,ARG:344.31,ARM:222.68,ABW:591.4,ASEAN:508.06,ASIA:535.23,AUS:501.7,AUT:157.52,AZE:532.9,BHS:698.11,BHR:494.02,BGD:577.03,BRB:644.86,BLR:415.64,BEL:165.36,BLZ:484.38,BEN:666.67,BTN:24.44,BOL:322.09,BIH:516.01,BWA:794.52,BRA:102.09,BRN:658.85,BGR:399.57,BFA:611.43,BDI:250,CPV:600,KHM:400.46,CMR:278.26,CAN:125.84,CYM:684.93,CAF:0,TCD:677.42,CHL:332.61,CHN:533.98,COL:168.95,COM:714.29,COG:395.52,COD:25.36,COK:400,CRI:37.21,CIV:410.75,HRV:246.46,CUB:602.23,CYP:589.35,CZE:415.35,DNK:180.71,DJI:666.67,DMA:529.41,DOM:549.8,ECU:188.71,EGY:469.63,SLV:194.23,GNQ:492.96,ERI:688.89,EST:464.03,SWZ:189.19,ETH:25.19,EU:276.5,EUROPE:297.16,FLK:500,FRO:428.57,FJI:289.47,FIN:130.98,FRA:84.82,GUF:254.72,PYF:471.43,G20:442.62,G7:344.29,GAB:397.38,GMB:700,GEO:134.83,DEU:385.38,GHA:361.2,GRC:343.82,GRL:133.33,GRD:714.29,GLP:623.53,GUM:670.33,GTM:291.55,GIN:208.63,GNB:750,GUY:642.28,HTI:606.06,HND:373.96,HKG:683.97,HUN:222.97,ISL:28.56,IND:633.4,IDN:619.02,IRN:487.86,IRQ:498.87,IRL:346.33,ISR:548.03,ITA:371.69,JAM:537.93,JPN:494.86,JOR:399.91,KAZ:635.57,KEN:100.57,KIR:666.67,XKX:768.73,KWT:551.74,KGZ:104.43,LAO:242.18,"LATIN AMERICA AND CARIBBEAN":238.68,LVA:181.82,LBN:605.74,LSO:20,LBR:304.35,LBY:550.42,LTU:194.25,LUX:168.14,MAC:491.53,MDG:483.25,MWI:133.8,MYS:543.87,MDV:651.52,MLI:463.13,MLT:495,MTQ:698.63,MRT:526.6,MUS:611.11,MEX:423.81,"MIDDLE EAST":516.02,MDA:677.18,MNG:749.66,MNE:399.38,MSR:1e3,MAR:610.41,MOZ:126.63,MMR:344.37,NAM:63.69,NRU:750,NPL:24.51,NLD:355.78,NCL:610.12,NZL:97.73,NIC:354.21,NER:622.22,NGA:368.11,"NORTH AMERICA":336.68,PRK:157.79,MKD:529.33,NOR:28.82,OCEANIA:449.71,OECD:341.2,OMN:488.27,PAK:344.16,PSE:465.12,PAN:186.61,PNG:526.75,PRY:25.49,PER:256.51,POL:633.1,PRT:234.03,PRI:681.47,QAT:489.88,REU:519.03,ROU:264.12,RUS:363.68,RWA:294.12,KNA:681.82,LCA:685.71,SPM:800,VCT:500,WSM:470.59,STP:600,SAU:557.78,SEN:523.13,SRB:569.38,SYC:615.39,SLE:47.62,SGP:488.78,SVK:140.67,SVN:237.38,SLB:727.27,SOM:634.15,ZAF:708.21,KOR:437.6,SSD:684.21,ESP:217.37,LKA:463,SDN:264.01,SUR:356.44,SWE:45.08,CHE:45.62,SYR:541.17,TWN:560.98,TJK:83.63,TZA:366.75,THA:501.57,PHL:582.84,TGO:460.32,TON:625,TTO:491.41,TUN:469.43,TUR:413.63,TKM:490.19,TCA:703.7,UGA:52.27,UKR:230.89,ARE:407.98,GBR:261.24,USA:368.1,URY:114.89,UZB:505.41,VUT:571.43,VEN:212.48,VNM:386.49,VGB:714.29,VIR:685.71,WORLD:437.67,YEM:543.91,ZMB:84.7,ZWE:392.28},k="average";var E={data:H,type:k};var D=.81,O=.52,S=.14,p=.15,P=.19,c=E.data.WORLD,f=50,g=.75,y=.25,N=.02;var R=a=>parseFloat(a.toFixed(2));function B(a){if(typeof a!="object")throw new Error("Options must be an object");let e={};if(a?.gridIntensity){e.gridIntensity={};let{device:t,dataCenter:n,network:r}=a.gridIntensity;(t||t===0)&&(typeof t=="object"?(E.data[t.country?.toUpperCase()]||(console.warn(`"${t.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
2
2
|
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information.
|
|
3
|
-
Falling back to global average grid intensity.`),e.gridIntensity.device={value:
|
|
3
|
+
Falling back to global average grid intensity.`),e.gridIntensity.device={value:c}),e.gridIntensity.device={country:t.country,value:parseFloat(E.data[t.country?.toUpperCase()])}):typeof t=="number"?e.gridIntensity.device={value:t}:(e.gridIntensity.device={value:c},console.warn(`The device grid intensity must be a number or an object. You passed in a ${typeof t}.
|
|
4
4
|
Falling back to global average grid intensity.`))),(n||n===0)&&(typeof n=="object"?(E.data[n.country?.toUpperCase()]||(console.warn(`"${n.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
5
5
|
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information.
|
|
6
|
-
Falling back to global average grid intensity.`),e.gridIntensity.dataCenter={value:
|
|
7
|
-
Falling back to global average grid intensity.`))),(
|
|
6
|
+
Falling back to global average grid intensity.`),e.gridIntensity.dataCenter={value:c}),e.gridIntensity.dataCenter={country:n.country,value:parseFloat(E.data[n.country?.toUpperCase()])}):typeof n=="number"?e.gridIntensity.dataCenter={value:n}:(e.gridIntensity.dataCenter={value:c},console.warn(`The data center grid intensity must be a number or an object. You passed in a ${typeof n}.
|
|
7
|
+
Falling back to global average grid intensity.`))),(r||r===0)&&(typeof r=="object"?(E.data[r.country?.toUpperCase()]||(console.warn(`"${r.country}" is not a valid country. Please use a valid 3 digit ISO 3166 country code.
|
|
8
8
|
See https://developers.thegreenwebfoundation.org/co2js/data/ for more information. Falling back to global average grid intensity.
|
|
9
|
-
Falling back to global average grid intensity.`),e.gridIntensity.network={value:
|
|
10
|
-
Falling back to global average grid intensity.`)))}return(
|
|
11
|
-
Falling back to default value.`)):(e.dataReloadRatio=N,console.warn(`The dataReloadRatio option must be a number. You passed in a ${typeof
|
|
12
|
-
Falling back to default value.`))),(
|
|
13
|
-
Falling back to default value.`)):(e.firstVisitPercentage=g,console.warn(`The firstVisitPercentage option must be a number. You passed in a ${typeof
|
|
14
|
-
Falling back to default value.`))),(
|
|
15
|
-
Falling back to default value.`)):(e.returnVisitPercentage=y,console.warn(`The returnVisitPercentage option must be a number. You passed in a ${typeof
|
|
16
|
-
Falling back to default value.`))),e}var
|
|
17
|
-
See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`);this._segment=e?.results==="segment"}perByte(e,
|
|
18
|
-
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perByteTrace(e,
|
|
19
|
-
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perDomain(e,
|
|
9
|
+
Falling back to global average grid intensity.`),e.gridIntensity.network={value:c}),e.gridIntensity.network={country:r.country,value:parseFloat(E.data[r.country?.toUpperCase()])}):typeof r=="number"?e.gridIntensity.network={value:r}:(e.gridIntensity.network={value:c},console.warn(`The network grid intensity must be a number or an object. You passed in a ${typeof r}.
|
|
10
|
+
Falling back to global average grid intensity.`)))}return(a?.dataReloadRatio||a.dataReloadRatio===0)&&(typeof a.dataReloadRatio=="number"?a.dataReloadRatio>=0&&a.dataReloadRatio<=1?e.dataReloadRatio=a.dataReloadRatio:(e.dataReloadRatio=N,console.warn(`The dataReloadRatio option must be a number between 0 and 1. You passed in ${a.dataReloadRatio}.
|
|
11
|
+
Falling back to default value.`)):(e.dataReloadRatio=N,console.warn(`The dataReloadRatio option must be a number. You passed in a ${typeof a.dataReloadRatio}.
|
|
12
|
+
Falling back to default value.`))),(a?.firstVisitPercentage||a.firstVisitPercentage===0)&&(typeof a.firstVisitPercentage=="number"?a.firstVisitPercentage>=0&&a.firstVisitPercentage<=1?e.firstVisitPercentage=a.firstVisitPercentage:(e.firstVisitPercentage=g,console.warn(`The firstVisitPercentage option must be a number between 0 and 1. You passed in ${a.firstVisitPercentage}.
|
|
13
|
+
Falling back to default value.`)):(e.firstVisitPercentage=g,console.warn(`The firstVisitPercentage option must be a number. You passed in a ${typeof a.firstVisitPercentage}.
|
|
14
|
+
Falling back to default value.`))),(a?.returnVisitPercentage||a.returnVisitPercentage===0)&&(typeof a.returnVisitPercentage=="number"?a.returnVisitPercentage>=0&&a.returnVisitPercentage<=1?e.returnVisitPercentage=a.returnVisitPercentage:(e.returnVisitPercentage=y,console.warn(`The returnVisitPercentage option must be a number between 0 and 1. You passed in ${a.returnVisitPercentage}.
|
|
15
|
+
Falling back to default value.`)):(e.returnVisitPercentage=y,console.warn(`The returnVisitPercentage option must be a number. You passed in a ${typeof a.returnVisitPercentage}.
|
|
16
|
+
Falling back to default value.`))),e}var _=class{constructor(e){this.options=e}energyPerByteByComponent(e){let n=e/C.GIGABYTE*D;return{consumerDeviceEnergy:n*O,networkEnergy:n*S,productionEnergy:n*P,dataCenterEnergy:n*p}}co2byComponent(e,t=c,n={}){let r=c,i=c,o=c,d=c;if(n?.gridIntensity){let{device:s,network:l,dataCenter:I}=n.gridIntensity;(s?.value||s?.value===0)&&(r=s.value),(l?.value||l?.value===0)&&(i=l.value),(I?.value||I?.value===0)&&(o=I.value)}t===!0&&(o=f);let u={};for(let[s,l]of Object.entries(e))s.startsWith("dataCenterEnergy")?u[s.replace("Energy","CO2")]=l*o:s.startsWith("consumerDeviceEnergy")?u[s.replace("Energy","CO2")]=l*r:s.startsWith("networkEnergy")?u[s.replace("Energy","CO2")]=l*i:u[s.replace("Energy","CO2")]=l*d;return u}perByte(e,t=!1,n=!1,r={}){e<1&&(e=0);let i=this.energyPerByteByComponent(e,r);if(typeof t!="boolean")throw new Error(`perByte expects a boolean for the carbon intensity value. Received: ${t}`);let o=this.co2byComponent(i,t,r),u=Object.values(o).reduce((s,l)=>s+l);return n?{...o,total:u}:u}perVisit(e,t=!1,n=!1,r={}){let i=this.energyPerVisitByComponent(e,r);if(typeof t!="boolean")throw new Error(`perVisit expects a boolean for the carbon intensity value. Received: ${t}`);let o=this.co2byComponent(i,t,r),u=Object.values(o).reduce((s,l)=>s+l);return n?{...o,total:u}:u}energyPerByte(e){let t=this.energyPerByteByComponent(e);return Object.values(t).reduce((r,i)=>r+i)}energyPerVisitByComponent(e,t={},n=g,r=y,i=N){(t.dataReloadRatio||t.dataReloadRatio===0)&&(i=t.dataReloadRatio),(t.firstVisitPercentage||t.firstVisitPercentage===0)&&(n=t.firstVisitPercentage),(t.returnVisitPercentage||t.returnVisitPercentage===0)&&(r=t.returnVisitPercentage);let o=this.energyPerByteByComponent(e),d={},u=Object.values(o);for(let[s,l]of Object.entries(o))d[`${s} - first`]=l*n,d[`${s} - subsequent`]=l*r*i;return d}energyPerVisit(e){let t=0,n=0,r=Object.entries(this.energyPerVisitByComponent(e));for(let[i,o]of r)i.indexOf("first")>0&&(t+=o);for(let[i,o]of r)i.indexOf("subsequent")>0&&(n+=o);return t+n}emissionsPerVisitInGrams(e,t=c){return R(e*t)}annualEnergyInKwh(e,t=1e3){return e*t*12}annualEmissionsInGrams(e,t=1e3){return e*t*12}annualSegmentEnergy(e){return{consumerDeviceEnergy:R(e*O),networkEnergy:R(e*S),dataCenterEnergy:R(e*p),productionEnergy:R(e*P)}}};var G=_;var h=class{constructor(e){if(this.model=new G,e?.model==="1byte")this.model=new L;else if(e?.model==="swd")this.model=new G;else if(e?.model)throw new Error(`"${e.model}" is not a valid model. Please use "1byte" for the OneByte model, and "swd" for the Sustainable Web Design model.
|
|
17
|
+
See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`);this._segment=e?.results==="segment"}perByte(e,t=!1){return this.model.perByte(e,t,this._segment)}perVisit(e,t=!1){if(this.model?.perVisit)return this.model.perVisit(e,t,this._segment);throw new Error(`The perVisit() method is not supported in the model you are using. Try using perByte() instead.
|
|
18
|
+
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perByteTrace(e,t=!1,n={}){let r={};return n&&(r=B(n)),{co2:this.model.perByte(e,t,this._segment,r),green:t,variables:{description:"Below are the variables used to calculate this CO2 estimate.",bytes:e,gridIntensity:{description:"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.",network:r?.gridIntensity?.network?.value??c,dataCenter:t?f:r?.gridIntensity?.dataCenter?.value??c,production:c,device:r?.gridIntensity?.device?.value??c}}}}perVisitTrace(e,t=!1,n={}){if(this.model?.perVisit){let r={};return n&&(r=B(n)),{co2:this.model.perVisit(e,t,this._segment,r),green:t,variables:{description:"Below are the variables used to calculate this CO2 estimate.",bytes:e,gridIntensity:{description:"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.",network:r?.gridIntensity?.network?.value??c,dataCenter:t?f:r?.gridIntensity?.dataCenter?.value??c,production:c,device:r?.gridIntensity?.device?.value??c},dataReloadRatio:r?.dataReloadRatio??.02,firstVisitPercentage:r?.firstVisitPercentage??.75,returnVisitPercentage:r?.returnVisitPercentage??.25}}}else throw new Error(`The perVisitDetailed() method is not supported in the model you are using. Try using perByte() instead.
|
|
19
|
+
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perDomain(e,t){let n=[];for(let r of Object.keys(e.domains)){let i;t&&t.indexOf(r)>-1?i=this.perByte(e.domains[r].transferSize,!0):i=this.perByte(e.domains[r].transferSize),n.push({domain:r,co2:i,transferSize:e.domains[r].transferSize})}return n.sort((r,i)=>i.co2-r.co2),n}perPage(e,t){let n=this.perDomain(e,t),r=0;for(let i of n)r+=i.co2;return r}perContentType(e,t){let n={};for(let i of e.assets){let o=new URL(i.url).domain,d=i.transferSize,u=this.perByte(d,t&&t.indexOf(o)>-1),s=i.type;n[s]||(n[s]={co2:0,transferSize:0}),n[s].co2+=u,n[s].transferSize+=d}let r=[];for(let i of Object.keys(n))r.push({type:i,co2:n[i].co2,transferSize:n[i].transferSize});return r.sort((i,o)=>o.co2-i.co2),r}dirtiestResources(e,t){let n=[];for(let r of e.assets){let i=new URL(r.url).domain,o=r.transferSize,d=this.perByte(o,t&&t.indexOf(i)>-1);n.push({url:r.url,co2:d,transferSize:o})}return n.sort((r,i)=>i.co2-r.co2),n.slice(0,n.length>10?10:n.length)}perParty(e,t){let n=0,r=0,i=e.firstPartyRegEx;for(let o of Object.keys(e.domains))o.match(i)?n+=this.perByte(e.domains[o].transferSize,t&&t.indexOf(o)>-1):r+=this.perByte(e.domains[o].transferSize,t&&t.indexOf(o)>-1);return{firstParty:n,thirdParty:r}}};var M=h;function j(a){return typeof a=="string"?x(a):Z(a)}async function x(a){return(await(await fetch(`https://api.thegreenwebfoundation.org/greencheck/${a}`)).json()).green}async function Z(a){try{let e="https://api.thegreenwebfoundation.org/v2/greencheckmulti",t=JSON.stringify(a),r=await(await fetch(`${e}/${t}`)).json();return $(r)}catch{return[]}}function $(a){return Object.entries(a).filter(([n,r])=>r.green).map(([n,r])=>r.url)}var v={check:j};function z(a){return v.check(a)}var b={check:z};var J={AFG:"414",ALB:"0",DZA:"528",ASM:"753",AND:"188",AGO:"1476",AIA:"753",ATG:"753",ARG:"478",ARM:"390",ABW:"753",AUS:"808",AUT:"242",AZE:"534","AZORES (PORTUGAL)":"753",BHS:"753",BHR:"726",BGD:"528",BRB:"749",BLR:"400",BEL:"252",BLZ:"403",BEN:"745",BMU:"753",BTN:"0",BOL:"604",BES:"753",BIH:"1197",BWA:"1486",BRA:"284",VGB:"753",BRN:"681",BGR:"911",BFA:"753",BDI:"414",KHM:"1046",CMR:"659",CAN:"372",CYM:"753",CPV:"753",CAF:"188",TCD:"753","CHANNEL ISLANDS (U.K)":"753",CHL:"657",CHN:"899",COL:"410",COM:"753",COD:"0",COG:"659",COK:"753",CRI:"108",CIV:"466",HRV:"294",CUB:"559",CUW:"876",CYP:"751",CZE:"902",DNK:"362",DJI:"753",DMA:"753",DOM:"601",ECU:"560",EGY:"554",SLV:"547",GNQ:"632",ERI:"915",EST:"1057",SWZ:"0",ETH:"0",FLK:"753",FRO:"753",FJI:"640",FIN:"267",FRA:"158",GUF:"423",PYF:"753",GAB:"946",GMB:"753",GEO:"289",DEU:"650",GHA:"495",GIB:"779",GRC:"507",GRL:"264",GRD:"753",GLP:"753",GUM:"753",GTM:"798",GIN:"753",GNB:"753",GUY:"847",HTI:"1048",HND:"662",HUN:"296",ISL:"0",IND:"951",IDN:"783",IRN:"592",IRQ:"1080",IRL:"380",IMN:"436",ISR:"394",ITA:"414",JAM:"711",JPN:"471",JOR:"529",KAZ:"797",KEN:"574",KIR:"753",PRK:"754",KOR:"555",XKX:"1145",KWT:"675",KGZ:"217",LAO:"1069",LVA:"240",LBN:"794",LSO:"0",LBR:"677",LBY:"668",LIE:"151",LTU:"211",LUX:"220",MDG:"876","MADEIRA (PORTUGAL)":"663",MWI:"489",MYS:"551",MDV:"753",MLI:"1076",MLT:"520",MHL:"753",MTQ:"753",MRT:"753",MUS:"700",MYT:"753",MEX:"531",FSM:"753",MDA:"541",MCO:"158",MNG:"1366",MNE:"899",MSR:"753",MAR:"729",MOZ:"234",MMR:"719",NAM:"355",NRU:"753",NPL:"0",NLD:"326",NCL:"779",NZL:"246",NIC:"675",NER:"772",NGA:"526",NIU:"753",MKD:"851",MNP:"753",NOR:"47",OMN:"479",PAK:"592",PLW:"753",PSE:"719",PAN:"477",PNG:"597",PRY:"0",PER:"473",PHL:"672",POL:"828",PRT:"389",PRI:"596",QAT:"503",REU:"772",ROU:"489",RUS:"476",RWA:"712",SHN:"753",KNA:"753",LCA:"753",MAF:"753",SPM:"753",VCT:"753",WSM:"753",SMR:"414",STP:"753",SAU:"592",SEN:"870",SRB:"1086",SYC:"753",SLE:"489",SGP:"379",SXM:"753",SVK:"332",SVN:"620",SLB:"753",SOM:"753",ZAF:"1070",SSD:"890",ESP:"402",LKA:"731",SDN:"736",SUR:"1029",SWE:"68",CHE:"48",SYR:"713",TWN:"484",TJK:"255",TZA:"531",THA:"450",TLS:"753",TGO:"859",TON:"753",TTO:"559",TUN:"468",TUR:"376",TKM:"927",TCA:"753",TUV:"753",UGA:"279",UKR:"768",ARE:"556",GBR:"380",USA:"416",URY:"174",UZB:"612",VUT:"753",VEN:"711",VNM:"560",VIR:"650",YEM:"807",ZMB:"416",ZWE:"1575","MEMO: EU 27":"409"},Q="marginal",q="2021";var V={data:J,type:Q,year:q};var X={co2:M,hosting:b,averageIntensity:E,marginalIntensity:V};return Y(ee);})();
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
package/dist/iife/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.js", "../../src/1byte.js", "../../src/constants/file-size.js", "../../src/data/average-intensities.min.js", "../../src/constants/index.js", "../../src/helpers/index.js", "../../src/sustainable-web-design.js", "../../src/co2.js", "../../src/hosting-api.js", "../../src/hosting.js", "../../src/data/marginal-intensities-2021.min.js"],
|
|
4
|
-
"sourcesContent": ["import co2 from \"./co2.js\";\nimport hosting from \"./hosting.js\";\nimport averageIntensity from \"./data/average-intensities.min.js\";\nimport marginalIntensity from \"./data/marginal-intensities-2021.min.js\";\n\nexport { co2, hosting, averageIntensity, marginalIntensity };\nexport default { co2, hosting, averageIntensity, marginalIntensity };\n", "// Use the 1byte model for now from the Shift Project, and assume a US grid mix figure they use of around 519 g co2 for the time being. It's lower for Europe, and in particular, France, but for v1, we don't include this\nconst CO2_PER_KWH_IN_DC_GREY = 519;\n\n// this figure is from the IEA's 2018 report for a global average:\nconst CO2_PER_KWH_NETWORK_GREY = 475;\n\n// TODO - these figures need to be updated, as the figures for green\n// shouldn't really be zero now we know that carbon intensity figures\n// for renewables still usually include the life cycle emissions\nconst CO2_PER_KWH_IN_DC_GREEN = 0;\n\n// the 1 byte model gives figures for energy usage for:\n\n// datacentres\n// networks\n// the device used to access a site/app\n\n// The device usage figure combines figures for:\n// 1. the usage for devices (which is small proportion of the energy use)\n// 2. the *making* the device, which is comparatively high.\n\nconst KWH_PER_BYTE_IN_DC = 7.2e-11;\n\n// this is probably best left as something users can define, or\n// a weighted average based on total usage.\n// Using a simple mean for now, as while web traffic to end users might trend\n// towards wifi and mobile,\n// Web traffic between servers is likely wired networks\n\nconst FIXED_NETWORK_WIRED = 4.29e-10;\nconst FIXED_NETWORK_WIFI = 1.52e-10;\nconst FOUR_G_MOBILE = 8.84e-10;\n\n// Pull requests gratefully accepted\nconst KWH_PER_BYTE_FOR_NETWORK =\n (FIXED_NETWORK_WIRED + FIXED_NETWORK_WIFI + FOUR_G_MOBILE) / 3;\n\nconst KWH_PER_BYTE_FOR_DEVICES = 1.3e-10;\n\nclass OneByte {\n constructor(options) {\n this.options = options;\n\n this.KWH_PER_BYTE_FOR_NETWORK = KWH_PER_BYTE_FOR_NETWORK;\n }\n\n /**\n * Calculates the carbon footprint of a website using the OneByte model\n * @param {number} bytes - The number of bytes to calculate the carbon footprint for\n * @param {boolean} green - Whether the energy is green or not\n * @returns {number} The carbon footprint in grams of CO2\n */\n\n perByte(bytes, green) {\n if (bytes < 1) {\n return 0;\n }\n\n if (green) {\n // if we have a green datacentre, use the lower figure for renewable energy\n const Co2ForDC = bytes * KWH_PER_BYTE_IN_DC * CO2_PER_KWH_IN_DC_GREEN;\n\n // but for the worest of the internet, we can't easily check, so assume\n // grey for now\n const Co2forNetwork =\n bytes * KWH_PER_BYTE_FOR_NETWORK * CO2_PER_KWH_NETWORK_GREY;\n\n return Co2ForDC + Co2forNetwork;\n }\n\n const KwHPerByte = KWH_PER_BYTE_IN_DC + KWH_PER_BYTE_FOR_NETWORK;\n return bytes * KwHPerByte * CO2_PER_KWH_IN_DC_GREY;\n }\n}\n\nexport { OneByte };\nexport default OneByte;\n", "const GIGABYTE = 1000 * 1000 * 1000;\n\nexport default {\n GIGABYTE,\n};\n", "const data = {\"AFG\":120.48,\"AFRICA\":484.16,\"ALB\":23.44,\"DZA\":498.9,\"ASM\":687.5,\"AGO\":195.98,\"ATG\":657.14,\"ARG\":344.31,\"ARM\":222.68,\"ABW\":591.4,\"ASEAN\":508.06,\"ASIA\":535.23,\"AUS\":501.7,\"AUT\":157.52,\"AZE\":532.9,\"BHS\":698.11,\"BHR\":494.02,\"BGD\":577.03,\"BRB\":644.86,\"BLR\":415.64,\"BEL\":165.36,\"BLZ\":484.38,\"BEN\":666.67,\"BTN\":24.44,\"BOL\":322.09,\"BIH\":516.01,\"BWA\":794.52,\"BRA\":102.09,\"BRN\":658.85,\"BGR\":399.57,\"BFA\":611.43,\"BDI\":250,\"CPV\":600,\"KHM\":400.46,\"CMR\":278.26,\"CAN\":125.84,\"CYM\":684.93,\"CAF\":0,\"TCD\":677.42,\"CHL\":332.61,\"CHN\":533.98,\"COL\":168.95,\"COM\":714.29,\"COG\":395.52,\"COD\":25.36,\"COK\":400,\"CRI\":37.21,\"CIV\":410.75,\"HRV\":246.46,\"CUB\":602.23,\"CYP\":589.35,\"CZE\":415.35,\"DNK\":180.71,\"DJI\":666.67,\"DMA\":529.41,\"DOM\":549.8,\"ECU\":188.71,\"EGY\":469.63,\"SLV\":194.23,\"GNQ\":492.96,\"ERI\":688.89,\"EST\":464.03,\"SWZ\":189.19,\"ETH\":25.19,\"EU\":277.19,\"EUROPE\":296.45,\"FLK\":500,\"FRO\":428.57,\"FJI\":289.47,\"FIN\":130.98,\"FRA\":84.82,\"GUF\":254.72,\"PYF\":471.43,\"G20\":442.38,\"G7\":343.92,\"GAB\":397.38,\"GMB\":700,\"GEO\":134.83,\"DEU\":384.83,\"GHA\":361.2,\"GRC\":343.82,\"GRL\":133.33,\"GRD\":714.29,\"GLP\":623.53,\"GUM\":670.33,\"GTM\":291.55,\"GIN\":208.63,\"GNB\":750,\"GUY\":642.28,\"HTI\":606.06,\"HND\":373.96,\"HKG\":683.97,\"HUN\":222.97,\"ISL\":28.56,\"IND\":633.4,\"IDN\":619.02,\"IRN\":487.86,\"IRQ\":498.87,\"IRL\":346.33,\"ISR\":548.03,\"ITA\":371.69,\"JAM\":537.93,\"JPN\":494.86,\"JOR\":399.91,\"KAZ\":635.57,\"KEN\":100.57,\"KIR\":666.67,\"XKX\":768.73,\"KWT\":551.74,\"KGZ\":104.43,\"LAO\":242.18,\"LATIN AMERICA AND CARIBBEAN\":238.68,\"LVA\":181.82,\"LBN\":605.74,\"LSO\":20,\"LBR\":304.35,\"LBY\":550.42,\"LTU\":194.25,\"LUX\":168.14,\"MAC\":491.53,\"MDG\":483.25,\"MWI\":133.8,\"MYS\":543.87,\"MDV\":651.52,\"MLI\":463.13,\"MLT\":495,\"MTQ\":698.63,\"MRT\":526.6,\"MUS\":611.11,\"MEX\":423.81,\"MIDDLE EAST\":516.02,\"MDA\":677.18,\"MNG\":749.66,\"MNE\":399.38,\"MSR\":1000,\"MAR\":610.41,\"MOZ\":126.63,\"MMR\":344.37,\"NAM\":63.69,\"NRU\":750,\"NPL\":24.51,\"NLD\":355.78,\"NCL\":610.12,\"NZL\":97.73,\"NIC\":354.21,\"NER\":622.22,\"NGA\":368.11,\"NORTH AMERICA\":336.01,\"PRK\":157.79,\"MKD\":529.33,\"NOR\":28.82,\"OCEANIA\":449.71,\"OECD\":340.95,\"OMN\":488.27,\"PAK\":344.16,\"PSE\":465.12,\"PAN\":186.61,\"PNG\":526.75,\"PRY\":25.49,\"PER\":256.51,\"POL\":633.1,\"PRT\":234.03,\"PRI\":681.47,\"QAT\":489.88,\"REU\":519.03,\"ROU\":264.12,\"RUS\":363.68,\"RWA\":294.12,\"KNA\":681.82,\"LCA\":685.71,\"SPM\":800,\"VCT\":500,\"WSM\":470.59,\"STP\":600,\"SAU\":557.78,\"SEN\":523.13,\"SRB\":569.38,\"SYC\":615.39,\"SLE\":47.62,\"SGP\":488.78,\"SVK\":140.67,\"SVN\":237.38,\"SLB\":727.27,\"SOM\":634.15,\"ZAF\":708.19,\"KOR\":437.6,\"SSD\":684.21,\"ESP\":217.37,\"LKA\":463,\"SDN\":264.01,\"SUR\":356.44,\"SWE\":45.08,\"CHE\":45.62,\"SYR\":541.17,\"TWN\":560.98,\"TJK\":83.63,\"TZA\":366.75,\"THA\":501.57,\"PHL\":582.84,\"TGO\":460.32,\"TON\":625,\"TTO\":491.41,\"TUN\":469.43,\"TUR\":413.63,\"TKM\":490.19,\"TCA\":703.7,\"UGA\":52.27,\"UKR\":187.06,\"ARE\":407.98,\"GBR\":261.24,\"USA\":367.26,\"URY\":114.89,\"UZB\":505.41,\"VUT\":571.43,\"VEN\":212.48,\"VNM\":386.49,\"VGB\":714.29,\"VIR\":685.71,\"WORLD\":437.26,\"YEM\":543.91,\"ZMB\":84.7,\"ZWE\":392.28}; const type = \"average\"; export { data, type }; export default { data, type };", "import fileSize from \"./file-size.js\";\nimport averageIntensity from \"../data/average-intensities.min.js\";\n\n// SUSTAINABLE WEB DESIGN CONSTANTS\n// this refers to the estimated total energy use for the internet around 2000 TWh,\n// divided by the total transfer it enables around 2500 exabytes\nconst KWH_PER_GB = 0.81;\n\n// these constants outline how the energy is attributed to\n// different parts of the system in the SWD model\nconst END_USER_DEVICE_ENERGY = 0.52;\nconst NETWORK_ENERGY = 0.14;\nconst DATACENTER_ENERGY = 0.15;\nconst PRODUCTION_ENERGY = 0.19;\n\n// These carbon intensity figures https://ember-climate.org/data/data-explorer\n// - Global carbon intensity for 2022\nconst GLOBAL_GRID_INTENSITY = averageIntensity.data[\"WORLD\"];\nconst RENEWABLES_GRID_INTENSITY = 50;\n\n// Taken from: https://gitlab.com/wholegrain/carbon-api-2-0/-/blob/master/includes/carbonapi.php\n\nconst FIRST_TIME_VIEWING_PERCENTAGE = 0.75;\nconst RETURNING_VISITOR_PERCENTAGE = 0.25;\nconst PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD = 0.02;\n\nexport {\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};\n", "import { averageIntensity } from \"../index.js\";\nimport {\n GLOBAL_GRID_INTENSITY,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD,\n FIRST_TIME_VIEWING_PERCENTAGE,\n RETURNING_VISITOR_PERCENTAGE,\n} from \"../constants/index.js\";\nconst formatNumber = (num) => parseFloat(num.toFixed(2));\n\nfunction parseOptions(options) {\n // CHeck that it is an object\n if (typeof options !== \"object\") {\n throw new Error(\"Options must be an object\");\n }\n\n const adjustments = {};\n\n if (options?.gridIntensity) {\n adjustments.gridIntensity = {};\n const { device, dataCenter, network } = options.gridIntensity;\n if (device || device === 0) {\n if (typeof device === \"object\") {\n if (!averageIntensity.data[device.country?.toUpperCase()]) {\n console.warn(\n `\"${device.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \\nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"device\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"device\"] = {\n country: device.country,\n value: parseFloat(\n averageIntensity.data[device.country?.toUpperCase()]\n ),\n };\n } else if (typeof device === \"number\") {\n adjustments.gridIntensity[\"device\"] = {\n value: device,\n };\n } else {\n adjustments.gridIntensity[\"device\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The device grid intensity must be a number or an object. You passed in a ${typeof device}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n if (dataCenter || dataCenter === 0) {\n if (typeof dataCenter === \"object\") {\n if (!averageIntensity.data[dataCenter.country?.toUpperCase()]) {\n console.warn(\n `\"${dataCenter.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \\nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"dataCenter\"] = {\n country: dataCenter.country,\n value: parseFloat(\n averageIntensity.data[dataCenter.country?.toUpperCase()]\n ),\n };\n } else if (typeof dataCenter === \"number\") {\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: dataCenter,\n };\n } else {\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The data center grid intensity must be a number or an object. You passed in a ${typeof dataCenter}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n if (network || network === 0) {\n if (typeof network === \"object\") {\n if (!averageIntensity.data[network.country?.toUpperCase()]) {\n console.warn(\n `\"${network.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. Falling back to global average grid intensity. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"network\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"network\"] = {\n country: network.country,\n value: parseFloat(\n averageIntensity.data[network.country?.toUpperCase()]\n ),\n };\n } else if (typeof network === \"number\") {\n adjustments.gridIntensity[\"network\"] = {\n value: network,\n };\n } else {\n adjustments.gridIntensity[\"network\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The network grid intensity must be a number or an object. You passed in a ${typeof network}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n }\n\n if (options?.dataReloadRatio || options.dataReloadRatio === 0) {\n if (typeof options.dataReloadRatio === \"number\") {\n if (options.dataReloadRatio >= 0 && options.dataReloadRatio <= 1) {\n adjustments.dataReloadRatio = options.dataReloadRatio;\n } else {\n adjustments.dataReloadRatio =\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD;\n console.warn(\n `The dataReloadRatio option must be a number between 0 and 1. You passed in ${options.dataReloadRatio}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.dataReloadRatio =\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD;\n console.warn(\n `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}. \\nFalling back to default value.`\n );\n }\n }\n\n if (options?.firstVisitPercentage || options.firstVisitPercentage === 0) {\n if (typeof options.firstVisitPercentage === \"number\") {\n if (\n options.firstVisitPercentage >= 0 &&\n options.firstVisitPercentage <= 1\n ) {\n adjustments.firstVisitPercentage = options.firstVisitPercentage;\n } else {\n adjustments.firstVisitPercentage = FIRST_TIME_VIEWING_PERCENTAGE;\n console.warn(\n `The firstVisitPercentage option must be a number between 0 and 1. You passed in ${options.firstVisitPercentage}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.firstVisitPercentage = FIRST_TIME_VIEWING_PERCENTAGE;\n console.warn(\n `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}. \\nFalling back to default value.`\n );\n }\n }\n\n if (options?.returnVisitPercentage || options.returnVisitPercentage === 0) {\n if (typeof options.returnVisitPercentage === \"number\") {\n if (\n options.returnVisitPercentage >= 0 &&\n options.returnVisitPercentage <= 1\n ) {\n adjustments.returnVisitPercentage = options.returnVisitPercentage;\n } else {\n adjustments.returnVisitPercentage = RETURNING_VISITOR_PERCENTAGE;\n console.warn(\n `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.returnVisitPercentage = RETURNING_VISITOR_PERCENTAGE;\n console.warn(\n `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}. \\nFalling back to default value.`\n );\n }\n }\n\n return adjustments;\n}\n\nexport { formatNumber, parseOptions };\n", "\"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 } from \"./helpers/index.js\";\n\nclass SustainableWebDesign {\n constructor(options) {\n this.options = options;\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) {\n deviceCarbonIntensity = device.value;\n }\n if (network?.value) {\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) {\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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) {\n dataReloadRatio = options.dataReloadRatio;\n }\n\n if (options.firstVisitPercentage) {\n firstView = options.firstVisitPercentage;\n }\n\n if (options.returnVisitPercentage) {\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\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n", "\"use strict\";\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerByte\n * @property {number} co2 - The CO2 estimate in grams/kilowatt-hour\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariables} variables - The variables used to calculate the CO2 estimate\n */\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerVisit\n * @property {number} co2 - The CO2 estimate in grams/kilowatt-hour\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariables} variables - The variables used to calculate the CO2 estimate\n */\n\n/**\n * @typedef {Object} TraceResultVariablesPerByte\n * @property {GridIntensityVariables} gridIntensity - The grid intensity related variables\n */\n/**\n * @typedef {Object} TraceResultVariablesPerVisit\n * @property {GridIntensityVariables} gridIntensity - The grid intensity related variables\n * @property {number} dataReloadRatio - What percentage of a page is reloaded on each subsequent page view\n * @property {number} firstVisitPercentage - What percentage of visits are loading this page for subsequent times\n * @property {number} returnVisitPercentage - What percentage of visits are loading this page for the second or more time\n */\n\n/**\n * @typedef {Object} GridIntensityVariables\n * @property {string} description - The description of the variables\n * @property {number} network - The network grid intensity set by the user or the default\n * @property {number} dataCenter - The data center grid intensity set by the user or the default\n * @property {number} device - The device grid intensity set by the user or the default\n * @property {number} production - The production grid intensity set by the user or the default\n */\n\nimport OneByte from \"./1byte.js\";\nimport SustainableWebDesign from \"./sustainable-web-design.js\";\n\nimport {\n GLOBAL_GRID_INTENSITY,\n RENEWABLES_GRID_INTENSITY,\n} from \"./constants/index.js\";\nimport { parseOptions } from \"./helpers/index.js\";\n\nclass CO2 {\n constructor(options) {\n this.model = new SustainableWebDesign();\n // Using optional chaining allows an empty object to be passed\n // in without breaking the code.\n if (options?.model === \"1byte\") {\n this.model = new OneByte();\n } else if (options?.model === \"swd\") {\n this.model = new SustainableWebDesign();\n } else if (options?.model) {\n throw new Error(\n `\"${options.model}\" is not a valid model. Please use \"1byte\" for the OneByte model, and \"swd\" for the Sustainable Web Design model.\\nSee https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`\n );\n }\n\n /** @private */\n this._segment = options?.results === \"segment\";\n }\n\n /**\n * Accept a figure in bytes for data transfer, and a boolean for whether\n * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding\n * the data transfer.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @return {number} the amount of CO2 in grammes\n */\n perByte(bytes, green = false) {\n return this.model.perByte(bytes, green, this._segment);\n }\n\n /**\n * Accept a figure in bytes for data transfer, and a boolean for whether\n * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding\n * the data transfer.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @return {number} the amount of CO2 in grammes\n */\n perVisit(bytes, green = false) {\n if (this.model?.perVisit) {\n return this.model.perVisit(bytes, green, this._segment);\n } else {\n throw new Error(\n `The perVisit() method is not supported in the model you are using. Try using perByte() instead.\\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n\n /**\n * Accept a figure in bytes for data transfer, a boolean for whether\n * the domain shows as 'green', and an options object.\n * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @param {Object} options\n * @return {CO2EstimateTraceResultPerByte} the amount of CO2 in grammes\n */\n perByteTrace(bytes, green = false, options = {}) {\n let adjustments = {};\n if (options) {\n // If there are options, parse them and add them to the model.\n adjustments = parseOptions(options);\n }\n return {\n co2: this.model.perByte(bytes, green, this._segment, adjustments),\n green,\n variables: {\n description:\n \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: {\n description:\n \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\",\n network:\n adjustments?.gridIntensity?.network?.value ?? GLOBAL_GRID_INTENSITY,\n dataCenter: green\n ? RENEWABLES_GRID_INTENSITY\n : adjustments?.gridIntensity?.dataCenter?.value ??\n GLOBAL_GRID_INTENSITY,\n production: GLOBAL_GRID_INTENSITY,\n device:\n adjustments?.gridIntensity?.device?.value ?? GLOBAL_GRID_INTENSITY,\n },\n },\n };\n }\n\n /**\n * Accept a figure in bytes for data transfer, a boolean for whether\n * the domain shows as 'green', and an options object.\n * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @param {Object} options\n * @return {CO2EstimateTraceResultPerVisit} the amount of CO2 in grammes\n */\n perVisitTrace(bytes, green = false, options = {}) {\n if (this.model?.perVisit) {\n let adjustments = {};\n if (options) {\n // If there are options, parse them and add them to the model.\n adjustments = parseOptions(options);\n }\n\n return {\n co2: this.model.perVisit(bytes, green, this._segment, adjustments),\n green,\n variables: {\n description:\n \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: {\n description:\n \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\",\n network:\n adjustments?.gridIntensity?.network?.value ??\n GLOBAL_GRID_INTENSITY,\n dataCenter: green\n ? RENEWABLES_GRID_INTENSITY\n : adjustments?.gridIntensity?.dataCenter?.value ??\n GLOBAL_GRID_INTENSITY,\n production: GLOBAL_GRID_INTENSITY,\n device:\n adjustments?.gridIntensity?.device?.value ??\n GLOBAL_GRID_INTENSITY,\n },\n dataReloadRatio: adjustments?.dataReloadRatio ?? 0.02,\n firstVisitPercentage: adjustments?.firstVisitPercentage ?? 0.75,\n returnVisitPercentage: adjustments?.returnVisitPercentage ?? 0.25,\n },\n };\n } else {\n throw new Error(\n `The perVisitDetailed() method is not supported in the model you are using. Try using perByte() instead.\\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n\n perDomain(pageXray, greenDomains) {\n const co2PerDomain = [];\n for (let domain of Object.keys(pageXray.domains)) {\n let co2;\n if (greenDomains && greenDomains.indexOf(domain) > -1) {\n co2 = this.perByte(pageXray.domains[domain].transferSize, true);\n } else {\n co2 = this.perByte(pageXray.domains[domain].transferSize);\n }\n co2PerDomain.push({\n domain,\n co2,\n transferSize: pageXray.domains[domain].transferSize,\n });\n }\n co2PerDomain.sort((a, b) => b.co2 - a.co2);\n\n return co2PerDomain;\n }\n\n perPage(pageXray, green) {\n // Accept an xray object, and if we receive a boolean as the second\n // argument, we assume every request we make is sent to a server\n // running on renwewable power.\n\n // if we receive an array of domains, return a number accounting the\n // reduced CO2 from green hosted domains\n\n const domainCO2 = this.perDomain(pageXray, green);\n let totalCO2 = 0;\n for (let domain of domainCO2) {\n totalCO2 += domain.co2;\n }\n return totalCO2;\n }\n\n perContentType(pageXray, greenDomains) {\n const co2PerContentType = {};\n for (let asset of pageXray.assets) {\n const domain = new URL(asset.url).domain;\n const transferSize = asset.transferSize;\n const co2ForTransfer = this.perByte(\n transferSize,\n greenDomains && greenDomains.indexOf(domain) > -1\n );\n const contentType = asset.type;\n if (!co2PerContentType[contentType]) {\n co2PerContentType[contentType] = { co2: 0, transferSize: 0 };\n }\n co2PerContentType[contentType].co2 += co2ForTransfer;\n co2PerContentType[contentType].transferSize += transferSize;\n }\n // restructure and sort\n const all = [];\n for (let type of Object.keys(co2PerContentType)) {\n all.push({\n type,\n co2: co2PerContentType[type].co2,\n transferSize: co2PerContentType[type].transferSize,\n });\n }\n all.sort((a, b) => b.co2 - a.co2);\n return all;\n }\n\n dirtiestResources(pageXray, greenDomains) {\n const allAssets = [];\n for (let asset of pageXray.assets) {\n const domain = new URL(asset.url).domain;\n const transferSize = asset.transferSize;\n const co2ForTransfer = this.perByte(\n transferSize,\n greenDomains && greenDomains.indexOf(domain) > -1\n );\n allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize });\n }\n allAssets.sort((a, b) => b.co2 - a.co2);\n\n return allAssets.slice(0, allAssets.length > 10 ? 10 : allAssets.length);\n }\n\n perParty(pageXray, greenDomains) {\n let firstParty = 0;\n let thirdParty = 0;\n // calculate co2 per first/third party\n const firstPartyRegEx = pageXray.firstPartyRegEx;\n for (let d of Object.keys(pageXray.domains)) {\n if (!d.match(firstPartyRegEx)) {\n thirdParty += this.perByte(\n pageXray.domains[d].transferSize,\n greenDomains && greenDomains.indexOf(d) > -1\n );\n } else {\n firstParty += this.perByte(\n pageXray.domains[d].transferSize,\n greenDomains && greenDomains.indexOf(d) > -1\n );\n }\n }\n return { firstParty, thirdParty };\n }\n}\n\nexport { CO2 };\nexport default CO2;\n", "\"use strict\";\n\n/**\n * Check if a string or array of domains has been provided\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n */\n\nfunction check(domain) {\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return checkAgainstAPI(domain);\n } else {\n return checkDomainsAgainstAPI(domain);\n }\n}\n\n/**\n * Check if a domain is hosted by a green web host by querying the Green Web Foundation API.\n * @param {string} domain - The domain to check.\n * @returns {boolean} - A boolean indicating whether the domain is hosted by a green web host.\n */\nasync function checkAgainstAPI(domain) {\n const req = await fetch(\n `https://api.thegreenwebfoundation.org/greencheck/${domain}`\n );\n const res = await req.json();\n return res.green;\n}\n\n/**\n * Check if an array of domains is hosted by a green web host by querying the Green Web Foundation API.\n * @param {array} domains - An array of domains to check.\n * @returns {array} - An array of domains that are hosted by a green web host.\n */\n\nasync function checkDomainsAgainstAPI(domains) {\n try {\n const apiPath = \"https://api.thegreenwebfoundation.org/v2/greencheckmulti\";\n const domainsString = JSON.stringify(domains);\n\n const req = await fetch(`${apiPath}/${domainsString}`);\n\n const allGreenCheckResults = await req.json();\n\n return greenDomainsFromResults(allGreenCheckResults);\n } catch (e) {\n return [];\n }\n}\n\n/**\n * Extract the green domains from the results of a green check.\n * @param {object} greenResults - The results of a green check.\n * @returns {array} - An array of domains that are hosted by a green web host.\n */\nfunction greenDomainsFromResults(greenResults) {\n const entries = Object.entries(greenResults);\n const greenEntries = entries.filter(([key, val]) => val.green);\n return greenEntries.map(([key, val]) => val.url);\n}\n\nexport default {\n check,\n};\n", "\"use strict\";\n\nimport hostingAPI from \"./hosting-api.js\";\n\n/**\n * Check if a domain is hosted by a green web host.\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n * @returns {boolean|array} - A boolean if a string was provided, or an array of booleans if an array of domains was provided.\n */\nfunction check(domain) {\n return hostingAPI.check(domain);\n}\n\nexport default {\n check,\n};\n", "const data = {\"AFG\":\"414\",\"ALB\":\"0\",\"DZA\":\"528\",\"ASM\":\"753\",\"AND\":\"188\",\"AGO\":\"1476\",\"AIA\":\"753\",\"ATG\":\"753\",\"ARG\":\"478\",\"ARM\":\"390\",\"ABW\":\"753\",\"AUS\":\"808\",\"AUT\":\"242\",\"AZE\":\"534\",\"AZORES (PORTUGAL)\":\"753\",\"BHS\":\"753\",\"BHR\":\"726\",\"BGD\":\"528\",\"BRB\":\"749\",\"BLR\":\"400\",\"BEL\":\"252\",\"BLZ\":\"403\",\"BEN\":\"745\",\"BMU\":\"753\",\"BTN\":\"0\",\"BOL\":\"604\",\"BES\":\"753\",\"BIH\":\"1197\",\"BWA\":\"1486\",\"BRA\":\"284\",\"VGB\":\"753\",\"BRN\":\"681\",\"BGR\":\"911\",\"BFA\":\"753\",\"BDI\":\"414\",\"KHM\":\"1046\",\"CMR\":\"659\",\"CAN\":\"372\",\"CYM\":\"753\",\"CPV\":\"753\",\"CAF\":\"188\",\"TCD\":\"753\",\"CHANNEL ISLANDS (U.K)\":\"753\",\"CHL\":\"657\",\"CHN\":\"899\",\"COL\":\"410\",\"COM\":\"753\",\"COD\":\"0\",\"COG\":\"659\",\"COK\":\"753\",\"CRI\":\"108\",\"CIV\":\"466\",\"HRV\":\"294\",\"CUB\":\"559\",\"CUW\":\"876\",\"CYP\":\"751\",\"CZE\":\"902\",\"DNK\":\"362\",\"DJI\":\"753\",\"DMA\":\"753\",\"DOM\":\"601\",\"ECU\":\"560\",\"EGY\":\"554\",\"SLV\":\"547\",\"GNQ\":\"632\",\"ERI\":\"915\",\"EST\":\"1057\",\"SWZ\":\"0\",\"ETH\":\"0\",\"FLK\":\"753\",\"FRO\":\"753\",\"FJI\":\"640\",\"FIN\":\"267\",\"FRA\":\"158\",\"GUF\":\"423\",\"PYF\":\"753\",\"GAB\":\"946\",\"GMB\":\"753\",\"GEO\":\"289\",\"DEU\":\"650\",\"GHA\":\"495\",\"GIB\":\"779\",\"GRC\":\"507\",\"GRL\":\"264\",\"GRD\":\"753\",\"GLP\":\"753\",\"GUM\":\"753\",\"GTM\":\"798\",\"GIN\":\"753\",\"GNB\":\"753\",\"GUY\":\"847\",\"HTI\":\"1048\",\"HND\":\"662\",\"HUN\":\"296\",\"ISL\":\"0\",\"IND\":\"951\",\"IDN\":\"783\",\"IRN\":\"592\",\"IRQ\":\"1080\",\"IRL\":\"380\",\"IMN\":\"436\",\"ISR\":\"394\",\"ITA\":\"414\",\"JAM\":\"711\",\"JPN\":\"471\",\"JOR\":\"529\",\"KAZ\":\"797\",\"KEN\":\"574\",\"KIR\":\"753\",\"PRK\":\"754\",\"KOR\":\"555\",\"XKX\":\"1145\",\"KWT\":\"675\",\"KGZ\":\"217\",\"LAO\":\"1069\",\"LVA\":\"240\",\"LBN\":\"794\",\"LSO\":\"0\",\"LBR\":\"677\",\"LBY\":\"668\",\"LIE\":\"151\",\"LTU\":\"211\",\"LUX\":\"220\",\"MDG\":\"876\",\"MADEIRA (PORTUGAL)\":\"663\",\"MWI\":\"489\",\"MYS\":\"551\",\"MDV\":\"753\",\"MLI\":\"1076\",\"MLT\":\"520\",\"MHL\":\"753\",\"MTQ\":\"753\",\"MRT\":\"753\",\"MUS\":\"700\",\"MYT\":\"753\",\"MEX\":\"531\",\"FSM\":\"753\",\"MDA\":\"541\",\"MCO\":\"158\",\"MNG\":\"1366\",\"MNE\":\"899\",\"MSR\":\"753\",\"MAR\":\"729\",\"MOZ\":\"234\",\"MMR\":\"719\",\"NAM\":\"355\",\"NRU\":\"753\",\"NPL\":\"0\",\"NLD\":\"326\",\"NCL\":\"779\",\"NZL\":\"246\",\"NIC\":\"675\",\"NER\":\"772\",\"NGA\":\"526\",\"NIU\":\"753\",\"MKD\":\"851\",\"MNP\":\"753\",\"NOR\":\"47\",\"OMN\":\"479\",\"PAK\":\"592\",\"PLW\":\"753\",\"PSE\":\"719\",\"PAN\":\"477\",\"PNG\":\"597\",\"PRY\":\"0\",\"PER\":\"473\",\"PHL\":\"672\",\"POL\":\"828\",\"PRT\":\"389\",\"PRI\":\"596\",\"QAT\":\"503\",\"REU\":\"772\",\"ROU\":\"489\",\"RUS\":\"476\",\"RWA\":\"712\",\"SHN\":\"753\",\"KNA\":\"753\",\"LCA\":\"753\",\"MAF\":\"753\",\"SPM\":\"753\",\"VCT\":\"753\",\"WSM\":\"753\",\"SMR\":\"414\",\"STP\":\"753\",\"SAU\":\"592\",\"SEN\":\"870\",\"SRB\":\"1086\",\"SYC\":\"753\",\"SLE\":\"489\",\"SGP\":\"379\",\"SXM\":\"753\",\"SVK\":\"332\",\"SVN\":\"620\",\"SLB\":\"753\",\"SOM\":\"753\",\"ZAF\":\"1070\",\"SSD\":\"890\",\"ESP\":\"402\",\"LKA\":\"731\",\"SDN\":\"736\",\"SUR\":\"1029\",\"SWE\":\"68\",\"CHE\":\"48\",\"SYR\":\"713\",\"TWN\":\"484\",\"TJK\":\"255\",\"TZA\":\"531\",\"THA\":\"450\",\"TLS\":\"753\",\"TGO\":\"859\",\"TON\":\"753\",\"TTO\":\"559\",\"TUN\":\"468\",\"TUR\":\"376\",\"TKM\":\"927\",\"TCA\":\"753\",\"TUV\":\"753\",\"UGA\":\"279\",\"UKR\":\"768\",\"ARE\":\"556\",\"GBR\":\"380\",\"USA\":\"416\",\"URY\":\"174\",\"UZB\":\"612\",\"VUT\":\"753\",\"VEN\":\"711\",\"VNM\":\"560\",\"VIR\":\"650\",\"YEM\":\"807\",\"ZMB\":\"416\",\"ZWE\":\"1575\",\"MEMO: EU 27\":\"409\"}; const type = \"marginal\"; const year = \"2021\"; export { data, type, year }; export default { data, type, year };"],
|
|
5
|
-
"mappings": "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,CAAC,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,oBAAoB,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,wBAAwB,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,IAAI,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,qBAAqB,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,KAAK,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,IAAI,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,IAAM,KAAK,IAAM,KAAK,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,MAAM,IAAM,OAAO,eAAe,KAAK,EAAS,EAAO,WAAkB,EAAO,OAAqC,GAAO,GAAQ,CAAE,OAAM,OAAM,MAAK,EVM/4F,GAAO,GAAQ,CAAE,MAAK,UAAS,mBAAkB,mBAAkB",
|
|
4
|
+
"sourcesContent": ["import co2 from \"./co2.js\";\nimport hosting from \"./hosting.js\";\nimport averageIntensity from \"./data/average-intensities.min.js\";\nimport marginalIntensity from \"./data/marginal-intensities-2021.min.js\";\n\nexport { co2, hosting, averageIntensity, marginalIntensity };\nexport default { co2, hosting, averageIntensity, marginalIntensity };\n", "// Use the 1byte model for now from the Shift Project, and assume a US grid mix figure they use of around 519 g co2 for the time being. It's lower for Europe, and in particular, France, but for v1, we don't include this\nconst CO2_PER_KWH_IN_DC_GREY = 519;\n\n// this figure is from the IEA's 2018 report for a global average:\nconst CO2_PER_KWH_NETWORK_GREY = 475;\n\n// TODO - these figures need to be updated, as the figures for green\n// shouldn't really be zero now we know that carbon intensity figures\n// for renewables still usually include the life cycle emissions\nconst CO2_PER_KWH_IN_DC_GREEN = 0;\n\n// the 1 byte model gives figures for energy usage for:\n\n// datacentres\n// networks\n// the device used to access a site/app\n\n// The device usage figure combines figures for:\n// 1. the usage for devices (which is small proportion of the energy use)\n// 2. the *making* the device, which is comparatively high.\n\nconst KWH_PER_BYTE_IN_DC = 7.2e-11;\n\n// this is probably best left as something users can define, or\n// a weighted average based on total usage.\n// Using a simple mean for now, as while web traffic to end users might trend\n// towards wifi and mobile,\n// Web traffic between servers is likely wired networks\n\nconst FIXED_NETWORK_WIRED = 4.29e-10;\nconst FIXED_NETWORK_WIFI = 1.52e-10;\nconst FOUR_G_MOBILE = 8.84e-10;\n\n// Pull requests gratefully accepted\nconst KWH_PER_BYTE_FOR_NETWORK =\n (FIXED_NETWORK_WIRED + FIXED_NETWORK_WIFI + FOUR_G_MOBILE) / 3;\n\nconst KWH_PER_BYTE_FOR_DEVICES = 1.3e-10;\n\nclass OneByte {\n constructor(options) {\n this.options = options;\n\n this.KWH_PER_BYTE_FOR_NETWORK = KWH_PER_BYTE_FOR_NETWORK;\n }\n\n /**\n * Calculates the carbon footprint of a website using the OneByte model\n * @param {number} bytes - The number of bytes to calculate the carbon footprint for\n * @param {boolean} green - Whether the energy is green or not\n * @returns {number} The carbon footprint in grams of CO2\n */\n\n perByte(bytes, green) {\n if (bytes < 1) {\n return 0;\n }\n\n if (green) {\n // if we have a green datacentre, use the lower figure for renewable energy\n const Co2ForDC = bytes * KWH_PER_BYTE_IN_DC * CO2_PER_KWH_IN_DC_GREEN;\n\n // but for the worest of the internet, we can't easily check, so assume\n // grey for now\n const Co2forNetwork =\n bytes * KWH_PER_BYTE_FOR_NETWORK * CO2_PER_KWH_NETWORK_GREY;\n\n return Co2ForDC + Co2forNetwork;\n }\n\n const KwHPerByte = KWH_PER_BYTE_IN_DC + KWH_PER_BYTE_FOR_NETWORK;\n return bytes * KwHPerByte * CO2_PER_KWH_IN_DC_GREY;\n }\n}\n\nexport { OneByte };\nexport default OneByte;\n", "const GIGABYTE = 1000 * 1000 * 1000;\n\nexport default {\n GIGABYTE,\n};\n", "const data = {\"AFG\":120.48,\"AFRICA\":484.16,\"ALB\":23.44,\"DZA\":498.9,\"ASM\":687.5,\"AGO\":195.98,\"ATG\":657.14,\"ARG\":344.31,\"ARM\":222.68,\"ABW\":591.4,\"ASEAN\":508.06,\"ASIA\":535.23,\"AUS\":501.7,\"AUT\":157.52,\"AZE\":532.9,\"BHS\":698.11,\"BHR\":494.02,\"BGD\":577.03,\"BRB\":644.86,\"BLR\":415.64,\"BEL\":165.36,\"BLZ\":484.38,\"BEN\":666.67,\"BTN\":24.44,\"BOL\":322.09,\"BIH\":516.01,\"BWA\":794.52,\"BRA\":102.09,\"BRN\":658.85,\"BGR\":399.57,\"BFA\":611.43,\"BDI\":250,\"CPV\":600,\"KHM\":400.46,\"CMR\":278.26,\"CAN\":125.84,\"CYM\":684.93,\"CAF\":0,\"TCD\":677.42,\"CHL\":332.61,\"CHN\":533.98,\"COL\":168.95,\"COM\":714.29,\"COG\":395.52,\"COD\":25.36,\"COK\":400,\"CRI\":37.21,\"CIV\":410.75,\"HRV\":246.46,\"CUB\":602.23,\"CYP\":589.35,\"CZE\":415.35,\"DNK\":180.71,\"DJI\":666.67,\"DMA\":529.41,\"DOM\":549.8,\"ECU\":188.71,\"EGY\":469.63,\"SLV\":194.23,\"GNQ\":492.96,\"ERI\":688.89,\"EST\":464.03,\"SWZ\":189.19,\"ETH\":25.19,\"EU\":276.5,\"EUROPE\":297.16,\"FLK\":500,\"FRO\":428.57,\"FJI\":289.47,\"FIN\":130.98,\"FRA\":84.82,\"GUF\":254.72,\"PYF\":471.43,\"G20\":442.62,\"G7\":344.29,\"GAB\":397.38,\"GMB\":700,\"GEO\":134.83,\"DEU\":385.38,\"GHA\":361.2,\"GRC\":343.82,\"GRL\":133.33,\"GRD\":714.29,\"GLP\":623.53,\"GUM\":670.33,\"GTM\":291.55,\"GIN\":208.63,\"GNB\":750,\"GUY\":642.28,\"HTI\":606.06,\"HND\":373.96,\"HKG\":683.97,\"HUN\":222.97,\"ISL\":28.56,\"IND\":633.4,\"IDN\":619.02,\"IRN\":487.86,\"IRQ\":498.87,\"IRL\":346.33,\"ISR\":548.03,\"ITA\":371.69,\"JAM\":537.93,\"JPN\":494.86,\"JOR\":399.91,\"KAZ\":635.57,\"KEN\":100.57,\"KIR\":666.67,\"XKX\":768.73,\"KWT\":551.74,\"KGZ\":104.43,\"LAO\":242.18,\"LATIN AMERICA AND CARIBBEAN\":238.68,\"LVA\":181.82,\"LBN\":605.74,\"LSO\":20,\"LBR\":304.35,\"LBY\":550.42,\"LTU\":194.25,\"LUX\":168.14,\"MAC\":491.53,\"MDG\":483.25,\"MWI\":133.8,\"MYS\":543.87,\"MDV\":651.52,\"MLI\":463.13,\"MLT\":495,\"MTQ\":698.63,\"MRT\":526.6,\"MUS\":611.11,\"MEX\":423.81,\"MIDDLE EAST\":516.02,\"MDA\":677.18,\"MNG\":749.66,\"MNE\":399.38,\"MSR\":1000,\"MAR\":610.41,\"MOZ\":126.63,\"MMR\":344.37,\"NAM\":63.69,\"NRU\":750,\"NPL\":24.51,\"NLD\":355.78,\"NCL\":610.12,\"NZL\":97.73,\"NIC\":354.21,\"NER\":622.22,\"NGA\":368.11,\"NORTH AMERICA\":336.68,\"PRK\":157.79,\"MKD\":529.33,\"NOR\":28.82,\"OCEANIA\":449.71,\"OECD\":341.2,\"OMN\":488.27,\"PAK\":344.16,\"PSE\":465.12,\"PAN\":186.61,\"PNG\":526.75,\"PRY\":25.49,\"PER\":256.51,\"POL\":633.1,\"PRT\":234.03,\"PRI\":681.47,\"QAT\":489.88,\"REU\":519.03,\"ROU\":264.12,\"RUS\":363.68,\"RWA\":294.12,\"KNA\":681.82,\"LCA\":685.71,\"SPM\":800,\"VCT\":500,\"WSM\":470.59,\"STP\":600,\"SAU\":557.78,\"SEN\":523.13,\"SRB\":569.38,\"SYC\":615.39,\"SLE\":47.62,\"SGP\":488.78,\"SVK\":140.67,\"SVN\":237.38,\"SLB\":727.27,\"SOM\":634.15,\"ZAF\":708.21,\"KOR\":437.6,\"SSD\":684.21,\"ESP\":217.37,\"LKA\":463,\"SDN\":264.01,\"SUR\":356.44,\"SWE\":45.08,\"CHE\":45.62,\"SYR\":541.17,\"TWN\":560.98,\"TJK\":83.63,\"TZA\":366.75,\"THA\":501.57,\"PHL\":582.84,\"TGO\":460.32,\"TON\":625,\"TTO\":491.41,\"TUN\":469.43,\"TUR\":413.63,\"TKM\":490.19,\"TCA\":703.7,\"UGA\":52.27,\"UKR\":230.89,\"ARE\":407.98,\"GBR\":261.24,\"USA\":368.1,\"URY\":114.89,\"UZB\":505.41,\"VUT\":571.43,\"VEN\":212.48,\"VNM\":386.49,\"VGB\":714.29,\"VIR\":685.71,\"WORLD\":437.67,\"YEM\":543.91,\"ZMB\":84.7,\"ZWE\":392.28}; const type = \"average\"; export { data, type }; export default { data, type };", "import fileSize from \"./file-size.js\";\nimport averageIntensity from \"../data/average-intensities.min.js\";\n\n// SUSTAINABLE WEB DESIGN CONSTANTS\n// this refers to the estimated total energy use for the internet around 2000 TWh,\n// divided by the total transfer it enables around 2500 exabytes\nconst KWH_PER_GB = 0.81;\n\n// these constants outline how the energy is attributed to\n// different parts of the system in the SWD model\nconst END_USER_DEVICE_ENERGY = 0.52;\nconst NETWORK_ENERGY = 0.14;\nconst DATACENTER_ENERGY = 0.15;\nconst PRODUCTION_ENERGY = 0.19;\n\n// These carbon intensity figures https://ember-climate.org/data/data-explorer\n// - Global carbon intensity for 2022\nconst GLOBAL_GRID_INTENSITY = averageIntensity.data[\"WORLD\"];\nconst RENEWABLES_GRID_INTENSITY = 50;\n\n// Taken from: https://gitlab.com/wholegrain/carbon-api-2-0/-/blob/master/includes/carbonapi.php\n\nconst FIRST_TIME_VIEWING_PERCENTAGE = 0.75;\nconst RETURNING_VISITOR_PERCENTAGE = 0.25;\nconst PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD = 0.02;\n\nexport {\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};\n", "import { averageIntensity } from \"../index.js\";\nimport {\n GLOBAL_GRID_INTENSITY,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD,\n FIRST_TIME_VIEWING_PERCENTAGE,\n RETURNING_VISITOR_PERCENTAGE,\n} from \"../constants/index.js\";\nconst formatNumber = (num) => parseFloat(num.toFixed(2));\n\nfunction parseOptions(options) {\n // CHeck that it is an object\n if (typeof options !== \"object\") {\n throw new Error(\"Options must be an object\");\n }\n\n const adjustments = {};\n\n if (options?.gridIntensity) {\n adjustments.gridIntensity = {};\n const { device, dataCenter, network } = options.gridIntensity;\n if (device || device === 0) {\n if (typeof device === \"object\") {\n if (!averageIntensity.data[device.country?.toUpperCase()]) {\n console.warn(\n `\"${device.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \\nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"device\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"device\"] = {\n country: device.country,\n value: parseFloat(\n averageIntensity.data[device.country?.toUpperCase()]\n ),\n };\n } else if (typeof device === \"number\") {\n adjustments.gridIntensity[\"device\"] = {\n value: device,\n };\n } else {\n adjustments.gridIntensity[\"device\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The device grid intensity must be a number or an object. You passed in a ${typeof device}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n if (dataCenter || dataCenter === 0) {\n if (typeof dataCenter === \"object\") {\n if (!averageIntensity.data[dataCenter.country?.toUpperCase()]) {\n console.warn(\n `\"${dataCenter.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \\nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"dataCenter\"] = {\n country: dataCenter.country,\n value: parseFloat(\n averageIntensity.data[dataCenter.country?.toUpperCase()]\n ),\n };\n } else if (typeof dataCenter === \"number\") {\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: dataCenter,\n };\n } else {\n adjustments.gridIntensity[\"dataCenter\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The data center grid intensity must be a number or an object. You passed in a ${typeof dataCenter}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n if (network || network === 0) {\n if (typeof network === \"object\") {\n if (!averageIntensity.data[network.country?.toUpperCase()]) {\n console.warn(\n `\"${network.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. Falling back to global average grid intensity. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[\"network\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n }\n adjustments.gridIntensity[\"network\"] = {\n country: network.country,\n value: parseFloat(\n averageIntensity.data[network.country?.toUpperCase()]\n ),\n };\n } else if (typeof network === \"number\") {\n adjustments.gridIntensity[\"network\"] = {\n value: network,\n };\n } else {\n adjustments.gridIntensity[\"network\"] = {\n value: GLOBAL_GRID_INTENSITY,\n };\n console.warn(\n `The network grid intensity must be a number or an object. You passed in a ${typeof network}. \\nFalling back to global average grid intensity.`\n );\n }\n }\n }\n\n if (options?.dataReloadRatio || options.dataReloadRatio === 0) {\n if (typeof options.dataReloadRatio === \"number\") {\n if (options.dataReloadRatio >= 0 && options.dataReloadRatio <= 1) {\n adjustments.dataReloadRatio = options.dataReloadRatio;\n } else {\n adjustments.dataReloadRatio =\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD;\n console.warn(\n `The dataReloadRatio option must be a number between 0 and 1. You passed in ${options.dataReloadRatio}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.dataReloadRatio =\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD;\n console.warn(\n `The dataReloadRatio option must be a number. You passed in a ${typeof options.dataReloadRatio}. \\nFalling back to default value.`\n );\n }\n }\n\n if (options?.firstVisitPercentage || options.firstVisitPercentage === 0) {\n if (typeof options.firstVisitPercentage === \"number\") {\n if (\n options.firstVisitPercentage >= 0 &&\n options.firstVisitPercentage <= 1\n ) {\n adjustments.firstVisitPercentage = options.firstVisitPercentage;\n } else {\n adjustments.firstVisitPercentage = FIRST_TIME_VIEWING_PERCENTAGE;\n console.warn(\n `The firstVisitPercentage option must be a number between 0 and 1. You passed in ${options.firstVisitPercentage}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.firstVisitPercentage = FIRST_TIME_VIEWING_PERCENTAGE;\n console.warn(\n `The firstVisitPercentage option must be a number. You passed in a ${typeof options.firstVisitPercentage}. \\nFalling back to default value.`\n );\n }\n }\n\n if (options?.returnVisitPercentage || options.returnVisitPercentage === 0) {\n if (typeof options.returnVisitPercentage === \"number\") {\n if (\n options.returnVisitPercentage >= 0 &&\n options.returnVisitPercentage <= 1\n ) {\n adjustments.returnVisitPercentage = options.returnVisitPercentage;\n } else {\n adjustments.returnVisitPercentage = RETURNING_VISITOR_PERCENTAGE;\n console.warn(\n `The returnVisitPercentage option must be a number between 0 and 1. You passed in ${options.returnVisitPercentage}. \\nFalling back to default value.`\n );\n }\n } else {\n adjustments.returnVisitPercentage = RETURNING_VISITOR_PERCENTAGE;\n console.warn(\n `The returnVisitPercentage option must be a number. You passed in a ${typeof options.returnVisitPercentage}. \\nFalling back to default value.`\n );\n }\n }\n\n return adjustments;\n}\n\nexport { formatNumber, parseOptions };\n", "\"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 } from \"./helpers/index.js\";\n\nclass SustainableWebDesign {\n constructor(options) {\n this.options = options;\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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 {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 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 if (segmentResults) {\n return { ...co2ValuesbyComponent, total: co2ValuesSum };\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\nexport { SustainableWebDesign };\nexport default SustainableWebDesign;\n", "\"use strict\";\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerByte\n * @property {number} co2 - The CO2 estimate in grams/kilowatt-hour\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariables} variables - The variables used to calculate the CO2 estimate\n */\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerVisit\n * @property {number} co2 - The CO2 estimate in grams/kilowatt-hour\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariables} variables - The variables used to calculate the CO2 estimate\n */\n\n/**\n * @typedef {Object} TraceResultVariablesPerByte\n * @property {GridIntensityVariables} gridIntensity - The grid intensity related variables\n */\n/**\n * @typedef {Object} TraceResultVariablesPerVisit\n * @property {GridIntensityVariables} gridIntensity - The grid intensity related variables\n * @property {number} dataReloadRatio - What percentage of a page is reloaded on each subsequent page view\n * @property {number} firstVisitPercentage - What percentage of visits are loading this page for subsequent times\n * @property {number} returnVisitPercentage - What percentage of visits are loading this page for the second or more time\n */\n\n/**\n * @typedef {Object} GridIntensityVariables\n * @property {string} description - The description of the variables\n * @property {number} network - The network grid intensity set by the user or the default\n * @property {number} dataCenter - The data center grid intensity set by the user or the default\n * @property {number} device - The device grid intensity set by the user or the default\n * @property {number} production - The production grid intensity set by the user or the default\n */\n\nimport OneByte from \"./1byte.js\";\nimport SustainableWebDesign from \"./sustainable-web-design.js\";\n\nimport {\n GLOBAL_GRID_INTENSITY,\n RENEWABLES_GRID_INTENSITY,\n} from \"./constants/index.js\";\nimport { parseOptions } from \"./helpers/index.js\";\n\nclass CO2 {\n constructor(options) {\n this.model = new SustainableWebDesign();\n // Using optional chaining allows an empty object to be passed\n // in without breaking the code.\n if (options?.model === \"1byte\") {\n this.model = new OneByte();\n } else if (options?.model === \"swd\") {\n this.model = new SustainableWebDesign();\n } else if (options?.model) {\n throw new Error(\n `\"${options.model}\" is not a valid model. Please use \"1byte\" for the OneByte model, and \"swd\" for the Sustainable Web Design model.\\nSee https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`\n );\n }\n\n /** @private */\n this._segment = options?.results === \"segment\";\n }\n\n /**\n * Accept a figure in bytes for data transfer, and a boolean for whether\n * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding\n * the data transfer.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @return {number} the amount of CO2 in grammes\n */\n perByte(bytes, green = false) {\n return this.model.perByte(bytes, green, this._segment);\n }\n\n /**\n * Accept a figure in bytes for data transfer, and a boolean for whether\n * the domain shows as 'green', and return a CO2 figure for energy used to shift the corresponding\n * the data transfer.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @return {number} the amount of CO2 in grammes\n */\n perVisit(bytes, green = false) {\n if (this.model?.perVisit) {\n return this.model.perVisit(bytes, green, this._segment);\n } else {\n throw new Error(\n `The perVisit() method is not supported in the model you are using. Try using perByte() instead.\\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n\n /**\n * Accept a figure in bytes for data transfer, a boolean for whether\n * the domain shows as 'green', and an options object.\n * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @param {Object} options\n * @return {CO2EstimateTraceResultPerByte} the amount of CO2 in grammes\n */\n perByteTrace(bytes, green = false, options = {}) {\n let adjustments = {};\n if (options) {\n // If there are options, parse them and add them to the model.\n adjustments = parseOptions(options);\n }\n return {\n co2: this.model.perByte(bytes, green, this._segment, adjustments),\n green,\n variables: {\n description:\n \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: {\n description:\n \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\",\n network:\n adjustments?.gridIntensity?.network?.value ?? GLOBAL_GRID_INTENSITY,\n dataCenter: green\n ? RENEWABLES_GRID_INTENSITY\n : adjustments?.gridIntensity?.dataCenter?.value ??\n GLOBAL_GRID_INTENSITY,\n production: GLOBAL_GRID_INTENSITY,\n device:\n adjustments?.gridIntensity?.device?.value ?? GLOBAL_GRID_INTENSITY,\n },\n },\n };\n }\n\n /**\n * Accept a figure in bytes for data transfer, a boolean for whether\n * the domain shows as 'green', and an options object.\n * Returns an object containing CO2 figure, green boolean, and object of the variables used in calculating the CO2 figure.\n *\n * @param {number} bytes\n * @param {boolean} green\n * @param {Object} options\n * @return {CO2EstimateTraceResultPerVisit} the amount of CO2 in grammes\n */\n perVisitTrace(bytes, green = false, options = {}) {\n if (this.model?.perVisit) {\n let adjustments = {};\n if (options) {\n // If there are options, parse them and add them to the model.\n adjustments = parseOptions(options);\n }\n\n return {\n co2: this.model.perVisit(bytes, green, this._segment, adjustments),\n green,\n variables: {\n description:\n \"Below are the variables used to calculate this CO2 estimate.\",\n bytes,\n gridIntensity: {\n description:\n \"The grid intensity (grams per kilowatt-hour) used to calculate this CO2 estimate.\",\n network:\n adjustments?.gridIntensity?.network?.value ??\n GLOBAL_GRID_INTENSITY,\n dataCenter: green\n ? RENEWABLES_GRID_INTENSITY\n : adjustments?.gridIntensity?.dataCenter?.value ??\n GLOBAL_GRID_INTENSITY,\n production: GLOBAL_GRID_INTENSITY,\n device:\n adjustments?.gridIntensity?.device?.value ??\n GLOBAL_GRID_INTENSITY,\n },\n dataReloadRatio: adjustments?.dataReloadRatio ?? 0.02,\n firstVisitPercentage: adjustments?.firstVisitPercentage ?? 0.75,\n returnVisitPercentage: adjustments?.returnVisitPercentage ?? 0.25,\n },\n };\n } else {\n throw new Error(\n `The perVisitDetailed() method is not supported in the model you are using. Try using perByte() instead.\\nSee https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`\n );\n }\n }\n\n perDomain(pageXray, greenDomains) {\n const co2PerDomain = [];\n for (let domain of Object.keys(pageXray.domains)) {\n let co2;\n if (greenDomains && greenDomains.indexOf(domain) > -1) {\n co2 = this.perByte(pageXray.domains[domain].transferSize, true);\n } else {\n co2 = this.perByte(pageXray.domains[domain].transferSize);\n }\n co2PerDomain.push({\n domain,\n co2,\n transferSize: pageXray.domains[domain].transferSize,\n });\n }\n co2PerDomain.sort((a, b) => b.co2 - a.co2);\n\n return co2PerDomain;\n }\n\n perPage(pageXray, green) {\n // Accept an xray object, and if we receive a boolean as the second\n // argument, we assume every request we make is sent to a server\n // running on renwewable power.\n\n // if we receive an array of domains, return a number accounting the\n // reduced CO2 from green hosted domains\n\n const domainCO2 = this.perDomain(pageXray, green);\n let totalCO2 = 0;\n for (let domain of domainCO2) {\n totalCO2 += domain.co2;\n }\n return totalCO2;\n }\n\n perContentType(pageXray, greenDomains) {\n const co2PerContentType = {};\n for (let asset of pageXray.assets) {\n const domain = new URL(asset.url).domain;\n const transferSize = asset.transferSize;\n const co2ForTransfer = this.perByte(\n transferSize,\n greenDomains && greenDomains.indexOf(domain) > -1\n );\n const contentType = asset.type;\n if (!co2PerContentType[contentType]) {\n co2PerContentType[contentType] = { co2: 0, transferSize: 0 };\n }\n co2PerContentType[contentType].co2 += co2ForTransfer;\n co2PerContentType[contentType].transferSize += transferSize;\n }\n // restructure and sort\n const all = [];\n for (let type of Object.keys(co2PerContentType)) {\n all.push({\n type,\n co2: co2PerContentType[type].co2,\n transferSize: co2PerContentType[type].transferSize,\n });\n }\n all.sort((a, b) => b.co2 - a.co2);\n return all;\n }\n\n dirtiestResources(pageXray, greenDomains) {\n const allAssets = [];\n for (let asset of pageXray.assets) {\n const domain = new URL(asset.url).domain;\n const transferSize = asset.transferSize;\n const co2ForTransfer = this.perByte(\n transferSize,\n greenDomains && greenDomains.indexOf(domain) > -1\n );\n allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize });\n }\n allAssets.sort((a, b) => b.co2 - a.co2);\n\n return allAssets.slice(0, allAssets.length > 10 ? 10 : allAssets.length);\n }\n\n perParty(pageXray, greenDomains) {\n let firstParty = 0;\n let thirdParty = 0;\n // calculate co2 per first/third party\n const firstPartyRegEx = pageXray.firstPartyRegEx;\n for (let d of Object.keys(pageXray.domains)) {\n if (!d.match(firstPartyRegEx)) {\n thirdParty += this.perByte(\n pageXray.domains[d].transferSize,\n greenDomains && greenDomains.indexOf(d) > -1\n );\n } else {\n firstParty += this.perByte(\n pageXray.domains[d].transferSize,\n greenDomains && greenDomains.indexOf(d) > -1\n );\n }\n }\n return { firstParty, thirdParty };\n }\n}\n\nexport { CO2 };\nexport default CO2;\n", "\"use strict\";\n\n/**\n * Check if a string or array of domains has been provided\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n */\n\nfunction check(domain) {\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return checkAgainstAPI(domain);\n } else {\n return checkDomainsAgainstAPI(domain);\n }\n}\n\n/**\n * Check if a domain is hosted by a green web host by querying the Green Web Foundation API.\n * @param {string} domain - The domain to check.\n * @returns {boolean} - A boolean indicating whether the domain is hosted by a green web host.\n */\nasync function checkAgainstAPI(domain) {\n const req = await fetch(\n `https://api.thegreenwebfoundation.org/greencheck/${domain}`\n );\n const res = await req.json();\n return res.green;\n}\n\n/**\n * Check if an array of domains is hosted by a green web host by querying the Green Web Foundation API.\n * @param {array} domains - An array of domains to check.\n * @returns {array} - An array of domains that are hosted by a green web host.\n */\n\nasync function checkDomainsAgainstAPI(domains) {\n try {\n const apiPath = \"https://api.thegreenwebfoundation.org/v2/greencheckmulti\";\n const domainsString = JSON.stringify(domains);\n\n const req = await fetch(`${apiPath}/${domainsString}`);\n\n const allGreenCheckResults = await req.json();\n\n return greenDomainsFromResults(allGreenCheckResults);\n } catch (e) {\n return [];\n }\n}\n\n/**\n * Extract the green domains from the results of a green check.\n * @param {object} greenResults - The results of a green check.\n * @returns {array} - An array of domains that are hosted by a green web host.\n */\nfunction greenDomainsFromResults(greenResults) {\n const entries = Object.entries(greenResults);\n const greenEntries = entries.filter(([key, val]) => val.green);\n return greenEntries.map(([key, val]) => val.url);\n}\n\nexport default {\n check,\n};\n", "\"use strict\";\n\nimport hostingAPI from \"./hosting-api.js\";\n\n/**\n * Check if a domain is hosted by a green web host.\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n * @returns {boolean|array} - A boolean if a string was provided, or an array of booleans if an array of domains was provided.\n */\nfunction check(domain) {\n return hostingAPI.check(domain);\n}\n\nexport default {\n check,\n};\n", "const data = {\"AFG\":\"414\",\"ALB\":\"0\",\"DZA\":\"528\",\"ASM\":\"753\",\"AND\":\"188\",\"AGO\":\"1476\",\"AIA\":\"753\",\"ATG\":\"753\",\"ARG\":\"478\",\"ARM\":\"390\",\"ABW\":\"753\",\"AUS\":\"808\",\"AUT\":\"242\",\"AZE\":\"534\",\"AZORES (PORTUGAL)\":\"753\",\"BHS\":\"753\",\"BHR\":\"726\",\"BGD\":\"528\",\"BRB\":\"749\",\"BLR\":\"400\",\"BEL\":\"252\",\"BLZ\":\"403\",\"BEN\":\"745\",\"BMU\":\"753\",\"BTN\":\"0\",\"BOL\":\"604\",\"BES\":\"753\",\"BIH\":\"1197\",\"BWA\":\"1486\",\"BRA\":\"284\",\"VGB\":\"753\",\"BRN\":\"681\",\"BGR\":\"911\",\"BFA\":\"753\",\"BDI\":\"414\",\"KHM\":\"1046\",\"CMR\":\"659\",\"CAN\":\"372\",\"CYM\":\"753\",\"CPV\":\"753\",\"CAF\":\"188\",\"TCD\":\"753\",\"CHANNEL ISLANDS (U.K)\":\"753\",\"CHL\":\"657\",\"CHN\":\"899\",\"COL\":\"410\",\"COM\":\"753\",\"COD\":\"0\",\"COG\":\"659\",\"COK\":\"753\",\"CRI\":\"108\",\"CIV\":\"466\",\"HRV\":\"294\",\"CUB\":\"559\",\"CUW\":\"876\",\"CYP\":\"751\",\"CZE\":\"902\",\"DNK\":\"362\",\"DJI\":\"753\",\"DMA\":\"753\",\"DOM\":\"601\",\"ECU\":\"560\",\"EGY\":\"554\",\"SLV\":\"547\",\"GNQ\":\"632\",\"ERI\":\"915\",\"EST\":\"1057\",\"SWZ\":\"0\",\"ETH\":\"0\",\"FLK\":\"753\",\"FRO\":\"753\",\"FJI\":\"640\",\"FIN\":\"267\",\"FRA\":\"158\",\"GUF\":\"423\",\"PYF\":\"753\",\"GAB\":\"946\",\"GMB\":\"753\",\"GEO\":\"289\",\"DEU\":\"650\",\"GHA\":\"495\",\"GIB\":\"779\",\"GRC\":\"507\",\"GRL\":\"264\",\"GRD\":\"753\",\"GLP\":\"753\",\"GUM\":\"753\",\"GTM\":\"798\",\"GIN\":\"753\",\"GNB\":\"753\",\"GUY\":\"847\",\"HTI\":\"1048\",\"HND\":\"662\",\"HUN\":\"296\",\"ISL\":\"0\",\"IND\":\"951\",\"IDN\":\"783\",\"IRN\":\"592\",\"IRQ\":\"1080\",\"IRL\":\"380\",\"IMN\":\"436\",\"ISR\":\"394\",\"ITA\":\"414\",\"JAM\":\"711\",\"JPN\":\"471\",\"JOR\":\"529\",\"KAZ\":\"797\",\"KEN\":\"574\",\"KIR\":\"753\",\"PRK\":\"754\",\"KOR\":\"555\",\"XKX\":\"1145\",\"KWT\":\"675\",\"KGZ\":\"217\",\"LAO\":\"1069\",\"LVA\":\"240\",\"LBN\":\"794\",\"LSO\":\"0\",\"LBR\":\"677\",\"LBY\":\"668\",\"LIE\":\"151\",\"LTU\":\"211\",\"LUX\":\"220\",\"MDG\":\"876\",\"MADEIRA (PORTUGAL)\":\"663\",\"MWI\":\"489\",\"MYS\":\"551\",\"MDV\":\"753\",\"MLI\":\"1076\",\"MLT\":\"520\",\"MHL\":\"753\",\"MTQ\":\"753\",\"MRT\":\"753\",\"MUS\":\"700\",\"MYT\":\"753\",\"MEX\":\"531\",\"FSM\":\"753\",\"MDA\":\"541\",\"MCO\":\"158\",\"MNG\":\"1366\",\"MNE\":\"899\",\"MSR\":\"753\",\"MAR\":\"729\",\"MOZ\":\"234\",\"MMR\":\"719\",\"NAM\":\"355\",\"NRU\":\"753\",\"NPL\":\"0\",\"NLD\":\"326\",\"NCL\":\"779\",\"NZL\":\"246\",\"NIC\":\"675\",\"NER\":\"772\",\"NGA\":\"526\",\"NIU\":\"753\",\"MKD\":\"851\",\"MNP\":\"753\",\"NOR\":\"47\",\"OMN\":\"479\",\"PAK\":\"592\",\"PLW\":\"753\",\"PSE\":\"719\",\"PAN\":\"477\",\"PNG\":\"597\",\"PRY\":\"0\",\"PER\":\"473\",\"PHL\":\"672\",\"POL\":\"828\",\"PRT\":\"389\",\"PRI\":\"596\",\"QAT\":\"503\",\"REU\":\"772\",\"ROU\":\"489\",\"RUS\":\"476\",\"RWA\":\"712\",\"SHN\":\"753\",\"KNA\":\"753\",\"LCA\":\"753\",\"MAF\":\"753\",\"SPM\":\"753\",\"VCT\":\"753\",\"WSM\":\"753\",\"SMR\":\"414\",\"STP\":\"753\",\"SAU\":\"592\",\"SEN\":\"870\",\"SRB\":\"1086\",\"SYC\":\"753\",\"SLE\":\"489\",\"SGP\":\"379\",\"SXM\":\"753\",\"SVK\":\"332\",\"SVN\":\"620\",\"SLB\":\"753\",\"SOM\":\"753\",\"ZAF\":\"1070\",\"SSD\":\"890\",\"ESP\":\"402\",\"LKA\":\"731\",\"SDN\":\"736\",\"SUR\":\"1029\",\"SWE\":\"68\",\"CHE\":\"48\",\"SYR\":\"713\",\"TWN\":\"484\",\"TJK\":\"255\",\"TZA\":\"531\",\"THA\":\"450\",\"TLS\":\"753\",\"TGO\":\"859\",\"TON\":\"753\",\"TTO\":\"559\",\"TUN\":\"468\",\"TUR\":\"376\",\"TKM\":\"927\",\"TCA\":\"753\",\"TUV\":\"753\",\"UGA\":\"279\",\"UKR\":\"768\",\"ARE\":\"556\",\"GBR\":\"380\",\"USA\":\"416\",\"URY\":\"174\",\"UZB\":\"612\",\"VUT\":\"753\",\"VEN\":\"711\",\"VNM\":\"560\",\"VIR\":\"650\",\"YEM\":\"807\",\"ZMB\":\"416\",\"ZWE\":\"1575\",\"MEMO: EU 27\":\"409\"}; const type = \"marginal\"; const year = \"2021\"; export { data, type, year }; export default { data, type, year };"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const data = {"AFG":120.48,"AFRICA":484.16,"ALB":23.44,"DZA":498.9,"ASM":687.5,"AGO":195.98,"ATG":657.14,"ARG":344.31,"ARM":222.68,"ABW":591.4,"ASEAN":508.06,"ASIA":535.23,"AUS":501.7,"AUT":157.52,"AZE":532.9,"BHS":698.11,"BHR":494.02,"BGD":577.03,"BRB":644.86,"BLR":415.64,"BEL":165.36,"BLZ":484.38,"BEN":666.67,"BTN":24.44,"BOL":322.09,"BIH":516.01,"BWA":794.52,"BRA":102.09,"BRN":658.85,"BGR":399.57,"BFA":611.43,"BDI":250,"CPV":600,"KHM":400.46,"CMR":278.26,"CAN":125.84,"CYM":684.93,"CAF":0,"TCD":677.42,"CHL":332.61,"CHN":533.98,"COL":168.95,"COM":714.29,"COG":395.52,"COD":25.36,"COK":400,"CRI":37.21,"CIV":410.75,"HRV":246.46,"CUB":602.23,"CYP":589.35,"CZE":415.35,"DNK":180.71,"DJI":666.67,"DMA":529.41,"DOM":549.8,"ECU":188.71,"EGY":469.63,"SLV":194.23,"GNQ":492.96,"ERI":688.89,"EST":464.03,"SWZ":189.19,"ETH":25.19,"EU":
|
|
1
|
+
const data = {"AFG":120.48,"AFRICA":484.16,"ALB":23.44,"DZA":498.9,"ASM":687.5,"AGO":195.98,"ATG":657.14,"ARG":344.31,"ARM":222.68,"ABW":591.4,"ASEAN":508.06,"ASIA":535.23,"AUS":501.7,"AUT":157.52,"AZE":532.9,"BHS":698.11,"BHR":494.02,"BGD":577.03,"BRB":644.86,"BLR":415.64,"BEL":165.36,"BLZ":484.38,"BEN":666.67,"BTN":24.44,"BOL":322.09,"BIH":516.01,"BWA":794.52,"BRA":102.09,"BRN":658.85,"BGR":399.57,"BFA":611.43,"BDI":250,"CPV":600,"KHM":400.46,"CMR":278.26,"CAN":125.84,"CYM":684.93,"CAF":0,"TCD":677.42,"CHL":332.61,"CHN":533.98,"COL":168.95,"COM":714.29,"COG":395.52,"COD":25.36,"COK":400,"CRI":37.21,"CIV":410.75,"HRV":246.46,"CUB":602.23,"CYP":589.35,"CZE":415.35,"DNK":180.71,"DJI":666.67,"DMA":529.41,"DOM":549.8,"ECU":188.71,"EGY":469.63,"SLV":194.23,"GNQ":492.96,"ERI":688.89,"EST":464.03,"SWZ":189.19,"ETH":25.19,"EU":276.5,"EUROPE":297.16,"FLK":500,"FRO":428.57,"FJI":289.47,"FIN":130.98,"FRA":84.82,"GUF":254.72,"PYF":471.43,"G20":442.62,"G7":344.29,"GAB":397.38,"GMB":700,"GEO":134.83,"DEU":385.38,"GHA":361.2,"GRC":343.82,"GRL":133.33,"GRD":714.29,"GLP":623.53,"GUM":670.33,"GTM":291.55,"GIN":208.63,"GNB":750,"GUY":642.28,"HTI":606.06,"HND":373.96,"HKG":683.97,"HUN":222.97,"ISL":28.56,"IND":633.4,"IDN":619.02,"IRN":487.86,"IRQ":498.87,"IRL":346.33,"ISR":548.03,"ITA":371.69,"JAM":537.93,"JPN":494.86,"JOR":399.91,"KAZ":635.57,"KEN":100.57,"KIR":666.67,"XKX":768.73,"KWT":551.74,"KGZ":104.43,"LAO":242.18,"LATIN AMERICA AND CARIBBEAN":238.68,"LVA":181.82,"LBN":605.74,"LSO":20,"LBR":304.35,"LBY":550.42,"LTU":194.25,"LUX":168.14,"MAC":491.53,"MDG":483.25,"MWI":133.8,"MYS":543.87,"MDV":651.52,"MLI":463.13,"MLT":495,"MTQ":698.63,"MRT":526.6,"MUS":611.11,"MEX":423.81,"MIDDLE EAST":516.02,"MDA":677.18,"MNG":749.66,"MNE":399.38,"MSR":1000,"MAR":610.41,"MOZ":126.63,"MMR":344.37,"NAM":63.69,"NRU":750,"NPL":24.51,"NLD":355.78,"NCL":610.12,"NZL":97.73,"NIC":354.21,"NER":622.22,"NGA":368.11,"NORTH AMERICA":336.68,"PRK":157.79,"MKD":529.33,"NOR":28.82,"OCEANIA":449.71,"OECD":341.2,"OMN":488.27,"PAK":344.16,"PSE":465.12,"PAN":186.61,"PNG":526.75,"PRY":25.49,"PER":256.51,"POL":633.1,"PRT":234.03,"PRI":681.47,"QAT":489.88,"REU":519.03,"ROU":264.12,"RUS":363.68,"RWA":294.12,"KNA":681.82,"LCA":685.71,"SPM":800,"VCT":500,"WSM":470.59,"STP":600,"SAU":557.78,"SEN":523.13,"SRB":569.38,"SYC":615.39,"SLE":47.62,"SGP":488.78,"SVK":140.67,"SVN":237.38,"SLB":727.27,"SOM":634.15,"ZAF":708.21,"KOR":437.6,"SSD":684.21,"ESP":217.37,"LKA":463,"SDN":264.01,"SUR":356.44,"SWE":45.08,"CHE":45.62,"SYR":541.17,"TWN":560.98,"TJK":83.63,"TZA":366.75,"THA":501.57,"PHL":582.84,"TGO":460.32,"TON":625,"TTO":491.41,"TUN":469.43,"TUR":413.63,"TKM":490.19,"TCA":703.7,"UGA":52.27,"UKR":230.89,"ARE":407.98,"GBR":261.24,"USA":368.1,"URY":114.89,"UZB":505.41,"VUT":571.43,"VEN":212.48,"VNM":386.49,"VGB":714.29,"VIR":685.71,"WORLD":437.67,"YEM":543.91,"ZMB":84.7,"ZWE":392.28}; const type = "average"; export { data, type }; export default { data, type };
|
|
@@ -70,14 +70,14 @@ class SustainableWebDesign {
|
|
|
70
70
|
if (options?.gridIntensity) {
|
|
71
71
|
const { device, network, dataCenter } = options.gridIntensity;
|
|
72
72
|
|
|
73
|
-
if (device?.value) {
|
|
73
|
+
if (device?.value || device?.value === 0) {
|
|
74
74
|
deviceCarbonIntensity = device.value;
|
|
75
75
|
}
|
|
76
|
-
if (network?.value) {
|
|
76
|
+
if (network?.value || network?.value === 0) {
|
|
77
77
|
networkCarbonIntensity = network.value;
|
|
78
78
|
}
|
|
79
79
|
// If the user has set a carbon intensity value for the datacentre, then that overrides everything and is used
|
|
80
|
-
if (dataCenter?.value) {
|
|
80
|
+
if (dataCenter?.value || dataCenter?.value === 0) {
|
|
81
81
|
dataCenterCarbonIntensity = dataCenter.value;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -245,15 +245,15 @@ class SustainableWebDesign {
|
|
|
245
245
|
returnView = RETURNING_VISITOR_PERCENTAGE,
|
|
246
246
|
dataReloadRatio = PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD
|
|
247
247
|
) {
|
|
248
|
-
if (options.dataReloadRatio) {
|
|
248
|
+
if (options.dataReloadRatio || options.dataReloadRatio === 0) {
|
|
249
249
|
dataReloadRatio = options.dataReloadRatio;
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
-
if (options.firstVisitPercentage) {
|
|
252
|
+
if (options.firstVisitPercentage || options.firstVisitPercentage === 0) {
|
|
253
253
|
firstView = options.firstVisitPercentage;
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
-
if (options.returnVisitPercentage) {
|
|
256
|
+
if (options.returnVisitPercentage || options.returnVisitPercentage === 0) {
|
|
257
257
|
returnView = options.returnVisitPercentage;
|
|
258
258
|
}
|
|
259
259
|
|