From fd7ead6ce63027f976acc679b95041fdb947cda8 Mon Sep 17 00:00:00 2001 From: Sam Lord Date: Mon, 25 Sep 2023 14:43:11 +0100 Subject: [PATCH] Upgraded to latest version of @tryghost/request refs: https://github.com/TryGhost/Product/issues/3782 Latest version of request avoids using the OS-level name resolution system. This prevents long shutdowns from occuring where the OS is blocking the process from exiting cleanly. The new version uses `got` 13, which has many breaking changes. Some of these are resolved within @tryghost/request (like response errors), but input parameters need to be changed. --- .../adapters/scheduling/scheduling-default.js | 16 +-- ghost/core/core/server/lib/image/Gravatar.js | 2 +- ghost/core/core/server/lib/image/ImageSize.js | 10 +- .../core/server/services/themes/installer.js | 2 +- .../services/webhooks/WebhookTrigger.js | 8 +- ghost/core/core/server/services/xmlrpc.js | 4 +- ghost/core/package.json | 2 +- .../unit/server/lib/image/gravatar.test.js | 2 +- .../lib/ExternalMediaInliner.js | 2 +- .../lib/UpdateCheckService.js | 13 +- .../test/update-check-service.test.js | 6 +- yarn.lock | 136 +++++++++++++++++- 12 files changed, 171 insertions(+), 32 deletions(-) diff --git a/ghost/core/core/server/adapters/scheduling/scheduling-default.js b/ghost/core/core/server/adapters/scheduling/scheduling-default.js index d0ef1bfcd7..59cdd85d7f 100644 --- a/ghost/core/core/server/adapters/scheduling/scheduling-default.js +++ b/ghost/core/core/server/adapters/scheduling/scheduling-default.js @@ -274,21 +274,21 @@ SchedulingDefault.prototype._pingUrl = function (object) { const maxTries = 30; const options = { - timeout: requestTimeout, - method: httpMethod.toLowerCase(), - retry: 0, - headers: { - 'Content-Type': 'application/json' + timeout: { + request: requestTimeout + }, + method: httpMethod, + retry: { + limit: 0 } }; // CASE: If we detect to publish a post in the past (case blog is down), we add a force flag if (moment(time).isBefore(moment())) { if (httpMethod === 'GET') { - // @TODO: rename to searchParams when updating to Got v10 - options.query = 'force=true'; + options.searchParams = {force: true}; } else { - options.body = JSON.stringify({force: true}); + options.json = {force: true}; } } diff --git a/ghost/core/core/server/lib/image/Gravatar.js b/ghost/core/core/server/lib/image/Gravatar.js index 7487c22ce1..422410fbe5 100644 --- a/ghost/core/core/server/lib/image/Gravatar.js +++ b/ghost/core/core/server/lib/image/Gravatar.js @@ -33,7 +33,7 @@ class Gravatar { const testUrl = this.url(userData.email, {default: 404, rating: 'x'}); const imageUrl = this.url(userData.email, {default: 'mp', rating: 'x'}); - return Promise.resolve(this.request(testUrl, {timeout: timeout || 2 * 1000})) + return Promise.resolve(this.request(testUrl, {timeout: {request: timeout || 2 * 1000}})) .then(function () { return { image: imageUrl diff --git a/ghost/core/core/server/lib/image/ImageSize.js b/ghost/core/core/server/lib/image/ImageSize.js index cc6f110bb8..7c9506b164 100644 --- a/ghost/core/core/server/lib/image/ImageSize.js +++ b/ghost/core/core/server/lib/image/ImageSize.js @@ -30,9 +30,13 @@ class ImageSize { headers: { 'User-Agent': 'Mozilla/5.0 Safari/537.36' }, - timeout: this.config.get('times:getImageSizeTimeoutInMS') || 10000, - retry: 0, // for `got`, used with image-size - encoding: null + timeout: { + request: this.config.get('times:getImageSizeTimeoutInMS') || 10000 + }, + retry: { + limit: 0 // for `got`, used with image-size + }, + responseType: 'buffer' }; this.NEEDLE_OPTIONS = { diff --git a/ghost/core/core/server/services/themes/installer.js b/ghost/core/core/server/services/themes/installer.js index 99be336b68..c0288197d0 100644 --- a/ghost/core/core/server/services/themes/installer.js +++ b/ghost/core/core/server/services/themes/installer.js @@ -41,7 +41,7 @@ const installFromGithub = async (ref) => { headers: { accept: 'application/vnd.github.v3+json' }, - encoding: null + responseType: 'buffer' }); await fs.writeFile(downloadPath, response.body); diff --git a/ghost/core/core/server/services/webhooks/WebhookTrigger.js b/ghost/core/core/server/services/webhooks/WebhookTrigger.js index a667404134..8e3f1c7f2a 100644 --- a/ghost/core/core/server/services/webhooks/WebhookTrigger.js +++ b/ghost/core/core/server/services/webhooks/WebhookTrigger.js @@ -101,8 +101,12 @@ class WebhookTrigger { const opts = { body: reqPayload, headers, - timeout: 2 * 1000, - retry: process.env.NODE_ENV?.startsWith('test') ? 0 : 5 + timeout: { + request: 2 * 1000 + }, + retry: { + limit: process.env.NODE_ENV?.startsWith('test') ? 0 : 5 + } }; logging.info(`Triggering webhook for "${webhook.get('event')}" with url "${url}"`); diff --git a/ghost/core/core/server/services/xmlrpc.js b/ghost/core/core/server/services/xmlrpc.js index 85e80c261f..b33a64141d 100644 --- a/ghost/core/core/server/services/xmlrpc.js +++ b/ghost/core/core/server/services/xmlrpc.js @@ -76,7 +76,9 @@ function ping(post) { _.each(pingList, function (pingHost) { const options = { body: pingXML, - timeout: 2 * 1000 + timeout: { + request: 2 * 1000 + } }; const goodResponse = /[\s]*flerror<\/name>[\s]*[\s]*0<\/boolean><\/value><\/member>/; diff --git a/ghost/core/package.json b/ghost/core/package.json index ef39badfde..4f7003d26c 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -145,7 +145,7 @@ "@tryghost/pretty-cli": "1.2.36", "@tryghost/promise": "0.3.4", "@tryghost/recommendations": "0.0.0", - "@tryghost/request": "0.1.39", + "@tryghost/request": "1.0.0", "@tryghost/security": "0.0.0", "@tryghost/session-service": "0.0.0", "@tryghost/settings-path-manager": "0.0.0", diff --git a/ghost/core/test/unit/server/lib/image/gravatar.test.js b/ghost/core/test/unit/server/lib/image/gravatar.test.js index 811af06b83..b82137edf6 100644 --- a/ghost/core/test/unit/server/lib/image/gravatar.test.js +++ b/ghost/core/test/unit/server/lib/image/gravatar.test.js @@ -69,7 +69,7 @@ describe('lib/image: gravatar', function () { } : null; } }, request: (url, options) => { - options.timeout.should.eql(delay); + options.timeout.request.should.eql(delay); }}); gravatar.lookup({email: 'exists@example.com'}, delay); diff --git a/ghost/external-media-inliner/lib/ExternalMediaInliner.js b/ghost/external-media-inliner/lib/ExternalMediaInliner.js index 5d6967f53f..14546e7051 100644 --- a/ghost/external-media-inliner/lib/ExternalMediaInliner.js +++ b/ghost/external-media-inliner/lib/ExternalMediaInliner.js @@ -45,7 +45,7 @@ class ExternalMediaInliner { try { return await request(requestURL, { followRedirect: true, - encoding: null + responseType: 'buffer' }); } catch (error) { // NOTE: add special case for 404s diff --git a/ghost/update-check-service/lib/UpdateCheckService.js b/ghost/update-check-service/lib/UpdateCheckService.js index 35ceef5634..dde8592e41 100644 --- a/ghost/update-check-service/lib/UpdateCheckService.js +++ b/ghost/update-check-service/lib/UpdateCheckService.js @@ -150,22 +150,21 @@ class UpdateCheckService { const reqData = await this.updateCheckData(); let reqObj = { - timeout: 1000, + timeout: { + request: 1000 + }, headers: {} }; let checkEndpoint = this.config.checkEndpoint; let checkMethod = this.config.isPrivacyDisabled ? 'GET' : 'POST'; + reqObj.method = checkMethod; // CASE: Expose stats and do a check-in if (checkMethod === 'POST') { - reqObj.json = true; - reqObj.body = reqData; - reqObj.headers['Content-Length'] = Buffer.byteLength(JSON.stringify(reqData)); - reqObj.headers['Content-Type'] = 'application/json'; + reqObj.json = reqData; } else { - reqObj.json = true; - reqObj.query = { + reqObj.searchParams = { ghost_version: reqData.ghost_version }; } diff --git a/ghost/update-check-service/test/update-check-service.test.js b/ghost/update-check-service/test/update-check-service.test.js index 768bddd05c..aabd3ad1db 100644 --- a/ghost/update-check-service/test/update-check-service.test.js +++ b/ghost/update-check-service/test/update-check-service.test.js @@ -66,7 +66,7 @@ describe('Update Check', function () { requestStub.calledOnce.should.equal(true); requestStub.args[0][0].should.equal('https://updates.ghost.org'); - requestStub.args[0][1].query.ghost_version.should.equal('0.8.0'); + requestStub.args[0][1].searchParams.ghost_version.should.equal('0.8.0'); }); it('update check won\'t happen if it\'s too early', async function () { @@ -125,7 +125,7 @@ describe('Update Check', function () { requestStub.calledOnce.should.equal(true); requestStub.args[0][0].should.equal('https://updates.ghost.org'); - requestStub.args[0][1].query.ghost_version.should.equal('5.3.4'); + requestStub.args[0][1].searchParams.ghost_version.should.equal('5.3.4'); }); }); @@ -174,7 +174,7 @@ describe('Update Check', function () { requestStub.args[0][0].should.equal('https://updates.ghost.org'); - const data = requestStub.args[0][1].body; + const data = requestStub.args[0][1].json; data.ghost_version.should.equal('4.0.0'); data.node_version.should.equal(process.versions.node); data.env.should.equal(process.env.NODE_ENV); diff --git a/yarn.lock b/yarn.lock index cd29972324..c8b0d71f27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5069,6 +5069,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -7336,6 +7341,13 @@ dependencies: defer-to-connect "^2.0.0" +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@tailwindcss/forms@0.5.6": version "0.5.6" resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.6.tgz#29c6c2b032b363e0c5110efed1499867f6d7e868" @@ -8055,7 +8067,19 @@ resolved "https://registry.yarnpkg.com/@tryghost/promise/-/promise-0.3.4.tgz#b5437eb14a3d06e7d32f277e10975ff77061e16e" integrity sha512-D8zxDpLuPfPjakMTj7o2dpcdi+luwC6ibQLDy6Z0ImQtBt4wZEbmAH1eAsYpk4JVviuGWzwkOM1cURmMEJO5Ig== -"@tryghost/request@0.1.39", "@tryghost/request@^0.1.39": +"@tryghost/request@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tryghost/request/-/request-1.0.0.tgz#2fc95c1a119e70a1e1cadd7c173beb810cf49809" + integrity sha512-budMHtaaysFZT5gCIkbbsILiSXOxeiPKNGfUNtjKByuheLDhrQnz7E7+C0FWIIniMoJ6nI8FJdbixS9glpDOgQ== + dependencies: + "@tryghost/errors" "^1.2.26" + "@tryghost/validator" "^0.2.6" + "@tryghost/version" "^0.1.24" + cacheable-lookup "7.0.0" + got "13.0.0" + lodash "^4.17.21" + +"@tryghost/request@^0.1.39": version "0.1.39" resolved "https://registry.yarnpkg.com/@tryghost/request/-/request-0.1.39.tgz#26cace3784bed41b7b98179e69239bf96e829546" integrity sha512-ivb+GdUjcO2tPOGOw7LamfkYgxlB6xipYzkKaUIKUr7K1kI+BW7+n8cnRYHwpT+Wd7J8KDMBKDC2uWHMdHKMsQ== @@ -8175,6 +8199,17 @@ moment-timezone "^0.5.23" validator "7.2.0" +"@tryghost/validator@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@tryghost/validator/-/validator-0.2.6.tgz#99a01bf6e6c70c1eb79098e6b95b980e0efa126b" + integrity sha512-2p1/X7vqI/tikc2beRQ1efCm/hSRCkB7y0+etCGROKNH3nHJwvw+OKSxgmNZ7+5OjR6DJkNW88aMYPz47X3fAg== + dependencies: + "@tryghost/errors" "^1.2.26" + "@tryghost/tpl" "^0.1.26" + lodash "^4.17.21" + moment-timezone "^0.5.23" + validator "7.2.0" + "@tryghost/version@0.1.22", "@tryghost/version@^0.1.22": version "0.1.22" resolved "https://registry.yarnpkg.com/@tryghost/version/-/version-0.1.22.tgz#e2a9f6eec4f9f8945094d3bd7c0757438f4e0622" @@ -8183,6 +8218,14 @@ "@tryghost/root-utils" "^0.3.22" semver "^7.3.5" +"@tryghost/version@^0.1.24": + version "0.1.24" + resolved "https://registry.yarnpkg.com/@tryghost/version/-/version-0.1.24.tgz#eb8bc345929ba8f67c3f36757bd91c12f701a5f5" + integrity sha512-XM0aXB3dQNjazeMX5YbBLjA+airE5HR5XqmEB9YrAxlQPaYdXkQUq+ar6L/dxiS8dp+o2DQIcp2XgGd/Ay3MuQ== + dependencies: + "@tryghost/root-utils" "^0.3.24" + semver "^7.3.5" + "@tryghost/webhook-mock-receiver@0.2.6": version "0.2.6" resolved "https://registry.yarnpkg.com/@tryghost/webhook-mock-receiver/-/webhook-mock-receiver-0.2.6.tgz#20a4141f5813287988770f5f1e394ad2af5c1063" @@ -8504,6 +8547,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-cache-semantics@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" + integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -12444,11 +12492,29 @@ cache-manager@4.1.0: lodash.clonedeep "^4.5.0" lru-cache "^7.10.1" +cacheable-lookup@7.0.0, cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== +cacheable-request@^10.2.8: + version "10.2.13" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" + integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== + dependencies: + "@types/http-cache-semantics" "^4.0.1" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -14320,7 +14386,7 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -defer-to-connect@^2.0.0: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== @@ -18103,6 +18169,11 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + form-data@4.0.0, form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -18928,6 +18999,23 @@ got@11.8.6, got@~11.8.0: p-cancelable "^2.0.0" responselike "^2.0.0" +got@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/got/-/got-13.0.0.tgz#a2402862cef27a5d0d1b07c0fb25d12b58175422" + integrity sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -19528,6 +19616,14 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + httpntlm@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2" @@ -21465,6 +21561,13 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -22480,6 +22583,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" @@ -23200,6 +23308,11 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -24212,6 +24325,11 @@ normalize-url@^6.0.1, normalize-url@~6.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + normalize.css@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-3.0.3.tgz#acc00262e235a2caa91363a2e5e3bfa4f8ad05c6" @@ -24695,6 +24813,11 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -27639,7 +27762,7 @@ reselect@^4.0.0, reselect@^4.1.7: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== -resolve-alpn@^1.0.0: +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== @@ -27770,6 +27893,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"