diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e264030..bd9160b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,22 +3,34 @@ on: [pull_request] jobs: build: runs-on: ubuntu-latest + name: Test ${{ matrix.package.name }} (Node ${{ matrix.node-version }}) strategy: + fail-fast: false matrix: - node-version: ["16", "22", "24"] + node-version: ["22", "24", "25"] + package: + - name: omnipartners + workspace: omnipartners + - name: graphql-schema + workspace: "@igloo-be-omnipartners/graphql-schema" + - name: hooks + workspace: "@igloo-be-omnipartners/hooks" + # - name: graphql-demo + # workspace: "@igloo-be-omnipartners/graphql-demo" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: env - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - name: yarn config run: yarn config set ignore-engines true - name: Install dependencies run: yarn install - - run: yarn test + - name: Test ${{ matrix.package.name }} + run: yarn workspace ${{ matrix.package.workspace }} test env: CI: true diff --git a/package.json b/package.json index 37627890..f3acf11e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "prepare": "lerna run --ignore \"*/graphql-demo\" build" }, "engines": { - "node": ">=10" + "node": ">=22" }, "workspaces": { "packages": [ diff --git a/packages/graphql-schema/package.json b/packages/graphql-schema/package.json index 20bdecd0..9ed6adfc 100644 --- a/packages/graphql-schema/package.json +++ b/packages/graphql-schema/package.json @@ -28,7 +28,7 @@ "@types/fs-extra": "^9.0.13", "@types/graphql-type-json": "^0.3.2", "@types/jest": "^27.0.3", - "@types/jsonwebtoken": "^8.5.6", + "@types/jsonwebtoken": "^9", "@types/node-fetch": "^3.0.2", "@types/validator": "^13.7.0", "apollo-server": "^3.5.0", @@ -55,7 +55,7 @@ "dataloader": "^2.0.0", "date-fns": "^2.27.0", "graphql-type-json": "^0.3", - "jsonwebtoken": "^8.5.1", + "jsonwebtoken": "^9", "lodash": "^4.17.21", "p-map": "^4", "typescript-memoize": "^1.1.0", diff --git a/packages/omnipartners/jest.config.js b/packages/omnipartners/jest.config.js index c13b461b..76bf064b 100644 --- a/packages/omnipartners/jest.config.js +++ b/packages/omnipartners/jest.config.js @@ -4,5 +4,6 @@ module.exports = { '^.+\\.tsx?$': 'ts-jest' }, testRegex: '(/(__tests__|test)/.*|(\\.|/)(test|spec))\\.tsx?$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + setupFiles: ['./jest.setup.js'] } diff --git a/packages/omnipartners/jest.setup.js b/packages/omnipartners/jest.setup.js new file mode 100644 index 00000000..077a24c6 --- /dev/null +++ b/packages/omnipartners/jest.setup.js @@ -0,0 +1,6 @@ +const nodeFetch = require("node-fetch"); + +global.fetch = nodeFetch.default || nodeFetch; +global.Headers = nodeFetch.Headers; +global.Request = nodeFetch.Request; +global.Response = nodeFetch.Response; diff --git a/packages/omnipartners/package.json b/packages/omnipartners/package.json index f5d2bb04..f56078f1 100644 --- a/packages/omnipartners/package.json +++ b/packages/omnipartners/package.json @@ -20,16 +20,15 @@ "@types/depd": "^1.1.32", "@types/jest": "^27.0.3", "@types/lodash": "^4.14.177", - "@types/node": "^16.11.11", - "@types/node-fetch": "^3.0.2", + "@types/node": "16.11.11", + "@types/node-fetch": "2", "@types/qs": "^6.9.7", - "@types/request": "^2.48.7", - "@types/request-promise-native": "^1.0.18", "@types/sinon": "^10.0.6", "@types/url-join": "^4.0.1", "@types/uuid": "^8.3.3", "jest": "^27.4.3", "nock": "^13.2.1", + "node-fetch": "2", "sinon": "^12.0.1", "ts-jest": "^27.0.7", "typescript": "^4.5.2" @@ -38,10 +37,7 @@ "depd": "^2.0.0", "fetch-retry": "^5.0.1", "lodash": "^4.17.21", - "node-fetch": "2", "qs": "^6.10.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "url-join": "^4.0.1", "uuid": "^8.3.2", "winston": "^3.3.3" diff --git a/packages/omnipartners/src/lib/Request.ts b/packages/omnipartners/src/lib/Request.ts index 31b69f79..e14bb28e 100644 --- a/packages/omnipartners/src/lib/Request.ts +++ b/packages/omnipartners/src/lib/Request.ts @@ -1,9 +1,7 @@ import { EventEmitter } from "events"; import reduce from "lodash/reduce"; -import fetch, { FetchError } from "node-fetch"; // TODO: switch to fetch-retry import querystring from "qs"; -import { Response as RequestResponse } from "request"; -import request from "request-promise-native"; +import { Readable } from "stream"; import { v4 as uuid } from "uuid"; import { RequestError, RequestTimeoutError } from "./errors"; import Response, { IFetchResponse } from "./Response"; @@ -107,68 +105,80 @@ export default class Request extends EventEmitter { let fetchRes: IFetchResponse; try { - if (this.multipart) { - const requestRes = (await request(uri, { - headers: this.headers, - formData: this.body, - method: this.method, - timeout: this.timeout, - resolveWithFullResponse: true, - })) as RequestResponse; - - fetchRes = { - status: requestRes.statusCode, - text: async () => requestRes.body, - headers: requestRes.headers, - ok: true, - size: 0, - statusText: requestRes.statusMessage, - timeout: this.timeout || 0, - }; + const headers = { ...this.headers }; + let body: BodyInit | undefined; + + if (this.multipart && this.body) { + const formData = new FormData(); + for (const [key, value] of Object.entries( + this.body as Record, + )) { + if (value === undefined || value === null) continue; + if (typeof value === "string") { + formData.append(key, value); + } else if (value instanceof Readable) { + const chunks: Buffer[] = []; + for await (const chunk of value) { + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + } + formData.append(key, new Blob([Buffer.concat(chunks)])); + } else if ( + value && + typeof value === "object" && + "value" in value && + "options" in value + ) { + const { value: buf, options } = value as { + value: Buffer; + options: { filename: string }; + }; + formData.append(key, new Blob([buf]), options.filename); + } else { + formData.append(key, String(value)); + } + } + // Remove Content-Type so fetch sets it automatically with the correct boundary + delete headers["Content-Type"]; + body = formData; } else { - const tempRes = await fetch(uri, { - body: this.json ? JSON.stringify(this.body) : this.body, - headers: this.headers, - method: this.method, - timeout: this.timeout, - // TODO: - // retries: this.retries, - // retryDelay: this.retryDelay - }); - - const rawHeaders = - typeof tempRes.headers.values === "function" - ? tempRes.headers.values() - : typeof tempRes.headers.raw === "function" - ? tempRes.headers.raw() - : {}; - const flatHeaders = reduce( - rawHeaders, - (res, value, name) => ({ - ...res, - [name]: - Array.isArray(value) && value.length === 1 - ? value.join("") - : value, - }), - {}, - ); - - fetchRes = { - status: tempRes.status, - text: () => tempRes.text(), - headers: flatHeaders, - ok: tempRes.ok, - size: tempRes.size, - statusText: tempRes.statusText, - timeout: tempRes.timeout, - }; + body = this.json ? JSON.stringify(this.body) : this.body; } + + const controller = new AbortController(); + const timeoutId = this.timeout + ? setTimeout(() => controller.abort(), this.timeout) + : undefined; + + const rawRes = await fetch(uri, { + body, + headers, + method: this.method, + signal: controller.signal, + }).finally(() => { + if (timeoutId !== undefined) clearTimeout(timeoutId); + }); + + const flatHeaders: { [key: string]: string } = {}; + rawRes.headers.forEach((value: string, name: string) => { + flatHeaders[name] = value; + }); + + fetchRes = { + status: rawRes.status, + text: () => rawRes.text(), + headers: flatHeaders, + ok: rawRes.ok, + statusText: rawRes.statusText, + }; } catch (e) { this.emit("fetchError", e); - if ((e as FetchError).type === "request-timeout") { + const err = e as { name?: string; code?: string; cause?: { code?: string } }; + if (err.name === "TimeoutError" || err.name === "AbortError") { throw new RequestTimeoutError({ request: this }); - } else if ((e as FetchError).code === "ECONNRESET") { + } else if ( + err.code === "ECONNRESET" || + err.cause?.code === "ECONNRESET" + ) { throw new RequestError(this); } else { throw e; diff --git a/packages/omnipartners/src/lib/Response.ts b/packages/omnipartners/src/lib/Response.ts index 25c2def2..ae1c2081 100644 --- a/packages/omnipartners/src/lib/Response.ts +++ b/packages/omnipartners/src/lib/Response.ts @@ -14,9 +14,9 @@ export interface IFetchResponse { text: () => Promise; headers: IncomingHttpHeaders; ok: boolean; - size: number; + size?: number; statusText: string; - timeout: number; + timeout?: number; } export default class Response { diff --git a/packages/omnipartners/tsconfig.json b/packages/omnipartners/tsconfig.json index e952686b..c1033554 100644 --- a/packages/omnipartners/tsconfig.json +++ b/packages/omnipartners/tsconfig.json @@ -6,6 +6,7 @@ "module": "commonjs", "types": ["@types/jest"], "experimentalDecorators": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "skipLibCheck": true } } diff --git a/yarn.lock b/yarn.lock index 452c8321..c6e72495 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4159,11 +4159,6 @@ "@types/node" "*" "@types/responselike" "*" -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== - "@types/common-tags@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@types/common-tags/-/common-tags-1.8.1.tgz#a5a49ca5ebbb58e0f8947f3ec98950c8970a68a9" @@ -4409,11 +4404,12 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/jsonwebtoken@^8.5.6": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz#1913e5a61e70a192c5a444623da4901a7b1a9d42" - integrity sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ== +"@types/jsonwebtoken@^9": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz#a7932a47177dcd4283b6146f3bd5c26d82647f09" + integrity sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA== dependencies: + "@types/ms" "*" "@types/node" "*" "@types/jwt-decode@^2.2.1": @@ -4465,6 +4461,11 @@ dependencies: "@types/node" "*" +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + "@types/node-fetch@2", "@types/node-fetch@^2.5.10": version "2.5.12" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" @@ -4480,7 +4481,7 @@ dependencies: node-fetch "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^16.11.11": +"@types/node@*", "@types/node@16.11.11", "@types/node@>=10.0.0": version "16.11.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== @@ -4567,23 +4568,6 @@ "@types/scheduler" "^0.16" csstype "^3.0.2" -"@types/request-promise-native@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.18.tgz#437ee2d0b772e01c9691a983b558084b4b3efc2c" - integrity sha512-tPnODeISFc/c1LjWyLuZUY+Z0uLB3+IMfNoQyDEi395+j6kTFTTRAqjENjoPJUid4vHRGEozoTrcTrfZM+AcbA== - dependencies: - "@types/request" "*" - -"@types/request@*", "@types/request@^2.48.7": - version "2.48.7" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.7.tgz#a962d11a26e0d71d9a9913d96bb806dc4d4c2f19" - integrity sha512-GWP9AZW7foLd4YQxyFZDBepl0lPsWLMEXDZUjQ/c1gqVPDPECrRZyEzuhJdnPWioFCq3Tv0qoGpMD6U+ygd4ZA== - dependencies: - "@types/caseless" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -4668,11 +4652,6 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" integrity sha1-EHPEvIJHVK49EM+riKsCN7qWTk0= -"@types/tough-cookie@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.1.tgz#8f80dd965ad81f3e1bc26d6f5c727e132721ff40" - integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg== - "@types/url-join@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/url-join/-/url-join-4.0.1.tgz#4989c97f969464647a8586c7252d97b449cdc045" @@ -6885,10 +6864,10 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-from@1.x, buffer-from@^1.0.0: version "1.1.2" @@ -10448,15 +10427,6 @@ fork-ts-checker-webpack-plugin@^6.5.0: semver "^7.3.2" tapable "^1.0.0" -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -11643,11 +11613,18 @@ graphql-type-json@0.3.2, graphql-type-json@^0.3: resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== -"graphql@14.0.2 - 14.2.0 || ^14.3.1 || ^15.0.0", graphql@^14.5.3, graphql@^15, graphql@^15.5.0, graphql@^15.7.2: +"graphql@14.0.2 - 14.2.0 || ^14.3.1 || ^15.0.0", graphql@^15, graphql@^15.5.0, graphql@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.7.2.tgz#85ab0eeb83722977151b3feb4d631b5f2ab287ef" integrity sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A== +graphql@^14.5.3: + version "14.7.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" + integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA== + dependencies: + iterall "^1.2.2" + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -13030,7 +13007,7 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.3.0: +iterall@^1.2.2, iterall@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -14127,12 +14104,12 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -jsonwebtoken@^8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== +jsonwebtoken@^9: + version "9.0.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" + integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== dependencies: - jws "^3.2.2" + jws "^4.0.1" lodash.includes "^4.3.0" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" @@ -14141,7 +14118,7 @@ jsonwebtoken@^8.5.1: lodash.isstring "^4.0.1" lodash.once "^4.0.0" ms "^2.1.1" - semver "^5.6.0" + semver "^7.5.4" jsprim@^1.2.2: version "1.4.2" @@ -14176,21 +14153,21 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== +jwa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== dependencies: - buffer-equal-constant-time "1.0.1" + buffer-equal-constant-time "^1.0.1" ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== +jws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" + integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== dependencies: - jwa "^1.4.1" + jwa "^2.0.1" safe-buffer "^5.0.1" jwt-decode@^3.1.2: @@ -15645,10 +15622,10 @@ node-fetch@*: fetch-blob "^3.1.2" formdata-polyfill "^4.0.10" -node-fetch@2, node-fetch@^2.6.1, node-fetch@^2.6.6: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== +node-fetch@2, node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -15659,10 +15636,10 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== +node-fetch@^2.6.1, node-fetch@^2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" @@ -17147,10 +17124,15 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.19.1, prettier@^2.5.0, prettier@^3.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.0.tgz#a6370e2d4594e093270419d9cc47f7670488f893" - integrity sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg== +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^3.3.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" + integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== pretty-error@^2.1.2: version "2.1.2" @@ -17906,7 +17888,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.7, request-promise-native@^1.0.9: +request-promise-native@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -17915,7 +17897,7 @@ request-promise-native@^1.0.7, request-promise-native@^1.0.9: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0, request@^2.88.2: +request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -18392,6 +18374,11 @@ semver@^7.0.0, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.5.4: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"