diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 418debfc0..42ff68521 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 22 - run: yarn install --ignore-scripts - run: yarn run lint @@ -24,7 +24,7 @@ jobs: strategy: fail-fast: true matrix: - node-version: [12] + node-version: [22] os: [ubuntu-latest] steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index c6b794cf9..e8d92975b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [6.49.2] - 2025-06-03 +### Fixed +- Bumped `axios` to newest version without vuln CVE-2025-27152 + ## [6.49.1] - 2025-04-30 ### Fixed - Add yarn.lock changes from previous release @@ -1856,7 +1860,7 @@ instead - `HttpClient` now adds `'Accept-Encoding': 'gzip'` header by default. -[Unreleased]: https://github.com/vtex/node-vtex-api/compare/v6.45.22...HEAD +[Unreleased]: https://github.com/vtex/node-vtex-api/compare/v6.48.1-beta.4...HEAD [6.45.15]: https://github.com/vtex/node-vtex-api/compare/v6.45.14...v6.45.15 [6.45.14]: https://github.com/vtex/node-vtex-api/compare/v6.45.13...v6.45.14 [6.45.13]: https://github.com/vtex/node-vtex-api/compare/v6.45.12...v6.45.13 diff --git a/package.json b/package.json index 5db65dfe4..1ef535ea4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@vtex/api", - "version": "6.49.1", + "version": "6.49.2", "description": "VTEX I/O API client", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -55,7 +55,7 @@ "agentkeepalive": "^4.0.2", "apollo-server-errors": "^2.2.1", "archiver": "^3.0.0", - "axios": "^0.21.1", + "axios": "^1.8.4", "axios-retry": "^3.1.2", "bluebird": "^3.5.4", "chalk": "^2.4.2", diff --git a/src/HttpClient/middlewares/cache.ts b/src/HttpClient/middlewares/cache.ts index e66782886..8134d15b5 100644 --- a/src/HttpClient/middlewares/cache.ts +++ b/src/HttpClient/middlewares/cache.ts @@ -15,7 +15,7 @@ const cacheableStatusCodes = [200, 203, 204, 206, 300, 301, 404, 405, 410, 414, export const cacheKey = (config: AxiosRequestConfig) => { const {baseURL = '', url = '', params, headers} = config - const locale = headers[LOCALE_HEADER] + const locale = headers?.[LOCALE_HEADER] const encodedBaseURL = baseURL.replace(/\//g, '\\') const encodedURL = url.replace(/\//g, '\\') @@ -97,7 +97,7 @@ export const cacheMiddleware = ({ type, storage, asyncSet }: CacheOptions) => { const { rootSpan: span, tracer, logger } = ctx.tracing ?? {} const key = cacheKey(ctx.config) - const segmentToken = ctx.config.headers[SEGMENT_HEADER] + const segmentToken = ctx.config.headers?.[SEGMENT_HEADER] const keyWithSegment = key + segmentToken span?.log({ @@ -153,7 +153,10 @@ export const cacheMiddleware = ({ type, storage, asyncSet }: CacheOptions) => { span?.setTag(CACHE_RESULT_TAG, CacheResult.STALE) const validateStatus = addNotModified(ctx.config.validateStatus!) if (cachedEtag && validateStatus(response.status as number)) { - ctx.config.headers['if-none-match'] = cachedEtag + ctx.config.headers = { + ...ctx.config.headers, + 'if-none-match': cachedEtag + } ctx.config.validateStatus = validateStatus } } else { @@ -229,7 +232,7 @@ export const cacheMiddleware = ({ type, storage, asyncSet }: CacheOptions) => { etag, expiration, response: {data: cacheableData, headers, status}, - responseEncoding, + responseEncoding: responseEncoding as any, responseType, }) if (asyncSet) { diff --git a/src/HttpClient/middlewares/request/index.ts b/src/HttpClient/middlewares/request/index.ts index 2ec3f3f9d..fa9c737d0 100644 --- a/src/HttpClient/middlewares/request/index.ts +++ b/src/HttpClient/middlewares/request/index.ts @@ -1,5 +1,5 @@ import { AxiosRequestConfig } from 'axios' -import buildFullPath from 'axios/lib/core/buildFullPath' +import buildFullPath from '../../../utils/buildFullPath' import { Limit } from 'p-limit' import { stringify } from 'qs' import { toLower } from 'ramda' @@ -47,7 +47,7 @@ export const defaultsMiddleware = ({ baseURL, rawHeaders, params, timeout, retri ...ctx.config, headers: { ...headers, - ...renameBy(toLower, ctx.config.headers), + ...renameBy(toLower, ctx.config.headers as any), }, params: { ...params, diff --git a/src/HttpClient/middlewares/request/setupAxios/interceptors/tracing/spanSetup.ts b/src/HttpClient/middlewares/request/setupAxios/interceptors/tracing/spanSetup.ts index 6ca32dcc4..d9ead2892 100644 --- a/src/HttpClient/middlewares/request/setupAxios/interceptors/tracing/spanSetup.ts +++ b/src/HttpClient/middlewares/request/setupAxios/interceptors/tracing/spanSetup.ts @@ -1,5 +1,5 @@ import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' -import buildFullPath from 'axios/lib/core/buildFullPath' +import buildFullPath from '../../../../../../utils/buildFullPath' import { Span } from 'opentracing' import { ROUTER_CACHE_HEADER } from '../../../../../../constants' import { CustomHttpTags, OpentracingTags } from '../../../../../../tracing/Tags' @@ -12,7 +12,7 @@ export const injectRequestInfoOnSpan = (span: Span | undefined, http: AxiosInsta [OpentracingTags.HTTP_URL]: buildFullPath(config.baseURL, http.getUri(config)), }) - span?.log({ 'request-headers': cloneAndSanitizeHeaders(config.headers) }) + span?.log({ 'request-headers': cloneAndSanitizeHeaders(config.headers as any) }) } // Response may be undefined in case of client timeout, invalid URL, ... diff --git a/src/HttpClient/typings.ts b/src/HttpClient/typings.ts index fb42fdb43..275452203 100644 --- a/src/HttpClient/typings.ts +++ b/src/HttpClient/typings.ts @@ -48,7 +48,7 @@ export interface RequestConfig extends AxiosRequestConfig, RequestTracingConfig memoizeable?: boolean inflightKey?: InflightKeyGenerator forceMaxAge?: number - responseEncoding?: BufferEncoding + responseEncoding?: BufferEncoding | string nullIfNotFound?: boolean ignoreRecorder?: boolean } diff --git a/src/axios.d.ts b/src/axios.d.ts new file mode 100644 index 000000000..fc1a9a18c --- /dev/null +++ b/src/axios.d.ts @@ -0,0 +1,237 @@ +declare module 'axios/index' {} + +declare module 'axios' { + export interface AxiosTransformer { + (data: any, headers?: any): any; + } + + export interface AxiosAdapter { + (config: AxiosRequestConfig): AxiosPromise; + } + + export interface AxiosBasicCredentials { + username: string; + password: string; + } + + export interface AxiosProxyConfig { + host: string; + port: number; + auth?: { + username: string; + password: string; + }; + protocol?: string; + } + + export type Method = + | 'get' | 'GET' + | 'delete' | 'DELETE' + | 'head' | 'HEAD' + | 'options' | 'OPTIONS' + | 'post' | 'POST' + | 'put' | 'PUT' + | 'patch' | 'PATCH' + | 'link' | 'LINK' + | 'unlink' | 'UNLINK'; + + export type ResponseType = + | 'arraybuffer' + | 'blob' + | 'document' + | 'json' + | 'text' + | 'stream'; + + // Tipos de cabeçalho + export type RawAxiosRequestHeaders = Record; + export type RawAxiosResponseHeaders = Record; + export interface AxiosHeaders extends Record { + set(headerName: string, value: string): AxiosHeaders; + get(headerName: string): string | undefined; + delete(headerName: string): boolean; + clear(): AxiosHeaders; + toJSON(): Record; + [key: string]: any; + } + + export interface AxiosRequestConfig { + url?: string; + method?: Method; + baseURL?: string; + transformRequest?: AxiosTransformer | AxiosTransformer[]; + transformResponse?: AxiosTransformer | AxiosTransformer[]; + headers?: RawAxiosRequestHeaders; + params?: any; + paramsSerializer?: (params: any) => string; + data?: any; + timeout?: number; + timeoutErrorMessage?: string; + withCredentials?: boolean; + adapter?: AxiosAdapter; + auth?: AxiosBasicCredentials; + responseType?: ResponseType; + responseEncoding?: string; + xsrfCookieName?: string; + xsrfHeaderName?: string; + onUploadProgress?: (progressEvent: any) => void; + onDownloadProgress?: (progressEvent: any) => void; + maxContentLength?: number; + maxBodyLength?: number; + validateStatus?: (status: number) => boolean; + maxRedirects?: number; + socketPath?: string | null; + httpAgent?: any; + httpsAgent?: any; + proxy?: AxiosProxyConfig | false; + cancelToken?: CancelToken; + decompress?: boolean; + transitional?: any; + signal?: any; + insecureHTTPParser?: boolean; + [key: string]: any; // Para permitir qualquer propriedade adicional + } + + export interface InternalAxiosRequestConfig extends AxiosRequestConfig { + headers: AxiosHeaders | RawAxiosRequestHeaders; + [key: string]: any; // Para permitir propriedades adicionais como 'tracing' + } + + export interface AxiosResponse { + data: T; + status: number; + statusText: string; + headers: RawAxiosResponseHeaders; + config: AxiosRequestConfig; + request?: any; + } + + // Define AxiosError como uma classe para fazer instanceof funcionar + export class AxiosError extends Error { + config: AxiosRequestConfig; + code?: string; + request?: any; + response?: AxiosResponse; + isAxiosError: boolean; + status?: number; + + constructor( + message?: string, + code?: string, + config?: AxiosRequestConfig, + request?: any, + response?: AxiosResponse + ); + + toJSON(): object; + + // Métodos estáticos para criar instâncias de AxiosError + static from( + error: Error, + code?: string, + config?: AxiosRequestConfig, + request?: any, + response?: AxiosResponse, + customProps?: Record + ): AxiosError; + } + + export interface AxiosPromise extends Promise> { + } + + export interface CancelStatic { + new (message?: string): Cancel; + } + + export interface Cancel { + message: string; + } + + export interface Canceler { + (message?: string): void; + } + + export interface CancelTokenStatic { + new (executor: (cancel: Canceler) => void): CancelToken; + source(): CancelTokenSource; + } + + export interface CancelToken { + promise: Promise; + reason?: Cancel; + throwIfRequested(): void; + } + + export interface CancelTokenSource { + token: CancelToken; + cancel: Canceler; + } + + export interface AxiosInterceptorManager { + use(onFulfilled?: (value: V) => V | Promise, onRejected?: (error: any) => any): number; + eject(id: number): void; + clear(): void; + } + + export interface AxiosInstance { + (config: AxiosRequestConfig): AxiosPromise; + (url: string, config?: AxiosRequestConfig): AxiosPromise; + defaults: AxiosRequestConfig; + interceptors: { + request: AxiosInterceptorManager; + response: AxiosInterceptorManager; + }; + getUri(config?: AxiosRequestConfig): string; + request>(config: AxiosRequestConfig): Promise; + get>(url: string, config?: AxiosRequestConfig): Promise; + delete>(url: string, config?: AxiosRequestConfig): Promise; + head>(url: string, config?: AxiosRequestConfig): Promise; + options>(url: string, config?: AxiosRequestConfig): Promise; + post>(url: string, data?: any, config?: AxiosRequestConfig): Promise; + put>(url: string, data?: any, config?: AxiosRequestConfig): Promise; + patch>(url: string, data?: any, config?: AxiosRequestConfig): Promise; + } + + export interface AxiosStatic extends AxiosInstance { + create(config?: AxiosRequestConfig): AxiosInstance; + Cancel: CancelStatic; + CancelToken: CancelTokenStatic; + isCancel(value: any): boolean; + all(values: (T | Promise)[]): Promise; + spread(callback: (...args: T[]) => R): (array: T[]) => R; + isAxiosError(payload: any): payload is AxiosError; + } + + const axios: AxiosStatic; + + export const AxiosError: { + new ( + message?: string, + code?: string, + config?: AxiosRequestConfig, + request?: any, + response?: AxiosResponse + ): AxiosError; + readonly prototype: AxiosError; + readonly ERR_NETWORK: string; + readonly ERR_BAD_REQUEST: string; + readonly TIMEOUT_ERROR_CODE: string; + readonly ERR_BAD_RESPONSE: string; + readonly ERR_FR_TOO_MANY_REDIRECTS: string; + readonly ERR_DEPRECATED: string; + readonly ERR_BAD_OPTION_VALUE: string; + readonly ERR_CANCELED: string; + readonly ECONNABORTED: string; + readonly ETIMEDOUT: string; + from( + error: Error, + code?: string, + config?: AxiosRequestConfig, + request?: any, + response?: AxiosResponse, + customProps?: Record + ): AxiosError; + }; + + export default axios; +} diff --git a/src/caches/DiskCache.ts b/src/caches/DiskCache.ts index 8d7d3c1bd..1f640ba05 100644 --- a/src/caches/DiskCache.ts +++ b/src/caches/DiskCache.ts @@ -34,7 +34,7 @@ export class DiskCache implements CacheLayer{ public get = async (key: string): Promise => { const pathKey = this.getPathKey(key) this.total += 1 - const data = await new Promise(resolve => { + const data = await new Promise(resolve => { this.lock.readLock(key, async (release: () => void) => { try { const fileData = await this.readFile(pathKey) diff --git a/src/caches/LRUDiskCache.ts b/src/caches/LRUDiskCache.ts index 8bc8980ba..60c16b6d1 100644 --- a/src/caches/LRUDiskCache.ts +++ b/src/caches/LRUDiskCache.ts @@ -70,7 +70,7 @@ export class LRUDiskCache implements CacheLayer{ const pathKey = this.getPathKey(key) - const data = await new Promise(resolve => { + const data = await new Promise(resolve => { this.lock.readLock(key, async (release: () => void) => { try { const fileData = await this.readFile(pathKey) diff --git a/src/caches/MultilayeredCache.ts b/src/caches/MultilayeredCache.ts index b44056404..9ec1337cd 100644 --- a/src/caches/MultilayeredCache.ts +++ b/src/caches/MultilayeredCache.ts @@ -10,7 +10,7 @@ export class MultilayeredCache implements CacheLayer{ constructor (private caches: Array>) {} public get = async (key: K, fetcher?: () => Promise>): Promise => { - let value: V | void + let value: V | void = undefined let maxAge: number | void let successIndex = await this.findIndex(async (cache: CacheLayer) => { const [getValue, hasKey] = await Promise.all([cache.get(key), cache.has(key)]) diff --git a/src/clients/infra/VBase.ts b/src/clients/infra/VBase.ts index 1e3dd949f..e71b009e4 100644 --- a/src/clients/infra/VBase.ts +++ b/src/clients/infra/VBase.ts @@ -1,4 +1,4 @@ -import { AxiosError } from 'axios' +import { AxiosError, RawAxiosRequestHeaders } from 'axios' import { IncomingMessage } from 'http' import mime from 'mime-types' import { basename } from 'path' @@ -176,7 +176,7 @@ export class VBase extends InfraClient { } public deleteFile = (bucket: string, path: string, tracingConfig?: RequestTracingConfig, ifMatch?: string) => { - const headers = ifMatch ? { 'If-Match': ifMatch } : null + const headers: RawAxiosRequestHeaders | {} = ifMatch ? { 'If-Match': ifMatch } : {} const metric = 'vbase-delete-file' return this.http.delete(routes.File(bucket, path), {headers, metric, tracing: { requestSpanNameSuffix: metric, diff --git a/src/service/worker/runtime/graphql/schema/schemaDirectives/Auth.ts b/src/service/worker/runtime/graphql/schema/schemaDirectives/Auth.ts index e6a26cdca..c2aefe891 100644 --- a/src/service/worker/runtime/graphql/schema/schemaDirectives/Auth.ts +++ b/src/service/worker/runtime/graphql/schema/schemaDirectives/Auth.ts @@ -10,7 +10,7 @@ interface AuthDirectiveArgs { readonly resourceCode: string } -type VtexIdParsedToken = { +interface VtexIdParsedToken { user: string account: string } @@ -51,7 +51,7 @@ async function auth (ctx: ServiceContext, authArgs: AuthDirectiveArgs): Promise< } const parsedToken = await parseIdToken(ctx.vtex.authToken, vtexIdToken) - if (!parsedToken || parsedToken.account != ctx.vtex.account) { + if (!parsedToken || parsedToken.account !== ctx.vtex.account) { throw new AuthenticationError('Could not find user specified by VtexIdclientAutCookie.') } diff --git a/src/service/worker/runtime/http/middlewares/error.ts b/src/service/worker/runtime/http/middlewares/error.ts index fbb2fd904..b260f0d0f 100644 --- a/src/service/worker/runtime/http/middlewares/error.ts +++ b/src/service/worker/runtime/http/middlewares/error.ts @@ -102,12 +102,12 @@ export async function error (ctx: ServiceContext, next: () => Promise) { const err = cleanError(e) // Add response - ctx.status = e && e.status >= 400 && e.status <= 599 + ctx.status = e?.status && e.status >= 400 && e.status <= 599 ? e.status : ctx.status >= 500 && ctx.status <= 599 ? ctx.status : 500 - + // Do not generate etag for errors ctx.remove(META_HEADER) ctx.remove(ETAG_HEADER) diff --git a/src/utils/buildFullPath.ts b/src/utils/buildFullPath.ts new file mode 100644 index 000000000..b4efcdff9 --- /dev/null +++ b/src/utils/buildFullPath.ts @@ -0,0 +1,56 @@ +// This module is part of the Axios library. +// It is used to build a full URL by combining a base URL with a relative URL. + +// It is originally not intended to be used directly, but rather as a utility function within the Axios library. +// Since Axios 1.0, this function is not exported by default, and the team does not recommend using it directly, +// as it may not be available in future versions. + +// The function takes a base URL and a relative URL as input, and returns the full URL. +// It handles both absolute and relative URLs, and ensures that the resulting URL is properly formatted. +// It is used internally by Axios to construct the full URL for HTTP requests. + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ +export default function(baseURL?: string, requestedURL?: string, allowAbsoluteUrls?: boolean): string | undefined { + let isRelativeUrl = !isAbsoluteURL(requestedURL); + if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; + } + + /** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ + function isAbsoluteURL(url?: string): boolean { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return !!url && /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); + } + + /** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ + function combineURLs(baseURL?: string, relativeURL?: string): string | undefined { + return relativeURL && baseURL + ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; + } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4224ecc7f..09f457d94 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,11 @@ "declaration": true, "outDir": "lib", "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "baseUrl": "./", + "paths": { + "axios": ["src/axios.d.ts"] + } }, "include": ["src/**/*.ts"], "exclude": ["**/__tests__", "**/*.test.ts"] diff --git a/yarn.lock b/yarn.lock index 7f459da1f..6a8dc6e83 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1558,12 +1558,14 @@ axios-retry@^3.1.2: dependencies: is-retry-allowed "^1.1.0" -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== +axios@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" + integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" babel-jest@^25.1.0: version "25.1.0" @@ -1782,6 +1784,14 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1921,7 +1931,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2236,6 +2246,15 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2310,6 +2329,33 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2521,10 +2567,10 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-in@^1.0.2: version "1.0.2" @@ -2536,6 +2582,16 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -2611,11 +2667,35 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-port@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2671,6 +2751,11 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" @@ -2737,6 +2822,18 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + 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-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -3892,6 +3989,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4438,6 +4540,11 @@ protobufjs@^7.2.5, protobufjs@^7.3.0: "@types/node" ">=13.7.0" long "^5.0.0" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.28: version "1.7.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c"