accessio 1.0.0 → 1.1.0
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/README.md +121 -391
- package/cjs/accessio.cjs +23 -52
- package/cjs/accessio.cjs.map +1 -1
- package/cjs/core/accessioError.cjs +1 -7
- package/cjs/core/accessioError.cjs.map +1 -1
- package/cjs/core/buildURL.cjs +1 -5
- package/cjs/core/buildURL.cjs.map +1 -1
- package/cjs/core/mergeConfig.cjs +2 -4
- package/cjs/core/mergeConfig.cjs.map +1 -1
- package/cjs/core/request.cjs +44 -66
- package/cjs/core/request.cjs.map +1 -1
- package/cjs/core/retry.cjs +2 -8
- package/cjs/core/retry.cjs.map +1 -1
- package/cjs/defaults/index.cjs.map +1 -1
- package/cjs/defaults/transforms.cjs.map +1 -1
- package/cjs/helpers/debug.cjs +1 -3
- package/cjs/helpers/debug.cjs.map +1 -1
- package/cjs/helpers/parseHeaders.cjs.map +1 -1
- package/cjs/helpers/rateLimiter.cjs +22 -14
- package/cjs/helpers/rateLimiter.cjs.map +1 -1
- package/cjs/helpers/transformData.cjs.map +1 -1
- package/cjs/index.cjs.map +1 -1
- package/cjs/interceptors/interceptorManager.cjs +40 -3
- package/cjs/interceptors/interceptorManager.cjs.map +1 -1
- package/package.json +6 -14
- package/src/accessio.ts +28 -72
- package/src/core/accessioError.ts +1 -7
- package/src/core/buildURL.ts +4 -13
- package/src/core/mergeConfig.ts +6 -16
- package/src/core/request.ts +44 -74
- package/src/core/retry.ts +4 -15
- package/src/defaults/index.ts +1 -3
- package/src/defaults/transforms.ts +1 -4
- package/src/helpers/debug.ts +12 -22
- package/src/helpers/parseHeaders.ts +1 -3
- package/src/helpers/rateLimiter.ts +28 -23
- package/src/helpers/transformData.ts +1 -4
- package/src/index.ts +3 -11
- package/src/interceptors/interceptorManager.ts +50 -2
- package/src/types.ts +7 -68
package/cjs/accessio.cjs
CHANGED
|
@@ -40,11 +40,12 @@ var import_buildURL = __toESM(require("./core/buildURL"), 1);
|
|
|
40
40
|
var import_retry = __toESM(require("./core/retry"), 1);
|
|
41
41
|
var import_debug = require("./helpers/debug");
|
|
42
42
|
var import_rateLimiter = require("./helpers/rateLimiter");
|
|
43
|
+
var import_defaults = __toESM(require("./defaults/index"), 1);
|
|
43
44
|
class Accessio {
|
|
44
45
|
defaults;
|
|
45
46
|
interceptors;
|
|
46
47
|
constructor(instanceConfig = {}) {
|
|
47
|
-
this.defaults = instanceConfig;
|
|
48
|
+
this.defaults = (0, import_mergeConfig.default)(import_defaults.default, instanceConfig);
|
|
48
49
|
this.interceptors = {
|
|
49
50
|
request: new import_interceptorManager.default(),
|
|
50
51
|
response: new import_interceptorManager.default()
|
|
@@ -80,23 +81,15 @@ class Accessio {
|
|
|
80
81
|
});
|
|
81
82
|
let promise = Promise.resolve(mergedConfig);
|
|
82
83
|
for (const interceptor of requestInterceptors) {
|
|
83
|
-
promise = promise.then(
|
|
84
|
-
(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
},
|
|
90
|
-
interceptor.rejected
|
|
91
|
-
);
|
|
84
|
+
promise = promise.then((value) => {
|
|
85
|
+
if (interceptor.fulfilled) {
|
|
86
|
+
return interceptor.fulfilled(value);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}, interceptor.rejected);
|
|
92
90
|
}
|
|
93
91
|
promise = promise.then((cfg) => {
|
|
94
|
-
const fullUrl = (0, import_buildURL.default)(
|
|
95
|
-
cfg.url ?? "",
|
|
96
|
-
cfg.baseURL,
|
|
97
|
-
cfg.params,
|
|
98
|
-
cfg.paramsSerializer
|
|
99
|
-
);
|
|
92
|
+
const fullUrl = (0, import_buildURL.default)(cfg.url ?? "", cfg.baseURL, cfg.params, cfg.paramsSerializer);
|
|
100
93
|
(0, import_debug.logRequest)(cfg, fullUrl);
|
|
101
94
|
const enrichedCfg = fullUrl !== (cfg.url || "") ? { ...cfg, _builtUrl: fullUrl } : cfg;
|
|
102
95
|
const dispatchFn = cfg.rateLimiter ? (config2) => (0, import_rateLimiter.rateLimitedRequest)(import_request.default, config2.rateLimiter, config2) : import_request.default;
|
|
@@ -113,61 +106,39 @@ class Accessio {
|
|
|
113
106
|
}
|
|
114
107
|
);
|
|
115
108
|
for (const interceptor of responseInterceptors) {
|
|
116
|
-
promise = promise.then(
|
|
117
|
-
(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
},
|
|
123
|
-
interceptor.rejected
|
|
124
|
-
);
|
|
109
|
+
promise = promise.then((value) => {
|
|
110
|
+
if (interceptor.fulfilled) {
|
|
111
|
+
return interceptor.fulfilled(value);
|
|
112
|
+
}
|
|
113
|
+
return value;
|
|
114
|
+
}, interceptor.rejected);
|
|
125
115
|
}
|
|
126
116
|
return promise;
|
|
127
117
|
}
|
|
128
118
|
getUri(config) {
|
|
129
119
|
const merged = (0, import_mergeConfig.default)(this.defaults, config);
|
|
130
|
-
return (0, import_buildURL.default)(
|
|
131
|
-
merged.url ?? "",
|
|
132
|
-
merged.baseURL,
|
|
133
|
-
merged.params,
|
|
134
|
-
merged.paramsSerializer
|
|
135
|
-
);
|
|
120
|
+
return (0, import_buildURL.default)(merged.url ?? "", merged.baseURL, merged.params, merged.paramsSerializer);
|
|
136
121
|
}
|
|
137
122
|
get(url, config) {
|
|
138
|
-
return this.request(
|
|
139
|
-
(0, import_mergeConfig.default)(config || {}, { method: "get", url })
|
|
140
|
-
);
|
|
123
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "get", url }));
|
|
141
124
|
}
|
|
142
125
|
delete(url, config) {
|
|
143
|
-
return this.request(
|
|
144
|
-
(0, import_mergeConfig.default)(config || {}, { method: "delete", url })
|
|
145
|
-
);
|
|
126
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "delete", url }));
|
|
146
127
|
}
|
|
147
128
|
head(url, config) {
|
|
148
|
-
return this.request(
|
|
149
|
-
(0, import_mergeConfig.default)(config || {}, { method: "head", url })
|
|
150
|
-
);
|
|
129
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "head", url }));
|
|
151
130
|
}
|
|
152
131
|
options(url, config) {
|
|
153
|
-
return this.request(
|
|
154
|
-
(0, import_mergeConfig.default)(config || {}, { method: "options", url })
|
|
155
|
-
);
|
|
132
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "options", url }));
|
|
156
133
|
}
|
|
157
134
|
post(url, data, config) {
|
|
158
|
-
return this.request(
|
|
159
|
-
(0, import_mergeConfig.default)(config || {}, { method: "post", url, data })
|
|
160
|
-
);
|
|
135
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "post", url, data }));
|
|
161
136
|
}
|
|
162
137
|
put(url, data, config) {
|
|
163
|
-
return this.request(
|
|
164
|
-
(0, import_mergeConfig.default)(config || {}, { method: "put", url, data })
|
|
165
|
-
);
|
|
138
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "put", url, data }));
|
|
166
139
|
}
|
|
167
140
|
patch(url, data, config) {
|
|
168
|
-
return this.request(
|
|
169
|
-
(0, import_mergeConfig.default)(config || {}, { method: "patch", url, data })
|
|
170
|
-
);
|
|
141
|
+
return this.request((0, import_mergeConfig.default)(config || {}, { method: "patch", url, data }));
|
|
171
142
|
}
|
|
172
143
|
postForm(url, data, config) {
|
|
173
144
|
return this.request(
|
package/cjs/accessio.cjs.map
CHANGED
|
@@ -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 type {\n AccessioRequestConfig,\n AccessioResponse,\n Interceptors,\n InterceptorHandler,\n} from './types';\n\nexport class Accessio {\n defaults: AccessioRequestConfig;\n interceptors: Interceptors;\n\n constructor(instanceConfig: AccessioRequestConfig = {}) {\n this.defaults = 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: any[] = [];\n const responseInterceptors: any[] = [];\n\n this.interceptors.request.forEach((interceptor: InterceptorHandler) => {\n if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) {\n return;\n }\n requestInterceptors.unshift(interceptor);\n });\n\n this.interceptors.response.forEach((interceptor: InterceptorHandler) => {\n responseInterceptors.push(interceptor);\n });\n\n let promise: Promise<any> = Promise.resolve(mergedConfig);\n\n for (const interceptor of requestInterceptors) {\n promise = promise.then(\n (value: any) => {\n if (interceptor.fulfilled) {\n return interceptor.fulfilled(value);\n }\n return value;\n },\n interceptor.rejected,\n );\n }\n\n promise = promise.then((cfg: any) => {\n const fullUrl = buildURL(\n cfg.url ?? '',\n cfg.baseURL,\n cfg.params,\n cfg.paramsSerializer,\n );\n\n logRequest(cfg, fullUrl);\n\n const enrichedCfg =\n fullUrl !== (cfg.url || '')\n ? { ...cfg, _builtUrl: fullUrl }\n : 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\n promise = promise.then(\n (value: any) => {\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(\n (value: any) => {\n if (interceptor.fulfilled) {\n return interceptor.fulfilled(value);\n }\n return value;\n },\n interceptor.rejected,\n );\n }\n\n return promise;\n }\n\n getUri(config?: AccessioRequestConfig): string {\n const merged = mergeConfig(this.defaults, config);\n return buildURL(\n merged.url ?? '',\n merged.baseURL,\n merged.params,\n merged.paramsSerializer,\n );\n }\n\n get<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'get', url }),\n );\n }\n\n delete<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'delete', url }),\n );\n }\n\n head<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'head', url }),\n );\n }\n\n options<T = any>(\n url: string,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'options', url }),\n );\n }\n\n post<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'post', url, data }),\n );\n }\n\n put<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'put', url, data }),\n );\n }\n\n patch<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, { method: 'patch', url, data }),\n );\n }\n\n postForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'post',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n putForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'put',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n patchForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'patch',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n}\n\nexport default Accessio;\n"],"mappings":"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","names":["InterceptorManager","mergeConfig","AccessioError","buildURL","config","dispatchRequest","retryRequest"]}
|
|
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 type {\n AccessioRequestConfig,\n AccessioResponse,\n Interceptors,\n InterceptorHandler,\n} from './types';\nimport defaultsConfig from './defaults/index';\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: any[] = [];\n const responseInterceptors: any[] = [];\n\n this.interceptors.request.forEach((interceptor: InterceptorHandler) => {\n if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) {\n return;\n }\n requestInterceptors.unshift(interceptor);\n });\n\n this.interceptors.response.forEach((interceptor: InterceptorHandler) => {\n responseInterceptors.push(interceptor);\n });\n\n let promise: Promise<any> = Promise.resolve(mergedConfig);\n\n for (const interceptor of requestInterceptors) {\n promise = promise.then((value: any) => {\n if (interceptor.fulfilled) {\n return interceptor.fulfilled(value);\n }\n return value;\n }, interceptor.rejected);\n }\n\n promise = promise.then((cfg: any) => {\n const fullUrl = buildURL(cfg.url ?? '', cfg.baseURL, cfg.params, cfg.paramsSerializer);\n\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\n promise = promise.then(\n (value: any) => {\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(value);\n }\n return value;\n }, interceptor.rejected);\n }\n\n return promise;\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 postForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'post',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n putForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'put',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n\n patchForm<T = any>(\n url: string,\n data?: any,\n config?: AccessioRequestConfig,\n ): Promise<AccessioResponse<T>> {\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'patch',\n url,\n data,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\n }\n}\n\nexport default Accessio;\n"],"mappings":"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","names":["mergeConfig","defaultsConfig","InterceptorManager","AccessioError","buildURL","config","dispatchRequest","retryRequest"]}
|
|
@@ -73,13 +73,7 @@ class AccessioError extends Error {
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
static from(error, code, config, request, response) {
|
|
76
|
-
const accessioError = new AccessioError(
|
|
77
|
-
error.message,
|
|
78
|
-
code,
|
|
79
|
-
config,
|
|
80
|
-
request,
|
|
81
|
-
response
|
|
82
|
-
);
|
|
76
|
+
const accessioError = new AccessioError(error.message, code, config, request, response);
|
|
83
77
|
accessioError.cause = error;
|
|
84
78
|
accessioError.stack = error.stack;
|
|
85
79
|
return accessioError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/accessioError.ts"],"sourcesContent":["import ErrorCodes from '../constants/errorCodes';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nexport class AccessioError extends Error {\n static ERR_BAD_OPTION_VALUE: string = ErrorCodes.ERR_BAD_OPTION_VALUE;\n static ERR_BAD_OPTION: string = ErrorCodes.ERR_BAD_OPTION;\n static ECONNABORTED: string = ErrorCodes.ECONNABORTED;\n static ETIMEDOUT: string = ErrorCodes.ETIMEDOUT;\n static ERR_NETWORK: string = ErrorCodes.ERR_NETWORK;\n static ERR_FR_TOO_MANY_REDIRECTS: string = ErrorCodes.ERR_FR_TOO_MANY_REDIRECTS;\n static ERR_BAD_RESPONSE: string = ErrorCodes.ERR_BAD_RESPONSE;\n static ERR_BAD_REQUEST: string = ErrorCodes.ERR_BAD_REQUEST;\n static ERR_CANCELED: string = ErrorCodes.ERR_CANCELED;\n static ERR_NOT_SUPPORT: string = ErrorCodes.ERR_NOT_SUPPORT;\n static ERR_INVALID_URL: string = ErrorCodes.ERR_INVALID_URL;\n\n readonly code: string | null;\n readonly config: AccessioRequestConfig | null;\n readonly request: unknown;\n readonly response: AccessioResponse | null;\n readonly isAccessioError: true;\n cause?: Error;\n\n constructor(\n message: string,\n code: string | null,\n config: AccessioRequestConfig | null,\n request: unknown,\n response: AccessioResponse | null,\n ) {\n super(message);\n this.name = 'AccessioError';\n this.code = code ?? null;\n this.config = config ?? null;\n this.request = request ?? null;\n this.response = response ?? null;\n this.isAccessioError = true;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AccessioError);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n status: this.response ? this.response.status : null,\n config: this.config,\n };\n }\n\n static from(\n error: Error,\n code: string,\n config: AccessioRequestConfig | null,\n request: unknown,\n response: AccessioResponse | null,\n ): AccessioError {\n const accessioError = new AccessioError(
|
|
1
|
+
{"version":3,"sources":["../../src/core/accessioError.ts"],"sourcesContent":["import ErrorCodes from '../constants/errorCodes';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nexport class AccessioError extends Error {\n static ERR_BAD_OPTION_VALUE: string = ErrorCodes.ERR_BAD_OPTION_VALUE;\n static ERR_BAD_OPTION: string = ErrorCodes.ERR_BAD_OPTION;\n static ECONNABORTED: string = ErrorCodes.ECONNABORTED;\n static ETIMEDOUT: string = ErrorCodes.ETIMEDOUT;\n static ERR_NETWORK: string = ErrorCodes.ERR_NETWORK;\n static ERR_FR_TOO_MANY_REDIRECTS: string = ErrorCodes.ERR_FR_TOO_MANY_REDIRECTS;\n static ERR_BAD_RESPONSE: string = ErrorCodes.ERR_BAD_RESPONSE;\n static ERR_BAD_REQUEST: string = ErrorCodes.ERR_BAD_REQUEST;\n static ERR_CANCELED: string = ErrorCodes.ERR_CANCELED;\n static ERR_NOT_SUPPORT: string = ErrorCodes.ERR_NOT_SUPPORT;\n static ERR_INVALID_URL: string = ErrorCodes.ERR_INVALID_URL;\n\n readonly code: string | null;\n readonly config: AccessioRequestConfig | null;\n readonly request: unknown;\n readonly response: AccessioResponse | null;\n readonly isAccessioError: true;\n cause?: Error;\n\n constructor(\n message: string,\n code: string | null,\n config: AccessioRequestConfig | null,\n request: unknown,\n response: AccessioResponse | null,\n ) {\n super(message);\n this.name = 'AccessioError';\n this.code = code ?? null;\n this.config = config ?? null;\n this.request = request ?? null;\n this.response = response ?? null;\n this.isAccessioError = true;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AccessioError);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n status: this.response ? this.response.status : null,\n config: this.config,\n };\n }\n\n static from(\n error: Error,\n code: string,\n config: AccessioRequestConfig | null,\n request: unknown,\n response: AccessioResponse | null,\n ): AccessioError {\n const accessioError = new AccessioError(error.message, code, config, request, response);\n accessioError.cause = error;\n accessioError.stack = error.stack;\n return accessioError;\n }\n}\n\nexport default AccessioError;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuB;AAGhB,MAAM,sBAAsB,MAAM;AAAA,EACvC,OAAO,uBAA+B,kBAAAA,QAAW;AAAA,EACjD,OAAO,iBAAyB,kBAAAA,QAAW;AAAA,EAC3C,OAAO,eAAuB,kBAAAA,QAAW;AAAA,EACzC,OAAO,YAAoB,kBAAAA,QAAW;AAAA,EACtC,OAAO,cAAsB,kBAAAA,QAAW;AAAA,EACxC,OAAO,4BAAoC,kBAAAA,QAAW;AAAA,EACtD,OAAO,mBAA2B,kBAAAA,QAAW;AAAA,EAC7C,OAAO,kBAA0B,kBAAAA,QAAW;AAAA,EAC5C,OAAO,eAAuB,kBAAAA,QAAW;AAAA,EACzC,OAAO,kBAA0B,kBAAAA,QAAW;AAAA,EAC5C,OAAO,kBAA0B,kBAAAA,QAAW;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YACE,SACA,MACA,QACA,SACA,UACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,SAAS,UAAU;AACxB,SAAK,UAAU,WAAW;AAC1B,SAAK,WAAW,YAAY;AAC5B,SAAK,kBAAkB;AAEvB,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,aAAa;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,SAAkC;AAChC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK,WAAW,KAAK,SAAS,SAAS;AAAA,MAC/C,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,KACL,OACA,MACA,QACA,SACA,UACe;AACf,UAAM,gBAAgB,IAAI,cAAc,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ;AACtF,kBAAc,QAAQ;AACtB,kBAAc,QAAQ,MAAM;AAC5B,WAAO;AAAA,EACT;AACF;AAEA,IAAO,wBAAQ;","names":["ErrorCodes"]}
|
package/cjs/core/buildURL.cjs
CHANGED
|
@@ -51,11 +51,7 @@ function serializeParams(params, paramsSerializer) {
|
|
|
51
51
|
});
|
|
52
52
|
} else {
|
|
53
53
|
const encodedValue = value instanceof Date ? value.toISOString() : value;
|
|
54
|
-
parts.push(
|
|
55
|
-
`${encodeURIComponent(prefix)}=${encodeURIComponent(
|
|
56
|
-
encodedValue
|
|
57
|
-
)}`
|
|
58
|
-
);
|
|
54
|
+
parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(encodedValue)}`);
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
57
|
Object.keys(params).forEach((key) => {
|
|
@@ -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 (
|
|
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 const serialized = serializeParams(params as Record<string, unknown>, paramsSerializer);\n if (serialized) {\n const hashIndex = fullURL.indexOf('#');\n if (hashIndex !== -1) {\n fullURL = fullURL.slice(0, hashIndex);\n }\n fullURL += (fullURL.indexOf('?') === -1 ? '?' : '&') + serialized;\n }\n\n return fullURL;\n}\n\nexport { serializeParams, combineURLs, isAbsoluteURL };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,gBACP,QACA,kBACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,qBAAqB,YAAY;AAC1C,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,MAAI,OAAO,oBAAoB,eAAe,kBAAkB,iBAAiB;AAC/E,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,QAAM,QAAkB,CAAC;AAEzB,WAAS,OAAO,QAAgB,OAAsB;AACpD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,iBAAO,GAAG,MAAM,IAAI,KAAK,KAAK,IAAI;AAAA,QACpC,OAAO;AACL,iBAAO,GAAG,MAAM,MAAM,IAAI;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH,WAAW,OAAO,UAAU,YAAY,EAAE,iBAAiB,OAAO;AAChE,aAAO,KAAK,KAAgC,EAAE,QAAQ,CAAC,QAAQ;AAC7D,eAAO,GAAG,MAAM,IAAI,GAAG,KAAM,MAAkC,GAAG,CAAC;AAAA,MACrE,CAAC;AAAA,IACH,OAAO;AACL,YAAM,eAAe,iBAAiB,OAAO,MAAM,YAAY,IAAI;AACnE,YAAM,KAAK,GAAG,mBAAmB,MAAM,CAAC,IAAI,mBAAmB,YAAsB,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB,CAAC;AAED,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,YAAY,SAAiB,aAA6B;AACjE,MAAI,CAAC,QAAS,QAAO,eAAe;AACpC,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI,OAAO;AACX,SAAO,KAAK,SAAS,GAAG,GAAG;AACzB,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AAEA,MAAI,WAAW;AACf,SAAO,SAAS,WAAW,GAAG,GAAG;AAC/B,eAAW,SAAS,MAAM,CAAC;AAAA,EAC7B;AAEA,SAAO,GAAG,IAAI,IAAI,QAAQ;AAC5B;AAEA,SAAS,cAAc,KAAsB;AAC3C,SAAO,8BAA8B,KAAK,GAAG;AAC/C;AAEe,SAAR,SACL,KACA,SACA,QACA,kBACQ;AACR,MAAI,UAAU,WAAW,CAAC,cAAc,GAAG,IAAI,YAAY,SAAS,GAAG,IAAI,OAAO;AAElF,QAAM,aAAa,gBAAgB,QAAmC,gBAAgB;AACtF,MAAI,YAAY;AACd,UAAM,YAAY,QAAQ,QAAQ,GAAG;AACrC,QAAI,cAAc,IAAI;AACpB,gBAAU,QAAQ,MAAM,GAAG,SAAS;AAAA,IACtC;AACA,gBAAY,QAAQ,QAAQ,GAAG,MAAM,KAAK,MAAM,OAAO;AAAA,EACzD;AAEA,SAAO;AACT;","names":[]}
|
package/cjs/core/mergeConfig.cjs
CHANGED
|
@@ -27,6 +27,7 @@ function deepMerge(...sources) {
|
|
|
27
27
|
for (const source of sources) {
|
|
28
28
|
if (!source || typeof source !== "object") continue;
|
|
29
29
|
for (const key of Object.keys(source)) {
|
|
30
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
|
|
30
31
|
const value = source[key];
|
|
31
32
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
32
33
|
if (value instanceof Date || value instanceof RegExp || value instanceof Map || value instanceof Set || value instanceof Error || typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer || typeof Blob !== "undefined" && value instanceof Blob) {
|
|
@@ -47,10 +48,7 @@ const requestOnlyKeys = /* @__PURE__ */ new Set(["url", "data", "signal"]);
|
|
|
47
48
|
const deepMergeKeys = /* @__PURE__ */ new Set(["headers"]);
|
|
48
49
|
function mergeConfig(config1 = {}, config2 = {}) {
|
|
49
50
|
const merged = {};
|
|
50
|
-
const allKeys = /* @__PURE__ */ new Set([
|
|
51
|
-
...Object.keys(config1),
|
|
52
|
-
...Object.keys(config2)
|
|
53
|
-
]);
|
|
51
|
+
const allKeys = /* @__PURE__ */ new Set([...Object.keys(config1), ...Object.keys(config2)]);
|
|
54
52
|
for (const key of allKeys) {
|
|
55
53
|
const val1 = config1[key];
|
|
56
54
|
const val2 = config2[key];
|
|
@@ -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> = {};\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const key of Object.keys(source)) {\n const value = source[key];\n\n if (
|
|
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> = {};\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']);\n\nexport default function mergeConfig(\n config1: AccessioRequestConfig = {},\n config2: AccessioRequestConfig = {},\n): AccessioRequestConfig {\n const merged: any = {};\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,CAAC;AAErC,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,SAAS,CAAC;AAElC,SAAR,YACL,UAAiC,CAAC,GAClC,UAAiC,CAAC,GACX;AACvB,QAAM,SAAc,CAAC;AAErB,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":[]}
|
package/cjs/core/request.cjs
CHANGED
|
@@ -64,9 +64,7 @@ function flattenHeaders(headers, method) {
|
|
|
64
64
|
return merged;
|
|
65
65
|
}
|
|
66
66
|
function removeContentType(headers) {
|
|
67
|
-
const key = Object.keys(headers).find(
|
|
68
|
-
(k) => k.toLowerCase() === "content-type"
|
|
69
|
-
);
|
|
67
|
+
const key = Object.keys(headers).find((k) => k.toLowerCase() === "content-type");
|
|
70
68
|
if (key) {
|
|
71
69
|
delete headers[key];
|
|
72
70
|
}
|
|
@@ -76,6 +74,36 @@ function buildTransformArray(transform) {
|
|
|
76
74
|
if (Array.isArray(transform)) return transform;
|
|
77
75
|
return [transform];
|
|
78
76
|
}
|
|
77
|
+
function setBasicAuth(config, headers) {
|
|
78
|
+
if (!config.auth) return;
|
|
79
|
+
const username = config.auth.username || "";
|
|
80
|
+
const password = config.auth.password || "";
|
|
81
|
+
const credentials = `${username}:${password}`;
|
|
82
|
+
let encoded;
|
|
83
|
+
if (typeof Buffer !== "undefined") {
|
|
84
|
+
encoded = Buffer.from(credentials).toString("base64");
|
|
85
|
+
} else {
|
|
86
|
+
const bytes = new TextEncoder().encode(credentials);
|
|
87
|
+
const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("");
|
|
88
|
+
encoded = btoa(binString);
|
|
89
|
+
}
|
|
90
|
+
headers["Authorization"] = `Basic ${encoded}`;
|
|
91
|
+
}
|
|
92
|
+
async function readResponseData(fetchResponse, responseType) {
|
|
93
|
+
switch (responseType) {
|
|
94
|
+
case "arraybuffer":
|
|
95
|
+
return await fetchResponse.arrayBuffer();
|
|
96
|
+
case "blob":
|
|
97
|
+
return await fetchResponse.blob();
|
|
98
|
+
case "text":
|
|
99
|
+
return await fetchResponse.text();
|
|
100
|
+
case "stream":
|
|
101
|
+
return fetchResponse.body;
|
|
102
|
+
case "json":
|
|
103
|
+
default:
|
|
104
|
+
return await fetchResponse.text();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
79
107
|
function dispatchRequest(config) {
|
|
80
108
|
const fullURL = config._builtUrl || (0, import_buildURL.default)(
|
|
81
109
|
config.url ?? "",
|
|
@@ -83,37 +111,13 @@ function dispatchRequest(config) {
|
|
|
83
111
|
config.params,
|
|
84
112
|
config.paramsSerializer
|
|
85
113
|
);
|
|
86
|
-
const flatHeaders = flattenHeaders(
|
|
87
|
-
config.headers,
|
|
88
|
-
config.method
|
|
89
|
-
);
|
|
114
|
+
const flatHeaders = flattenHeaders(config.headers, config.method);
|
|
90
115
|
const requestTransforms = buildTransformArray(config.transformRequest);
|
|
91
|
-
const requestData = (0, import_transformData.default)(
|
|
92
|
-
requestTransforms,
|
|
93
|
-
config.data,
|
|
94
|
-
flatHeaders,
|
|
95
|
-
config
|
|
96
|
-
);
|
|
116
|
+
const requestData = (0, import_transformData.default)(requestTransforms, config.data, flatHeaders, config);
|
|
97
117
|
if (requestData === null || requestData === void 0 || typeof FormData !== "undefined" && requestData instanceof FormData) {
|
|
98
118
|
removeContentType(flatHeaders);
|
|
99
119
|
}
|
|
100
|
-
|
|
101
|
-
const username = config.auth.username || "";
|
|
102
|
-
const password = config.auth.password || "";
|
|
103
|
-
const credentials = `${username}:${password}`;
|
|
104
|
-
let encoded;
|
|
105
|
-
if (typeof Buffer !== "undefined") {
|
|
106
|
-
encoded = Buffer.from(credentials).toString("base64");
|
|
107
|
-
} else {
|
|
108
|
-
const bytes = new TextEncoder().encode(credentials);
|
|
109
|
-
const binString = Array.from(
|
|
110
|
-
bytes,
|
|
111
|
-
(x) => String.fromCodePoint(x)
|
|
112
|
-
).join("");
|
|
113
|
-
encoded = btoa(binString);
|
|
114
|
-
}
|
|
115
|
-
flatHeaders["Authorization"] = `Basic ${encoded}`;
|
|
116
|
-
}
|
|
120
|
+
setBasicAuth(config, flatHeaders);
|
|
117
121
|
const fetchOptions = {
|
|
118
122
|
method: (config.method || "GET").toUpperCase(),
|
|
119
123
|
headers: flatHeaders
|
|
@@ -145,10 +149,7 @@ function dispatchRequest(config) {
|
|
|
145
149
|
}, config.timeout);
|
|
146
150
|
if (config.signal) {
|
|
147
151
|
if (typeof AbortSignal.any === "function") {
|
|
148
|
-
fetchOptions.signal = AbortSignal.any([
|
|
149
|
-
config.signal,
|
|
150
|
-
abortController.signal
|
|
151
|
-
]);
|
|
152
|
+
fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);
|
|
152
153
|
} else {
|
|
153
154
|
if (config.signal.aborted) {
|
|
154
155
|
abortController.abort(config.signal.reason);
|
|
@@ -173,24 +174,7 @@ function dispatchRequest(config) {
|
|
|
173
174
|
let responseData;
|
|
174
175
|
const responseType = config.responseType || "json";
|
|
175
176
|
try {
|
|
176
|
-
|
|
177
|
-
case "arraybuffer":
|
|
178
|
-
responseData = await fetchResponse.arrayBuffer();
|
|
179
|
-
break;
|
|
180
|
-
case "blob":
|
|
181
|
-
responseData = await fetchResponse.blob();
|
|
182
|
-
break;
|
|
183
|
-
case "text":
|
|
184
|
-
responseData = await fetchResponse.text();
|
|
185
|
-
break;
|
|
186
|
-
case "stream":
|
|
187
|
-
responseData = fetchResponse.body;
|
|
188
|
-
break;
|
|
189
|
-
case "json":
|
|
190
|
-
default:
|
|
191
|
-
responseData = await fetchResponse.text();
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
177
|
+
responseData = await readResponseData(fetchResponse, responseType);
|
|
194
178
|
} catch (readError) {
|
|
195
179
|
throw import_accessioError.default.from(
|
|
196
180
|
readError,
|
|
@@ -202,12 +186,7 @@ function dispatchRequest(config) {
|
|
|
202
186
|
}
|
|
203
187
|
const responseHeaders = (0, import_parseHeaders.default)(fetchResponse.headers);
|
|
204
188
|
const responseTransforms = buildTransformArray(config.transformResponse);
|
|
205
|
-
responseData = (0, import_transformData.default)(
|
|
206
|
-
responseTransforms,
|
|
207
|
-
responseData,
|
|
208
|
-
responseHeaders,
|
|
209
|
-
config
|
|
210
|
-
);
|
|
189
|
+
responseData = (0, import_transformData.default)(responseTransforms, responseData, responseHeaders, config);
|
|
211
190
|
const response = {
|
|
212
191
|
data: responseData,
|
|
213
192
|
status: fetchResponse.status,
|
|
@@ -218,7 +197,12 @@ function dispatchRequest(config) {
|
|
|
218
197
|
duration: Date.now() - requestStartTime
|
|
219
198
|
};
|
|
220
199
|
return new Promise((resolve, reject) => {
|
|
221
|
-
(0, import_settle.default)(
|
|
200
|
+
(0, import_settle.default)(
|
|
201
|
+
resolve,
|
|
202
|
+
reject,
|
|
203
|
+
response,
|
|
204
|
+
config
|
|
205
|
+
);
|
|
222
206
|
});
|
|
223
207
|
}).catch((error) => {
|
|
224
208
|
if (error instanceof import_accessioError.default) {
|
|
@@ -234,13 +218,7 @@ function dispatchRequest(config) {
|
|
|
234
218
|
null
|
|
235
219
|
);
|
|
236
220
|
}
|
|
237
|
-
throw new import_accessioError.default(
|
|
238
|
-
"Request aborted",
|
|
239
|
-
import_accessioError.default.ERR_CANCELED,
|
|
240
|
-
config,
|
|
241
|
-
null,
|
|
242
|
-
null
|
|
243
|
-
);
|
|
221
|
+
throw new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
|
|
244
222
|
}
|
|
245
223
|
throw import_accessioError.default.from(
|
|
246
224
|
error instanceof Error ? error : new Error(String(error)),
|
package/cjs/core/request.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\nconst METHOD_KEYS = new Set<string>([\n 'common',\n 'delete',\n 'get',\n 'head',\n 'options',\n 'post',\n 'put',\n 'patch',\n]);\n\ntype HeadersConfig = Record<string, Record<string, string>>;\n\nfunction flattenHeaders(\n headers: HeadersConfig | undefined,\n method?: string,\n): Record<string, string> {\n if (!headers) return {};\n\n const merged: Record<string, string> = {};\n const methodLower = (method || 'get').toLowerCase();\n\n if (headers['common']) {\n Object.assign(merged, headers['common']);\n }\n\n if (headers[methodLower]) {\n Object.assign(merged, headers[methodLower]);\n }\n\n for (const key in headers) {\n if (\n Object.prototype.hasOwnProperty.call(headers, key) &&\n !METHOD_KEYS.has(key)\n ) {\n merged[key] = headers[key] as unknown as string;\n }\n }\n\n return merged;\n}\n\nfunction removeContentType(headers: Record<string, string>): void {\n const key = Object.keys(headers).find(\n (k) => k.toLowerCase() === 'content-type',\n );\n if (key) {\n delete headers[key];\n }\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\nexport default 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 const flatHeaders = flattenHeaders(\n config.headers as HeadersConfig | undefined,\n config.method,\n );\n\n const requestTransforms = buildTransformArray(config.transformRequest);\n\n const requestData = transformData(\n requestTransforms,\n config.data,\n flatHeaders,\n config,\n );\n\n if (\n requestData === null ||\n requestData === undefined ||\n (typeof FormData !== 'undefined' && requestData instanceof FormData)\n ) {\n removeContentType(flatHeaders);\n }\n\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n const credentials = `${username}:${password}`;\n\n let encoded: string;\n if (typeof Buffer !== 'undefined') {\n encoded = Buffer.from(credentials).toString('base64');\n } else {\n const bytes = new TextEncoder().encode(credentials);\n const binString = Array.from(bytes, (x) =>\n String.fromCodePoint(x),\n ).join('');\n encoded = btoa(binString);\n }\n\n flatHeaders['Authorization'] = `Basic ${encoded}`;\n }\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: 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 let abortController: AbortController | null = null;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isTimedOut = false;\n let onUserAbort: (() => void) | null = null;\n\n if (config.timeout && config.timeout > 0) {\n abortController = new AbortController();\n\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n abortController!.abort(\n new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, config.timeout);\n\n if (config.signal) {\n if (typeof AbortSignal.any === 'function') {\n fetchOptions.signal = AbortSignal.any([\n config.signal,\n abortController.signal,\n ]);\n } else {\n if (config.signal.aborted) {\n abortController.abort(config.signal.reason);\n } else {\n onUserAbort = () => {\n abortController!.abort(config.signal!.reason);\n };\n config.signal.addEventListener('abort', onUserAbort, {\n once: true,\n });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n } else if (config.signal) {\n fetchOptions.signal = config.signal;\n }\n\n const requestStartTime = Date.now();\n\n return fetch(fullURL, fetchOptions)\n .then(async (fetchResponse) => {\n let responseData: unknown;\n const responseType = config.responseType || 'json';\n\n try {\n switch (responseType) {\n case 'arraybuffer':\n responseData = await fetchResponse.arrayBuffer();\n break;\n case 'blob':\n responseData = await fetchResponse.blob();\n break;\n case 'text':\n responseData = await fetchResponse.text();\n break;\n case 'stream':\n responseData = fetchResponse.body;\n break;\n case 'json':\n default:\n responseData = await fetchResponse.text();\n break;\n }\n } catch (readError) {\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n const responseHeaders = parseHeaders(fetchResponse.headers);\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n\n responseData = transformData(\n responseTransforms,\n responseData,\n responseHeaders,\n config,\n );\n\n const response: AccessioResponse = {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: responseHeaders,\n config: config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n\n return new Promise<AccessioResponse>((resolve, reject) => {\n settle(resolve as (value: AccessioResponse) => void, reject as (reason: AccessioError) => void, response, config);\n });\n })\n .catch((error) => {\n if (error instanceof AccessioError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n if (isTimedOut) {\n throw new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n throw new AccessioError(\n 'Request aborted',\n AccessioError.ERR_CANCELED,\n config,\n null,\n null,\n );\n }\n\n throw AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n })\n .finally(() => {\n if (timeoutId) clearTimeout(timeoutId);\n if (config.signal && onUserAbort) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n });\n}\n"],"mappings":"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","names":["buildURL","transformData","AccessioError","parseHeaders","settle"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\nconst METHOD_KEYS = new Set<string>([\n 'common',\n 'delete',\n 'get',\n 'head',\n 'options',\n 'post',\n 'put',\n 'patch',\n]);\n\ntype HeadersConfig = Record<string, Record<string, string>>;\n\nfunction flattenHeaders(\n headers: HeadersConfig | undefined,\n method?: string,\n): Record<string, string> {\n if (!headers) return {};\n\n const merged: Record<string, string> = {};\n const methodLower = (method || 'get').toLowerCase();\n\n if (headers['common']) {\n Object.assign(merged, headers['common']);\n }\n\n if (headers[methodLower]) {\n Object.assign(merged, headers[methodLower]);\n }\n\n for (const key in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, key) && !METHOD_KEYS.has(key)) {\n merged[key] = headers[key] as unknown as string;\n }\n }\n\n return merged;\n}\n\nfunction removeContentType(headers: Record<string, string>): void {\n const key = Object.keys(headers).find((k) => k.toLowerCase() === 'content-type');\n if (key) {\n delete headers[key];\n }\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\nfunction setBasicAuth(config: AccessioRequestConfig, headers: Record<string, string>): void {\n if (!config.auth) return;\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n const credentials = `${username}:${password}`;\n\n let encoded: string;\n if (typeof Buffer !== 'undefined') {\n encoded = Buffer.from(credentials).toString('base64');\n } else {\n const bytes = new TextEncoder().encode(credentials);\n const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join('');\n encoded = btoa(binString);\n }\n headers['Authorization'] = `Basic ${encoded}`;\n}\n\nasync function readResponseData(fetchResponse: Response, responseType: string): Promise<unknown> {\n switch (responseType) {\n case 'arraybuffer': return await fetchResponse.arrayBuffer();\n case 'blob': return await fetchResponse.blob();\n case 'text': return await fetchResponse.text();\n case 'stream': return fetchResponse.body;\n case 'json':\n default: return await fetchResponse.text();\n }\n}\n\nexport default function dispatchRequest(config: AccessioRequestConfig): 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 const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n\n const requestTransforms = buildTransformArray(config.transformRequest);\n\n const requestData = 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 setBasicAuth(config, flatHeaders);\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: 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 let abortController: AbortController | null = null;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isTimedOut = false;\n let onUserAbort: (() => void) | null = null;\n\n if (config.timeout && config.timeout > 0) {\n abortController = new AbortController();\n\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n abortController!.abort(\n new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, config.timeout);\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 abortController!.abort(config.signal!.reason);\n };\n config.signal.addEventListener('abort', onUserAbort, {\n once: true,\n });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n } else if (config.signal) {\n fetchOptions.signal = config.signal;\n }\n\n const requestStartTime = Date.now();\n\n return fetch(fullURL, fetchOptions)\n .then(async (fetchResponse) => {\n let responseData: unknown;\n const responseType = config.responseType || 'json';\n\n try {\n responseData = await readResponseData(fetchResponse, responseType);\n } catch (readError) {\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n const responseHeaders = parseHeaders(fetchResponse.headers);\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n\n responseData = transformData(responseTransforms, responseData, responseHeaders, config);\n\n const response: AccessioResponse = {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: responseHeaders,\n config: config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n\n return 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 .catch((error) => {\n if (error instanceof AccessioError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n if (isTimedOut) {\n throw new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n throw new AccessioError('Request aborted', AccessioError.ERR_CANCELED, config, null, null);\n }\n\n throw AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n })\n .finally(() => {\n if (timeoutId) clearTimeout(timeoutId);\n if (config.signal && onUserAbort) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n });\n}\n"],"mappings":"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","names":["buildURL","transformData","AccessioError","parseHeaders","settle"]}
|
package/cjs/core/retry.cjs
CHANGED
|
@@ -56,9 +56,7 @@ function sleep(ms, options) {
|
|
|
56
56
|
if (options?.signal) {
|
|
57
57
|
if (options.signal.aborted) {
|
|
58
58
|
clearTimeout(timeoutId);
|
|
59
|
-
return reject(
|
|
60
|
-
options.signal.reason || new Error("Sleep aborted")
|
|
61
|
-
);
|
|
59
|
+
return reject(options.signal.reason || new Error("Sleep aborted"));
|
|
62
60
|
}
|
|
63
61
|
onAbort = () => {
|
|
64
62
|
clearTimeout(timeoutId);
|
|
@@ -89,11 +87,7 @@ async function retryRequest(dispatchFn, config) {
|
|
|
89
87
|
}
|
|
90
88
|
const delay = calculateDelay(attempt, retryDelay);
|
|
91
89
|
if (typeof config.onRetry === "function") {
|
|
92
|
-
config.onRetry(
|
|
93
|
-
attempt + 1,
|
|
94
|
-
error,
|
|
95
|
-
config
|
|
96
|
-
);
|
|
90
|
+
config.onRetry(attempt + 1, error, config);
|
|
97
91
|
}
|
|
98
92
|
await sleep(delay, { signal: config.signal });
|
|
99
93
|
}
|
package/cjs/core/retry.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/retry.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/core/retry.ts"],"sourcesContent":["import { ERR_CANCELED, ERR_NETWORK, ETIMEDOUT } from '../constants/errorCodes';\nimport type {\n AccessioRequestConfig,\n AccessioResponse,\n AccessioError,\n RetryConditionFunction,\n OnRetryFunction,\n} from '../types';\n\nfunction defaultRetryCondition(error: any): boolean {\n if (error.code === ERR_CANCELED) {\n return false;\n }\n\n if (error.code === ERR_NETWORK) {\n return true;\n }\n\n if (error.code === ETIMEDOUT) {\n return true;\n }\n\n if (error.response && error.response.status >= 500) {\n return true;\n }\n\n return false;\n}\n\nfunction calculateDelay(attempt: number, baseDelay: number): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);\n return Math.round(exponentialDelay + jitter);\n}\n\nfunction sleep(ms: number, options?: { signal?: AbortSignal }): Promise<void> {\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | undefined;\n\n const timeoutId = setTimeout(() => {\n if (options?.signal && onAbort) {\n options.signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (options?.signal) {\n if (options.signal.aborted) {\n clearTimeout(timeoutId);\n return reject(options.signal.reason || new Error('Sleep aborted'));\n }\n\n onAbort = () => {\n clearTimeout(timeoutId);\n reject(options.signal!.reason || new Error('Sleep aborted'));\n };\n\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\nasync function retryRequest(\n dispatchFn: (config: AccessioRequestConfig) => Promise<any>,\n config: AccessioRequestConfig,\n): Promise<any> {\n const maxRetries = config.retry ?? 0;\n\n if (maxRetries <= 0) {\n return dispatchFn(config);\n }\n\n const retryDelay = config.retryDelay ?? 1000;\n const retryCondition: RetryConditionFunction = config.retryCondition ?? defaultRetryCondition;\n\n let lastError: any;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await dispatchFn(config);\n return response;\n } catch (error) {\n lastError = error;\n\n const isLastAttempt = attempt >= maxRetries;\n const shouldRetry = !isLastAttempt && retryCondition(error as AccessioError);\n\n if (!shouldRetry) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, retryDelay);\n\n if (typeof config.onRetry === 'function') {\n (config.onRetry as OnRetryFunction)(attempt + 1, error as AccessioError, config);\n }\n\n await sleep(delay, { signal: config.signal });\n }\n }\n\n throw lastError;\n}\n\nexport { defaultRetryCondition, calculateDelay };\nexport default retryRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqD;AASrD,SAAS,sBAAsB,OAAqB;AAClD,MAAI,MAAM,SAAS,gCAAc;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,+BAAa;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,6BAAW;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,YAAY,MAAM,SAAS,UAAU,KAAK;AAClD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,WAA2B;AAClE,QAAM,mBAAmB,YAAY,KAAK,IAAI,GAAG,OAAO;AACxD,QAAM,SAAS,mBAAmB,QAAQ,KAAK,OAAO,IAAI,IAAI;AAC9D,SAAO,KAAK,MAAM,mBAAmB,MAAM;AAC7C;AAEA,SAAS,MAAM,IAAY,SAAmD;AAC5E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AAEJ,UAAM,YAAY,WAAW,MAAM;AACjC,UAAI,SAAS,UAAU,SAAS;AAC9B,gBAAQ,OAAO,oBAAoB,SAAS,OAAO;AAAA,MACrD;AACA,cAAQ;AAAA,IACV,GAAG,EAAE;AAEL,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO,SAAS;AAC1B,qBAAa,SAAS;AACtB,eAAO,OAAO,QAAQ,OAAO,UAAU,IAAI,MAAM,eAAe,CAAC;AAAA,MACnE;AAEA,gBAAU,MAAM;AACd,qBAAa,SAAS;AACtB,eAAO,QAAQ,OAAQ,UAAU,IAAI,MAAM,eAAe,CAAC;AAAA,MAC7D;AAEA,cAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AACH;AAEA,eAAe,aACb,YACA,QACc;AACd,QAAM,aAAa,OAAO,SAAS;AAEnC,MAAI,cAAc,GAAG;AACnB,WAAO,WAAW,MAAM;AAAA,EAC1B;AAEA,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,iBAAyC,OAAO,kBAAkB;AAExE,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,MAAM;AACxC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY;AAEZ,YAAM,gBAAgB,WAAW;AACjC,YAAM,cAAc,CAAC,iBAAiB,eAAe,KAAsB;AAE3E,UAAI,CAAC,aAAa;AAChB,cAAM;AAAA,MACR;AAEA,YAAM,QAAQ,eAAe,SAAS,UAAU;AAEhD,UAAI,OAAO,OAAO,YAAY,YAAY;AACxC,QAAC,OAAO,QAA4B,UAAU,GAAG,OAAwB,MAAM;AAAA,MACjF;AAEA,YAAM,MAAM,OAAO,EAAE,QAAQ,OAAO,OAAO,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM;AACR;AAGA,IAAO,gBAAQ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/defaults/index.ts"],"sourcesContent":["import { defaultTransformRequest, defaultTransformResponse } from './transforms';\nimport type { AccessioRequestConfig } from '../types';\n\nconst defaults: AccessioRequestConfig = {\n method: 'get',\n timeout: 0,\n headers: {\n common: {\n Accept: 'application/json, text/plain, */*',\n },\n delete: {},\n get: {},\n head: {},\n options: {},\n post: {\n 'Content-Type': 'application/json',\n },\n put: {\n 'Content-Type': 'application/json',\n },\n patch: {\n 'Content-Type': 'application/json',\n },\n },\n transformRequest: [defaultTransformRequest],\n transformResponse: [defaultTransformResponse],\n validateStatus: function defaultValidateStatus(
|
|
1
|
+
{"version":3,"sources":["../../src/defaults/index.ts"],"sourcesContent":["import { defaultTransformRequest, defaultTransformResponse } from './transforms';\nimport type { AccessioRequestConfig } from '../types';\n\nconst defaults: AccessioRequestConfig = {\n method: 'get',\n timeout: 0,\n headers: {\n common: {\n Accept: 'application/json, text/plain, */*',\n },\n delete: {},\n get: {},\n head: {},\n options: {},\n post: {\n 'Content-Type': 'application/json',\n },\n put: {\n 'Content-Type': 'application/json',\n },\n patch: {\n 'Content-Type': 'application/json',\n },\n },\n transformRequest: [defaultTransformRequest],\n transformResponse: [defaultTransformResponse],\n validateStatus: function defaultValidateStatus(status: number): boolean {\n return status >= 200 && status < 300;\n },\n responseType: 'json',\n withCredentials: false,\n};\n\nexport default defaults;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAkE;AAGlE,MAAM,WAAkC;AAAA,EACtC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,KAAK,CAAC;AAAA,IACN,MAAM,CAAC;AAAA,IACP,SAAS,CAAC;AAAA,IACV,MAAM;AAAA,MACJ,gBAAgB;AAAA,IAClB;AAAA,IACA,KAAK;AAAA,MACH,gBAAgB;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,MACL,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACA,kBAAkB,CAAC,yCAAuB;AAAA,EAC1C,mBAAmB,CAAC,0CAAwB;AAAA,EAC5C,gBAAgB,SAAS,sBAAsB,QAAyB;AACtE,WAAO,UAAU,OAAO,SAAS;AAAA,EACnC;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AACnB;AAEA,IAAO,mBAAQ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(
|
|
1
|
+
{"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(data: unknown, headers: Record<string, string>): 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 return JSON.stringify(data);\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,wBAAwB,MAAe,SAA0C;AAC/F,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,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;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":[]}
|
package/cjs/helpers/debug.cjs
CHANGED
|
@@ -64,9 +64,7 @@ function logResponse(response) {
|
|
|
64
64
|
const statusText = response.statusText || "";
|
|
65
65
|
const duration = response.duration != null ? `${response.duration}ms` : "??";
|
|
66
66
|
const statusIcon = status >= 200 && status < 300 ? "\u2705" : status >= 400 ? "\u274C" : "\u26A0\uFE0F";
|
|
67
|
-
const parts = [
|
|
68
|
-
`\u{1F426}\u200D\u2B1B [Accessio] \u2190 ${statusIcon} ${status} ${statusText} (${duration})`
|
|
69
|
-
];
|
|
67
|
+
const parts = [`\u{1F426}\u200D\u2B1B [Accessio] \u2190 ${statusIcon} ${status} ${statusText} (${duration})`];
|
|
70
68
|
if (response.data) {
|
|
71
69
|
try {
|
|
72
70
|
const size = typeof response.data === "string" ? response.data.length : JSON.stringify(response.data).length;
|