diff --git a/package.json b/package.json index b0ecd8a..bc4492f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fern-api/node-sdk", - "version": "0.1.1", + "version": "0.2.0", "private": false, "repository": "https://github.com/fern-api/node-sdk", "main": "./index.js", @@ -12,12 +12,12 @@ }, "dependencies": { "url-join": "4.0.1", - "@types/url-join": "4.0.1", - "@ungap/url-search-params": "0.2.2", - "axios": "0.27.2", + "qs": "6.11.2", "js-base64": "3.7.2" }, "devDependencies": { + "@types/url-join": "4.0.1", + "@types/qs": "6.9.8", "@types/node": "17.0.33", "prettier": "2.7.1", "typescript": "4.6.4" diff --git a/src/Client.ts b/src/Client.ts index ec70a06..ef7d4ad 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -14,6 +14,7 @@ export declare namespace FernClient { interface RequestOptions { timeoutInSeconds?: number; + maxRetries?: number; } } diff --git a/src/api/resources/snippets/client/Client.ts b/src/api/resources/snippets/client/Client.ts index 7448bb1..bbacade 100644 --- a/src/api/resources/snippets/client/Client.ts +++ b/src/api/resources/snippets/client/Client.ts @@ -8,7 +8,6 @@ import * as Fern from "../../.."; import * as serializers from "../../../../serialization"; import urlJoin from "url-join"; import * as errors from "../../../../errors"; -import { default as URLSearchParams } from "@ungap/url-search-params"; export declare namespace Snippets { interface Options { @@ -18,6 +17,7 @@ export declare namespace Snippets { interface RequestOptions { timeoutInSeconds?: number; + maxRetries?: number; } } @@ -36,6 +36,14 @@ export class Snippets { * @throws {@link Fern.snippets.ApiIdNotFound} * @throws {@link Fern.snippets.EndpointNotFound} * @throws {@link Fern.snippets.SdkNotFound} + * + * @example + * await fern.snippets.get({ + * endpoint: { + * method: Fern.snippets.EndpointMethod.Get, + * path: "/v1/search" + * } + * }) */ public async get( request: Fern.snippets.GetSnippetRequest, @@ -51,13 +59,14 @@ export class Snippets { Authorization: await this._getAuthorizationHeader(), "X-Fern-Language": "JavaScript", "X-Fern-SDK-Name": "@fern-api/node-sdk", - "X-Fern-SDK-Version": "0.1.1", + "X-Fern-SDK-Version": "0.2.0", }, contentType: "application/json", body: await serializers.snippets.GetSnippetRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip", }), timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + maxRetries: requestOptions?.maxRetries, }); if (_response.ok) { return await serializers.snippets.get.Response.parseOrThrow(_response.body, { @@ -187,15 +196,27 @@ export class Snippets { * @throws {@link Fern.snippets.OrgIdNotFound} * @throws {@link Fern.snippets.ApiIdNotFound} * @throws {@link Fern.snippets.SdkNotFound} + * + * @example + * await fern.snippets.load({ + * page: 1, + * orgId: "vellum", + * apiId: "vellum-ai", + * sdks: [{ + * type: "python", + * package: "vellum-ai", + * version: "1.2.1" + * }] + * }) */ public async load( request: Fern.snippets.ListSnippetsRequest = {}, requestOptions?: Snippets.RequestOptions ): Promise { const { page, ..._body } = request; - const _queryParams = new URLSearchParams(); + const _queryParams: Record = {}; if (page != null) { - _queryParams.append("page", page.toString()); + _queryParams["page"] = page.toString(); } const _response = await core.fetcher({ @@ -208,7 +229,7 @@ export class Snippets { Authorization: await this._getAuthorizationHeader(), "X-Fern-Language": "JavaScript", "X-Fern-SDK-Name": "@fern-api/node-sdk", - "X-Fern-SDK-Version": "0.1.1", + "X-Fern-SDK-Version": "0.2.0", }, contentType: "application/json", queryParameters: _queryParams, @@ -216,6 +237,7 @@ export class Snippets { unrecognizedObjectKeys: "strip", }), timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + maxRetries: requestOptions?.maxRetries, }); if (_response.ok) { return await serializers.snippets.SnippetsPage.parseOrThrow(_response.body, { diff --git a/src/api/resources/snippets/client/requests/GetSnippetRequest.ts b/src/api/resources/snippets/client/requests/GetSnippetRequest.ts index 69f4998..2e7bc08 100644 --- a/src/api/resources/snippets/client/requests/GetSnippetRequest.ts +++ b/src/api/resources/snippets/client/requests/GetSnippetRequest.ts @@ -4,6 +4,15 @@ import * as Fern from "../../../.."; +/** + * @example + * { + * endpoint: { + * method: Fern.snippets.EndpointMethod.Get, + * path: "/v1/search" + * } + * } + */ export interface GetSnippetRequest { /** * If the same API is defined across multiple organization, diff --git a/src/api/resources/snippets/client/requests/ListSnippetsRequest.ts b/src/api/resources/snippets/client/requests/ListSnippetsRequest.ts index d9c1b15..bbcbe43 100644 --- a/src/api/resources/snippets/client/requests/ListSnippetsRequest.ts +++ b/src/api/resources/snippets/client/requests/ListSnippetsRequest.ts @@ -4,6 +4,19 @@ import * as Fern from "../../../.."; +/** + * @example + * { + * page: 1, + * orgId: "vellum", + * apiId: "vellum-ai", + * sdks: [{ + * type: "python", + * package: "vellum-ai", + * version: "1.2.1" + * }] + * } + */ export interface ListSnippetsRequest { page?: number; /** diff --git a/src/api/resources/snippets/errors/ApiIdNotFound.ts b/src/api/resources/snippets/errors/ApiIdNotFound.ts index 87ecb9b..60ca097 100644 --- a/src/api/resources/snippets/errors/ApiIdNotFound.ts +++ b/src/api/resources/snippets/errors/ApiIdNotFound.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class ApiIdNotFound extends errors.FernError { constructor(body: string) { super({ + message: "ApiIdNotFound", statusCode: 404, body: body, }); diff --git a/src/api/resources/snippets/errors/ApiIdRequiredError.ts b/src/api/resources/snippets/errors/ApiIdRequiredError.ts index a2cbe7e..f770412 100644 --- a/src/api/resources/snippets/errors/ApiIdRequiredError.ts +++ b/src/api/resources/snippets/errors/ApiIdRequiredError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class ApiIdRequiredError extends errors.FernError { constructor(body: string) { super({ + message: "ApiIdRequiredError", statusCode: 400, body: body, }); diff --git a/src/api/resources/snippets/errors/EndpointNotFound.ts b/src/api/resources/snippets/errors/EndpointNotFound.ts index 1954e21..79f3d13 100644 --- a/src/api/resources/snippets/errors/EndpointNotFound.ts +++ b/src/api/resources/snippets/errors/EndpointNotFound.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class EndpointNotFound extends errors.FernError { constructor(body: string) { super({ + message: "EndpointNotFound", statusCode: 404, body: body, }); diff --git a/src/api/resources/snippets/errors/InvalidPageError.ts b/src/api/resources/snippets/errors/InvalidPageError.ts index 968de31..af1cbbc 100644 --- a/src/api/resources/snippets/errors/InvalidPageError.ts +++ b/src/api/resources/snippets/errors/InvalidPageError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class InvalidPageError extends errors.FernError { constructor(body: string) { super({ + message: "InvalidPageError", statusCode: 400, body: body, }); diff --git a/src/api/resources/snippets/errors/OrgIdAndApiIdNotFound.ts b/src/api/resources/snippets/errors/OrgIdAndApiIdNotFound.ts index ae0bb17..b1f26c3 100644 --- a/src/api/resources/snippets/errors/OrgIdAndApiIdNotFound.ts +++ b/src/api/resources/snippets/errors/OrgIdAndApiIdNotFound.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class OrgIdAndApiIdNotFound extends errors.FernError { constructor(body: string) { super({ + message: "OrgIdAndApiIdNotFound", statusCode: 400, body: body, }); diff --git a/src/api/resources/snippets/errors/OrgIdNotFound.ts b/src/api/resources/snippets/errors/OrgIdNotFound.ts index 09d6aa9..7812f09 100644 --- a/src/api/resources/snippets/errors/OrgIdNotFound.ts +++ b/src/api/resources/snippets/errors/OrgIdNotFound.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class OrgIdNotFound extends errors.FernError { constructor(body: string) { super({ + message: "OrgIdNotFound", statusCode: 404, body: body, }); diff --git a/src/api/resources/snippets/errors/OrgIdRequiredError.ts b/src/api/resources/snippets/errors/OrgIdRequiredError.ts index 8919297..f9b45a4 100644 --- a/src/api/resources/snippets/errors/OrgIdRequiredError.ts +++ b/src/api/resources/snippets/errors/OrgIdRequiredError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class OrgIdRequiredError extends errors.FernError { constructor(body: string) { super({ + message: "OrgIdRequiredError", statusCode: 400, body: body, }); diff --git a/src/api/resources/snippets/errors/SdkNotFound.ts b/src/api/resources/snippets/errors/SdkNotFound.ts index 5dd65eb..7bcfc04 100644 --- a/src/api/resources/snippets/errors/SdkNotFound.ts +++ b/src/api/resources/snippets/errors/SdkNotFound.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../errors"; export class SdkNotFound extends errors.FernError { constructor(body: string) { super({ + message: "SDKNotFound", statusCode: 404, body: body, }); diff --git a/src/api/resources/snippets/resources/commons/errors/UnauthorizedError.ts b/src/api/resources/snippets/resources/commons/errors/UnauthorizedError.ts index 7af78fe..fc66511 100644 --- a/src/api/resources/snippets/resources/commons/errors/UnauthorizedError.ts +++ b/src/api/resources/snippets/resources/commons/errors/UnauthorizedError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../../../errors"; export class UnauthorizedError extends errors.FernError { constructor(body: string) { super({ + message: "UnauthorizedError", statusCode: 401, body: body, }); diff --git a/src/api/resources/snippets/resources/commons/errors/UnavailableError.ts b/src/api/resources/snippets/resources/commons/errors/UnavailableError.ts index 44b4b62..ced9816 100644 --- a/src/api/resources/snippets/resources/commons/errors/UnavailableError.ts +++ b/src/api/resources/snippets/resources/commons/errors/UnavailableError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../../../errors"; export class UnavailableError extends errors.FernError { constructor(body: string) { super({ + message: "UnavailableError", statusCode: 503, body: body, }); diff --git a/src/api/resources/snippets/resources/commons/errors/UserNotInOrgError.ts b/src/api/resources/snippets/resources/commons/errors/UserNotInOrgError.ts index ea406af..409d451 100644 --- a/src/api/resources/snippets/resources/commons/errors/UserNotInOrgError.ts +++ b/src/api/resources/snippets/resources/commons/errors/UserNotInOrgError.ts @@ -7,6 +7,7 @@ import * as errors from "../../../../../../errors"; export class UserNotInOrgError extends errors.FernError { constructor() { super({ + message: "UserNotInOrgError", statusCode: 403, }); Object.setPrototypeOf(this, UserNotInOrgError.prototype); diff --git a/src/core/fetcher/Fetcher.ts b/src/core/fetcher/Fetcher.ts index 6af0fb1..2c30435 100644 --- a/src/core/fetcher/Fetcher.ts +++ b/src/core/fetcher/Fetcher.ts @@ -1,5 +1,4 @@ -import { default as URLSearchParams } from "@ungap/url-search-params"; -import axios, { AxiosAdapter, AxiosError } from "axios"; +import qs from "qs"; import { APIResponse } from "./APIResponse"; export type FetchFunction = (args: Fetcher.Args) => Promise>; @@ -10,13 +9,12 @@ export declare namespace Fetcher { method: string; contentType?: string; headers?: Record; - queryParameters?: URLSearchParams; + queryParameters?: Record; body?: unknown; timeoutMs?: number; + maxRetries?: number; withCredentials?: boolean; responseType?: "json" | "blob"; - adapter?: AxiosAdapter; - onUploadProgress?: (event: ProgressEvent) => void; } export type Error = FailedStatusCodeError | NonJsonError | TimeoutError | UnknownError; @@ -43,6 +41,10 @@ export declare namespace Fetcher { } } +const INITIAL_RETRY_DELAY = 1; +const MAX_RETRY_DELAY = 60; +const DEFAULT_MAX_RETRIES = 2; + async function fetcherImpl(args: Fetcher.Args): Promise> { const headers: Record = {}; if (args.body !== undefined && args.contentType != null) { @@ -57,40 +59,61 @@ async function fetcherImpl(args: Fetcher.Args): Promise 0 + ? `${args.url}?${qs.stringify(args.queryParameters, { arrayFormat: "repeat" })}` + : args.url; + + const makeRequest = async (): Promise => { + const controller = new AbortController(); + let abortId = undefined; + if (args.timeoutMs != null) { + abortId = setTimeout(() => controller.abort(), args.timeoutMs); + } + const response = await fetch(url, { method: args.method, headers, - data: args.body, - validateStatus: () => true, - transformResponse: (response) => response, - timeout: args.timeoutMs, - transitional: { - clarifyTimeoutError: true, - }, - withCredentials: args.withCredentials, - adapter: args.adapter, - onUploadProgress: args.onUploadProgress, - maxBodyLength: Infinity, - maxContentLength: Infinity, - responseType: args.responseType ?? "json", + body: args.body === undefined ? undefined : JSON.stringify(args.body), + signal: controller.signal, + credentials: args.withCredentials ? "same-origin" : undefined, }); + if (abortId != null) { + clearTimeout(abortId); + } + return response; + }; + + try { + let response = await makeRequest(); + + for (let i = 0; i < (args.maxRetries ?? DEFAULT_MAX_RETRIES); ++i) { + if ( + response.status === 408 || + response.status === 409 || + response.status === 429 || + response.status >= 500 + ) { + const delay = Math.min(INITIAL_RETRY_DELAY * Math.pow(i, 2), MAX_RETRY_DELAY); + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await makeRequest(); + } else { + break; + } + } let body: unknown; - if (args.responseType === "blob") { - body = response.data; - } else if (response.data != null && response.data.length > 0) { + if (response.body != null && args.responseType === "blob") { + body = await response.blob(); + } else if (response.body != null) { try { - body = JSON.parse(response.data) ?? undefined; + body = await response.json(); } catch { return { ok: false, error: { reason: "non-json", statusCode: response.status, - rawBody: response.data, + rawBody: await response.text(), }, }; } @@ -112,7 +135,7 @@ async function fetcherImpl(args: Fetcher.Args): Promise(args: Fetcher.Args): Promise(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.BOOLEAN_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), + }, + ], + }; + } + } + ); + + return schemaCreator(); +} diff --git a/src/core/schemas/builders/literals/index.ts b/src/core/schemas/builders/literals/index.ts index a4cd05c..d2bf08f 100644 --- a/src/core/schemas/builders/literals/index.ts +++ b/src/core/schemas/builders/literals/index.ts @@ -1 +1,2 @@ export { stringLiteral } from "./stringLiteral"; +export { booleanLiteral } from "./booleanLiteral"; diff --git a/src/core/schemas/builders/object/index.ts b/src/core/schemas/builders/object/index.ts index e6db5b5..e3f4388 100644 --- a/src/core/schemas/builders/object/index.ts +++ b/src/core/schemas/builders/object/index.ts @@ -1,4 +1,9 @@ export { getObjectUtils, object } from "./object"; +export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties"; +export type { + inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, +} from "./objectWithoutOptionalProperties"; export { isProperty, property } from "./property"; export type { Property } from "./property"; export type { diff --git a/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts new file mode 100644 index 0000000..a0951f4 --- /dev/null +++ b/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts @@ -0,0 +1,18 @@ +import { object } from "./object"; +import { inferParsedPropertySchema, inferRawObjectFromPropertySchemas, ObjectSchema, PropertySchemas } from "./types"; + +export function objectWithoutOptionalProperties>( + schemas: T +): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { + return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; +} + +export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = + ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas + >; + +export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { + [K in keyof T]: inferParsedPropertySchema; +}; diff --git a/yarn.lock b/yarn.lock index e3d7ca2..a59d23e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,77 +7,121 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506" integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ== +"@types/qs@6.9.8": + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + "@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" integrity sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ== -"@ungap/url-search-params@0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" - integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== +call-bind@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - delayed-stream "~1.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -follow-redirects@^1.14.9: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" + function-bind "^1.1.2" js-base64@3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745" integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== prettier@2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +qs@6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + typescript@4.6.4: version "4.6.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"