@tgwf/co2 0.18.1-0 → 0.19.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.
@@ -40,8 +40,8 @@ const processResponse = (res, verbose = false) => {
40
40
  return {
41
41
  success: true,
42
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
43
+ org: { disclosures: (_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.org) == null ? void 0 : _b.disclosures },
44
+ upstream: { services: (_d = (_c = res == null ? void 0 : res.data) == null ? void 0 : _c.upstream) == null ? void 0 : _d.services }
45
45
  };
46
46
  };
47
47
  async function check(domain, options) {
@@ -50,16 +50,25 @@ async function check(domain, options) {
50
50
  }
51
51
  const agentId = options == null ? void 0 : options.userAgentIdentifier;
52
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),
53
+ const apiKey = (options == null ? void 0 : options.apiKey) || null;
54
+ if (!apiKey) {
55
+ throw new Error("A valid API key is required.");
56
+ }
57
+ const validatorUrl = (options == null ? void 0 : options.customValidator) || "https://carbon-txt-api.greenweb.org/api/validate/domain/";
58
+ try {
59
+ const req = await fetch(validatorUrl, {
60
+ headers: {
61
+ ...(0, import_helpers.getApiRequestHeaders)(agentId),
62
+ "x-api-key": apiKey
63
+ },
57
64
  method: "POST",
58
65
  body: JSON.stringify({ domain })
59
- }
60
- );
61
- const res = await req.json();
62
- return processResponse(res, verbose);
66
+ });
67
+ const res = await req.json();
68
+ return processResponse(res, verbose);
69
+ } catch (error) {
70
+ return { success: false, errors: [error.message] };
71
+ }
63
72
  }
64
73
  var carbon_txt_default = check;
65
74
  //# sourceMappingURL=carbon-txt.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 org: { disclosures: res?.data?.org?.disclosures },\n upstream: { services: 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.\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 * @param {string} options.customValidator - Optional. A string representing the URL of the carbon.txt validator endpoint.\n * @param {string} options.apiKey - Optional. A string representing the API key to use for the request.\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 const apiKey = options?.apiKey || null;\n\n if (!apiKey) {\n throw new Error(\"A valid API key is required.\");\n }\n\n const validatorUrl =\n options?.customValidator ||\n \"https://carbon-txt-api.greenweb.org/api/validate/domain/\";\n\n try {\n const req = await fetch(validatorUrl, {\n headers: {\n ...getApiRequestHeaders(agentId),\n \"x-api-key\": apiKey,\n },\n method: \"POST\",\n body: JSON.stringify({ domain }),\n });\n\n const res = await req.json();\n return processResponse(res, verbose);\n } catch (error) {\n return { success: false, errors: [error.message] };\n }\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,KAAK,EAAE,cAAa,sCAAK,SAAL,mBAAW,QAAX,mBAAgB,YAAY;AAAA,IAChD,UAAU,EAAE,WAAU,sCAAK,SAAL,mBAAW,aAAX,mBAAqB,SAAS;AAAA,EACtD;AACF;AAYA,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;AACpC,QAAM,UAAS,mCAAS,WAAU;AAElC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,QAAM,gBACJ,mCAAS,oBACT;AAEF,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,cAAc;AAAA,MACpC,SAAS;AAAA,QACP,OAAG,qCAAqB,OAAO;AAAA,QAC/B,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IACjC,CAAC;AAED,UAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,WAAO,gBAAgB,KAAK,OAAO;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE,SAAS,OAAO,QAAQ,CAAC,MAAM,OAAO,EAAE;AAAA,EACnD;AACF;AAEA,IAAO,qBAAQ;",
6
6
  "names": []
7
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.1-0"} ${comment}` };
200
+ return { "User-Agent": `co2js/${"0.19.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,QAAyB,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
  }
@@ -1,3 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1
20
  import { getApiRequestHeaders } from "./helpers/index.js";
2
21
  const processResponse = (res, verbose = false) => {
3
22
  var _a, _b, _c, _d;
@@ -16,8 +35,8 @@ const processResponse = (res, verbose = false) => {
16
35
  return {
17
36
  success: true,
18
37
  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
38
+ org: { disclosures: (_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.org) == null ? void 0 : _b.disclosures },
39
+ upstream: { services: (_d = (_c = res == null ? void 0 : res.data) == null ? void 0 : _c.upstream) == null ? void 0 : _d.services }
21
40
  };
22
41
  };
23
42
  async function check(domain, options) {
@@ -26,16 +45,24 @@ async function check(domain, options) {
26
45
  }
27
46
  const agentId = options == null ? void 0 : options.userAgentIdentifier;
28
47
  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),
48
+ const apiKey = (options == null ? void 0 : options.apiKey) || null;
49
+ if (!apiKey) {
50
+ throw new Error("A valid API key is required.");
51
+ }
52
+ const validatorUrl = (options == null ? void 0 : options.customValidator) || "https://carbon-txt-api.greenweb.org/api/validate/domain/";
53
+ try {
54
+ const req = await fetch(validatorUrl, {
55
+ headers: __spreadProps(__spreadValues({}, getApiRequestHeaders(agentId)), {
56
+ "x-api-key": apiKey
57
+ }),
33
58
  method: "POST",
34
59
  body: JSON.stringify({ domain })
35
- }
36
- );
37
- const res = await req.json();
38
- return processResponse(res, verbose);
60
+ });
61
+ const res = await req.json();
62
+ return processResponse(res, verbose);
63
+ } catch (error) {
64
+ return { success: false, errors: [error.message] };
65
+ }
39
66
  }
40
67
  var carbon_txt_default = check;
41
68
  export {
@@ -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.1-0", " ").concat(comment) };
167
+ return { "User-Agent": "co2js/".concat("0.19.0", " ").concat(comment) };
168
168
  }
169
169
  function outputRating(co2e, swdmVersion) {
170
170
  let {
@@ -1,6 +1,10 @@
1
1
  var __getOwnPropNames = Object.getOwnPropertyNames;
2
2
  var __commonJS = (cb, mod) => function __require() {
3
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
3
+ try {
4
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
5
+ } catch (e) {
6
+ throw mod = 0, e;
7
+ }
4
8
  };
5
9
  var require_hosting_json = __commonJS({
6
10
  "src/hosting-json.js"(exports, module) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tgwf/co2",
3
- "version": "0.18.1-0",
3
+ "version": "0.19.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",
@@ -63,7 +63,7 @@
63
63
  "devDependencies": {
64
64
  "@tgwf/url2green": "^0.4.1",
65
65
  "all-contributors-cli": "^6.26.1",
66
- "esbuild": "^0.27.3",
66
+ "esbuild": "^0.28.1",
67
67
  "esbuild-jest": "^0.5.0",
68
68
  "esbuild-plugin-glob": "^1.1.2",
69
69
  "eslint": "^8.15.0",