From ca031278ca9ca30277620e344f7a95c597a8a0de Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sat, 2 Aug 2025 18:50:19 -0400 Subject: wip: plugins --- packages/sdk/js/src/gen/client/client.ts | 154 +++++++------ packages/sdk/js/src/gen/client/index.ts | 18 +- packages/sdk/js/src/gen/client/types.ts | 165 ++++++-------- packages/sdk/js/src/gen/client/utils.ts | 356 ++++++++++++++----------------- 4 files changed, 302 insertions(+), 391 deletions(-) (limited to 'packages/sdk/js/src/gen/client') diff --git a/packages/sdk/js/src/gen/client/client.ts b/packages/sdk/js/src/gen/client/client.ts index 89d1e3158..bc009574b 100644 --- a/packages/sdk/js/src/gen/client/client.ts +++ b/packages/sdk/js/src/gen/client/client.ts @@ -1,4 +1,4 @@ -import type { Client, Config, RequestOptions } from './types'; +import type { Client, Config, RequestOptions } from "./types" import { buildUrl, createConfig, @@ -7,189 +7,179 @@ import { mergeConfigs, mergeHeaders, setAuthParams, -} from './utils'; +} from "./utils" -type ReqInit = Omit & { - body?: any; - headers: ReturnType; -}; +type ReqInit = Omit & { + body?: any + headers: ReturnType +} export const createClient = (config: Config = {}): Client => { - let _config = mergeConfigs(createConfig(), config); + let _config = mergeConfigs(createConfig(), config) - const getConfig = (): Config => ({ ..._config }); + const getConfig = (): Config => ({ ..._config }) const setConfig = (config: Config): Config => { - _config = mergeConfigs(_config, config); - return getConfig(); - }; - - const interceptors = createInterceptors< - Request, - Response, - unknown, - RequestOptions - >(); - - const request: Client['request'] = async (options) => { + _config = mergeConfigs(_config, config) + return getConfig() + } + + const interceptors = createInterceptors() + + const request: Client["request"] = async (options) => { const opts = { ..._config, ...options, fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, headers: mergeHeaders(_config.headers, options.headers), - }; + } if (opts.security) { await setAuthParams({ ...opts, security: opts.security, - }); + }) } if (opts.requestValidator) { - await opts.requestValidator(opts); + await opts.requestValidator(opts) } if (opts.body && opts.bodySerializer) { - opts.body = opts.bodySerializer(opts.body); + opts.body = opts.bodySerializer(opts.body) } // remove Content-Type header if body is empty to avoid sending invalid requests - if (opts.body === undefined || opts.body === '') { - opts.headers.delete('Content-Type'); + if (opts.body === undefined || opts.body === "") { + opts.headers.delete("Content-Type") } - const url = buildUrl(opts); + const url = buildUrl(opts) const requestInit: ReqInit = { - redirect: 'follow', + redirect: "follow", ...opts, - }; + } - let request = new Request(url, requestInit); + let request = new Request(url, requestInit) for (const fn of interceptors.request._fns) { if (fn) { - request = await fn(request, opts); + request = await fn(request, opts) } } // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation - const _fetch = opts.fetch!; - let response = await _fetch(request); + const _fetch = opts.fetch! + let response = await _fetch(request) for (const fn of interceptors.response._fns) { if (fn) { - response = await fn(response, request, opts); + response = await fn(response, request, opts) } } const result = { request, response, - }; + } if (response.ok) { - if ( - response.status === 204 || - response.headers.get('Content-Length') === '0' - ) { - return opts.responseStyle === 'data' + if (response.status === 204 || response.headers.get("Content-Length") === "0") { + return opts.responseStyle === "data" ? {} : { data: {}, ...result, - }; + } } const parseAs = - (opts.parseAs === 'auto' - ? getParseAs(response.headers.get('Content-Type')) - : opts.parseAs) ?? 'json'; + (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json" - let data: any; + let data: any switch (parseAs) { - case 'arrayBuffer': - case 'blob': - case 'formData': - case 'json': - case 'text': - data = await response[parseAs](); - break; - case 'stream': - return opts.responseStyle === 'data' + case "arrayBuffer": + case "blob": + case "formData": + case "json": + case "text": + data = await response[parseAs]() + break + case "stream": + return opts.responseStyle === "data" ? response.body : { data: response.body, ...result, - }; + } } - if (parseAs === 'json') { + if (parseAs === "json") { if (opts.responseValidator) { - await opts.responseValidator(data); + await opts.responseValidator(data) } if (opts.responseTransformer) { - data = await opts.responseTransformer(data); + data = await opts.responseTransformer(data) } } - return opts.responseStyle === 'data' + return opts.responseStyle === "data" ? data : { data, ...result, - }; + } } - const textError = await response.text(); - let jsonError: unknown; + const textError = await response.text() + let jsonError: unknown try { - jsonError = JSON.parse(textError); + jsonError = JSON.parse(textError) } catch { // noop } - const error = jsonError ?? textError; - let finalError = error; + const error = jsonError ?? textError + let finalError = error for (const fn of interceptors.error._fns) { if (fn) { - finalError = (await fn(error, response, request, opts)) as string; + finalError = (await fn(error, response, request, opts)) as string } } - finalError = finalError || ({} as string); + finalError = finalError || ({} as string) if (opts.throwOnError) { - throw finalError; + throw finalError } // TODO: we probably want to return error and improve types - return opts.responseStyle === 'data' + return opts.responseStyle === "data" ? undefined : { error: finalError, ...result, - }; - }; + } + } return { buildUrl, - connect: (options) => request({ ...options, method: 'CONNECT' }), - delete: (options) => request({ ...options, method: 'DELETE' }), - get: (options) => request({ ...options, method: 'GET' }), + connect: (options) => request({ ...options, method: "CONNECT" }), + delete: (options) => request({ ...options, method: "DELETE" }), + get: (options) => request({ ...options, method: "GET" }), getConfig, - head: (options) => request({ ...options, method: 'HEAD' }), + head: (options) => request({ ...options, method: "HEAD" }), interceptors, - options: (options) => request({ ...options, method: 'OPTIONS' }), - patch: (options) => request({ ...options, method: 'PATCH' }), - post: (options) => request({ ...options, method: 'POST' }), - put: (options) => request({ ...options, method: 'PUT' }), + options: (options) => request({ ...options, method: "OPTIONS" }), + patch: (options) => request({ ...options, method: "PATCH" }), + post: (options) => request({ ...options, method: "POST" }), + put: (options) => request({ ...options, method: "PUT" }), request, setConfig, - trace: (options) => request({ ...options, method: 'TRACE' }), - }; -}; + trace: (options) => request({ ...options, method: "TRACE" }), + } +} diff --git a/packages/sdk/js/src/gen/client/index.ts b/packages/sdk/js/src/gen/client/index.ts index 5da1f7aee..c6b869b86 100644 --- a/packages/sdk/js/src/gen/client/index.ts +++ b/packages/sdk/js/src/gen/client/index.ts @@ -1,12 +1,8 @@ -export type { Auth } from '../core/auth'; -export type { QuerySerializerOptions } from '../core/bodySerializer'; -export { - formDataBodySerializer, - jsonBodySerializer, - urlSearchParamsBodySerializer, -} from '../core/bodySerializer'; -export { buildClientParams } from '../core/params'; -export { createClient } from './client'; +export type { Auth } from "../core/auth" +export type { QuerySerializerOptions } from "../core/bodySerializer" +export { formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer } from "../core/bodySerializer" +export { buildClientParams } from "../core/params" +export { createClient } from "./client" export type { Client, ClientOptions, @@ -18,5 +14,5 @@ export type { RequestResult, ResponseStyle, TDataShape, -} from './types'; -export { createConfig, mergeHeaders } from './utils'; +} from "./types" +export { createConfig, mergeHeaders } from "./utils" diff --git a/packages/sdk/js/src/gen/client/types.ts b/packages/sdk/js/src/gen/client/types.ts index 85295df07..7f76fc517 100644 --- a/packages/sdk/js/src/gen/client/types.ts +++ b/packages/sdk/js/src/gen/client/types.ts @@ -1,33 +1,30 @@ -import type { Auth } from '../core/auth'; -import type { - Client as CoreClient, - Config as CoreConfig, -} from '../core/types'; -import type { Middleware } from './utils'; +import type { Auth } from "../core/auth" +import type { Client as CoreClient, Config as CoreConfig } from "../core/types" +import type { Middleware } from "./utils" -export type ResponseStyle = 'data' | 'fields'; +export type ResponseStyle = "data" | "fields" export interface Config - extends Omit, + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ - baseUrl?: T['baseUrl']; + baseUrl?: T["baseUrl"] /** * Fetch API implementation. You can use this option to provide a custom * fetch instance. * * @default globalThis.fetch */ - fetch?: (request: Request) => ReturnType; + fetch?: (request: Request) => ReturnType /** * Please don't use the Fetch client for Next.js applications. The `next` * options won't have any effect. * * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. */ - next?: never; + next?: never /** * Return the response data parsed in a specified format. By default, `auto` * will infer the appropriate method from the `Content-Type` response header. @@ -36,135 +33,118 @@ export interface Config * * @default 'auto' */ - parseAs?: - | 'arrayBuffer' - | 'auto' - | 'blob' - | 'formData' - | 'json' - | 'stream' - | 'text'; + parseAs?: "arrayBuffer" | "auto" | "blob" | "formData" | "json" | "stream" | "text" /** * Should we return only data or multiple fields (data, error, response, etc.)? * * @default 'fields' */ - responseStyle?: ResponseStyle; + responseStyle?: ResponseStyle /** * Throw an error instead of returning it in the response? * * @default false */ - throwOnError?: T['throwOnError']; + throwOnError?: T["throwOnError"] } export interface RequestOptions< - TResponseStyle extends ResponseStyle = 'fields', + TResponseStyle extends ResponseStyle = "fields", ThrowOnError extends boolean = boolean, Url extends string = string, > extends Config<{ - responseStyle: TResponseStyle; - throwOnError: ThrowOnError; + responseStyle: TResponseStyle + throwOnError: ThrowOnError }> { /** * Any body that you want to add to your request. * * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} */ - body?: unknown; - path?: Record; - query?: Record; + body?: unknown + path?: Record + query?: Record /** * Security mechanism(s) to use for the request. */ - security?: ReadonlyArray; - url: Url; + security?: ReadonlyArray + url: Url } export type RequestResult< TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields', + TResponseStyle extends ResponseStyle = "fields", > = ThrowOnError extends true ? Promise< - TResponseStyle extends 'data' + TResponseStyle extends "data" ? TData extends Record ? TData[keyof TData] : TData : { - data: TData extends Record - ? TData[keyof TData] - : TData; - request: Request; - response: Response; + data: TData extends Record ? TData[keyof TData] : TData + request: Request + response: Response } > : Promise< - TResponseStyle extends 'data' - ? - | (TData extends Record - ? TData[keyof TData] - : TData) - | undefined + TResponseStyle extends "data" + ? (TData extends Record ? TData[keyof TData] : TData) | undefined : ( | { - data: TData extends Record - ? TData[keyof TData] - : TData; - error: undefined; + data: TData extends Record ? TData[keyof TData] : TData + error: undefined } | { - data: undefined; - error: TError extends Record - ? TError[keyof TError] - : TError; + data: undefined + error: TError extends Record ? TError[keyof TError] : TError } ) & { - request: Request; - response: Response; + request: Request + response: Response } - >; + > export interface ClientOptions { - baseUrl?: string; - responseStyle?: ResponseStyle; - throwOnError?: boolean; + baseUrl?: string + responseStyle?: ResponseStyle + throwOnError?: boolean } type MethodFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields', + TResponseStyle extends ResponseStyle = "fields", >( - options: Omit, 'method'>, -) => RequestResult; + options: Omit, "method">, +) => RequestResult type RequestFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields', + TResponseStyle extends ResponseStyle = "fields", >( - options: Omit, 'method'> & - Pick>, 'method'>, -) => RequestResult; + options: Omit, "method"> & + Pick>, "method">, +) => RequestResult type BuildUrlFn = < TData extends { - body?: unknown; - path?: Record; - query?: Record; - url: string; + body?: unknown + path?: Record + query?: Record + url: string }, >( - options: Pick & Options, -) => string; + options: Pick & Options, +) => string export type Client = CoreClient & { - interceptors: Middleware; -}; + interceptors: Middleware +} /** * The `createClientConfig()` function will be called on client initialization @@ -176,47 +156,36 @@ export type Client = CoreClient & { */ export type CreateClientConfig = ( override?: Config, -) => Config & T>; +) => Config & T> export interface TDataShape { - body?: unknown; - headers?: unknown; - path?: unknown; - query?: unknown; - url: string; + body?: unknown + headers?: unknown + path?: unknown + query?: unknown + url: string } -type OmitKeys = Pick>; +type OmitKeys = Pick> export type Options< TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields', -> = OmitKeys< - RequestOptions, - 'body' | 'path' | 'query' | 'url' -> & - Omit; + TResponseStyle extends ResponseStyle = "fields", +> = OmitKeys, "body" | "path" | "query" | "url"> & Omit export type OptionsLegacyParser< TData = unknown, ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields', + TResponseStyle extends ResponseStyle = "fields", > = TData extends { body?: any } ? TData extends { headers?: any } - ? OmitKeys< - RequestOptions, - 'body' | 'headers' | 'url' - > & - TData - : OmitKeys, 'body' | 'url'> & + ? OmitKeys, "body" | "headers" | "url"> & TData + : OmitKeys, "body" | "url"> & TData & - Pick, 'headers'> + Pick, "headers"> : TData extends { headers?: any } - ? OmitKeys< - RequestOptions, - 'headers' | 'url' - > & + ? OmitKeys, "headers" | "url"> & TData & - Pick, 'body'> - : OmitKeys, 'url'> & TData; + Pick, "body"> + : OmitKeys, "url"> & TData diff --git a/packages/sdk/js/src/gen/client/utils.ts b/packages/sdk/js/src/gen/client/utils.ts index a52e67292..7b7942633 100644 --- a/packages/sdk/js/src/gen/client/utils.ts +++ b/packages/sdk/js/src/gen/client/utils.ts @@ -1,64 +1,54 @@ -import { getAuthToken } from '../core/auth'; -import type { - QuerySerializer, - QuerySerializerOptions, -} from '../core/bodySerializer'; -import { jsonBodySerializer } from '../core/bodySerializer'; -import { - serializeArrayParam, - serializeObjectParam, - serializePrimitiveParam, -} from '../core/pathSerializer'; -import type { Client, ClientOptions, Config, RequestOptions } from './types'; +import { getAuthToken } from "../core/auth" +import type { QuerySerializer, QuerySerializerOptions } from "../core/bodySerializer" +import { jsonBodySerializer } from "../core/bodySerializer" +import { serializeArrayParam, serializeObjectParam, serializePrimitiveParam } from "../core/pathSerializer" +import type { Client, ClientOptions, Config, RequestOptions } from "./types" interface PathSerializer { - path: Record; - url: string; + path: Record + url: string } -const PATH_PARAM_RE = /\{[^{}]+\}/g; +const PATH_PARAM_RE = /\{[^{}]+\}/g -type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; -type MatrixStyle = 'label' | 'matrix' | 'simple'; -type ArraySeparatorStyle = ArrayStyle | MatrixStyle; +type ArrayStyle = "form" | "spaceDelimited" | "pipeDelimited" +type MatrixStyle = "label" | "matrix" | "simple" +type ArraySeparatorStyle = ArrayStyle | MatrixStyle const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { - let url = _url; - const matches = _url.match(PATH_PARAM_RE); + let url = _url + const matches = _url.match(PATH_PARAM_RE) if (matches) { for (const match of matches) { - let explode = false; - let name = match.substring(1, match.length - 1); - let style: ArraySeparatorStyle = 'simple'; + let explode = false + let name = match.substring(1, match.length - 1) + let style: ArraySeparatorStyle = "simple" - if (name.endsWith('*')) { - explode = true; - name = name.substring(0, name.length - 1); + if (name.endsWith("*")) { + explode = true + name = name.substring(0, name.length - 1) } - if (name.startsWith('.')) { - name = name.substring(1); - style = 'label'; - } else if (name.startsWith(';')) { - name = name.substring(1); - style = 'matrix'; + if (name.startsWith(".")) { + name = name.substring(1) + style = "label" + } else if (name.startsWith(";")) { + name = name.substring(1) + style = "matrix" } - const value = path[name]; + const value = path[name] if (value === undefined || value === null) { - continue; + continue } if (Array.isArray(value)) { - url = url.replace( - match, - serializeArrayParam({ explode, name, style, value }), - ); - continue; + url = url.replace(match, serializeArrayParam({ explode, name, style, value })) + continue } - if (typeof value === 'object') { + if (typeof value === "object") { url = url.replace( match, serializeObjectParam({ @@ -68,43 +58,37 @@ const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { value: value as Record, valueOnly: true, }), - ); - continue; + ) + continue } - if (style === 'matrix') { + if (style === "matrix") { url = url.replace( match, `;${serializePrimitiveParam({ name, value: value as string, })}`, - ); - continue; + ) + continue } - const replaceValue = encodeURIComponent( - style === 'label' ? `.${value as string}` : (value as string), - ); - url = url.replace(match, replaceValue); + const replaceValue = encodeURIComponent(style === "label" ? `.${value as string}` : (value as string)) + url = url.replace(match, replaceValue) } } - return url; -}; - -export const createQuerySerializer = ({ - allowReserved, - array, - object, -}: QuerySerializerOptions = {}) => { + return url +} + +export const createQuerySerializer = ({ allowReserved, array, object }: QuerySerializerOptions = {}) => { const querySerializer = (queryParams: T) => { - const search: string[] = []; - if (queryParams && typeof queryParams === 'object') { + const search: string[] = [] + if (queryParams && typeof queryParams === "object") { for (const name in queryParams) { - const value = queryParams[name]; + const value = queryParams[name] if (value === undefined || value === null) { - continue; + continue } if (Array.isArray(value)) { @@ -112,129 +96,120 @@ export const createQuerySerializer = ({ allowReserved, explode: true, name, - style: 'form', + style: "form", value, ...array, - }); - if (serializedArray) search.push(serializedArray); - } else if (typeof value === 'object') { + }) + if (serializedArray) search.push(serializedArray) + } else if (typeof value === "object") { const serializedObject = serializeObjectParam({ allowReserved, explode: true, name, - style: 'deepObject', + style: "deepObject", value: value as Record, ...object, - }); - if (serializedObject) search.push(serializedObject); + }) + if (serializedObject) search.push(serializedObject) } else { const serializedPrimitive = serializePrimitiveParam({ allowReserved, name, value: value as string, - }); - if (serializedPrimitive) search.push(serializedPrimitive); + }) + if (serializedPrimitive) search.push(serializedPrimitive) } } } - return search.join('&'); - }; - return querySerializer; -}; + return search.join("&") + } + return querySerializer +} /** * Infers parseAs value from provided Content-Type header. */ -export const getParseAs = ( - contentType: string | null, -): Exclude => { +export const getParseAs = (contentType: string | null): Exclude => { if (!contentType) { // If no Content-Type header is provided, the best we can do is return the raw response body, // which is effectively the same as the 'stream' option. - return 'stream'; + return "stream" } - const cleanContent = contentType.split(';')[0]?.trim(); + const cleanContent = contentType.split(";")[0]?.trim() if (!cleanContent) { - return; + return } - if ( - cleanContent.startsWith('application/json') || - cleanContent.endsWith('+json') - ) { - return 'json'; + if (cleanContent.startsWith("application/json") || cleanContent.endsWith("+json")) { + return "json" } - if (cleanContent === 'multipart/form-data') { - return 'formData'; + if (cleanContent === "multipart/form-data") { + return "formData" } - if ( - ['application/', 'audio/', 'image/', 'video/'].some((type) => - cleanContent.startsWith(type), - ) - ) { - return 'blob'; + if (["application/", "audio/", "image/", "video/"].some((type) => cleanContent.startsWith(type))) { + return "blob" } - if (cleanContent.startsWith('text/')) { - return 'text'; + if (cleanContent.startsWith("text/")) { + return "text" } - return; -}; + return +} export const setAuthParams = async ({ security, ...options -}: Pick, 'security'> & - Pick & { - headers: Headers; +}: Pick, "security"> & + Pick & { + headers: Headers }) => { for (const auth of security) { - const token = await getAuthToken(auth, options.auth); + const token = await getAuthToken(auth, options.auth) if (!token) { - continue; + continue } - const name = auth.name ?? 'Authorization'; + const name = auth.name ?? "Authorization" switch (auth.in) { - case 'query': + case "query": if (!options.query) { - options.query = {}; + options.query = {} } - options.query[name] = token; - break; - case 'cookie': - options.headers.append('Cookie', `${name}=${token}`); - break; - case 'header': + options.query[name] = token + break + case "cookie": + options.headers.append("Cookie", `${name}=${token}`) + break + case "header": default: - options.headers.set(name, token); - break; + options.headers.set(name, token) + break } - return; + return } -}; +} -export const buildUrl: Client['buildUrl'] = (options) => { +export const buildUrl: Client["buildUrl"] = (options) => { const url = getUrl({ baseUrl: options.baseUrl as string, path: options.path, query: options.query, querySerializer: - typeof options.querySerializer === 'function' + typeof options.querySerializer === "function" ? options.querySerializer : createQuerySerializer(options.querySerializer), url: options.url, - }); - return url; -}; + }) + return url +} export const getUrl = ({ baseUrl, @@ -243,144 +218,125 @@ export const getUrl = ({ querySerializer, url: _url, }: { - baseUrl?: string; - path?: Record; - query?: Record; - querySerializer: QuerySerializer; - url: string; + baseUrl?: string + path?: Record + query?: Record + querySerializer: QuerySerializer + url: string }) => { - const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; - let url = (baseUrl ?? '') + pathUrl; + const pathUrl = _url.startsWith("/") ? _url : `/${_url}` + let url = (baseUrl ?? "") + pathUrl if (path) { - url = defaultPathSerializer({ path, url }); + url = defaultPathSerializer({ path, url }) } - let search = query ? querySerializer(query) : ''; - if (search.startsWith('?')) { - search = search.substring(1); + let search = query ? querySerializer(query) : "" + if (search.startsWith("?")) { + search = search.substring(1) } if (search) { - url += `?${search}`; + url += `?${search}` } - return url; -}; + return url +} export const mergeConfigs = (a: Config, b: Config): Config => { - const config = { ...a, ...b }; - if (config.baseUrl?.endsWith('/')) { - config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); + const config = { ...a, ...b } + if (config.baseUrl?.endsWith("/")) { + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1) } - config.headers = mergeHeaders(a.headers, b.headers); - return config; -}; - -export const mergeHeaders = ( - ...headers: Array['headers'] | undefined> -): Headers => { - const mergedHeaders = new Headers(); + config.headers = mergeHeaders(a.headers, b.headers) + return config +} + +export const mergeHeaders = (...headers: Array["headers"] | undefined>): Headers => { + const mergedHeaders = new Headers() for (const header of headers) { - if (!header || typeof header !== 'object') { - continue; + if (!header || typeof header !== "object") { + continue } - const iterator = - header instanceof Headers ? header.entries() : Object.entries(header); + const iterator = header instanceof Headers ? header.entries() : Object.entries(header) for (const [key, value] of iterator) { if (value === null) { - mergedHeaders.delete(key); + mergedHeaders.delete(key) } else if (Array.isArray(value)) { for (const v of value) { - mergedHeaders.append(key, v as string); + mergedHeaders.append(key, v as string) } } else if (value !== undefined) { // assume object headers are meant to be JSON stringified, i.e. their // content value in OpenAPI specification is 'application/json' - mergedHeaders.set( - key, - typeof value === 'object' ? JSON.stringify(value) : (value as string), - ); + mergedHeaders.set(key, typeof value === "object" ? JSON.stringify(value) : (value as string)) } } } - return mergedHeaders; -}; + return mergedHeaders +} type ErrInterceptor = ( error: Err, response: Res, request: Req, options: Options, -) => Err | Promise; +) => Err | Promise -type ReqInterceptor = ( - request: Req, - options: Options, -) => Req | Promise; +type ReqInterceptor = (request: Req, options: Options) => Req | Promise -type ResInterceptor = ( - response: Res, - request: Req, - options: Options, -) => Res | Promise; +type ResInterceptor = (response: Res, request: Req, options: Options) => Res | Promise class Interceptors { - _fns: (Interceptor | null)[]; + _fns: (Interceptor | null)[] constructor() { - this._fns = []; + this._fns = [] } clear() { - this._fns = []; + this._fns = [] } getInterceptorIndex(id: number | Interceptor): number { - if (typeof id === 'number') { - return this._fns[id] ? id : -1; + if (typeof id === "number") { + return this._fns[id] ? id : -1 } else { - return this._fns.indexOf(id); + return this._fns.indexOf(id) } } exists(id: number | Interceptor) { - const index = this.getInterceptorIndex(id); - return !!this._fns[index]; + const index = this.getInterceptorIndex(id) + return !!this._fns[index] } eject(id: number | Interceptor) { - const index = this.getInterceptorIndex(id); + const index = this.getInterceptorIndex(id) if (this._fns[index]) { - this._fns[index] = null; + this._fns[index] = null } } update(id: number | Interceptor, fn: Interceptor) { - const index = this.getInterceptorIndex(id); + const index = this.getInterceptorIndex(id) if (this._fns[index]) { - this._fns[index] = fn; - return id; + this._fns[index] = fn + return id } else { - return false; + return false } } use(fn: Interceptor) { - this._fns = [...this._fns, fn]; - return this._fns.length - 1; + this._fns = [...this._fns, fn] + return this._fns.length - 1 } } // `createInterceptors()` response, meant for external use as it does not // expose internals export interface Middleware { - error: Pick< - Interceptors>, - 'eject' | 'use' - >; - request: Pick>, 'eject' | 'use'>; - response: Pick< - Interceptors>, - 'eject' | 'use' - >; + error: Pick>, "eject" | "use"> + request: Pick>, "eject" | "use"> + response: Pick>, "eject" | "use"> } // do not add `Middleware` as return type so we can use _fns internally @@ -388,30 +344,30 @@ export const createInterceptors = () => ({ error: new Interceptors>(), request: new Interceptors>(), response: new Interceptors>(), -}); +}) const defaultQuerySerializer = createQuerySerializer({ allowReserved: false, array: { explode: true, - style: 'form', + style: "form", }, object: { explode: true, - style: 'deepObject', + style: "deepObject", }, -}); +}) const defaultHeaders = { - 'Content-Type': 'application/json', -}; + "Content-Type": "application/json", +} export const createConfig = ( override: Config & T> = {}, ): Config & T> => ({ ...jsonBodySerializer, headers: defaultHeaders, - parseAs: 'auto', + parseAs: "auto", querySerializer: defaultQuerySerializer, ...override, -}); +}) -- cgit v1.2.3