create-request 0.0.1-beta.22 → 0.0.1-beta.24

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.
@@ -6,79 +6,86 @@ import { HttpMethod } from "./enums.js";
6
6
  * Used for retrieving data from an API endpoint.
7
7
  *
8
8
  * @example
9
- * const request = new GetRequest()
10
- * .withQueryParams({ id: '123' })
11
- * .sendTo('/api/users');
9
+ * const request = new GetRequest('/api/users')
10
+ * .withQueryParams({ id: '123' });
11
+ * const data = await request.getData();
12
12
  */
13
13
  export declare class GetRequest extends BaseRequest {
14
14
  protected method: HttpMethod;
15
+ constructor(url: string);
15
16
  }
16
17
  /**
17
18
  * HTTP HEAD request implementation
18
19
  * Similar to GET but returns only headers without a response body.
19
20
  *
20
21
  * @example
21
- * const request = new HeadRequest()
22
- * .sendTo('/api/users/123');
22
+ * const request = new HeadRequest('/api/users/123');
23
+ * const response = await request.getResponse();
23
24
  */
24
25
  export declare class HeadRequest extends BaseRequest {
25
26
  protected method: HttpMethod;
27
+ constructor(url: string);
26
28
  }
27
29
  /**
28
30
  * HTTP OPTIONS request implementation
29
31
  * Used to describe the communication options for the target resource.
30
32
  *
31
33
  * @example
32
- * const request = new OptionsRequest()
33
- * .sendTo('/api/users');
34
+ * const request = new OptionsRequest('/api/users');
35
+ * const response = await request.getResponse();
34
36
  */
35
37
  export declare class OptionsRequest extends BaseRequest {
36
38
  protected method: HttpMethod;
39
+ constructor(url: string);
37
40
  }
38
41
  /**
39
42
  * HTTP DELETE request implementation
40
43
  * Used to delete a resource on the server.
41
44
  *
42
45
  * @example
43
- * const request = new DeleteRequest()
44
- * .sendTo('/api/users/123');
46
+ * const request = new DeleteRequest('/api/users/123');
47
+ * await request.getData();
45
48
  */
46
49
  export declare class DeleteRequest extends BaseRequest {
47
50
  protected method: HttpMethod;
51
+ constructor(url: string);
48
52
  }
49
53
  /**
50
54
  * HTTP POST request implementation
51
55
  * Used to create a new resource or submit data for processing.
52
56
  *
53
57
  * @example
54
- * const request = new PostRequest()
55
- * .withJson({ name: 'John', email: 'john@example.com' })
56
- * .sendTo('/api/users');
58
+ * const request = new PostRequest('/api/users')
59
+ * .withJson({ name: 'John', email: 'john@example.com' });
60
+ * const data = await request.getData();
57
61
  */
58
62
  export declare class PostRequest extends BodyRequest {
59
63
  protected method: HttpMethod;
64
+ constructor(url: string);
60
65
  }
61
66
  /**
62
67
  * HTTP PUT request implementation
63
68
  * Used to replace or update an existing resource.
64
69
  *
65
70
  * @example
66
- * const request = new PutRequest()
67
- * .withJson({ id: '123', name: 'John', email: 'john@example.com' })
68
- * .sendTo('/api/users/123');
71
+ * const request = new PutRequest('/api/users/123')
72
+ * .withJson({ id: '123', name: 'John', email: 'john@example.com' });
73
+ * const data = await request.getData();
69
74
  */
70
75
  export declare class PutRequest extends BodyRequest {
71
76
  protected method: HttpMethod;
77
+ constructor(url: string);
72
78
  }
73
79
  /**
74
80
  * HTTP PATCH request implementation
75
81
  * Used to apply partial modifications to a resource.
76
82
  *
77
83
  * @example
78
- * const request = new PatchRequest()
79
- * .withJson({ email: 'new.email@example.com' })
80
- * .sendTo('/api/users/123');
84
+ * const request = new PatchRequest('/api/users/123')
85
+ * .withJson({ email: 'new.email@example.com' });
86
+ * const data = await request.getData();
81
87
  */
82
88
  export declare class PatchRequest extends BodyRequest {
83
89
  protected method: HttpMethod;
90
+ constructor(url: string);
84
91
  }
@@ -1,10 +1,49 @@
1
- import { HttpMethod, RequestPriority, CredentialsPolicy, RequestMode, RedirectMode, CacheMode, SameSitePolicy } from "./enums";
1
+ import { HttpMethod, RequestPriority, CredentialsPolicy, RequestMode, RedirectMode, SameSitePolicy } from "./enums";
2
2
  import type { RequestError } from "./RequestError.js";
3
+ import type { ResponseWrapper } from "./ResponseWrapper.js";
3
4
  export type Body = null | Blob | string | object | FormData | ArrayBuffer | URLSearchParams | ReadableStream;
4
5
  export type RetryCallback = (options: {
5
6
  attempt: number;
6
7
  error: RequestError;
7
8
  }) => void | Promise<void>;
9
+ /**
10
+ * Configuration object passed to request interceptors
11
+ * Contains all the information needed to make the request
12
+ */
13
+ export interface RequestConfig {
14
+ url: string;
15
+ method: string;
16
+ headers: Record<string, string>;
17
+ body?: Body;
18
+ signal?: AbortSignal;
19
+ credentials?: RequestCredentials;
20
+ mode?: RequestMode | string;
21
+ redirect?: RedirectMode | string;
22
+ referrer?: string;
23
+ referrerPolicy?: ReferrerPolicy;
24
+ keepalive?: boolean;
25
+ priority?: RequestPriority | string;
26
+ }
27
+ /**
28
+ * Request interceptor that can modify the request configuration or return an early response
29
+ * If it returns a Response, the request will be short-circuited and that response will be used
30
+ * @param config - The request configuration
31
+ * @returns Modified config, a Response to short-circuit, or a Promise of either
32
+ */
33
+ export type RequestInterceptor = (config: RequestConfig) => RequestConfig | Response | Promise<RequestConfig | Response>;
34
+ /**
35
+ * Response interceptor that can transform the response
36
+ * @param response - The response wrapper
37
+ * @returns Modified response wrapper or a Promise of it
38
+ */
39
+ export type ResponseInterceptor = (response: ResponseWrapper) => ResponseWrapper | Promise<ResponseWrapper>;
40
+ /**
41
+ * Error interceptor that can handle or transform errors
42
+ * Can return a ResponseWrapper to recover from the error
43
+ * @param error - The error that occurred
44
+ * @returns Modified error, a ResponseWrapper to recover, or a Promise of either
45
+ */
46
+ export type ErrorInterceptor = (error: RequestError) => RequestError | ResponseWrapper | Promise<RequestError | ResponseWrapper>;
8
47
  export interface CookieOptions {
9
48
  value: string;
10
49
  secure?: boolean;
@@ -16,12 +55,12 @@ export interface CookieOptions {
16
55
  maxAge?: number;
17
56
  }
18
57
  export type CookiesRecord = Record<string, string | CookieOptions>;
19
- export { CacheMode, HttpMethod, RequestMode, RedirectMode, SameSitePolicy, RequestPriority, CredentialsPolicy };
20
- export interface RequestOptions extends Omit<RequestInit, "signal" | "body" | "method" | "credentials" | "mode" | "redirect" | "cache" | "priority"> {
58
+ export { HttpMethod, RequestMode, RedirectMode, SameSitePolicy, RequestPriority, CredentialsPolicy };
59
+ export interface RequestOptions extends Omit<RequestInit, "signal" | "body" | "method" | "credentials" | "mode" | "redirect" | "priority"> {
21
60
  timeout?: number;
22
61
  retries?: number;
23
62
  onRetry?: RetryCallback;
24
- body?: any;
63
+ body?: Body;
25
64
  credentials?: CredentialsPolicy | RequestCredentials;
26
65
  mode?: RequestMode;
27
66
  redirect?: RedirectMode | RequestRedirect;
@@ -1,3 +1,4 @@
1
+ import type { RequestInterceptor, ResponseInterceptor, ErrorInterceptor } from "../types.js";
1
2
  /**
2
3
  * Global configuration for create-request
3
4
  */
@@ -9,6 +10,10 @@ export declare class Config {
9
10
  private csrfToken;
10
11
  private enableAutoXsrf;
11
12
  private enableAntiCsrf;
13
+ private requestInterceptors;
14
+ private responseInterceptors;
15
+ private errorInterceptors;
16
+ private nextInterceptorId;
12
17
  private constructor();
13
18
  /**
14
19
  * Get the singleton instance of the Config class
@@ -113,6 +118,97 @@ export declare class Config {
113
118
  * @returns True if anti-CSRF protection is enabled
114
119
  */
115
120
  isAntiCsrfEnabled(): boolean;
121
+ /**
122
+ * Add a global request interceptor
123
+ * Request interceptors can modify the request configuration or return an early response
124
+ *
125
+ * @param interceptor - The request interceptor function
126
+ * @returns The interceptor ID for later removal
127
+ *
128
+ * @example
129
+ * const id = Config.getInstance().addRequestInterceptor((config) => {
130
+ * config.headers['X-Custom'] = 'value';
131
+ * return config;
132
+ * });
133
+ */
134
+ addRequestInterceptor(interceptor: RequestInterceptor): number;
135
+ /**
136
+ * Add a global response interceptor
137
+ * Response interceptors can transform the response
138
+ *
139
+ * @param interceptor - The response interceptor function
140
+ * @returns The interceptor ID for later removal
141
+ *
142
+ * @example
143
+ * const id = Config.getInstance().addResponseInterceptor((response) => {
144
+ * console.log('Response received:', response.status);
145
+ * return response;
146
+ * });
147
+ */
148
+ addResponseInterceptor(interceptor: ResponseInterceptor): number;
149
+ /**
150
+ * Add a global error interceptor
151
+ * Error interceptors can handle or transform errors
152
+ *
153
+ * @param interceptor - The error interceptor function
154
+ * @returns The interceptor ID for later removal
155
+ *
156
+ * @example
157
+ * const id = Config.getInstance().addErrorInterceptor((error) => {
158
+ * console.error('Request failed:', error);
159
+ * throw error;
160
+ * });
161
+ */
162
+ addErrorInterceptor(interceptor: ErrorInterceptor): number;
163
+ /**
164
+ * Remove a request interceptor by its ID
165
+ *
166
+ * @param id - The interceptor ID returned from addRequestInterceptor
167
+ *
168
+ * @example
169
+ * Config.getInstance().removeRequestInterceptor(id);
170
+ */
171
+ removeRequestInterceptor(id: number): void;
172
+ /**
173
+ * Remove a response interceptor by its ID
174
+ *
175
+ * @param id - The interceptor ID returned from addResponseInterceptor
176
+ *
177
+ * @example
178
+ * Config.getInstance().removeResponseInterceptor(id);
179
+ */
180
+ removeResponseInterceptor(id: number): void;
181
+ /**
182
+ * Remove an error interceptor by its ID
183
+ *
184
+ * @param id - The interceptor ID returned from addErrorInterceptor
185
+ *
186
+ * @example
187
+ * Config.getInstance().removeErrorInterceptor(id);
188
+ */
189
+ removeErrorInterceptor(id: number): void;
190
+ /**
191
+ * Clear all interceptors (request, response, and error)
192
+ *
193
+ * @example
194
+ * Config.getInstance().clearInterceptors();
195
+ */
196
+ clearInterceptors(): void;
197
+ /**
198
+ * Get all global request interceptors (in registration order)
199
+ * @internal
200
+ */
201
+ getRequestInterceptors(): RequestInterceptor[];
202
+ /**
203
+ * Get all global response interceptors (in registration order)
204
+ * @internal
205
+ */
206
+ getResponseInterceptors(): ResponseInterceptor[];
207
+ /**
208
+ * Get all global error interceptors (in registration order)
209
+ * @internal
210
+ */
211
+ getErrorInterceptors(): ErrorInterceptor[];
116
212
  /**
117
213
  * Reset all configuration options to their default values
118
214
  *
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "create-request",
3
- "version": "0.0.1-beta.22",
3
+ "version": "0.0.1-beta.24",
4
4
  "description": "A modern, chainable wrapper for fetch with automatic retries, timeouts, comprehensive error handling, and first-class TypeScript support",
5
- "main": "dist/library/index.js",
5
+ "main": "dist/library/index.cjs",
6
6
  "module": "dist/library/index.esm.js",
7
7
  "types": "dist/library/index.d.ts",
8
8
  "sideEffects": false,
@@ -12,8 +12,14 @@
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
15
- "import": "./dist/library/index.esm.js",
16
- "require": "./dist/library/index.js",
15
+ "import": {
16
+ "default": "./dist/library/index.esm.js",
17
+ "production": "./dist/library/index.esm.min.js"
18
+ },
19
+ "require": {
20
+ "default": "./dist/library/index.cjs",
21
+ "production": "./dist/library/index.min.cjs"
22
+ },
17
23
  "types": "./dist/library/index.d.ts"
18
24
  }
19
25
  },
@@ -24,11 +30,10 @@
24
30
  "lint": "eslint 'src/**/*.{js,ts,json}' 'test/**/*.{js,ts,json}'",
25
31
  "lint:fix": "eslint \"**/*.ts\" --ignore-path .eslintignore --fix",
26
32
  "format": "prettier --write \"**/*.{ts,js,json}\"",
27
- "check": "concurrently \"npm run lint\" \"npm run test\" \"npx size-limit\"",
33
+ "check": "concurrently \"npm run lint\" \"npm run test\" \"npm run check:size\"",
28
34
  "check:size": "npx size-limit",
29
- "pretest": "tsc -p tsconfig.test.json",
30
- "test": "node --test",
31
- "test:coverage": "npm run test -- --experimental-test-coverage",
35
+ "test": "node --import tsx --test test/**/*.test.ts",
36
+ "test:coverage": "node --import tsx --experimental-test-coverage --test test/**/*.test.ts",
32
37
  "preversion": "npm run check",
33
38
  "prepublishOnly": "npm run build",
34
39
  "publish:beta": "npm version prerelease --preid=beta && git push origin --tags && npm publish --tag latest",
@@ -46,6 +51,9 @@
46
51
  ],
47
52
  "author": "Daniel Amenou <amenou.daniel@gmail.com>",
48
53
  "license": "MIT",
54
+ "engines": {
55
+ "node": ">=18.3.0"
56
+ },
49
57
  "repository": {
50
58
  "type": "git",
51
59
  "url": "https://github.com/DanielAmenou/create-request.git"
@@ -54,12 +62,26 @@
54
62
  {
55
63
  "path": "dist/library/index.esm.js",
56
64
  "limit": "6 KB",
57
- "gzip": true
65
+ "gzip": true,
66
+ "name": "ESM Standard"
58
67
  },
59
68
  {
60
- "path": "dist/library/index.js",
69
+ "path": "dist/library/index.cjs",
61
70
  "limit": "6 KB",
62
- "gzip": true
71
+ "gzip": true,
72
+ "name": "CJS Standard"
73
+ },
74
+ {
75
+ "path": "dist/library/index.esm.min.js",
76
+ "limit": "6 KB",
77
+ "gzip": true,
78
+ "name": "ESM Minified"
79
+ },
80
+ {
81
+ "path": "dist/library/index.min.cjs",
82
+ "limit": "6 KB",
83
+ "gzip": true,
84
+ "name": "CJS Minified"
63
85
  }
64
86
  ],
65
87
  "devDependencies": {
@@ -77,14 +99,15 @@
77
99
  "eslint-config-prettier": "^9.1.0",
78
100
  "eslint-import-resolver-typescript": "^3.6.1",
79
101
  "eslint-plugin-import": "^2.29.1",
80
- "eslint-plugin-prettier": "^5.0.1",
81
102
  "eslint-plugin-jsonc": "^2.11.0",
103
+ "eslint-plugin-prettier": "^5.0.1",
82
104
  "prettier": "^3.1.1",
83
105
  "rollup": "^2.75.5",
84
106
  "rollup-plugin-cleaner": "^1.0.0",
85
107
  "rollup-plugin-visualizer": "^5.9.2",
86
108
  "size-limit": "^8.2.6",
87
109
  "tslib": "^2.4.0",
110
+ "tsx": "^4.20.6",
88
111
  "typescript": "^4.7.3",
89
112
  "undici": "^5.28.5"
90
113
  }
@@ -1 +0,0 @@
1
- "use strict";var t,e,s,r,i,o,n,h,a;exports.HttpMethod=void 0,(t=exports.HttpMethod||(exports.HttpMethod={})).GET="GET",t.PUT="PUT",t.POST="POST",t.HEAD="HEAD",t.PATCH="PATCH",t.DELETE="DELETE",t.OPTIONS="OPTIONS",exports.RequestPriority=void 0,(e=exports.RequestPriority||(exports.RequestPriority={})).LOW="low",e.HIGH="high",e.AUTO="auto",exports.CredentialsPolicy=void 0,(s=exports.CredentialsPolicy||(exports.CredentialsPolicy={})).OMIT="omit",s.INCLUDE="include",s.SAME_ORIGIN="same-origin",exports.RequestMode=void 0,(r=exports.RequestMode||(exports.RequestMode={})).CORS="cors",r.NO_CORS="no-cors",r.SAME_ORIGIN="same-origin",r.NAVIGATE="navigate",exports.RedirectMode=void 0,(i=exports.RedirectMode||(exports.RedirectMode={})).ERROR="error",i.FOLLOW="follow",i.MANUAL="manual",exports.CacheMode=void 0,(o=exports.CacheMode||(exports.CacheMode={})).DEFAULT="default",o.RELOAD="reload",o.NO_STORE="no-store",o.NO_CACHE="no-cache",o.FORCE_CACHE="force-cache",o.ONLY_IF_CACHED="only-if-cached",exports.SameSitePolicy=void 0,(n=exports.SameSitePolicy||(exports.SameSitePolicy={})).LAX="Lax",n.NONE="None",n.STRICT="Strict",function(t){t.JSON="json",t.STRING="string",t.BINARY="binary"}(h||(h={})),exports.ReferrerPolicy=void 0,(a=exports.ReferrerPolicy||(exports.ReferrerPolicy={})).ORIGIN="origin",a.UNSAFE_URL="unsafe-url",a.SAME_ORIGIN="same-origin",a.NO_REFERRER="no-referrer",a.STRICT_ORIGIN="strict-origin",a.ORIGIN_WHEN_CROSS_ORIGIN="origin-when-cross-origin",a.NO_REFERRER_WHEN_DOWNGRADE="no-referrer-when-downgrade",a.STRICT_ORIGIN_WHEN_CROSS_ORIGIN="strict-origin-when-cross-origin";class c{constructor(t){this.bodyUsed=!1,this.response=t}get status(){return this.response.status}get statusText(){return this.response.statusText}get headers(){return this.response.headers}get ok(){return this.response.ok}get raw(){return this.response}async getJson(){if(void 0!==this.jsonCache)return this.jsonCache;if(this.bodyUsed){if(void 0!==this.textCache)try{return this.jsonCache=JSON.parse(this.textCache),this.jsonCache}catch(t){throw Error("Cannot parse cached text as JSON")}throw Error("Response body has already been consumed in a different format")}return this.bodyUsed=!0,this.jsonCache=await this.response.json(),this.jsonCache}async getText(){if(void 0!==this.textCache)return this.textCache;if(this.bodyUsed){if(void 0!==this.jsonCache)return this.textCache=JSON.stringify(this.jsonCache),this.textCache;if(void 0!==this.blobCache)return this.textCache=await this.blobCache.text(),this.textCache;throw Error("Response body has already been consumed in a format that cannot be converted to text")}return this.bodyUsed=!0,this.textCache=await this.response.text(),this.textCache}async getBlob(){if(void 0!==this.blobCache)return this.blobCache;if(this.bodyUsed){if(void 0!==this.textCache)return this.blobCache=new Blob([this.textCache],{type:"text/plain"}),this.blobCache;throw Error("Response body has already been consumed in a format that cannot be converted to Blob")}return this.bodyUsed=!0,this.blobCache=await this.response.blob(),this.blobCache}async getArrayBuffer(){if(void 0!==this.arrayBufferCache)return this.arrayBufferCache;if(this.bodyUsed){if(void 0!==this.textCache){const t=(new TextEncoder).encode(this.textCache);return this.arrayBufferCache=t.buffer,this.arrayBufferCache}if(void 0!==this.blobCache)return this.arrayBufferCache=await this.blobCache.arrayBuffer(),this.arrayBufferCache;throw Error("Response body has already been consumed in a format that cannot be converted to ArrayBuffer")}return this.bodyUsed=!0,this.arrayBufferCache=await this.response.arrayBuffer(),this.arrayBufferCache}getBody(){if(this.bodyUsed)throw Error("Response body has already been consumed");return this.bodyUsed=!0,this.response.body}}function u(){const t=new Map;return{get:e=>t.get(e)||null,set(e,s){t.set(e,s)},has:e=>t.has(e),delete(e){t.delete(e)},clear(){t.clear()}}}function f(){return{get:t=>"undefined"==typeof localStorage?null:localStorage.getItem(t),set(t,e){if("undefined"!=typeof localStorage)try{localStorage.setItem(t,e)}catch(s){console.warn("Cache storage quota exceeded, clearing cache"),this.clear();try{localStorage.setItem(t,e)}catch(t){console.error("Failed to set cache item even after clearing cache")}}},has:t=>"undefined"!=typeof localStorage&&null!==localStorage.getItem(t),delete(t){"undefined"!=typeof localStorage&&localStorage.removeItem(t)},clear(){"undefined"!=typeof localStorage&&localStorage.clear()}}}function l(){return{get:t=>"undefined"==typeof sessionStorage?null:sessionStorage.getItem(t),set(t,e){if("undefined"!=typeof sessionStorage)try{sessionStorage.setItem(t,e)}catch(s){console.warn("Cache storage quota exceeded, clearing cache"),this.clear();try{sessionStorage.setItem(t,e)}catch(t){console.error("Failed to set cache item even after clearing cache")}}},has:t=>"undefined"!=typeof sessionStorage&&null!==sessionStorage.getItem(t),delete(t){"undefined"!=typeof sessionStorage&&sessionStorage.removeItem(t)},clear(){"undefined"!=typeof sessionStorage&&sessionStorage.clear()}}}class d{constructor(t={}){this.entryCount=0,this.totalSize=0,this.options=t,this.storage=function(t){const{storage:e}=t||{};return e?"function"==typeof e.get&&"function"==typeof e.set?e:e===localStorage?f():e===sessionStorage?l():e instanceof Map?{get:t=>e.get(t)||null,set(t,s,r){e.set(t,s)},has:t=>e.has(t),delete(t){e.delete(t)},clear(){e.clear()}}:(console.warn("Unsupported storage type, falling back to memory storage"),u()):u()}(t)}generateKey(t,e,s,r){if(this.options.keyGenerator){const i=this.options.keyGenerator(t,e,s,r);return this.options.keyPrefix?`${this.options.keyPrefix}:${i}`:i}let i=`${e}:${t}`;if(this.options.varyByHeaders&&s){const t={};this.options.varyByHeaders.forEach((e=>{const r=e.toLowerCase();Object.keys(s).forEach((e=>{e.toLowerCase()===r&&(t[r]=s[e])}))})),Object.keys(t).length>0&&(i+=":"+JSON.stringify(t))}if("GET"!==e&&null!=r)try{"string"==typeof r||"number"==typeof r||"boolean"==typeof r?i+=":"+r:"object"==typeof r&&(i+=":"+JSON.stringify(r))}catch(t){console.warn("Failed to stringify request body for cache key")}return this.options.keyPrefix?`${this.options.keyPrefix}:${i}`:i}async get(t){const e=await Promise.resolve(this.storage.get(t));if(!e)return null;try{const s=JSON.parse(e);return s.expiry&&s.expiry<Date.now()?(await Promise.resolve(this.storage.delete(t)),null):s}catch(e){return await Promise.resolve(this.storage.delete(t)),null}}async set(t,e,s){const r=Date.now(),i=this.options.ttl,o=JSON.stringify({value:e,timestamp:r,expiry:i?r+i:null,headers:s});if(this.options.maxSize){const t=function(t){var e;if("number"==typeof t)return t;const s=t.match(/^(\d+(?:\.\d+)?)\s*(KB|MB|GB)?$/i);if(!s)return 0;const r=parseFloat(s[1]);switch(null===(e=s[2])||void 0===e?void 0:e.toUpperCase()){case"KB":return 1024*r;case"MB":return 1048576*r;case"GB":return 1073741824*r;default:return r}}(this.options.maxSize),e=(new TextEncoder).encode(o).length;if(e>t)return void console.warn(`Cache entry size (${e} bytes) exceeds maximum cache size (${t} bytes)`);this.totalSize+e>t&&(await Promise.resolve(this.storage.clear()),this.totalSize=0,this.entryCount=0),this.totalSize+=e}this.options.maxEntries&&(this.entryCount++,this.entryCount>this.options.maxEntries&&(await Promise.resolve(this.storage.clear()),this.entryCount=1)),await Promise.resolve(this.storage.set(t,o,i))}async has(t){return Promise.resolve(this.storage.has(t))}async delete(t){return Promise.resolve(this.storage.delete(t))}async clear(){return this.entryCount=0,this.totalSize=0,Promise.resolve(this.storage.clear())}}class p{static formatRequestCookies(t){const e=[];return Object.entries(t).forEach((([t,s])=>{let r;r="string"==typeof s?s:s.value,e.push(`${encodeURIComponent(t)}=${encodeURIComponent(r)}`)})),e.join("; ")}}class y extends Error{constructor(t,e,s,r={}){super(t),this.name="RequestError",this.url=e,this.method=s,this.status=r.status,this.response=r.response,this.timeoutError=r.timeoutError,Error.captureStackTrace&&Error.captureStackTrace(this,y),Object.setPrototypeOf(this,y.prototype)}static timeout(t,e,s){return new y(`Request timed out after ${s}ms`,t,e,{timeoutError:!0})}static fromResponse(t,e,s){return new y("Request failed with status "+t.status,e,s,{status:t.status,response:t})}static networkError(t,e,s){const r=new y("Network error: "+s.message,t,e);return r.stack=s.stack,r}}class w{static getTokenFromMeta(t="csrf-token"){if("undefined"==typeof document)return null;const e=document.querySelector(`meta[name="${t}"]`);return(null==e?void 0:e.getAttribute("content"))||null}static getTokenFromCookie(t="csrf-token"){if("undefined"==typeof document)return null;const e=document.cookie.split(";");for(const s of e){const[e,r]=s.trim().split("=");if(e===t)return decodeURIComponent(r)}return null}static isValidToken(t){return!("string"!=typeof t||8>t.length||t.length>10&&(!/^[A-Za-z0-9\-_=+/.]+$/.test(t)||2>[/[A-Z]/.test(t),/[a-z]/.test(t),/[0-9]/.test(t),/[-_=+/.]/.test(t)].filter(Boolean).length))}}class g{constructor(){this.csrfHeaderName="X-CSRF-Token",this.xsrfCookieName="XSRF-TOKEN",this.xsrfHeaderName="X-XSRF-TOKEN",this.csrfToken=null,this.enableAutoXsrf=!0,this.enableAntiCsrf=!0}static getInstance(){return g.instance||(g.instance=new g),g.instance}setCsrfToken(t){return this.csrfToken=t,this}getCsrfToken(){return this.csrfToken}setCsrfHeaderName(t){return this.csrfHeaderName=t,this}getCsrfHeaderName(){return this.csrfHeaderName}setXsrfCookieName(t){return this.xsrfCookieName=t,this}getXsrfCookieName(){return this.xsrfCookieName}setXsrfHeaderName(t){return this.xsrfHeaderName=t,this}getXsrfHeaderName(){return this.xsrfHeaderName}setEnableAutoXsrf(t){return this.enableAutoXsrf=t,this}isAutoXsrfEnabled(){return this.enableAutoXsrf}setEnableAntiCsrf(t){return this.enableAntiCsrf=t,this}isAntiCsrfEnabled(){return this.enableAntiCsrf}reset(){return this.csrfToken=null,this.csrfHeaderName="X-CSRF-Token",this.enableAntiCsrf=!0,this.xsrfCookieName="XSRF-TOKEN",this.xsrfHeaderName="X-XSRF-TOKEN",this.enableAutoXsrf=!0,this}}class m{constructor(){this.requestOptions={headers:{}},this.queryParams=new URLSearchParams,this.autoApplyCsrfProtection=!0,this.cacheEnabled=!1}withHeaders(t){return this.requestOptions.headers={...this.requestOptions.headers,...t},this}withHeader(t,e){return this.withHeaders({[t]:e})}withTimeout(t){if(!Number.isFinite(t)||0>=t)throw Error("Timeout must be a positive number");return this.requestOptions.timeout=t,this}withRetries(t){if(!Number.isInteger(t)||0>t)throw Error("Retry count must be a non-negative integer");return this.requestOptions.retries=t,this}onRetry(t){return this.requestOptions.onRetry=t,this}withCredentials(t=exports.CredentialsPolicy.SAME_ORIGIN){return this.requestOptions.credentials=t,this}withAbortController(t){return this.abortController=t,this}withReferrer(t){return this.requestOptions.referrer=t,this}withReferrerPolicy(t){return this.requestOptions.referrerPolicy=t,this}withRedirect(t){return this.requestOptions.redirect=t,this}withKeepAlive(t){return this.requestOptions.keepalive=t,this}withPriority(t){return this.requestOptions.priority=t,this}withQueryParams(t){return Object.entries(t).forEach((([t,e])=>{null!=e&&(Array.isArray(e)?e.forEach((e=>this.queryParams.append(t,e+""))):this.queryParams.append(t,e+""))})),this}withQueryParam(t,e){return null==e||(Array.isArray(e)?e.forEach((e=>this.queryParams.append(t,e+""))):this.queryParams.append(t,e+"")),this}withMode(t){return this.requestOptions.mode=t,this}withContentType(t){return this.withHeaders({"Content-Type":t})}withAuthorization(t){return this.withHeaders({Authorization:t})}withBasicAuth(t,e){const s=this.encodeBase64(`${t}:${e}`);return this.withAuthorization("Basic "+s)}encodeBase64(t){if("undefined"!=typeof TextEncoder&&"function"==typeof btoa){const e=(new TextEncoder).encode(t);return btoa(String.fromCharCode.call(null,...new Uint8Array(e)))}if("function"==typeof btoa)return btoa(t);if("undefined"!=typeof Buffer)return Buffer.from(t).toString("base64");throw Error("Base64 encoding is not supported")}withBearerToken(t){return this.withAuthorization("Bearer "+t)}hasHeader(t,e){return Object.keys(t).some((t=>t.toLowerCase()===e.toLowerCase()))}withCookies(t){if(0===Object.entries(t||{}).length)return this;const e=this.requestOptions.headers||{},s=[],r=[];Object.keys(e).forEach((t=>{"cookie"===t.toLowerCase()&&(e[t]&&s.push(e[t]),r.push(t))}));const i=p.formatRequestCookies(t),o=r.length>0?r[0]:"Cookie",n=[...s,i].filter(Boolean).join("; "),h={...e};return r.forEach((t=>{delete h[t]})),this.requestOptions.headers={...h,[o]:n},this}withCookie(t,e){return this.withCookies({[t]:e})}withCsrfToken(t,e="X-CSRF-Token"){return this.withHeaders({[e]:t})}withoutCsrfProtection(){return this.autoApplyCsrfProtection=!1,this}withAntiCsrfHeaders(){return this.withHeaders({"X-Requested-With":"XMLHttpRequest"})}withCache(t={}){return this.cacheEnabled=!0,this.cacheManager=new d(t),this}sendTo(t){if(t=this.formatUrlWithQueryParams(t),this.autoApplyCsrfProtection){const t=g.getInstance();t.isAntiCsrfEnabled()&&this.withHeaders({"X-Requested-With":"XMLHttpRequest"});const e=t.getCsrfToken();if(e){const s=this.requestOptions.headers,r=t.getCsrfHeaderName();this.hasHeader(s,"X-CSRF-Token")||this.hasHeader(s,r)||this.withHeaders({[r]:e})}if(t.isAutoXsrfEnabled()&&"undefined"!=typeof document){const e=w.getTokenFromCookie(t.getXsrfCookieName());if(e&&w.isValidToken(e)){const s=this.requestOptions.headers,r=t.getXsrfHeaderName();this.hasHeader(s,"X-XSRF-TOKEN")||this.hasHeader(s,r)||this.withHeaders({[r]:e})}}}const e={...this.requestOptions,method:this.method};let s;if(this.cacheEnabled&&this.cacheManager){const r=this.cacheManager.generateKey(t,this.method,this.requestOptions.headers,this.requestOptions.body);s=this.executeWithCache(t,e,r)}else s=this.requestOptions.retries?this.executeWithRetries(t,e):this.executeRequest(t,e);const r=s;return r.getJson=async()=>s.then((t=>t.getJson())),r.getText=async()=>s.then((t=>t.getText())),r.getBlob=async()=>s.then((t=>t.getBlob())),r.getArrayBuffer=async()=>s.then((t=>t.getArrayBuffer())),r.getBody=async()=>s.then((t=>t.getBody())),r.getData=async t=>{try{const e=await s.then((t=>t.getJson()));return t?t(e):e}catch(t){const e=Error(`Data selector failed: ${t instanceof Error?t.message:t+""}. Original data: ${JSON.stringify(await s.then((t=>t.getJson())),null,2)}`);throw t instanceof Error&&t.stack&&(e.stack=t.stack),e}},r}formatUrlWithQueryParams(t){if(!(""+this.queryParams))return t;try{const e=new URL(t);return this.queryParams.forEach(((t,s)=>{e.searchParams.append(s,t)})),""+e}catch(e){const s=t.includes("?");return`${t}${s?"&":"?"}${""+this.queryParams}`}}async executeWithRetries(t,e){const s=this.requestOptions.retries||0;for(let r=0;s>=r;r++)try{return await this.executeRequest(t,e)}catch(i){const o=i instanceof y?i:y.networkError(t,e.method,i);if(r>=s)throw o;this.requestOptions.onRetry&&await this.requestOptions.onRetry({attempt:r+1,error:o})}throw new y("Max retries reached",t,e.method)}async executeRequest(t,e){const s=this.abortController||new AbortController,{signal:r}=s;let i;e.signal=e.signal||r;let o=!1;this.requestOptions.timeout&&(this.abortController?"function"==typeof AbortSignal.timeout?AbortSignal.timeout(this.requestOptions.timeout).addEventListener("abort",(()=>{s.signal.aborted||(o=!0,s.abort())})):i=setTimeout((()=>{s.signal.aborted||(o=!0,s.abort())}),this.requestOptions.timeout):i=setTimeout((()=>{o=!0,s.abort()}),this.requestOptions.timeout));try{let s;try{s=await fetch(t,e)}catch(s){if(s instanceof DOMException&&"AbortError"===s.name&&o)throw y.timeout(t,e.method,this.requestOptions.timeout);throw y.networkError(t,e.method,s)}if(!s.ok)throw y.fromResponse(s,t,e.method);return new c(s)}finally{i&&clearTimeout(i)}}async executeWithCache(t,e,s){if(this.cacheManager){const t=await this.cacheManager.get(s);if(t){const e=new Response(JSON.stringify(t.value),{status:200,headers:new Headers(t.headers||{})});return new c(e)}}const r=await(this.requestOptions.retries?this.executeWithRetries(t,e):this.executeRequest(t,e));if(r.ok&&this.cacheManager)try{const t=await r.getJson(),e={};r.headers.forEach(((t,s)=>{e[s]=t})),await this.cacheManager.set(s,t,e)}catch(t){console.warn("Failed to cache response:",t)}return r}}class x extends m{withBody(t){if(this.body=t,"string"==typeof t)this.bodyType=h.STRING,this.setContentTypeIfNeeded("text/plain");else if(null===t||"object"!=typeof t||t instanceof FormData||t instanceof Blob||t instanceof ArrayBuffer||t instanceof URLSearchParams||t instanceof ReadableStream)this.bodyType=h.BINARY;else{this.bodyType=h.JSON,this.setContentTypeIfNeeded("application/json");try{JSON.stringify(t)}catch(t){throw Error("Failed to stringify request body: "+t)}}return this}setContentTypeIfNeeded(t){Object.keys(this.requestOptions.headers).some((t=>"content-type"===t.toLowerCase()))||this.withContentType(t)}sendTo(t){return void 0!==this.body&&(this.requestOptions.body&&delete this.requestOptions.body,this.requestOptions.body=this.bodyType===h.JSON?JSON.stringify(this.body):this.body),super.sendTo(t)}}class b extends m{constructor(){super(...arguments),this.method=exports.HttpMethod.GET}}class S extends m{constructor(){super(...arguments),this.method=exports.HttpMethod.HEAD}}class E extends m{constructor(){super(...arguments),this.method=exports.HttpMethod.OPTIONS}}class R extends m{constructor(){super(...arguments),this.method=exports.HttpMethod.DELETE}}class T extends x{constructor(){super(...arguments),this.method=exports.HttpMethod.POST}}class C extends x{constructor(){super(...arguments),this.method=exports.HttpMethod.PUT}}class v extends x{constructor(){super(...arguments),this.method=exports.HttpMethod.PATCH}}const O={get:function(){return new b},post:function(){return new T},put:function(){return new C},del:function(){return new R},patch:function(){return new v},head:function(){return new S},options:function(){return new E},config:g.getInstance()};exports.CacheManager=d,exports.CookieUtils=p,exports.DeleteRequest=R,exports.GetRequest=b,exports.HeadRequest=S,exports.OptionsRequest=E,exports.PatchRequest=v,exports.PostRequest=T,exports.PutRequest=C,exports.RequestError=y,exports.ResponseWrapper=c,exports.createLocalStorageStorage=f,exports.createMemoryStorage=u,exports.createSessionStorageStorage=l,exports.default=O;//# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/enums.ts","../../../src/ResponseWrapper.ts","../../../src/utils/CacheStorage.ts","../../../src/utils/CacheManager.ts","../../../src/utils/sizeUtils.ts","../../../src/utils/CookieUtils.ts","../../../src/RequestError.ts","../../../src/utils/CsrfUtils.ts","../../../src/utils/Config.ts","../../../src/BaseRequest.ts","../../../src/BodyRequest.ts","../../../src/requestMethods.ts","../../../src/index.ts","../../../src/requestFactories.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["HttpMethod","RequestPriority","CredentialsPolicy","RequestMode","RedirectMode","CacheMode","SameSitePolicy","BodyType","ReferrerPolicy","ResponseWrapper","constructor","response","this","bodyUsed","status","statusText","headers","ok","raw","getJson","undefined","jsonCache","textCache","JSON","parse","e","Error","json","getText","stringify","blobCache","text","getBlob","Blob","type","blob","getArrayBuffer","arrayBufferCache","uint8Array","TextEncoder","encode","buffer","arrayBuffer","getBody","body","createMemoryStorage","store","Map","get","key","set","value","has","delete","clear","createLocalStorageStorage","localStorage","getItem","setItem","console","warn","error","removeItem","createSessionStorageStorage","sessionStorage","CacheManager","options","entryCount","totalSize","storage","_ttl","createStorageProvider","generateKey","url","method","keyGenerator","customKey","keyPrefix","varyByHeaders","varyHeaders","forEach","header","normalizedHeader","toLowerCase","Object","keys","h","length","Promise","resolve","entry","expiry","Date","now","ttl","serialized","timestamp","maxSize","maxBytes","size","match","num","parseFloat","_a","toUpperCase","parseSize","entrySize","maxEntries","CookieUtils","formatRequestCookies","cookies","cookiePairs","entries","name","valueOrOptions","push","encodeURIComponent","join","RequestError","message","super","timeoutError","captureStackTrace","setPrototypeOf","prototype","timeout","timeoutMs","fromResponse","networkError","originalError","stack","CsrfUtils","getTokenFromMeta","metaName","document","meta","querySelector","getAttribute","getTokenFromCookie","cookieName","cookie","split","trim","decodeURIComponent","isValidToken","token","test","filter","Boolean","Config","csrfHeaderName","xsrfCookieName","xsrfHeaderName","csrfToken","enableAutoXsrf","enableAntiCsrf","getInstance","instance","setCsrfToken","getCsrfToken","setCsrfHeaderName","getCsrfHeaderName","setXsrfCookieName","getXsrfCookieName","setXsrfHeaderName","getXsrfHeaderName","setEnableAutoXsrf","enable","isAutoXsrfEnabled","setEnableAntiCsrf","isAntiCsrfEnabled","reset","BaseRequest","requestOptions","queryParams","URLSearchParams","autoApplyCsrfProtection","cacheEnabled","withHeaders","withHeader","withTimeout","Number","isFinite","withRetries","retries","isInteger","onRetry","callback","withCredentials","credentialsPolicy","SAME_ORIGIN","credentials","withAbortController","controller","abortController","withReferrer","referrer","withReferrerPolicy","policy","referrerPolicy","withRedirect","redirect","withKeepAlive","keepalive","withPriority","priority","withQueryParams","params","Array","isArray","v","append","String","withQueryParam","withMode","mode","withContentType","contentType","withAuthorization","authValue","Authorization","withBasicAuth","username","password","encodeBase64","str","btoa","bytes","fromCharCode","apply","Uint8Array","Buffer","from","toString","withBearerToken","hasHeader","headerName","some","withCookies","currentHeaders","cookieValues","cookieHeaderKeys","cookieString","combinedCookieValue","newHeaders","withCookie","withCsrfToken","withoutCsrfProtection","withAntiCsrfHeaders","withCache","cacheManager","sendTo","formatUrlWithQueryParams","config","globalToken","xsrfToken","fetchOptions","basePromise","cacheKey","executeWithCache","executeWithRetries","executeRequest","responsePromise","async","then","getData","selector","data","enhancedError","urlObj","URL","searchParams","hasExistingParams","includes","maxRetries","attempt","requestError","AbortController","signal","timeoutId","abortedByTimeout","AbortSignal","addEventListener","aborted","abort","setTimeout","fetch","DOMException","clearTimeout","cachedEntry","cachedResponse","Response","Headers","responseData","BodyRequest","withBody","bodyType","STRING","setContentTypeIfNeeded","FormData","ArrayBuffer","ReadableStream","BINARY","GetRequest","GET","HeadRequest","HEAD","OptionsRequest","OPTIONS","DeleteRequest","DELETE","PostRequest","POST","PutRequest","PUT","PatchRequest","PATCH","create","post","put","del","patch","head"],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- import type { StorageProvider } from "../utils/StorageProvider.js";
2
- /**
3
- * Cache entry with metadata
4
- */
5
- export interface CacheEntry {
6
- value: any;
7
- expiry: number | null;
8
- timestamp: number;
9
- headers?: Record<string, string>;
10
- }
11
- /**
12
- * Options for cache configuration
13
- */
14
- export interface CacheOptions {
15
- /**
16
- * Storage provider to use for caching
17
- * Default is memory cache (new Map())
18
- */
19
- storage?: StorageProvider | Storage | Map<string, any>;
20
- /**
21
- * Time to live in milliseconds
22
- * Default is no expiration
23
- */
24
- ttl?: number;
25
- /**
26
- * Custom key generator function
27
- * @param url Request URL
28
- * @param method Request method
29
- * @param headers Request headers
30
- * @param body Request body
31
- */
32
- keyGenerator?: (url: string, method: string, headers?: Record<string, string>, body?: any) => string;
33
- /**
34
- * Headers to vary the cache by
35
- * If these headers change, a new cache entry will be created
36
- */
37
- varyByHeaders?: string[];
38
- /**
39
- * Maximum number of entries in the cache
40
- * Only applicable for memory cache (Map)
41
- */
42
- maxEntries?: number;
43
- /**
44
- * Maximum size of the cache in bytes or with units (e.g. "10MB")
45
- * String format supports KB, MB, GB (case-insensitive)
46
- */
47
- maxSize?: number | string;
48
- /**
49
- * Prefix for cache keys
50
- * Useful for namespacing cache entries
51
- */
52
- keyPrefix?: string;
53
- }
54
- /**
55
- * Type for cacheable response data
56
- */
57
- export type CacheableResponse = {
58
- data: any;
59
- headers: Record<string, string>;
60
- status: number;
61
- statusText: string;
62
- };
@@ -1,82 +0,0 @@
1
- import type { CacheEntry, CacheOptions } from "../types/cache.js";
2
- /**
3
- * Cache manager that handles storage operations
4
- * Provides methods for storing, retrieving, and managing cached API responses.
5
- */
6
- export declare class CacheManager {
7
- private storage;
8
- private options;
9
- private entryCount;
10
- private totalSize;
11
- constructor(options?: CacheOptions);
12
- /**
13
- * Generate a cache key based on request details
14
- * Keys can vary based on URL, method, headers, and request body.
15
- *
16
- * @param url - The request URL
17
- * @param method - The HTTP method
18
- * @param headers - Request headers that might affect caching
19
- * @param body - Request body for non-GET requests
20
- * @returns A unique cache key string
21
- *
22
- * @example
23
- * const key = cacheManager.generateKey("/api/users", "GET", { "Accept": "application/json" });
24
- */
25
- generateKey(url: string, method: string, headers?: Record<string, string>, body?: unknown): string;
26
- /**
27
- * Get a cached value by key
28
- * Checks if the entry exists and isn't expired before returning it.
29
- *
30
- * @param key - The cache key to retrieve
31
- * @returns The cached entry or null if not found or expired
32
- *
33
- * @example
34
- * const entry = await cacheManager.get("GET:/api/users");
35
- */
36
- get(key: string): Promise<CacheEntry | null>;
37
- /**
38
- * Store a value in the cache
39
- * Enforces size and entry count limits if configured.
40
- *
41
- * @param key - The cache key
42
- * @param value - The value to cache
43
- * @param headers - Response headers to store with the cached value
44
- * @returns Promise that resolves when caching is complete
45
- *
46
- * @example
47
- * await cacheManager.set("GET:/api/users", userData, { "Content-Type": "application/json" });
48
- */
49
- set(key: string, value: unknown, headers?: Record<string, string>): Promise<void>;
50
- /**
51
- * Check if a key exists in the cache
52
- *
53
- * @param key - The cache key to check
54
- * @returns Promise that resolves to true if the key exists, false otherwise
55
- *
56
- * @example
57
- * if (await cacheManager.has("GET:/api/users")) {
58
- * // Use cached value
59
- * }
60
- */
61
- has(key: string): Promise<boolean>;
62
- /**
63
- * Delete a specific key from the cache
64
- *
65
- * @param key - The cache key to delete
66
- * @returns Promise that resolves when deletion is complete
67
- *
68
- * @example
69
- * await cacheManager.delete("GET:/api/users");
70
- */
71
- delete(key: string): Promise<void>;
72
- /**
73
- * Clear the entire cache
74
- * Resets internal counters for entry count and size.
75
- *
76
- * @returns Promise that resolves when the cache is cleared
77
- *
78
- * @example
79
- * await cacheManager.clear();
80
- */
81
- clear(): Promise<void>;
82
- }