diff --git a/package-lock.json b/package-lock.json index 61d9666048bda8b73f37b759297b0536427abdee..eeeb46ccf741cd9260f5b8b9ef095fe9330c8dbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "semver": "~7.6.0", "simple-icons": "11.12.0", "smol-toml": "1.1.4", - "webextension-store-meta": "^1.1.0", + "webextension-store-meta": "^1.2.1", "xpath": "~0.0.34" }, "devDependencies": { @@ -20553,6 +20553,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -27918,7 +27919,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/tree-kill": { "version": "1.2.2", @@ -28491,6 +28493,14 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", + "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "engines": { + "node": ">=18.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -29153,16 +29163,16 @@ } }, "node_modules/webextension-store-meta": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webextension-store-meta/-/webextension-store-meta-1.1.0.tgz", - "integrity": "sha512-sEOe3Iir4PB6f/hj9fAAaesUpYLU4XIwySMdOap7JfIhL9O4fmaoTWWuj/TCzOa7UcH/6X8Mq2+HmlAAE7D0zg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/webextension-store-meta/-/webextension-store-meta-1.2.1.tgz", + "integrity": "sha512-ZXeprdpOSb7CSuzfuoBquoWfAdKSB4PXcPTM3NyAJ69RbcIy6FBEENO9P7jhH4CGUwnORAp8ja6zfQxXBMbBzw==", "dependencies": { "domhandler": "^4.0.0", "htmlparser2": "^6.1.0", - "node-fetch": "^2.6.1" + "undici": "^6.11.1" }, "engines": { - "node": ">=10.3.0" + "node": ">=18" } }, "node_modules/webextension-store-meta/node_modules/dom-serializer": { @@ -29234,7 +29244,8 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { "version": "5.90.3", @@ -29675,6 +29686,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index b25c311d1081bb430053c3e2df1f8c3e530c5ea1..e7860dbf74ac6209289183099aba17a7ad312cdb 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "semver": "~7.6.0", "simple-icons": "11.12.0", "smol-toml": "1.1.4", - "webextension-store-meta": "^1.1.0", + "webextension-store-meta": "^1.2.1", "xpath": "~0.0.34" }, "scripts": { diff --git a/services/chrome-web-store/chrome-web-store-base.js b/services/chrome-web-store/chrome-web-store-base.js index 77e917c2b71a4f9690e5f791053e2e04ad3cae6d..cd59da8a890bc14d51c8cf52c826cfd969af2cd6 100644 --- a/services/chrome-web-store/chrome-web-store-base.js +++ b/services/chrome-web-store/chrome-web-store-base.js @@ -1,4 +1,4 @@ -import ChromeWebStore from 'webextension-store-meta/lib/chrome-web-store/index.js' +import { ChromeWebStore } from 'webextension-store-meta/lib/chrome-web-store/index.js' import checkErrorResponse from '../../core/base-service/check-error-response.js' import { BaseService, Inaccessible } from '../index.js' diff --git a/services/chrome-web-store/chrome-web-store-rating.tester.js b/services/chrome-web-store/chrome-web-store-rating.tester.js index 3d4f20c1d5f32020161e0cc14e30f875db28f3cc..27948c53d9c0a9bba26b81cab10ee2a1146e4ae6 100644 --- a/services/chrome-web-store/chrome-web-store-rating.tester.js +++ b/services/chrome-web-store/chrome-web-store-rating.tester.js @@ -1,4 +1,5 @@ import Joi from 'joi' +import { Agent, MockAgent, setGlobalDispatcher } from 'undici' import { isStarRating } from '../test-validators.js' import { ServiceTester } from '../tester.js' @@ -39,7 +40,16 @@ t.create('Stars (not found)') .expectBadge({ label: 'rating', message: 'not found' }) // Keep this "inaccessible" test, since this service does not use BaseService#_request. +const mockAgent = new MockAgent() t.create('Rating (inaccessible)') .get('/rating/alhjnofcnnpeaphgeakdhkebafjcpeae.json') - .networkOff() + // webextension-store-meta uses undici internally, so we can't mock it with nock + .before(function () { + setGlobalDispatcher(mockAgent) + mockAgent.disableNetConnect() + }) + .after(async function () { + await mockAgent.close() + setGlobalDispatcher(new Agent()) + }) .expectBadge({ label: 'rating', message: 'inaccessible' }) diff --git a/services/chrome-web-store/chrome-web-store-users.tester.js b/services/chrome-web-store/chrome-web-store-users.tester.js index 54959019b45c017748d18db5100af75aa19cd50a..6b02b701d546868e04c4e0112a00f1655693eadf 100644 --- a/services/chrome-web-store/chrome-web-store-users.tester.js +++ b/services/chrome-web-store/chrome-web-store-users.tester.js @@ -1,3 +1,4 @@ +import { Agent, MockAgent, setGlobalDispatcher } from 'undici' import { isMetric } from '../test-validators.js' import { ServiceTester } from '../tester.js' @@ -22,7 +23,16 @@ t.create('Users (not found)') .expectBadge({ label: 'users', message: 'not found' }) // Keep this "inaccessible" test, since this service does not use BaseService#_request. +const mockAgent = new MockAgent() t.create('Users (inaccessible)') .get('/users/alhjnofcnnpeaphgeakdhkebafjcpeae.json') - .networkOff() + // webextension-store-meta uses undici internally, so we can't mock it with nock + .before(function () { + setGlobalDispatcher(mockAgent) + mockAgent.disableNetConnect() + }) + .after(async function () { + await mockAgent.close() + setGlobalDispatcher(new Agent()) + }) .expectBadge({ label: 'users', message: 'inaccessible' }) diff --git a/services/chrome-web-store/chrome-web-store-version.tester.js b/services/chrome-web-store/chrome-web-store-version.tester.js index cccf0b95e14be2b1363af6faedb1238034a7db85..f108c7e70827e54623bafd1723cc9a0d2a0e967f 100644 --- a/services/chrome-web-store/chrome-web-store-version.tester.js +++ b/services/chrome-web-store/chrome-web-store-version.tester.js @@ -1,3 +1,4 @@ +import { Agent, MockAgent, setGlobalDispatcher } from 'undici' import { isVPlusDottedVersionAtLeastOne } from '../test-validators.js' import { createServiceTester } from '../tester.js' export const t = await createServiceTester() @@ -12,7 +13,16 @@ t.create('Version (not found)') .expectBadge({ label: 'chrome web store', message: 'not found' }) // Keep this "inaccessible" test, since this service does not use BaseService#_request. +const mockAgent = new MockAgent() t.create('Version (inaccessible)') .get('/alhjnofcnnpeaphgeakdhkebafjcpeae.json') - .networkOff() + // webextension-store-meta uses undici internally, so we can't mock it with nock + .before(function () { + setGlobalDispatcher(mockAgent) + mockAgent.disableNetConnect() + }) + .after(async function () { + await mockAgent.close() + setGlobalDispatcher(new Agent()) + }) .expectBadge({ label: 'chrome web store', message: 'inaccessible' })