@tgwf/co2 0.14.4 → 0.15.0
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 +36 -0
- package/dist/cjs/co2.js +0 -74
- package/dist/cjs/co2.js.map +2 -2
- package/dist/cjs/data/average-intensities.min.js +1 -1
- package/dist/cjs/data/average-intensities.min.js.map +2 -2
- package/dist/cjs/helpers/index.js +1 -1
- package/dist/cjs/helpers/index.js.map +2 -2
- package/dist/cjs/hosting-api.js +21 -10
- package/dist/cjs/hosting-api.js.map +2 -2
- package/dist/cjs/hosting-json.js +57 -0
- package/dist/cjs/hosting-json.js.map +7 -0
- package/dist/cjs/hosting-json.node.js +1 -30
- package/dist/cjs/hosting-json.node.js.map +2 -2
- package/dist/cjs/hosting-node.js +26 -17
- package/dist/cjs/hosting-node.js.map +2 -2
- package/dist/cjs/hosting.js +2 -2
- package/dist/cjs/hosting.js.map +2 -2
- package/dist/esm/co2.js +0 -74
- package/dist/esm/data/average-intensities.min.js +1 -1
- package/dist/esm/helpers/index.js +1 -1
- package/dist/esm/hosting-api.js +18 -10
- package/dist/esm/hosting-json.js +65 -0
- package/dist/esm/hosting.js +2 -2
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -20,6 +20,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
20
20
|
|
|
21
21
|
## Released
|
|
22
22
|
|
|
23
|
+
### [0.15.0] - 2024-05-03
|
|
24
|
+
|
|
25
|
+
#### Changed
|
|
26
|
+
|
|
27
|
+
- Add access to more verbose data response from Greencheck API
|
|
28
|
+
|
|
29
|
+
#### Removed
|
|
30
|
+
|
|
31
|
+
- Removed Page X-ray specific functions:
|
|
32
|
+
- `perDomain`
|
|
33
|
+
- `perPage`
|
|
34
|
+
- `perContentType`
|
|
35
|
+
- `dirtiestResources`
|
|
36
|
+
- `perParty`
|
|
37
|
+
|
|
38
|
+
### [0.14.4] - 2024-03-08
|
|
39
|
+
|
|
40
|
+
#### Changed
|
|
41
|
+
|
|
42
|
+
- Automated monthly update of annual average grid intensity data.
|
|
43
|
+
|
|
44
|
+
#### Deprecated
|
|
45
|
+
|
|
46
|
+
- Removing Page X-ray specific functions:
|
|
47
|
+
- `perDomain`
|
|
48
|
+
- `perPage`
|
|
49
|
+
- `perContentType`
|
|
50
|
+
- `dirtiestResources`
|
|
51
|
+
- `perParty`
|
|
52
|
+
|
|
53
|
+
### [0.14.3] - 2024-02-21
|
|
54
|
+
|
|
55
|
+
#### Changed
|
|
56
|
+
|
|
57
|
+
- Automated monthly update of annual average grid intensity data.
|
|
58
|
+
|
|
23
59
|
### [0.14.2] - 2024-01-29
|
|
24
60
|
|
|
25
61
|
- Adds user agent header for requests to Green Web Foundation APIs
|
package/dist/cjs/co2.js
CHANGED
|
@@ -106,80 +106,6 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
|
|
|
106
106
|
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
perDomain(pageXray, greenDomains) {
|
|
110
|
-
const co2PerDomain = [];
|
|
111
|
-
for (let domain of Object.keys(pageXray.domains)) {
|
|
112
|
-
let co2;
|
|
113
|
-
if (greenDomains && greenDomains.indexOf(domain) > -1) {
|
|
114
|
-
co2 = this.perByte(pageXray.domains[domain].transferSize, true);
|
|
115
|
-
} else {
|
|
116
|
-
co2 = this.perByte(pageXray.domains[domain].transferSize);
|
|
117
|
-
}
|
|
118
|
-
co2PerDomain.push({
|
|
119
|
-
domain,
|
|
120
|
-
co2,
|
|
121
|
-
transferSize: pageXray.domains[domain].transferSize
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
co2PerDomain.sort((a, b) => b.co2 - a.co2);
|
|
125
|
-
return co2PerDomain;
|
|
126
|
-
}
|
|
127
|
-
perPage(pageXray, green) {
|
|
128
|
-
const domainCO2 = this.perDomain(pageXray, green);
|
|
129
|
-
let totalCO2 = 0;
|
|
130
|
-
for (let domain of domainCO2) {
|
|
131
|
-
totalCO2 += domain.co2;
|
|
132
|
-
}
|
|
133
|
-
return totalCO2;
|
|
134
|
-
}
|
|
135
|
-
perContentType(pageXray, greenDomains) {
|
|
136
|
-
const co2PerContentType = {};
|
|
137
|
-
for (let asset of pageXray.assets) {
|
|
138
|
-
const domain = new URL(asset.url).domain;
|
|
139
|
-
const transferSize = asset.transferSize;
|
|
140
|
-
const co2ForTransfer = this.perByte(transferSize, greenDomains && greenDomains.indexOf(domain) > -1);
|
|
141
|
-
const contentType = asset.type;
|
|
142
|
-
if (!co2PerContentType[contentType]) {
|
|
143
|
-
co2PerContentType[contentType] = { co2: 0, transferSize: 0 };
|
|
144
|
-
}
|
|
145
|
-
co2PerContentType[contentType].co2 += co2ForTransfer;
|
|
146
|
-
co2PerContentType[contentType].transferSize += transferSize;
|
|
147
|
-
}
|
|
148
|
-
const all = [];
|
|
149
|
-
for (let type of Object.keys(co2PerContentType)) {
|
|
150
|
-
all.push({
|
|
151
|
-
type,
|
|
152
|
-
co2: co2PerContentType[type].co2,
|
|
153
|
-
transferSize: co2PerContentType[type].transferSize
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
all.sort((a, b) => b.co2 - a.co2);
|
|
157
|
-
return all;
|
|
158
|
-
}
|
|
159
|
-
dirtiestResources(pageXray, greenDomains) {
|
|
160
|
-
const allAssets = [];
|
|
161
|
-
for (let asset of pageXray.assets) {
|
|
162
|
-
const domain = new URL(asset.url).domain;
|
|
163
|
-
const transferSize = asset.transferSize;
|
|
164
|
-
const co2ForTransfer = this.perByte(transferSize, greenDomains && greenDomains.indexOf(domain) > -1);
|
|
165
|
-
allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize });
|
|
166
|
-
}
|
|
167
|
-
allAssets.sort((a, b) => b.co2 - a.co2);
|
|
168
|
-
return allAssets.slice(0, allAssets.length > 10 ? 10 : allAssets.length);
|
|
169
|
-
}
|
|
170
|
-
perParty(pageXray, greenDomains) {
|
|
171
|
-
let firstParty = 0;
|
|
172
|
-
let thirdParty = 0;
|
|
173
|
-
const firstPartyRegEx = pageXray.firstPartyRegEx;
|
|
174
|
-
for (let d of Object.keys(pageXray.domains)) {
|
|
175
|
-
if (!d.match(firstPartyRegEx)) {
|
|
176
|
-
thirdParty += this.perByte(pageXray.domains[d].transferSize, greenDomains && greenDomains.indexOf(d) > -1);
|
|
177
|
-
} else {
|
|
178
|
-
firstParty += this.perByte(pageXray.domains[d].transferSize, greenDomains && greenDomains.indexOf(d) > -1);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return { firstParty, thirdParty };
|
|
182
|
-
}
|
|
183
109
|
}
|
|
184
110
|
var co2_default = CO2;
|
|
185
111
|
//# sourceMappingURL=co2.js.map
|
package/dist/cjs/co2.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/co2.js"],
|
|
4
|
-
"sourcesContent": ["\"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"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["\"use strict\";\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerByte\n * @property {number|CO2EstimateComponentsPerByte} co2 - The CO2 estimate in grams or its separate components\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariablesPerByte} variables - The variables used to calculate the CO2 estimate\n */\n\n/**\n * @typedef {Object} CO2EstimateTraceResultPerVisit\n * @property {number|CO2EstimateComponentsPerVisit} co2 - The CO2 estimate in grams or its separate components\n * @property {boolean} green - Whether the domain is green or not\n * @property {TraceResultVariablesPerVisit} 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\n/**\n * @typedef {Object} CO2EstimateComponentsPerByte\n * @property {number} networkCO2 - The CO2 estimate for networking in grams\n * @property {number} dataCenterCO2 - The CO2 estimate for data centers in grams\n * @property {number} consumerDeviceCO2 - The CO2 estimate for consumer devices in grams\n * @property {number} productionCO2 - The CO2 estimate for device production in grams\n * @property {number} total - The total CO2 estimate in grams\n */\n\n/**\n * @typedef {Object} CO2EstimateComponentsPerVisit\n * @property {number} 'networkCO2 - first' - The CO2 estimate for networking in grams on first visit\n * @property {number} 'networkCO2 - subsequent' - The CO2 estimate for networking in grams on subsequent visits\n * @property {number} 'dataCenterCO2 - first' - The CO2 estimate for data centers in grams on first visit\n * @property {number} 'dataCenterCO2 - subsequent' - The CO2 estimate for data centers in grams on subsequent visits\n * @property {number} 'consumerDeviceCO2 - first' - The CO2 estimate for consumer devices in grams on first visit\n * @property {number} 'consumerDeviceCO2 - subsequent' - The CO2 estimate for consumer devices in grams on subsequent visits\n * @property {number} 'productionCO2 - first' - The CO2 estimate for device production in grams on first visit\n * @property {number} 'productionCO2 - subsequent' - The CO2 estimate for device production in grams on subsequent visits\n * @property {number} total - The total CO2 estimate in grams\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|CO2EstimateComponentsPerByte} the amount of CO2 in grammes or its separate components\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|CO2EstimateComponentsPerVisit} the amount of CO2 in grammes or its separate components\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\nexport { CO2 };\nexport default CO2;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DA,kBAAoB;AACpB,oCAAiC;AAEjC,uBAGO;AACP,qBAA6B;AAE7B,MAAM,IAAI;AAAA,EACR,YAAY,SAAS;AACnB,SAAK,QAAQ,IAAI,sCAAqB;AAGtC,QAAI,oCAAS,WAAU,SAAS;AAC9B,WAAK,QAAQ,IAAI,oBAAQ;AAAA,IAC3B,WAAW,oCAAS,WAAU,OAAO;AACnC,WAAK,QAAQ,IAAI,sCAAqB;AAAA,IACxC,WAAW,mCAAS,OAAO;AACzB,YAAM,IAAI,MACR,IAAI,QAAQ;AAAA,mHACd;AAAA,IACF;AAGA,SAAK,WAAW,oCAAS,aAAY;AAAA,EACvC;AAAA,EAWA,QAAQ,OAAO,QAAQ,OAAO;AAC5B,WAAO,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK,QAAQ;AAAA,EACvD;AAAA,EAWA,SAAS,OAAO,QAAQ,OAAO;AA7GjC;AA8GI,QAAI,WAAK,UAAL,mBAAY,UAAU;AACxB,aAAO,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK,QAAQ;AAAA,IACxD,OAAO;AACL,YAAM,IAAI,MACR;AAAA,qHACF;AAAA,IACF;AAAA,EACF;AAAA,EAYA,aAAa,OAAO,QAAQ,OAAO,UAAU,CAAC,GAAG;AAjInD;AAkII,QAAI,cAAc,CAAC;AACnB,QAAI,SAAS;AAEX,oBAAc,iCAAa,OAAO;AAAA,IACpC;AACA,WAAO;AAAA,MACL,KAAK,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK,UAAU,WAAW;AAAA,MAChE;AAAA,MACA,WAAW;AAAA,QACT,aACE;AAAA,QACF;AAAA,QACA,eAAe;AAAA,UACb,aACE;AAAA,UACF,SACE,wDAAa,kBAAb,mBAA4B,YAA5B,mBAAqC,UAAS;AAAA,UAChD,YAAY,QACR,6CACA,wDAAa,kBAAb,mBAA4B,eAA5B,mBAAwC,UACxC;AAAA,UACJ,YAAY;AAAA,UACZ,QACE,wDAAa,kBAAb,mBAA4B,WAA5B,mBAAoC,UAAS;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAYA,cAAc,OAAO,QAAQ,OAAO,UAAU,CAAC,GAAG;AAzKpD;AA0KI,QAAI,WAAK,UAAL,mBAAY,UAAU;AACxB,UAAI,cAAc,CAAC;AACnB,UAAI,SAAS;AAEX,sBAAc,iCAAa,OAAO;AAAA,MACpC;AAEA,aAAO;AAAA,QACL,KAAK,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK,UAAU,WAAW;AAAA,QACjE;AAAA,QACA,WAAW;AAAA,UACT,aACE;AAAA,UACF;AAAA,UACA,eAAe;AAAA,YACb,aACE;AAAA,YACF,SACE,wDAAa,kBAAb,mBAA4B,YAA5B,mBAAqC,UACrC;AAAA,YACF,YAAY,QACR,6CACA,wDAAa,kBAAb,mBAA4B,eAA5B,mBAAwC,UACxC;AAAA,YACJ,YAAY;AAAA,YACZ,QACE,wDAAa,kBAAb,mBAA4B,WAA5B,mBAAoC,UACpC;AAAA,UACJ;AAAA,UACA,iBAAiB,4CAAa,oBAAmB;AAAA,UACjD,sBAAsB,4CAAa,yBAAwB;AAAA,UAC3D,uBAAuB,4CAAa,0BAAyB;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MACR;AAAA,qHACF;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAO,cAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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":
|
|
25
|
+
const data = { "AFG": 132.53, "AFRICA": 559.42, "ALB": 24.29, "DZA": 634.61, "ASM": 611.11, "AGO": 174.73, "ATG": 611.11, "ARG": 394.62, "ARM": 264.54, "ABW": 561.22, "ASEAN": 554.5, "ASIA": 591.19, "AUS": 570.35, "AUT": 110.81, "AZE": 671.39, "BHS": 660.1, "BHR": 904.62, "BGD": 678.11, "BRB": 605.51, "BLR": 441.74, "BEL": 138.11, "BLZ": 225.81, "BEN": 584.07, "BTN": 23.33, "BOL": 489.14, "BIH": 600, "BWA": 847.91, "BRA": 105.51, "BRN": 893.91, "BGR": 335.33, "BFA": 467.53, "BDI": 250, "CPV": 558.14, "KHM": 417.71, "CMR": 305.42, "CAN": 161.43, "CYM": 642.86, "CAF": 0, "TCD": 628.57, "CHL": 353.52, "CHN": 585.82, "COL": 214.88, "COM": 642.86, "COG": 700, "COD": 24.46, "COK": 250, "CRI": 26.46, "CIV": 393.89, "HRV": 204.96, "CUB": 637.61, "CYP": 534.32, "CZE": 449.72, "DNK": 151.65, "DJI": 692.31, "DMA": 529.41, "DOM": 580.78, "ECU": 150.69, "EGY": 570.13, "SLV": 116.54, "GNQ": 591.84, "ERI": 631.58, "EST": 416.67, "SWZ": 172.41, "ETH": 24.64, "EU": 243.83, "EUROPE": 327.69, "FLK": 500, "FRO": 404.76, "FJI": 288.46, "FIN": 79.16, "FRA": 56.04, "GUF": 217.82, "PYF": 442.86, "G20": 482.92, "G7": 361.52, "GAB": 491.6, "GMB": 666.67, "GEO": 167.02, "DEU": 380.95, "GHA": 484, "GRC": 336.57, "GRL": 178.57, "GRD": 640, "GLP": 500, "GUM": 622.86, "GTM": 328.27, "GIN": 236.84, "GNB": 625, "GUY": 640.35, "HTI": 567.31, "HND": 282.27, "HKG": 699.5, "HUN": 204.19, "ISL": 27.68, "IND": 705.13, "IDN": 675.93, "IRN": 665.15, "IRQ": 688.81, "IRL": 290.81, "ISR": 582.93, "ITA": 330.72, "JAM": 555.56, "JPN": 512.81, "JOR": 540.92, "KAZ": 830.41, "KEN": 83.33, "KIR": 666.67, "XKX": 894.65, "KWT": 649.2, "KGZ": 147.29, "LAO": 265.51, "LATIN AMERICA AND CARIBBEAN": 260.28, "LVA": 123.2, "LBN": 599.01, "LSO": 20, "LBR": 227.85, "LBY": 818.69, "LTU": 160.07, "LUX": 105.26, "MAC": 448.98, "MDG": 436.44, "MWI": 66.67, "MYS": 605.83, "MDV": 611.77, "MLI": 408, "MLT": 459.14, "MTQ": 523.18, "MRT": 464.71, "MUS": 632.48, "MEX": 475.36, "MIDDLE EAST": 660.46, "MDA": 648.5, "MNG": 771.8, "MNE": 417.07, "MSR": 1e3, "MAR": 662.64, "MOZ": 135.65, "MMR": 483.57, "NAM": 59.26, "NRU": 750, "NPL": 24.44, "NLD": 267.62, "NCL": 660.58, "NZL": 110.89, "NIC": 265.12, "NER": 670.89, "NGA": 516.23, "NORTH AMERICA": 356.01, "PRK": 389.59, "MKD": 565.35, "NOR": 30.08, "OCEANIA": 507.63, "OECD": 360.53, "OMN": 564.69, "PAK": 463.66, "PSE": 516.13, "PAN": 161.68, "PNG": 507.25, "PRY": 24.31, "PER": 251.74, "POL": 661.93, "PRT": 165.55, "PRI": 678.74, "QAT": 602.59, "REU": 572.82, "ROU": 240.58, "RUS": 436.28, "RWA": 316.33, "KNA": 636.36, "LCA": 666.67, "SPM": 600, "VCT": 529.41, "WSM": 473.68, "STP": 642.86, "SAU": 706.79, "SEN": 511.6, "SRB": 636.06, "SYC": 564.52, "SLE": 50, "SGP": 474, "SVK": 116.77, "SVN": 231.28, "SLB": 700, "SOM": 578.95, "ZAF": 729.67, "KOR": 441.65, "SSD": 629.03, "ESP": 174.05, "LKA": 509.78, "SDN": 263.16, "SUR": 349.28, "SWE": 40.7, "CHE": 34.84, "SYR": 701.66, "TWN": 639.53, "TJK": 116.86, "TZA": 339.25, "THA": 560.74, "PHL": 601.1, "TGO": 443.18, "TON": 625, "TTO": 681.53, "TUN": 564.62, "TUR": 464.59, "TKM": 1306.03, "TCA": 653.85, "UGA": 44.53, "UKR": 259.69, "ARE": 561.14, "GBR": 237.59, "USA": 385.98, "URY": 112.65, "UZB": 1167.6, "VUT": 571.43, "VEN": 185.8, "VNM": 409.8, "VGB": 647.06, "VIR": 632.35, "WORLD": 485.99, "YEM": 566.1, "ZMB": 111.97, "ZWE": 297.87 };
|
|
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\":
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,OAAO,EAAC,OAAM,QAAO,UAAS,QAAO,OAAM,OAAM,OAAM,QAAO,OAAM,
|
|
4
|
+
"sourcesContent": ["const data = {\"AFG\":132.53,\"AFRICA\":559.42,\"ALB\":24.29,\"DZA\":634.61,\"ASM\":611.11,\"AGO\":174.73,\"ATG\":611.11,\"ARG\":394.62,\"ARM\":264.54,\"ABW\":561.22,\"ASEAN\":554.5,\"ASIA\":591.19,\"AUS\":570.35,\"AUT\":110.81,\"AZE\":671.39,\"BHS\":660.1,\"BHR\":904.62,\"BGD\":678.11,\"BRB\":605.51,\"BLR\":441.74,\"BEL\":138.11,\"BLZ\":225.81,\"BEN\":584.07,\"BTN\":23.33,\"BOL\":489.14,\"BIH\":600,\"BWA\":847.91,\"BRA\":105.51,\"BRN\":893.91,\"BGR\":335.33,\"BFA\":467.53,\"BDI\":250,\"CPV\":558.14,\"KHM\":417.71,\"CMR\":305.42,\"CAN\":161.43,\"CYM\":642.86,\"CAF\":0,\"TCD\":628.57,\"CHL\":353.52,\"CHN\":585.82,\"COL\":214.88,\"COM\":642.86,\"COG\":700,\"COD\":24.46,\"COK\":250,\"CRI\":26.46,\"CIV\":393.89,\"HRV\":204.96,\"CUB\":637.61,\"CYP\":534.32,\"CZE\":449.72,\"DNK\":151.65,\"DJI\":692.31,\"DMA\":529.41,\"DOM\":580.78,\"ECU\":150.69,\"EGY\":570.13,\"SLV\":116.54,\"GNQ\":591.84,\"ERI\":631.58,\"EST\":416.67,\"SWZ\":172.41,\"ETH\":24.64,\"EU\":243.83,\"EUROPE\":327.69,\"FLK\":500,\"FRO\":404.76,\"FJI\":288.46,\"FIN\":79.16,\"FRA\":56.04,\"GUF\":217.82,\"PYF\":442.86,\"G20\":482.92,\"G7\":361.52,\"GAB\":491.6,\"GMB\":666.67,\"GEO\":167.02,\"DEU\":380.95,\"GHA\":484,\"GRC\":336.57,\"GRL\":178.57,\"GRD\":640,\"GLP\":500,\"GUM\":622.86,\"GTM\":328.27,\"GIN\":236.84,\"GNB\":625,\"GUY\":640.35,\"HTI\":567.31,\"HND\":282.27,\"HKG\":699.5,\"HUN\":204.19,\"ISL\":27.68,\"IND\":705.13,\"IDN\":675.93,\"IRN\":665.15,\"IRQ\":688.81,\"IRL\":290.81,\"ISR\":582.93,\"ITA\":330.72,\"JAM\":555.56,\"JPN\":512.81,\"JOR\":540.92,\"KAZ\":830.41,\"KEN\":83.33,\"KIR\":666.67,\"XKX\":894.65,\"KWT\":649.2,\"KGZ\":147.29,\"LAO\":265.51,\"LATIN AMERICA AND CARIBBEAN\":260.28,\"LVA\":123.2,\"LBN\":599.01,\"LSO\":20,\"LBR\":227.85,\"LBY\":818.69,\"LTU\":160.07,\"LUX\":105.26,\"MAC\":448.98,\"MDG\":436.44,\"MWI\":66.67,\"MYS\":605.83,\"MDV\":611.77,\"MLI\":408,\"MLT\":459.14,\"MTQ\":523.18,\"MRT\":464.71,\"MUS\":632.48,\"MEX\":475.36,\"MIDDLE EAST\":660.46,\"MDA\":648.5,\"MNG\":771.8,\"MNE\":417.07,\"MSR\":1000,\"MAR\":662.64,\"MOZ\":135.65,\"MMR\":483.57,\"NAM\":59.26,\"NRU\":750,\"NPL\":24.44,\"NLD\":267.62,\"NCL\":660.58,\"NZL\":110.89,\"NIC\":265.12,\"NER\":670.89,\"NGA\":516.23,\"NORTH AMERICA\":356.01,\"PRK\":389.59,\"MKD\":565.35,\"NOR\":30.08,\"OCEANIA\":507.63,\"OECD\":360.53,\"OMN\":564.69,\"PAK\":463.66,\"PSE\":516.13,\"PAN\":161.68,\"PNG\":507.25,\"PRY\":24.31,\"PER\":251.74,\"POL\":661.93,\"PRT\":165.55,\"PRI\":678.74,\"QAT\":602.59,\"REU\":572.82,\"ROU\":240.58,\"RUS\":436.28,\"RWA\":316.33,\"KNA\":636.36,\"LCA\":666.67,\"SPM\":600,\"VCT\":529.41,\"WSM\":473.68,\"STP\":642.86,\"SAU\":706.79,\"SEN\":511.6,\"SRB\":636.06,\"SYC\":564.52,\"SLE\":50,\"SGP\":474,\"SVK\":116.77,\"SVN\":231.28,\"SLB\":700,\"SOM\":578.95,\"ZAF\":729.67,\"KOR\":441.65,\"SSD\":629.03,\"ESP\":174.05,\"LKA\":509.78,\"SDN\":263.16,\"SUR\":349.28,\"SWE\":40.7,\"CHE\":34.84,\"SYR\":701.66,\"TWN\":639.53,\"TJK\":116.86,\"TZA\":339.25,\"THA\":560.74,\"PHL\":601.1,\"TGO\":443.18,\"TON\":625,\"TTO\":681.53,\"TUN\":564.62,\"TUR\":464.59,\"TKM\":1306.03,\"TCA\":653.85,\"UGA\":44.53,\"UKR\":259.69,\"ARE\":561.14,\"GBR\":237.59,\"USA\":385.98,\"URY\":112.65,\"UZB\":1167.6,\"VUT\":571.43,\"VEN\":185.8,\"VNM\":409.8,\"VGB\":647.06,\"VIR\":632.35,\"WORLD\":485.99,\"YEM\":566.1,\"ZMB\":111.97,\"ZWE\":297.87}; const type = \"average\"; export { data, type }; export default { data, type };"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -161,6 +161,6 @@ Falling back to default value.`);
|
|
|
161
161
|
return adjustments;
|
|
162
162
|
}
|
|
163
163
|
function getApiRequestHeaders(comment = "") {
|
|
164
|
-
return { "User-Agent": `co2js/${"0.
|
|
164
|
+
return { "User-Agent": `co2js/${"0.15.0"} ${comment}` };
|
|
165
165
|
}
|
|
166
166
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/helpers/index.js"],
|
|
4
|
-
"sourcesContent": ["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\n/**\n * Returns an object containing all the HTTP headers to use when making a request to the Green Web Foundation API.\n * @param {string} comment - Optional. The app, site, or organisation that is making the request.\n *\n * @returns {import('http').OutgoingHttpHeaders}\n */\nfunction getApiRequestHeaders(comment = \"\") {\n return { \"User-Agent\": `co2js/${process.env.CO2JS_VERSION} ${comment}` };\n}\n\nexport { formatNumber, parseOptions, getApiRequestHeaders };\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAiC;AACjC,uBAKO;
|
|
4
|
+
"sourcesContent": ["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\";\n\n// Shared type definitions to be used across different files\n\n/**\n * @typedef {Object} DomainCheckOptions options to control the behavior when checking a domain\n * @property {string} userAgentIdentifier - Optional. The app, site, or organisation that is making the request.\n * @property {boolean} verbose - Optional. Whether to return a verbose response.\n * @property {string[]} db - Optional. A database list to use for lookups.\n */\n\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\n/**\n * Returns an object containing all the HTTP headers to use when making a request to the Green Web Foundation API.\n * @param {string} comment - Optional. The app, site, or organisation that is making the request.\n *\n * @returns {import('http').OutgoingHttpHeaders}\n */\nfunction getApiRequestHeaders(comment = \"\") {\n return { \"User-Agent\": `co2js/${process.env.CO2JS_VERSION} ${comment}` };\n}\n\nexport { formatNumber, parseOptions, getApiRequestHeaders };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/hosting-api.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
18
21
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
22
|
var hosting_api_exports = {};
|
|
20
23
|
__export(hosting_api_exports, {
|
|
@@ -22,31 +25,39 @@ __export(hosting_api_exports, {
|
|
|
22
25
|
});
|
|
23
26
|
module.exports = __toCommonJS(hosting_api_exports);
|
|
24
27
|
var import_helpers = require("./helpers/index.js");
|
|
25
|
-
|
|
28
|
+
var import_hosting_json = __toESM(require("./hosting-json.js"));
|
|
29
|
+
function check(domain, optionsOrAgentId) {
|
|
30
|
+
const options = typeof optionsOrAgentId === "string" ? { userAgentIdentifier: optionsOrAgentId } : optionsOrAgentId;
|
|
31
|
+
if ((options == null ? void 0 : options.db) && options.verbose) {
|
|
32
|
+
throw new Error("verbose mode cannot be used with a local lookup database");
|
|
33
|
+
}
|
|
26
34
|
if (typeof domain === "string") {
|
|
27
|
-
return checkAgainstAPI(domain,
|
|
35
|
+
return checkAgainstAPI(domain, options);
|
|
28
36
|
} else {
|
|
29
|
-
return checkDomainsAgainstAPI(domain,
|
|
37
|
+
return checkDomainsAgainstAPI(domain, options);
|
|
30
38
|
}
|
|
31
39
|
}
|
|
32
|
-
async function checkAgainstAPI(domain,
|
|
40
|
+
async function checkAgainstAPI(domain, options = {}) {
|
|
33
41
|
const req = await fetch(`https://api.thegreenwebfoundation.org/greencheck/${domain}`, {
|
|
34
|
-
headers: (0, import_helpers.getApiRequestHeaders)(userAgentIdentifier)
|
|
42
|
+
headers: (0, import_helpers.getApiRequestHeaders)(options.userAgentIdentifier)
|
|
35
43
|
});
|
|
44
|
+
if (options == null ? void 0 : options.db) {
|
|
45
|
+
return import_hosting_json.default.check(domain, options.db);
|
|
46
|
+
}
|
|
36
47
|
const res = await req.json();
|
|
37
|
-
return res.green;
|
|
48
|
+
return options.verbose ? res : res.green;
|
|
38
49
|
}
|
|
39
|
-
async function checkDomainsAgainstAPI(domains,
|
|
50
|
+
async function checkDomainsAgainstAPI(domains, options = {}) {
|
|
40
51
|
try {
|
|
41
52
|
const apiPath = "https://api.thegreenwebfoundation.org/v2/greencheckmulti";
|
|
42
53
|
const domainsString = JSON.stringify(domains);
|
|
43
54
|
const req = await fetch(`${apiPath}/${domainsString}`, {
|
|
44
|
-
headers: (0, import_helpers.getApiRequestHeaders)(userAgentIdentifier)
|
|
55
|
+
headers: (0, import_helpers.getApiRequestHeaders)(options.userAgentIdentifier)
|
|
45
56
|
});
|
|
46
57
|
const allGreenCheckResults = await req.json();
|
|
47
|
-
return greenDomainsFromResults(allGreenCheckResults);
|
|
58
|
+
return options.verbose ? allGreenCheckResults : greenDomainsFromResults(allGreenCheckResults);
|
|
48
59
|
} catch (e) {
|
|
49
|
-
return [];
|
|
60
|
+
return options.verbose ? {} : [];
|
|
50
61
|
}
|
|
51
62
|
}
|
|
52
63
|
function greenDomainsFromResults(greenResults) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hosting-api.js"],
|
|
4
|
-
"sourcesContent": ["\"use strict\";\n\nimport { getApiRequestHeaders } from \"./helpers/index.js\";\n\n/**\n * Check if a string or array of domains
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["\"use strict\";\n\nimport { getApiRequestHeaders } from \"./helpers/index.js\";\nimport hostingJSON from \"./hosting-json.js\";\n\n/**\n * Check if a string or array of domains is hosted by a green web host by querying the Green Web Foundation API.\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n * @param {string | DomainCheckOptions} optionsOrAgentId - Optional. An object of domain check options, or a string\n * representing the app, site, or organisation that is making the request.\n */\n\nfunction check(domain, optionsOrAgentId) {\n const options =\n typeof optionsOrAgentId === \"string\"\n ? { userAgentIdentifier: optionsOrAgentId }\n : optionsOrAgentId;\n\n if (options?.db && options.verbose) {\n throw new Error(\"verbose mode cannot be used with a local lookup database\");\n }\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return checkAgainstAPI(domain, options);\n } else {\n return checkDomainsAgainstAPI(domain, options);\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 * @param {DomainCheckOptions} options\n * @returns - A boolean indicating whether the domain is hosted by a green web host if `options.verbose` is false,\n * otherwise an object representing the domain host information.\n */\nasync function checkAgainstAPI(domain, options = {}) {\n const req = await fetch(\n `https://api.thegreenwebfoundation.org/greencheck/${domain}`,\n {\n headers: getApiRequestHeaders(options.userAgentIdentifier),\n }\n );\n if (options?.db) {\n return hostingJSON.check(domain, options.db);\n }\n const res = await req.json();\n return options.verbose ? res : 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 * @param {DomainCheckOptions} options\n * @returns - An array of domains that are hosted by a green web host if `options.verbose` is false,\n * otherwise a dictionary of domain to host information.\n */\n\nasync function checkDomainsAgainstAPI(domains, options = {}) {\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 headers: getApiRequestHeaders(options.userAgentIdentifier),\n });\n\n const allGreenCheckResults = await req.json();\n\n return options.verbose\n ? allGreenCheckResults\n : greenDomainsFromResults(allGreenCheckResults);\n } catch (e) {\n return options.verbose ? {} : [];\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"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAqC;AACrC,0BAAwB;AASxB,eAAe,QAAQ,kBAAkB;AACvC,QAAM,UACJ,OAAO,qBAAqB,WACxB,EAAE,qBAAqB,iBAAiB,IACxC;AAEN,MAAI,oCAAS,OAAM,QAAQ,SAAS;AAClC,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,gBAAgB,QAAQ,OAAO;AAAA,EACxC,OAAO;AACL,WAAO,uBAAuB,QAAQ,OAAO;AAAA,EAC/C;AACF;AASA,+BAA+B,QAAQ,UAAU,CAAC,GAAG;AACnD,QAAM,MAAM,MAAM,MAChB,oDAAoD,UACpD;AAAA,IACE,SAAS,yCAAqB,QAAQ,mBAAmB;AAAA,EAC3D,CACF;AACA,MAAI,mCAAS,IAAI;AACf,WAAO,4BAAY,MAAM,QAAQ,QAAQ,EAAE;AAAA,EAC7C;AACA,QAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,SAAO,QAAQ,UAAU,MAAM,IAAI;AACrC;AAUA,sCAAsC,SAAS,UAAU,CAAC,GAAG;AAC3D,MAAI;AACF,UAAM,UAAU;AAChB,UAAM,gBAAgB,KAAK,UAAU,OAAO;AAE5C,UAAM,MAAM,MAAM,MAAM,GAAG,WAAW,iBAAiB;AAAA,MACrD,SAAS,yCAAqB,QAAQ,mBAAmB;AAAA,IAC3D,CAAC;AAED,UAAM,uBAAuB,MAAM,IAAI,KAAK;AAE5C,WAAO,QAAQ,UACX,uBACA,wBAAwB,oBAAoB;AAAA,EAClD,SAAS,GAAP;AACA,WAAO,QAAQ,UAAU,CAAC,IAAI,CAAC;AAAA,EACjC;AACF;AAOA,iCAAiC,cAAc;AAC7C,QAAM,UAAU,OAAO,QAAQ,YAAY;AAC3C,QAAM,eAAe,QAAQ,OAAO,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK;AAC7D,SAAO,aAAa,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG;AACjD;AAEA,IAAO,sBAAQ;AAAA,EACb;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
async function check(domain, db) {
|
|
3
|
+
if (typeof domain === "string") {
|
|
4
|
+
return checkInJSON(domain, db);
|
|
5
|
+
} else {
|
|
6
|
+
return checkDomainsInJSON(domain, db);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function checkInJSON(domain, db) {
|
|
10
|
+
if (db.indexOf(domain) > -1) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function greenDomainsFromResults(greenResults) {
|
|
16
|
+
const entries = Object.entries(greenResults);
|
|
17
|
+
const greenEntries = entries.filter(([key, val]) => val.green);
|
|
18
|
+
return greenEntries.map(([key, val]) => val.url);
|
|
19
|
+
}
|
|
20
|
+
function checkDomainsInJSON(domains, db) {
|
|
21
|
+
let greenDomains = [];
|
|
22
|
+
for (let domain of domains) {
|
|
23
|
+
if (db.indexOf(domain) > -1) {
|
|
24
|
+
greenDomains.push(domain);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return greenDomains;
|
|
28
|
+
}
|
|
29
|
+
function find(domain, db) {
|
|
30
|
+
if (typeof domain === "string") {
|
|
31
|
+
return findInJSON(domain, db);
|
|
32
|
+
} else {
|
|
33
|
+
return findDomainsInJSON(domain, db);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function findInJSON(domain, db) {
|
|
37
|
+
if (db.indexOf(domain) > -1) {
|
|
38
|
+
return domain;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
url: domain,
|
|
42
|
+
green: false
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function findDomainsInJSON(domains, db) {
|
|
46
|
+
const result = {};
|
|
47
|
+
for (let domain of domains) {
|
|
48
|
+
result[domain] = findInJSON(domain, db);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
module.exports = {
|
|
53
|
+
check,
|
|
54
|
+
greenDomainsFromResults,
|
|
55
|
+
find
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=hosting-json.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/hosting-json.js"],
|
|
4
|
+
"sourcesContent": ["\"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 */\nasync function check(domain, db) {\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return checkInJSON(domain, db);\n } else {\n return checkDomainsInJSON(domain, db);\n }\n}\n\n/**\n * Check if a domain is hosted by a green web host by querying the database.\n * @param {string} domain - The domain to check.\n * @param {object} db - The database to check against.\n * @returns {boolean} - A boolean indicating whether the domain is hosted by a green web host.\n */\nfunction checkInJSON(domain, db) {\n if (db.indexOf(domain) > -1) {\n return true;\n }\n return false;\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\n return greenEntries.map(([key, val]) => val.url);\n}\n\n/**\n * Check if an array of domains is hosted by a green web host by querying the database.\n * @param {array} domains - An array of domains to check.\n * @param {object} db - The database to check against.\n * @returns {array} - An array of domains that are hosted by a green web host.\n */\nfunction checkDomainsInJSON(domains, db) {\n let greenDomains = [];\n\n for (let domain of domains) {\n if (db.indexOf(domain) > -1) {\n greenDomains.push(domain);\n }\n }\n return greenDomains;\n}\n\n/**\n * Find the provided information a string or array of domains\n * @param {string|array} domain - The domain to check, or an array of domains to be checked.\n */\nfunction find(domain, db) {\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return findInJSON(domain, db);\n } else {\n return findDomainsInJSON(domain, db);\n }\n}\n\n/**\n * Check if a domain is hosted by a green web host by querying the database.\n * @param {string} domain - The domain to check.\n * @param {object} db - The database to check against.\n * @returns {object} - An object representing the domain provided host information.\n */\nfunction findInJSON(domain, db) {\n if (db.indexOf(domain) > -1) {\n return domain;\n }\n return {\n url: domain,\n green: false,\n };\n}\n\n/**\n * Check if an array of domains is hosted by a green web host by querying the database.\n * @param {array} domains - An array of domains to check.\n * @param {object} db - The database to check against.\n * @returns {array} - A dictionary of domain to provided host information.\n */\nfunction findDomainsInJSON(domains, db) {\n const result = {};\n for (let domain of domains) {\n result[domain] = findInJSON(domain, db);\n }\n return result;\n}\n\nmodule.exports = {\n check,\n greenDomainsFromResults,\n find,\n};\n"],
|
|
5
|
+
"mappings": ";AAMA,qBAAqB,QAAQ,IAAI;AAE/B,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,YAAY,QAAQ,EAAE;AAAA,EAC/B,OAAO;AACL,WAAO,mBAAmB,QAAQ,EAAE;AAAA,EACtC;AACF;AAQA,qBAAqB,QAAQ,IAAI;AAC/B,MAAI,GAAG,QAAQ,MAAM,IAAI,IAAI;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOA,iCAAiC,cAAc;AAC7C,QAAM,UAAU,OAAO,QAAQ,YAAY;AAC3C,QAAM,eAAe,QAAQ,OAAO,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK;AAE7D,SAAO,aAAa,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG;AACjD;AAQA,4BAA4B,SAAS,IAAI;AACvC,MAAI,eAAe,CAAC;AAEpB,WAAS,UAAU,SAAS;AAC1B,QAAI,GAAG,QAAQ,MAAM,IAAI,IAAI;AAC3B,mBAAa,KAAK,MAAM;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAMA,cAAc,QAAQ,IAAI;AAExB,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,WAAW,QAAQ,EAAE;AAAA,EAC9B,OAAO;AACL,WAAO,kBAAkB,QAAQ,EAAE;AAAA,EACrC;AACF;AAQA,oBAAoB,QAAQ,IAAI;AAC9B,MAAI,GAAG,QAAQ,MAAM,IAAI,IAAI;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAQA,2BAA2B,SAAS,IAAI;AACtC,QAAM,SAAS,CAAC;AAChB,WAAS,UAAU,SAAS;AAC1B,WAAO,UAAU,WAAW,QAAQ,EAAE;AAAA,EACxC;AACA,SAAO;AACT;AAEA,OAAO,UAAU;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -37,36 +37,7 @@ async function loadJSON(jsonPath) {
|
|
|
37
37
|
const jsonBuffer = jsonPath.endsWith(".gz") ? await getGzippedFileAsJson(jsonPath) : await readFile(jsonPath);
|
|
38
38
|
return JSON.parse(jsonBuffer);
|
|
39
39
|
}
|
|
40
|
-
async function check(domain, db) {
|
|
41
|
-
if (typeof domain === "string") {
|
|
42
|
-
return checkInJSON(domain, db);
|
|
43
|
-
} else {
|
|
44
|
-
return checkDomainsInJSON(domain, db);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function checkInJSON(domain, db) {
|
|
48
|
-
if (db.indexOf(domain) > -1) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
function greenDomainsFromResults(greenResults) {
|
|
54
|
-
const entries = Object.entries(greenResults);
|
|
55
|
-
const greenEntries = entries.filter(([key, val]) => val.green);
|
|
56
|
-
return greenEntries.map(([key, val]) => val.url);
|
|
57
|
-
}
|
|
58
|
-
function checkDomainsInJSON(domains, db) {
|
|
59
|
-
let greenDomains = [];
|
|
60
|
-
for (let domain of domains) {
|
|
61
|
-
if (db.indexOf(domain) > -1) {
|
|
62
|
-
greenDomains.push(domain);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return greenDomains;
|
|
66
|
-
}
|
|
67
40
|
module.exports = {
|
|
68
|
-
|
|
69
|
-
loadJSON,
|
|
70
|
-
greenDomainsFromResults
|
|
41
|
+
loadJSON
|
|
71
42
|
};
|
|
72
43
|
//# sourceMappingURL=hosting-json.node.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hosting-json.node.js"],
|
|
4
|
-
"sourcesContent": ["\"use strict\";\n\nimport fs from \"fs\";\nimport zlib from \"zlib\";\nimport { promisify } from \"util\";\n\nconst readFile = promisify(fs.readFile);\nconst gunzip = promisify(zlib.gunzip);\n\n/**\n * Converts a readable stream to a string.\n * @param {ReadableStream} stream - The readable stream to convert.\n * @returns {Promise<string>} A promise that resolves to the string representation of the stream.\n */\nasync function streamToString(stream) {\n return new Promise((resolve, reject) => {\n const chunks = [];\n stream.on(\"error\", reject);\n stream.on(\"data\", (chunk) => chunks.push(chunk));\n stream.on(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\n/**\n * Get the contents of a gzipped file as a JSON string.\n * @param {string} jsonPath - The path to the gzipped JSON file.\n * @returns {Promise<string>} A promise that resolves to the JSON string.\n */\nasync function getGzippedFileAsJson(jsonPath) {\n const readStream = fs.createReadStream(jsonPath);\n const text = await streamToString(readStream);\n const unzipped = await gunzip(text);\n return unzipped.toString();\n}\n\n/**\n * Loads JSON data from a file path.\n * @param {string} jsonPath - The path to the JSON file.\n * @returns {Promise<object>} A promise that resolves to the parsed JSON object.\n */\nasync function loadJSON(jsonPath) {\n const jsonBuffer = jsonPath.endsWith(\".gz\")\n ? await getGzippedFileAsJson(jsonPath)\n : await readFile(jsonPath);\n return JSON.parse(jsonBuffer);\n}\n\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;AAEA,gBAAe;AACf,kBAAiB;AACjB,kBAA0B;AAE1B,MAAM,WAAW,2BAAU,kBAAG,QAAQ;AACtC,MAAM,SAAS,2BAAU,oBAAK,MAAM;AAOpC,8BAA8B,QAAQ;AACpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,CAAC;AAChB,WAAO,GAAG,SAAS,MAAM;AACzB,WAAO,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AAC/C,WAAO,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EACvD,CAAC;AACH;AAOA,oCAAoC,UAAU;AAC5C,QAAM,aAAa,kBAAG,iBAAiB,QAAQ;AAC/C,QAAM,OAAO,MAAM,eAAe,UAAU;AAC5C,QAAM,WAAW,MAAM,OAAO,IAAI;AAClC,SAAO,SAAS,SAAS;AAC3B;AAOA,wBAAwB,UAAU;AAChC,QAAM,aAAa,SAAS,SAAS,KAAK,IACtC,MAAM,qBAAqB,QAAQ,IACnC,MAAM,SAAS,QAAQ;AAC3B,SAAO,KAAK,MAAM,UAAU;AAC9B;
|
|
4
|
+
"sourcesContent": ["\"use strict\";\n\nimport fs from \"fs\";\nimport zlib from \"zlib\";\nimport { promisify } from \"util\";\n\nconst readFile = promisify(fs.readFile);\nconst gunzip = promisify(zlib.gunzip);\n\n/**\n * Converts a readable stream to a string.\n * @param {ReadableStream} stream - The readable stream to convert.\n * @returns {Promise<string>} A promise that resolves to the string representation of the stream.\n */\nasync function streamToString(stream) {\n return new Promise((resolve, reject) => {\n const chunks = [];\n stream.on(\"error\", reject);\n stream.on(\"data\", (chunk) => chunks.push(chunk));\n stream.on(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\n/**\n * Get the contents of a gzipped file as a JSON string.\n * @param {string} jsonPath - The path to the gzipped JSON file.\n * @returns {Promise<string>} A promise that resolves to the JSON string.\n */\nasync function getGzippedFileAsJson(jsonPath) {\n const readStream = fs.createReadStream(jsonPath);\n const text = await streamToString(readStream);\n const unzipped = await gunzip(text);\n return unzipped.toString();\n}\n\n/**\n * Loads JSON data from a file path.\n * @param {string} jsonPath - The path to the JSON file.\n * @returns {Promise<object>} A promise that resolves to the parsed JSON object.\n */\nasync function loadJSON(jsonPath) {\n const jsonBuffer = jsonPath.endsWith(\".gz\")\n ? await getGzippedFileAsJson(jsonPath)\n : await readFile(jsonPath);\n return JSON.parse(jsonBuffer);\n}\n\nmodule.exports = {\n loadJSON,\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;AAEA,gBAAe;AACf,kBAAiB;AACjB,kBAA0B;AAE1B,MAAM,WAAW,2BAAU,kBAAG,QAAQ;AACtC,MAAM,SAAS,2BAAU,oBAAK,MAAM;AAOpC,8BAA8B,QAAQ;AACpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,CAAC;AAChB,WAAO,GAAG,SAAS,MAAM;AACzB,WAAO,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AAC/C,WAAO,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EACvD,CAAC;AACH;AAOA,oCAAoC,UAAU;AAC5C,QAAM,aAAa,kBAAG,iBAAiB,QAAQ;AAC/C,QAAM,OAAO,MAAM,eAAe,UAAU;AAC5C,QAAM,WAAW,MAAM,OAAO,IAAI;AAClC,SAAO,SAAS,SAAS;AAC3B;AAOA,wBAAwB,UAAU;AAChC,QAAM,aAAa,SAAS,SAAS,KAAK,IACtC,MAAM,qBAAqB,QAAQ,IACnC,MAAM,SAAS,QAAQ;AAC3B,SAAO,KAAK,MAAM,UAAU;AAC9B;AAEA,OAAO,UAAU;AAAA,EACf;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/hosting-node.js
CHANGED
|
@@ -24,6 +24,7 @@ __export(hosting_node_exports, {
|
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(hosting_node_exports);
|
|
26
26
|
var import_https = __toESM(require("https"));
|
|
27
|
+
var import_hosting_json = __toESM(require("./hosting-json.js"));
|
|
27
28
|
var import_hosting_json_node = __toESM(require("./hosting-json.node.js"));
|
|
28
29
|
var import_helpers = require("./helpers/index.js");
|
|
29
30
|
async function getBody(url, userAgentIdentifier) {
|
|
@@ -41,36 +42,44 @@ async function getBody(url, userAgentIdentifier) {
|
|
|
41
42
|
req.end();
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
|
-
function check(domain,
|
|
45
|
+
function check(domain, optionsOrDb, userAgentIdentifier) {
|
|
46
|
+
let db, options = {};
|
|
47
|
+
if (!db && Array.isArray(optionsOrDb)) {
|
|
48
|
+
db = optionsOrDb;
|
|
49
|
+
} else {
|
|
50
|
+
options = optionsOrDb;
|
|
51
|
+
if (userAgentIdentifier) {
|
|
52
|
+
options = { ...options, userAgentIdentifier };
|
|
53
|
+
}
|
|
54
|
+
db = optionsOrDb == null ? void 0 : optionsOrDb.db;
|
|
55
|
+
}
|
|
56
|
+
if (db && (options == null ? void 0 : options.verbose)) {
|
|
57
|
+
throw new Error("verbose mode cannot be used with a local lookup database");
|
|
58
|
+
}
|
|
45
59
|
if (db) {
|
|
46
|
-
return
|
|
60
|
+
return import_hosting_json.default.check(domain, db);
|
|
47
61
|
}
|
|
48
62
|
if (typeof domain === "string") {
|
|
49
|
-
return checkAgainstAPI(domain,
|
|
63
|
+
return checkAgainstAPI(domain, options);
|
|
50
64
|
} else {
|
|
51
|
-
return checkDomainsAgainstAPI(domain,
|
|
65
|
+
return checkDomainsAgainstAPI(domain, options);
|
|
52
66
|
}
|
|
53
67
|
}
|
|
54
|
-
async function checkAgainstAPI(domain,
|
|
55
|
-
const res = JSON.parse(await getBody(`https://api.thegreenwebfoundation.org/greencheck/${domain}`, userAgentIdentifier));
|
|
56
|
-
return res.green;
|
|
68
|
+
async function checkAgainstAPI(domain, options = {}) {
|
|
69
|
+
const res = JSON.parse(await getBody(`https://api.thegreenwebfoundation.org/greencheck/${domain}`, options.userAgentIdentifier));
|
|
70
|
+
return options.verbose ? res : res.green;
|
|
57
71
|
}
|
|
58
|
-
async function checkDomainsAgainstAPI(domains,
|
|
72
|
+
async function checkDomainsAgainstAPI(domains, options = {}) {
|
|
59
73
|
try {
|
|
60
|
-
const allGreenCheckResults = JSON.parse(await getBody(`https://api.thegreenwebfoundation.org/v2/greencheckmulti/${JSON.stringify(domains)}`, userAgentIdentifier));
|
|
61
|
-
return
|
|
74
|
+
const allGreenCheckResults = JSON.parse(await getBody(`https://api.thegreenwebfoundation.org/v2/greencheckmulti/${JSON.stringify(domains)}`, options.userAgentIdentifier));
|
|
75
|
+
return options.verbose ? allGreenCheckResults : import_hosting_json.default.greenDomainsFromResults(allGreenCheckResults);
|
|
62
76
|
} catch (e) {
|
|
63
|
-
return [];
|
|
77
|
+
return options.verbose ? {} : [];
|
|
64
78
|
}
|
|
65
79
|
}
|
|
66
|
-
async function checkPage(pageXray, db) {
|
|
67
|
-
const domains = Object.keys(pageXray.domains);
|
|
68
|
-
return check(domains, db);
|
|
69
|
-
}
|
|
70
80
|
var hosting_node_default = {
|
|
71
81
|
check,
|
|
72
|
-
|
|
73
|
-
greendomains: import_hosting_json_node.default.greenDomainsFromResults,
|
|
82
|
+
greendomains: import_hosting_json.default.greenDomainsFromResults,
|
|
74
83
|
loadJSON: import_hosting_json_node.default.loadJSON
|
|
75
84
|
};
|
|
76
85
|
//# sourceMappingURL=hosting-node.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hosting-node.js"],
|
|
4
|
-
"sourcesContent": ["/*\n\nWe have a separate node-specific hosting.js file for node.\nThis uses the node-specific APIs for making http requests,\nand doing lookups against local JSON and sqlite databases.\nThis is used in the CommonJS build of co2.js\n\nThis lets us keep the total library small, and dependencies minimal.\n*/\n\nimport https from \"https\";\n\nimport hostingJSON from \"./hosting-json.node.js\";\nimport { getApiRequestHeaders } from \"./helpers/index.js\";\n\n/**\n * Accept a url and perform an http request, returning the body\n * for parsing as JSON.\n *\n * @param {string} url\n * @param {string} userAgentIdentifier - Optional. The app, site, or organisation that is making the request.\n * @return {string}\n */\nasync function getBody(url, userAgentIdentifier) {\n return new Promise(function (resolve, reject) {\n // Do async job\n const req = https.get(\n url,\n { headers: getApiRequestHeaders(userAgentIdentifier) },\n function (res) {\n if (res.statusCode < 200 || res.statusCode >= 300) {\n return reject(\n new Error(\n `Could not get info from: ${url}. Status Code: ${res.statusCode}`\n )\n );\n }\n const data = [];\n\n res.on(\"data\", (chunk) => {\n data.push(chunk);\n });\n\n res.on(\"end\", () => resolve(Buffer.concat(data).toString()));\n }\n );\n req.end();\n });\n}\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 * @param {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,mBAAkB;AAElB,+
|
|
4
|
+
"sourcesContent": ["/*\n\nWe have a separate node-specific hosting.js file for node.\nThis uses the node-specific APIs for making http requests,\nand doing lookups against local JSON and sqlite databases.\nThis is used in the CommonJS build of co2.js\n\nThis lets us keep the total library small, and dependencies minimal.\n*/\n\nimport https from \"https\";\n\nimport hostingJSON from \"./hosting-json.js\";\nimport hostingJSONNode from \"./hosting-json.node.js\";\nimport { getApiRequestHeaders } from \"./helpers/index.js\";\n\n/**\n * Accept a url and perform an http request, returning the body\n * for parsing as JSON.\n *\n * @param {string} url\n * @param {string} userAgentIdentifier - Optional. The app, site, or organisation that is making the request.\n * @return {string}\n */\nasync function getBody(url, userAgentIdentifier) {\n return new Promise(function (resolve, reject) {\n // Do async job\n const req = https.get(\n url,\n { headers: getApiRequestHeaders(userAgentIdentifier) },\n function (res) {\n if (res.statusCode < 200 || res.statusCode >= 300) {\n return reject(\n new Error(\n `Could not get info from: ${url}. Status Code: ${res.statusCode}`\n )\n );\n }\n const data = [];\n\n res.on(\"data\", (chunk) => {\n data.push(chunk);\n });\n\n res.on(\"end\", () => resolve(Buffer.concat(data).toString()));\n }\n );\n req.end();\n });\n}\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 * @param {string[] | DomainCheckOptions} optionsOrDb - Optional. An object of domain check options, or a database list to use for lookups.\n * @param {string } userAgentIdentifier - Optional. The app, site, or organisation that is making the request.\n * @returns - A boolean if a string was provided, or an array of booleans if an array of domains was provided.\n * if a string was provided for `domain`: a boolean indicating whether the domain is hosted by a green web host if `options.verbose` is false,\n * otherwise an object representing the domain host information.\n * if an array was provided for `domain`: an array of domains that are hosted by a green web host if `options.verbose` is false,\n * otherwise a dictionary of domain to host information.\n */\n\nfunction check(domain, optionsOrDb, userAgentIdentifier) {\n let db,\n options = {};\n if (!db && Array.isArray(optionsOrDb)) {\n db = optionsOrDb;\n } else {\n options = optionsOrDb;\n if (userAgentIdentifier) {\n options = { ...options, userAgentIdentifier };\n }\n db = optionsOrDb?.db;\n }\n\n if (db && options?.verbose) {\n throw new Error(\"verbose mode cannot be used with a local lookup database\");\n }\n if (db) {\n return hostingJSON.check(domain, db);\n }\n // is it a single domain or an array of them?\n if (typeof domain === \"string\") {\n return checkAgainstAPI(domain, options);\n } else {\n return checkDomainsAgainstAPI(domain, options);\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 * @param {DomainCheckOptions} options\n * @returns {boolean} - A boolean indicating whether the domain is hosted by a green web host if `options.verbose` is false,\n * otherwise an object representing the domain host information.\n */\nasync function checkAgainstAPI(domain, options = {}) {\n const res = JSON.parse(\n await getBody(\n `https://api.thegreenwebfoundation.org/greencheck/${domain}`,\n options.userAgentIdentifier\n )\n );\n return options.verbose ? res : 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 * @param {DomainCheckOptions} options\n * @returns {array} - An array of domains that are hosted by a green web host if `options.verbose` is false,\n * otherwise a dictionary of domain to host information.\n */\nasync function checkDomainsAgainstAPI(domains, options = {}) {\n try {\n const allGreenCheckResults = JSON.parse(\n await getBody(\n `https://api.thegreenwebfoundation.org/v2/greencheckmulti/${JSON.stringify(\n domains\n )}`,\n options.userAgentIdentifier\n )\n );\n return options.verbose\n ? allGreenCheckResults\n : hostingJSON.greenDomainsFromResults(allGreenCheckResults);\n } catch (e) {\n return options.verbose ? {} : [];\n }\n}\n\nexport default {\n check,\n greendomains: hostingJSON.greenDomainsFromResults,\n loadJSON: hostingJSONNode.loadJSON,\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,mBAAkB;AAElB,0BAAwB;AACxB,+BAA4B;AAC5B,qBAAqC;AAUrC,uBAAuB,KAAK,qBAAqB;AAC/C,SAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;AAE5C,UAAM,MAAM,qBAAM,IAChB,KACA,EAAE,SAAS,yCAAqB,mBAAmB,EAAE,GACrD,SAAU,KAAK;AACb,UAAI,IAAI,aAAa,OAAO,IAAI,cAAc,KAAK;AACjD,eAAO,OACL,IAAI,MACF,4BAA4B,qBAAqB,IAAI,YACvD,CACF;AAAA,MACF;AACA,YAAM,OAAO,CAAC;AAEd,UAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,aAAK,KAAK,KAAK;AAAA,MACjB,CAAC;AAED,UAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,IAAI,EAAE,SAAS,CAAC,CAAC;AAAA,IAC7D,CACF;AACA,QAAI,IAAI;AAAA,EACV,CAAC;AACH;AAcA,eAAe,QAAQ,aAAa,qBAAqB;AACvD,MAAI,IACF,UAAU,CAAC;AACb,MAAI,CAAC,MAAM,MAAM,QAAQ,WAAW,GAAG;AACrC,SAAK;AAAA,EACP,OAAO;AACL,cAAU;AACV,QAAI,qBAAqB;AACvB,gBAAU,EAAE,GAAG,SAAS,oBAAoB;AAAA,IAC9C;AACA,SAAK,2CAAa;AAAA,EACpB;AAEA,MAAI,MAAM,oCAAS,UAAS;AAC1B,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,MAAI,IAAI;AACN,WAAO,4BAAY,MAAM,QAAQ,EAAE;AAAA,EACrC;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,gBAAgB,QAAQ,OAAO;AAAA,EACxC,OAAO;AACL,WAAO,uBAAuB,QAAQ,OAAO;AAAA,EAC/C;AACF;AASA,+BAA+B,QAAQ,UAAU,CAAC,GAAG;AACnD,QAAM,MAAM,KAAK,MACf,MAAM,QACJ,oDAAoD,UACpD,QAAQ,mBACV,CACF;AACA,SAAO,QAAQ,UAAU,MAAM,IAAI;AACrC;AASA,sCAAsC,SAAS,UAAU,CAAC,GAAG;AAC3D,MAAI;AACF,UAAM,uBAAuB,KAAK,MAChC,MAAM,QACJ,4DAA4D,KAAK,UAC/D,OACF,KACA,QAAQ,mBACV,CACF;AACA,WAAO,QAAQ,UACX,uBACA,4BAAY,wBAAwB,oBAAoB;AAAA,EAC9D,SAAS,GAAP;AACA,WAAO,QAAQ,UAAU,CAAC,IAAI,CAAC;AAAA,EACjC;AACF;AAEA,IAAO,uBAAQ;AAAA,EACb;AAAA,EACA,cAAc,4BAAY;AAAA,EAC1B,UAAU,iCAAgB;AAC5B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/hosting.js
CHANGED
|
@@ -25,8 +25,8 @@ __export(hosting_exports, {
|
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(hosting_exports);
|
|
27
27
|
var import_hosting_api = __toESM(require("./hosting-api.js"));
|
|
28
|
-
function check(domain,
|
|
29
|
-
return import_hosting_api.default.check(domain,
|
|
28
|
+
function check(domain, optionsOrAgentId) {
|
|
29
|
+
return import_hosting_api.default.check(domain, optionsOrAgentId);
|
|
30
30
|
}
|
|
31
31
|
var hosting_default = {
|
|
32
32
|
check
|
package/dist/cjs/hosting.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hosting.js"],
|
|
4
|
-
"sourcesContent": ["\"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 * @param {string}
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,yBAAuB;
|
|
4
|
+
"sourcesContent": ["\"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 * @param {string} optionsOrAgentId - Optional. An object of domain check options, or a string\n * representing the app, site, or organisation that is making the request.\n * @returns - A boolean if a string was provided, or an array of booleans if an array of domains was provided.\n * if a string was provided for `domain`: a boolean indicating whether the domain is hosted by a green web host if `options.verbose` is false,\n * otherwise an object representing the domain host information.\n * if an array was provided for `domain`: an array of domains that are hosted by a green web host if `options.verbose` is false,\n * otherwise a dictionary of domain to host information.\n */\nfunction check(domain, optionsOrAgentId) {\n return hostingAPI.check(domain, optionsOrAgentId);\n}\n\nexport default {\n check,\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,yBAAuB;AAavB,eAAe,QAAQ,kBAAkB;AACvC,SAAO,2BAAW,MAAM,QAAQ,gBAAgB;AAClD;AAEA,IAAO,kBAAQ;AAAA,EACb;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/co2.js
CHANGED
|
@@ -83,80 +83,6 @@ See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more ab
|
|
|
83
83
|
See https://developers.thegreenwebfoundation.org/co2js/methods/ to learn more about the methods available in CO2.js.`);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
perDomain(pageXray, greenDomains) {
|
|
87
|
-
const co2PerDomain = [];
|
|
88
|
-
for (let domain of Object.keys(pageXray.domains)) {
|
|
89
|
-
let co2;
|
|
90
|
-
if (greenDomains && greenDomains.indexOf(domain) > -1) {
|
|
91
|
-
co2 = this.perByte(pageXray.domains[domain].transferSize, true);
|
|
92
|
-
} else {
|
|
93
|
-
co2 = this.perByte(pageXray.domains[domain].transferSize);
|
|
94
|
-
}
|
|
95
|
-
co2PerDomain.push({
|
|
96
|
-
domain,
|
|
97
|
-
co2,
|
|
98
|
-
transferSize: pageXray.domains[domain].transferSize
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
co2PerDomain.sort((a, b) => b.co2 - a.co2);
|
|
102
|
-
return co2PerDomain;
|
|
103
|
-
}
|
|
104
|
-
perPage(pageXray, green) {
|
|
105
|
-
const domainCO2 = this.perDomain(pageXray, green);
|
|
106
|
-
let totalCO2 = 0;
|
|
107
|
-
for (let domain of domainCO2) {
|
|
108
|
-
totalCO2 += domain.co2;
|
|
109
|
-
}
|
|
110
|
-
return totalCO2;
|
|
111
|
-
}
|
|
112
|
-
perContentType(pageXray, greenDomains) {
|
|
113
|
-
const co2PerContentType = {};
|
|
114
|
-
for (let asset of pageXray.assets) {
|
|
115
|
-
const domain = new URL(asset.url).domain;
|
|
116
|
-
const transferSize = asset.transferSize;
|
|
117
|
-
const co2ForTransfer = this.perByte(transferSize, greenDomains && greenDomains.indexOf(domain) > -1);
|
|
118
|
-
const contentType = asset.type;
|
|
119
|
-
if (!co2PerContentType[contentType]) {
|
|
120
|
-
co2PerContentType[contentType] = { co2: 0, transferSize: 0 };
|
|
121
|
-
}
|
|
122
|
-
co2PerContentType[contentType].co2 += co2ForTransfer;
|
|
123
|
-
co2PerContentType[contentType].transferSize += transferSize;
|
|
124
|
-
}
|
|
125
|
-
const all = [];
|
|
126
|
-
for (let type of Object.keys(co2PerContentType)) {
|
|
127
|
-
all.push({
|
|
128
|
-
type,
|
|
129
|
-
co2: co2PerContentType[type].co2,
|
|
130
|
-
transferSize: co2PerContentType[type].transferSize
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
all.sort((a, b) => b.co2 - a.co2);
|
|
134
|
-
return all;
|
|
135
|
-
}
|
|
136
|
-
dirtiestResources(pageXray, greenDomains) {
|
|
137
|
-
const allAssets = [];
|
|
138
|
-
for (let asset of pageXray.assets) {
|
|
139
|
-
const domain = new URL(asset.url).domain;
|
|
140
|
-
const transferSize = asset.transferSize;
|
|
141
|
-
const co2ForTransfer = this.perByte(transferSize, greenDomains && greenDomains.indexOf(domain) > -1);
|
|
142
|
-
allAssets.push({ url: asset.url, co2: co2ForTransfer, transferSize });
|
|
143
|
-
}
|
|
144
|
-
allAssets.sort((a, b) => b.co2 - a.co2);
|
|
145
|
-
return allAssets.slice(0, allAssets.length > 10 ? 10 : allAssets.length);
|
|
146
|
-
}
|
|
147
|
-
perParty(pageXray, greenDomains) {
|
|
148
|
-
let firstParty = 0;
|
|
149
|
-
let thirdParty = 0;
|
|
150
|
-
const firstPartyRegEx = pageXray.firstPartyRegEx;
|
|
151
|
-
for (let d of Object.keys(pageXray.domains)) {
|
|
152
|
-
if (!d.match(firstPartyRegEx)) {
|
|
153
|
-
thirdParty += this.perByte(pageXray.domains[d].transferSize, greenDomains && greenDomains.indexOf(d) > -1);
|
|
154
|
-
} else {
|
|
155
|
-
firstParty += this.perByte(pageXray.domains[d].transferSize, greenDomains && greenDomains.indexOf(d) > -1);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return { firstParty, thirdParty };
|
|
159
|
-
}
|
|
160
86
|
}
|
|
161
87
|
var co2_default = CO2;
|
|
162
88
|
export {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const data = { "AFG":
|
|
1
|
+
const data = { "AFG": 132.53, "AFRICA": 559.42, "ALB": 24.29, "DZA": 634.61, "ASM": 611.11, "AGO": 174.73, "ATG": 611.11, "ARG": 394.62, "ARM": 264.54, "ABW": 561.22, "ASEAN": 554.5, "ASIA": 591.19, "AUS": 570.35, "AUT": 110.81, "AZE": 671.39, "BHS": 660.1, "BHR": 904.62, "BGD": 678.11, "BRB": 605.51, "BLR": 441.74, "BEL": 138.11, "BLZ": 225.81, "BEN": 584.07, "BTN": 23.33, "BOL": 489.14, "BIH": 600, "BWA": 847.91, "BRA": 105.51, "BRN": 893.91, "BGR": 335.33, "BFA": 467.53, "BDI": 250, "CPV": 558.14, "KHM": 417.71, "CMR": 305.42, "CAN": 161.43, "CYM": 642.86, "CAF": 0, "TCD": 628.57, "CHL": 353.52, "CHN": 585.82, "COL": 214.88, "COM": 642.86, "COG": 700, "COD": 24.46, "COK": 250, "CRI": 26.46, "CIV": 393.89, "HRV": 204.96, "CUB": 637.61, "CYP": 534.32, "CZE": 449.72, "DNK": 151.65, "DJI": 692.31, "DMA": 529.41, "DOM": 580.78, "ECU": 150.69, "EGY": 570.13, "SLV": 116.54, "GNQ": 591.84, "ERI": 631.58, "EST": 416.67, "SWZ": 172.41, "ETH": 24.64, "EU": 243.83, "EUROPE": 327.69, "FLK": 500, "FRO": 404.76, "FJI": 288.46, "FIN": 79.16, "FRA": 56.04, "GUF": 217.82, "PYF": 442.86, "G20": 482.92, "G7": 361.52, "GAB": 491.6, "GMB": 666.67, "GEO": 167.02, "DEU": 380.95, "GHA": 484, "GRC": 336.57, "GRL": 178.57, "GRD": 640, "GLP": 500, "GUM": 622.86, "GTM": 328.27, "GIN": 236.84, "GNB": 625, "GUY": 640.35, "HTI": 567.31, "HND": 282.27, "HKG": 699.5, "HUN": 204.19, "ISL": 27.68, "IND": 705.13, "IDN": 675.93, "IRN": 665.15, "IRQ": 688.81, "IRL": 290.81, "ISR": 582.93, "ITA": 330.72, "JAM": 555.56, "JPN": 512.81, "JOR": 540.92, "KAZ": 830.41, "KEN": 83.33, "KIR": 666.67, "XKX": 894.65, "KWT": 649.2, "KGZ": 147.29, "LAO": 265.51, "LATIN AMERICA AND CARIBBEAN": 260.28, "LVA": 123.2, "LBN": 599.01, "LSO": 20, "LBR": 227.85, "LBY": 818.69, "LTU": 160.07, "LUX": 105.26, "MAC": 448.98, "MDG": 436.44, "MWI": 66.67, "MYS": 605.83, "MDV": 611.77, "MLI": 408, "MLT": 459.14, "MTQ": 523.18, "MRT": 464.71, "MUS": 632.48, "MEX": 475.36, "MIDDLE EAST": 660.46, "MDA": 648.5, "MNG": 771.8, "MNE": 417.07, "MSR": 1e3, "MAR": 662.64, "MOZ": 135.65, "MMR": 483.57, "NAM": 59.26, "NRU": 750, "NPL": 24.44, "NLD": 267.62, "NCL": 660.58, "NZL": 110.89, "NIC": 265.12, "NER": 670.89, "NGA": 516.23, "NORTH AMERICA": 356.01, "PRK": 389.59, "MKD": 565.35, "NOR": 30.08, "OCEANIA": 507.63, "OECD": 360.53, "OMN": 564.69, "PAK": 463.66, "PSE": 516.13, "PAN": 161.68, "PNG": 507.25, "PRY": 24.31, "PER": 251.74, "POL": 661.93, "PRT": 165.55, "PRI": 678.74, "QAT": 602.59, "REU": 572.82, "ROU": 240.58, "RUS": 436.28, "RWA": 316.33, "KNA": 636.36, "LCA": 666.67, "SPM": 600, "VCT": 529.41, "WSM": 473.68, "STP": 642.86, "SAU": 706.79, "SEN": 511.6, "SRB": 636.06, "SYC": 564.52, "SLE": 50, "SGP": 474, "SVK": 116.77, "SVN": 231.28, "SLB": 700, "SOM": 578.95, "ZAF": 729.67, "KOR": 441.65, "SSD": 629.03, "ESP": 174.05, "LKA": 509.78, "SDN": 263.16, "SUR": 349.28, "SWE": 40.7, "CHE": 34.84, "SYR": 701.66, "TWN": 639.53, "TJK": 116.86, "TZA": 339.25, "THA": 560.74, "PHL": 601.1, "TGO": 443.18, "TON": 625, "TTO": 681.53, "TUN": 564.62, "TUR": 464.59, "TKM": 1306.03, "TCA": 653.85, "UGA": 44.53, "UKR": 259.69, "ARE": 561.14, "GBR": 237.59, "USA": 385.98, "URY": 112.65, "UZB": 1167.6, "VUT": 571.43, "VEN": 185.8, "VNM": 409.8, "VGB": 647.06, "VIR": 632.35, "WORLD": 485.99, "YEM": 566.1, "ZMB": 111.97, "ZWE": 297.87 };
|
|
2
2
|
const type = "average";
|
|
3
3
|
var average_intensities_min_default = { data, type };
|
|
4
4
|
export {
|
|
@@ -142,7 +142,7 @@ Falling back to default value.`);
|
|
|
142
142
|
return adjustments;
|
|
143
143
|
}
|
|
144
144
|
function getApiRequestHeaders(comment = "") {
|
|
145
|
-
return { "User-Agent": `co2js/${"0.
|
|
145
|
+
return { "User-Agent": `co2js/${"0.15.0"} ${comment}` };
|
|
146
146
|
}
|
|
147
147
|
export {
|
|
148
148
|
formatNumber,
|
package/dist/esm/hosting-api.js
CHANGED
|
@@ -1,30 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import { getApiRequestHeaders } from "./helpers/index.js";
|
|
3
|
-
|
|
3
|
+
import hostingJSON from "./hosting-json.js";
|
|
4
|
+
function check(domain, optionsOrAgentId) {
|
|
5
|
+
const options = typeof optionsOrAgentId === "string" ? { userAgentIdentifier: optionsOrAgentId } : optionsOrAgentId;
|
|
6
|
+
if ((options == null ? void 0 : options.db) && options.verbose) {
|
|
7
|
+
throw new Error("verbose mode cannot be used with a local lookup database");
|
|
8
|
+
}
|
|
4
9
|
if (typeof domain === "string") {
|
|
5
|
-
return checkAgainstAPI(domain,
|
|
10
|
+
return checkAgainstAPI(domain, options);
|
|
6
11
|
} else {
|
|
7
|
-
return checkDomainsAgainstAPI(domain,
|
|
12
|
+
return checkDomainsAgainstAPI(domain, options);
|
|
8
13
|
}
|
|
9
14
|
}
|
|
10
|
-
async function checkAgainstAPI(domain,
|
|
15
|
+
async function checkAgainstAPI(domain, options = {}) {
|
|
11
16
|
const req = await fetch(`https://api.thegreenwebfoundation.org/greencheck/${domain}`, {
|
|
12
|
-
headers: getApiRequestHeaders(userAgentIdentifier)
|
|
17
|
+
headers: getApiRequestHeaders(options.userAgentIdentifier)
|
|
13
18
|
});
|
|
19
|
+
if (options == null ? void 0 : options.db) {
|
|
20
|
+
return hostingJSON.check(domain, options.db);
|
|
21
|
+
}
|
|
14
22
|
const res = await req.json();
|
|
15
|
-
return res.green;
|
|
23
|
+
return options.verbose ? res : res.green;
|
|
16
24
|
}
|
|
17
|
-
async function checkDomainsAgainstAPI(domains,
|
|
25
|
+
async function checkDomainsAgainstAPI(domains, options = {}) {
|
|
18
26
|
try {
|
|
19
27
|
const apiPath = "https://api.thegreenwebfoundation.org/v2/greencheckmulti";
|
|
20
28
|
const domainsString = JSON.stringify(domains);
|
|
21
29
|
const req = await fetch(`${apiPath}/${domainsString}`, {
|
|
22
|
-
headers: getApiRequestHeaders(userAgentIdentifier)
|
|
30
|
+
headers: getApiRequestHeaders(options.userAgentIdentifier)
|
|
23
31
|
});
|
|
24
32
|
const allGreenCheckResults = await req.json();
|
|
25
|
-
return greenDomainsFromResults(allGreenCheckResults);
|
|
33
|
+
return options.verbose ? allGreenCheckResults : greenDomainsFromResults(allGreenCheckResults);
|
|
26
34
|
} catch (e) {
|
|
27
|
-
return [];
|
|
35
|
+
return options.verbose ? {} : [];
|
|
28
36
|
}
|
|
29
37
|
}
|
|
30
38
|
function greenDomainsFromResults(greenResults) {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
4
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
5
|
+
};
|
|
6
|
+
var require_hosting_json = __commonJS({
|
|
7
|
+
"src/hosting-json.js"(exports, module) {
|
|
8
|
+
async function check(domain, db) {
|
|
9
|
+
if (typeof domain === "string") {
|
|
10
|
+
return checkInJSON(domain, db);
|
|
11
|
+
} else {
|
|
12
|
+
return checkDomainsInJSON(domain, db);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function checkInJSON(domain, db) {
|
|
16
|
+
if (db.indexOf(domain) > -1) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function greenDomainsFromResults(greenResults) {
|
|
22
|
+
const entries = Object.entries(greenResults);
|
|
23
|
+
const greenEntries = entries.filter(([key, val]) => val.green);
|
|
24
|
+
return greenEntries.map(([key, val]) => val.url);
|
|
25
|
+
}
|
|
26
|
+
function checkDomainsInJSON(domains, db) {
|
|
27
|
+
let greenDomains = [];
|
|
28
|
+
for (let domain of domains) {
|
|
29
|
+
if (db.indexOf(domain) > -1) {
|
|
30
|
+
greenDomains.push(domain);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return greenDomains;
|
|
34
|
+
}
|
|
35
|
+
function find(domain, db) {
|
|
36
|
+
if (typeof domain === "string") {
|
|
37
|
+
return findInJSON(domain, db);
|
|
38
|
+
} else {
|
|
39
|
+
return findDomainsInJSON(domain, db);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function findInJSON(domain, db) {
|
|
43
|
+
if (db.indexOf(domain) > -1) {
|
|
44
|
+
return domain;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
url: domain,
|
|
48
|
+
green: false
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function findDomainsInJSON(domains, db) {
|
|
52
|
+
const result = {};
|
|
53
|
+
for (let domain of domains) {
|
|
54
|
+
result[domain] = findInJSON(domain, db);
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
module.exports = {
|
|
59
|
+
check,
|
|
60
|
+
greenDomainsFromResults,
|
|
61
|
+
find
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
export default require_hosting_json();
|
package/dist/esm/hosting.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import hostingAPI from "./hosting-api.js";
|
|
3
|
-
function check(domain,
|
|
4
|
-
return hostingAPI.check(domain,
|
|
3
|
+
function check(domain, optionsOrAgentId) {
|
|
4
|
+
return hostingAPI.check(domain, optionsOrAgentId);
|
|
5
5
|
}
|
|
6
6
|
var hosting_default = {
|
|
7
7
|
check
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tgwf/co2",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Work out the co2 of your digital services",
|
|
5
5
|
"main": "dist/cjs/index-node.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -56,7 +56,6 @@
|
|
|
56
56
|
"jest": "^28.1.0",
|
|
57
57
|
"nock": "^13.2.4",
|
|
58
58
|
"np": "^8.0.4",
|
|
59
|
-
"pagexray": "^4.4.2",
|
|
60
59
|
"prettier": "^2.6.2"
|
|
61
60
|
},
|
|
62
61
|
"jest": {
|