From 6df84d221085e59ec906535324ea7174c1f8de22 Mon Sep 17 00:00:00 2001 From: Elizabeth Kenyon Date: Tue, 13 Feb 2024 16:46:13 -0600 Subject: [PATCH 1/2] changelog --- .changeset/new-moons-nail.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/new-moons-nail.md diff --git a/.changeset/new-moons-nail.md b/.changeset/new-moons-nail.md new file mode 100644 index 0000000000..c409ef97ca --- /dev/null +++ b/.changeset/new-moons-nail.md @@ -0,0 +1,9 @@ +--- +"@shopify/shopify-app-remix": minor +--- + +Introduce Vercel adapter to fix deploys to Vercel. + +Since v.9.0.0 of `@shopify/shopify-api` developers deploying their Remix apps to Vercel have encountered errors. + +Developers looking to deploy their application to Vercel should replace references to import `"@shopify/shopify-app-remix/adapters/node";` with `"@shopify/shopify-app-remix/adapters/vercel";` to properly load the required global variables. From f1f80a6f7626a6fd4c54e966a2a8dd88eb0a2eba Mon Sep 17 00:00:00 2001 From: Elizabeth Kenyon Date: Mon, 12 Feb 2024 16:45:48 -0600 Subject: [PATCH 2/2] Fix deploys to vercel Deploys to vercel were broken because it was not loading the appropriate global variables To fix this we created an adapter that explicitly loads them. Developers looking to deploy to vercel should use that adapter in place of node. --- loom.config.ts | 35 +++- packages/shopify-app-remix/loom.config.ts | 2 +- packages/shopify-app-remix/package.json | 1 + .../src/server/__test-helpers/index.ts | 3 - .../src/server/__test-helpers/request-mock.ts | 21 ++- .../__tests__/node-app-bridge-url.test.ts | 6 +- .../{node => }/__tests__/node.test.ts | 2 +- .../adapters/node/__tests__/setup-jest.ts | 10 + .../adapters/vercel/__tests__/setup-jest.ts | 12 ++ .../src/server/adapters/vercel/index.ts | 13 ++ .../server/boundary/__tests__/headers.test.ts | 2 +- yarn.lock | 178 +++++++++++++++++- 12 files changed, 269 insertions(+), 16 deletions(-) rename packages/shopify-app-remix/src/server/adapters/{node => }/__tests__/node-app-bridge-url.test.ts (74%) rename packages/shopify-app-remix/src/server/adapters/{node => }/__tests__/node.test.ts (96%) create mode 100644 packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts create mode 100644 packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts create mode 100644 packages/shopify-app-remix/src/server/adapters/vercel/index.ts diff --git a/loom.config.ts b/loom.config.ts index 2d94d2f58a..4cf9d075f7 100644 --- a/loom.config.ts +++ b/loom.config.ts @@ -62,9 +62,40 @@ function forkRemixProject(projects: Config.InitialProjectOptions[]) { [ { ...project, - displayName: 'shopify-app-remix-server', + setupFilesAfterEnv: [ + ...(project.setupFilesAfterEnv ?? []), + '../../packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts', + ], + displayName: 'shopify-app-remix-server-node', + testEnvironment: 'node', + testPathIgnorePatterns: [ + 'src/react', + 'src/server/adapters/__tests__', + ], + }, + ], + [ + { + ...project, + setupFilesAfterEnv: [ + ...(project.setupFilesAfterEnv ?? []), + '../../packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts', + ], + displayName: 'shopify-app-remix-server-vercel', + testEnvironment: 'node', + testPathIgnorePatterns: [ + 'src/react', + 'src/server/adapters/__tests__', + ], + }, + ], + [ + { + ...project, + testRegex: undefined, + displayName: 'shopify-app-remix-server-adapters', + testMatch: ['/src/server/adapters/__tests__/**/*'], testEnvironment: 'node', - testPathIgnorePatterns: ['src/react'], }, ], ); diff --git a/packages/shopify-app-remix/loom.config.ts b/packages/shopify-app-remix/loom.config.ts index d8ae0eb65e..390252f79e 100644 --- a/packages/shopify-app-remix/loom.config.ts +++ b/packages/shopify-app-remix/loom.config.ts @@ -9,7 +9,7 @@ export default createPackage((pkg) => { const basePath = `${__dirname}/src/server/adapters`; fs.readdirSync(basePath, {withFileTypes: true}) - .filter((dirent) => dirent.isDirectory()) + .filter((dirent) => dirent.isDirectory() && dirent.name !== '__tests__') .forEach((dirent) => { pkg.entry({root: `./src/server/adapters/${dirent.name}/index.ts`}); }); diff --git a/packages/shopify-app-remix/package.json b/packages/shopify-app-remix/package.json index d3d59c2c47..f2e62145f7 100644 --- a/packages/shopify-app-remix/package.json +++ b/packages/shopify-app-remix/package.json @@ -64,6 +64,7 @@ "react-dom": "^18.2.0" }, "dependencies": { + "@remix-run/node": "^2.6.0", "@remix-run/server-runtime": "^2.5.1", "@shopify/admin-api-client": "^0.2.3", "@shopify/shopify-api": "^9.3.1", diff --git a/packages/shopify-app-remix/src/server/__test-helpers/index.ts b/packages/shopify-app-remix/src/server/__test-helpers/index.ts index fe70b4c802..ab10d9cc3d 100644 --- a/packages/shopify-app-remix/src/server/__test-helpers/index.ts +++ b/packages/shopify-app-remix/src/server/__test-helpers/index.ts @@ -1,6 +1,3 @@ -import '@shopify/shopify-api/adapters/web-api'; -import '../adapters/node'; - export * from './const'; export * from './expect-admin-api-client'; export * from './expect-begin-auth-redirect'; diff --git a/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts b/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts index 4fde404add..c39ebf9c84 100644 --- a/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts +++ b/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts @@ -84,9 +84,8 @@ export async function validateMocks() { } if (request?.body) { - const bodyString = new TextDecoder('utf-8').decode( - request.body as any as Buffer, - ); + const bodyBuffer = await stream2buffer(request.body); + const bodyString = new TextDecoder('utf-8').decode(bodyBuffer); expected.body = expect.stringContaining(bodyString); actual.body = init?.body?.toString(); @@ -137,6 +136,22 @@ export async function validateMocks() { } } +async function stream2buffer( + stream: ReadableStream, +): Promise { + const buffers = []; + + for await (const data of stream as any) { + if (typeof data === 'number') { + buffers.push(Uint8Array.from([data])); + } else { + buffers.push(data); + } + } + + return Buffer.concat(buffers); +} + export function skipMockChecks(value: boolean) { skipMockChecksFlag = value; } diff --git a/packages/shopify-app-remix/src/server/adapters/node/__tests__/node-app-bridge-url.test.ts b/packages/shopify-app-remix/src/server/adapters/__tests__/node-app-bridge-url.test.ts similarity index 74% rename from packages/shopify-app-remix/src/server/adapters/node/__tests__/node-app-bridge-url.test.ts rename to packages/shopify-app-remix/src/server/adapters/__tests__/node-app-bridge-url.test.ts index dd11957a56..2fd47a7332 100644 --- a/packages/shopify-app-remix/src/server/adapters/node/__tests__/node-app-bridge-url.test.ts +++ b/packages/shopify-app-remix/src/server/adapters/__tests__/node-app-bridge-url.test.ts @@ -1,5 +1,5 @@ -import {APP_BRIDGE_URL} from '../../../authenticate/const'; -import {appBridgeUrl} from '../../../authenticate/helpers'; +import {APP_BRIDGE_URL} from '../../authenticate/const'; +import {appBridgeUrl} from '../../authenticate/helpers'; describe('node setup import', () => { /* eslint-disable no-process-env */ @@ -9,7 +9,7 @@ describe('node setup import', () => { process.env.APP_BRIDGE_URL = 'http://localhost:9876/app-bridge.js'; // WHEN - await require('../index'); + await require('../node/index'); // THEN expect(appBridgeUrl()).toEqual(process.env.APP_BRIDGE_URL); diff --git a/packages/shopify-app-remix/src/server/adapters/node/__tests__/node.test.ts b/packages/shopify-app-remix/src/server/adapters/__tests__/node.test.ts similarity index 96% rename from packages/shopify-app-remix/src/server/adapters/node/__tests__/node.test.ts rename to packages/shopify-app-remix/src/server/adapters/__tests__/node.test.ts index 514c32f54f..39e0f434f2 100644 --- a/packages/shopify-app-remix/src/server/adapters/node/__tests__/node.test.ts +++ b/packages/shopify-app-remix/src/server/adapters/__tests__/node.test.ts @@ -19,7 +19,7 @@ describe('node setup import', () => { expect(cryptoBefore).toBeUndefined(); // WHEN - await require('../index'); + await require('../node'); // THEN const cryptoAfter = (await require('@shopify/shopify-api/runtime')).crypto; diff --git a/packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts b/packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts new file mode 100644 index 0000000000..409ee00872 --- /dev/null +++ b/packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts @@ -0,0 +1,10 @@ +import fetchMock from 'jest-fetch-mock'; +import '@shopify/shopify-api/adapters/web-api'; +import '..'; + +// Globally disable fetch requests so we don't risk making real ones +fetchMock.enableMocks(); + +beforeEach(() => { + fetchMock.mockReset(); +}); diff --git a/packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts b/packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts new file mode 100644 index 0000000000..7f4ac78e03 --- /dev/null +++ b/packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts @@ -0,0 +1,12 @@ +import fetchMock from 'jest-fetch-mock'; +import '@shopify/shopify-api/adapters/web-api'; +import '..'; +import {setAbstractFetchFunc} from '@shopify/shopify-api/runtime'; + +// Globally disable fetch requests so we don't risk making real ones +fetchMock.enableMocks(); + +beforeEach(() => { + fetchMock.mockReset(); +}); +setAbstractFetchFunc(fetch); diff --git a/packages/shopify-app-remix/src/server/adapters/vercel/index.ts b/packages/shopify-app-remix/src/server/adapters/vercel/index.ts new file mode 100644 index 0000000000..4ef1be2aa5 --- /dev/null +++ b/packages/shopify-app-remix/src/server/adapters/vercel/index.ts @@ -0,0 +1,13 @@ +import {setAbstractFetchFunc} from '@shopify/shopify-api/runtime'; +import {installGlobals} from '@remix-run/node'; + +import '../node'; + +installGlobals(); + +const fetchFunc = fetch; +setAbstractFetchFunc(async (...args) => { + const response = await fetchFunc.apply(this, args); + + return response; +}); diff --git a/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts b/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts index ab401f95e0..70fb287d8a 100644 --- a/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts +++ b/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts @@ -61,6 +61,6 @@ describe('Headers boundary', () => { const result = boundary.headers(headers as any); // THEN - expect(result).toEqual(new Headers()); + expect(result.entries()).toEqual(new Headers().entries()); }); }); diff --git a/yarn.lock b/yarn.lock index fed2806b8d..18c7f13440 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2520,6 +2520,20 @@ resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.5.tgz#a6d70ef7a0e71e083ea09b967df0a0ed742bc6ad" integrity sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg== +"@remix-run/node@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-2.6.0.tgz#7272edc84b8f19053f0ffc96ccb2f9ef84850075" + integrity sha512-bWemy3g258Kdqi+4OxIEZ7QS64T96jNK6a7NdlPXGJZqeLpxM5NmlCl/slSdx52oTi9r5Xoz1Tm4uR37nD1/Xw== + dependencies: + "@remix-run/server-runtime" "2.6.0" + "@remix-run/web-fetch" "^4.4.2" + "@remix-run/web-file" "^3.1.0" + "@remix-run/web-stream" "^1.1.0" + "@web3-storage/multipart-parser" "^1.0.0" + cookie-signature "^1.1.0" + source-map-support "^0.5.21" + stream-slice "^0.1.2" + "@remix-run/react@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@remix-run/react/-/react-2.6.0.tgz#baacc56e8272bd1ab729822d5c137160548f4465" @@ -2535,6 +2549,11 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2" integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ== +"@remix-run/router@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2" + integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ== + "@remix-run/server-runtime@2.6.0", "@remix-run/server-runtime@^2.5.1": version "2.6.0" resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-2.6.0.tgz#61595c102ebb14ff08d8d994cc639c3a3cd55c34" @@ -2547,6 +2566,61 @@ set-cookie-parser "^2.4.8" source-map "^0.7.3" +"@remix-run/server-runtime@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-2.6.0.tgz#61595c102ebb14ff08d8d994cc639c3a3cd55c34" + integrity sha512-qFXDl4pK55njBLuvyRn5AkI/hu8fEU3t1XFKv0Syivx0nmUVpWMW25Uzi1pkX/chF1VIxCVrZ8KuQ1rcrKj+DQ== + dependencies: + "@remix-run/router" "1.15.0" + "@types/cookie" "^0.6.0" + "@web3-storage/multipart-parser" "^1.0.0" + cookie "^0.6.0" + set-cookie-parser "^2.4.8" + source-map "^0.7.3" + +"@remix-run/web-blob@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-blob/-/web-blob-3.1.0.tgz#e0c669934c1eb6028960047e57a13ed38bbfb434" + integrity sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g== + dependencies: + "@remix-run/web-stream" "^1.1.0" + web-encoding "1.1.5" + +"@remix-run/web-fetch@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz#ce7aedef72cc26e15060e8cf84674029f92809b6" + integrity sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA== + dependencies: + "@remix-run/web-blob" "^3.1.0" + "@remix-run/web-file" "^3.1.0" + "@remix-run/web-form-data" "^3.1.0" + "@remix-run/web-stream" "^1.1.0" + "@web3-storage/multipart-parser" "^1.0.0" + abort-controller "^3.0.0" + data-uri-to-buffer "^3.0.1" + mrmime "^1.0.0" + +"@remix-run/web-file@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-file/-/web-file-3.1.0.tgz#07219021a2910e90231bc30ca1ce693d0e9d3825" + integrity sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ== + dependencies: + "@remix-run/web-blob" "^3.1.0" + +"@remix-run/web-form-data@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz#47f9ad8ce8bf1c39ed83eab31e53967fe8e3df6a" + integrity sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A== + dependencies: + web-encoding "1.1.5" + +"@remix-run/web-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.1.0.tgz#b93a8f806c2c22204930837c44d81fdedfde079f" + integrity sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA== + dependencies: + web-streams-polyfill "^3.1.1" + "@rollup/plugin-babel@^5.3.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -3776,6 +3850,11 @@ resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -3786,6 +3865,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -4075,6 +4161,11 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" + integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== + axe-core@=4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" @@ -4698,6 +4789,11 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" + integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== + cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" @@ -4832,6 +4928,11 @@ data-uri-to-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5564,6 +5665,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -6169,6 +6275,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6365,6 +6478,14 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -6449,7 +6570,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.10: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -6587,6 +6708,13 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.11" +is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8238,6 +8366,11 @@ mongodb@^6.3.0: bson "^6.2.0" mongodb-connection-string-url "^3.0.0" +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9666,7 +9799,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.16, source-map-support@^0.5.6: +source-map-support@^0.5.16, source-map-support@^0.5.21, source-map-support@^0.5.6: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9789,6 +9922,11 @@ stoppable@^1.1.0: resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== +stream-slice@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" + integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== + stream-transform@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" @@ -10418,6 +10556,17 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -10492,6 +10641,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +web-streams-polyfill@^3.1.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz#32e26522e05128203a7de59519be3c648004343b" + integrity sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10612,6 +10775,17 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + dependencies: + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.1" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"