@tgwf/co2 0.18.0 → 0.18.1-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 CHANGED
@@ -19,6 +19,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
19
19
 
20
20
  ## Released
21
21
 
22
+ ### [0.18.0] - 2026-02-26
23
+
24
+ #### Added
25
+ * Annual grid carbon intensity, renewable percentage, carbon free percentage data from Electricity Maps for the years 2021 - 2025.
26
+
27
+ #### Changed
28
+ * Default carbon estimation model is now the Sustainaable Web Design Model version 4.
29
+
22
30
  ### [0.18.0-alpha2]
23
31
 
24
32
  #### Added
package/README.md CHANGED
@@ -12,14 +12,6 @@ One day, the internet will be powered by renewable energy. Until that day comes,
12
12
 
13
13
  ## [Documentation](https://developers.thegreenwebfoundation.org/co2js/overview/) | [Changelog](/CHANGELOG.md) | [Roadmap](https://developers.thegreenwebfoundation.org/co2js/roadmap/)
14
14
 
15
- > [!IMPORTANT]
16
- > Important note about upcoming changes in CO2.js v0.18
17
- In the next release of CO2.js (v0.18 – February 2026) we will be changing the default carbon estimation model to Sustainable Web Design Model version 4. If you are using CO2.js to perform carbon estimation, and are not explicitly declaring the model and version to use then you will be impacted by this change.
18
- >
19
- > You can install a PREVIEW release to test your code to see how this change will effect you. To do so, use the `npm install @tgwf/co2@next` command.
20
- >
21
- > We have detailed the impacts of this change for users of CO2.js in this GitHub issue – [Impact of changing from v3 to v4](https://github.com/thegreenwebfoundation/co2.js/issues/209#issuecomment-3624614392)
22
-
23
15
  ## What is CO2.js?
24
16
 
25
17
  CO2.js is a JavaScript library that enables developers a way to estimate the emissions related to use of their apps, websites, and software.
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var carbon_txt_exports = {};
20
+ __export(carbon_txt_exports, {
21
+ check: () => check,
22
+ default: () => carbon_txt_default
23
+ });
24
+ module.exports = __toCommonJS(carbon_txt_exports);
25
+ var import_helpers = require("./helpers/index.js");
26
+ const processResponse = (res, verbose = false) => {
27
+ var _a, _b, _c, _d;
28
+ if (!res.success && !res.errors) {
29
+ return {
30
+ success: false,
31
+ errors: [res.detail[0].msg]
32
+ };
33
+ }
34
+ if (verbose) {
35
+ return res;
36
+ }
37
+ if (!res.success) {
38
+ return { success: false, errors: res.errors };
39
+ }
40
+ return {
41
+ success: true,
42
+ url: res.url,
43
+ disclosures: (_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.org) == null ? void 0 : _b.disclosures,
44
+ upstream: (_d = (_c = res == null ? void 0 : res.data) == null ? void 0 : _c.upstream) == null ? void 0 : _d.services
45
+ };
46
+ };
47
+ async function check(domain, options) {
48
+ if (typeof domain !== "string") {
49
+ throw new Error("Invalid domain. Domain must be a string.");
50
+ }
51
+ const agentId = options == null ? void 0 : options.userAgentIdentifier;
52
+ const verbose = (options == null ? void 0 : options.verbose) || false;
53
+ const req = await fetch(
54
+ `https://carbon-txt-api.greenweb.org/api/validate/domain/`,
55
+ {
56
+ headers: (0, import_helpers.getApiRequestHeaders)(agentId),
57
+ method: "POST",
58
+ body: JSON.stringify({ domain })
59
+ }
60
+ );
61
+ const res = await req.json();
62
+ return processResponse(res, verbose);
63
+ }
64
+ var carbon_txt_default = check;
65
+ //# sourceMappingURL=carbon-txt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/carbon-txt.js"],
4
+ "sourcesContent": ["\"use strict\";\n\nimport { getApiRequestHeaders } from \"./helpers/index.js\";\n\n/**\n * @module carbontxt-validator\n */\n\n/**\n * Process the response from the carbon.txt validator API\n * @param {object} res - The response object from the API\n * @param {boolean} verbose - Optional. Whether to return verbose results\n * @returns {object} - The processed response object\n */\nconst processResponse = (res, verbose = false) => {\n // This captures errors when an invalid domain is sent to the API\n if (!res.success && !res.errors) {\n return {\n success: false,\n errors: [res.detail[0].msg],\n };\n }\n\n if (verbose) {\n return res;\n }\n\n if (!res.success) {\n return { success: false, errors: res.errors };\n }\n\n return {\n success: true,\n url: res.url,\n disclosures: res?.data?.org?.disclosures,\n upstream: res?.data?.upstream?.services,\n };\n};\n\n/**\n * Perform a domain lookup using the Green Web Foundation carbon.txt validator endpoint\n * @param {string} domain - The domain to check, or an array of domains to be checked.\n * @param {string} options - Optional. An object of domain check options, or a string\n * @param {string} options.userAgentIdentifier - Optional. A string representing the app, site, or organisation that is making the request.\n * @param {string} options.verbose - Optional. A boolean indicating whether to return verbose results.\n */\n\nexport async function check(domain, options) {\n if (typeof domain !== \"string\") {\n throw new Error(\"Invalid domain. Domain must be a string.\");\n }\n\n const agentId = options?.userAgentIdentifier;\n const verbose = options?.verbose || false;\n\n const req = await fetch(\n `https://carbon-txt-api.greenweb.org/api/validate/domain/`,\n {\n headers: getApiRequestHeaders(agentId),\n method: \"POST\",\n body: JSON.stringify({ domain }),\n }\n );\n\n const res = await req.json();\n return processResponse(res, verbose);\n}\n\nexport default check;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAqC;AAYrC,MAAM,kBAAkB,CAAC,KAAK,UAAU,UAAU;AAdlD;AAgBE,MAAI,CAAC,IAAI,WAAW,CAAC,IAAI,QAAQ;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,GAAG;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,IAAI,SAAS;AAChB,WAAO,EAAE,SAAS,OAAO,QAAQ,IAAI,OAAO;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,IAAI;AAAA,IACT,cAAa,sCAAK,SAAL,mBAAW,QAAX,mBAAgB;AAAA,IAC7B,WAAU,sCAAK,SAAL,mBAAW,aAAX,mBAAqB;AAAA,EACjC;AACF;AAUA,eAAsB,MAAM,QAAQ,SAAS;AAC3C,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,UAAU,mCAAS;AACzB,QAAM,WAAU,mCAAS,YAAW;AAEpC,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,MACE,aAAS,qCAAqB,OAAO;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,SAAO,gBAAgB,KAAK,OAAO;AACrC;AAEA,IAAO,qBAAQ;",
6
+ "names": []
7
+ }
@@ -197,7 +197,7 @@ Falling back to default value.`
197
197
  return adjustments;
198
198
  }
199
199
  function getApiRequestHeaders(comment = "") {
200
- return { "User-Agent": `co2js/${"0.18.0"} ${comment}` };
200
+ return { "User-Agent": `co2js/${"0.18.1-0"} ${comment}` };
201
201
  }
202
202
  function outputRating(co2e, swdmVersion) {
203
203
  let {
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/index.js"],
4
4
  "sourcesContent": ["import { averageIntensity } from \"../index.js\";\nimport {\n GLOBAL_GRID_INTENSITY as SWDM3_GLOBAL_GRID_INTENSITY,\n SWDV4,\n PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD,\n FIRST_TIME_VIEWING_PERCENTAGE,\n RETURNING_VISITOR_PERCENTAGE,\n SWDMV3_RATINGS,\n SWDMV4_RATINGS,\n} from \"../constants/index.js\";\n\nconst SWDM4_GLOBAL_GRID_INTENSITY = SWDV4.GLOBAL_GRID_INTENSITY;\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\nconst lessThanEqualTo = (num, limit) => num <= limit;\n\nfunction parseByteTraceOptions(options = {}, version = 3, green = false) {\n const globalGridIntensity =\n version === 4 ? SWDM4_GLOBAL_GRID_INTENSITY : SWDM3_GLOBAL_GRID_INTENSITY;\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 /**\n *\n * @param {string} segment The name of the segment (\"device\"|\"dataCenter\"|\"network\")\n * @param {number|object} segmentIntensity The segment intensity\n */\n function setIntensity(segment, segmentIntensity) {\n if (segmentIntensity || segmentIntensity === 0) {\n if (typeof segmentIntensity === \"object\") {\n if (!averageIntensity.data[segmentIntensity.country?.toUpperCase()]) {\n console.warn(\n `\"${segmentIntensity.country}\" is not a valid country. Please use a valid 3 digit ISO 3166 country code. \\nSee https://developers.thegreenwebfoundation.org/co2js/data/ for more information. \\nFalling back to global average grid intensity.`\n );\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity,\n };\n }\n adjustments.gridIntensity[segment] = {\n country: segmentIntensity.country,\n value: parseFloat(\n averageIntensity.data[segmentIntensity.country?.toUpperCase()]\n ),\n };\n } else if (typeof segmentIntensity === \"number\") {\n adjustments.gridIntensity[segment] = {\n value: segmentIntensity,\n };\n } else {\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity,\n };\n console.warn(\n `The ${segment} grid intensity must be a number or an object. You passed in a ${typeof segmentIntensity}. \\nFalling back to global average grid intensity.`\n );\n }\n } else {\n adjustments.gridIntensity[segment] = {\n value: globalGridIntensity,\n };\n }\n }\n\n if (options?.gridIntensity) {\n adjustments.gridIntensity = {};\n const { device, dataCenter, network } = options.gridIntensity;\n setIntensity(\"device\", device);\n setIntensity(\"dataCenter\", dataCenter);\n setIntensity(\"network\", network);\n } else {\n adjustments.gridIntensity = {\n device: { value: globalGridIntensity },\n dataCenter: { value: globalGridIntensity },\n network: { value: globalGridIntensity },\n };\n }\n\n if (\n options?.greenHostingFactor ||\n (options.greenHostingFactor === 0 && version === 4)\n ) {\n if (typeof options.greenHostingFactor === \"number\") {\n if (options.greenHostingFactor >= 0 && options.greenHostingFactor <= 1) {\n adjustments.greenHostingFactor = options.greenHostingFactor;\n } else {\n adjustments.greenHostingFactor = 0;\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.greenHostingFactor = 0;\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 } else if (version === 4) {\n adjustments.greenHostingFactor = 0;\n }\n\n if (green) {\n adjustments.greenHostingFactor = 1;\n }\n\n return adjustments;\n}\n\nfunction parseVisitTraceOptions(options = {}, version = 3, green = false) {\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 = parseByteTraceOptions(options, version, green);\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 version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\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 version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\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 } else {\n adjustments.dataReloadRatio =\n version === 3 ? PERCENTAGE_OF_DATA_LOADED_ON_SUBSEQUENT_LOAD : 0;\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 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 =\n version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\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 =\n version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\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 } else {\n adjustments.firstVisitPercentage =\n version === 3 ? FIRST_TIME_VIEWING_PERCENTAGE : 1;\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 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 =\n version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\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 =\n version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\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 } else {\n adjustments.returnVisitPercentage =\n version === 3 ? RETURNING_VISITOR_PERCENTAGE : 0;\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 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\n/**\n * Returns the SWDM rating for a given CO2e value and version of the SWDM.\n * @param {number} co2e - The CO2e value to rate.\n * @param {number} swdmVersion - The version of the SWDM to use. Defaults to version 3.\n * @returns {string} The SWDM rating.\n */\nfunction outputRating(co2e, swdmVersion) {\n let {\n FIFTH_PERCENTILE,\n TENTH_PERCENTILE,\n TWENTIETH_PERCENTILE,\n THIRTIETH_PERCENTILE,\n FORTIETH_PERCENTILE,\n FIFTIETH_PERCENTILE,\n } = SWDMV3_RATINGS;\n\n if (swdmVersion === 4) {\n FIFTH_PERCENTILE = SWDMV4_RATINGS.FIFTH_PERCENTILE;\n TENTH_PERCENTILE = SWDMV4_RATINGS.TENTH_PERCENTILE;\n TWENTIETH_PERCENTILE = SWDMV4_RATINGS.TWENTIETH_PERCENTILE;\n THIRTIETH_PERCENTILE = SWDMV4_RATINGS.THIRTIETH_PERCENTILE;\n FORTIETH_PERCENTILE = SWDMV4_RATINGS.FORTIETH_PERCENTILE;\n FIFTIETH_PERCENTILE = SWDMV4_RATINGS.FIFTIETH_PERCENTILE;\n }\n\n if (lessThanEqualTo(co2e, FIFTH_PERCENTILE)) {\n return \"A+\";\n } else if (lessThanEqualTo(co2e, TENTH_PERCENTILE)) {\n return \"A\";\n } else if (lessThanEqualTo(co2e, TWENTIETH_PERCENTILE)) {\n return \"B\";\n } else if (lessThanEqualTo(co2e, THIRTIETH_PERCENTILE)) {\n return \"C\";\n } else if (lessThanEqualTo(co2e, FORTIETH_PERCENTILE)) {\n return \"D\";\n } else if (lessThanEqualTo(co2e, FIFTIETH_PERCENTILE)) {\n return \"E\";\n } else {\n return \"F\";\n }\n}\n\nexport {\n formatNumber,\n parseByteTraceOptions,\n parseVisitTraceOptions,\n getApiRequestHeaders,\n lessThanEqualTo,\n outputRating,\n};\n"],
5
- "mappings": "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",
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAiC;AACjC,uBAQO;AAEP,MAAM,8BAA8B,uBAAM;AAU1C,MAAM,eAAe,CAAC,QAAQ,WAAW,IAAI,QAAQ,CAAC,CAAC;AAEvD,MAAM,kBAAkB,CAAC,KAAK,UAAU,OAAO;AAE/C,SAAS,sBAAsB,UAAU,CAAC,GAAG,UAAU,GAAG,QAAQ,OAAO;AACvE,QAAM,sBACJ,YAAY,IAAI,8BAA8B,iBAAAA;AAEhD,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,cAAc,CAAC;AAOrB,WAAS,aAAa,SAAS,kBAAkB;AAxCnD;AAyCI,QAAI,oBAAoB,qBAAqB,GAAG;AAC9C,UAAI,OAAO,qBAAqB,UAAU;AACxC,YAAI,CAAC,0BAAiB,MAAK,sBAAiB,YAAjB,mBAA0B,aAAa,GAAG;AACnE,kBAAQ;AAAA,YACN,IAAI,iBAAiB,OAAO;AAAA;AAAA;AAAA,UAC9B;AACA,sBAAY,cAAc,OAAO,IAAI;AAAA,YACnC,OAAO;AAAA,UACT;AAAA,QACF;AACA,oBAAY,cAAc,OAAO,IAAI;AAAA,UACnC,SAAS,iBAAiB;AAAA,UAC1B,OAAO;AAAA,YACL,0BAAiB,MAAK,sBAAiB,YAAjB,mBAA0B,aAAa;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,WAAW,OAAO,qBAAqB,UAAU;AAC/C,oBAAY,cAAc,OAAO,IAAI;AAAA,UACnC,OAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,oBAAY,cAAc,OAAO,IAAI;AAAA,UACnC,OAAO;AAAA,QACT;AACA,gBAAQ;AAAA,UACN,OAAO,OAAO,kEAAkE,OAAO,gBAAgB;AAAA;AAAA,QACzG;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,cAAc,OAAO,IAAI;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mCAAS,eAAe;AAC1B,gBAAY,gBAAgB,CAAC;AAC7B,UAAM,EAAE,QAAQ,YAAY,QAAQ,IAAI,QAAQ;AAChD,iBAAa,UAAU,MAAM;AAC7B,iBAAa,cAAc,UAAU;AACrC,iBAAa,WAAW,OAAO;AAAA,EACjC,OAAO;AACL,gBAAY,gBAAgB;AAAA,MAC1B,QAAQ,EAAE,OAAO,oBAAoB;AAAA,MACrC,YAAY,EAAE,OAAO,oBAAoB;AAAA,MACzC,SAAS,EAAE,OAAO,oBAAoB;AAAA,IACxC;AAAA,EACF;AAEA,OACE,mCAAS,uBACR,QAAQ,uBAAuB,KAAK,YAAY,GACjD;AACA,QAAI,OAAO,QAAQ,uBAAuB,UAAU;AAClD,UAAI,QAAQ,sBAAsB,KAAK,QAAQ,sBAAsB,GAAG;AACtE,oBAAY,qBAAqB,QAAQ;AAAA,MAC3C,OAAO;AACL,oBAAY,qBAAqB;AACjC,gBAAQ;AAAA,UACN,oFAAoF,QAAQ,qBAAqB;AAAA;AAAA,QACnH;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,qBAAqB;AACjC,cAAQ;AAAA,QACN,sEAAsE,OAAO,QAAQ,qBAAqB;AAAA;AAAA,MAC5G;AAAA,IACF;AAAA,EACF,WAAW,YAAY,GAAG;AACxB,gBAAY,qBAAqB;AAAA,EACnC;AAEA,MAAI,OAAO;AACT,gBAAY,qBAAqB;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAU,CAAC,GAAG,UAAU,GAAG,QAAQ,OAAO;AAExE,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,cAAc,sBAAsB,SAAS,SAAS,KAAK;AAEjE,OAAI,mCAAS,oBAAmB,QAAQ,oBAAoB,GAAG;AAC7D,QAAI,OAAO,QAAQ,oBAAoB,UAAU;AAC/C,UAAI,QAAQ,mBAAmB,KAAK,QAAQ,mBAAmB,GAAG;AAChE,oBAAY,kBAAkB,QAAQ;AAAA,MACxC,OAAO;AACL,oBAAY,kBACV,YAAY,IAAI,gEAA+C;AACjE,gBAAQ;AAAA,UACN,8EAA8E,QAAQ,eAAe;AAAA;AAAA,QACvG;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,kBACV,YAAY,IAAI,gEAA+C;AACjE,cAAQ;AAAA,QACN,gEAAgE,OAAO,QAAQ,eAAe;AAAA;AAAA,MAChG;AAAA,IACF;AAAA,EACF,OAAO;AACL,gBAAY,kBACV,YAAY,IAAI,gEAA+C;AACjE,YAAQ;AAAA,MACN,gEAAgE,OAAO,QAAQ,eAAe;AAAA;AAAA,IAChG;AAAA,EACF;AAEA,OAAI,mCAAS,yBAAwB,QAAQ,yBAAyB,GAAG;AACvE,QAAI,OAAO,QAAQ,yBAAyB,UAAU;AACpD,UACE,QAAQ,wBAAwB,KAChC,QAAQ,wBAAwB,GAChC;AACA,oBAAY,uBAAuB,QAAQ;AAAA,MAC7C,OAAO;AACL,oBAAY,uBACV,YAAY,IAAI,iDAAgC;AAClD,gBAAQ;AAAA,UACN,mFAAmF,QAAQ,oBAAoB;AAAA;AAAA,QACjH;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,uBACV,YAAY,IAAI,iDAAgC;AAClD,cAAQ;AAAA,QACN,qEAAqE,OAAO,QAAQ,oBAAoB;AAAA;AAAA,MAC1G;AAAA,IACF;AAAA,EACF,OAAO;AACL,gBAAY,uBACV,YAAY,IAAI,iDAAgC;AAClD,YAAQ;AAAA,MACN,qEAAqE,OAAO,QAAQ,oBAAoB;AAAA;AAAA,IAC1G;AAAA,EACF;AAEA,OAAI,mCAAS,0BAAyB,QAAQ,0BAA0B,GAAG;AACzE,QAAI,OAAO,QAAQ,0BAA0B,UAAU;AACrD,UACE,QAAQ,yBAAyB,KACjC,QAAQ,yBAAyB,GACjC;AACA,oBAAY,wBAAwB,QAAQ;AAAA,MAC9C,OAAO;AACL,oBAAY,wBACV,YAAY,IAAI,gDAA+B;AACjD,gBAAQ;AAAA,UACN,oFAAoF,QAAQ,qBAAqB;AAAA;AAAA,QACnH;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,wBACV,YAAY,IAAI,gDAA+B;AACjD,cAAQ;AAAA,QACN,sEAAsE,OAAO,QAAQ,qBAAqB;AAAA;AAAA,MAC5G;AAAA,IACF;AAAA,EACF,OAAO;AACL,gBAAY,wBACV,YAAY,IAAI,gDAA+B;AACjD,YAAQ;AAAA,MACN,sEAAsE,OAAO,QAAQ,qBAAqB;AAAA;AAAA,IAC5G;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,qBAAqB,UAAU,IAAI;AAC1C,SAAO,EAAE,cAAc,SAAS,UAAyB,IAAI,OAAO,GAAG;AACzE;AAQA,SAAS,aAAa,MAAM,aAAa;AACvC,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,gBAAgB,GAAG;AACrB,uBAAmB,gCAAe;AAClC,uBAAmB,gCAAe;AAClC,2BAAuB,gCAAe;AACtC,2BAAuB,gCAAe;AACtC,0BAAsB,gCAAe;AACrC,0BAAsB,gCAAe;AAAA,EACvC;AAEA,MAAI,gBAAgB,MAAM,gBAAgB,GAAG;AAC3C,WAAO;AAAA,EACT,WAAW,gBAAgB,MAAM,gBAAgB,GAAG;AAClD,WAAO;AAAA,EACT,WAAW,gBAAgB,MAAM,oBAAoB,GAAG;AACtD,WAAO;AAAA,EACT,WAAW,gBAAgB,MAAM,oBAAoB,GAAG;AACtD,WAAO;AAAA,EACT,WAAW,gBAAgB,MAAM,mBAAmB,GAAG;AACrD,WAAO;AAAA,EACT,WAAW,gBAAgB,MAAM,mBAAmB,GAAG;AACrD,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;",
6
6
  "names": ["SWDM3_GLOBAL_GRID_INTENSITY"]
7
7
  }
@@ -0,0 +1,44 @@
1
+ import { getApiRequestHeaders } from "./helpers/index.js";
2
+ const processResponse = (res, verbose = false) => {
3
+ var _a, _b, _c, _d;
4
+ if (!res.success && !res.errors) {
5
+ return {
6
+ success: false,
7
+ errors: [res.detail[0].msg]
8
+ };
9
+ }
10
+ if (verbose) {
11
+ return res;
12
+ }
13
+ if (!res.success) {
14
+ return { success: false, errors: res.errors };
15
+ }
16
+ return {
17
+ success: true,
18
+ url: res.url,
19
+ disclosures: (_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.org) == null ? void 0 : _b.disclosures,
20
+ upstream: (_d = (_c = res == null ? void 0 : res.data) == null ? void 0 : _c.upstream) == null ? void 0 : _d.services
21
+ };
22
+ };
23
+ async function check(domain, options) {
24
+ if (typeof domain !== "string") {
25
+ throw new Error("Invalid domain. Domain must be a string.");
26
+ }
27
+ const agentId = options == null ? void 0 : options.userAgentIdentifier;
28
+ const verbose = (options == null ? void 0 : options.verbose) || false;
29
+ const req = await fetch(
30
+ "https://carbon-txt-api.greenweb.org/api/validate/domain/",
31
+ {
32
+ headers: getApiRequestHeaders(agentId),
33
+ method: "POST",
34
+ body: JSON.stringify({ domain })
35
+ }
36
+ );
37
+ const res = await req.json();
38
+ return processResponse(res, verbose);
39
+ }
40
+ var carbon_txt_default = check;
41
+ export {
42
+ check,
43
+ carbon_txt_default as default
44
+ };
@@ -164,7 +164,7 @@ function parseVisitTraceOptions(options = {}, version = 3, green = false) {
164
164
  return adjustments;
165
165
  }
166
166
  function getApiRequestHeaders(comment = "") {
167
- return { "User-Agent": "co2js/".concat("0.18.0", " ").concat(comment) };
167
+ return { "User-Agent": "co2js/".concat("0.18.1-0", " ").concat(comment) };
168
168
  }
169
169
  function outputRating(co2e, swdmVersion) {
170
170
  let {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tgwf/co2",
3
- "version": "0.18.0",
3
+ "version": "0.18.1-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",
@@ -23,6 +23,10 @@
23
23
  "./hosting": {
24
24
  "import": "./dist/esm/hosting.js",
25
25
  "require": "./dist/cjs/hosting-node.js"
26
+ },
27
+ "./carbon-txt": {
28
+ "import": "./dist/esm/carbon-txt.js",
29
+ "require": "./dist/cjs/carbon-txt.js"
26
30
  }
27
31
  },
28
32
  "scripts": {