accessio 1.6.0 → 1.7.1

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/cjs/accessio.cjs CHANGED
@@ -66,7 +66,10 @@ function runRequestInterceptorsSync(startConfig, interceptors) {
66
66
  }
67
67
  }
68
68
  }
69
- return isRejected ? Promise.reject(rejectReason) : Promise.resolve(cfg);
69
+ if (isRejected) {
70
+ throw rejectReason;
71
+ }
72
+ return cfg;
70
73
  }
71
74
  function runRequestInterceptorsAsync(startConfig, interceptors) {
72
75
  let promise = Promise.resolve(startConfig);
@@ -81,7 +84,7 @@ function runRequestInterceptorsAsync(startConfig, interceptors) {
81
84
  function dispatchAndRetry(cfg) {
82
85
  const fullUrl = (0, import_buildURL.default)(cfg.url ?? "", cfg.baseURL, cfg.params, cfg.paramsSerializer);
83
86
  (0, import_debug.logRequest)(cfg, fullUrl);
84
- const enrichedCfg = fullUrl !== (cfg.url || "") ? { ...cfg, _builtUrl: fullUrl } : cfg;
87
+ const enrichedCfg = { ...cfg, _builtUrl: fullUrl };
85
88
  const dispatchFn = cfg.rateLimiter ? (config) => (0, import_rateLimiter.rateLimitedRequest)(import_request.default, config.rateLimiter, config) : import_request.default;
86
89
  return (0, import_retry.default)(dispatchFn, enrichedCfg);
87
90
  }
@@ -113,8 +116,19 @@ class Accessio {
113
116
  );
114
117
  }
115
118
  const { requestInterceptors, responseInterceptors, synchronous } = this.collectInterceptors(mergedConfig);
116
- let promise = synchronous ? runRequestInterceptorsSync(mergedConfig, requestInterceptors) : runRequestInterceptorsAsync(mergedConfig, requestInterceptors);
117
- promise = promise.then((cfg) => dispatchAndRetry(cfg));
119
+ let promise;
120
+ if (synchronous) {
121
+ try {
122
+ const finalCfg = runRequestInterceptorsSync(mergedConfig, requestInterceptors);
123
+ promise = dispatchAndRetry(finalCfg);
124
+ } catch (err) {
125
+ promise = Promise.reject(err);
126
+ }
127
+ } else {
128
+ promise = runRequestInterceptorsAsync(mergedConfig, requestInterceptors).then(
129
+ (cfg) => dispatchAndRetry(cfg)
130
+ );
131
+ }
118
132
  promise = promise.then(
119
133
  (value) => {
120
134
  (0, import_debug.logResponse)(value);
@@ -125,13 +139,65 @@ class Accessio {
125
139
  throw error;
126
140
  }
127
141
  );
128
- for (const interceptor of responseInterceptors) {
129
- promise = promise.then((value) => {
130
- if (interceptor.fulfilled) {
131
- return interceptor.fulfilled(value);
142
+ if (responseInterceptors.length > 0) {
143
+ promise = promise.then(
144
+ async (value) => {
145
+ let current = value;
146
+ let isRejected = false;
147
+ for (const interceptor of responseInterceptors) {
148
+ if (!isRejected) {
149
+ try {
150
+ if (interceptor.fulfilled) {
151
+ current = await interceptor.fulfilled(current);
152
+ }
153
+ } catch (err) {
154
+ current = err;
155
+ isRejected = true;
156
+ }
157
+ } else if (interceptor.rejected) {
158
+ try {
159
+ current = await interceptor.rejected(current);
160
+ isRejected = false;
161
+ } catch (err) {
162
+ current = err;
163
+ isRejected = true;
164
+ }
165
+ }
166
+ }
167
+ if (isRejected) {
168
+ throw current;
169
+ }
170
+ return current;
171
+ },
172
+ async (error) => {
173
+ let current = error;
174
+ let isRejected = true;
175
+ for (const interceptor of responseInterceptors) {
176
+ if (!isRejected) {
177
+ try {
178
+ if (interceptor.fulfilled) {
179
+ current = await interceptor.fulfilled(current);
180
+ }
181
+ } catch (err) {
182
+ current = err;
183
+ isRejected = true;
184
+ }
185
+ } else if (interceptor.rejected) {
186
+ try {
187
+ current = await interceptor.rejected(current);
188
+ isRejected = false;
189
+ } catch (err) {
190
+ current = err;
191
+ isRejected = true;
192
+ }
193
+ }
194
+ }
195
+ if (isRejected) {
196
+ throw current;
197
+ }
198
+ return current;
132
199
  }
133
- return value;
134
- }, interceptor.rejected ?? void 0);
200
+ );
135
201
  }
136
202
  return promise;
137
203
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/accessio.ts"],"sourcesContent":["import InterceptorManager from './interceptors/interceptorManager';\nimport AccessioError from './core/accessioError';\nimport mergeConfig from './core/mergeConfig';\nimport dispatchRequest from './core/request';\nimport buildURL from './core/buildURL';\nimport retryRequest from './core/retry';\nimport { logRequest, logResponse, logError } from './helpers/debug';\nimport { rateLimitedRequest } from './helpers/rateLimiter';\nimport { toFormData } from './helpers/toFormData';\nimport type {\n AccessioRequestConfig,\n AccessioResponse,\n Interceptors,\n InterceptorHandler,\n} from './types';\nimport defaultsConfig from './defaults/index';\n\nfunction runRequestInterceptorsSync(\n startConfig: AccessioRequestConfig,\n interceptors: InterceptorHandler[],\n): Promise<AccessioRequestConfig> {\n let cfg = startConfig;\n let rejectReason: any = null;\n let isRejected = false;\n\n for (const interceptor of interceptors) {\n if (!isRejected) {\n try {\n if (interceptor.fulfilled) {\n cfg = (interceptor.fulfilled as any)(cfg) as AccessioRequestConfig;\n }\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n } else if (interceptor.rejected) {\n try {\n cfg = interceptor.rejected(rejectReason) as AccessioRequestConfig;\n isRejected = false;\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n }\n }\n\n return isRejected ? Promise.reject(rejectReason) : Promise.resolve(cfg);\n}\n\nfunction runRequestInterceptorsAsync(\n startConfig: AccessioRequestConfig,\n interceptors: InterceptorHandler[],\n): Promise<AccessioRequestConfig> {\n let promise: Promise<any> = Promise.resolve(startConfig);\n for (const interceptor of interceptors) {\n promise = promise.then(\n (value: any) => (interceptor.fulfilled ? (interceptor.fulfilled as any)(value) : value),\n interceptor.rejected ?? undefined,\n );\n }\n return promise as Promise<AccessioRequestConfig>;\n}\n\nfunction dispatchAndRetry(cfg: AccessioRequestConfig): Promise<AccessioResponse> {\n const fullUrl = buildURL(cfg.url ?? '', cfg.baseURL, cfg.params, cfg.paramsSerializer);\n logRequest(cfg, fullUrl);\n\n const enrichedCfg = fullUrl !== (cfg.url || '') ? { ...cfg, _builtUrl: fullUrl } : cfg;\n\n const dispatchFn = cfg.rateLimiter\n ? (config: AccessioRequestConfig) =>\n rateLimitedRequest(dispatchRequest, config.rateLimiter!, config)\n : dispatchRequest;\n\n return retryRequest(dispatchFn, enrichedCfg);\n}\n\nexport class Accessio {\n defaults: AccessioRequestConfig;\n interceptors: Interceptors;\n\n constructor(instanceConfig: AccessioRequestConfig = {}) {\n this.defaults = mergeConfig(defaultsConfig, instanceConfig);\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager(),\n };\n }\n\n request<T = any>(\n configOrUrl: string | AccessioRequestConfig,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n if (typeof configOrUrl === 'string') {\n config = { ...config, url: configOrUrl };\n } else {\n config = configOrUrl ? { ...configOrUrl } : {};\n }\n\n const mergedConfig = mergeConfig(this.defaults, config);\n\n mergedConfig.method = (mergedConfig.method || 'get').toLowerCase();\n\n if (!mergedConfig.url && !mergedConfig.baseURL) {\n throw new AccessioError(\n 'Request URL is required. Provide a `url` or `baseURL` in the config.',\n AccessioError.ERR_BAD_OPTION,\n mergedConfig,\n null,\n null,\n );\n }\n\n const { requestInterceptors, responseInterceptors, synchronous } =\n this.collectInterceptors(mergedConfig);\n\n let promise: Promise<any> = synchronous\n ? runRequestInterceptorsSync(mergedConfig, requestInterceptors)\n : runRequestInterceptorsAsync(mergedConfig, requestInterceptors);\n\n promise = promise.then((cfg: AccessioRequestConfig) => dispatchAndRetry(cfg));\n\n promise = promise.then(\n (value: AccessioResponse) => {\n logResponse(value);\n return value;\n },\n (error: any) => {\n logError(error, mergedConfig);\n throw error;\n },\n );\n\n for (const interceptor of responseInterceptors) {\n promise = promise.then((value: any) => {\n if (interceptor.fulfilled) {\n return (interceptor.fulfilled as any)(value);\n }\n return value;\n }, interceptor.rejected ?? undefined);\n }\n\n return promise;\n }\n\n private collectInterceptors(mergedConfig: AccessioRequestConfig): {\n requestInterceptors: InterceptorHandler[];\n responseInterceptors: InterceptorHandler[];\n synchronous: boolean;\n } {\n const requestInterceptors: InterceptorHandler[] = [];\n const responseInterceptors: InterceptorHandler[] = [];\n let synchronous = true;\n\n this.interceptors.request.forEach((interceptor: InterceptorHandler) => {\n if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) return;\n synchronous = synchronous && interceptor.synchronous;\n requestInterceptors.unshift(interceptor);\n });\n\n this.interceptors.response.forEach((interceptor: InterceptorHandler) => {\n responseInterceptors.push(interceptor);\n });\n\n return { requestInterceptors, responseInterceptors, synchronous };\n }\n\n getUri(config?: AccessioRequestConfig): string {\n const merged = mergeConfig(this.defaults, config);\n return buildURL(merged.url ?? '', merged.baseURL, merged.params, merged.paramsSerializer);\n }\n\n get<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'get', url }));\n }\n\n delete<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'delete', url }));\n }\n\n head<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'head', url }));\n }\n\n options<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'options', url }));\n }\n\n post<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'post', url, data }));\n }\n\n put<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'put', url, data }));\n }\n\n patch<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'patch', url, data }));\n }\n\n private formRequest<T = any>(\n method: 'post' | 'put' | 'patch',\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n const formData = data && !(data instanceof FormData) ? toFormData(data) : data;\n return this.request<T>(\n mergeConfig(config || {}, {\n method,\n url,\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n postForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('post', url, data, config);\n }\n\n putForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('put', url, data, config);\n }\n\n patchForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('patch', url, data, config);\n }\n\n async *stream<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): AsyncGenerator<T, void, unknown> {\n const response = await this.request<ReadableStream<Uint8Array>>(\n mergeConfig(config || {}, { method: 'get', url, responseType: 'stream' }),\n );\n if (!response.data) return;\n\n const reader = response.data.getReader();\n try {\n const decoder = new TextDecoder();\n let buffer = '';\n\n const processLine = function* (line: string) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data:')) {\n const dataStr = line.replace(/^data:\\s*/, '');\n if (dataStr === '[DONE]') return;\n try {\n yield JSON.parse(dataStr);\n } catch (e) {\n yield dataStr as any;\n }\n } else if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n yield JSON.parse(line);\n } catch (e) {\n // ignore partial json\n }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n yield* processLine(line);\n }\n }\n\n buffer += decoder.decode(new Uint8Array(), { stream: false });\n if (buffer.trim()) {\n yield* processLine(buffer);\n }\n } finally {\n try {\n await reader.cancel();\n } catch {\n // ignore errors on cancel\n }\n reader.releaseLock();\n }\n }\n\n async *autoPaginate<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): AsyncGenerator<T, void, unknown> {\n let nextUrl: string | null = url;\n let currentConfig = config || {};\n\n while (nextUrl) {\n const response: AccessioResponse<any> = await this.get(nextUrl, currentConfig);\n\n const data = response.data;\n const items = Array.isArray(data)\n ? data\n : data && typeof data === 'object'\n ? (data as any).data\n : null;\n\n if (Array.isArray(items)) {\n for (const item of items) {\n yield item;\n }\n }\n\n nextUrl =\n data && typeof data === 'object'\n ? (data as any).next || (data as any).links?.next || null\n : null;\n\n if (nextUrl) {\n currentConfig = mergeConfig(currentConfig, { url: nextUrl, params: {} });\n }\n }\n }\n\n gql<T = any>(\n url: string,\n query: string,\n variables?: Record<string, any>,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.post<T>(url, { query, variables }, config);\n }\n}\n\nexport default Accessio;\n"],"mappings":"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","names":["buildURL","dispatchRequest","retryRequest","mergeConfig","defaultsConfig","InterceptorManager","AccessioError"]}
1
+ {"version":3,"sources":["../src/accessio.ts"],"sourcesContent":["import InterceptorManager from './interceptors/interceptorManager';\nimport AccessioError from './core/accessioError';\nimport mergeConfig from './core/mergeConfig';\nimport dispatchRequest from './core/request';\nimport buildURL from './core/buildURL';\nimport retryRequest from './core/retry';\nimport { logRequest, logResponse, logError } from './helpers/debug';\nimport { rateLimitedRequest } from './helpers/rateLimiter';\nimport { toFormData } from './helpers/toFormData';\nimport type {\n AccessioRequestConfig,\n AccessioResponse,\n Interceptors,\n InterceptorHandler,\n} from './types';\nimport defaultsConfig from './defaults/index';\n\nfunction runRequestInterceptorsSync(\n startConfig: AccessioRequestConfig,\n interceptors: InterceptorHandler[],\n): AccessioRequestConfig {\n let cfg = startConfig;\n let rejectReason: any = null;\n let isRejected = false;\n\n for (const interceptor of interceptors) {\n if (!isRejected) {\n try {\n if (interceptor.fulfilled) {\n cfg = (interceptor.fulfilled as any)(cfg) as AccessioRequestConfig;\n }\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n } else if (interceptor.rejected) {\n try {\n cfg = interceptor.rejected(rejectReason) as AccessioRequestConfig;\n isRejected = false;\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n }\n }\n\n if (isRejected) {\n throw rejectReason;\n }\n return cfg;\n}\n\nfunction runRequestInterceptorsAsync(\n startConfig: AccessioRequestConfig,\n interceptors: InterceptorHandler[],\n): Promise<AccessioRequestConfig> {\n let promise: Promise<any> = Promise.resolve(startConfig);\n for (const interceptor of interceptors) {\n promise = promise.then(\n (value: any) => (interceptor.fulfilled ? (interceptor.fulfilled as any)(value) : value),\n interceptor.rejected ?? undefined,\n );\n }\n return promise as Promise<AccessioRequestConfig>;\n}\n\nfunction dispatchAndRetry(cfg: AccessioRequestConfig): Promise<AccessioResponse> {\n const fullUrl = buildURL(cfg.url ?? '', cfg.baseURL, cfg.params, cfg.paramsSerializer);\n logRequest(cfg, fullUrl);\n\n const enrichedCfg = { ...cfg, _builtUrl: fullUrl };\n\n const dispatchFn = cfg.rateLimiter\n ? (config: AccessioRequestConfig) =>\n rateLimitedRequest(dispatchRequest, config.rateLimiter!, config)\n : dispatchRequest;\n\n return retryRequest(dispatchFn, enrichedCfg);\n}\n\nexport class Accessio {\n defaults: AccessioRequestConfig;\n interceptors: Interceptors;\n\n constructor(instanceConfig: AccessioRequestConfig = {}) {\n this.defaults = mergeConfig(defaultsConfig, instanceConfig);\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager(),\n };\n }\n\n request<T = any>(\n configOrUrl: string | AccessioRequestConfig,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n if (typeof configOrUrl === 'string') {\n config = { ...config, url: configOrUrl };\n } else {\n config = configOrUrl ? { ...configOrUrl } : {};\n }\n\n const mergedConfig = mergeConfig(this.defaults, config);\n\n mergedConfig.method = (mergedConfig.method || 'get').toLowerCase();\n\n if (!mergedConfig.url && !mergedConfig.baseURL) {\n throw new AccessioError(\n 'Request URL is required. Provide a `url` or `baseURL` in the config.',\n AccessioError.ERR_BAD_OPTION,\n mergedConfig,\n null,\n null,\n );\n }\n\n const { requestInterceptors, responseInterceptors, synchronous } =\n this.collectInterceptors(mergedConfig);\n\n let promise: Promise<any>;\n\n if (synchronous) {\n try {\n const finalCfg = runRequestInterceptorsSync(mergedConfig, requestInterceptors);\n promise = dispatchAndRetry(finalCfg);\n } catch (err) {\n promise = Promise.reject(err);\n }\n } else {\n promise = runRequestInterceptorsAsync(mergedConfig, requestInterceptors).then(\n (cfg: AccessioRequestConfig) => dispatchAndRetry(cfg),\n );\n }\n\n promise = promise.then(\n (value: AccessioResponse) => {\n logResponse(value);\n return value;\n },\n (error: any) => {\n logError(error, mergedConfig);\n throw error;\n },\n );\n\n if (responseInterceptors.length > 0) {\n promise = promise.then(\n async (value: AccessioResponse) => {\n let current: any = value;\n let isRejected = false;\n for (const interceptor of responseInterceptors) {\n if (!isRejected) {\n try {\n if (interceptor.fulfilled) {\n current = await (interceptor.fulfilled as any)(current);\n }\n } catch (err) {\n current = err;\n isRejected = true;\n }\n } else if (interceptor.rejected) {\n try {\n current = await interceptor.rejected(current);\n isRejected = false;\n } catch (err) {\n current = err;\n isRejected = true;\n }\n }\n }\n if (isRejected) {\n throw current;\n }\n return current;\n },\n async (error: any) => {\n let current: any = error;\n let isRejected = true;\n for (const interceptor of responseInterceptors) {\n if (!isRejected) {\n try {\n if (interceptor.fulfilled) {\n current = await (interceptor.fulfilled as any)(current);\n }\n } catch (err) {\n current = err;\n isRejected = true;\n }\n } else if (interceptor.rejected) {\n try {\n current = await interceptor.rejected(current);\n isRejected = false;\n } catch (err) {\n current = err;\n isRejected = true;\n }\n }\n }\n if (isRejected) {\n throw current;\n }\n return current;\n },\n );\n }\n\n return promise;\n }\n\n private collectInterceptors(mergedConfig: AccessioRequestConfig): {\n requestInterceptors: InterceptorHandler[];\n responseInterceptors: InterceptorHandler[];\n synchronous: boolean;\n } {\n const requestInterceptors: InterceptorHandler[] = [];\n const responseInterceptors: InterceptorHandler[] = [];\n let synchronous = true;\n\n this.interceptors.request.forEach((interceptor: InterceptorHandler) => {\n if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) return;\n synchronous = synchronous && interceptor.synchronous;\n requestInterceptors.unshift(interceptor);\n });\n\n this.interceptors.response.forEach((interceptor: InterceptorHandler) => {\n responseInterceptors.push(interceptor);\n });\n\n return { requestInterceptors, responseInterceptors, synchronous };\n }\n\n getUri(config?: AccessioRequestConfig): string {\n const merged = mergeConfig(this.defaults, config);\n return buildURL(merged.url ?? '', merged.baseURL, merged.params, merged.paramsSerializer);\n }\n\n get<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'get', url }));\n }\n\n delete<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'delete', url }));\n }\n\n head<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'head', url }));\n }\n\n options<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'options', url }));\n }\n\n post<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'post', url, data }));\n }\n\n put<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'put', url, data }));\n }\n\n patch<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(mergeConfig(config || {}, { method: 'patch', url, data }));\n }\n\n private formRequest<T = any>(\n method: 'post' | 'put' | 'patch',\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n const formData = data && !(data instanceof FormData) ? toFormData(data) : data;\n return this.request<T>(\n mergeConfig(config || {}, {\n method,\n url,\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n postForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('post', url, data, config);\n }\n\n putForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('put', url, data, config);\n }\n\n patchForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.formRequest<T>('patch', url, data, config);\n }\n\n async *stream<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): AsyncGenerator<T, void, unknown> {\n const response = await this.request<ReadableStream<Uint8Array>>(\n mergeConfig(config || {}, { method: 'get', url, responseType: 'stream' }),\n );\n if (!response.data) return;\n\n const reader = response.data.getReader();\n try {\n const decoder = new TextDecoder();\n let buffer = '';\n\n const processLine = function* (line: string) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data:')) {\n const dataStr = line.replace(/^data:\\s*/, '');\n if (dataStr === '[DONE]') return;\n try {\n yield JSON.parse(dataStr);\n } catch (e) {\n yield dataStr as any;\n }\n } else if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n yield JSON.parse(line);\n } catch (e) {\n // ignore partial json\n }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n yield* processLine(line);\n }\n }\n\n buffer += decoder.decode(new Uint8Array(), { stream: false });\n if (buffer.trim()) {\n yield* processLine(buffer);\n }\n } finally {\n try {\n await reader.cancel();\n } catch {\n // ignore errors on cancel\n }\n reader.releaseLock();\n }\n }\n\n async *autoPaginate<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): AsyncGenerator<T, void, unknown> {\n let nextUrl: string | null = url;\n let currentConfig = config || {};\n\n while (nextUrl) {\n const response: AccessioResponse<any> = await this.get(nextUrl, currentConfig);\n\n const data = response.data;\n const items = Array.isArray(data)\n ? data\n : data && typeof data === 'object'\n ? (data as any).data\n : null;\n\n if (Array.isArray(items)) {\n for (const item of items) {\n yield item;\n }\n }\n\n nextUrl =\n data && typeof data === 'object'\n ? (data as any).next || (data as any).links?.next || null\n : null;\n\n if (nextUrl) {\n currentConfig = mergeConfig(currentConfig, { url: nextUrl, params: {} });\n }\n }\n }\n\n gql<T = any>(\n url: string,\n query: string,\n variables?: Record<string, any>,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.post<T>(url, { query, variables }, config);\n }\n}\n\nexport default Accessio;\n"],"mappings":"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","names":["buildURL","dispatchRequest","retryRequest","mergeConfig","defaultsConfig","InterceptorManager","AccessioError"]}
@@ -62,15 +62,11 @@ function serializeParams(params, paramsSerializer) {
62
62
  function combineURLs(baseURL, relativeURL) {
63
63
  if (!baseURL) return relativeURL || "";
64
64
  if (!relativeURL) return baseURL;
65
- let base = baseURL;
66
- while (base.endsWith("/")) {
67
- base = base.slice(0, -1);
68
- }
69
- let relative = relativeURL;
70
- while (relative.startsWith("/")) {
71
- relative = relative.slice(1);
72
- }
73
- return `${base}/${relative}`;
65
+ let baseEnd = baseURL.length;
66
+ while (baseEnd > 0 && baseURL[baseEnd - 1] === "/") baseEnd--;
67
+ let relStart = 0;
68
+ while (relStart < relativeURL.length && relativeURL[relStart] === "/") relStart++;
69
+ return baseURL.slice(0, baseEnd) + "/" + relativeURL.slice(relStart);
74
70
  }
75
71
  function isAbsoluteURL(url) {
76
72
  return /^([a-z][a-z\d+\-.]*:)/i.test(url);
@@ -79,24 +75,26 @@ function buildURL(url, baseURL, params, paramsSerializer) {
79
75
  let fullURL = baseURL && !isAbsoluteURL(url) ? combineURLs(baseURL, url) : url || "";
80
76
  let finalParams = params;
81
77
  if (params && typeof params === "object" && !(params instanceof URLSearchParams)) {
82
- const unusedParams = {};
83
- for (const key of Object.keys(params)) {
84
- if (key === "__proto__" || key === "prototype" || key === "constructor") continue;
85
- unusedParams[key] = params[key];
86
- }
87
- fullURL = fullURL.replace(
88
- /(?::([a-zA-Z_][a-zA-Z0-9_]*))|(?:{([a-zA-Z_][a-zA-Z0-9_]*)})/g,
89
- (match, p1, p2) => {
90
- const key = p1 || p2;
91
- if (key && Object.prototype.hasOwnProperty.call(unusedParams, key) && unusedParams[key] !== void 0) {
92
- const val = unusedParams[key];
93
- delete unusedParams[key];
94
- return encodeURIComponent(String(val));
95
- }
96
- return match;
78
+ if (fullURL.includes("{") || /:[a-zA-Z_]/.test(fullURL)) {
79
+ const unusedParams = {};
80
+ for (const key of Object.keys(params)) {
81
+ if (key === "__proto__" || key === "prototype" || key === "constructor") continue;
82
+ unusedParams[key] = params[key];
97
83
  }
98
- );
99
- finalParams = unusedParams;
84
+ fullURL = fullURL.replace(
85
+ /(?::([a-zA-Z_][a-zA-Z0-9_]*))|(?:{([a-zA-Z_][a-zA-Z0-9_]*)})/g,
86
+ (match, p1, p2) => {
87
+ const key = p1 || p2;
88
+ if (key && Object.prototype.hasOwnProperty.call(unusedParams, key) && unusedParams[key] !== void 0) {
89
+ const val = unusedParams[key];
90
+ delete unusedParams[key];
91
+ return encodeURIComponent(String(val));
92
+ }
93
+ return match;
94
+ }
95
+ );
96
+ finalParams = unusedParams;
97
+ }
100
98
  }
101
99
  const serialized = serializeParams(finalParams, paramsSerializer);
102
100
  if (serialized) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/buildURL.ts"],"sourcesContent":["import type { ParamsSerializer } from '../types';\n\nfunction serializeParams(\n params: Record<string, unknown>,\n paramsSerializer?: ParamsSerializer,\n): string {\n if (!params) return '';\n\n if (typeof paramsSerializer === 'function') {\n return paramsSerializer(params);\n }\n\n if (typeof URLSearchParams !== 'undefined' && params instanceof URLSearchParams) {\n return params.toString();\n }\n\n const parts: string[] = [];\n\n function encode(prefix: string, value: unknown): void {\n if (value === null || value === undefined) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n encode(`${prefix}[${index}]`, item);\n } else {\n encode(prefix, item);\n }\n });\n } else if (typeof value === 'object' && !(value instanceof Date)) {\n Object.keys(value as Record<string, unknown>).forEach((key) => {\n encode(`${prefix}[${key}]`, (value as Record<string, unknown>)[key]);\n });\n } else {\n const encodedValue = value instanceof Date ? value.toISOString() : value;\n parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(encodedValue as string)}`);\n }\n }\n\n Object.keys(params).forEach((key) => {\n encode(key, params[key]);\n });\n\n return parts.join('&');\n}\n\nfunction combineURLs(baseURL: string, relativeURL: string): string {\n if (!baseURL) return relativeURL || '';\n if (!relativeURL) return baseURL;\n\n let base = baseURL;\n while (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n\n let relative = relativeURL;\n while (relative.startsWith('/')) {\n relative = relative.slice(1);\n }\n\n return `${base}/${relative}`;\n}\n\nfunction isAbsoluteURL(url: string): boolean {\n return /^([a-z][a-z\\d+\\-.]*:)/i.test(url);\n}\n\nexport default function buildURL(\n url: string,\n baseURL?: string,\n params?: Record<string, unknown>,\n paramsSerializer?: ParamsSerializer,\n): string {\n let fullURL = baseURL && !isAbsoluteURL(url) ? combineURLs(baseURL, url) : url || '';\n\n let finalParams = params;\n if (params && typeof params === 'object' && !(params instanceof URLSearchParams)) {\n const unusedParams: Record<string, unknown> = {};\n for (const key of Object.keys(params)) {\n if (key === '__proto__' || key === 'prototype' || key === 'constructor') continue;\n unusedParams[key] = (params as Record<string, unknown>)[key];\n }\n fullURL = fullURL.replace(\n /(?::([a-zA-Z_][a-zA-Z0-9_]*))|(?:{([a-zA-Z_][a-zA-Z0-9_]*)})/g,\n (match, p1, p2) => {\n const key = p1 || p2;\n if (\n key &&\n Object.prototype.hasOwnProperty.call(unusedParams, key) &&\n unusedParams[key] !== undefined\n ) {\n const val = unusedParams[key];\n delete unusedParams[key];\n return encodeURIComponent(String(val));\n }\n return match;\n },\n );\n finalParams = unusedParams;\n }\n\n const serialized = serializeParams(finalParams as Record<string, unknown>, paramsSerializer);\n if (serialized) {\n const hashIndex = fullURL.indexOf('#');\n let fragment = '';\n if (hashIndex !== -1) {\n fragment = fullURL.slice(hashIndex);\n fullURL = fullURL.slice(0, hashIndex);\n }\n fullURL += (fullURL.indexOf('?') === -1 ? '?' : '&') + serialized + fragment;\n }\n\n return fullURL;\n}\n\nexport { serializeParams, combineURLs, isAbsoluteURL };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/core/buildURL.ts"],"sourcesContent":["import type { ParamsSerializer } from '../types';\n\nfunction serializeParams(\n params: Record<string, unknown>,\n paramsSerializer?: ParamsSerializer,\n): string {\n if (!params) return '';\n\n if (typeof paramsSerializer === 'function') {\n return paramsSerializer(params);\n }\n\n if (typeof URLSearchParams !== 'undefined' && params instanceof URLSearchParams) {\n return params.toString();\n }\n\n const parts: string[] = [];\n\n function encode(prefix: string, value: unknown): void {\n if (value === null || value === undefined) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n encode(`${prefix}[${index}]`, item);\n } else {\n encode(prefix, item);\n }\n });\n } else if (typeof value === 'object' && !(value instanceof Date)) {\n Object.keys(value as Record<string, unknown>).forEach((key) => {\n encode(`${prefix}[${key}]`, (value as Record<string, unknown>)[key]);\n });\n } else {\n const encodedValue = value instanceof Date ? value.toISOString() : value;\n parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(encodedValue as string)}`);\n }\n }\n\n Object.keys(params).forEach((key) => {\n encode(key, params[key]);\n });\n\n return parts.join('&');\n}\n\nfunction combineURLs(baseURL: string, relativeURL: string): string {\n if (!baseURL) return relativeURL || '';\n if (!relativeURL) return baseURL;\n\n let baseEnd = baseURL.length;\n while (baseEnd > 0 && baseURL[baseEnd - 1] === '/') baseEnd--;\n\n let relStart = 0;\n while (relStart < relativeURL.length && relativeURL[relStart] === '/') relStart++;\n\n return baseURL.slice(0, baseEnd) + '/' + relativeURL.slice(relStart);\n}\n\nfunction isAbsoluteURL(url: string): boolean {\n return /^([a-z][a-z\\d+\\-.]*:)/i.test(url);\n}\n\nexport default function buildURL(\n url: string,\n baseURL?: string,\n params?: Record<string, unknown>,\n paramsSerializer?: ParamsSerializer,\n): string {\n let fullURL = baseURL && !isAbsoluteURL(url) ? combineURLs(baseURL, url) : url || '';\n\n let finalParams = params;\n if (params && typeof params === 'object' && !(params instanceof URLSearchParams)) {\n if (fullURL.includes('{') || /:[a-zA-Z_]/.test(fullURL)) {\n const unusedParams: Record<string, unknown> = {};\n for (const key of Object.keys(params)) {\n if (key === '__proto__' || key === 'prototype' || key === 'constructor') continue;\n unusedParams[key] = (params as Record<string, unknown>)[key];\n }\n fullURL = fullURL.replace(\n /(?::([a-zA-Z_][a-zA-Z0-9_]*))|(?:{([a-zA-Z_][a-zA-Z0-9_]*)})/g,\n (match, p1, p2) => {\n const key = p1 || p2;\n if (\n key &&\n Object.prototype.hasOwnProperty.call(unusedParams, key) &&\n unusedParams[key] !== undefined\n ) {\n const val = unusedParams[key];\n delete unusedParams[key];\n return encodeURIComponent(String(val));\n }\n return match;\n },\n );\n finalParams = unusedParams;\n }\n }\n\n const serialized = serializeParams(finalParams as Record<string, unknown>, paramsSerializer);\n if (serialized) {\n const hashIndex = fullURL.indexOf('#');\n let fragment = '';\n if (hashIndex !== -1) {\n fragment = fullURL.slice(hashIndex);\n fullURL = fullURL.slice(0, hashIndex);\n }\n fullURL += (fullURL.indexOf('?') === -1 ? '?' : '&') + serialized + fragment;\n }\n\n return fullURL;\n}\n\nexport { serializeParams, combineURLs, isAbsoluteURL };\n"],"mappings":"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","names":[]}
@@ -42,6 +42,8 @@ async function readResponseData(fetchResponse, config) {
42
42
  return await fetchResponse.blob();
43
43
  case "stream":
44
44
  return fetchResponse.body;
45
+ case "text":
46
+ return await fetchResponse.text();
45
47
  case "json":
46
48
  default: {
47
49
  const contentType = fetchResponse.headers.get("content-type") || "";
@@ -186,7 +188,13 @@ function classifyFetchError(error, config, isTimedOut) {
186
188
  }
187
189
  const isAbort = error instanceof Error && error.name === "AbortError" || !!config.signal?.aborted;
188
190
  if (isAbort) {
189
- return new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
191
+ const reason = config.signal?.reason;
192
+ const message = reason instanceof Error ? reason.message : typeof reason === "string" ? reason : "Request aborted";
193
+ const err = new import_accessioError.default(message, import_accessioError.default.ERR_CANCELED, config, null, null);
194
+ if (reason instanceof Error) {
195
+ err.cause = reason;
196
+ }
197
+ return err;
190
198
  }
191
199
  return import_accessioError.default.from(
192
200
  error instanceof Error ? error : new Error(String(error)),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/fetchAdapter.ts"],"sourcesContent":["import AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nasync function readResponseData(\n fetchResponse: Response,\n config: AccessioRequestConfig,\n): Promise<unknown> {\n const responseType = config.responseType || 'json';\n switch (responseType) {\n case 'arraybuffer':\n return await fetchResponse.arrayBuffer();\n case 'blob':\n return await fetchResponse.blob();\n case 'stream':\n return fetchResponse.body;\n case 'json':\n default: {\n const contentType = fetchResponse.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const text = await fetchResponse.text();\n if (!text) return '';\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new AccessioError(\n `Failed to parse JSON response: ${(err as Error).message}. Raw body: ${\n text.length > 500 ? `${text.slice(0, 500)}…` : text\n }`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n }\n return await fetchResponse.text();\n }\n }\n}\n\nfunction assertValidURL(fullURL: string, config: AccessioRequestConfig): void {\n if (!fullURL || !/^[a-z][a-z\\d+\\-.]*:/i.test(fullURL)) return;\n try {\n new URL(fullURL);\n } catch {\n throw new AccessioError(\n `Invalid URL: ${fullURL}`,\n AccessioError.ERR_INVALID_URL,\n config,\n null,\n null,\n );\n }\n}\n\ninterface AbortWiring {\n isTimedOut: () => boolean;\n cleanup: () => void;\n}\n\nfunction setupAbort(config: AccessioRequestConfig, fetchOptions: RequestInit): AbortWiring {\n if (\n config.timeout !== undefined &&\n (typeof config.timeout !== 'number' || isNaN(config.timeout) || config.timeout < 0)\n ) {\n throw new AccessioError(\n `Invalid timeout value: ${config.timeout}`,\n AccessioError.ERR_BAD_OPTION_VALUE,\n config,\n null,\n null,\n );\n }\n\n const timeoutValue = Number(config.timeout);\n const hasTimeout = !isNaN(timeoutValue) && timeoutValue > 0;\n\n if (!hasTimeout) {\n if (config.signal) fetchOptions.signal = config.signal;\n return { isTimedOut: () => false, cleanup: () => {} };\n }\n\n let timedOut = false;\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort(\n new AccessioError(\n `timeout of ${timeoutValue}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, timeoutValue);\n\n let onUserAbort: (() => void) | null = null;\n\n if (config.signal) {\n if (typeof AbortSignal.any === 'function') {\n fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);\n } else {\n if (config.signal.aborted) {\n abortController.abort(config.signal.reason);\n } else {\n onUserAbort = () => {\n if (!timedOut) abortController.abort(config.signal!.reason);\n };\n config.signal.addEventListener('abort', onUserAbort, { once: true });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n\n return {\n isTimedOut: () => timedOut,\n cleanup: () => {\n clearTimeout(timeoutId);\n if (onUserAbort && config.signal) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n },\n };\n}\n\nfunction wrapDownloadProgress(fetchResponse: Response, config: AccessioRequestConfig): Response {\n if (!config.onDownloadProgress || !fetchResponse.body || config.responseType === 'stream') {\n return fetchResponse;\n }\n\n const contentLength = fetchResponse.headers.get('content-length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n\n const reader = fetchResponse.body.getReader();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n loaded += value.byteLength;\n config.onDownloadProgress!({ loaded, total });\n controller.enqueue(value);\n }\n } catch (e) {\n controller.error(e);\n }\n },\n cancel(reason) {\n reader.cancel(reason).catch(() => {});\n },\n });\n\n return new Response(stream, {\n headers: fetchResponse.headers,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n });\n}\n\nfunction classifyFetchError(\n error: unknown,\n config: AccessioRequestConfig,\n isTimedOut: boolean,\n): AccessioError {\n if (error instanceof AccessioError) return error;\n\n if (isTimedOut) {\n return new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n\n const isAbort =\n (error instanceof Error && error.name === 'AbortError') || !!config.signal?.aborted;\n if (isAbort) {\n return new AccessioError('Request aborted', AccessioError.ERR_CANCELED, config, null, null);\n }\n\n return AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n}\n\nexport default async function fetchAdapter(\n config: AccessioRequestConfig,\n fullURL: string,\n fetchOptions: RequestInit,\n requestStartTime: number,\n): Promise<AccessioResponse> {\n assertValidURL(fullURL, config);\n\n const abort = setupAbort(config, fetchOptions);\n\n try {\n const fetchImpl = config.fetch || fetch;\n const rawResponse = await fetchImpl(fullURL, fetchOptions);\n const fetchResponse = wrapDownloadProgress(rawResponse, config);\n\n const contentLength = fetchResponse.headers.get('content-length');\n if (\n contentLength &&\n config.maxContentLength &&\n parseInt(contentLength, 10) > config.maxContentLength\n ) {\n throw new AccessioError(\n `maxContentLength size of ${config.maxContentLength} exceeded`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n let responseData: unknown;\n try {\n responseData = await readResponseData(fetchResponse, config);\n if (config.schema) {\n if (typeof config.schema.parseAsync === 'function') {\n responseData = await config.schema.parseAsync(responseData);\n } else {\n responseData = config.schema.parse(responseData);\n }\n }\n } catch (readError) {\n if (readError instanceof AccessioError) throw readError;\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n return {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: parseHeaders(fetchResponse.headers),\n config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n } catch (error) {\n throw classifyFetchError(error, config, abort.isTimedOut());\n } finally {\n abort.cleanup();\n }\n}\n"],"mappings":"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","names":["AccessioError","parseHeaders"]}
1
+ {"version":3,"sources":["../../src/core/fetchAdapter.ts"],"sourcesContent":["import AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nasync function readResponseData(\n fetchResponse: Response,\n config: AccessioRequestConfig,\n): Promise<unknown> {\n const responseType = config.responseType || 'json';\n switch (responseType) {\n case 'arraybuffer':\n return await fetchResponse.arrayBuffer();\n case 'blob':\n return await fetchResponse.blob();\n case 'stream':\n return fetchResponse.body;\n case 'text':\n return await fetchResponse.text();\n case 'json':\n default: {\n const contentType = fetchResponse.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const text = await fetchResponse.text();\n if (!text) return '';\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new AccessioError(\n `Failed to parse JSON response: ${(err as Error).message}. Raw body: ${\n text.length > 500 ? `${text.slice(0, 500)}…` : text\n }`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n }\n return await fetchResponse.text();\n }\n }\n}\n\nfunction assertValidURL(fullURL: string, config: AccessioRequestConfig): void {\n if (!fullURL || !/^[a-z][a-z\\d+\\-.]*:/i.test(fullURL)) return;\n try {\n new URL(fullURL);\n } catch {\n throw new AccessioError(\n `Invalid URL: ${fullURL}`,\n AccessioError.ERR_INVALID_URL,\n config,\n null,\n null,\n );\n }\n}\n\ninterface AbortWiring {\n isTimedOut: () => boolean;\n cleanup: () => void;\n}\n\nfunction setupAbort(config: AccessioRequestConfig, fetchOptions: RequestInit): AbortWiring {\n if (\n config.timeout !== undefined &&\n (typeof config.timeout !== 'number' || isNaN(config.timeout) || config.timeout < 0)\n ) {\n throw new AccessioError(\n `Invalid timeout value: ${config.timeout}`,\n AccessioError.ERR_BAD_OPTION_VALUE,\n config,\n null,\n null,\n );\n }\n\n const timeoutValue = Number(config.timeout);\n const hasTimeout = !isNaN(timeoutValue) && timeoutValue > 0;\n\n if (!hasTimeout) {\n if (config.signal) fetchOptions.signal = config.signal;\n return { isTimedOut: () => false, cleanup: () => {} };\n }\n\n let timedOut = false;\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort(\n new AccessioError(\n `timeout of ${timeoutValue}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, timeoutValue);\n\n let onUserAbort: (() => void) | null = null;\n\n if (config.signal) {\n if (typeof AbortSignal.any === 'function') {\n fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);\n } else {\n if (config.signal.aborted) {\n abortController.abort(config.signal.reason);\n } else {\n onUserAbort = () => {\n if (!timedOut) abortController.abort(config.signal!.reason);\n };\n config.signal.addEventListener('abort', onUserAbort, { once: true });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n\n return {\n isTimedOut: () => timedOut,\n cleanup: () => {\n clearTimeout(timeoutId);\n if (onUserAbort && config.signal) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n },\n };\n}\n\nfunction wrapDownloadProgress(fetchResponse: Response, config: AccessioRequestConfig): Response {\n if (!config.onDownloadProgress || !fetchResponse.body || config.responseType === 'stream') {\n return fetchResponse;\n }\n\n const contentLength = fetchResponse.headers.get('content-length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n\n const reader = fetchResponse.body.getReader();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n loaded += value.byteLength;\n config.onDownloadProgress!({ loaded, total });\n controller.enqueue(value);\n }\n } catch (e) {\n controller.error(e);\n }\n },\n cancel(reason) {\n reader.cancel(reason).catch(() => {});\n },\n });\n\n return new Response(stream, {\n headers: fetchResponse.headers,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n });\n}\n\nfunction classifyFetchError(\n error: unknown,\n config: AccessioRequestConfig,\n isTimedOut: boolean,\n): AccessioError {\n if (error instanceof AccessioError) return error;\n\n if (isTimedOut) {\n return new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n\n const isAbort =\n (error instanceof Error && error.name === 'AbortError') || !!config.signal?.aborted;\n if (isAbort) {\n const reason = config.signal?.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : 'Request aborted';\n const err = new AccessioError(message, AccessioError.ERR_CANCELED, config, null, null);\n if (reason instanceof Error) {\n err.cause = reason;\n }\n return err;\n }\n\n return AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n}\n\nexport default async function fetchAdapter(\n config: AccessioRequestConfig,\n fullURL: string,\n fetchOptions: RequestInit,\n requestStartTime: number,\n): Promise<AccessioResponse> {\n assertValidURL(fullURL, config);\n\n const abort = setupAbort(config, fetchOptions);\n\n try {\n const fetchImpl = config.fetch || fetch;\n const rawResponse = await fetchImpl(fullURL, fetchOptions);\n const fetchResponse = wrapDownloadProgress(rawResponse, config);\n\n const contentLength = fetchResponse.headers.get('content-length');\n if (\n contentLength &&\n config.maxContentLength &&\n parseInt(contentLength, 10) > config.maxContentLength\n ) {\n throw new AccessioError(\n `maxContentLength size of ${config.maxContentLength} exceeded`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n let responseData: unknown;\n try {\n responseData = await readResponseData(fetchResponse, config);\n if (config.schema) {\n if (typeof config.schema.parseAsync === 'function') {\n responseData = await config.schema.parseAsync(responseData);\n } else {\n responseData = config.schema.parse(responseData);\n }\n }\n } catch (readError) {\n if (readError instanceof AccessioError) throw readError;\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n return {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: parseHeaders(fetchResponse.headers),\n config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n } catch (error) {\n throw classifyFetchError(error, config, abort.isTimedOut());\n } finally {\n abort.cleanup();\n }\n}\n"],"mappings":"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","names":["AccessioError","parseHeaders"]}
@@ -48,18 +48,23 @@ const requestOnlyKeys = /* @__PURE__ */ new Set(["url", "data", "signal"]);
48
48
  const deepMergeKeys = /* @__PURE__ */ new Set(["headers", "params", "hooks"]);
49
49
  function mergeConfig(config1 = {}, config2 = {}) {
50
50
  const merged = /* @__PURE__ */ Object.create(null);
51
- const allKeys = /* @__PURE__ */ new Set([...Object.keys(config1), ...Object.keys(config2)]);
52
- for (const key of allKeys) {
53
- const val1 = config1[key];
51
+ const keys1 = Object.keys(config1);
52
+ for (let i = 0; i < keys1.length; i++) {
53
+ const key = keys1[i];
54
+ if (requestOnlyKeys.has(key)) continue;
55
+ merged[key] = config1[key];
56
+ }
57
+ const keys2 = Object.keys(config2);
58
+ for (let i = 0; i < keys2.length; i++) {
59
+ const key = keys2[i];
54
60
  const val2 = config2[key];
55
- if (requestOnlyKeys.has(key)) {
56
- if (val2 !== void 0) {
61
+ if (val2 !== void 0) {
62
+ if (deepMergeKeys.has(key)) {
63
+ const val1 = config1[key];
64
+ merged[key] = deepMerge(val1 || {}, val2);
65
+ } else {
57
66
  merged[key] = val2;
58
67
  }
59
- } else if (deepMergeKeys.has(key)) {
60
- merged[key] = deepMerge(val1 || {}, val2 || {});
61
- } else {
62
- merged[key] = val2 !== void 0 ? val2 : val1;
63
68
  }
64
69
  }
65
70
  return merged;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/mergeConfig.ts"],"sourcesContent":["import type { AccessioRequestConfig } from '../types';\n\nfunction deepMerge(...sources: any[]): Record<string, any> {\n const result: Record<string, any> = Object.create(null);\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const key of Object.keys(source)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;\n\n const value = source[key];\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error ||\n (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n ) {\n result[key] = value;\n } else if (result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = deepMerge(value);\n }\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n\nconst requestOnlyKeys = new Set<string>(['url', 'data', 'signal']);\nconst deepMergeKeys = new Set<string>(['headers', 'params', 'hooks']);\n\nexport default function mergeConfig(\n config1: AccessioRequestConfig = {},\n config2: AccessioRequestConfig = {},\n): AccessioRequestConfig {\n const merged: any = Object.create(null);\n\n const allKeys = new Set<string>([...Object.keys(config1), ...Object.keys(config2)]);\n\n for (const key of allKeys) {\n const val1 = config1[key as keyof AccessioRequestConfig];\n const val2 = config2[key as keyof AccessioRequestConfig];\n\n if (requestOnlyKeys.has(key)) {\n if (val2 !== undefined) {\n merged[key] = val2;\n }\n } else if (deepMergeKeys.has(key)) {\n merged[key] = deepMerge(val1 || {}, val2 || {});\n } else {\n merged[key] = val2 !== undefined ? val2 : val1;\n }\n }\n\n return merged;\n}\n\nexport { deepMerge };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,aAAa,SAAqC;AACzD,QAAM,SAA8B,uBAAO,OAAO,IAAI;AAEtD,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU;AAE3C,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,UAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AAEzE,YAAM,QAAQ,OAAO,GAAG;AAExB,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YACE,iBAAiB,QACjB,iBAAiB,UACjB,iBAAiB,OACjB,iBAAiB,OACjB,iBAAiB,SAChB,OAAO,gBAAgB,eAAe,iBAAiB,eACvD,OAAO,SAAS,eAAe,iBAAiB,MACjD;AACA,iBAAO,GAAG,IAAI;AAAA,QAChB,WAAW,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AACxF,iBAAO,GAAG,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK;AAAA,QAC5C,OAAO;AACL,iBAAO,GAAG,IAAI,UAAU,KAAK;AAAA,QAC/B;AAAA,MACF,WAAW,UAAU,QAAW;AAC9B,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,kBAAkB,oBAAI,IAAY,CAAC,OAAO,QAAQ,QAAQ,CAAC;AACjE,MAAM,gBAAgB,oBAAI,IAAY,CAAC,WAAW,UAAU,OAAO,CAAC;AAErD,SAAR,YACL,UAAiC,CAAC,GAClC,UAAiC,CAAC,GACX;AACvB,QAAM,SAAc,uBAAO,OAAO,IAAI;AAEtC,QAAM,UAAU,oBAAI,IAAY,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AAElF,aAAW,OAAO,SAAS;AACzB,UAAM,OAAO,QAAQ,GAAkC;AACvD,UAAM,OAAO,QAAQ,GAAkC;AAEvD,QAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,UAAI,SAAS,QAAW;AACtB,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF,WAAW,cAAc,IAAI,GAAG,GAAG;AACjC,aAAO,GAAG,IAAI,UAAU,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,GAAG,IAAI,SAAS,SAAY,OAAO;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/core/mergeConfig.ts"],"sourcesContent":["import type { AccessioRequestConfig } from '../types';\n\nfunction deepMerge(...sources: any[]): Record<string, any> {\n const result: Record<string, any> = Object.create(null);\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const key of Object.keys(source)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;\n\n const value = source[key];\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error ||\n (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n ) {\n result[key] = value;\n } else if (result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = deepMerge(value);\n }\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n\nconst requestOnlyKeys = new Set<string>(['url', 'data', 'signal']);\nconst deepMergeKeys = new Set<string>(['headers', 'params', 'hooks']);\n\nexport default function mergeConfig(\n config1: AccessioRequestConfig = {},\n config2: AccessioRequestConfig = {},\n): AccessioRequestConfig {\n const merged: any = Object.create(null);\n\n const keys1 = Object.keys(config1);\n for (let i = 0; i < keys1.length; i++) {\n const key = keys1[i];\n if (requestOnlyKeys.has(key)) continue;\n merged[key] = config1[key as keyof AccessioRequestConfig];\n }\n\n const keys2 = Object.keys(config2);\n for (let i = 0; i < keys2.length; i++) {\n const key = keys2[i];\n const val2 = config2[key as keyof AccessioRequestConfig];\n if (val2 !== undefined) {\n if (deepMergeKeys.has(key)) {\n const val1 = config1[key as keyof AccessioRequestConfig];\n merged[key] = deepMerge(val1 || {}, val2);\n } else {\n merged[key] = val2;\n }\n }\n }\n\n return merged;\n}\n\nexport { deepMerge };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,aAAa,SAAqC;AACzD,QAAM,SAA8B,uBAAO,OAAO,IAAI;AAEtD,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU;AAE3C,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,UAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AAEzE,YAAM,QAAQ,OAAO,GAAG;AAExB,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YACE,iBAAiB,QACjB,iBAAiB,UACjB,iBAAiB,OACjB,iBAAiB,OACjB,iBAAiB,SAChB,OAAO,gBAAgB,eAAe,iBAAiB,eACvD,OAAO,SAAS,eAAe,iBAAiB,MACjD;AACA,iBAAO,GAAG,IAAI;AAAA,QAChB,WAAW,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AACxF,iBAAO,GAAG,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK;AAAA,QAC5C,OAAO;AACL,iBAAO,GAAG,IAAI,UAAU,KAAK;AAAA,QAC/B;AAAA,MACF,WAAW,UAAU,QAAW;AAC9B,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,kBAAkB,oBAAI,IAAY,CAAC,OAAO,QAAQ,QAAQ,CAAC;AACjE,MAAM,gBAAgB,oBAAI,IAAY,CAAC,WAAW,UAAU,OAAO,CAAC;AAErD,SAAR,YACL,UAAiC,CAAC,GAClC,UAAiC,CAAC,GACX;AACvB,QAAM,SAAc,uBAAO,OAAO,IAAI;AAEtC,QAAM,QAAQ,OAAO,KAAK,OAAO;AACjC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,gBAAgB,IAAI,GAAG,EAAG;AAC9B,WAAO,GAAG,IAAI,QAAQ,GAAkC;AAAA,EAC1D;AAEA,QAAM,QAAQ,OAAO,KAAK,OAAO;AACjC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,OAAO,QAAQ,GAAkC;AACvD,QAAI,SAAS,QAAW;AACtB,UAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,cAAM,OAAO,QAAQ,GAAkC;AACvD,eAAO,GAAG,IAAI,UAAU,QAAQ,CAAC,GAAG,IAAI;AAAA,MAC1C,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -108,7 +108,7 @@ async function dispatchRequest(config) {
108
108
  const flatHeaders = (0, import_flattenHeaders.flattenHeaders)(config.headers, config.method);
109
109
  (0, import_auth.setBasicAuth)(config, flatHeaders);
110
110
  const isGet = (config.method || "GET").toUpperCase() === "GET";
111
- const cacheKey = isGet ? buildCacheKey(config, fullURL, flatHeaders) : "";
111
+ const cacheKey = isGet && (config.cache || config.dedupe) ? buildCacheKey(config, fullURL, flatHeaders) : "";
112
112
  if (isGet && config.cache) {
113
113
  const cacheProvider = typeof config.cache === "object" ? config.cache : import_memoryCache.defaultMemoryCache;
114
114
  const cached = await cacheProvider.get(cacheKey);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError, { redactConfig } from './accessioError';\nimport { ERR_BAD_OPTION } from '../constants/errorCodes';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport { flattenHeaders, removeContentType, buildFetchHeaders } from '../helpers/flattenHeaders';\nimport { setBasicAuth } from '../helpers/auth';\nimport fetchAdapter from './fetchAdapter';\nimport { defaultMemoryCache } from '../helpers/memoryCache';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\ntype HeadersConfig = Record<string, Record<string, string | string[]>>;\ntype FlatHeaders = Record<string, string | string[]>;\n\nfunction buildCacheKey(\n config: AccessioRequestConfig,\n fullURL: string,\n flatHeaders: FlatHeaders,\n): string {\n if (typeof config.cacheKeySerializer === 'function') {\n return config.cacheKeySerializer(config, fullURL, flatHeaders);\n }\n const method = (config.method || 'GET').toUpperCase();\n const withCreds = config.withCredentials ? '1' : '0';\n const respType = config.responseType || 'json';\n\n // Sort and serialize headers dynamically to prevent collisions,\n // excluding environment-specific transient headers.\n const serializedHeaders = Object.keys(flatHeaders)\n .sort()\n .filter(\n (k) =>\n !['user-agent', 'connection', 'host', 'content-length', 'accept-encoding'].includes(\n k.toLowerCase(),\n ),\n )\n .map((k) => {\n const val = flatHeaders[k];\n return `${k.toLowerCase()}=${Array.isArray(val) ? val.join(',') : val}`;\n })\n .join('&');\n\n return `${method}:${fullURL}|h:${serializedHeaders}|c=${withCreds}|t=${respType}`;\n}\n\nfunction buildTransformArray(\n transform: TransformFunction | TransformFunction[] | undefined,\n): TransformFunction[] {\n if (!transform) return [];\n if (Array.isArray(transform)) return transform;\n return [transform];\n}\n\nconst DEFAULT_ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nfunction assertAllowedProtocol(fullURL: string, config: AccessioRequestConfig): void {\n if (config.allowedProtocols === null) return;\n const allowed = config.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;\n\n let scheme: string | null = null;\n const match = /^([a-z][a-z\\d+\\-.]*):/i.exec(fullURL);\n if (match) scheme = `${match[1].toLowerCase()}:`;\n if (!scheme) return;\n\n if (!allowed.includes(scheme)) {\n throw new AccessioError(\n `URL protocol \"${scheme}\" is not allowed. Allowed: ${allowed.join(', ')}. ` +\n 'Set config.allowedProtocols to extend, or null to disable the check.',\n ERR_BAD_OPTION,\n config,\n null,\n null,\n );\n }\n}\n\nconst activeRequests = new Map<string, Promise<AccessioResponse>>();\nconst MAX_ACTIVE_REQUESTS = 1024;\n\nexport function __activeRequestsSize(): number {\n return activeRequests.size;\n}\n\nfunction trackActiveRequest(key: string, promise: Promise<AccessioResponse>): void {\n activeRequests.set(key, promise);\n // Evict the oldest entry if we've grown past the cap. Map preserves insertion order.\n while (activeRequests.size > MAX_ACTIVE_REQUESTS) {\n const oldest = activeRequests.keys().next().value;\n if (oldest === undefined || oldest === key) break;\n activeRequests.delete(oldest);\n }\n}\n\nexport default async function dispatchRequest(\n config: AccessioRequestConfig,\n): Promise<AccessioResponse> {\n const fullURL =\n config._builtUrl ||\n buildURL(\n config.url ?? '',\n config.baseURL,\n config.params as Record<string, unknown> | undefined,\n config.paramsSerializer,\n );\n\n assertAllowedProtocol(fullURL, config);\n\n if (config.hooks?.onBeforeRequest) {\n await config.hooks.onBeforeRequest(config);\n }\n\n const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n setBasicAuth(config, flatHeaders);\n\n const isGet = (config.method || 'GET').toUpperCase() === 'GET';\n const cacheKey = isGet ? buildCacheKey(config, fullURL, flatHeaders) : '';\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n const cached = await cacheProvider.get(cacheKey);\n if (cached) {\n const cachedView: AccessioResponse = {\n ...cached,\n config: redactConfig(config) as typeof cached.config,\n };\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(cachedView);\n }\n return cachedView;\n }\n }\n\n if (isGet && config.dedupe) {\n const inflight = activeRequests.get(cacheKey);\n if (inflight) {\n try {\n const shared = await inflight;\n const response = finalizeResponse(shared, config);\n const settled = await new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(settled);\n }\n\n return settled;\n } catch (error) {\n let finalError = error;\n if (error instanceof AccessioError) {\n finalError = AccessioError.from(\n error,\n error.code || 'ERR_DEDUPE',\n config,\n error.request,\n error.response,\n );\n }\n if (config.hooks?.onRequestError && finalError instanceof AccessioError) {\n await config.hooks.onRequestError(finalError);\n }\n throw finalError;\n }\n }\n }\n\n const performRequest = async (): Promise<AccessioResponse> => {\n const requestTransforms = buildTransformArray(config.transformRequest);\n const requestData = await transformData(requestTransforms, config.data, flatHeaders, config);\n\n if (\n requestData === null ||\n requestData === undefined ||\n (typeof FormData !== 'undefined' && requestData instanceof FormData)\n ) {\n removeContentType(flatHeaders);\n }\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: buildFetchHeaders(flatHeaders),\n };\n\n const methodsWithBody = ['POST', 'PUT', 'PATCH', 'DELETE'];\n if (\n methodsWithBody.includes(fetchOptions.method!) &&\n requestData !== undefined &&\n requestData !== null\n ) {\n fetchOptions.body = requestData as BodyInit;\n }\n\n if (config.withCredentials) {\n fetchOptions.credentials = 'include';\n }\n\n if (config.dispatcher) {\n (fetchOptions as any).dispatcher = config.dispatcher;\n }\n if (config.agent) {\n (fetchOptions as any).agent = config.agent;\n }\n\n const requestStartTime = Date.now();\n const response = await fetchAdapter(config, fullURL, fetchOptions, requestStartTime);\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n response.data = await transformData(\n responseTransforms,\n response.data,\n response.headers,\n config,\n 'response',\n );\n\n return response;\n };\n\n const promise = performRequest();\n\n if (isGet && config.dedupe) {\n trackActiveRequest(cacheKey, promise);\n const cleanup = () => {\n if (activeRequests.get(cacheKey) === promise) {\n activeRequests.delete(cacheKey);\n }\n };\n promise.then(cleanup, cleanup);\n }\n\n try {\n const shared = await promise;\n const response = finalizeResponse(shared, config);\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n await cacheProvider.set(cacheKey, shared, config.cacheTTL);\n }\n\n const settled = await new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(settled);\n }\n\n return settled;\n } catch (error) {\n if (config.hooks?.onRequestError && error instanceof AccessioError) {\n await config.hooks.onRequestError(error);\n }\n throw error;\n }\n}\n\nfunction finalizeResponse(\n shared: AccessioResponse,\n config: AccessioRequestConfig,\n): AccessioResponse {\n return {\n ...shared,\n config: redactConfig(config) as typeof shared.config,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAqB;AACrB,2BAA4C;AAC5C,wBAA+B;AAC/B,2BAA0B;AAC1B,oBAAmB;AACnB,4BAAqE;AACrE,kBAA6B;AAC7B,0BAAyB;AACzB,yBAAmC;AAMnC,SAAS,cACP,QACA,SACA,aACQ;AACR,MAAI,OAAO,OAAO,uBAAuB,YAAY;AACnD,WAAO,OAAO,mBAAmB,QAAQ,SAAS,WAAW;AAAA,EAC/D;AACA,QAAM,UAAU,OAAO,UAAU,OAAO,YAAY;AACpD,QAAM,YAAY,OAAO,kBAAkB,MAAM;AACjD,QAAM,WAAW,OAAO,gBAAgB;AAIxC,QAAM,oBAAoB,OAAO,KAAK,WAAW,EAC9C,KAAK,EACL;AAAA,IACC,CAAC,MACC,CAAC,CAAC,cAAc,cAAc,QAAQ,kBAAkB,iBAAiB,EAAE;AAAA,MACzE,EAAE,YAAY;AAAA,IAChB;AAAA,EACJ,EACC,IAAI,CAAC,MAAM;AACV,UAAM,MAAM,YAAY,CAAC;AACzB,WAAO,GAAG,EAAE,YAAY,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG;AAAA,EACvE,CAAC,EACA,KAAK,GAAG;AAEX,SAAO,GAAG,MAAM,IAAI,OAAO,MAAM,iBAAiB,MAAM,SAAS,MAAM,QAAQ;AACjF;AAEA,SAAS,oBACP,WACqB;AACrB,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI,MAAM,QAAQ,SAAS,EAAG,QAAO;AACrC,SAAO,CAAC,SAAS;AACnB;AAEA,MAAM,4BAA4B,CAAC,SAAS,QAAQ;AAEpD,SAAS,sBAAsB,SAAiB,QAAqC;AACnF,MAAI,OAAO,qBAAqB,KAAM;AACtC,QAAM,UAAU,OAAO,oBAAoB;AAE3C,MAAI,SAAwB;AAC5B,QAAM,QAAQ,yBAAyB,KAAK,OAAO;AACnD,MAAI,MAAO,UAAS,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC;AAC7C,MAAI,CAAC,OAAQ;AAEb,MAAI,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC7B,UAAM,IAAI,qBAAAA;AAAA,MACR,iBAAiB,MAAM,8BAA8B,QAAQ,KAAK,IAAI,CAAC;AAAA,MAEvE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,iBAAiB,oBAAI,IAAuC;AAClE,MAAM,sBAAsB;AAErB,SAAS,uBAA+B;AAC7C,SAAO,eAAe;AACxB;AAEA,SAAS,mBAAmB,KAAa,SAA0C;AACjF,iBAAe,IAAI,KAAK,OAAO;AAE/B,SAAO,eAAe,OAAO,qBAAqB;AAChD,UAAM,SAAS,eAAe,KAAK,EAAE,KAAK,EAAE;AAC5C,QAAI,WAAW,UAAa,WAAW,IAAK;AAC5C,mBAAe,OAAO,MAAM;AAAA,EAC9B;AACF;AAEA,eAAO,gBACL,QAC2B;AAC3B,QAAM,UACJ,OAAO,iBACP,gBAAAC;AAAA,IACE,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEF,wBAAsB,SAAS,MAAM;AAErC,MAAI,OAAO,OAAO,iBAAiB;AACjC,UAAM,OAAO,MAAM,gBAAgB,MAAM;AAAA,EAC3C;AAEA,QAAM,kBAAc,sCAAe,OAAO,SAAsC,OAAO,MAAM;AAC7F,gCAAa,QAAQ,WAAW;AAEhC,QAAM,SAAS,OAAO,UAAU,OAAO,YAAY,MAAM;AACzD,QAAM,WAAW,QAAQ,cAAc,QAAQ,SAAS,WAAW,IAAI;AAEvE,MAAI,SAAS,OAAO,OAAO;AACzB,UAAM,gBAAgB,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AACxE,UAAM,SAAS,MAAM,cAAc,IAAI,QAAQ;AAC/C,QAAI,QAAQ;AACV,YAAM,aAA+B;AAAA,QACnC,GAAG;AAAA,QACH,YAAQ,mCAAa,MAAM;AAAA,MAC7B;AACA,UAAI,OAAO,OAAO,mBAAmB;AACnC,cAAM,OAAO,MAAM,kBAAkB,UAAU;AAAA,MACjD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,OAAO,QAAQ;AAC1B,UAAM,WAAW,eAAe,IAAI,QAAQ;AAC5C,QAAI,UAAU;AACZ,UAAI;AACF,cAAM,SAAS,MAAM;AACrB,cAAM,WAAW,iBAAiB,QAAQ,MAAM;AAChD,cAAM,UAAU,MAAM,IAAI,QAA0B,CAAC,SAAS,WAAW;AACvE,4BAAAC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAED,YAAI,OAAO,OAAO,mBAAmB;AACnC,gBAAM,OAAO,MAAM,kBAAkB,OAAO;AAAA,QAC9C;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,aAAa;AACjB,YAAI,iBAAiB,qBAAAF,SAAe;AAClC,uBAAa,qBAAAA,QAAc;AAAA,YACzB;AAAA,YACA,MAAM,QAAQ;AAAA,YACd;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AACA,YAAI,OAAO,OAAO,kBAAkB,sBAAsB,qBAAAA,SAAe;AACvE,gBAAM,OAAO,MAAM,eAAe,UAAU;AAAA,QAC9C;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAuC;AAC5D,UAAM,oBAAoB,oBAAoB,OAAO,gBAAgB;AACrE,UAAM,cAAc,UAAM,qBAAAG,SAAc,mBAAmB,OAAO,MAAM,aAAa,MAAM;AAE3F,QACE,gBAAgB,QAChB,gBAAgB,UACf,OAAO,aAAa,eAAe,uBAAuB,UAC3D;AACA,mDAAkB,WAAW;AAAA,IAC/B;AAEA,UAAM,eAA4B;AAAA,MAChC,SAAS,OAAO,UAAU,OAAO,YAAY;AAAA,MAC7C,aAAS,yCAAkB,WAAW;AAAA,IACxC;AAEA,UAAM,kBAAkB,CAAC,QAAQ,OAAO,SAAS,QAAQ;AACzD,QACE,gBAAgB,SAAS,aAAa,MAAO,KAC7C,gBAAgB,UAChB,gBAAgB,MAChB;AACA,mBAAa,OAAO;AAAA,IACtB;AAEA,QAAI,OAAO,iBAAiB;AAC1B,mBAAa,cAAc;AAAA,IAC7B;AAEA,QAAI,OAAO,YAAY;AACrB,MAAC,aAAqB,aAAa,OAAO;AAAA,IAC5C;AACA,QAAI,OAAO,OAAO;AAChB,MAAC,aAAqB,QAAQ,OAAO;AAAA,IACvC;AAEA,UAAM,mBAAmB,KAAK,IAAI;AAClC,UAAM,WAAW,UAAM,oBAAAC,SAAa,QAAQ,SAAS,cAAc,gBAAgB;AAEnF,UAAM,qBAAqB,oBAAoB,OAAO,iBAAiB;AACvE,aAAS,OAAO,UAAM,qBAAAD;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe;AAE/B,MAAI,SAAS,OAAO,QAAQ;AAC1B,uBAAmB,UAAU,OAAO;AACpC,UAAM,UAAU,MAAM;AACpB,UAAI,eAAe,IAAI,QAAQ,MAAM,SAAS;AAC5C,uBAAe,OAAO,QAAQ;AAAA,MAChC;AAAA,IACF;AACA,YAAQ,KAAK,SAAS,OAAO;AAAA,EAC/B;AAEA,MAAI;AACF,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,iBAAiB,QAAQ,MAAM;AAEhD,QAAI,SAAS,OAAO,OAAO;AACzB,YAAM,gBAAgB,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AACxE,YAAM,cAAc,IAAI,UAAU,QAAQ,OAAO,QAAQ;AAAA,IAC3D;AAEA,UAAM,UAAU,MAAM,IAAI,QAA0B,CAAC,SAAS,WAAW;AACvE,wBAAAD;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,OAAO,OAAO,mBAAmB;AACnC,YAAM,OAAO,MAAM,kBAAkB,OAAO;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,OAAO,OAAO,kBAAkB,iBAAiB,qBAAAF,SAAe;AAClE,YAAM,OAAO,MAAM,eAAe,KAAK;AAAA,IACzC;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBACP,QACA,QACkB;AAClB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAQ,mCAAa,MAAM;AAAA,EAC7B;AACF;","names":["AccessioError","buildURL","settle","transformData","fetchAdapter"]}
1
+ {"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError, { redactConfig } from './accessioError';\nimport { ERR_BAD_OPTION } from '../constants/errorCodes';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport { flattenHeaders, removeContentType, buildFetchHeaders } from '../helpers/flattenHeaders';\nimport { setBasicAuth } from '../helpers/auth';\nimport fetchAdapter from './fetchAdapter';\nimport { defaultMemoryCache } from '../helpers/memoryCache';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\ntype HeadersConfig = Record<string, Record<string, string | string[]>>;\ntype FlatHeaders = Record<string, string | string[]>;\n\nfunction buildCacheKey(\n config: AccessioRequestConfig,\n fullURL: string,\n flatHeaders: FlatHeaders,\n): string {\n if (typeof config.cacheKeySerializer === 'function') {\n return config.cacheKeySerializer(config, fullURL, flatHeaders);\n }\n const method = (config.method || 'GET').toUpperCase();\n const withCreds = config.withCredentials ? '1' : '0';\n const respType = config.responseType || 'json';\n\n // Sort and serialize headers dynamically to prevent collisions,\n // excluding environment-specific transient headers.\n const serializedHeaders = Object.keys(flatHeaders)\n .sort()\n .filter(\n (k) =>\n !['user-agent', 'connection', 'host', 'content-length', 'accept-encoding'].includes(\n k.toLowerCase(),\n ),\n )\n .map((k) => {\n const val = flatHeaders[k];\n return `${k.toLowerCase()}=${Array.isArray(val) ? val.join(',') : val}`;\n })\n .join('&');\n\n return `${method}:${fullURL}|h:${serializedHeaders}|c=${withCreds}|t=${respType}`;\n}\n\nfunction buildTransformArray(\n transform: TransformFunction | TransformFunction[] | undefined,\n): TransformFunction[] {\n if (!transform) return [];\n if (Array.isArray(transform)) return transform;\n return [transform];\n}\n\nconst DEFAULT_ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nfunction assertAllowedProtocol(fullURL: string, config: AccessioRequestConfig): void {\n if (config.allowedProtocols === null) return;\n const allowed = config.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;\n\n let scheme: string | null = null;\n const match = /^([a-z][a-z\\d+\\-.]*):/i.exec(fullURL);\n if (match) scheme = `${match[1].toLowerCase()}:`;\n if (!scheme) return;\n\n if (!allowed.includes(scheme)) {\n throw new AccessioError(\n `URL protocol \"${scheme}\" is not allowed. Allowed: ${allowed.join(', ')}. ` +\n 'Set config.allowedProtocols to extend, or null to disable the check.',\n ERR_BAD_OPTION,\n config,\n null,\n null,\n );\n }\n}\n\nconst activeRequests = new Map<string, Promise<AccessioResponse>>();\nconst MAX_ACTIVE_REQUESTS = 1024;\n\nexport function __activeRequestsSize(): number {\n return activeRequests.size;\n}\n\nfunction trackActiveRequest(key: string, promise: Promise<AccessioResponse>): void {\n activeRequests.set(key, promise);\n // Evict the oldest entry if we've grown past the cap. Map preserves insertion order.\n while (activeRequests.size > MAX_ACTIVE_REQUESTS) {\n const oldest = activeRequests.keys().next().value;\n if (oldest === undefined || oldest === key) break;\n activeRequests.delete(oldest);\n }\n}\n\nexport default async function dispatchRequest(\n config: AccessioRequestConfig,\n): Promise<AccessioResponse> {\n const fullURL =\n config._builtUrl ||\n buildURL(\n config.url ?? '',\n config.baseURL,\n config.params as Record<string, unknown> | undefined,\n config.paramsSerializer,\n );\n\n assertAllowedProtocol(fullURL, config);\n\n if (config.hooks?.onBeforeRequest) {\n await config.hooks.onBeforeRequest(config);\n }\n\n const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n setBasicAuth(config, flatHeaders);\n\n const isGet = (config.method || 'GET').toUpperCase() === 'GET';\n const cacheKey = isGet && (config.cache || config.dedupe) ? buildCacheKey(config, fullURL, flatHeaders) : '';\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n const cached = await cacheProvider.get(cacheKey);\n if (cached) {\n const cachedView: AccessioResponse = {\n ...cached,\n config: redactConfig(config) as typeof cached.config,\n };\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(cachedView);\n }\n return cachedView;\n }\n }\n\n if (isGet && config.dedupe) {\n const inflight = activeRequests.get(cacheKey);\n if (inflight) {\n try {\n const shared = await inflight;\n const response = finalizeResponse(shared, config);\n const settled = await new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(settled);\n }\n\n return settled;\n } catch (error) {\n let finalError = error;\n if (error instanceof AccessioError) {\n finalError = AccessioError.from(\n error,\n error.code || 'ERR_DEDUPE',\n config,\n error.request,\n error.response,\n );\n }\n if (config.hooks?.onRequestError && finalError instanceof AccessioError) {\n await config.hooks.onRequestError(finalError);\n }\n throw finalError;\n }\n }\n }\n\n const performRequest = async (): Promise<AccessioResponse> => {\n const requestTransforms = buildTransformArray(config.transformRequest);\n const requestData = await transformData(requestTransforms, config.data, flatHeaders, config);\n\n if (\n requestData === null ||\n requestData === undefined ||\n (typeof FormData !== 'undefined' && requestData instanceof FormData)\n ) {\n removeContentType(flatHeaders);\n }\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: buildFetchHeaders(flatHeaders),\n };\n\n const methodsWithBody = ['POST', 'PUT', 'PATCH', 'DELETE'];\n if (\n methodsWithBody.includes(fetchOptions.method!) &&\n requestData !== undefined &&\n requestData !== null\n ) {\n fetchOptions.body = requestData as BodyInit;\n }\n\n if (config.withCredentials) {\n fetchOptions.credentials = 'include';\n }\n\n if (config.dispatcher) {\n (fetchOptions as any).dispatcher = config.dispatcher;\n }\n if (config.agent) {\n (fetchOptions as any).agent = config.agent;\n }\n\n const requestStartTime = Date.now();\n const response = await fetchAdapter(config, fullURL, fetchOptions, requestStartTime);\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n response.data = await transformData(\n responseTransforms,\n response.data,\n response.headers,\n config,\n 'response',\n );\n\n return response;\n };\n\n const promise = performRequest();\n\n if (isGet && config.dedupe) {\n trackActiveRequest(cacheKey, promise);\n const cleanup = () => {\n if (activeRequests.get(cacheKey) === promise) {\n activeRequests.delete(cacheKey);\n }\n };\n promise.then(cleanup, cleanup);\n }\n\n try {\n const shared = await promise;\n const response = finalizeResponse(shared, config);\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n await cacheProvider.set(cacheKey, shared, config.cacheTTL);\n }\n\n const settled = await new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(settled);\n }\n\n return settled;\n } catch (error) {\n if (config.hooks?.onRequestError && error instanceof AccessioError) {\n await config.hooks.onRequestError(error);\n }\n throw error;\n }\n}\n\nfunction finalizeResponse(\n shared: AccessioResponse,\n config: AccessioRequestConfig,\n): AccessioResponse {\n return {\n ...shared,\n config: redactConfig(config) as typeof shared.config,\n };\n}\n"],"mappings":"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","names":["AccessioError","buildURL","settle","transformData","fetchAdapter"]}
@@ -49,7 +49,10 @@ function defaultTransformRequest(data, headers) {
49
49
  }
50
50
  return data;
51
51
  }
52
- function defaultTransformResponse(data) {
52
+ function defaultTransformResponse(data, headers, config) {
53
+ if (config && config.responseType === "text") {
54
+ return data;
55
+ }
53
56
  if (typeof data === "string") {
54
57
  try {
55
58
  return JSON.parse(data);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(\n data: unknown,\n headers: Record<string, string | string[]>,\n): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (\n typeof data === 'string' ||\n data instanceof ArrayBuffer ||\n (typeof Blob !== 'undefined' && data instanceof Blob) ||\n (typeof FormData !== 'undefined' && data instanceof FormData) ||\n (typeof URLSearchParams !== 'undefined' && data instanceof URLSearchParams) ||\n (typeof ReadableStream !== 'undefined' && data instanceof ReadableStream)\n ) {\n return data;\n }\n\n if (typeof data === 'object') {\n if (headers && typeof headers === 'object') {\n const hasContentType = Object.keys(headers).some(\n (key) => key.toLowerCase() === 'content-type',\n );\n if (!hasContentType) {\n headers['Content-Type'] = 'application/json';\n }\n }\n try {\n return JSON.stringify(data);\n } catch (e: any) {\n if (e instanceof TypeError && e.message.toLowerCase().includes('circular')) {\n throw new Error('Accessio: Cannot stringify circular structure in request data');\n }\n throw e;\n }\n }\n\n return data;\n}\n\nexport function defaultTransformResponse(data: unknown): unknown {\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch {\n // Not JSON — return as-is\n }\n }\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,wBACd,MACA,SACS;AACT,MAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,WAAO;AAAA,EACT;AAEA,MACE,OAAO,SAAS,YAChB,gBAAgB,eACf,OAAO,SAAS,eAAe,gBAAgB,QAC/C,OAAO,aAAa,eAAe,gBAAgB,YACnD,OAAO,oBAAoB,eAAe,gBAAgB,mBAC1D,OAAO,mBAAmB,eAAe,gBAAgB,gBAC1D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,YAAM,iBAAiB,OAAO,KAAK,OAAO,EAAE;AAAA,QAC1C,CAAC,QAAQ,IAAI,YAAY,MAAM;AAAA,MACjC;AACA,UAAI,CAAC,gBAAgB;AACnB,gBAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,QAAI;AACF,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B,SAAS,GAAQ;AACf,UAAI,aAAa,aAAa,EAAE,QAAQ,YAAY,EAAE,SAAS,UAAU,GAAG;AAC1E,cAAM,IAAI,MAAM,+DAA+D;AAAA,MACjF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAAwB;AAC/D,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(\n data: unknown,\n headers: Record<string, string | string[]>,\n): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (\n typeof data === 'string' ||\n data instanceof ArrayBuffer ||\n (typeof Blob !== 'undefined' && data instanceof Blob) ||\n (typeof FormData !== 'undefined' && data instanceof FormData) ||\n (typeof URLSearchParams !== 'undefined' && data instanceof URLSearchParams) ||\n (typeof ReadableStream !== 'undefined' && data instanceof ReadableStream)\n ) {\n return data;\n }\n\n if (typeof data === 'object') {\n if (headers && typeof headers === 'object') {\n const hasContentType = Object.keys(headers).some(\n (key) => key.toLowerCase() === 'content-type',\n );\n if (!hasContentType) {\n headers['Content-Type'] = 'application/json';\n }\n }\n try {\n return JSON.stringify(data);\n } catch (e: any) {\n if (e instanceof TypeError && e.message.toLowerCase().includes('circular')) {\n throw new Error('Accessio: Cannot stringify circular structure in request data');\n }\n throw e;\n }\n }\n\n return data;\n}\n\nexport function defaultTransformResponse(data: unknown, headers?: any, config?: any): unknown {\n if (config && config.responseType === 'text') {\n return data;\n }\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch {\n // Not JSON — return as-is\n }\n }\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,wBACd,MACA,SACS;AACT,MAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,WAAO;AAAA,EACT;AAEA,MACE,OAAO,SAAS,YAChB,gBAAgB,eACf,OAAO,SAAS,eAAe,gBAAgB,QAC/C,OAAO,aAAa,eAAe,gBAAgB,YACnD,OAAO,oBAAoB,eAAe,gBAAgB,mBAC1D,OAAO,mBAAmB,eAAe,gBAAgB,gBAC1D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,YAAM,iBAAiB,OAAO,KAAK,OAAO,EAAE;AAAA,QAC1C,CAAC,QAAQ,IAAI,YAAY,MAAM;AAAA,MACjC;AACA,UAAI,CAAC,gBAAgB;AACnB,gBAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,QAAI;AACF,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B,SAAS,GAAQ;AACf,UAAI,aAAa,aAAa,EAAE,QAAQ,YAAY,EAAE,SAAS,UAAU,GAAG;AAC1E,cAAM,IAAI,MAAM,+DAA+D;AAAA,MACjF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAAe,SAAe,QAAuB;AAC5F,MAAI,UAAU,OAAO,iBAAiB,QAAQ;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;","names":[]}