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. 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"