UNPKG

@tgwf/co2

Version:
21 lines (20 loc) 15.7 kB
var co2=(()=>{var I=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var F=(o,e)=>{for(var r in e)I(o,r,{get:e[r],enumerable:!0})},W=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of K(e))!w.call(o,t)&&t!==r&&I(o,t,{get:()=>e[t],enumerable:!(n=U(e,t))||n.enumerable});return o};var Y=o=>W(I({},"__esModule",{value:!0}),o);var ee={};F(ee,{averageIntensity:()=>E,co2:()=>h,default:()=>X,hosting:()=>M,marginalIntensity:()=>b});var A=4883333333333333e-25;var T=class{constructor(e){this.options=e,this.KWH_PER_BYTE_FOR_NETWORK=A}perByte(e,r){if(e<1)return 0;if(r){let t=e*72e-12*0,i=e*A*475;return t+i}let n=72e-12+A;return e*n*519}};var D=T;var m={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: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: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.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:561.02,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},k="average";var E={data:H,type:k};var V=.81,C=.52,p=.14,O=.15,S=.19,s=E.data.WORLD,f=50,y=.75,N=.25,g=.02;var R=o=>parseFloat(o.toFixed(2));function B(o){if(typeof o!="object")throw new Error("Options must be an object");let e={};if(o?.gridIntensity){e.gridIntensity={};let{device:r,dataCenter:n,network:t}=o.gridIntensity;r&&(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. See https://developers.thegreenwebfoundation.org/co2js/data/ for more information. Falling back to global average grid intensity.`),e.gridIntensity.device={value:s}),e.gridIntensity.device={country:r.country,value:parseFloat(E.data[r.country?.toUpperCase()])}):typeof r=="number"?e.gridIntensity.device={value:r}:(e.gridIntensity.device={value:s},console.warn(`The device grid intensity must be a number or an object. You passed in a ${typeof r}. Falling back to global average grid intensity.`))),n&&(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. See https://developers.thegreenwebfoundation.org/co2js/data/ for more information. Falling back to global average grid intensity.`),e.gridIntensity.dataCenter={value:s}),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:s},console.warn(`The data center grid intensity must be a number or an object. You passed in a ${typeof n}. Falling back to global average grid intensity.`))),t&&(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. See https://developers.thegreenwebfoundation.org/co2js/data/ for more information. Falling back to global average grid intensity. Falling back to global average grid intensity.`),e.gridIntensity.network={value:s}),e.gridIntensity.network={country:t.country,value:parseFloat(E.data[t.country?.toUpperCase()])}):typeof t=="number"?e.gridIntensity.network={value:t}:(e.gridIntensity.network={value:s},console.warn(`The network grid intensity must be a number or an object. You passed in a ${typeof t}. Falling back to global average grid intensity.`)))}return o?.dataReloadRatio&&(typeof o.dataReloadRatio=="number"?o.dataReloadRatio>=0&&o.dataReloadRatio<=1?e.dataReloadRatio=o.dataReloadRatio:(e.dataReloadRatio=g,console.warn(`The dataReloadRatio option must be a number between 0 and 1. You passed in ${o.dataReloadRatio}. Falling back to default value.`)):(e.dataReloadRatio=g,console.warn(`The dataReloadRatio option must be a number. You passed in a ${typeof o.dataReloadRatio}. Falling back to default value.`))),o?.firstVisitPercentage&&(typeof o.firstVisitPercentage=="number"?o.firstVisitPercentage>=0&&o.firstVisitPercentage<=1?e.firstVisitPercentage=o.firstVisitPercentage:(e.firstVisitPercentage=y,console.warn(`The firstVisitPercentage option must be a number between 0 and 1. You passed in ${o.firstVisitPercentage}. Falling back to default value.`)):(e.firstVisitPercentage=y,console.warn(`The firstVisitPercentage option must be a number. You passed in a ${typeof o.firstVisitPercentage}. Falling back to default value.`))),o?.returnVisitPercentage&&(typeof o.returnVisitPercentage=="number"?o.returnVisitPercentage>=0&&o.returnVisitPercentage<=1?e.returnVisitPercentage=o.returnVisitPercentage:(e.returnVisitPercentage=N,console.warn(`The returnVisitPercentage option must be a number between 0 and 1. You passed in ${o.returnVisitPercentage}. Falling back to default value.`)):(e.returnVisitPercentage=N,console.warn(`The returnVisitPercentage option must be a number. You passed in a ${typeof o.returnVisitPercentage}. Falling back to default value.`))),e}var _=class{constructor(e){this.options=e}energyPerByteByComponent(e){let n=e/m.GIGABYTE*V;return{consumerDeviceEnergy:n*C,networkEnergy:n*p,productionEnergy:n*S,dataCenterEnergy:n*O}}co2byComponent(e,r=s,n={}){let t=s,i=s,a=s,d=s;if(n?.gridIntensity){let{device:c,network:u,dataCenter:L}=n.gridIntensity;c?.value&&(t=c.value),u?.value&&(i=u.value),L?.value&&(a=L.value)}r===!0&&(a=f);let l={};for(let[c,u]of Object.entries(e))c.startsWith("dataCenterEnergy")?l[c.replace("Energy","CO2")]=u*a:c.startsWith("consumerDeviceEnergy")?l[c.replace("Energy","CO2")]=u*t:c.startsWith("networkEnergy")?l[c.replace("Energy","CO2")]=u*i:l[c.replace("Energy","CO2")]=u*d;return l}perByte(e,r=!1,n=!1,t={}){e<1&&(e=0);let i=this.energyPerByteByComponent(e,t);if(typeof r!="boolean")throw new Error(`perByte expects a boolean for the carbon intensity value. Received: ${r}`);let a=this.co2byComponent(i,r,t),l=Object.values(a).reduce((c,u)=>c+u);return n?{...a,total:l}:l}perVisit(e,r=!1,n=!1,t={}){let i=this.energyPerVisitByComponent(e,t);if(typeof r!="boolean")throw new Error(`perVisit expects a boolean for the carbon intensity value. Received: ${r}`);let a=this.co2byComponent(i,r,t),l=Object.values(a).reduce((c,u)=>c+u);return n?{...a,total:l}:l}energyPerByte(e){let r=this.energyPerByteByComponent(e);return Object.values(r).reduce((t,i)=>t+i)}energyPerVisitByComponent(e,r={},n=y,t=N,i=g){r.dataReloadRatio&&(i=r.dataReloadRatio),r.firstVisitPercentage&&(n=r.firstVisitPercentage),r.returnVisitPercentage&&(t=r.returnVisitPercentage);let a=this.energyPerByteByComponent(e),d={},l=Object.values(a);for(let[c,u]of Object.entries(a))d[`${c} - first`]=u*n,d[`${c} - subsequent`]=u*t*i;return d}energyPerVisit(e){let r=0,n=0,t=Object.entries(this.energyPerVisitByComponent(e));for(let[i,a]of t)i.indexOf("first")>0&&(r+=a);for(let[i,a]of t)i.indexOf("subsequent")>0&&(n+=a);return r+n}emissionsPerVisitInGrams(e,r=s){return R(e*r)}annualEnergyInKwh(e,r=1e3){return e*r*12}annualEmissionsInGrams(e,r=1e3){return e*r*12}annualSegmentEnergy(e){return{consumerDeviceEnergy:R(e*C),networkEnergy:R(e*p),dataCenterEnergy:R(e*O),productionEnergy:R(e*S)}}};var P=_;var G=class{constructor(e){if(this.model=new P,e?.model==="1byte")this.model=new D;else if(e?.model==="swd")this.model=new P;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. See https://developers.thegreenwebfoundation.org/co2js/models/ to learn more about the models available in CO2.js.`);this._segment=e?.results==="segment"}perByte(e,r=!1){return this.model.perByte(e,r,this._segment)}perVisit(e,r=!1){if(this.model?.perVisit)return this.model.perVisit(e,r,this._segment);throw new Error(`The perVisit() method is not supported in the model you are using. Try using perByte() instead. See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perByteTrace(e,r=!1,n={}){let t={};return n&&(t=B(n)),{co2:this.model.perByte(e,r,this._segment,t),green:r,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:t?.gridIntensity?.network?.value||s,dataCenter:r?f:t?.gridIntensity?.dataCenter?.value||s,production:s,device:t?.gridIntensity?.device?.value||s}}}}perVisitTrace(e,r=!1,n={}){if(this.model?.perVisit){let t={};return n&&(t=B(n)),{co2:this.model.perVisit(e,r,this._segment,t),green:r,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:t?.gridIntensity?.network?.value||s,dataCenter:r?f:t?.gridIntensity?.dataCenter?.value||s,production:s,device:t?.gridIntensity?.device?.value||s},dataReloadRatio:t?.dataReloadRatio||.02,firstVisitPercentage:t?.firstVisitPercentage||.75,returnVisitPercentage:t?.returnVisitPercentage||.25}}}else throw new Error(`The perVisitDetailed() method is not supported in the model you are using. Try using perByte() instead. See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`)}perDomain(e,r){let n=[];for(let t of Object.keys(e.domains)){let i;r&&r.indexOf(t)>-1?i=this.perByte(e.domains[t].transferSize,!0):i=this.perByte(e.domains[t].transferSize),n.push({domain:t,co2:i,transferSize:e.domains[t].transferSize})}return n.sort((t,i)=>i.co2-t.co2),n}perPage(e,r){let n=this.perDomain(e,r),t=0;for(let i of n)t+=i.co2;return t}perContentType(e,r){let n={};for(let i of e.assets){let a=new URL(i.url).domain,d=i.transferSize,l=this.perByte(d,r&&r.indexOf(a)>-1),c=i.type;n[c]||(n[c]={co2:0,transferSize:0}),n[c].co2+=l,n[c].transferSize+=d}let t=[];for(let i of Object.keys(n))t.push({type:i,co2:n[i].co2,transferSize:n[i].transferSize});return t.sort((i,a)=>a.co2-i.co2),t}dirtiestResources(e,r){let n=[];for(let t of e.assets){let i=new URL(t.url).domain,a=t.transferSize,d=this.perByte(a,r&&r.indexOf(i)>-1);n.push({url:t.url,co2:d,transferSize:a})}return n.sort((t,i)=>i.co2-t.co2),n.slice(0,n.length>10?10:n.length)}perParty(e,r){let n=0,t=0,i=e.firstPartyRegEx;for(let a of Object.keys(e.domains))a.match(i)?n+=this.perByte(e.domains[a].transferSize,r&&r.indexOf(a)>-1):t+=this.perByte(e.domains[a].transferSize,r&&r.indexOf(a)>-1);return{firstParty:n,thirdParty:t}}};var h=G;function j(o){return typeof o=="string"?x(o):Z(o)}async function x(o){return(await(await fetch(`https://api.thegreenwebfoundation.org/greencheck/${o}`)).json()).green}async function Z(o){try{let e="https://api.thegreenwebfoundation.org/v2/greencheckmulti",r=JSON.stringify(o),t=await(await fetch(`${e}/${r}`)).json();return $(t)}catch{return[]}}function $(o){return Object.entries(o).filter(([n,t])=>t.green).map(([n,t])=>t.url)}var v={check:j};function z(o){return v.check(o)}var M={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 b={data:J,type:Q,year:q};var X={co2:h,hosting:M,averageIntensity:E,marginalIntensity:b};return Y(ee);})(); //# sourceMappingURL=index.js.map