@zayne-labs/callapi 1.4.1 → 1.4.2
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/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +5 -5
- package/dist/cjs/options/index.cjs.map +1 -1
- package/dist/cjs/options/index.d.cts +6 -6
- package/dist/cjs/{types-sMSboy-z.d.cts → types-CSzgr-Ii.d.cts} +7 -7
- package/dist/cjs/utils/index.d.cts +2 -2
- package/dist/esm/{chunk-RR3DUSKM.js → chunk-MFJBK6WG.js} +1 -1
- package/dist/esm/{chunk-RR3DUSKM.js.map → chunk-MFJBK6WG.js.map} +1 -1
- package/dist/esm/{chunk-2RFWJBJM.js → chunk-WD4WCIQ5.js} +1 -1
- package/dist/esm/{chunk-2RFWJBJM.js.map → chunk-WD4WCIQ5.js.map} +1 -1
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +1 -1
- package/dist/esm/options/index.d.ts +6 -6
- package/dist/esm/options/index.js +1 -1
- package/dist/esm/options/index.js.map +1 -1
- package/dist/esm/{types-sMSboy-z.d.ts → types-CSzgr-Ii.d.ts} +7 -7
- package/dist/esm/utils/index.d.ts +2 -2
- package/dist/esm/utils/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hooksEnum as e,initializePlugins as r,mergeUrlWithParamsAndQuery as o,createTimeoutSignal as t,createCombinedSignal as s,createDedupeStrategy as a,createRetryStrategy as n,createFetchClient as i}from"../chunk-
|
|
1
|
+
import{hooksEnum as e,initializePlugins as r,mergeUrlWithParamsAndQuery as o,createTimeoutSignal as t,createCombinedSignal as s,createDedupeStrategy as a,createRetryStrategy as n,createFetchClient as i}from"../chunk-WD4WCIQ5.js";import{splitBaseConfig as l,splitConfig as u,combineHooks as d,mergeAndResolveHeaders as c,isPlainObject as p,defaultRetryStatusCodes as y,defaultRetryMethods as h,executeHooks as f,createExtensibleSchemasAndValidators as m,getResponseData as g,HTTPError as w,resolveSuccessResult as R,resolveErrorResult as E,waitUntil as M,isFunction as b,isHTTPErrorInstance as D}from"../chunk-MFJBK6WG.js";var q=q=>{const[O,S]=l(q??{}),C=new Map,k=async i=>{const{initURL:l,...q}=i,[v,x]=u(q),H={};for(const r of Object.keys(e)){const e=d(S[r],x[r]);H[r]=e}const L={baseURL:"",bodySerializer:JSON.stringify,dedupeStrategy:"cancel",defaultErrorMessage:"Failed to fetch data from server!",mergedHooksExecutionMode:"parallel",mergedHooksExecutionOrder:"mainHooksAfterPlugins",responseType:"json",resultMode:"all",retryAttempts:0,retryDelay:1e3,retryMaxDelay:1e4,retryMethods:h,retryStatusCodes:y,retryStrategy:"linear",...S,...x,...H},U=v.body??O.body,$={body:p(U)?L.bodySerializer(U):U,method:"GET",...O,...v,headers:c({auth:L.auth,baseHeaders:O.headers,body:U,headers:v.headers}),signal:v.signal??O.signal},{resolvedHooks:A,resolvedOptions:T,resolvedRequestOptions:j,url:F}=await r({initURL:l,options:L,request:$}),P=`${T.baseURL}${o(F,T.params,T.query)}`,W={...T,...A,fullURL:P,initURL:l},z=new AbortController,G=null!=W.timeout?t(W.timeout):null,I=s(j.signal,G,z.signal),J={...j,signal:I},{handleRequestCancelDedupeStrategy:K,handleRequestDeferDedupeStrategy:B,removeDedupeKeyFromCache:N}=await a({$RequestInfoCache:C,newFetchController:z,options:W,request:J});K();try{await f(W.onRequest({options:W,request:J})),J.headers=c({auth:W.auth,baseHeaders:O.headers,body:U,headers:J.headers});const e=await B(),r="defer"===W.dedupeStrategy||W.cloneResponse,{schemas:o,validators:t}=m(W);if(!e.ok){const s=await g(r?e.clone():e,W.responseType,W.responseParser,o?.errorData,t?.errorData);throw new w({defaultErrorMessage:W.defaultErrorMessage,errorData:s,response:e})}const s={data:await g(r?e.clone():e,W.responseType,W.responseParser,o?.data,t?.data),options:W,request:J,response:W.cloneResponse?e.clone():e};return await f(W.onSuccess(s),W.onResponse({...s,error:null})),await R({data:s.data,response:s.response,resultMode:W.resultMode})}catch(e){const{errorVariantDetails:r,getErrorResult:o}=E({cloneResponse:W.cloneResponse,defaultErrorMessage:W.defaultErrorMessage,error:e,resultMode:W.resultMode}),t={error:r.error,options:W,request:J},s={...t,response:r.response},{getDelay:a,shouldAttemptRetry:l}=n(W,s);if(!I.aborted&&await l()){await f(W.onRetry(s));const e=a();await M(e);const r={...i,"~retryCount":(W["~retryCount"]??0)+1};return await k(r)}const u=b(W.throwOnError)?W.throwOnError(s):W.throwOnError,d=()=>{if(u)throw r.error};if(D(e))return await f(W.onResponseError(s),W.onError(s),W.onResponse({...s,data:null})),d(),o();if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),d(),o()}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${W.timeout}ms`;return console.error(`${e.name}:`,r),d(),o({message:r})}return await f(W.onRequestError(t),W.onError(s)),d(),o()}finally{N()}};return k.create=i,k},O=q(),S=e=>e;export{O as callApiWithOptions,q as createFetchClientWithOptions,S as defineOptions};//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/options/createFetchClientWithOptions.ts","../../../src/options/defineOptions.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createFetchClient } from \"@/createFetchClient\";\nimport { type RequestInfoCache, createDedupeStrategy } from \"@/dedupe\";\nimport { HTTPError, resolveErrorResult } from \"@/error\";\nimport { type CallApiPlugin, hooksEnum, initializePlugins } from \"@/plugins\";\nimport { createRetryStrategy } from \"@/retry\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tDefaultDataType,\n\tDefaultMoreOptions,\n\tGetCallApiResult,\n\tInterceptors,\n\tResultModeUnion,\n} from \"@/types\";\nimport { mergeUrlWithParamsAndQuery } from \"@/url\";\nimport {\n\tcombineHooks,\n\texecuteHooks,\n\tgetResponseData,\n\tmergeAndResolveHeaders,\n\tresolveSuccessResult,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"@/utils/common\";\nimport { defaultRetryMethods, defaultRetryStatusCodes } from \"@/utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"@/utils/polyfills\";\nimport { isFunction, isHTTPErrorInstance, isPlainObject } from \"@/utils/type-guards\";\nimport { type InferSchemaResult, type Schemas, createExtensibleSchemasAndValidators } from \"@/validation\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nexport const createFetchClientWithOptions = <\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = never[],\n\tTBaseSchemas extends Schemas = DefaultMoreOptions,\n>(\n\tbaseConfig?: BaseCallApiConfig<\n\t\tTBaseData,\n\t\tTBaseErrorData,\n\t\tTBaseResultMode,\n\t\tTBasePluginArray,\n\t\tTBaseSchemas\n\t>\n) => {\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig ?? {});\n\n\tconst $RequestInfoCache: RequestInfoCache = new Map();\n\n\tconst callApi = async <\n\t\tTData = TBaseData,\n\t\tTErrorData = TBaseErrorData,\n\t\tTResultMode extends ResultModeUnion = TBaseResultMode,\n\t\tTPluginArray extends CallApiPlugin[] = TBasePluginArray,\n\t\tTSchemas extends Schemas = TBaseSchemas,\n\t\tTActualData = InferSchemaResult<TSchemas[\"data\"], TData>,\n\t\tTActualErrorData = InferSchemaResult<TSchemas[\"errorData\"], TErrorData>,\n\t>(\n\t\tconfig: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode, TPluginArray, TSchemas>\n\t): Promise<GetCallApiResult<TActualData, TActualErrorData, TResultMode>> => {\n\t\tconst { initURL, ...restOfConfig } = config;\n\n\t\tconst [fetchConfig, extraOptions] = splitConfig(restOfConfig);\n\n\t\tconst initCombinedHooks = {} as Required<Interceptors>;\n\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst combinedHook = combineHooks(\n\t\t\t\tbaseExtraOptions[key as keyof Interceptors],\n\t\t\t\textraOptions[key as keyof Interceptors]\n\t\t\t);\n\n\t\t\tinitCombinedHooks[key as keyof Interceptors] = combinedHook as never;\n\t\t}\n\n\t\t// == Default Extra Options\n\t\tconst defaultExtraOptions = {\n\t\t\tbaseURL: \"\",\n\t\t\tbodySerializer: JSON.stringify,\n\t\t\tdedupeStrategy: \"cancel\",\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\n\t\t\tmergedHooksExecutionMode: \"parallel\",\n\t\t\tmergedHooksExecutionOrder: \"mainHooksAfterPlugins\",\n\t\t\tresponseType: \"json\",\n\t\t\tresultMode: \"all\",\n\t\t\tretryAttempts: 0,\n\t\t\tretryDelay: 1000,\n\t\t\tretryMaxDelay: 10000,\n\t\t\tretryMethods: defaultRetryMethods,\n\t\t\tretryStatusCodes: defaultRetryStatusCodes,\n\t\t\tretryStrategy: \"linear\",\n\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\n\t\t\t...initCombinedHooks,\n\t\t} satisfies CombinedCallApiExtraOptions;\n\n\t\tconst body = fetchConfig.body ?? baseFetchConfig.body;\n\n\t\t// == Default Request Options\n\t\tconst defaultRequestOptions = {\n\t\t\tbody: isPlainObject(body) ? defaultExtraOptions.bodySerializer(body) : body,\n\t\t\tmethod: \"GET\",\n\n\t\t\t...baseFetchConfig,\n\t\t\t...fetchConfig,\n\n\t\t\theaders: mergeAndResolveHeaders({\n\t\t\t\tauth: defaultExtraOptions.auth,\n\t\t\t\tbaseHeaders: baseFetchConfig.headers,\n\t\t\t\tbody,\n\t\t\t\theaders: fetchConfig.headers,\n\t\t\t}),\n\n\t\t\tsignal: fetchConfig.signal ?? baseFetchConfig.signal,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tinitURL,\n\t\t\toptions: defaultExtraOptions,\n\t\t\trequest: defaultRequestOptions,\n\t\t});\n\n\t\tconst fullURL = `${resolvedOptions.baseURL}${mergeUrlWithParamsAndQuery(url, resolvedOptions.params, resolvedOptions.query)}`;\n\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...resolvedHooks,\n\t\t\tfullURL,\n\t\t\tinitURL,\n\t\t} satisfies CombinedCallApiExtraOptions as typeof defaultExtraOptions & typeof resolvedHooks;\n\n\t\tconst newFetchController = new AbortController();\n\n\t\tconst timeoutSignal = options.timeout != null ? createTimeoutSignal(options.timeout) : null;\n\n\t\tconst combinedSignal = createCombinedSignal(\n\t\t\tresolvedRequestOptions.signal,\n\t\t\ttimeoutSignal,\n\t\t\tnewFetchController.signal\n\t\t);\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\t\t\tsignal: combinedSignal,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst {\n\t\t\thandleRequestCancelDedupeStrategy,\n\t\t\thandleRequestDeferDedupeStrategy,\n\t\t\tremoveDedupeKeyFromCache,\n\t\t} = await createDedupeStrategy({ $RequestInfoCache, newFetchController, options, request });\n\n\t\thandleRequestCancelDedupeStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseFetchConfig.headers,\n\t\t\t\tbody,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst response = await handleRequestDeferDedupeStrategy();\n\n\t\t\t// == Also clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse = options.dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tconst { schemas, validators } = createExtensibleSchemasAndValidators(options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await getResponseData<TErrorData>(\n\t\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\t\toptions.responseType,\n\t\t\t\t\toptions.responseParser,\n\t\t\t\t\tschemas?.errorData,\n\t\t\t\t\tvalidators?.errorData\n\t\t\t\t);\n\n\t\t\t\t// == Push all error handling responsibilities to the catch block if not retrying\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await getResponseData<TData>(\n\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\toptions.responseType,\n\t\t\t\toptions.responseParser,\n\t\t\t\tschemas?.data,\n\t\t\t\tvalidators?.data\n\t\t\t);\n\n\t\t\tconst successContext = {\n\t\t\t\tdata: successData as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t};\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess(successContext),\n\n\t\t\t\toptions.onResponse({ ...successContext, error: null })\n\t\t\t);\n\n\t\t\treturn await resolveSuccessResult({\n\t\t\t\tdata: successContext.data,\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { errorVariantDetails, getErrorResult } = resolveErrorResult({\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\terror,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\tconst errorContext = {\n\t\t\t\terror: errorVariantDetails.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tconst errorContextWithResponse = {\n\t\t\t\t...errorContext,\n\t\t\t\tresponse: errorVariantDetails.response as NonNullable<typeof errorVariantDetails.response>,\n\t\t\t};\n\n\t\t\tconst { getDelay, shouldAttemptRetry } = createRetryStrategy(options, errorContextWithResponse);\n\n\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait executeHooks(options.onRetry(errorContextWithResponse));\n\n\t\t\t\tconst delay = getDelay();\n\n\t\t\t\tawait waitUntil(delay);\n\n\t\t\t\tconst updatedOptions = {\n\t\t\t\t\t...config,\n\t\t\t\t\t\"~retryCount\": (options[\"~retryCount\"] ?? 0) + 1,\n\t\t\t\t} satisfies typeof config;\n\n\t\t\t\treturn await callApi(updatedOptions);\n\t\t\t}\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError(errorContextWithResponse)\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- False alarm: this function is depends on this scope\n\t\t\tconst handleThrowOnError = () => {\n\t\t\t\tif (!shouldThrowOnError) return;\n\n\t\t\t\t// eslint-disable-next-line ts-eslint/only-throw-error -- It's fine to throw this\n\t\t\t\tthrow errorVariantDetails.error;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError(errorContextWithResponse),\n\n\t\t\t\t\toptions.onError(errorContextWithResponse),\n\n\t\t\t\t\toptions.onResponse({ ...errorContextWithResponse, data: null })\n\t\t\t\t);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult({ message });\n\t\t\t}\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError(errorContext),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError(errorContextWithResponse)\n\t\t\t);\n\n\t\t\thandleThrowOnError();\n\n\t\t\treturn getErrorResult();\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\tremoveDedupeKeyFromCache();\n\t\t}\n\t};\n\n\tcallApi.create = createFetchClient;\n\n\treturn callApi;\n};\n\nexport const callApiWithOptions = createFetchClientWithOptions();\n","import type { ResultModeUnion } from \"@/types\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nconst defineOptions = <\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n>(\n\tconfig: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode>\n) => {\n\treturn config;\n};\n\nexport { defineOptions };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/options/createFetchClientWithOptions.ts","../../../src/options/defineOptions.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createFetchClient } from \"@/createFetchClient\";\nimport { type RequestInfoCache, createDedupeStrategy } from \"@/dedupe\";\nimport { HTTPError, resolveErrorResult } from \"@/error\";\nimport { type CallApiPlugin, hooksEnum, initializePlugins } from \"@/plugins\";\nimport { createRetryStrategy } from \"@/retry\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tDefaultDataType,\n\tDefaultMoreOptions,\n\tGetCallApiResult,\n\tInterceptors,\n\tResultModeUnion,\n} from \"@/types\";\nimport { mergeUrlWithParamsAndQuery } from \"@/url\";\nimport {\n\tcombineHooks,\n\texecuteHooks,\n\tgetResponseData,\n\tmergeAndResolveHeaders,\n\tresolveSuccessResult,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"@/utils/common\";\nimport { defaultRetryMethods, defaultRetryStatusCodes } from \"@/utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"@/utils/polyfills\";\nimport { isFunction, isHTTPErrorInstance, isPlainObject } from \"@/utils/type-guards\";\nimport { type InferSchemaResult, type Schemas, createExtensibleSchemasAndValidators } from \"@/validation\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nexport const createFetchClientWithOptions = <\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = CallApiPlugin[],\n\tTBaseSchemas extends Schemas = DefaultMoreOptions,\n>(\n\tbaseConfig?: BaseCallApiConfig<\n\t\tTBaseData,\n\t\tTBaseErrorData,\n\t\tTBaseResultMode,\n\t\tTBasePluginArray,\n\t\tTBaseSchemas\n\t>\n) => {\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig ?? {});\n\n\tconst $RequestInfoCache: RequestInfoCache = new Map();\n\n\tconst callApi = async <\n\t\tTData = TBaseData,\n\t\tTErrorData = TBaseErrorData,\n\t\tTResultMode extends ResultModeUnion = TBaseResultMode,\n\t\tTPluginArray extends CallApiPlugin[] = TBasePluginArray,\n\t\tTSchemas extends Schemas = TBaseSchemas,\n\t\tTActualData = InferSchemaResult<TSchemas[\"data\"], TData>,\n\t\tTActualErrorData = InferSchemaResult<TSchemas[\"errorData\"], TErrorData>,\n\t>(\n\t\tconfig: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode, TPluginArray, TSchemas>\n\t): Promise<GetCallApiResult<TActualData, TActualErrorData, TResultMode>> => {\n\t\tconst { initURL, ...restOfConfig } = config;\n\n\t\tconst [fetchConfig, extraOptions] = splitConfig(restOfConfig);\n\n\t\tconst initCombinedHooks = {} as Required<Interceptors>;\n\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst combinedHook = combineHooks(\n\t\t\t\tbaseExtraOptions[key as keyof Interceptors],\n\t\t\t\textraOptions[key as keyof Interceptors]\n\t\t\t);\n\n\t\t\tinitCombinedHooks[key as keyof Interceptors] = combinedHook as never;\n\t\t}\n\n\t\t// == Default Extra Options\n\t\tconst defaultExtraOptions = {\n\t\t\tbaseURL: \"\",\n\t\t\tbodySerializer: JSON.stringify,\n\t\t\tdedupeStrategy: \"cancel\",\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\n\t\t\tmergedHooksExecutionMode: \"parallel\",\n\t\t\tmergedHooksExecutionOrder: \"mainHooksAfterPlugins\",\n\t\t\tresponseType: \"json\",\n\t\t\tresultMode: \"all\",\n\t\t\tretryAttempts: 0,\n\t\t\tretryDelay: 1000,\n\t\t\tretryMaxDelay: 10000,\n\t\t\tretryMethods: defaultRetryMethods,\n\t\t\tretryStatusCodes: defaultRetryStatusCodes,\n\t\t\tretryStrategy: \"linear\",\n\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\n\t\t\t...initCombinedHooks,\n\t\t} satisfies CombinedCallApiExtraOptions;\n\n\t\tconst body = fetchConfig.body ?? baseFetchConfig.body;\n\n\t\t// == Default Request Options\n\t\tconst defaultRequestOptions = {\n\t\t\tbody: isPlainObject(body) ? defaultExtraOptions.bodySerializer(body) : body,\n\t\t\tmethod: \"GET\",\n\n\t\t\t...baseFetchConfig,\n\t\t\t...fetchConfig,\n\n\t\t\theaders: mergeAndResolveHeaders({\n\t\t\t\tauth: defaultExtraOptions.auth,\n\t\t\t\tbaseHeaders: baseFetchConfig.headers,\n\t\t\t\tbody,\n\t\t\t\theaders: fetchConfig.headers,\n\t\t\t}),\n\n\t\t\tsignal: fetchConfig.signal ?? baseFetchConfig.signal,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tinitURL,\n\t\t\toptions: defaultExtraOptions,\n\t\t\trequest: defaultRequestOptions,\n\t\t});\n\n\t\tconst fullURL = `${resolvedOptions.baseURL}${mergeUrlWithParamsAndQuery(url, resolvedOptions.params, resolvedOptions.query)}`;\n\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...resolvedHooks,\n\t\t\tfullURL,\n\t\t\tinitURL,\n\t\t} satisfies CombinedCallApiExtraOptions as typeof defaultExtraOptions & typeof resolvedHooks;\n\n\t\tconst newFetchController = new AbortController();\n\n\t\tconst timeoutSignal = options.timeout != null ? createTimeoutSignal(options.timeout) : null;\n\n\t\tconst combinedSignal = createCombinedSignal(\n\t\t\tresolvedRequestOptions.signal,\n\t\t\ttimeoutSignal,\n\t\t\tnewFetchController.signal\n\t\t);\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\t\t\tsignal: combinedSignal,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst {\n\t\t\thandleRequestCancelDedupeStrategy,\n\t\t\thandleRequestDeferDedupeStrategy,\n\t\t\tremoveDedupeKeyFromCache,\n\t\t} = await createDedupeStrategy({ $RequestInfoCache, newFetchController, options, request });\n\n\t\thandleRequestCancelDedupeStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseFetchConfig.headers,\n\t\t\t\tbody,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst response = await handleRequestDeferDedupeStrategy();\n\n\t\t\t// == Also clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse = options.dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tconst { schemas, validators } = createExtensibleSchemasAndValidators(options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await getResponseData<TErrorData>(\n\t\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\t\toptions.responseType,\n\t\t\t\t\toptions.responseParser,\n\t\t\t\t\tschemas?.errorData,\n\t\t\t\t\tvalidators?.errorData\n\t\t\t\t);\n\n\t\t\t\t// == Push all error handling responsibilities to the catch block if not retrying\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await getResponseData<TData>(\n\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\toptions.responseType,\n\t\t\t\toptions.responseParser,\n\t\t\t\tschemas?.data,\n\t\t\t\tvalidators?.data\n\t\t\t);\n\n\t\t\tconst successContext = {\n\t\t\t\tdata: successData as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t};\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess(successContext),\n\n\t\t\t\toptions.onResponse({ ...successContext, error: null })\n\t\t\t);\n\n\t\t\treturn await resolveSuccessResult({\n\t\t\t\tdata: successContext.data,\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { errorVariantDetails, getErrorResult } = resolveErrorResult({\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\terror,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\tconst errorContext = {\n\t\t\t\terror: errorVariantDetails.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tconst errorContextWithResponse = {\n\t\t\t\t...errorContext,\n\t\t\t\tresponse: errorVariantDetails.response as NonNullable<typeof errorVariantDetails.response>,\n\t\t\t};\n\n\t\t\tconst { getDelay, shouldAttemptRetry } = createRetryStrategy(options, errorContextWithResponse);\n\n\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait executeHooks(options.onRetry(errorContextWithResponse));\n\n\t\t\t\tconst delay = getDelay();\n\n\t\t\t\tawait waitUntil(delay);\n\n\t\t\t\tconst updatedOptions = {\n\t\t\t\t\t...config,\n\t\t\t\t\t\"~retryCount\": (options[\"~retryCount\"] ?? 0) + 1,\n\t\t\t\t} satisfies typeof config;\n\n\t\t\t\treturn await callApi(updatedOptions);\n\t\t\t}\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError(errorContextWithResponse)\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- False alarm: this function is depends on this scope\n\t\t\tconst handleThrowOnError = () => {\n\t\t\t\tif (!shouldThrowOnError) return;\n\n\t\t\t\t// eslint-disable-next-line ts-eslint/only-throw-error -- It's fine to throw this\n\t\t\t\tthrow errorVariantDetails.error;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError(errorContextWithResponse),\n\n\t\t\t\t\toptions.onError(errorContextWithResponse),\n\n\t\t\t\t\toptions.onResponse({ ...errorContextWithResponse, data: null })\n\t\t\t\t);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn getErrorResult({ message });\n\t\t\t}\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError(errorContext),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError(errorContextWithResponse)\n\t\t\t);\n\n\t\t\thandleThrowOnError();\n\n\t\t\treturn getErrorResult();\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\tremoveDedupeKeyFromCache();\n\t\t}\n\t};\n\n\tcallApi.create = createFetchClient;\n\n\treturn callApi;\n};\n\nexport const callApiWithOptions = createFetchClientWithOptions();\n","import type { ResultModeUnion } from \"@/types\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nconst defineOptions = <\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n>(\n\tconfig: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode>\n) => {\n\treturn config;\n};\n\nexport { defineOptions };\n"]}
|
|
@@ -254,7 +254,7 @@ type FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit)
|
|
|
254
254
|
type Meta = Register extends {
|
|
255
255
|
meta?: infer TMeta extends Record<string, unknown>;
|
|
256
256
|
} ? TMeta : never;
|
|
257
|
-
type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] =
|
|
257
|
+
type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[], TSchemas extends Schemas = DefaultMoreOptions> = {
|
|
258
258
|
/**
|
|
259
259
|
* Authorization header value.
|
|
260
260
|
*/
|
|
@@ -380,18 +380,18 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
|
|
|
380
380
|
validators?: Validators<TData, TErrorData>;
|
|
381
381
|
} & InterceptorsOrInterceptorArray<TData, TErrorData> & Partial<InferPluginOptions<TPluginArray>> & RetryOptions<TErrorData>;
|
|
382
382
|
declare const optionsEnumToExtendFromBase: ("plugins" | "schemas" | "validators")[];
|
|
383
|
-
type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] =
|
|
383
|
+
type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[], TSchemas extends Schemas = DefaultMoreOptions> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas> & {
|
|
384
384
|
/**
|
|
385
385
|
* Options that should extend the base options.
|
|
386
386
|
*/
|
|
387
387
|
extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>, (typeof optionsEnumToExtendFromBase)[number]>;
|
|
388
388
|
};
|
|
389
389
|
declare const optionsEnumToOmitFromBase: ("dedupeKey" | "extend")[];
|
|
390
|
-
type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] =
|
|
391
|
-
type CombinedCallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] =
|
|
392
|
-
type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] =
|
|
393
|
-
type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] =
|
|
394
|
-
type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] =
|
|
390
|
+
type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[], TBaseSchemas extends Schemas = DefaultMoreOptions> = Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray, TBaseSchemas>, (typeof optionsEnumToOmitFromBase)[number]>;
|
|
391
|
+
type CombinedCallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[], TSchemas extends Schemas = DefaultMoreOptions> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas> & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>;
|
|
392
|
+
type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[], TSchemas extends Schemas = DefaultMoreOptions> = CallApiRequestOptions & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>;
|
|
393
|
+
type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[], TBaseSchemas extends Schemas = DefaultMoreOptions> = CallApiRequestOptions & BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray, TBaseSchemas>;
|
|
394
|
+
type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[], TSchemas extends Schemas = DefaultMoreOptions> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TPluginArray, TSchemas>];
|
|
395
395
|
type RequestContext = UnmaskType<{
|
|
396
396
|
options: CombinedCallApiExtraOptions;
|
|
397
397
|
request: CallApiRequestOptionsForHooks;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../types-
|
|
2
|
-
export { w as defaultRetryMethods, x as defaultRetryStatusCodes, v as toQueryString } from '../types-
|
|
1
|
+
import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../types-CSzgr-Ii.js';
|
|
2
|
+
export { w as defaultRetryMethods, x as defaultRetryStatusCodes, v as toQueryString } from '../types-CSzgr-Ii.js';
|
|
3
3
|
import { H as HTTPError } from '../error-lBRMiMeF.js';
|
|
4
4
|
import '@standard-schema/spec';
|
|
5
5
|
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{defaultRetryMethods,defaultRetryStatusCodes,isHTTPError,isHTTPErrorInstance,toQueryString}from"../chunk-
|
|
1
|
+
export{defaultRetryMethods,defaultRetryStatusCodes,isHTTPError,isHTTPErrorInstance,toQueryString}from"../chunk-MFJBK6WG.js";//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zayne-labs/callapi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.2",
|
|
5
5
|
"description": "A lightweight wrapper over fetch with quality of life improvements like built-in request cancellation, retries, interceptors and more",
|
|
6
6
|
"author": "Ryan Zayne",
|
|
7
7
|
"license": "MIT",
|