@fgrzl/fetch 1.1.0-alpha.3 → 1.1.0-alpha.7

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 (231) hide show
  1. package/README.md +15 -12
  2. package/dist/cjs/client/fetch-client.d.ts +189 -0
  3. package/dist/cjs/client/fetch-client.d.ts.map +1 -0
  4. package/dist/cjs/client/fetch-client.js +339 -0
  5. package/dist/cjs/client/fetch-client.js.map +1 -0
  6. package/dist/cjs/client/index.d.ts +11 -0
  7. package/dist/cjs/client/index.d.ts.map +1 -0
  8. package/dist/cjs/client/index.js +14 -0
  9. package/dist/cjs/client/index.js.map +1 -0
  10. package/dist/cjs/client/types.d.ts +63 -0
  11. package/dist/cjs/client/types.d.ts.map +1 -0
  12. package/dist/cjs/client/types.js +9 -0
  13. package/dist/cjs/client/types.js.map +1 -0
  14. package/dist/{errors.d.ts → cjs/errors/index.d.ts} +20 -3
  15. package/dist/cjs/errors/index.d.ts.map +1 -0
  16. package/dist/{errors.js → cjs/errors/index.js} +23 -3
  17. package/dist/cjs/errors/index.js.map +1 -0
  18. package/dist/cjs/index.d.ts +65 -0
  19. package/dist/cjs/index.d.ts.map +1 -0
  20. package/dist/cjs/index.js +118 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/middleware/authentication/authentication.d.ts +31 -0
  23. package/dist/cjs/middleware/authentication/authentication.d.ts.map +1 -0
  24. package/dist/cjs/middleware/authentication/authentication.js +93 -0
  25. package/dist/cjs/middleware/authentication/authentication.js.map +1 -0
  26. package/dist/cjs/middleware/authentication/index.d.ts +37 -0
  27. package/dist/cjs/middleware/authentication/index.d.ts.map +1 -0
  28. package/dist/cjs/middleware/authentication/index.js +42 -0
  29. package/dist/cjs/middleware/authentication/index.js.map +1 -0
  30. package/dist/cjs/middleware/authentication/types.d.ts +73 -0
  31. package/dist/cjs/middleware/authentication/types.d.ts.map +1 -0
  32. package/dist/cjs/middleware/authentication/types.js +6 -0
  33. package/dist/cjs/middleware/authentication/types.js.map +1 -0
  34. package/dist/cjs/middleware/authorization/authorization.d.ts +30 -0
  35. package/dist/cjs/middleware/authorization/authorization.d.ts.map +1 -0
  36. package/dist/cjs/middleware/authorization/authorization.js +82 -0
  37. package/dist/cjs/middleware/authorization/authorization.js.map +1 -0
  38. package/dist/cjs/middleware/authorization/index.d.ts +36 -0
  39. package/dist/cjs/middleware/authorization/index.d.ts.map +1 -0
  40. package/dist/cjs/middleware/authorization/index.js +41 -0
  41. package/dist/cjs/middleware/authorization/index.js.map +1 -0
  42. package/dist/cjs/middleware/authorization/types.d.ts +67 -0
  43. package/dist/cjs/middleware/authorization/types.d.ts.map +1 -0
  44. package/dist/cjs/middleware/authorization/types.js +6 -0
  45. package/dist/cjs/middleware/authorization/types.js.map +1 -0
  46. package/dist/cjs/middleware/cache/cache.d.ts +41 -0
  47. package/dist/cjs/middleware/cache/cache.d.ts.map +1 -0
  48. package/dist/cjs/middleware/cache/cache.js +191 -0
  49. package/dist/cjs/middleware/cache/cache.js.map +1 -0
  50. package/dist/cjs/middleware/cache/index.d.ts +44 -0
  51. package/dist/cjs/middleware/cache/index.d.ts.map +1 -0
  52. package/dist/cjs/middleware/cache/index.js +50 -0
  53. package/dist/cjs/middleware/cache/index.js.map +1 -0
  54. package/dist/cjs/middleware/cache/types.d.ts +89 -0
  55. package/dist/cjs/middleware/cache/types.d.ts.map +1 -0
  56. package/dist/cjs/middleware/cache/types.js +6 -0
  57. package/dist/cjs/middleware/cache/types.js.map +1 -0
  58. package/dist/cjs/middleware/csrf/csrf.d.ts +34 -0
  59. package/dist/cjs/middleware/csrf/csrf.d.ts.map +1 -0
  60. package/dist/cjs/middleware/csrf/csrf.js +94 -0
  61. package/dist/cjs/middleware/csrf/csrf.js.map +1 -0
  62. package/dist/cjs/middleware/csrf/index.d.ts +57 -0
  63. package/dist/cjs/middleware/csrf/index.d.ts.map +1 -0
  64. package/dist/cjs/middleware/csrf/index.js +62 -0
  65. package/dist/cjs/middleware/csrf/index.js.map +1 -0
  66. package/dist/cjs/middleware/csrf/types.d.ts +57 -0
  67. package/dist/cjs/middleware/csrf/types.d.ts.map +1 -0
  68. package/dist/cjs/middleware/csrf/types.js +6 -0
  69. package/dist/cjs/middleware/csrf/types.js.map +1 -0
  70. package/dist/cjs/middleware/index.d.ts +115 -0
  71. package/dist/cjs/middleware/index.d.ts.map +1 -0
  72. package/dist/cjs/middleware/index.js +153 -0
  73. package/dist/cjs/middleware/index.js.map +1 -0
  74. package/dist/cjs/middleware/logging/index.d.ts +42 -0
  75. package/dist/cjs/middleware/logging/index.d.ts.map +1 -0
  76. package/dist/cjs/middleware/logging/index.js +47 -0
  77. package/dist/cjs/middleware/logging/index.js.map +1 -0
  78. package/dist/cjs/middleware/logging/logging.d.ts +29 -0
  79. package/dist/cjs/middleware/logging/logging.d.ts.map +1 -0
  80. package/dist/cjs/middleware/logging/logging.js +171 -0
  81. package/dist/cjs/middleware/logging/logging.js.map +1 -0
  82. package/dist/cjs/middleware/logging/types.d.ts +90 -0
  83. package/dist/cjs/middleware/logging/types.d.ts.map +1 -0
  84. package/dist/cjs/middleware/logging/types.js +6 -0
  85. package/dist/cjs/middleware/logging/types.js.map +1 -0
  86. package/dist/cjs/middleware/rate-limit/index.d.ts +16 -0
  87. package/dist/cjs/middleware/rate-limit/index.d.ts.map +1 -0
  88. package/dist/cjs/middleware/rate-limit/index.js +21 -0
  89. package/dist/cjs/middleware/rate-limit/index.js.map +1 -0
  90. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +14 -0
  91. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +1 -0
  92. package/dist/cjs/middleware/rate-limit/rate-limit.js +87 -0
  93. package/dist/cjs/middleware/rate-limit/rate-limit.js.map +1 -0
  94. package/dist/cjs/middleware/rate-limit/types.d.ts +97 -0
  95. package/dist/cjs/middleware/rate-limit/types.d.ts.map +1 -0
  96. package/dist/cjs/middleware/rate-limit/types.js +6 -0
  97. package/dist/cjs/middleware/rate-limit/types.js.map +1 -0
  98. package/dist/cjs/middleware/retry/index.d.ts +6 -0
  99. package/dist/cjs/middleware/retry/index.d.ts.map +1 -0
  100. package/dist/cjs/middleware/retry/index.js +11 -0
  101. package/dist/cjs/middleware/retry/index.js.map +1 -0
  102. package/dist/cjs/middleware/retry/retry.d.ts +39 -0
  103. package/dist/cjs/middleware/retry/retry.d.ts.map +1 -0
  104. package/dist/cjs/middleware/retry/retry.js +144 -0
  105. package/dist/cjs/middleware/retry/retry.js.map +1 -0
  106. package/dist/cjs/middleware/retry/types.d.ts +61 -0
  107. package/dist/cjs/middleware/retry/types.d.ts.map +1 -0
  108. package/dist/cjs/middleware/retry/types.js +6 -0
  109. package/dist/cjs/middleware/retry/types.js.map +1 -0
  110. package/dist/client/fetch-client.d.ts +189 -0
  111. package/dist/client/fetch-client.d.ts.map +1 -0
  112. package/dist/client/fetch-client.js +335 -0
  113. package/dist/client/fetch-client.js.map +1 -0
  114. package/dist/client/index.d.ts +11 -0
  115. package/dist/client/index.d.ts.map +1 -0
  116. package/dist/client/index.js +10 -0
  117. package/dist/client/index.js.map +1 -0
  118. package/dist/client/types.d.ts +63 -0
  119. package/dist/client/types.d.ts.map +1 -0
  120. package/dist/client/types.js +8 -0
  121. package/dist/client/types.js.map +1 -0
  122. package/dist/errors/index.d.ts +64 -0
  123. package/dist/errors/index.d.ts.map +1 -0
  124. package/dist/errors/index.js +73 -0
  125. package/dist/errors/index.js.map +1 -0
  126. package/dist/index.d.ts +49 -20
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +86 -42
  129. package/dist/index.js.map +1 -1
  130. package/dist/middleware/authentication/authentication.d.ts +31 -0
  131. package/dist/middleware/authentication/authentication.d.ts.map +1 -0
  132. package/dist/middleware/authentication/authentication.js +90 -0
  133. package/dist/middleware/authentication/authentication.js.map +1 -0
  134. package/dist/middleware/authentication/index.d.ts +37 -0
  135. package/dist/middleware/authentication/index.d.ts.map +1 -0
  136. package/dist/middleware/authentication/index.js +37 -0
  137. package/dist/middleware/authentication/index.js.map +1 -0
  138. package/dist/middleware/authentication/types.d.ts +73 -0
  139. package/dist/middleware/authentication/types.d.ts.map +1 -0
  140. package/dist/middleware/authentication/types.js +5 -0
  141. package/dist/middleware/authentication/types.js.map +1 -0
  142. package/dist/middleware/authorization/authorization.d.ts +30 -0
  143. package/dist/middleware/authorization/authorization.d.ts.map +1 -0
  144. package/dist/middleware/authorization/authorization.js +79 -0
  145. package/dist/middleware/authorization/authorization.js.map +1 -0
  146. package/dist/middleware/authorization/index.d.ts +36 -0
  147. package/dist/middleware/authorization/index.d.ts.map +1 -0
  148. package/dist/middleware/authorization/index.js +36 -0
  149. package/dist/middleware/authorization/index.js.map +1 -0
  150. package/dist/middleware/authorization/types.d.ts +67 -0
  151. package/dist/middleware/authorization/types.d.ts.map +1 -0
  152. package/dist/middleware/authorization/types.js +5 -0
  153. package/dist/middleware/authorization/types.js.map +1 -0
  154. package/dist/middleware/cache/cache.d.ts +41 -0
  155. package/dist/middleware/cache/cache.d.ts.map +1 -0
  156. package/dist/middleware/cache/cache.js +186 -0
  157. package/dist/middleware/cache/cache.js.map +1 -0
  158. package/dist/middleware/cache/index.d.ts +44 -0
  159. package/dist/middleware/cache/index.d.ts.map +1 -0
  160. package/dist/middleware/cache/index.js +44 -0
  161. package/dist/middleware/cache/index.js.map +1 -0
  162. package/dist/middleware/cache/types.d.ts +89 -0
  163. package/dist/middleware/cache/types.d.ts.map +1 -0
  164. package/dist/middleware/cache/types.js +5 -0
  165. package/dist/middleware/cache/types.js.map +1 -0
  166. package/dist/middleware/csrf/csrf.d.ts +34 -0
  167. package/dist/middleware/csrf/csrf.d.ts.map +1 -0
  168. package/dist/middleware/csrf/csrf.js +91 -0
  169. package/dist/middleware/csrf/csrf.js.map +1 -0
  170. package/dist/middleware/csrf/index.d.ts +57 -0
  171. package/dist/middleware/csrf/index.d.ts.map +1 -0
  172. package/dist/middleware/csrf/index.js +57 -0
  173. package/dist/middleware/csrf/index.js.map +1 -0
  174. package/dist/middleware/csrf/types.d.ts +57 -0
  175. package/dist/middleware/csrf/types.d.ts.map +1 -0
  176. package/dist/middleware/csrf/types.js +5 -0
  177. package/dist/middleware/csrf/types.js.map +1 -0
  178. package/dist/middleware/index.d.ts +115 -0
  179. package/dist/middleware/index.d.ts.map +1 -0
  180. package/dist/middleware/index.js +134 -0
  181. package/dist/middleware/index.js.map +1 -0
  182. package/dist/middleware/logging/index.d.ts +42 -0
  183. package/dist/middleware/logging/index.d.ts.map +1 -0
  184. package/dist/middleware/logging/index.js +42 -0
  185. package/dist/middleware/logging/index.js.map +1 -0
  186. package/dist/middleware/logging/logging.d.ts +29 -0
  187. package/dist/middleware/logging/logging.d.ts.map +1 -0
  188. package/dist/middleware/logging/logging.js +168 -0
  189. package/dist/middleware/logging/logging.js.map +1 -0
  190. package/dist/middleware/logging/types.d.ts +90 -0
  191. package/dist/middleware/logging/types.d.ts.map +1 -0
  192. package/dist/middleware/logging/types.js +5 -0
  193. package/dist/middleware/logging/types.js.map +1 -0
  194. package/dist/middleware/rate-limit/index.d.ts +16 -0
  195. package/dist/middleware/rate-limit/index.d.ts.map +1 -0
  196. package/dist/middleware/rate-limit/index.js +16 -0
  197. package/dist/middleware/rate-limit/index.js.map +1 -0
  198. package/dist/middleware/rate-limit/rate-limit.d.ts +14 -0
  199. package/dist/middleware/rate-limit/rate-limit.d.ts.map +1 -0
  200. package/dist/middleware/rate-limit/rate-limit.js +84 -0
  201. package/dist/middleware/rate-limit/rate-limit.js.map +1 -0
  202. package/dist/middleware/rate-limit/types.d.ts +97 -0
  203. package/dist/middleware/rate-limit/types.d.ts.map +1 -0
  204. package/dist/middleware/rate-limit/types.js +5 -0
  205. package/dist/middleware/rate-limit/types.js.map +1 -0
  206. package/dist/middleware/retry/index.d.ts +6 -0
  207. package/dist/middleware/retry/index.d.ts.map +1 -0
  208. package/dist/middleware/retry/index.js +6 -0
  209. package/dist/middleware/retry/index.js.map +1 -0
  210. package/dist/middleware/retry/retry.d.ts +39 -0
  211. package/dist/middleware/retry/retry.d.ts.map +1 -0
  212. package/dist/middleware/retry/retry.js +141 -0
  213. package/dist/middleware/retry/retry.js.map +1 -0
  214. package/dist/middleware/retry/types.d.ts +61 -0
  215. package/dist/middleware/retry/types.d.ts.map +1 -0
  216. package/dist/middleware/retry/types.js +5 -0
  217. package/dist/middleware/retry/types.js.map +1 -0
  218. package/package.json +42 -8
  219. package/dist/client.d.ts +0 -133
  220. package/dist/client.js +0 -166
  221. package/dist/client.js.map +0 -1
  222. package/dist/csrf.d.ts +0 -32
  223. package/dist/csrf.js +0 -53
  224. package/dist/csrf.js.map +0 -1
  225. package/dist/errors.js.map +0 -1
  226. package/dist/test-utils.d.ts +0 -24
  227. package/dist/test-utils.js +0 -52
  228. package/dist/test-utils.js.map +0 -1
  229. package/dist/unauthorized.d.ts +0 -27
  230. package/dist/unauthorized.js +0 -41
  231. package/dist/unauthorized.js.map +0 -1
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @fileoverview Enhanced fetch client with intercept middleware architecture.
3
+ */
4
+ import type { FetchResponse, FetchClientOptions } from './types';
5
+ /**
6
+ * Intercept middleware type that allows full control over request/response cycle.
7
+ * Middleware can modify requests, handle responses, implement retries, etc.
8
+ */
9
+ export type FetchMiddleware = (request: RequestInit & {
10
+ url?: string;
11
+ }, next: (modifiedRequest?: RequestInit & {
12
+ url?: string;
13
+ }) => Promise<FetchResponse<unknown>>) => Promise<FetchResponse<unknown>>;
14
+ /**
15
+ * Enhanced HTTP client with intercept middleware architecture.
16
+ *
17
+ * Features:
18
+ * - 🎯 Smart defaults (JSON content-type, same-origin credentials)
19
+ * - 🔧 Powerful middleware system for cross-cutting concerns
20
+ * - 🛡️ Consistent error handling (never throws, always returns response)
21
+ * - 📦 TypeScript-first with full type inference
22
+ * - 🚀 Modern async/await API
23
+ *
24
+ * @example Basic usage:
25
+ * ```typescript
26
+ * const client = new FetchClient();
27
+ *
28
+ * // GET request - just works
29
+ * const users = await client.get<User[]>('/api/users');
30
+ * if (users.ok) {
31
+ * console.log(users.data); // Type is User[]
32
+ * }
33
+ *
34
+ * // POST request - JSON by default
35
+ * const result = await client.post('/api/users', { name: 'John' });
36
+ * ```
37
+ *
38
+ * @example With middleware:
39
+ * ```typescript
40
+ * const client = new FetchClient();
41
+ *
42
+ * // Add auth middleware
43
+ * client.use((request, next) => {
44
+ * request.headers = { ...request.headers, Authorization: 'Bearer token' };
45
+ * return next(request);
46
+ * });
47
+ *
48
+ * // Now all requests include auth
49
+ * const data = await client.get('/api/protected');
50
+ * ```
51
+ */
52
+ export declare class FetchClient {
53
+ private middlewares;
54
+ private credentials;
55
+ constructor(config?: FetchClientOptions);
56
+ use(middleware: FetchMiddleware): this;
57
+ request<T = unknown>(url: string, init?: RequestInit): Promise<FetchResponse<T>>;
58
+ private coreFetch;
59
+ private parseResponse;
60
+ private buildUrlWithParams;
61
+ /**
62
+ * HEAD request with query parameter support.
63
+ *
64
+ * HEAD requests are used to retrieve metadata about a resource without downloading
65
+ * the response body. Useful for checking if a resource exists, getting content length,
66
+ * last modified date, etc.
67
+ *
68
+ * @template T - Expected response data type (will be null for HEAD requests)
69
+ * @param url - Request URL
70
+ * @param params - Query parameters to append to URL
71
+ * @returns Promise resolving to typed response (data will always be null)
72
+ *
73
+ * @example Check if resource exists:
74
+ * ```typescript
75
+ * const headResponse = await client.head('/api/large-file.zip');
76
+ * if (headResponse.ok) {
77
+ * const contentLength = headResponse.headers.get('content-length');
78
+ * const lastModified = headResponse.headers.get('last-modified');
79
+ * console.log(`File size: ${contentLength} bytes`);
80
+ * }
81
+ * ```
82
+ *
83
+ * @example Check with query parameters:
84
+ * ```typescript
85
+ * const exists = await client.head('/api/users', { id: 123 });
86
+ * if (exists.status === 404) {
87
+ * console.log('User not found');
88
+ * }
89
+ * ```
90
+ */
91
+ head<T = null>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
92
+ /**
93
+ * HEAD request that returns useful metadata about a resource.
94
+ *
95
+ * This is a convenience method that extracts common metadata from HEAD responses
96
+ * for easier consumption.
97
+ *
98
+ * @param url - Request URL
99
+ * @param params - Query parameters to append to URL
100
+ * @returns Promise resolving to response with extracted metadata
101
+ *
102
+ * @example Get resource metadata:
103
+ * ```typescript
104
+ * const metadata = await client.headMetadata('/api/large-file.zip');
105
+ * if (metadata.ok) {
106
+ * console.log('File exists:', metadata.exists);
107
+ * console.log('Content type:', metadata.contentType);
108
+ * console.log('Size:', metadata.contentLength, 'bytes');
109
+ * console.log('Last modified:', metadata.lastModified);
110
+ * }
111
+ * ```
112
+ */
113
+ headMetadata(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<null> & {
114
+ exists: boolean;
115
+ contentType: string | undefined;
116
+ contentLength: number | undefined;
117
+ lastModified: Date | undefined;
118
+ etag: string | undefined;
119
+ cacheControl: string | undefined;
120
+ }>;
121
+ /**
122
+ * GET request with query parameter support.
123
+ *
124
+ * @template T - Expected response data type
125
+ * @param url - Request URL
126
+ * @param params - Query parameters to append to URL
127
+ * @returns Promise resolving to typed response
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const users = await client.get<User[]>('/api/users');
132
+ * const filteredUsers = await client.get<User[]>('/api/users', { status: 'active', limit: 10 });
133
+ * if (users.ok) console.log(users.data);
134
+ * ```
135
+ */
136
+ get<T>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
137
+ /**
138
+ * POST request with automatic JSON serialization.
139
+ *
140
+ * @template T - Expected response data type
141
+ * @param url - Request URL
142
+ * @param body - Request body (auto-serialized to JSON)
143
+ * @param headers - Additional headers (Content-Type: application/json is default)
144
+ * @returns Promise resolving to typed response
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const result = await client.post<User>('/api/users', { name: 'John' });
149
+ * ```
150
+ */
151
+ post<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
152
+ /**
153
+ * PUT request with automatic JSON serialization.
154
+ *
155
+ * @template T - Expected response data type
156
+ * @param url - Request URL
157
+ * @param body - Request body (auto-serialized to JSON)
158
+ * @param headers - Additional headers (Content-Type: application/json is default)
159
+ * @returns Promise resolving to typed response
160
+ */
161
+ put<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
162
+ /**
163
+ * PATCH request with automatic JSON serialization.
164
+ *
165
+ * @template T - Expected response data type
166
+ * @param url - Request URL
167
+ * @param body - Request body (auto-serialized to JSON)
168
+ * @param headers - Additional headers (Content-Type: application/json is default)
169
+ * @returns Promise resolving to typed response
170
+ */
171
+ patch<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
172
+ /**
173
+ * DELETE request with query parameter support.
174
+ *
175
+ * @template T - Expected response data type
176
+ * @param url - Request URL
177
+ * @param params - Query parameters to append to URL
178
+ * @returns Promise resolving to typed response
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const result = await client.del('/api/users/123');
183
+ * const bulkResult = await client.del('/api/users', { status: 'inactive', force: true });
184
+ * if (result.ok) console.log('Deleted successfully');
185
+ * ```
186
+ */
187
+ del<T>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
188
+ }
189
+ //# sourceMappingURL=fetch-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../../src/client/fetch-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,335 @@
1
+ /**
2
+ * @fileoverview Enhanced fetch client with intercept middleware architecture.
3
+ */
4
+ /**
5
+ * Enhanced HTTP client with intercept middleware architecture.
6
+ *
7
+ * Features:
8
+ * - 🎯 Smart defaults (JSON content-type, same-origin credentials)
9
+ * - 🔧 Powerful middleware system for cross-cutting concerns
10
+ * - 🛡️ Consistent error handling (never throws, always returns response)
11
+ * - 📦 TypeScript-first with full type inference
12
+ * - 🚀 Modern async/await API
13
+ *
14
+ * @example Basic usage:
15
+ * ```typescript
16
+ * const client = new FetchClient();
17
+ *
18
+ * // GET request - just works
19
+ * const users = await client.get<User[]>('/api/users');
20
+ * if (users.ok) {
21
+ * console.log(users.data); // Type is User[]
22
+ * }
23
+ *
24
+ * // POST request - JSON by default
25
+ * const result = await client.post('/api/users', { name: 'John' });
26
+ * ```
27
+ *
28
+ * @example With middleware:
29
+ * ```typescript
30
+ * const client = new FetchClient();
31
+ *
32
+ * // Add auth middleware
33
+ * client.use((request, next) => {
34
+ * request.headers = { ...request.headers, Authorization: 'Bearer token' };
35
+ * return next(request);
36
+ * });
37
+ *
38
+ * // Now all requests include auth
39
+ * const data = await client.get('/api/protected');
40
+ * ```
41
+ */
42
+ export class FetchClient {
43
+ constructor(config = {}) {
44
+ this.middlewares = [];
45
+ this.credentials = config.credentials ?? 'same-origin';
46
+ }
47
+ use(middleware) {
48
+ this.middlewares.push(middleware);
49
+ return this;
50
+ }
51
+ async request(url, init = {}) {
52
+ // Create the execution chain
53
+ let index = 0;
54
+ const execute = async (request) => {
55
+ // Use provided request or fall back to original
56
+ const currentRequest = request || { ...init, url };
57
+ const currentUrl = currentRequest.url || url;
58
+ if (index >= this.middlewares.length) {
59
+ // Core fetch - end of middleware chain
60
+ const { url: _, ...requestInit } = currentRequest; // Remove url from request init
61
+ return this.coreFetch(requestInit, currentUrl);
62
+ }
63
+ const middleware = this.middlewares[index++];
64
+ if (!middleware) {
65
+ const { url: _, ...requestInit } = currentRequest;
66
+ return this.coreFetch(requestInit, currentUrl);
67
+ }
68
+ return middleware(currentRequest, execute);
69
+ };
70
+ const result = await execute();
71
+ return result;
72
+ }
73
+ async coreFetch(request, url) {
74
+ try {
75
+ const finalInit = {
76
+ credentials: this.credentials,
77
+ ...request,
78
+ };
79
+ // Convert Headers object to plain object for better compatibility
80
+ if (finalInit.headers instanceof Headers) {
81
+ const headersObj = {};
82
+ finalInit.headers.forEach((value, key) => {
83
+ headersObj[key] = value;
84
+ });
85
+ finalInit.headers = headersObj;
86
+ }
87
+ const response = await fetch(url, finalInit);
88
+ const data = await this.parseResponse(response);
89
+ return {
90
+ data: response.ok ? data : null,
91
+ status: response.status,
92
+ statusText: response.statusText,
93
+ headers: response.headers,
94
+ url: response.url,
95
+ ok: response.ok,
96
+ ...(response.ok
97
+ ? {}
98
+ : {
99
+ error: {
100
+ message: response.statusText,
101
+ body: data,
102
+ },
103
+ }),
104
+ };
105
+ }
106
+ catch (error) {
107
+ if (error instanceof TypeError && error.message.includes('fetch')) {
108
+ return {
109
+ data: null,
110
+ status: 0,
111
+ statusText: 'Network Error',
112
+ headers: new Headers(),
113
+ url,
114
+ ok: false,
115
+ error: {
116
+ message: 'Failed to fetch',
117
+ body: error,
118
+ },
119
+ };
120
+ }
121
+ throw error;
122
+ }
123
+ }
124
+ async parseResponse(res) {
125
+ const contentType = res.headers.get('content-type') || '';
126
+ if (contentType.includes('application/json')) {
127
+ return res.json();
128
+ }
129
+ if (contentType.includes('text/')) {
130
+ return res.text();
131
+ }
132
+ if (contentType.includes('application/octet-stream') ||
133
+ contentType.includes('image/') ||
134
+ contentType.includes('video/') ||
135
+ contentType.includes('audio/')) {
136
+ return res.blob();
137
+ }
138
+ if (res.body) {
139
+ const text = await res.text();
140
+ return text || null;
141
+ }
142
+ return null;
143
+ }
144
+ // Helper method to build URL with query parameters
145
+ buildUrlWithParams(url, params) {
146
+ if (!params) {
147
+ return url;
148
+ }
149
+ const urlObj = new URL(url, url.startsWith('http') ? undefined : 'http://localhost');
150
+ Object.entries(params).forEach(([key, value]) => {
151
+ if (value !== undefined && value !== null) {
152
+ urlObj.searchParams.set(key, String(value));
153
+ }
154
+ });
155
+ // If the original URL was relative, return just the pathname + search
156
+ if (!url.startsWith('http')) {
157
+ return urlObj.pathname + urlObj.search;
158
+ }
159
+ return urlObj.toString();
160
+ }
161
+ // 🎯 PIT OF SUCCESS: Convenience methods with smart defaults
162
+ /**
163
+ * HEAD request with query parameter support.
164
+ *
165
+ * HEAD requests are used to retrieve metadata about a resource without downloading
166
+ * the response body. Useful for checking if a resource exists, getting content length,
167
+ * last modified date, etc.
168
+ *
169
+ * @template T - Expected response data type (will be null for HEAD requests)
170
+ * @param url - Request URL
171
+ * @param params - Query parameters to append to URL
172
+ * @returns Promise resolving to typed response (data will always be null)
173
+ *
174
+ * @example Check if resource exists:
175
+ * ```typescript
176
+ * const headResponse = await client.head('/api/large-file.zip');
177
+ * if (headResponse.ok) {
178
+ * const contentLength = headResponse.headers.get('content-length');
179
+ * const lastModified = headResponse.headers.get('last-modified');
180
+ * console.log(`File size: ${contentLength} bytes`);
181
+ * }
182
+ * ```
183
+ *
184
+ * @example Check with query parameters:
185
+ * ```typescript
186
+ * const exists = await client.head('/api/users', { id: 123 });
187
+ * if (exists.status === 404) {
188
+ * console.log('User not found');
189
+ * }
190
+ * ```
191
+ */
192
+ head(url, params) {
193
+ const finalUrl = this.buildUrlWithParams(url, params);
194
+ return this.request(finalUrl, { method: 'HEAD' });
195
+ }
196
+ /**
197
+ * HEAD request that returns useful metadata about a resource.
198
+ *
199
+ * This is a convenience method that extracts common metadata from HEAD responses
200
+ * for easier consumption.
201
+ *
202
+ * @param url - Request URL
203
+ * @param params - Query parameters to append to URL
204
+ * @returns Promise resolving to response with extracted metadata
205
+ *
206
+ * @example Get resource metadata:
207
+ * ```typescript
208
+ * const metadata = await client.headMetadata('/api/large-file.zip');
209
+ * if (metadata.ok) {
210
+ * console.log('File exists:', metadata.exists);
211
+ * console.log('Content type:', metadata.contentType);
212
+ * console.log('Size:', metadata.contentLength, 'bytes');
213
+ * console.log('Last modified:', metadata.lastModified);
214
+ * }
215
+ * ```
216
+ */
217
+ async headMetadata(url, params) {
218
+ const response = await this.head(url, params);
219
+ const contentLengthHeader = response.headers.get('content-length');
220
+ const lastModifiedHeader = response.headers.get('last-modified');
221
+ return {
222
+ ...response,
223
+ exists: response.ok,
224
+ contentType: response.headers.get('content-type') || undefined,
225
+ contentLength: contentLengthHeader ? parseInt(contentLengthHeader, 10) : undefined,
226
+ lastModified: lastModifiedHeader ? new Date(lastModifiedHeader) : undefined,
227
+ etag: response.headers.get('etag') || undefined,
228
+ cacheControl: response.headers.get('cache-control') || undefined,
229
+ };
230
+ }
231
+ /**
232
+ * GET request with query parameter support.
233
+ *
234
+ * @template T - Expected response data type
235
+ * @param url - Request URL
236
+ * @param params - Query parameters to append to URL
237
+ * @returns Promise resolving to typed response
238
+ *
239
+ * @example
240
+ * ```typescript
241
+ * const users = await client.get<User[]>('/api/users');
242
+ * const filteredUsers = await client.get<User[]>('/api/users', { status: 'active', limit: 10 });
243
+ * if (users.ok) console.log(users.data);
244
+ * ```
245
+ */
246
+ get(url, params) {
247
+ const finalUrl = this.buildUrlWithParams(url, params);
248
+ return this.request(finalUrl, { method: 'GET' });
249
+ }
250
+ /**
251
+ * POST request with automatic JSON serialization.
252
+ *
253
+ * @template T - Expected response data type
254
+ * @param url - Request URL
255
+ * @param body - Request body (auto-serialized to JSON)
256
+ * @param headers - Additional headers (Content-Type: application/json is default)
257
+ * @returns Promise resolving to typed response
258
+ *
259
+ * @example
260
+ * ```typescript
261
+ * const result = await client.post<User>('/api/users', { name: 'John' });
262
+ * ```
263
+ */
264
+ post(url, body, headers) {
265
+ const requestHeaders = {
266
+ 'Content-Type': 'application/json',
267
+ ...(headers ?? {}),
268
+ };
269
+ return this.request(url, {
270
+ method: 'POST',
271
+ headers: requestHeaders,
272
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
273
+ });
274
+ }
275
+ /**
276
+ * PUT request with automatic JSON serialization.
277
+ *
278
+ * @template T - Expected response data type
279
+ * @param url - Request URL
280
+ * @param body - Request body (auto-serialized to JSON)
281
+ * @param headers - Additional headers (Content-Type: application/json is default)
282
+ * @returns Promise resolving to typed response
283
+ */
284
+ put(url, body, headers) {
285
+ const requestHeaders = {
286
+ 'Content-Type': 'application/json',
287
+ ...(headers ?? {}),
288
+ };
289
+ return this.request(url, {
290
+ method: 'PUT',
291
+ headers: requestHeaders,
292
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
293
+ });
294
+ }
295
+ /**
296
+ * PATCH request with automatic JSON serialization.
297
+ *
298
+ * @template T - Expected response data type
299
+ * @param url - Request URL
300
+ * @param body - Request body (auto-serialized to JSON)
301
+ * @param headers - Additional headers (Content-Type: application/json is default)
302
+ * @returns Promise resolving to typed response
303
+ */
304
+ patch(url, body, headers) {
305
+ const requestHeaders = {
306
+ 'Content-Type': 'application/json',
307
+ ...(headers ?? {}),
308
+ };
309
+ return this.request(url, {
310
+ method: 'PATCH',
311
+ headers: requestHeaders,
312
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
313
+ });
314
+ }
315
+ /**
316
+ * DELETE request with query parameter support.
317
+ *
318
+ * @template T - Expected response data type
319
+ * @param url - Request URL
320
+ * @param params - Query parameters to append to URL
321
+ * @returns Promise resolving to typed response
322
+ *
323
+ * @example
324
+ * ```typescript
325
+ * const result = await client.del('/api/users/123');
326
+ * const bulkResult = await client.del('/api/users', { status: 'inactive', force: true });
327
+ * if (result.ok) console.log('Deleted successfully');
328
+ * ```
329
+ */
330
+ del(url, params) {
331
+ const finalUrl = this.buildUrlWithParams(url, params);
332
+ return this.request(finalUrl, { method: 'DELETE' });
333
+ }
334
+ }
335
+ //# sourceMappingURL=fetch-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-client.js","sourceRoot":"","sources":["../../src/client/fetch-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Client module exports - "Pit of Success" design.
3
+ *
4
+ * This module provides a clean, discoverable API:
5
+ * 🎯 Level 1: FetchClient class (what 90% of users need)
6
+ * 🎯 Level 2: Types for TypeScript users (auto-discovered via IntelliSense)
7
+ */
8
+ export { FetchClient } from './fetch-client';
9
+ export type { FetchMiddleware } from './fetch-client';
10
+ export type { FetchResponse, FetchClientOptions } from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Client module exports - "Pit of Success" design.
3
+ *
4
+ * This module provides a clean, discoverable API:
5
+ * 🎯 Level 1: FetchClient class (what 90% of users need)
6
+ * 🎯 Level 2: Types for TypeScript users (auto-discovered via IntelliSense)
7
+ */
8
+ // 🎯 LEVEL 1: Main client class - the "pit of success" entry point
9
+ export { FetchClient } from './fetch-client';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,mEAAmE;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @fileoverview Type definitions for the HTTP client.
3
+ *
4
+ * This file contains core TypeScript interfaces and types for FetchClient.
5
+ * Designed for discoverability and type safety.
6
+ */
7
+ /**
8
+ * Typed response wrapper with consistent shape.
9
+ *
10
+ * ✅ Always returns this shape (never throws)
11
+ * ✅ Use `.ok` to check success
12
+ * ✅ Use `.data` for parsed response
13
+ * ✅ Use `.error` for failure details
14
+ *
15
+ * @template T - The expected type of the response data
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const result = await client.get<User[]>('/api/users');
20
+ * if (result.ok) {
21
+ * console.log(result.data); // Type is User[]
22
+ * } else {
23
+ * console.error(result.error?.message); // Handle error
24
+ * }
25
+ * ```
26
+ */
27
+ export interface FetchResponse<T> {
28
+ /** The parsed response data (null if request failed) */
29
+ data: T | null;
30
+ /** HTTP status code (0 for network errors) */
31
+ status: number;
32
+ /** HTTP status text ('Network Error' for network failures) */
33
+ statusText: string;
34
+ /** Response headers */
35
+ headers: Headers;
36
+ /** The request URL */
37
+ url: string;
38
+ /** True if status 200-299, false otherwise */
39
+ ok: boolean;
40
+ /** Error details when ok is false */
41
+ error?: {
42
+ /** Human-readable error message */
43
+ message: string;
44
+ /** Raw error response body */
45
+ body?: unknown;
46
+ };
47
+ }
48
+ /**
49
+ * Configuration options for FetchClient.
50
+ *
51
+ * Optimized for "pit of success" - good defaults, minimal required config.
52
+ */
53
+ export interface FetchClientOptions {
54
+ /**
55
+ * Controls credential handling for requests.
56
+ *
57
+ * - 'same-origin' (default): Send cookies for same-origin requests
58
+ * - 'include': Always send cookies
59
+ * - 'omit': Never send cookies
60
+ */
61
+ credentials?: RequestCredentials;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,wDAAwD;IACxD,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,EAAE,EAAE,OAAO,CAAC;IACZ,qCAAqC;IACrC,KAAK,CAAC,EAAE;QACN,mCAAmC;QACnC,OAAO,EAAE,MAAM,CAAC;QAChB,8BAA8B;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Type definitions for the HTTP client.
3
+ *
4
+ * This file contains core TypeScript interfaces and types for FetchClient.
5
+ * Designed for discoverability and type safety.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}