accessio 1.0.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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +487 -0
  3. package/cjs/accessio.cjs +208 -0
  4. package/cjs/accessio.cjs.map +1 -0
  5. package/cjs/constants/errorCodes.cjs +76 -0
  6. package/cjs/constants/errorCodes.cjs.map +1 -0
  7. package/cjs/core/accessioError.cjs +93 -0
  8. package/cjs/core/accessioError.cjs.map +1 -0
  9. package/cjs/core/buildURL.cjs +100 -0
  10. package/cjs/core/buildURL.cjs.map +1 -0
  11. package/cjs/core/mergeConfig.cjs +73 -0
  12. package/cjs/core/mergeConfig.cjs.map +1 -0
  13. package/cjs/core/request.cjs +259 -0
  14. package/cjs/core/request.cjs.map +1 -0
  15. package/cjs/core/retry.cjs +109 -0
  16. package/cjs/core/retry.cjs.map +1 -0
  17. package/cjs/defaults/index.cjs +55 -0
  18. package/cjs/defaults/index.cjs.map +1 -0
  19. package/cjs/defaults/transforms.cjs +59 -0
  20. package/cjs/defaults/transforms.cjs.map +1 -0
  21. package/cjs/helpers/debug.cjs +96 -0
  22. package/cjs/helpers/debug.cjs.map +1 -0
  23. package/cjs/helpers/parseHeaders.cjs +52 -0
  24. package/cjs/helpers/parseHeaders.cjs.map +1 -0
  25. package/cjs/helpers/rateLimiter.cjs +98 -0
  26. package/cjs/helpers/rateLimiter.cjs.map +1 -0
  27. package/cjs/helpers/settle.cjs +50 -0
  28. package/cjs/helpers/settle.cjs.map +1 -0
  29. package/cjs/helpers/transformData.cjs +57 -0
  30. package/cjs/helpers/transformData.cjs.map +1 -0
  31. package/cjs/index.cjs +121 -0
  32. package/cjs/index.cjs.map +1 -0
  33. package/cjs/interceptors/interceptorManager.cjs +31 -0
  34. package/cjs/interceptors/interceptorManager.cjs.map +1 -0
  35. package/index.d.ts +454 -0
  36. package/package.json +116 -0
  37. package/src/accessio.ts +251 -0
  38. package/src/constants/errorCodes.ts +29 -0
  39. package/src/core/accessioError.ts +74 -0
  40. package/src/core/buildURL.ts +99 -0
  41. package/src/core/mergeConfig.ts +78 -0
  42. package/src/core/request.ts +284 -0
  43. package/src/core/retry.ts +117 -0
  44. package/src/defaults/index.ts +36 -0
  45. package/src/defaults/transforms.ts +44 -0
  46. package/src/helpers/debug.ts +103 -0
  47. package/src/helpers/parseHeaders.ts +35 -0
  48. package/src/helpers/rateLimiter.ts +96 -0
  49. package/src/helpers/settle.ts +26 -0
  50. package/src/helpers/transformData.ts +36 -0
  51. package/src/index.ts +102 -0
  52. package/src/interceptors/interceptorManager.ts +5 -0
  53. package/src/types.ts +159 -0
@@ -0,0 +1,57 @@
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 transformData_exports = {};
30
+ __export(transformData_exports, {
31
+ default: () => transformData
32
+ });
33
+ module.exports = __toCommonJS(transformData_exports);
34
+ var import_accessioError = __toESM(require("../core/accessioError"), 1);
35
+ function transformData(transforms, data, headers, config) {
36
+ if (!transforms || !Array.isArray(transforms)) {
37
+ return data;
38
+ }
39
+ let result = data;
40
+ for (const transform of transforms) {
41
+ if (typeof transform === "function") {
42
+ try {
43
+ result = transform(result, headers);
44
+ } catch (err) {
45
+ throw import_accessioError.default.from(
46
+ err instanceof Error ? err : new Error(String(err)),
47
+ import_accessioError.default.ERR_BAD_REQUEST,
48
+ config ?? null,
49
+ null,
50
+ null
51
+ );
52
+ }
53
+ }
54
+ }
55
+ return result;
56
+ }
57
+ //# sourceMappingURL=transformData.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/helpers/transformData.ts"],"sourcesContent":["import AccessioError from '../core/accessioError';\nimport type {\n TransformFunction,\n AccessioRequestConfig,\n} from '../types';\n\nexport default function transformData(\n transforms: TransformFunction | TransformFunction[] | undefined,\n data: unknown,\n headers: Record<string, string>,\n config?: AccessioRequestConfig,\n): unknown {\n if (!transforms || !Array.isArray(transforms)) {\n return data;\n }\n\n let result = data;\n\n for (const transform of transforms) {\n if (typeof transform === 'function') {\n try {\n result = transform(result, headers);\n } catch (err) {\n throw AccessioError.from(\n err instanceof Error ? err : new Error(String(err)),\n AccessioError.ERR_BAD_REQUEST,\n config ?? null,\n null,\n null,\n );\n }\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA0B;AAMX,SAAR,cACL,YACA,MACA,SACA,QACS;AACT,MAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,cAAc,YAAY;AACnC,UAAI;AACF,iBAAS,UAAU,QAAQ,OAAO;AAAA,MACpC,SAAS,KAAK;AACZ,cAAM,qBAAAA,QAAc;AAAA,UAClB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,UAClD,qBAAAA,QAAc;AAAA,UACd,UAAU;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":["AccessioError"]}
package/cjs/index.cjs ADDED
@@ -0,0 +1,121 @@
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 src_exports = {};
30
+ __export(src_exports, {
31
+ Accessio: () => import_accessio.default,
32
+ AccessioError: () => import_accessioError.default,
33
+ InterceptorManager: () => import_interceptorManager.default,
34
+ buildURL: () => import_buildURL.default,
35
+ createInstance: () => createInstance,
36
+ createRateLimiter: () => import_rateLimiter.createRateLimiter,
37
+ default: () => src_default,
38
+ logError: () => import_debug.logError,
39
+ logRequest: () => import_debug.logRequest,
40
+ logResponse: () => import_debug.logResponse,
41
+ mergeConfig: () => import_mergeConfig.default
42
+ });
43
+ module.exports = __toCommonJS(src_exports);
44
+ var import_accessio = __toESM(require("./accessio"), 1);
45
+ var import_defaults = __toESM(require("./defaults"), 1);
46
+ var import_accessioError = __toESM(require("./core/accessioError"), 1);
47
+ var import_mergeConfig = __toESM(require("./core/mergeConfig"), 1);
48
+ var import_buildURL = __toESM(require("./core/buildURL"), 1);
49
+ var import_interceptorManager = __toESM(require("./interceptors/interceptorManager"), 1);
50
+ var import_rateLimiter = require("./helpers/rateLimiter");
51
+ var import_debug = require("./helpers/debug");
52
+ var import_errorCodes = require("./constants/errorCodes");
53
+ const PUBLIC_METHODS = [
54
+ "request",
55
+ "getUri",
56
+ "get",
57
+ "delete",
58
+ "head",
59
+ "options",
60
+ "post",
61
+ "put",
62
+ "patch",
63
+ "postForm",
64
+ "putForm",
65
+ "patchForm"
66
+ ];
67
+ function createInstance(defaultConfig) {
68
+ const context = new import_accessio.default(defaultConfig);
69
+ const instance = function accessio2(configOrUrl, config) {
70
+ return context.request(configOrUrl, config);
71
+ };
72
+ for (const key of PUBLIC_METHODS) {
73
+ const method = context[key];
74
+ if (typeof method === "function") {
75
+ instance[key] = method.bind(context);
76
+ }
77
+ }
78
+ instance.defaults = context.defaults;
79
+ instance.interceptors = context.interceptors;
80
+ instance.all = function all(promises) {
81
+ return Promise.all(promises);
82
+ };
83
+ instance.spread = function spread(callback) {
84
+ return function wrap(arr) {
85
+ return callback(...arr);
86
+ };
87
+ };
88
+ instance.isCancel = function isCancel(value) {
89
+ return !!(value && value.isAccessioError && value.code === import_errorCodes.ERR_CANCELED);
90
+ };
91
+ instance.isAccessioError = function isAccessioError(value) {
92
+ return value instanceof import_accessioError.default || !!(value && typeof value === "object" && value.isAccessioError === true);
93
+ };
94
+ instance.AccessioError = import_accessioError.default;
95
+ instance.Accessio = import_accessio.default;
96
+ instance.mergeConfig = import_mergeConfig.default;
97
+ instance.buildURL = import_buildURL.default;
98
+ instance.InterceptorManager = import_interceptorManager.default;
99
+ instance.createRateLimiter = import_rateLimiter.createRateLimiter;
100
+ return instance;
101
+ }
102
+ const accessio = createInstance(import_defaults.default);
103
+ function create(instanceConfig) {
104
+ return createInstance((0, import_mergeConfig.default)(import_defaults.default, instanceConfig));
105
+ }
106
+ accessio.create = create;
107
+ var src_default = accessio;
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ Accessio,
111
+ AccessioError,
112
+ InterceptorManager,
113
+ buildURL,
114
+ createInstance,
115
+ createRateLimiter,
116
+ logError,
117
+ logRequest,
118
+ logResponse,
119
+ mergeConfig
120
+ });
121
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import Accessio from './accessio';\nimport defaults from './defaults';\nimport AccessioError from './core/accessioError';\nimport mergeConfig from './core/mergeConfig';\nimport buildURL from './core/buildURL';\nimport InterceptorManager from './interceptors/interceptorManager';\nimport { createRateLimiter } from './helpers/rateLimiter';\nimport { logRequest, logResponse, logError } from './helpers/debug';\nimport { ERR_CANCELED } from './constants/errorCodes';\nimport type { AccessioRequestConfig, AccessioResponse } from './types';\n\nconst PUBLIC_METHODS = [\n 'request',\n 'getUri',\n 'get',\n 'delete',\n 'head',\n 'options',\n 'post',\n 'put',\n 'patch',\n 'postForm',\n 'putForm',\n 'patchForm',\n];\n\nfunction createInstance(defaultConfig: AccessioRequestConfig) {\n const context = new Accessio(defaultConfig);\n\n const instance: any = function accessio(\n configOrUrl: string | AccessioRequestConfig,\n config?: AccessioRequestConfig,\n ) {\n return context.request(configOrUrl, config);\n };\n\n for (const key of PUBLIC_METHODS) {\n const method: any = (context as any)[key];\n if (typeof method === 'function') {\n instance[key] = method.bind(context);\n }\n }\n\n instance.defaults = context.defaults;\n instance.interceptors = context.interceptors;\n instance.all = function all(promises: any[]): Promise<any[]> {\n return Promise.all(promises);\n };\n instance.spread = function spread<T>(\n callback: (...args: any[]) => T,\n ): (arr: any[]) => T {\n return function wrap(arr: any[]): T {\n return callback(...arr);\n };\n };\n instance.isCancel = function isCancel(value: any): boolean {\n return !!(\n value &&\n value.isAccessioError &&\n value.code === ERR_CANCELED\n );\n };\n instance.isAccessioError = function isAccessioError(\n value: any,\n ): boolean {\n return (\n value instanceof AccessioError ||\n !!(value && typeof value === 'object' && value.isAccessioError === true)\n );\n };\n instance.AccessioError = AccessioError;\n instance.Accessio = Accessio;\n instance.mergeConfig = mergeConfig;\n instance.buildURL = buildURL;\n instance.InterceptorManager = InterceptorManager;\n instance.createRateLimiter = createRateLimiter;\n\n return instance;\n}\n\nconst accessio = createInstance(defaults);\n\nfunction create(instanceConfig?: AccessioRequestConfig) {\n return createInstance(mergeConfig(defaults, instanceConfig));\n}\n\naccessio.create = create;\n\nexport default accessio;\n\nexport {\n Accessio,\n AccessioError,\n mergeConfig,\n buildURL,\n InterceptorManager,\n createInstance,\n createRateLimiter,\n logRequest,\n logResponse,\n logError,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,kCAAAA;AAAA,EAAA,0CAAAC;AAAA,EAAA,oDAAAC;AAAA,EAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAAC;AAAA;AAAA;AAAA,sBAAqB;AACrB,sBAAqB;AACrB,2BAA0B;AAC1B,yBAAwB;AACxB,sBAAqB;AACrB,gCAA+B;AAC/B,yBAAkC;AAClC,mBAAkD;AAClD,wBAA6B;AAG7B,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,eAAsC;AAC5D,QAAM,UAAU,IAAI,gBAAAJ,QAAS,aAAa;AAE1C,QAAM,WAAgB,SAASK,UAC7B,aACA,QACA;AACA,WAAO,QAAQ,QAAQ,aAAa,MAAM;AAAA,EAC5C;AAEA,aAAW,OAAO,gBAAgB;AAChC,UAAM,SAAe,QAAgB,GAAG;AACxC,QAAI,OAAO,WAAW,YAAY;AAChC,eAAS,GAAG,IAAI,OAAO,KAAK,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,WAAS,WAAW,QAAQ;AAC5B,WAAS,eAAe,QAAQ;AAChC,WAAS,MAAM,SAAS,IAAI,UAAiC;AAC3D,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AACA,WAAS,SAAS,SAAS,OACzB,UACmB;AACnB,WAAO,SAAS,KAAK,KAAe;AAClC,aAAO,SAAS,GAAG,GAAG;AAAA,IACxB;AAAA,EACF;AACA,WAAS,WAAW,SAAS,SAAS,OAAqB;AACzD,WAAO,CAAC,EACN,SACA,MAAM,mBACN,MAAM,SAAS;AAAA,EAEnB;AACA,WAAS,kBAAkB,SAAS,gBAClC,OACS;AACT,WACE,iBAAiB,qBAAAJ,WACjB,CAAC,EAAE,SAAS,OAAO,UAAU,YAAY,MAAM,oBAAoB;AAAA,EAEvE;AACA,WAAS,gBAAgB,qBAAAA;AACzB,WAAS,WAAW,gBAAAD;AACpB,WAAS,cAAc,mBAAAI;AACvB,WAAS,WAAW,gBAAAD;AACpB,WAAS,qBAAqB,0BAAAD;AAC9B,WAAS,oBAAoB;AAE7B,SAAO;AACT;AAEA,MAAM,WAAW,eAAe,gBAAAI,OAAQ;AAExC,SAAS,OAAO,gBAAwC;AACtD,SAAO,mBAAe,mBAAAF,SAAY,gBAAAE,SAAU,cAAc,CAAC;AAC7D;AAEA,SAAS,SAAS;AAElB,IAAO,cAAQ;","names":["Accessio","AccessioError","InterceptorManager","buildURL","mergeConfig","accessio","defaults"]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var interceptorManager_exports = {};
20
+ __export(interceptorManager_exports, {
21
+ InterceptorManager: () => import_types.InterceptorManager,
22
+ default: () => interceptorManager_default
23
+ });
24
+ module.exports = __toCommonJS(interceptorManager_exports);
25
+ var import_types = require("../types");
26
+ var interceptorManager_default = import_types.InterceptorManager;
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ InterceptorManager
30
+ });
31
+ //# sourceMappingURL=interceptorManager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/interceptors/interceptorManager.ts"],"sourcesContent":["import { InterceptorManager } from '../types';\n\nexport { InterceptorManager };\n\nexport default InterceptorManager;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAmC;AAInC,IAAO,6BAAQ;","names":[]}
package/index.d.ts ADDED
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Accessio HTTP Client — TypeScript Type Definitions
3
+ */
4
+
5
+ /**
6
+ * Avoids ambiguous intersection of Record<string, string> & { common?, get?, ... }
7
+ * which TypeScript accepts but can confuse type consumers.
8
+ */
9
+ export type AccessioHeaders = {
10
+ common?: Record<string, string>;
11
+ get?: Record<string, string>;
12
+ post?: Record<string, string>;
13
+ put?: Record<string, string>;
14
+ patch?: Record<string, string>;
15
+ delete?: Record<string, string>;
16
+ head?: Record<string, string>;
17
+ options?: Record<string, string>;
18
+ /** Any additional custom headers */
19
+ [key: string]: string | number | boolean | Record<string, string> | undefined;
20
+ };
21
+
22
+ export interface AccessioRequestConfig {
23
+ /** Request URL (path or full URL) */
24
+ url?: string;
25
+
26
+ /** HTTP method (default: 'get') */
27
+ method?:
28
+ | "get"
29
+ | "post"
30
+ | "put"
31
+ | "patch"
32
+ | "delete"
33
+ | "head"
34
+ | "options"
35
+ | string;
36
+
37
+ /** Base URL prepended to `url` unless `url` is absolute */
38
+ baseURL?: string;
39
+
40
+ /** Request headers */
41
+ headers?: AccessioHeaders;
42
+
43
+ /** URL query parameters */
44
+ params?: Record<string, any>;
45
+
46
+ /** Custom params serializer function */
47
+ paramsSerializer?: (params: Record<string, any>) => string;
48
+
49
+ /** Request body data */
50
+ data?: any;
51
+
52
+ /** Timeout in milliseconds (0 = no timeout) */
53
+ timeout?: number;
54
+
55
+ /** Include credentials in cross-site requests */
56
+ withCredentials?: boolean;
57
+
58
+ /** Expected response data type */
59
+ responseType?: "json" | "text" | "blob" | "arraybuffer" | "stream";
60
+
61
+ /** Transform functions applied to request data */
62
+ transformRequest?: Array<
63
+ (data: any, headers?: Record<string, string>) => any
64
+ >;
65
+
66
+ /** Transform functions applied to response data */
67
+ transformResponse?: Array<
68
+ (data: any, headers?: Record<string, string>) => any
69
+ >;
70
+
71
+ /** Function to determine if a status code should resolve or reject */
72
+ validateStatus?: (status: number) => boolean;
73
+
74
+ /** AbortSignal for request cancellation */
75
+ signal?: AbortSignal;
76
+
77
+ /** Basic auth credentials */
78
+ auth?: {
79
+ username: string;
80
+ password: string;
81
+ };
82
+
83
+ // ── Retry options ──────────────────────────────────
84
+
85
+ /** Maximum number of retry attempts (0 = no retries, default: 0) */
86
+ retry?: number;
87
+
88
+ /** Base delay in milliseconds for retry backoff (default: 1000) */
89
+ retryDelay?: number;
90
+
91
+ /** Custom condition to decide whether to retry a failed request */
92
+ retryCondition?: (error: AccessioError) => boolean;
93
+
94
+ /** Callback invoked before each retry attempt */
95
+ onRetry?: (
96
+ attempt: number,
97
+ error: AccessioError,
98
+ config: AccessioRequestConfig,
99
+ ) => void;
100
+
101
+ // ── Debug ──────────────────────────────────────────
102
+
103
+ /** Enable debug logging for this request */
104
+ debug?: boolean;
105
+
106
+ // ── Rate Limiting ──────────────────────────────────
107
+
108
+ /** Rate limiter instance to control concurrent requests */
109
+ rateLimiter?: RateLimiter;
110
+
111
+ /** Allow any additional custom properties */
112
+ [key: string]: any;
113
+ }
114
+
115
+ export interface AccessioResponse<T = any> {
116
+ /** Response data (parsed) */
117
+ data: T;
118
+
119
+ /** HTTP status code */
120
+ status: number;
121
+
122
+ /** HTTP status text */
123
+ statusText: string;
124
+
125
+ /** Response headers (lowercased keys) */
126
+ headers: Record<string, string>;
127
+
128
+ /** The config used for this request */
129
+ config: AccessioRequestConfig;
130
+
131
+ /** The underlying request object */
132
+ request: any;
133
+
134
+ /** Request duration in milliseconds */
135
+ duration: number;
136
+ }
137
+
138
+ // ── Class type definitions ────────────────────────────────────
139
+
140
+ export interface AccessioClass {
141
+ new (instanceConfig?: AccessioRequestConfig): {
142
+ defaults: AccessioRequestConfig;
143
+ interceptors: {
144
+ request: InterceptorManager<AccessioRequestConfig>;
145
+ response: InterceptorManager<AccessioResponse>;
146
+ };
147
+ request<T = any>(config: AccessioRequestConfig): Promise<AccessioResponse<T>>;
148
+ request<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
149
+ get<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
150
+ delete<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
151
+ head<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
152
+ options<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
153
+ post<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
154
+ put<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
155
+ patch<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
156
+ postForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
157
+ putForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
158
+ patchForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
159
+ getUri(config: AccessioRequestConfig): string;
160
+ };
161
+ }
162
+
163
+ export interface InterceptorManagerClass {
164
+ new <V>(): InterceptorManager<V>;
165
+ }
166
+
167
+ export interface AccessioError<T = any> extends Error {
168
+ /** Error name (always 'AccessioError') */
169
+ name: "AccessioError";
170
+
171
+ /** Error message */
172
+ message: string;
173
+
174
+ /** Error code (e.g. 'ECONNABORTED', 'ERR_NETWORK') */
175
+ code: string | null;
176
+
177
+ /** The config used for this request */
178
+ config: AccessioRequestConfig | null;
179
+
180
+ /** The underlying request object */
181
+ request: any | null;
182
+
183
+ /** The response object (if available) */
184
+ response: AccessioResponse<T> | null;
185
+
186
+ /** Accessio error flag */
187
+ isAccessioError: boolean;
188
+
189
+ /** Original error that caused this AccessioError (set by AccessioError.from()) */
190
+ cause?: Error;
191
+
192
+ /** JSON representation */
193
+ toJSON(): object;
194
+ }
195
+
196
+ export interface AccessioErrorConstructor {
197
+ new (
198
+ message: string,
199
+ code?: string,
200
+ config?: AccessioRequestConfig,
201
+ request?: any,
202
+ response?: AccessioResponse,
203
+ ): AccessioError;
204
+
205
+ /** Create an AccessioError from an existing Error */
206
+ from(
207
+ error: Error,
208
+ code?: string,
209
+ config?: AccessioRequestConfig,
210
+ request?: any,
211
+ response?: AccessioResponse,
212
+ ): AccessioError;
213
+
214
+ // Error code constants
215
+ ERR_BAD_OPTION_VALUE: string;
216
+ ERR_BAD_OPTION: string;
217
+ ECONNABORTED: string;
218
+ ETIMEDOUT: string;
219
+ ERR_NETWORK: string;
220
+ ERR_FR_TOO_MANY_REDIRECTS: string;
221
+ ERR_BAD_RESPONSE: string;
222
+ ERR_BAD_REQUEST: string;
223
+ ERR_CANCELED: string;
224
+ ERR_NOT_SUPPORT: string;
225
+ ERR_INVALID_URL: string;
226
+ }
227
+
228
+ export interface InterceptorManager<V> {
229
+ /**
230
+ * Register a new interceptor.
231
+ * @returns Interceptor ID for eject()
232
+ */
233
+ use(
234
+ onFulfilled?: ((value: V) => V | Promise<V>) | null,
235
+ onRejected?: ((error: any) => V | Promise<V>) | null,
236
+ options?: {
237
+ synchronous?: boolean;
238
+ runWhen?: (config: AccessioRequestConfig) => boolean;
239
+ },
240
+ ): number;
241
+
242
+ /** Remove an interceptor by its ID */
243
+ eject(id: number): void;
244
+
245
+ /** Remove all interceptors */
246
+ clear(): void;
247
+
248
+ /** Number of active (non-ejected) interceptors */
249
+ readonly size: number;
250
+ }
251
+
252
+ /** Rate limiter instance returned by createRateLimiter() */
253
+ export interface RateLimiter {
254
+ /** Acquire a slot. Resolves immediately if available, otherwise queues. */
255
+ acquire(): Promise<void>;
256
+
257
+ /** Release a slot. Starts the next queued request if any. */
258
+ release(): void;
259
+
260
+ /**
261
+ * Destroy the limiter — rejects all pending queued promises immediately.
262
+ * Any subsequent acquire() calls will also reject.
263
+ * Useful for cleanup on SPA navigation or component unmount.
264
+ */
265
+ destroy(): void;
266
+
267
+ /** Number of requests waiting in the queue */
268
+ readonly pending: number;
269
+
270
+ /** Number of currently active requests */
271
+ readonly active: number;
272
+
273
+ /** Whether the limiter has been destroyed */
274
+ readonly destroyed: boolean;
275
+ }
276
+
277
+ export interface AccessioInstance {
278
+ /** Execute a request with a full config object */
279
+ (config: AccessioRequestConfig): Promise<AccessioResponse>;
280
+
281
+ /** Execute a request with URL + optional config */
282
+ (url: string, config?: AccessioRequestConfig): Promise<AccessioResponse>;
283
+
284
+ /** Instance defaults (mutable) */
285
+ defaults: AccessioRequestConfig;
286
+
287
+ /** Request and response interceptors */
288
+ interceptors: {
289
+ request: InterceptorManager<AccessioRequestConfig>;
290
+ response: InterceptorManager<AccessioResponse>;
291
+ };
292
+
293
+ /** Core request method */
294
+ request<T = any>(config: AccessioRequestConfig): Promise<AccessioResponse<T>>;
295
+ request<T = any>(
296
+ url: string,
297
+ config?: AccessioRequestConfig,
298
+ ): Promise<AccessioResponse<T>>;
299
+
300
+ /** GET request */
301
+ get<T = any>(
302
+ url: string,
303
+ config?: AccessioRequestConfig,
304
+ ): Promise<AccessioResponse<T>>;
305
+
306
+ /** DELETE request */
307
+ delete<T = any>(
308
+ url: string,
309
+ config?: AccessioRequestConfig,
310
+ ): Promise<AccessioResponse<T>>;
311
+
312
+ /** HEAD request */
313
+ head<T = any>(
314
+ url: string,
315
+ config?: AccessioRequestConfig,
316
+ ): Promise<AccessioResponse<T>>;
317
+
318
+ /** OPTIONS request */
319
+ options<T = any>(
320
+ url: string,
321
+ config?: AccessioRequestConfig,
322
+ ): Promise<AccessioResponse<T>>;
323
+
324
+ /** POST request */
325
+ post<T = any>(
326
+ url: string,
327
+ data?: any,
328
+ config?: AccessioRequestConfig,
329
+ ): Promise<AccessioResponse<T>>;
330
+
331
+ /** PUT request */
332
+ put<T = any>(
333
+ url: string,
334
+ data?: any,
335
+ config?: AccessioRequestConfig,
336
+ ): Promise<AccessioResponse<T>>;
337
+
338
+ /** PATCH request */
339
+ patch<T = any>(
340
+ url: string,
341
+ data?: any,
342
+ config?: AccessioRequestConfig,
343
+ ): Promise<AccessioResponse<T>>;
344
+
345
+ /** POST with multipart/form-data */
346
+ postForm<T = any>(
347
+ url: string,
348
+ data?: any,
349
+ config?: AccessioRequestConfig,
350
+ ): Promise<AccessioResponse<T>>;
351
+
352
+ /** PUT with multipart/form-data */
353
+ putForm<T = any>(
354
+ url: string,
355
+ data?: any,
356
+ config?: AccessioRequestConfig,
357
+ ): Promise<AccessioResponse<T>>;
358
+
359
+ /** PATCH with multipart/form-data */
360
+ patchForm<T = any>(
361
+ url: string,
362
+ data?: any,
363
+ config?: AccessioRequestConfig,
364
+ ): Promise<AccessioResponse<T>>;
365
+
366
+ /** Get the built URL for a given config */
367
+ getUri(config: AccessioRequestConfig): string;
368
+
369
+ /** Create a new Accessio instance with custom defaults */
370
+ create(instanceConfig?: AccessioRequestConfig): AccessioInstance;
371
+
372
+ /** Execute multiple concurrent requests */
373
+ all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
374
+
375
+ /** Spread array of responses to individual callback arguments */
376
+ spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
377
+
378
+ /** Check if an error is a cancellation error */
379
+ isCancel(value: any): boolean;
380
+
381
+ /** Check if a value is a AccessioError */
382
+ isAccessioError(value: any): boolean;
383
+
384
+ /** AccessioError class */
385
+ AccessioError: AccessioErrorConstructor;
386
+
387
+ /** Accessio class */
388
+ Accessio: AccessioClass;
389
+
390
+ /** InterceptorManager class */
391
+ InterceptorManager: InterceptorManagerClass;
392
+
393
+ /** Create a rate limiter for concurrent request control */
394
+ createRateLimiter(maxConcurrent?: number): RateLimiter;
395
+
396
+ /** Merge two config objects */
397
+ mergeConfig(
398
+ config1: AccessioRequestConfig,
399
+ config2?: AccessioRequestConfig,
400
+ ): AccessioRequestConfig;
401
+
402
+ /** Build a URL from parts */
403
+ buildURL(
404
+ url: string,
405
+ baseURL?: string,
406
+ params?: Record<string, any>,
407
+ paramsSerializer?: (params: Record<string, any>) => string,
408
+ ): string;
409
+ }
410
+
411
+ /** Default Accessio instance */
412
+ declare const accessio: AccessioInstance;
413
+ export default accessio;
414
+
415
+ // ── Named exports ─────────────────────────────────────────────
416
+ // Note: These are re-exported for convenience. The actual implementations
417
+ // are in src/, but TypeScript resolves these through package.json exports.
418
+
419
+ export interface Accessio {
420
+ defaults: AccessioRequestConfig;
421
+ interceptors: {
422
+ request: InterceptorManager<AccessioRequestConfig>;
423
+ response: InterceptorManager<AccessioResponse>;
424
+ };
425
+ request<T = any>(config: AccessioRequestConfig): Promise<AccessioResponse<T>>;
426
+ request<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
427
+ get<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
428
+ delete<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
429
+ head<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
430
+ options<T = any>(url: string, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
431
+ post<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
432
+ put<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
433
+ patch<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
434
+ postForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
435
+ putForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
436
+ patchForm<T = any>(url: string, data?: any, config?: AccessioRequestConfig): Promise<AccessioResponse<T>>;
437
+ getUri(config: AccessioRequestConfig): string;
438
+ }
439
+
440
+ export declare const Accessio: {
441
+ new (instanceConfig?: AccessioRequestConfig): Accessio;
442
+ };
443
+
444
+ export const AccessioError: AccessioErrorConstructor;
445
+ export const mergeConfig: (config1: AccessioRequestConfig, config2?: AccessioRequestConfig) => AccessioRequestConfig;
446
+ export const buildURL: (url: string, baseURL?: string, params?: Record<string, any>, paramsSerializer?: (params: Record<string, any>) => string) => string;
447
+ export const InterceptorManager: InterceptorManagerClass;
448
+ export const createRateLimiter: (maxConcurrent?: number) => RateLimiter;
449
+
450
+ // ── Debug helper exports ────────────────────────────────────
451
+
452
+ export function logRequest(config: AccessioRequestConfig, fullUrl: string): void;
453
+ export function logResponse(response: AccessioResponse): void;
454
+ export function logError(error: Error, config?: AccessioRequestConfig): void;