aziosxjs 0.4.1 → 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.
- package/LICENSE +21 -0
- package/README.md +92 -267
- package/dist/cache/memoryCache.d.ts +1 -0
- package/dist/cache/memoryCache.js +7 -1
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/core/Azios.d.ts +33 -8
- package/dist/core/Azios.js +68 -2
- package/dist/core/Azios.js.map +1 -1
- package/dist/core/dispatchRequest.js +10 -75
- package/dist/core/dispatchRequest.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/MiddlewarePipeline.d.ts +54 -0
- package/dist/middleware/MiddlewarePipeline.js +122 -0
- package/dist/middleware/MiddlewarePipeline.js.map +1 -0
- package/dist/middleware/compose.d.ts +1 -0
- package/dist/middleware/compose.js +25 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/middlewareManager.d.ts +4 -0
- package/dist/middleware/middlewareManager.js +12 -0
- package/dist/middleware/middlewareManager.js.map +1 -0
- package/dist/plugins/pluginManager.d.ts +44 -0
- package/dist/plugins/pluginManager.js +120 -0
- package/dist/plugins/pluginManager.js.map +1 -0
- package/dist/runtimes/AdapterFactory.d.ts +22 -0
- package/dist/runtimes/AdapterFactory.js +43 -0
- package/dist/runtimes/AdapterFactory.js.map +1 -0
- package/dist/runtimes/HttpAdapter.d.ts +23 -0
- package/dist/runtimes/HttpAdapter.js +10 -0
- package/dist/runtimes/HttpAdapter.js.map +1 -0
- package/dist/runtimes/UniversalHttpAdapter.d.ts +19 -0
- package/dist/runtimes/UniversalHttpAdapter.js +114 -0
- package/dist/runtimes/UniversalHttpAdapter.js.map +1 -0
- package/dist/runtimes/detectRuntime.d.ts +34 -0
- package/dist/runtimes/detectRuntime.js +77 -0
- package/dist/runtimes/detectRuntime.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/middleware.d.ts +16 -0
- package/dist/types/middleware.js +3 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/plugin.d.ts +43 -0
- package/dist/types/plugin.js +3 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/request.d.ts +5 -0
- package/dist/types/response.d.ts +23 -1
- package/package.json +24 -5
- package/src/adapters/httpAdapter.ts +0 -0
- package/src/adapters/index.ts +0 -0
- package/src/adapters/xhrAdapter.ts +0 -0
- package/src/cache/memoryCache.ts +45 -0
- package/src/config/mergeConfig.ts +0 -0
- package/src/core/Azios.ts +184 -0
- package/src/core/createInstance.ts +23 -0
- package/src/core/dispatchRequest.ts +111 -0
- package/src/core/requestMethods.ts +0 -0
- package/src/core/requestStore.ts +13 -0
- package/src/errors/AziosError.ts +26 -0
- package/src/helpers/buildURL.ts +44 -0
- package/src/helpers/normalizeHeaders.ts +0 -0
- package/src/helpers/parseHeaders.ts +0 -0
- package/src/index.ts +64 -0
- package/src/interceptors/InterceptorManager.ts +30 -0
- package/src/middleware/MiddlewarePipeline.ts +155 -0
- package/src/middleware/compose.ts +33 -0
- package/src/middleware/middlewareManager.ts +9 -0
- package/src/plugins/pluginManager.ts +143 -0
- package/src/rateLimiter/rateLimiter.ts +36 -0
- package/src/runtimes/AdapterFactory.ts +46 -0
- package/src/runtimes/HttpAdapter.ts +26 -0
- package/src/runtimes/UniversalHttpAdapter.ts +136 -0
- package/src/runtimes/detectRuntime.ts +85 -0
- package/src/types/config.ts +30 -0
- package/src/types/index.ts +5 -0
- package/src/types/middleware.ts +21 -0
- package/src/types/plugin.ts +50 -0
- package/src/types/request.ts +39 -0
- package/src/types/response.ts +37 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AdapterFactory = void 0;
|
|
7
|
+
const detectRuntime_1 = require("./detectRuntime");
|
|
8
|
+
const UniversalHttpAdapter_1 = __importDefault(require("./UniversalHttpAdapter"));
|
|
9
|
+
/**
|
|
10
|
+
* Adapter factory for selecting the appropriate HTTP adapter
|
|
11
|
+
* Uses universal Fetch API when available with fallbacks for specific runtimes
|
|
12
|
+
*/
|
|
13
|
+
class AdapterFactory {
|
|
14
|
+
/**
|
|
15
|
+
* Get or create adapter for current runtime
|
|
16
|
+
*/
|
|
17
|
+
static getAdapter() {
|
|
18
|
+
if (!this.adapters.has(detectRuntime_1.currentRuntime)) {
|
|
19
|
+
this.adapters.set(detectRuntime_1.currentRuntime, new UniversalHttpAdapter_1.default());
|
|
20
|
+
}
|
|
21
|
+
const adapter = this.adapters.get(detectRuntime_1.currentRuntime);
|
|
22
|
+
if (!adapter.isSupported()) {
|
|
23
|
+
throw new Error(`No supported HTTP adapter found for runtime: ${detectRuntime_1.currentRuntime}`);
|
|
24
|
+
}
|
|
25
|
+
return adapter;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Register custom adapter for specific runtime
|
|
29
|
+
*/
|
|
30
|
+
static registerAdapter(runtime, adapter) {
|
|
31
|
+
this.adapters.set(runtime, adapter);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Clear adapter cache
|
|
35
|
+
*/
|
|
36
|
+
static clearCache() {
|
|
37
|
+
this.adapters.clear();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.AdapterFactory = AdapterFactory;
|
|
41
|
+
AdapterFactory.adapters = new Map();
|
|
42
|
+
exports.default = AdapterFactory;
|
|
43
|
+
//# sourceMappingURL=AdapterFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdapterFactory.js","sourceRoot":"","sources":["../../src/runtimes/AdapterFactory.ts"],"names":[],"mappings":";;;;;;AACA,mDAA6D;AAC7D,kFAAyD;AAEzD;;;GAGG;AACH,MAAa,cAAc;IAGzB;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,8BAAc,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,8BAAc,EAAE,IAAI,8BAAoB,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,8BAAc,CAAE,CAAA;QAElD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,gDAAgD,8BAAc,EAAE,CACjE,CAAA;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAoB,EAAE,OAAoB;QAC/D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;;AAlCH,wCAmCC;AAlCgB,uBAAQ,GAAkC,IAAI,GAAG,EAAE,CAAA;AAoCpE,kBAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AziosRequestConfig } from '../types/config';
|
|
2
|
+
import type { AziosResponse } from '../types/response';
|
|
3
|
+
/**
|
|
4
|
+
* Universal HTTP adapter interface
|
|
5
|
+
* Abstracts HTTP functionality across different runtimes
|
|
6
|
+
*/
|
|
7
|
+
export interface HttpAdapter {
|
|
8
|
+
/**
|
|
9
|
+
* Execute an HTTP request
|
|
10
|
+
*/
|
|
11
|
+
request(config: AziosRequestConfig): Promise<AziosResponse>;
|
|
12
|
+
/**
|
|
13
|
+
* Method to check if adapter supports the current runtime
|
|
14
|
+
*/
|
|
15
|
+
isSupported(): boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Base adapter class with common logic
|
|
19
|
+
*/
|
|
20
|
+
export declare abstract class BaseAdapter implements HttpAdapter {
|
|
21
|
+
abstract request(config: AziosRequestConfig): Promise<AziosResponse>;
|
|
22
|
+
abstract isSupported(): boolean;
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base adapter class with common logic
|
|
6
|
+
*/
|
|
7
|
+
class BaseAdapter {
|
|
8
|
+
}
|
|
9
|
+
exports.BaseAdapter = BaseAdapter;
|
|
10
|
+
//# sourceMappingURL=HttpAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpAdapter.js","sourceRoot":"","sources":["../../src/runtimes/HttpAdapter.ts"],"names":[],"mappings":";;;AAmBA;;GAEG;AACH,MAAsB,WAAW;CAGhC;AAHD,kCAGC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AziosRequestConfig } from '../types/config';
|
|
2
|
+
import type { AziosResponse } from '../types/response';
|
|
3
|
+
import { BaseAdapter } from './HttpAdapter';
|
|
4
|
+
/**
|
|
5
|
+
* Unified HTTP adapter using Fetch API
|
|
6
|
+
* Works across Node 18+, browsers, Bun, Deno, and edge runtimes
|
|
7
|
+
* Falls back to runtime-specific implementations if needed
|
|
8
|
+
*/
|
|
9
|
+
export declare class UniversalHttpAdapter extends BaseAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Check if Fetch API is available
|
|
12
|
+
*/
|
|
13
|
+
isSupported(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Execute HTTP request using Fetch API
|
|
16
|
+
*/
|
|
17
|
+
request(config: AziosRequestConfig): Promise<AziosResponse>;
|
|
18
|
+
}
|
|
19
|
+
export default UniversalHttpAdapter;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.UniversalHttpAdapter = void 0;
|
|
7
|
+
const HttpAdapter_1 = require("./HttpAdapter");
|
|
8
|
+
const AziosError_1 = __importDefault(require("../errors/AziosError"));
|
|
9
|
+
/**
|
|
10
|
+
* Unified HTTP adapter using Fetch API
|
|
11
|
+
* Works across Node 18+, browsers, Bun, Deno, and edge runtimes
|
|
12
|
+
* Falls back to runtime-specific implementations if needed
|
|
13
|
+
*/
|
|
14
|
+
class UniversalHttpAdapter extends HttpAdapter_1.BaseAdapter {
|
|
15
|
+
/**
|
|
16
|
+
* Check if Fetch API is available
|
|
17
|
+
*/
|
|
18
|
+
isSupported() {
|
|
19
|
+
return typeof fetch !== 'undefined';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute HTTP request using Fetch API
|
|
23
|
+
*/
|
|
24
|
+
async request(config) {
|
|
25
|
+
if (!this.isSupported()) {
|
|
26
|
+
throw new AziosError_1.default('Fetch API is not available in this runtime', 'UNSUPPORTED_RUNTIME', config);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const { url, method = 'GET', headers, data, timeout, signal } = config;
|
|
30
|
+
const baseURL = config.baseURL ? config.baseURL : '';
|
|
31
|
+
const fullURL = new URL(baseURL + url);
|
|
32
|
+
// Add query parameters
|
|
33
|
+
if (config.params) {
|
|
34
|
+
Object.entries(config.params).forEach(([key, value]) => {
|
|
35
|
+
if (value !== null && value !== undefined) {
|
|
36
|
+
if (Array.isArray(value)) {
|
|
37
|
+
value.forEach(v => fullURL.searchParams.append(key, String(v)));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
fullURL.searchParams.set(key, String(value));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Prepare request body
|
|
46
|
+
let body = null;
|
|
47
|
+
if (data) {
|
|
48
|
+
body = typeof data === 'string' ? data : JSON.stringify(data);
|
|
49
|
+
}
|
|
50
|
+
// Set up timeout if specified (using AbortController)
|
|
51
|
+
let timeoutId;
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const finalSignal = signal || controller.signal;
|
|
54
|
+
if (timeout) {
|
|
55
|
+
timeoutId = setTimeout(() => {
|
|
56
|
+
controller.abort();
|
|
57
|
+
}, timeout);
|
|
58
|
+
}
|
|
59
|
+
// Execute fetch
|
|
60
|
+
const response = await fetch(fullURL.toString(), {
|
|
61
|
+
method,
|
|
62
|
+
headers: {
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
...headers
|
|
65
|
+
},
|
|
66
|
+
body,
|
|
67
|
+
signal: finalSignal
|
|
68
|
+
});
|
|
69
|
+
if (timeoutId) {
|
|
70
|
+
clearTimeout(timeoutId);
|
|
71
|
+
}
|
|
72
|
+
// Parse response body
|
|
73
|
+
let responseData;
|
|
74
|
+
if (response.status === 204) {
|
|
75
|
+
// No content
|
|
76
|
+
responseData = null;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const contentType = response.headers.get('content-type');
|
|
80
|
+
if (contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json')) {
|
|
81
|
+
try {
|
|
82
|
+
responseData = await response.json();
|
|
83
|
+
}
|
|
84
|
+
catch (_a) {
|
|
85
|
+
responseData = await response.text();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
responseData = await response.text();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const aziosResponse = {
|
|
93
|
+
data: responseData,
|
|
94
|
+
status: response.status,
|
|
95
|
+
statusText: response.statusText,
|
|
96
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
97
|
+
config
|
|
98
|
+
};
|
|
99
|
+
return aziosResponse;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (err instanceof TypeError && err.message.includes('aborted')) {
|
|
103
|
+
throw new AziosError_1.default('Request aborted', 'ABORTED', config);
|
|
104
|
+
}
|
|
105
|
+
if (err instanceof AziosError_1.default) {
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
throw new AziosError_1.default(err instanceof Error ? err.message : 'Network request failed', 'NETWORK_ERROR', config, undefined, err instanceof Error ? err : new Error(String(err)));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.UniversalHttpAdapter = UniversalHttpAdapter;
|
|
113
|
+
exports.default = UniversalHttpAdapter;
|
|
114
|
+
//# sourceMappingURL=UniversalHttpAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniversalHttpAdapter.js","sourceRoot":"","sources":["../../src/runtimes/UniversalHttpAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection utilities
|
|
3
|
+
* Identifies the current JavaScript runtime environment
|
|
4
|
+
* Supports: Node.js, Browser, Bun, Deno, Cloudflare Workers/Edge
|
|
5
|
+
*/
|
|
6
|
+
export declare enum RuntimeType {
|
|
7
|
+
Node = "node",
|
|
8
|
+
Browser = "browser",
|
|
9
|
+
Bun = "bun",
|
|
10
|
+
Deno = "deno",
|
|
11
|
+
Edge = "edge",
|
|
12
|
+
Unknown = "unknown"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detects the current runtime environment
|
|
16
|
+
* Production-grade detection with reliable environment checks
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectRuntime(): RuntimeType;
|
|
19
|
+
/**
|
|
20
|
+
* Get current runtime for use in adapters
|
|
21
|
+
*/
|
|
22
|
+
export declare const currentRuntime: RuntimeType;
|
|
23
|
+
/**
|
|
24
|
+
* Check if running in a specific runtime
|
|
25
|
+
*/
|
|
26
|
+
export declare function isRuntime(runtime: RuntimeType): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if running in server-side runtime
|
|
29
|
+
*/
|
|
30
|
+
export declare function isServerRuntime(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if running in browser runtime
|
|
33
|
+
*/
|
|
34
|
+
export declare function isBrowserRuntime(): boolean;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Runtime detection utilities
|
|
4
|
+
* Identifies the current JavaScript runtime environment
|
|
5
|
+
* Supports: Node.js, Browser, Bun, Deno, Cloudflare Workers/Edge
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.currentRuntime = exports.RuntimeType = void 0;
|
|
9
|
+
exports.detectRuntime = detectRuntime;
|
|
10
|
+
exports.isRuntime = isRuntime;
|
|
11
|
+
exports.isServerRuntime = isServerRuntime;
|
|
12
|
+
exports.isBrowserRuntime = isBrowserRuntime;
|
|
13
|
+
var RuntimeType;
|
|
14
|
+
(function (RuntimeType) {
|
|
15
|
+
RuntimeType["Node"] = "node";
|
|
16
|
+
RuntimeType["Browser"] = "browser";
|
|
17
|
+
RuntimeType["Bun"] = "bun";
|
|
18
|
+
RuntimeType["Deno"] = "deno";
|
|
19
|
+
RuntimeType["Edge"] = "edge";
|
|
20
|
+
RuntimeType["Unknown"] = "unknown";
|
|
21
|
+
})(RuntimeType || (exports.RuntimeType = RuntimeType = {}));
|
|
22
|
+
/**
|
|
23
|
+
* Detects the current runtime environment
|
|
24
|
+
* Production-grade detection with reliable environment checks
|
|
25
|
+
*/
|
|
26
|
+
function detectRuntime() {
|
|
27
|
+
// Check for Deno
|
|
28
|
+
if (typeof globalThis.Deno !== 'undefined') {
|
|
29
|
+
return RuntimeType.Deno;
|
|
30
|
+
}
|
|
31
|
+
// Check for Bun
|
|
32
|
+
if (typeof globalThis.Bun !== 'undefined') {
|
|
33
|
+
return RuntimeType.Bun;
|
|
34
|
+
}
|
|
35
|
+
// Check for Cloudflare Workers / Edge
|
|
36
|
+
if (typeof globalThis.caches !== 'undefined' &&
|
|
37
|
+
typeof globalThis.ENVIRONMENT !== 'undefined') {
|
|
38
|
+
return RuntimeType.Edge;
|
|
39
|
+
}
|
|
40
|
+
// Check for Node.js
|
|
41
|
+
if (typeof process !== 'undefined' &&
|
|
42
|
+
process.versions &&
|
|
43
|
+
process.versions.node) {
|
|
44
|
+
return RuntimeType.Node;
|
|
45
|
+
}
|
|
46
|
+
// Check for Browser
|
|
47
|
+
if (typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined') {
|
|
48
|
+
return RuntimeType.Browser;
|
|
49
|
+
}
|
|
50
|
+
return RuntimeType.Unknown;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get current runtime for use in adapters
|
|
54
|
+
*/
|
|
55
|
+
exports.currentRuntime = detectRuntime();
|
|
56
|
+
/**
|
|
57
|
+
* Check if running in a specific runtime
|
|
58
|
+
*/
|
|
59
|
+
function isRuntime(runtime) {
|
|
60
|
+
return exports.currentRuntime === runtime;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if running in server-side runtime
|
|
64
|
+
*/
|
|
65
|
+
function isServerRuntime() {
|
|
66
|
+
return (exports.currentRuntime === RuntimeType.Node ||
|
|
67
|
+
exports.currentRuntime === RuntimeType.Bun ||
|
|
68
|
+
exports.currentRuntime === RuntimeType.Deno ||
|
|
69
|
+
exports.currentRuntime === RuntimeType.Edge);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if running in browser runtime
|
|
73
|
+
*/
|
|
74
|
+
function isBrowserRuntime() {
|
|
75
|
+
return exports.currentRuntime === RuntimeType.Browser;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=detectRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectRuntime.js","sourceRoot":"","sources":["../../src/runtimes/detectRuntime.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAeH,sCAkCC;AAUD,8BAEC;AAKD,0CAOC;AAKD,4CAEC;AA9ED,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,kCAAmB,CAAA;IACnB,0BAAW,CAAA;IACX,4BAAa,CAAA;IACb,4BAAa,CAAA;IACb,kCAAmB,CAAA;AACrB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,iBAAiB;IACjB,IAAI,OAAQ,UAAkB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpD,OAAO,WAAW,CAAC,IAAI,CAAA;IACzB,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAQ,UAAkB,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QACnD,OAAO,WAAW,CAAC,GAAG,CAAA;IACxB,CAAC;IAED,sCAAsC;IACtC,IACE,OAAQ,UAAkB,CAAC,MAAM,KAAK,WAAW;QACjD,OAAQ,UAAkB,CAAC,WAAW,KAAK,WAAW,EACtD,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAA;IACzB,CAAC;IAED,oBAAoB;IACpB,IACE,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,QAAQ,CAAC,IAAI,EACrB,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAA;IACzB,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAQ,UAAkB,CAAC,MAAM,KAAK,WAAW,IAAI,OAAQ,UAAkB,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7G,OAAO,WAAW,CAAC,OAAO,CAAA;IAC5B,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAA;AAC5B,CAAC;AAED;;GAEG;AACU,QAAA,cAAc,GAAG,aAAa,EAAE,CAAA;AAE7C;;GAEG;AACH,SAAgB,SAAS,CAAC,OAAoB;IAC5C,OAAO,sBAAc,KAAK,OAAO,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe;IAC7B,OAAO,CACL,sBAAc,KAAK,WAAW,CAAC,IAAI;QACnC,sBAAc,KAAK,WAAW,CAAC,GAAG;QAClC,sBAAc,KAAK,WAAW,CAAC,IAAI;QACnC,sBAAc,KAAK,WAAW,CAAC,IAAI,CACpC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,sBAAc,KAAK,WAAW,CAAC,OAAO,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./config"), exports);
|
|
18
|
+
__exportStar(require("./request"), exports);
|
|
19
|
+
__exportStar(require("./response"), exports);
|
|
20
|
+
__exportStar(require("./plugin"), exports);
|
|
21
|
+
__exportStar(require("./middleware"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,4CAAyB;AACzB,6CAA0B;AAC1B,2CAAwB;AACxB,+CAA4B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AziosRequestConfig } from './config';
|
|
2
|
+
import { AziosResponse } from './response';
|
|
3
|
+
/**
|
|
4
|
+
* Middleware function type for request/response processing
|
|
5
|
+
* Koa-style middleware pattern that receives context and next function
|
|
6
|
+
*/
|
|
7
|
+
export type AziosMiddleware = (config: AziosRequestConfig, next: (cfg?: AziosRequestConfig) => Promise<AziosResponse>) => Promise<AziosResponse>;
|
|
8
|
+
/**
|
|
9
|
+
* Middleware context for tracking state across pipeline
|
|
10
|
+
*/
|
|
11
|
+
export interface MiddlewareContext {
|
|
12
|
+
startTime?: number;
|
|
13
|
+
endTime?: number;
|
|
14
|
+
config: AziosRequestConfig;
|
|
15
|
+
metadata?: Record<string, any>;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/types/middleware.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AziosRequestConfig } from './config';
|
|
2
|
+
import { AziosResponse } from './response';
|
|
3
|
+
import type { AziosInstance } from './request';
|
|
4
|
+
/**
|
|
5
|
+
* Plugin lifecycle hooks
|
|
6
|
+
* Allows plugins to inject behavior at various stages of the request/response pipeline
|
|
7
|
+
*/
|
|
8
|
+
export interface PluginHooks {
|
|
9
|
+
/**
|
|
10
|
+
* Called when plugin is installed
|
|
11
|
+
*/
|
|
12
|
+
onInstall?(instance: AziosInstance): void | Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Called before request is sent
|
|
15
|
+
*/
|
|
16
|
+
beforeRequest?(config: AziosRequestConfig): AziosRequestConfig | Promise<AziosRequestConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* Called after response is received
|
|
19
|
+
*/
|
|
20
|
+
afterResponse?(response: AziosResponse): AziosResponse | Promise<AziosResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Called when an error occurs
|
|
23
|
+
*/
|
|
24
|
+
onError?(error: Error): Error | Promise<Error>;
|
|
25
|
+
/**
|
|
26
|
+
* Called when plugin is uninstalled
|
|
27
|
+
*/
|
|
28
|
+
onUninstall?(instance: AziosInstance): void | Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Plugin definition with metadata
|
|
32
|
+
*/
|
|
33
|
+
export interface AziosPlugin {
|
|
34
|
+
name: string;
|
|
35
|
+
version?: string;
|
|
36
|
+
hooks: PluginHooks;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Plugin registry to track installed plugins
|
|
40
|
+
*/
|
|
41
|
+
export interface PluginRegistry {
|
|
42
|
+
[key: string]: AziosPlugin;
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":""}
|
package/dist/types/request.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { AziosRequestConfig } from "./config";
|
|
2
2
|
import { AziosResponse } from "./response";
|
|
3
3
|
import InterceptorManager from "../interceptors/InterceptorManager";
|
|
4
|
+
import type { AziosPlugin } from "./plugin";
|
|
5
|
+
import type { AziosMiddleware } from "./middleware";
|
|
4
6
|
export interface AziosInstance {
|
|
5
7
|
(config: AziosRequestConfig): Promise<AziosResponse>;
|
|
6
8
|
request(config: AziosRequestConfig): Promise<AziosResponse>;
|
|
@@ -15,4 +17,7 @@ export interface AziosInstance {
|
|
|
15
17
|
request: InterceptorManager<AziosRequestConfig>;
|
|
16
18
|
response: InterceptorManager<AziosResponse>;
|
|
17
19
|
};
|
|
20
|
+
installPlugin(plugin: AziosPlugin): Promise<void>;
|
|
21
|
+
uninstallPlugin(name: string): Promise<void>;
|
|
22
|
+
use(middleware: AziosMiddleware): void;
|
|
18
23
|
}
|
package/dist/types/response.d.ts
CHANGED
|
@@ -1,9 +1,31 @@
|
|
|
1
1
|
import { AziosRequestConfig } from "./config";
|
|
2
|
+
/**
|
|
3
|
+
* Azios HTTP response object
|
|
4
|
+
* Returned by all request methods
|
|
5
|
+
*/
|
|
2
6
|
export interface AziosResponse<T = any> {
|
|
7
|
+
/**
|
|
8
|
+
* Response data (parsed if JSON)
|
|
9
|
+
*/
|
|
3
10
|
data: T;
|
|
11
|
+
/**
|
|
12
|
+
* HTTP status code
|
|
13
|
+
*/
|
|
4
14
|
status: number;
|
|
15
|
+
/**
|
|
16
|
+
* HTTP status text
|
|
17
|
+
*/
|
|
5
18
|
statusText: string;
|
|
6
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Response headers
|
|
21
|
+
*/
|
|
22
|
+
headers: Record<string, any>;
|
|
23
|
+
/**
|
|
24
|
+
* Original request config
|
|
25
|
+
*/
|
|
7
26
|
config: AziosRequestConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Native request object (if available)
|
|
29
|
+
*/
|
|
8
30
|
request?: any;
|
|
9
31
|
}
|
package/package.json
CHANGED
|
@@ -1,21 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aziosxjs",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Lightweight HTTP client
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Lightweight, predictable HTTP client with plugins, middleware, and universal runtime support",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build": "tsc"
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "ts-node tests/all.test.ts",
|
|
10
|
+
"test:sprint1": "ts-node examples/sprint2.ts",
|
|
11
|
+
"test:sprint2": "ts-node examples/sprint2.ts",
|
|
12
|
+
"test:sprint3": "ts-node examples/sprint3.ts",
|
|
13
|
+
"test:sprint4": "ts-node examples/sprint4.ts",
|
|
14
|
+
"test:sprint5:plugins": "ts-node examples/sprint5-plugins.ts",
|
|
15
|
+
"test:sprint5:middleware": "ts-node examples/sprint5-middleware.ts",
|
|
16
|
+
"test:sprint7": "ts-node examples/sprint7-universal.ts",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
9
18
|
},
|
|
10
19
|
"files": [
|
|
11
|
-
"dist"
|
|
20
|
+
"dist",
|
|
21
|
+
"src"
|
|
12
22
|
],
|
|
13
23
|
"keywords": [
|
|
14
24
|
"http",
|
|
15
25
|
"client",
|
|
16
26
|
"axios",
|
|
17
27
|
"request",
|
|
18
|
-
"nodejs"
|
|
28
|
+
"nodejs",
|
|
29
|
+
"browser",
|
|
30
|
+
"universal",
|
|
31
|
+
"plugin",
|
|
32
|
+
"middleware",
|
|
33
|
+
"lightweight",
|
|
34
|
+
"typescript"
|
|
19
35
|
],
|
|
20
36
|
"author": "Azeem Ali",
|
|
21
37
|
"license": "MIT",
|
|
@@ -26,5 +42,8 @@
|
|
|
26
42
|
"homepage": "https://github.com/azeemali2001/azios",
|
|
27
43
|
"bugs": {
|
|
28
44
|
"url": "https://github.com/azeemali2001/azios/issues"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"typescript": "^5.0.0"
|
|
29
48
|
}
|
|
30
49
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
type CacheEntry = {
|
|
2
|
+
data: any
|
|
3
|
+
expiry: number
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const cache = new Map<string, CacheEntry>()
|
|
7
|
+
|
|
8
|
+
export function getCache(key: string) {
|
|
9
|
+
|
|
10
|
+
const entry = cache.get(key)
|
|
11
|
+
|
|
12
|
+
if (!entry) return null
|
|
13
|
+
|
|
14
|
+
// remove expired cache
|
|
15
|
+
if (Date.now() > entry.expiry) {
|
|
16
|
+
cache.delete(key)
|
|
17
|
+
return null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return entry.data
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function setCache(
|
|
25
|
+
key: string,
|
|
26
|
+
value: any,
|
|
27
|
+
ttl: number = 5000
|
|
28
|
+
) {
|
|
29
|
+
|
|
30
|
+
const expiry = Date.now() + ttl
|
|
31
|
+
|
|
32
|
+
cache.set(key, {
|
|
33
|
+
data: value,
|
|
34
|
+
expiry
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function clearCache(key: string) {
|
|
40
|
+
cache.delete(key)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function clearAllCache() {
|
|
44
|
+
cache.clear()
|
|
45
|
+
}
|
|
File without changes
|