accessio 1.1.1 → 1.2.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 +98 -1
- package/cjs/accessio.cjs +102 -10
- package/cjs/accessio.cjs.map +1 -1
- package/cjs/core/accessioError.cjs +1 -0
- package/cjs/core/accessioError.cjs.map +1 -1
- package/cjs/core/buildURL.cjs +16 -2
- package/cjs/core/buildURL.cjs.map +1 -1
- package/cjs/core/fetchAdapter.cjs +224 -0
- package/cjs/core/fetchAdapter.cjs.map +1 -0
- package/cjs/core/mergeConfig.cjs +2 -2
- package/cjs/core/mergeConfig.cjs.map +1 -1
- package/cjs/core/request.cjs +74 -199
- package/cjs/core/request.cjs.map +1 -1
- package/cjs/core/retry.cjs +23 -4
- package/cjs/core/retry.cjs.map +1 -1
- package/cjs/defaults/transforms.cjs.map +1 -1
- package/cjs/helpers/auth.cjs +45 -0
- package/cjs/helpers/auth.cjs.map +1 -0
- package/cjs/helpers/flattenHeaders.cjs +78 -0
- package/cjs/helpers/flattenHeaders.cjs.map +1 -0
- package/cjs/helpers/memoryCache.cjs +51 -0
- package/cjs/helpers/memoryCache.cjs.map +1 -0
- package/cjs/helpers/parseHeaders.cjs +16 -4
- package/cjs/helpers/parseHeaders.cjs.map +1 -1
- package/cjs/helpers/rateLimiter.cjs +18 -8
- package/cjs/helpers/rateLimiter.cjs.map +1 -1
- package/cjs/helpers/toFormData.cjs +50 -0
- package/cjs/helpers/toFormData.cjs.map +1 -0
- package/cjs/helpers/transformData.cjs +2 -2
- package/cjs/helpers/transformData.cjs.map +1 -1
- package/cjs/index.cjs +4 -1
- package/cjs/index.cjs.map +1 -1
- package/package.json +4 -3
- package/src/accessio.ts +126 -10
- package/src/core/accessioError.ts +1 -0
- package/src/core/buildURL.ts +17 -2
- package/src/core/fetchAdapter.ts +227 -0
- package/src/core/mergeConfig.ts +2 -2
- package/src/core/request.ts +100 -250
- package/src/core/retry.ts +26 -6
- package/src/defaults/transforms.ts +4 -1
- package/src/helpers/auth.ts +26 -0
- package/src/helpers/flattenHeaders.ts +59 -0
- package/src/helpers/memoryCache.ts +30 -0
- package/src/helpers/parseHeaders.ts +19 -6
- package/src/helpers/rateLimiter.ts +18 -8
- package/src/helpers/toFormData.ts +25 -0
- package/src/helpers/transformData.ts +4 -4
- package/src/index.ts +4 -1
- package/src/types.ts +32 -3
package/README.md
CHANGED
|
@@ -22,6 +22,12 @@
|
|
|
22
22
|
- 🚥 **Rate Limiter** — built-in concurrency control for high-throughput applications
|
|
23
23
|
- 🐞 **Debug Mode** — structured, beautiful console logging for easy development
|
|
24
24
|
- ⏱️ **Duration Tracking** — every response includes precise timing metadata
|
|
25
|
+
- 🧬 **GraphQL Support** — built-in `gql` method for easy querying
|
|
26
|
+
- 📡 **SSE Streaming** — async iterators for Server-Sent Events via `stream`
|
|
27
|
+
- 📚 **Auto-Pagination** — seamlessly iterate through paginated APIs via `autoPaginate`
|
|
28
|
+
- 🛡️ **Schema Validation** — validate responses automatically using Zod or custom schemas
|
|
29
|
+
- 🗂️ **Caching & Deduplication** — prevent redundant requests and cache responses
|
|
30
|
+
- 🪝 **Lifecycle Hooks** — simple hooks for request/response/error events
|
|
25
31
|
|
|
26
32
|
---
|
|
27
33
|
|
|
@@ -74,6 +80,11 @@ console.log(`User created in ${response.duration}ms`);
|
|
|
74
80
|
| `accessio.head(url, config?)` | HEAD request |
|
|
75
81
|
| `accessio.options(url, config?)` | OPTIONS request |
|
|
76
82
|
| `accessio.postForm(url, data?, config?)` | POST request with `multipart/form-data` |
|
|
83
|
+
| `accessio.putForm(url, data?, config?)` | PUT request with `multipart/form-data` |
|
|
84
|
+
| `accessio.patchForm(url, data?, config?)`| PATCH request with `multipart/form-data`|
|
|
85
|
+
| `accessio.stream(url, config?)` | Server-Sent Events (SSE) streaming |
|
|
86
|
+
| `accessio.autoPaginate(url, config?)` | Async iterator for paginated endpoints |
|
|
87
|
+
| `accessio.gql(url, query, vars?, config?)`| GraphQL query/mutation wrapper |
|
|
77
88
|
|
|
78
89
|
### Configuration Options
|
|
79
90
|
|
|
@@ -94,6 +105,17 @@ console.log(`User created in ${response.duration}ms`);
|
|
|
94
105
|
rateLimiter: limiter, // Concurrency limiter instance
|
|
95
106
|
validateStatus: (s) => s < 400, // Resolve/reject predicate
|
|
96
107
|
signal: abortController.signal, // Custom AbortSignal
|
|
108
|
+
dedupe: true, // Prevent duplicate in-flight requests
|
|
109
|
+
cache: true, // Cache responses (boolean or CacheProvider)
|
|
110
|
+
cacheTTL: 60000, // Cache time-to-live in ms
|
|
111
|
+
schema: z.object({...}), // Schema validator (e.g., Zod)
|
|
112
|
+
fetch: customFetch, // Custom fetch implementation
|
|
113
|
+
retryOn429: true, // Automatically retry on rate limits
|
|
114
|
+
hooks: { // Lifecycle hooks
|
|
115
|
+
onBeforeRequest: (config) => {},
|
|
116
|
+
onRequestResponse: (response) => {},
|
|
117
|
+
onRequestError: (error) => {}
|
|
118
|
+
}
|
|
97
119
|
}
|
|
98
120
|
```
|
|
99
121
|
|
|
@@ -178,6 +200,79 @@ Get beautiful, structured logs in your console by enabling `debug: true`.
|
|
|
178
200
|
// Size: ~3.2 KB
|
|
179
201
|
```
|
|
180
202
|
|
|
203
|
+
### Caching & Deduplication
|
|
204
|
+
|
|
205
|
+
Prevent duplicate requests and cache responses to improve performance.
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
const api = accessio.create({
|
|
209
|
+
dedupe: true, // Prevents identical requests while one is pending
|
|
210
|
+
cache: true, // Caches responses in memory
|
|
211
|
+
cacheTTL: 5 * 60 * 1000, // Cache for 5 minutes
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Schema Validation
|
|
216
|
+
|
|
217
|
+
Automatically parse and validate responses using libraries like Zod.
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
import { z } from 'zod';
|
|
221
|
+
|
|
222
|
+
const userSchema = z.object({ id: z.number(), name: z.string() });
|
|
223
|
+
|
|
224
|
+
const response = await accessio.get('/user/1', { schema: userSchema });
|
|
225
|
+
// response.data is strictly typed and validated against userSchema
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Server-Sent Events (SSE)
|
|
229
|
+
|
|
230
|
+
Easily consume SSE streams using async iterators.
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
for await (const chunk of accessio.stream('/stream')) {
|
|
234
|
+
console.log(chunk); // Parsed JSON or string data from SSE
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Auto-Pagination
|
|
239
|
+
|
|
240
|
+
Iterate through paginated endpoints effortlessly.
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
for await (const user of accessio.autoPaginate('/users')) {
|
|
244
|
+
console.log(user); // Automatically fetches the next page when needed
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### GraphQL
|
|
249
|
+
|
|
250
|
+
Send GraphQL queries and mutations with ease.
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
const query = `
|
|
254
|
+
query GetUser($id: ID!) {
|
|
255
|
+
user(id: $id) { name, email }
|
|
256
|
+
}
|
|
257
|
+
`;
|
|
258
|
+
|
|
259
|
+
const response = await accessio.gql('/graphql', query, { id: '1' });
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Lifecycle Hooks
|
|
263
|
+
|
|
264
|
+
Use hooks for simple global or request-specific event handling.
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
accessio.create({
|
|
268
|
+
hooks: {
|
|
269
|
+
onBeforeRequest: (config) => console.log('Starting request...'),
|
|
270
|
+
onRequestResponse: (response) => console.log('Request succeeded!'),
|
|
271
|
+
onRequestError: (error) => console.error('Request failed!'),
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
```
|
|
275
|
+
|
|
181
276
|
---
|
|
182
277
|
|
|
183
278
|
## 🛠️ Developer Guide
|
|
@@ -192,8 +287,10 @@ npm install
|
|
|
192
287
|
|
|
193
288
|
### Available Scripts
|
|
194
289
|
|
|
195
|
-
- `npm run build`: Generate
|
|
290
|
+
- `npm run build`: Generate CommonJS bundles
|
|
196
291
|
- `npm run test`: Run the full test suite with Vitest
|
|
292
|
+
- `npm run test:coverage`: Run tests with coverage report
|
|
293
|
+
- `npm run test:browser`: Run tests in browser environment
|
|
197
294
|
- `npm run lint`: Check for code style issues
|
|
198
295
|
- `npm run format`: Automatically format the codebase with Prettier
|
|
199
296
|
- `npm run typecheck`: Validate TypeScript types
|
package/cjs/accessio.cjs
CHANGED
|
@@ -40,6 +40,7 @@ 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_toFormData = require("./helpers/toFormData");
|
|
43
44
|
var import_defaults = __toESM(require("./defaults/index"), 1);
|
|
44
45
|
class Accessio {
|
|
45
46
|
defaults;
|
|
@@ -70,23 +71,59 @@ class Accessio {
|
|
|
70
71
|
}
|
|
71
72
|
const requestInterceptors = [];
|
|
72
73
|
const responseInterceptors = [];
|
|
74
|
+
let synchronousRequestInterceptors = true;
|
|
73
75
|
this.interceptors.request.forEach((interceptor) => {
|
|
74
76
|
if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) {
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
79
|
+
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
|
|
77
80
|
requestInterceptors.unshift(interceptor);
|
|
78
81
|
});
|
|
79
82
|
this.interceptors.response.forEach((interceptor) => {
|
|
80
83
|
responseInterceptors.push(interceptor);
|
|
81
84
|
});
|
|
82
|
-
let promise
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
let promise;
|
|
86
|
+
if (synchronousRequestInterceptors) {
|
|
87
|
+
let newConfig = mergedConfig;
|
|
88
|
+
let rejectReason = null;
|
|
89
|
+
let isRejected = false;
|
|
90
|
+
for (const interceptor of requestInterceptors) {
|
|
91
|
+
if (!isRejected) {
|
|
92
|
+
try {
|
|
93
|
+
if (interceptor.fulfilled) {
|
|
94
|
+
newConfig = interceptor.fulfilled(newConfig);
|
|
95
|
+
}
|
|
96
|
+
} catch (err) {
|
|
97
|
+
rejectReason = err;
|
|
98
|
+
isRejected = true;
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
if (interceptor.rejected) {
|
|
102
|
+
try {
|
|
103
|
+
newConfig = interceptor.rejected(rejectReason);
|
|
104
|
+
isRejected = false;
|
|
105
|
+
} catch (err) {
|
|
106
|
+
rejectReason = err;
|
|
107
|
+
isRejected = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
87
110
|
}
|
|
88
|
-
|
|
89
|
-
|
|
111
|
+
}
|
|
112
|
+
if (isRejected) {
|
|
113
|
+
promise = Promise.reject(rejectReason);
|
|
114
|
+
} else {
|
|
115
|
+
promise = Promise.resolve(newConfig);
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
promise = Promise.resolve(mergedConfig);
|
|
119
|
+
for (const interceptor of requestInterceptors) {
|
|
120
|
+
promise = promise.then((value) => {
|
|
121
|
+
if (interceptor.fulfilled) {
|
|
122
|
+
return interceptor.fulfilled(value);
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
125
|
+
}, interceptor.rejected);
|
|
126
|
+
}
|
|
90
127
|
}
|
|
91
128
|
promise = promise.then((cfg) => {
|
|
92
129
|
const fullUrl = (0, import_buildURL.default)(cfg.url ?? "", cfg.baseURL, cfg.params, cfg.paramsSerializer);
|
|
@@ -141,35 +178,90 @@ class Accessio {
|
|
|
141
178
|
return this.request((0, import_mergeConfig.default)(config || {}, { method: "patch", url, data }));
|
|
142
179
|
}
|
|
143
180
|
postForm(url, data, config) {
|
|
181
|
+
const formData = data && !(data instanceof FormData) ? (0, import_toFormData.toFormData)(data) : data;
|
|
144
182
|
return this.request(
|
|
145
183
|
(0, import_mergeConfig.default)(config || {}, {
|
|
146
184
|
method: "post",
|
|
147
185
|
url,
|
|
148
|
-
data,
|
|
186
|
+
data: formData,
|
|
149
187
|
headers: { "Content-Type": "multipart/form-data" }
|
|
150
188
|
})
|
|
151
189
|
);
|
|
152
190
|
}
|
|
153
191
|
putForm(url, data, config) {
|
|
192
|
+
const formData = data && !(data instanceof FormData) ? (0, import_toFormData.toFormData)(data) : data;
|
|
154
193
|
return this.request(
|
|
155
194
|
(0, import_mergeConfig.default)(config || {}, {
|
|
156
195
|
method: "put",
|
|
157
196
|
url,
|
|
158
|
-
data,
|
|
197
|
+
data: formData,
|
|
159
198
|
headers: { "Content-Type": "multipart/form-data" }
|
|
160
199
|
})
|
|
161
200
|
);
|
|
162
201
|
}
|
|
163
202
|
patchForm(url, data, config) {
|
|
203
|
+
const formData = data && !(data instanceof FormData) ? (0, import_toFormData.toFormData)(data) : data;
|
|
164
204
|
return this.request(
|
|
165
205
|
(0, import_mergeConfig.default)(config || {}, {
|
|
166
206
|
method: "patch",
|
|
167
207
|
url,
|
|
168
|
-
data,
|
|
208
|
+
data: formData,
|
|
169
209
|
headers: { "Content-Type": "multipart/form-data" }
|
|
170
210
|
})
|
|
171
211
|
);
|
|
172
212
|
}
|
|
213
|
+
async *stream(url, config) {
|
|
214
|
+
const response = await this.request(
|
|
215
|
+
(0, import_mergeConfig.default)(config || {}, { method: "get", url, responseType: "stream" })
|
|
216
|
+
);
|
|
217
|
+
if (!response.data) return;
|
|
218
|
+
const reader = response.data.getReader();
|
|
219
|
+
const decoder = new TextDecoder();
|
|
220
|
+
let buffer = "";
|
|
221
|
+
while (true) {
|
|
222
|
+
const { done, value } = await reader.read();
|
|
223
|
+
if (done) break;
|
|
224
|
+
buffer += decoder.decode(value, { stream: true });
|
|
225
|
+
const lines = buffer.split("\n");
|
|
226
|
+
buffer = lines.pop() || "";
|
|
227
|
+
for (const line of lines) {
|
|
228
|
+
if (line.trim().startsWith("data:")) {
|
|
229
|
+
const dataStr = line.replace(/^data:\s*/, "");
|
|
230
|
+
if (dataStr === "[DONE]") return;
|
|
231
|
+
try {
|
|
232
|
+
yield JSON.parse(dataStr);
|
|
233
|
+
} catch (e) {
|
|
234
|
+
yield dataStr;
|
|
235
|
+
}
|
|
236
|
+
} else if (line.trim().startsWith("{") || line.trim().startsWith("[")) {
|
|
237
|
+
try {
|
|
238
|
+
yield JSON.parse(line);
|
|
239
|
+
} catch (e) {
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async *autoPaginate(url, config) {
|
|
246
|
+
let nextUrl = url;
|
|
247
|
+
let currentConfig = config || {};
|
|
248
|
+
while (nextUrl) {
|
|
249
|
+
const response = await this.get(nextUrl, currentConfig);
|
|
250
|
+
const items = Array.isArray(response.data) ? response.data : response.data.data;
|
|
251
|
+
if (Array.isArray(items)) {
|
|
252
|
+
for (const item of items) {
|
|
253
|
+
yield item;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
nextUrl = response.data.next || response.data.links?.next || null;
|
|
257
|
+
if (nextUrl) {
|
|
258
|
+
currentConfig = (0, import_mergeConfig.default)(currentConfig, { url: nextUrl, params: {} });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
gql(url, query, variables, config) {
|
|
263
|
+
return this.post(url, { query, variables }, config);
|
|
264
|
+
}
|
|
173
265
|
}
|
|
174
266
|
var accessio_default = Accessio;
|
|
175
267
|
// Annotate the CommonJS export names for ESM import in node:
|
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';\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"]}
|
|
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\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 let synchronousRequestInterceptors = true;\n\n this.interceptors.request.forEach((interceptor: InterceptorHandler) => {\n if (interceptor.runWhen && !interceptor.runWhen(mergedConfig)) {\n return;\n }\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n requestInterceptors.unshift(interceptor);\n });\n\n this.interceptors.response.forEach((interceptor: InterceptorHandler) => {\n responseInterceptors.push(interceptor);\n });\n\n let promise: Promise<any>;\n\n if (synchronousRequestInterceptors) {\n let newConfig = mergedConfig;\n let rejectReason: any = null;\n let isRejected = false;\n\n for (const interceptor of requestInterceptors) {\n if (!isRejected) {\n try {\n if (interceptor.fulfilled) {\n newConfig = interceptor.fulfilled(newConfig);\n }\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n } else {\n if (interceptor.rejected) {\n try {\n newConfig = interceptor.rejected(rejectReason);\n isRejected = false;\n } catch (err) {\n rejectReason = err;\n isRejected = true;\n }\n }\n }\n }\n\n if (isRejected) {\n promise = Promise.reject(rejectReason);\n } else {\n promise = Promise.resolve(newConfig);\n }\n } else {\n promise = Promise.resolve(mergedConfig);\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\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 const formData = data && !(data instanceof FormData) ? toFormData(data) : data;\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'post',\n url,\n data: formData,\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 const formData = data && !(data instanceof FormData) ? toFormData(data) : data;\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'put',\n url,\n data: formData,\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 const formData = data && !(data instanceof FormData) ? toFormData(data) : data;\n return this.request<T>(\n mergeConfig(config || {}, {\n method: 'patch',\n url,\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n }),\n );\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 const decoder = new TextDecoder();\n let buffer = '';\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 if (line.trim().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 (line.trim().startsWith('{') || line.trim().startsWith('[')) {\n try {\n yield JSON.parse(line);\n } catch (e) {\n // ignore partial json\n }\n }\n }\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 items = Array.isArray(response.data) ? response.data : response.data.data;\n if (Array.isArray(items)) {\n for (const item of items) {\n yield item;\n }\n }\n\n nextUrl = response.data.next || response.data.links?.next || null;\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":["mergeConfig","defaultsConfig","InterceptorManager","AccessioError","buildURL","config","dispatchRequest","retryRequest"]}
|
|
@@ -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(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,
|
|
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 override name = 'AccessioError' as const;\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,EACS,OAAO;AAAA,EAEhB,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
|
@@ -73,11 +73,25 @@ function combineURLs(baseURL, relativeURL) {
|
|
|
73
73
|
return `${base}/${relative}`;
|
|
74
74
|
}
|
|
75
75
|
function isAbsoluteURL(url) {
|
|
76
|
-
return /^([a-z][a-z\d+\-.]*:)
|
|
76
|
+
return /^([a-z][a-z\d+\-.]*:)/i.test(url);
|
|
77
77
|
}
|
|
78
78
|
function buildURL(url, baseURL, params, paramsSerializer) {
|
|
79
79
|
let fullURL = baseURL && !isAbsoluteURL(url) ? combineURLs(baseURL, url) : url || "";
|
|
80
|
-
|
|
80
|
+
let finalParams = params;
|
|
81
|
+
if (params && typeof params === "object") {
|
|
82
|
+
const unusedParams = { ...params };
|
|
83
|
+
fullURL = fullURL.replace(/(?::([a-zA-Z0-9_]+))|(?:{([a-zA-Z0-9_]+)})/g, (match, p1, p2) => {
|
|
84
|
+
const key = p1 || p2;
|
|
85
|
+
if (key && unusedParams[key] !== void 0) {
|
|
86
|
+
const val = unusedParams[key];
|
|
87
|
+
delete unusedParams[key];
|
|
88
|
+
return encodeURIComponent(String(val));
|
|
89
|
+
}
|
|
90
|
+
return match;
|
|
91
|
+
});
|
|
92
|
+
finalParams = unusedParams;
|
|
93
|
+
}
|
|
94
|
+
const serialized = serializeParams(finalParams, paramsSerializer);
|
|
81
95
|
if (serialized) {
|
|
82
96
|
const hashIndex = fullURL.indexOf("#");
|
|
83
97
|
if (hashIndex !== -1) {
|
|
@@ -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+\\-.]*:)
|
|
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') {\n const unusedParams = { ...params };\n fullURL = fullURL.replace(/(?::([a-zA-Z0-9_]+))|(?:{([a-zA-Z0-9_]+)})/g, (match, p1, p2) => {\n const key = p1 || p2;\n if (key && unusedParams[key] !== undefined) {\n const val = unusedParams[key];\n delete unusedParams[key];\n return encodeURIComponent(String(val));\n }\n return match;\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 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,QAAQ,IAAI;AAAA,QACrB;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,yBAAyB,KAAK,GAAG;AAC1C;AAEe,SAAR,SACL,KACA,SACA,QACA,kBACQ;AACR,MAAI,UAAU,WAAW,CAAC,cAAc,GAAG,IAAI,YAAY,SAAS,GAAG,IAAI,OAAO;AAElF,MAAI,cAAc;AAClB,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,eAAe,EAAE,GAAG,OAAO;AACjC,cAAU,QAAQ,QAAQ,+CAA+C,CAAC,OAAO,IAAI,OAAO;AAC1F,YAAM,MAAM,MAAM;AAClB,UAAI,OAAO,aAAa,GAAG,MAAM,QAAW;AAC1C,cAAM,MAAM,aAAa,GAAG;AAC5B,eAAO,aAAa,GAAG;AACvB,eAAO,mBAAmB,OAAO,GAAG,CAAC;AAAA,MACvC;AACA,aAAO;AAAA,IACT,CAAC;AACD,kBAAc;AAAA,EAChB;AAEA,QAAM,aAAa,gBAAgB,aAAwC,gBAAgB;AAC3F,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":[]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var fetchAdapter_exports = {};
|
|
30
|
+
__export(fetchAdapter_exports, {
|
|
31
|
+
default: () => fetchAdapter
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(fetchAdapter_exports);
|
|
34
|
+
var import_accessioError = __toESM(require("./accessioError"), 1);
|
|
35
|
+
var import_parseHeaders = __toESM(require("../helpers/parseHeaders"), 1);
|
|
36
|
+
async function readResponseData(fetchResponse, config) {
|
|
37
|
+
const responseType = config.responseType || "json";
|
|
38
|
+
switch (responseType) {
|
|
39
|
+
case "arraybuffer":
|
|
40
|
+
return await fetchResponse.arrayBuffer();
|
|
41
|
+
case "blob":
|
|
42
|
+
return await fetchResponse.blob();
|
|
43
|
+
case "stream":
|
|
44
|
+
return fetchResponse.body;
|
|
45
|
+
case "json":
|
|
46
|
+
default: {
|
|
47
|
+
const contentType = fetchResponse.headers.get("content-type") || "";
|
|
48
|
+
if (contentType.includes("application/json")) {
|
|
49
|
+
if (typeof fetchResponse.clone === "function") {
|
|
50
|
+
const text = await fetchResponse.clone().text();
|
|
51
|
+
return text ? await fetchResponse.json() : "";
|
|
52
|
+
} else {
|
|
53
|
+
const text = await fetchResponse.text();
|
|
54
|
+
return text ? JSON.parse(text) : "";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return await fetchResponse.text();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
|
|
62
|
+
let abortController = null;
|
|
63
|
+
let timeoutId = null;
|
|
64
|
+
let isTimedOut = false;
|
|
65
|
+
let onUserAbort = null;
|
|
66
|
+
if (config.timeout !== void 0 && (typeof config.timeout !== "number" || isNaN(config.timeout) || config.timeout < 0)) {
|
|
67
|
+
throw new import_accessioError.default(
|
|
68
|
+
`Invalid timeout value: ${config.timeout}`,
|
|
69
|
+
import_accessioError.default.ERR_BAD_OPTION_VALUE,
|
|
70
|
+
config,
|
|
71
|
+
null,
|
|
72
|
+
null
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
const timeoutValue = Number(config.timeout);
|
|
76
|
+
if (!isNaN(timeoutValue) && timeoutValue > 0) {
|
|
77
|
+
abortController = new AbortController();
|
|
78
|
+
timeoutId = setTimeout(() => {
|
|
79
|
+
isTimedOut = true;
|
|
80
|
+
abortController.abort(
|
|
81
|
+
new import_accessioError.default(
|
|
82
|
+
`timeout of ${timeoutValue}ms exceeded`,
|
|
83
|
+
import_accessioError.default.ETIMEDOUT,
|
|
84
|
+
config,
|
|
85
|
+
null,
|
|
86
|
+
null
|
|
87
|
+
)
|
|
88
|
+
);
|
|
89
|
+
}, timeoutValue);
|
|
90
|
+
if (config.signal) {
|
|
91
|
+
if (typeof AbortSignal.any === "function") {
|
|
92
|
+
fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);
|
|
93
|
+
} else {
|
|
94
|
+
if (config.signal.aborted) {
|
|
95
|
+
abortController.abort(config.signal.reason);
|
|
96
|
+
} else {
|
|
97
|
+
onUserAbort = () => {
|
|
98
|
+
if (!isTimedOut && abortController) {
|
|
99
|
+
abortController.abort(config.signal.reason);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
config.signal.addEventListener("abort", onUserAbort, {
|
|
103
|
+
once: true
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
fetchOptions.signal = abortController.signal;
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
fetchOptions.signal = abortController.signal;
|
|
110
|
+
}
|
|
111
|
+
} else if (config.signal) {
|
|
112
|
+
fetchOptions.signal = config.signal;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const fetchImpl = config.fetch || fetch;
|
|
116
|
+
let fetchResponse = await fetchImpl(fullURL, fetchOptions);
|
|
117
|
+
if (config.onDownloadProgress && fetchResponse.body && config.responseType !== "stream") {
|
|
118
|
+
const contentLength2 = fetchResponse.headers.get("content-length");
|
|
119
|
+
const total = contentLength2 ? parseInt(contentLength2, 10) : 0;
|
|
120
|
+
let loaded = 0;
|
|
121
|
+
const reader = fetchResponse.body.getReader();
|
|
122
|
+
const stream = new ReadableStream({
|
|
123
|
+
async start(controller) {
|
|
124
|
+
try {
|
|
125
|
+
while (true) {
|
|
126
|
+
const { done, value } = await reader.read();
|
|
127
|
+
if (done) {
|
|
128
|
+
controller.close();
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
loaded += value.byteLength;
|
|
132
|
+
config.onDownloadProgress({ loaded, total });
|
|
133
|
+
controller.enqueue(value);
|
|
134
|
+
}
|
|
135
|
+
} catch (e) {
|
|
136
|
+
controller.error(e);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
fetchResponse = new Response(stream, {
|
|
141
|
+
headers: fetchResponse.headers,
|
|
142
|
+
status: fetchResponse.status,
|
|
143
|
+
statusText: fetchResponse.statusText
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
let responseData;
|
|
147
|
+
const contentLength = fetchResponse.headers.get("content-length");
|
|
148
|
+
if (contentLength && config.maxContentLength && parseInt(contentLength, 10) > config.maxContentLength) {
|
|
149
|
+
throw new import_accessioError.default(
|
|
150
|
+
`maxContentLength size of ${config.maxContentLength} exceeded`,
|
|
151
|
+
import_accessioError.default.ERR_BAD_RESPONSE,
|
|
152
|
+
config,
|
|
153
|
+
fetchResponse,
|
|
154
|
+
null
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
responseData = await readResponseData(fetchResponse, config);
|
|
159
|
+
if (config.schema) {
|
|
160
|
+
if (typeof config.schema.parseAsync === "function") {
|
|
161
|
+
responseData = await config.schema.parseAsync(responseData);
|
|
162
|
+
} else {
|
|
163
|
+
responseData = config.schema.parse(responseData);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
} catch (readError) {
|
|
167
|
+
throw import_accessioError.default.from(
|
|
168
|
+
readError,
|
|
169
|
+
import_accessioError.default.ERR_BAD_RESPONSE,
|
|
170
|
+
config,
|
|
171
|
+
fetchResponse,
|
|
172
|
+
null
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
const responseHeaders = (0, import_parseHeaders.default)(fetchResponse.headers);
|
|
176
|
+
return {
|
|
177
|
+
data: responseData,
|
|
178
|
+
status: fetchResponse.status,
|
|
179
|
+
statusText: fetchResponse.statusText,
|
|
180
|
+
headers: responseHeaders,
|
|
181
|
+
config,
|
|
182
|
+
request: fetchResponse,
|
|
183
|
+
duration: Date.now() - requestStartTime
|
|
184
|
+
};
|
|
185
|
+
} catch (error) {
|
|
186
|
+
if (error instanceof import_accessioError.default) {
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
190
|
+
if (isTimedOut) {
|
|
191
|
+
throw new import_accessioError.default(
|
|
192
|
+
`timeout of ${config.timeout}ms exceeded`,
|
|
193
|
+
import_accessioError.default.ETIMEDOUT,
|
|
194
|
+
config,
|
|
195
|
+
null,
|
|
196
|
+
null
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
throw new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
|
|
200
|
+
}
|
|
201
|
+
if (error instanceof TypeError && (error.message.toLowerCase().includes("url") || error.message.toLowerCase().includes("fetch"))) {
|
|
202
|
+
throw new import_accessioError.default(
|
|
203
|
+
`Invalid URL: ${fullURL}`,
|
|
204
|
+
import_accessioError.default.ERR_INVALID_URL,
|
|
205
|
+
config,
|
|
206
|
+
null,
|
|
207
|
+
null
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
throw import_accessioError.default.from(
|
|
211
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
212
|
+
import_accessioError.default.ERR_NETWORK,
|
|
213
|
+
config,
|
|
214
|
+
null,
|
|
215
|
+
null
|
|
216
|
+
);
|
|
217
|
+
} finally {
|
|
218
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
219
|
+
if (config.signal && onUserAbort) {
|
|
220
|
+
config.signal.removeEventListener("abort", onUserAbort);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=fetchAdapter.cjs.map
|