@brickflow/http 0.0.18 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/http.d.ts +2 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/http.ts +15 -10
package/dist/http.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type HttpAnyResponse = HttpResponse<HttpResponseData<HttpKey>, HttpKey, H
|
|
|
16
16
|
export type HttpArrayMode = 'json' | 'repeat';
|
|
17
17
|
export type HttpClient = {
|
|
18
18
|
get: <T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(url: T, config?: TConfig) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>;
|
|
19
|
-
post: <T extends HttpKey, TConfig extends PostConfig<T> = PostConfig<T>>(url: T, data?:
|
|
19
|
+
post: <T extends HttpKey, TData extends Record<keyof TData, unknown> = Record<string, unknown>, TConfig extends PostConfig<T> = PostConfig<T>>(url: T, data?: HttpPostData<TData>, config?: TConfig) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>;
|
|
20
20
|
};
|
|
21
21
|
export interface HttpConfig<TKey extends HttpKey = HttpKey> {
|
|
22
22
|
}
|
|
@@ -25,6 +25,7 @@ export interface HttpEndpoint {
|
|
|
25
25
|
export type HttpErrorGuard<TData = unknown, TError extends TData = TData> = (payload: TData) => payload is TError;
|
|
26
26
|
export type HttpKey = Extract<keyof HttpSchema, string>;
|
|
27
27
|
export type HttpParam = Record<string, boolean | number | string | string[] | undefined>;
|
|
28
|
+
export type HttpPostData<TData extends Record<keyof TData, unknown> = Record<string, unknown>> = FormData | TData;
|
|
28
29
|
export interface HttpResponse<T = unknown, TKey extends HttpKey = HttpKey, TConfig extends HttpConfigFull<TKey> = HttpConfigFull<TKey>> {
|
|
29
30
|
config: HttpResponseConfig<TKey, TConfig>;
|
|
30
31
|
data: T;
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,GAAG,WAAW,CAAA;IAC3C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG;IAC7E,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;AAEvG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/create-get.ts","../src/http.ts"],"sourcesContent":["import type { HttpClient, HttpKey, HttpParam, HttpResponseData } from './http'\nimport type { HttpError, UseHttpFn, UseHttpOptions, UseHttpResult } from './nuxt'\n\nexport interface CreateGetFactory<P extends HttpParam> {\n <T extends HttpKey>(\n url: T,\n payload?: CreateGetPayload<T, P>,\n ): (options?: CreateGetOptions<T, P>) => Promise<CreateGetResult<T, P>>\n <D>(\n url: HttpKey,\n payload?: CreateGetPayload<HttpKey, P, D>,\n ): (options?: CreateGetOptions<HttpKey, P, D>) => Promise<CreateGetResult<HttpKey, P, D>>\n}\nexport type CreateGetOptions<T extends HttpKey, P extends HttpParam, D = never> = Omit<\n UseHttpOptions<T, P>,\n 'effect' | 'isError' | 'url'\n> & {\n effect?: CreateGetEffect<T, P, D>\n isError?: CreateGetIsError<T, D>\n}\nexport type CreateGetPayload<T extends HttpKey, P extends HttpParam, D = never> = {\n effect?: CreateGetEffect<T, P, D>\n isError?: CreateGetIsError<T, D>\n mapParams?: UseHttpOptions<T, P>['mapParams']\n}\nexport type CreateGetResult<T extends HttpKey, P extends HttpParam, D = never> = Omit<\n UseHttpResult<T, P>,\n 'data' | 'error'\n> & {\n data: Exclude<CreateGetData<T, D>, HttpError> | null\n error: Extract<CreateGetData<T, D>, HttpError> | null\n}\n\ntype CreateGetData<T extends HttpKey, D> = [D] extends [never] ? HttpResponseData<T> : D\n\ntype CreateGetEffect<T extends HttpKey, P extends HttpParam, D = never> = (\n data: CreateGetData<T, D>,\n config: CreateGetEffectConfig<P>,\n) => void\n\ntype CreateGetEffectConfig<P extends HttpParam> = {\n cached: boolean\n params: P\n}\n\ntype CreateGetIsError<T extends HttpKey, D = never> = (payload: CreateGetData<T, D>) => boolean\n\nexport function createUseCase<D>() {\n return <T>(\n callback: (payload: D & { httpClient: HttpClient }) => T,\n ): ((payload: D & { httpClient: HttpClient }) => T) => callback\n}\n\nexport function defineGet(useHttp: UseHttpFn) {\n return function withParams<P extends HttpParam>(): CreateGetFactory<P> {\n function withUrl<T extends HttpKey, D = never>(\n url: T,\n payload?: CreateGetPayload<T, P, D>,\n ): (options?: CreateGetOptions<T, P, D>) => Promise<CreateGetResult<T, P, D>> {\n return async function request(options: CreateGetOptions<T, P, D> = {}): Promise<CreateGetResult<T, P, D>> {\n const result = await useHttp({\n ...options,\n effect: (data, config) => {\n payload?.effect?.(data as CreateGetData<T, D>, config)\n options?.effect?.(data as CreateGetData<T, D>, config)\n },\n isError: options.isError ?? payload?.isError,\n mapParams: options.mapParams ?? payload?.mapParams,\n url,\n } as UseHttpOptions<T, P>)\n\n return result as CreateGetResult<T, P, D>\n }\n }\n\n return withUrl as CreateGetFactory<P>\n }\n}\n","export interface CreateHttpOptions {\n arrayMode?: HttpArrayMode\n baseURL: string\n fetch?: typeof fetch\n headers?: (() => HttpHeaders) | HttpHeaders\n onResponse?: (response: HttpAnyResponse) => Promise<void> | void\n timeout?: number\n}\n\nexport type GetConfig<TKey extends HttpKey = HttpKey> = HttpConfigFull<TKey> & {\n retry?: {\n delay?: number\n retries?: number\n }\n}\n\nexport type HttpAnyResponse = HttpResponse<HttpResponseData<HttpKey>, HttpKey, HttpConfigFull<HttpKey>>\n\nexport type HttpArrayMode = 'json' | 'repeat'\n\nexport type HttpClient = {\n get: <T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(\n url: T,\n config?: TConfig,\n ) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>\n post: <T extends HttpKey, TConfig extends PostConfig<T> = PostConfig<T>>(\n url: T,\n data?: FormData | Record<string, unknown>,\n config?: TConfig,\n ) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface HttpConfig<TKey extends HttpKey = HttpKey> {}\nexport interface HttpEndpoint {}\nexport type HttpErrorGuard<TData = unknown, TError extends TData = TData> = (payload: TData) => payload is TError\n\nexport type HttpKey = Extract<keyof HttpSchema, string>\nexport type HttpParam = Record<string, boolean | number | string | string[] | undefined>\n\nexport interface HttpResponse<\n T = unknown,\n TKey extends HttpKey = HttpKey,\n TConfig extends HttpConfigFull<TKey> = HttpConfigFull<TKey>,\n> {\n config: HttpResponseConfig<TKey, TConfig>\n data: T\n status: number\n}\nexport type HttpResponseConfig<\n TKey extends HttpKey = HttpKey,\n TConfig extends HttpConfig<TKey> = HttpConfig<TKey>,\n> = Omit<TConfig, 'signal'> & { url: string }\n\nexport type HttpResponseData<TKey extends HttpKey = HttpKey> = HttpSchema[TKey]\n\nexport type PostConfig<TKey extends HttpKey = HttpKey> = HttpConfigFull<TKey>\n\ntype HttpConfigFull<TKey extends HttpKey = HttpKey> = HttpConfig<TKey> & {\n params?: HttpParam\n signal?: AbortSignal | AbortSignal[]\n}\n\ntype HttpHeaders = Record<string, string | undefined>\n\ntype HttpSchema = keyof HttpEndpoint extends never ? Record<string, unknown> : HttpEndpoint\n\nexport function createHttp(options: CreateHttpOptions): HttpClient {\n const arrayMode = options.arrayMode ?? 'json'\n const clientFetch = options.fetch ?? fetch\n const timeout = options.timeout ?? 80000\n\n return {\n get<T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(url: T, config?: TConfig) {\n const requestConfig = (config ?? {}) as TConfig\n const requestUrl = `${joinUrl(options.baseURL, url)}${toQueryString(requestConfig.params, arrayMode)}`\n const { delay = 300, retries = 3 } = requestConfig.retry ?? {}\n\n const attemptRequest = async (attempt: number): Promise<HttpResponse<HttpResponseData<T>, T, TConfig>> => {\n try {\n const result = await clientFetch(requestUrl, {\n credentials: 'include',\n headers: resolveHeaders(options.headers),\n method: 'GET',\n signal: createSignal(requestConfig.signal, timeout),\n })\n\n const parsedResult = await result.json()\n const response: HttpResponse<HttpResponseData<T>, T, TConfig> = {\n config: createResponseConfig<T, TConfig>(joinUrl(options.baseURL, url), requestConfig),\n data: parsedResult,\n status: result.status,\n }\n\n if (!result.ok && isRetryableStatus(result.status) && attempt < retries) {\n await wait(getRetryDelay(attempt, delay))\n return attemptRequest(attempt + 1)\n }\n\n await options.onResponse?.(response as HttpAnyResponse)\n return response\n } catch (err) {\n if (isAbortError(err) || attempt >= retries) {\n throw err\n }\n\n await wait(getRetryDelay(attempt, delay))\n return attemptRequest(attempt + 1)\n }\n }\n\n return attemptRequest(0)\n },\n async post<T extends HttpKey, TConfig extends PostConfig<T> = PostConfig<T>>(\n url: T,\n data?: FormData | Record<string, unknown>,\n config?: TConfig,\n ) {\n const requestConfig = (config ?? {}) as TConfig\n const isForm = isFormData(data)\n const requestUrl = `${joinUrl(options.baseURL, url)}${toQueryString(requestConfig.params, arrayMode)}`\n const response = await clientFetch(requestUrl, {\n body: isForm || data === undefined ? data : JSON.stringify(data),\n credentials: 'include',\n headers: resolveHeaders(\n options.headers,\n data !== undefined && !isForm ? { 'Content-Type': 'application/json' } : undefined,\n ),\n method: 'POST',\n signal: createSignal(requestConfig.signal, timeout),\n })\n\n let parsedResult: Awaited<ReturnType<typeof response.json>> = {}\n try {\n parsedResult = await response.json()\n } catch {\n parsedResult = {}\n }\n\n const parsedResponse: HttpResponse<HttpResponseData<T>, T, TConfig> = {\n config: createResponseConfig<T, TConfig>(joinUrl(options.baseURL, url), requestConfig),\n data: parsedResult,\n status: response.status,\n }\n\n await options.onResponse?.(parsedResponse as HttpAnyResponse)\n return parsedResponse\n },\n }\n}\n\nfunction createAnySignal(signals: AbortSignal[]): AbortSignal {\n if (typeof AbortSignal?.any === 'function') {\n return AbortSignal.any(signals)\n }\n\n const controller = new AbortController()\n\n signals.filter(Boolean).forEach((signal) => {\n signal.addEventListener('abort', () => controller.abort(), { once: true })\n })\n\n return controller.signal\n}\n\nfunction createResponseConfig<TKey extends HttpKey, TConfig extends HttpConfigFull<TKey>>(\n url: string,\n config: TConfig,\n): HttpResponseConfig<TKey, TConfig> {\n const responseConfig = { ...config } as Record<string, unknown>\n delete responseConfig.signal\n\n return {\n ...responseConfig,\n url,\n } as HttpResponseConfig<TKey, TConfig>\n}\n\nfunction createSignal(signal: AbortSignal | AbortSignal[] | undefined, timeout: number): AbortSignal {\n const timeoutSignal = createTimeoutSignal(timeout)\n\n if (Array.isArray(signal)) {\n return createAnySignal([...signal, timeoutSignal])\n }\n\n if (signal) {\n return createAnySignal([signal, timeoutSignal])\n }\n\n return timeoutSignal\n}\n\nfunction createTimeoutSignal(ms: number): AbortSignal {\n if (typeof AbortSignal?.timeout === 'function') {\n return AbortSignal.timeout(ms)\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), ms)\n\n controller.signal.addEventListener('abort', () => clearTimeout(timeoutId), {\n once: true,\n })\n\n return controller.signal\n}\n\nfunction getRetryDelay(attempt: number, delay: number): number {\n return delay * 2 ** attempt\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === 'AbortError'\n}\n\nfunction isFormData(value: FormData | Record<string, unknown> | undefined): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status >= 500 || status === 429\n}\n\nfunction joinUrl(baseURL: string, url: string): string {\n const normalizedBase = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL\n const normalizedUrl = url.startsWith('/') ? url.slice(1) : url\n\n return `${normalizedBase}/${normalizedUrl}`\n}\n\nfunction resolveHeaders(\n value: CreateHttpOptions['headers'],\n extraHeaders?: Record<string, string>,\n): Record<string, string> {\n const headers = typeof value === 'function' ? value() : value\n\n return Object.entries({\n ...headers,\n ...extraHeaders,\n }).reduce<Record<string, string>>((acc, [key, headerValue]) => {\n if (typeof headerValue === 'string') {\n acc[key] = headerValue\n }\n\n return acc\n }, {})\n}\n\nfunction serializeQueryValue(\n urlParams: URLSearchParams,\n key: string,\n value: HttpParam[string],\n arrayMode: HttpArrayMode,\n): void {\n if (value === undefined) {\n return\n }\n\n if (Array.isArray(value)) {\n if (arrayMode === 'json') {\n urlParams.append(key, JSON.stringify(value))\n return\n }\n\n value.forEach((item) => {\n urlParams.append(`${key}[]`, item)\n })\n return\n }\n\n urlParams.append(key, String(value))\n}\n\nfunction toQueryString(params?: HttpParam, arrayMode: HttpArrayMode = 'json'): string {\n const urlParams = new URLSearchParams()\n\n Object.entries(params ?? {}).forEach(([key, value]) => {\n serializeQueryValue(urlParams, key, value, arrayMode)\n })\n\n return urlParams.size > 0 ? `?${urlParams}` : ''\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/create-get.ts","../src/http.ts"],"sourcesContent":["import type { HttpClient, HttpKey, HttpParam, HttpResponseData } from './http'\nimport type { HttpError, UseHttpFn, UseHttpOptions, UseHttpResult } from './nuxt'\n\nexport interface CreateGetFactory<P extends HttpParam> {\n <T extends HttpKey>(\n url: T,\n payload?: CreateGetPayload<T, P>,\n ): (options?: CreateGetOptions<T, P>) => Promise<CreateGetResult<T, P>>\n <D>(\n url: HttpKey,\n payload?: CreateGetPayload<HttpKey, P, D>,\n ): (options?: CreateGetOptions<HttpKey, P, D>) => Promise<CreateGetResult<HttpKey, P, D>>\n}\nexport type CreateGetOptions<T extends HttpKey, P extends HttpParam, D = never> = Omit<\n UseHttpOptions<T, P>,\n 'effect' | 'isError' | 'url'\n> & {\n effect?: CreateGetEffect<T, P, D>\n isError?: CreateGetIsError<T, D>\n}\nexport type CreateGetPayload<T extends HttpKey, P extends HttpParam, D = never> = {\n effect?: CreateGetEffect<T, P, D>\n isError?: CreateGetIsError<T, D>\n mapParams?: UseHttpOptions<T, P>['mapParams']\n}\nexport type CreateGetResult<T extends HttpKey, P extends HttpParam, D = never> = Omit<\n UseHttpResult<T, P>,\n 'data' | 'error'\n> & {\n data: Exclude<CreateGetData<T, D>, HttpError> | null\n error: Extract<CreateGetData<T, D>, HttpError> | null\n}\n\ntype CreateGetData<T extends HttpKey, D> = [D] extends [never] ? HttpResponseData<T> : D\n\ntype CreateGetEffect<T extends HttpKey, P extends HttpParam, D = never> = (\n data: CreateGetData<T, D>,\n config: CreateGetEffectConfig<P>,\n) => void\n\ntype CreateGetEffectConfig<P extends HttpParam> = {\n cached: boolean\n params: P\n}\n\ntype CreateGetIsError<T extends HttpKey, D = never> = (payload: CreateGetData<T, D>) => boolean\n\nexport function createUseCase<D>() {\n return <T>(\n callback: (payload: D & { httpClient: HttpClient }) => T,\n ): ((payload: D & { httpClient: HttpClient }) => T) => callback\n}\n\nexport function defineGet(useHttp: UseHttpFn) {\n return function withParams<P extends HttpParam>(): CreateGetFactory<P> {\n function withUrl<T extends HttpKey, D = never>(\n url: T,\n payload?: CreateGetPayload<T, P, D>,\n ): (options?: CreateGetOptions<T, P, D>) => Promise<CreateGetResult<T, P, D>> {\n return async function request(options: CreateGetOptions<T, P, D> = {}): Promise<CreateGetResult<T, P, D>> {\n const result = await useHttp({\n ...options,\n effect: (data, config) => {\n payload?.effect?.(data as CreateGetData<T, D>, config)\n options?.effect?.(data as CreateGetData<T, D>, config)\n },\n isError: options.isError ?? payload?.isError,\n mapParams: options.mapParams ?? payload?.mapParams,\n url,\n } as UseHttpOptions<T, P>)\n\n return result as CreateGetResult<T, P, D>\n }\n }\n\n return withUrl as CreateGetFactory<P>\n }\n}\n","export interface CreateHttpOptions {\n arrayMode?: HttpArrayMode\n baseURL: string\n fetch?: typeof fetch\n headers?: (() => HttpHeaders) | HttpHeaders\n onResponse?: (response: HttpAnyResponse) => Promise<void> | void\n timeout?: number\n}\n\nexport type GetConfig<TKey extends HttpKey = HttpKey> = HttpConfigFull<TKey> & {\n retry?: {\n delay?: number\n retries?: number\n }\n}\n\nexport type HttpAnyResponse = HttpResponse<HttpResponseData<HttpKey>, HttpKey, HttpConfigFull<HttpKey>>\n\nexport type HttpArrayMode = 'json' | 'repeat'\nexport type HttpClient = {\n get: <T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(\n url: T,\n config?: TConfig,\n ) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>\n post: <\n T extends HttpKey,\n TData extends Record<keyof TData, unknown> = Record<string, unknown>,\n TConfig extends PostConfig<T> = PostConfig<T>,\n >(\n url: T,\n data?: HttpPostData<TData>,\n config?: TConfig,\n ) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface HttpConfig<TKey extends HttpKey = HttpKey> {}\n\nexport interface HttpEndpoint {}\nexport type HttpErrorGuard<TData = unknown, TError extends TData = TData> = (payload: TData) => payload is TError\nexport type HttpKey = Extract<keyof HttpSchema, string>\n\nexport type HttpParam = Record<string, boolean | number | string | string[] | undefined>\nexport type HttpPostData<TData extends Record<keyof TData, unknown> = Record<string, unknown>> = FormData | TData\n\nexport interface HttpResponse<\n T = unknown,\n TKey extends HttpKey = HttpKey,\n TConfig extends HttpConfigFull<TKey> = HttpConfigFull<TKey>,\n> {\n config: HttpResponseConfig<TKey, TConfig>\n data: T\n status: number\n}\nexport type HttpResponseConfig<\n TKey extends HttpKey = HttpKey,\n TConfig extends HttpConfig<TKey> = HttpConfig<TKey>,\n> = Omit<TConfig, 'signal'> & { url: string }\n\nexport type HttpResponseData<TKey extends HttpKey = HttpKey> = HttpSchema[TKey]\n\nexport type PostConfig<TKey extends HttpKey = HttpKey> = HttpConfigFull<TKey>\n\ntype HttpConfigFull<TKey extends HttpKey = HttpKey> = HttpConfig<TKey> & {\n params?: HttpParam\n signal?: AbortSignal | AbortSignal[]\n}\n\ntype HttpHeaders = Record<string, string | undefined>\n\ntype HttpSchema = keyof HttpEndpoint extends never ? Record<string, unknown> : HttpEndpoint\n\nexport function createHttp(options: CreateHttpOptions): HttpClient {\n const arrayMode = options.arrayMode ?? 'json'\n const clientFetch = options.fetch ?? fetch\n const timeout = options.timeout ?? 80000\n\n return {\n get<T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(url: T, config?: TConfig) {\n const requestConfig = (config ?? {}) as TConfig\n const requestUrl = `${joinUrl(options.baseURL, url)}${toQueryString(requestConfig.params, arrayMode)}`\n const { delay = 300, retries = 3 } = requestConfig.retry ?? {}\n\n const attemptRequest = async (attempt: number): Promise<HttpResponse<HttpResponseData<T>, T, TConfig>> => {\n try {\n const result = await clientFetch(requestUrl, {\n credentials: 'include',\n headers: resolveHeaders(options.headers),\n method: 'GET',\n signal: createSignal(requestConfig.signal, timeout),\n })\n\n const parsedResult = await result.json()\n const response: HttpResponse<HttpResponseData<T>, T, TConfig> = {\n config: createResponseConfig<T, TConfig>(joinUrl(options.baseURL, url), requestConfig),\n data: parsedResult,\n status: result.status,\n }\n\n if (!result.ok && isRetryableStatus(result.status) && attempt < retries) {\n await wait(getRetryDelay(attempt, delay))\n return attemptRequest(attempt + 1)\n }\n\n await options.onResponse?.(response as HttpAnyResponse)\n return response\n } catch (err) {\n if (isAbortError(err) || attempt >= retries) {\n throw err\n }\n\n await wait(getRetryDelay(attempt, delay))\n return attemptRequest(attempt + 1)\n }\n }\n\n return attemptRequest(0)\n },\n async post<\n T extends HttpKey,\n TData extends Record<keyof TData, unknown> = Record<string, unknown>,\n TConfig extends PostConfig<T> = PostConfig<T>,\n >(url: T, data?: HttpPostData<TData>, config?: TConfig) {\n const requestConfig = (config ?? {}) as TConfig\n const isForm = isFormData(data)\n const requestUrl = `${joinUrl(options.baseURL, url)}${toQueryString(requestConfig.params, arrayMode)}`\n const response = await clientFetch(requestUrl, {\n body: isForm || data === undefined ? data : JSON.stringify(data),\n credentials: 'include',\n headers: resolveHeaders(\n options.headers,\n data !== undefined && !isForm ? { 'Content-Type': 'application/json' } : undefined,\n ),\n method: 'POST',\n signal: createSignal(requestConfig.signal, timeout),\n })\n\n let parsedResult: Awaited<ReturnType<typeof response.json>> = {}\n try {\n parsedResult = await response.json()\n } catch {\n parsedResult = {}\n }\n\n const parsedResponse: HttpResponse<HttpResponseData<T>, T, TConfig> = {\n config: createResponseConfig<T, TConfig>(joinUrl(options.baseURL, url), requestConfig),\n data: parsedResult,\n status: response.status,\n }\n\n await options.onResponse?.(parsedResponse as HttpAnyResponse)\n return parsedResponse\n },\n }\n}\n\nfunction createAnySignal(signals: AbortSignal[]): AbortSignal {\n if (typeof AbortSignal?.any === 'function') {\n return AbortSignal.any(signals)\n }\n\n const controller = new AbortController()\n\n signals.filter(Boolean).forEach((signal) => {\n signal.addEventListener('abort', () => controller.abort(), { once: true })\n })\n\n return controller.signal\n}\n\nfunction createResponseConfig<TKey extends HttpKey, TConfig extends HttpConfigFull<TKey>>(\n url: string,\n config: TConfig,\n): HttpResponseConfig<TKey, TConfig> {\n const responseConfig = { ...config } as Record<string, unknown>\n delete responseConfig.signal\n\n return {\n ...responseConfig,\n url,\n } as HttpResponseConfig<TKey, TConfig>\n}\n\nfunction createSignal(signal: AbortSignal | AbortSignal[] | undefined, timeout: number): AbortSignal {\n const timeoutSignal = createTimeoutSignal(timeout)\n\n if (Array.isArray(signal)) {\n return createAnySignal([...signal, timeoutSignal])\n }\n\n if (signal) {\n return createAnySignal([signal, timeoutSignal])\n }\n\n return timeoutSignal\n}\n\nfunction createTimeoutSignal(ms: number): AbortSignal {\n if (typeof AbortSignal?.timeout === 'function') {\n return AbortSignal.timeout(ms)\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), ms)\n\n controller.signal.addEventListener('abort', () => clearTimeout(timeoutId), {\n once: true,\n })\n\n return controller.signal\n}\n\nfunction getRetryDelay(attempt: number, delay: number): number {\n return delay * 2 ** attempt\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === 'AbortError'\n}\n\nfunction isFormData(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status >= 500 || status === 429\n}\n\nfunction joinUrl(baseURL: string, url: string): string {\n const normalizedBase = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL\n const normalizedUrl = url.startsWith('/') ? url.slice(1) : url\n\n return `${normalizedBase}/${normalizedUrl}`\n}\n\nfunction resolveHeaders(\n value: CreateHttpOptions['headers'],\n extraHeaders?: Record<string, string>,\n): Record<string, string> {\n const headers = typeof value === 'function' ? value() : value\n\n return Object.entries({\n ...headers,\n ...extraHeaders,\n }).reduce<Record<string, string>>((acc, [key, headerValue]) => {\n if (typeof headerValue === 'string') {\n acc[key] = headerValue\n }\n\n return acc\n }, {})\n}\n\nfunction serializeQueryValue(\n urlParams: URLSearchParams,\n key: string,\n value: HttpParam[string],\n arrayMode: HttpArrayMode,\n): void {\n if (value === undefined) {\n return\n }\n\n if (Array.isArray(value)) {\n if (arrayMode === 'json') {\n urlParams.append(key, JSON.stringify(value))\n return\n }\n\n value.forEach((item) => {\n urlParams.append(`${key}[]`, item)\n })\n return\n }\n\n urlParams.append(key, String(value))\n}\n\nfunction toQueryString(params?: HttpParam, arrayMode: HttpArrayMode = 'json'): string {\n const urlParams = new URLSearchParams()\n\n Object.entries(params ?? {}).forEach(([key, value]) => {\n serializeQueryValue(urlParams, key, value, arrayMode)\n })\n\n return urlParams.size > 0 ? `?${urlParams}` : ''\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/http.ts
CHANGED
|
@@ -17,26 +17,31 @@ export type GetConfig<TKey extends HttpKey = HttpKey> = HttpConfigFull<TKey> & {
|
|
|
17
17
|
export type HttpAnyResponse = HttpResponse<HttpResponseData<HttpKey>, HttpKey, HttpConfigFull<HttpKey>>
|
|
18
18
|
|
|
19
19
|
export type HttpArrayMode = 'json' | 'repeat'
|
|
20
|
-
|
|
21
20
|
export type HttpClient = {
|
|
22
21
|
get: <T extends HttpKey, TConfig extends GetConfig<T> = GetConfig<T>>(
|
|
23
22
|
url: T,
|
|
24
23
|
config?: TConfig,
|
|
25
24
|
) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>
|
|
26
|
-
post: <
|
|
25
|
+
post: <
|
|
26
|
+
T extends HttpKey,
|
|
27
|
+
TData extends Record<keyof TData, unknown> = Record<string, unknown>,
|
|
28
|
+
TConfig extends PostConfig<T> = PostConfig<T>,
|
|
29
|
+
>(
|
|
27
30
|
url: T,
|
|
28
|
-
data?:
|
|
31
|
+
data?: HttpPostData<TData>,
|
|
29
32
|
config?: TConfig,
|
|
30
33
|
) => Promise<HttpResponse<HttpResponseData<T>, T, TConfig>>
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
34
37
|
export interface HttpConfig<TKey extends HttpKey = HttpKey> {}
|
|
38
|
+
|
|
35
39
|
export interface HttpEndpoint {}
|
|
36
40
|
export type HttpErrorGuard<TData = unknown, TError extends TData = TData> = (payload: TData) => payload is TError
|
|
37
|
-
|
|
38
41
|
export type HttpKey = Extract<keyof HttpSchema, string>
|
|
42
|
+
|
|
39
43
|
export type HttpParam = Record<string, boolean | number | string | string[] | undefined>
|
|
44
|
+
export type HttpPostData<TData extends Record<keyof TData, unknown> = Record<string, unknown>> = FormData | TData
|
|
40
45
|
|
|
41
46
|
export interface HttpResponse<
|
|
42
47
|
T = unknown,
|
|
@@ -111,11 +116,11 @@ export function createHttp(options: CreateHttpOptions): HttpClient {
|
|
|
111
116
|
|
|
112
117
|
return attemptRequest(0)
|
|
113
118
|
},
|
|
114
|
-
async post<
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
) {
|
|
119
|
+
async post<
|
|
120
|
+
T extends HttpKey,
|
|
121
|
+
TData extends Record<keyof TData, unknown> = Record<string, unknown>,
|
|
122
|
+
TConfig extends PostConfig<T> = PostConfig<T>,
|
|
123
|
+
>(url: T, data?: HttpPostData<TData>, config?: TConfig) {
|
|
119
124
|
const requestConfig = (config ?? {}) as TConfig
|
|
120
125
|
const isForm = isFormData(data)
|
|
121
126
|
const requestUrl = `${joinUrl(options.baseURL, url)}${toQueryString(requestConfig.params, arrayMode)}`
|
|
@@ -213,7 +218,7 @@ function isAbortError(err: unknown): boolean {
|
|
|
213
218
|
return err instanceof DOMException && err.name === 'AbortError'
|
|
214
219
|
}
|
|
215
220
|
|
|
216
|
-
function isFormData(value:
|
|
221
|
+
function isFormData(value: unknown): value is FormData {
|
|
217
222
|
return typeof FormData !== 'undefined' && value instanceof FormData
|
|
218
223
|
}
|
|
219
224
|
|