@fgrzl/fetch 1.1.0-alpha.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/CONTRIBUTING.md +327 -0
  3. package/README.md +50 -21
  4. package/dist/cjs/index.js +1110 -105
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/index.min.js +2 -0
  7. package/dist/cjs/index.min.js.map +1 -0
  8. package/dist/index.d.ts +1381 -10
  9. package/dist/index.js +1066 -91
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.min.js +2 -0
  12. package/dist/index.min.js.map +1 -0
  13. package/package.json +14 -5
  14. package/dist/cjs/client/fetch-client.d.ts +0 -189
  15. package/dist/cjs/client/fetch-client.d.ts.map +0 -1
  16. package/dist/cjs/client/fetch-client.js +0 -339
  17. package/dist/cjs/client/fetch-client.js.map +0 -1
  18. package/dist/cjs/client/index.d.ts +0 -11
  19. package/dist/cjs/client/index.d.ts.map +0 -1
  20. package/dist/cjs/client/index.js +0 -14
  21. package/dist/cjs/client/index.js.map +0 -1
  22. package/dist/cjs/client/types.d.ts +0 -63
  23. package/dist/cjs/client/types.d.ts.map +0 -1
  24. package/dist/cjs/client/types.js +0 -9
  25. package/dist/cjs/client/types.js.map +0 -1
  26. package/dist/cjs/errors/index.d.ts +0 -64
  27. package/dist/cjs/errors/index.d.ts.map +0 -1
  28. package/dist/cjs/errors/index.js +0 -79
  29. package/dist/cjs/errors/index.js.map +0 -1
  30. package/dist/cjs/index.d.ts +0 -65
  31. package/dist/cjs/index.d.ts.map +0 -1
  32. package/dist/cjs/middleware/authentication/authentication.d.ts +0 -31
  33. package/dist/cjs/middleware/authentication/authentication.d.ts.map +0 -1
  34. package/dist/cjs/middleware/authentication/authentication.js +0 -93
  35. package/dist/cjs/middleware/authentication/authentication.js.map +0 -1
  36. package/dist/cjs/middleware/authentication/index.d.ts +0 -37
  37. package/dist/cjs/middleware/authentication/index.d.ts.map +0 -1
  38. package/dist/cjs/middleware/authentication/index.js +0 -42
  39. package/dist/cjs/middleware/authentication/index.js.map +0 -1
  40. package/dist/cjs/middleware/authentication/types.d.ts +0 -73
  41. package/dist/cjs/middleware/authentication/types.d.ts.map +0 -1
  42. package/dist/cjs/middleware/authentication/types.js +0 -6
  43. package/dist/cjs/middleware/authentication/types.js.map +0 -1
  44. package/dist/cjs/middleware/authorization/authorization.d.ts +0 -30
  45. package/dist/cjs/middleware/authorization/authorization.d.ts.map +0 -1
  46. package/dist/cjs/middleware/authorization/authorization.js +0 -82
  47. package/dist/cjs/middleware/authorization/authorization.js.map +0 -1
  48. package/dist/cjs/middleware/authorization/index.d.ts +0 -36
  49. package/dist/cjs/middleware/authorization/index.d.ts.map +0 -1
  50. package/dist/cjs/middleware/authorization/index.js +0 -41
  51. package/dist/cjs/middleware/authorization/index.js.map +0 -1
  52. package/dist/cjs/middleware/authorization/types.d.ts +0 -67
  53. package/dist/cjs/middleware/authorization/types.d.ts.map +0 -1
  54. package/dist/cjs/middleware/authorization/types.js +0 -6
  55. package/dist/cjs/middleware/authorization/types.js.map +0 -1
  56. package/dist/cjs/middleware/cache/cache.d.ts +0 -41
  57. package/dist/cjs/middleware/cache/cache.d.ts.map +0 -1
  58. package/dist/cjs/middleware/cache/cache.js +0 -191
  59. package/dist/cjs/middleware/cache/cache.js.map +0 -1
  60. package/dist/cjs/middleware/cache/index.d.ts +0 -44
  61. package/dist/cjs/middleware/cache/index.d.ts.map +0 -1
  62. package/dist/cjs/middleware/cache/index.js +0 -50
  63. package/dist/cjs/middleware/cache/index.js.map +0 -1
  64. package/dist/cjs/middleware/cache/types.d.ts +0 -89
  65. package/dist/cjs/middleware/cache/types.d.ts.map +0 -1
  66. package/dist/cjs/middleware/cache/types.js +0 -6
  67. package/dist/cjs/middleware/cache/types.js.map +0 -1
  68. package/dist/cjs/middleware/csrf/csrf.d.ts +0 -34
  69. package/dist/cjs/middleware/csrf/csrf.d.ts.map +0 -1
  70. package/dist/cjs/middleware/csrf/csrf.js +0 -94
  71. package/dist/cjs/middleware/csrf/csrf.js.map +0 -1
  72. package/dist/cjs/middleware/csrf/index.d.ts +0 -57
  73. package/dist/cjs/middleware/csrf/index.d.ts.map +0 -1
  74. package/dist/cjs/middleware/csrf/index.js +0 -62
  75. package/dist/cjs/middleware/csrf/index.js.map +0 -1
  76. package/dist/cjs/middleware/csrf/types.d.ts +0 -57
  77. package/dist/cjs/middleware/csrf/types.d.ts.map +0 -1
  78. package/dist/cjs/middleware/csrf/types.js +0 -6
  79. package/dist/cjs/middleware/csrf/types.js.map +0 -1
  80. package/dist/cjs/middleware/index.d.ts +0 -115
  81. package/dist/cjs/middleware/index.d.ts.map +0 -1
  82. package/dist/cjs/middleware/index.js +0 -153
  83. package/dist/cjs/middleware/index.js.map +0 -1
  84. package/dist/cjs/middleware/logging/index.d.ts +0 -42
  85. package/dist/cjs/middleware/logging/index.d.ts.map +0 -1
  86. package/dist/cjs/middleware/logging/index.js +0 -47
  87. package/dist/cjs/middleware/logging/index.js.map +0 -1
  88. package/dist/cjs/middleware/logging/logging.d.ts +0 -29
  89. package/dist/cjs/middleware/logging/logging.d.ts.map +0 -1
  90. package/dist/cjs/middleware/logging/logging.js +0 -171
  91. package/dist/cjs/middleware/logging/logging.js.map +0 -1
  92. package/dist/cjs/middleware/logging/types.d.ts +0 -90
  93. package/dist/cjs/middleware/logging/types.d.ts.map +0 -1
  94. package/dist/cjs/middleware/logging/types.js +0 -6
  95. package/dist/cjs/middleware/logging/types.js.map +0 -1
  96. package/dist/cjs/middleware/rate-limit/index.d.ts +0 -16
  97. package/dist/cjs/middleware/rate-limit/index.d.ts.map +0 -1
  98. package/dist/cjs/middleware/rate-limit/index.js +0 -21
  99. package/dist/cjs/middleware/rate-limit/index.js.map +0 -1
  100. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +0 -14
  101. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  102. package/dist/cjs/middleware/rate-limit/rate-limit.js +0 -87
  103. package/dist/cjs/middleware/rate-limit/rate-limit.js.map +0 -1
  104. package/dist/cjs/middleware/rate-limit/types.d.ts +0 -97
  105. package/dist/cjs/middleware/rate-limit/types.d.ts.map +0 -1
  106. package/dist/cjs/middleware/rate-limit/types.js +0 -6
  107. package/dist/cjs/middleware/rate-limit/types.js.map +0 -1
  108. package/dist/cjs/middleware/retry/index.d.ts +0 -6
  109. package/dist/cjs/middleware/retry/index.d.ts.map +0 -1
  110. package/dist/cjs/middleware/retry/index.js +0 -11
  111. package/dist/cjs/middleware/retry/index.js.map +0 -1
  112. package/dist/cjs/middleware/retry/retry.d.ts +0 -39
  113. package/dist/cjs/middleware/retry/retry.d.ts.map +0 -1
  114. package/dist/cjs/middleware/retry/retry.js +0 -144
  115. package/dist/cjs/middleware/retry/retry.js.map +0 -1
  116. package/dist/cjs/middleware/retry/types.d.ts +0 -61
  117. package/dist/cjs/middleware/retry/types.d.ts.map +0 -1
  118. package/dist/cjs/middleware/retry/types.js +0 -6
  119. package/dist/cjs/middleware/retry/types.js.map +0 -1
  120. package/dist/client/fetch-client.d.ts +0 -189
  121. package/dist/client/fetch-client.d.ts.map +0 -1
  122. package/dist/client/fetch-client.js +0 -335
  123. package/dist/client/fetch-client.js.map +0 -1
  124. package/dist/client/index.d.ts +0 -11
  125. package/dist/client/index.d.ts.map +0 -1
  126. package/dist/client/index.js +0 -10
  127. package/dist/client/index.js.map +0 -1
  128. package/dist/client/types.d.ts +0 -63
  129. package/dist/client/types.d.ts.map +0 -1
  130. package/dist/client/types.js +0 -8
  131. package/dist/client/types.js.map +0 -1
  132. package/dist/errors/index.d.ts +0 -64
  133. package/dist/errors/index.d.ts.map +0 -1
  134. package/dist/errors/index.js +0 -73
  135. package/dist/errors/index.js.map +0 -1
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/middleware/authentication/authentication.d.ts +0 -31
  138. package/dist/middleware/authentication/authentication.d.ts.map +0 -1
  139. package/dist/middleware/authentication/authentication.js +0 -90
  140. package/dist/middleware/authentication/authentication.js.map +0 -1
  141. package/dist/middleware/authentication/index.d.ts +0 -37
  142. package/dist/middleware/authentication/index.d.ts.map +0 -1
  143. package/dist/middleware/authentication/index.js +0 -37
  144. package/dist/middleware/authentication/index.js.map +0 -1
  145. package/dist/middleware/authentication/types.d.ts +0 -73
  146. package/dist/middleware/authentication/types.d.ts.map +0 -1
  147. package/dist/middleware/authentication/types.js +0 -5
  148. package/dist/middleware/authentication/types.js.map +0 -1
  149. package/dist/middleware/authorization/authorization.d.ts +0 -30
  150. package/dist/middleware/authorization/authorization.d.ts.map +0 -1
  151. package/dist/middleware/authorization/authorization.js +0 -79
  152. package/dist/middleware/authorization/authorization.js.map +0 -1
  153. package/dist/middleware/authorization/index.d.ts +0 -36
  154. package/dist/middleware/authorization/index.d.ts.map +0 -1
  155. package/dist/middleware/authorization/index.js +0 -36
  156. package/dist/middleware/authorization/index.js.map +0 -1
  157. package/dist/middleware/authorization/types.d.ts +0 -67
  158. package/dist/middleware/authorization/types.d.ts.map +0 -1
  159. package/dist/middleware/authorization/types.js +0 -5
  160. package/dist/middleware/authorization/types.js.map +0 -1
  161. package/dist/middleware/cache/cache.d.ts +0 -41
  162. package/dist/middleware/cache/cache.d.ts.map +0 -1
  163. package/dist/middleware/cache/cache.js +0 -186
  164. package/dist/middleware/cache/cache.js.map +0 -1
  165. package/dist/middleware/cache/index.d.ts +0 -44
  166. package/dist/middleware/cache/index.d.ts.map +0 -1
  167. package/dist/middleware/cache/index.js +0 -44
  168. package/dist/middleware/cache/index.js.map +0 -1
  169. package/dist/middleware/cache/types.d.ts +0 -89
  170. package/dist/middleware/cache/types.d.ts.map +0 -1
  171. package/dist/middleware/cache/types.js +0 -5
  172. package/dist/middleware/cache/types.js.map +0 -1
  173. package/dist/middleware/csrf/csrf.d.ts +0 -34
  174. package/dist/middleware/csrf/csrf.d.ts.map +0 -1
  175. package/dist/middleware/csrf/csrf.js +0 -91
  176. package/dist/middleware/csrf/csrf.js.map +0 -1
  177. package/dist/middleware/csrf/index.d.ts +0 -57
  178. package/dist/middleware/csrf/index.d.ts.map +0 -1
  179. package/dist/middleware/csrf/index.js +0 -57
  180. package/dist/middleware/csrf/index.js.map +0 -1
  181. package/dist/middleware/csrf/types.d.ts +0 -57
  182. package/dist/middleware/csrf/types.d.ts.map +0 -1
  183. package/dist/middleware/csrf/types.js +0 -5
  184. package/dist/middleware/csrf/types.js.map +0 -1
  185. package/dist/middleware/index.d.ts +0 -115
  186. package/dist/middleware/index.d.ts.map +0 -1
  187. package/dist/middleware/index.js +0 -134
  188. package/dist/middleware/index.js.map +0 -1
  189. package/dist/middleware/logging/index.d.ts +0 -42
  190. package/dist/middleware/logging/index.d.ts.map +0 -1
  191. package/dist/middleware/logging/index.js +0 -42
  192. package/dist/middleware/logging/index.js.map +0 -1
  193. package/dist/middleware/logging/logging.d.ts +0 -29
  194. package/dist/middleware/logging/logging.d.ts.map +0 -1
  195. package/dist/middleware/logging/logging.js +0 -168
  196. package/dist/middleware/logging/logging.js.map +0 -1
  197. package/dist/middleware/logging/types.d.ts +0 -90
  198. package/dist/middleware/logging/types.d.ts.map +0 -1
  199. package/dist/middleware/logging/types.js +0 -5
  200. package/dist/middleware/logging/types.js.map +0 -1
  201. package/dist/middleware/rate-limit/index.d.ts +0 -16
  202. package/dist/middleware/rate-limit/index.d.ts.map +0 -1
  203. package/dist/middleware/rate-limit/index.js +0 -16
  204. package/dist/middleware/rate-limit/index.js.map +0 -1
  205. package/dist/middleware/rate-limit/rate-limit.d.ts +0 -14
  206. package/dist/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  207. package/dist/middleware/rate-limit/rate-limit.js +0 -84
  208. package/dist/middleware/rate-limit/rate-limit.js.map +0 -1
  209. package/dist/middleware/rate-limit/types.d.ts +0 -97
  210. package/dist/middleware/rate-limit/types.d.ts.map +0 -1
  211. package/dist/middleware/rate-limit/types.js +0 -5
  212. package/dist/middleware/rate-limit/types.js.map +0 -1
  213. package/dist/middleware/retry/index.d.ts +0 -6
  214. package/dist/middleware/retry/index.d.ts.map +0 -1
  215. package/dist/middleware/retry/index.js +0 -6
  216. package/dist/middleware/retry/index.js.map +0 -1
  217. package/dist/middleware/retry/retry.d.ts +0 -39
  218. package/dist/middleware/retry/retry.d.ts.map +0 -1
  219. package/dist/middleware/retry/retry.js +0 -141
  220. package/dist/middleware/retry/retry.js.map +0 -1
  221. package/dist/middleware/retry/types.d.ts +0 -61
  222. package/dist/middleware/retry/types.d.ts.map +0 -1
  223. package/dist/middleware/retry/types.js +0 -5
  224. package/dist/middleware/retry/types.js.map +0 -1
@@ -1,47 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Logging middleware - "pit of success" API.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createLoggingMiddleware = void 0;
7
- exports.useLogging = useLogging;
8
- const logging_1 = require("./logging");
9
- var logging_2 = require("./logging");
10
- Object.defineProperty(exports, "createLoggingMiddleware", { enumerable: true, get: function () { return logging_2.createLoggingMiddleware; } });
11
- /**
12
- * "Pit of success" API for adding logging to a FetchClient.
13
- * Logs HTTP requests and responses for debugging and monitoring.
14
- *
15
- * @param client - The FetchClient to add logging to
16
- * @param options - Logging configuration options
17
- * @returns A new FetchClient with logging middleware
18
- *
19
- * @example Basic logging to console:
20
- * ```typescript
21
- * const loggedClient = useLogging(client);
22
- *
23
- * // Logs: → GET /api/users
24
- * // Logs: ← GET /api/users → 200 (245ms)
25
- * await loggedClient.get('/api/users');
26
- * ```
27
- *
28
- * @example Custom log level and headers:
29
- * ```typescript
30
- * const loggedClient = useLogging(client, {
31
- * level: 'debug',
32
- * includeRequestHeaders: true,
33
- * includeResponseHeaders: true
34
- * });
35
- * ```
36
- *
37
- * @example Skip health check endpoints:
38
- * ```typescript
39
- * const loggedClient = useLogging(client, {
40
- * skipPatterns: ['/health', '/metrics', '/ping']
41
- * });
42
- * ```
43
- */
44
- function useLogging(client, options = {}) {
45
- return client.use((0, logging_1.createLoggingMiddleware)(options));
46
- }
47
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/logging/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA2CH,gCAKC;AA5CD,uCAAoD;AAIpD,qCAAoD;AAA3C,kHAAA,uBAAuB,OAAA;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAgB,UAAU,CACxB,MAAmB,EACnB,UAA0B,EAAE;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * @fileoverview Logging middleware implementation.
3
- */
4
- import type { FetchMiddleware } from '../../client/fetch-client';
5
- import type { LoggingOptions } from './types';
6
- /**
7
- * Creates logging middleware with smart defaults.
8
- * Logs HTTP requests and responses for debugging and monitoring.
9
- *
10
- * @param options - Logging configuration options
11
- * @returns Logging middleware for use with FetchClient
12
- *
13
- * @example Basic logging:
14
- * ```typescript
15
- * const loggedClient = useLogging(client);
16
- * // Logs all requests to console
17
- * ```
18
- *
19
- * @example Custom logger:
20
- * ```typescript
21
- * const loggedClient = useLogging(client, {
22
- * logger: winston.createLogger({...}),
23
- * level: 'debug',
24
- * includeRequestHeaders: true
25
- * });
26
- * ```
27
- */
28
- export declare function createLoggingMiddleware(options?: LoggingOptions): FetchMiddleware;
29
- //# sourceMappingURL=logging.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AA2D1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAmGjB"}
@@ -1,171 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Logging middleware implementation.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createLoggingMiddleware = createLoggingMiddleware;
7
- /**
8
- * Default console logger implementation.
9
- */
10
- const defaultLogger = {
11
- // eslint-disable-next-line no-console -- allow console.debug in logger implementation
12
- debug: (message, data) => console.debug(message, data),
13
- // eslint-disable-next-line no-console -- allow console.info in logger implementation
14
- info: (message, data) => console.info(message, data),
15
- // eslint-disable-next-line no-console -- allow console.warn in logger implementation
16
- warn: (message, data) => console.warn(message, data),
17
- // eslint-disable-next-line no-console -- allow console.error in logger implementation
18
- error: (message, data) => console.error(message, data),
19
- };
20
- /**
21
- * Log level priority for filtering.
22
- */
23
- const LOG_LEVELS = {
24
- debug: 0,
25
- info: 1,
26
- warn: 2,
27
- error: 3,
28
- };
29
- /**
30
- * Default log formatter.
31
- */
32
- const defaultFormatter = (entry) => {
33
- const { method, url, status, duration } = entry;
34
- let message = `${method} ${url}`;
35
- if (status) {
36
- message += ` → ${status}`;
37
- }
38
- if (duration) {
39
- message += ` (${duration}ms)`;
40
- }
41
- return message;
42
- };
43
- /**
44
- * Checks if a URL should skip logging based on configured patterns.
45
- */
46
- function shouldSkipLogging(url, skipPatterns = []) {
47
- return skipPatterns.some((pattern) => {
48
- if (typeof pattern === 'string') {
49
- return url.includes(pattern);
50
- }
51
- return pattern.test(url);
52
- });
53
- }
54
- /**
55
- * Creates logging middleware with smart defaults.
56
- * Logs HTTP requests and responses for debugging and monitoring.
57
- *
58
- * @param options - Logging configuration options
59
- * @returns Logging middleware for use with FetchClient
60
- *
61
- * @example Basic logging:
62
- * ```typescript
63
- * const loggedClient = useLogging(client);
64
- * // Logs all requests to console
65
- * ```
66
- *
67
- * @example Custom logger:
68
- * ```typescript
69
- * const loggedClient = useLogging(client, {
70
- * logger: winston.createLogger({...}),
71
- * level: 'debug',
72
- * includeRequestHeaders: true
73
- * });
74
- * ```
75
- */
76
- function createLoggingMiddleware(options = {}) {
77
- const { level = 'info', logger = defaultLogger, includeRequestHeaders = false, includeResponseHeaders = false, includeRequestBody = false, includeResponseBody = false, skipPatterns = [], formatter = defaultFormatter, } = options;
78
- const minLevel = LOG_LEVELS[level];
79
- return async (request, next) => {
80
- const url = request.url || '';
81
- const method = (request.method || 'GET').toUpperCase();
82
- // Skip logging if URL matches skip patterns
83
- if (shouldSkipLogging(url, skipPatterns)) {
84
- return next(request);
85
- }
86
- const startTime = Date.now();
87
- // Log request start (debug level)
88
- if (LOG_LEVELS.debug >= minLevel) {
89
- const requestHeaders = includeRequestHeaders
90
- ? getHeadersObject(request.headers)
91
- : undefined;
92
- const requestBody = includeRequestBody ? request.body : undefined;
93
- const requestEntry = {
94
- level: 'debug',
95
- timestamp: startTime,
96
- method,
97
- url,
98
- ...(requestHeaders && { requestHeaders }),
99
- ...(requestBody && { requestBody }),
100
- };
101
- logger.debug(`→ ${formatter(requestEntry)}`, requestEntry);
102
- }
103
- try {
104
- const response = await next(request);
105
- const duration = Date.now() - startTime;
106
- // Determine log level based on response status
107
- const logLevel = response.status >= 400 ? 'error' : 'info';
108
- // Log response (info/error level)
109
- if (LOG_LEVELS[logLevel] >= minLevel) {
110
- const responseHeaders = includeResponseHeaders
111
- ? getHeadersObject(response.headers)
112
- : undefined;
113
- const responseBody = includeResponseBody ? response.data : undefined;
114
- const responseEntry = {
115
- level: logLevel,
116
- timestamp: Date.now(),
117
- method,
118
- url,
119
- status: response.status,
120
- duration,
121
- ...(responseHeaders ? { responseHeaders } : {}),
122
- ...(responseBody !== undefined ? { responseBody } : {}),
123
- };
124
- const logMessage = `← ${formatter(responseEntry)}`;
125
- if (logLevel === 'error') {
126
- logger.error(logMessage, responseEntry);
127
- }
128
- else {
129
- logger.info(logMessage, responseEntry);
130
- }
131
- }
132
- return response;
133
- }
134
- catch (error) {
135
- const duration = Date.now() - startTime;
136
- // Log error
137
- if (LOG_LEVELS.error >= minLevel) {
138
- const errorEntry = {
139
- level: 'error',
140
- timestamp: Date.now(),
141
- method,
142
- url,
143
- duration,
144
- error: error instanceof Error ? error : new Error(String(error)),
145
- };
146
- logger.error(`✗ ${formatter(errorEntry)}`, errorEntry);
147
- }
148
- throw error;
149
- }
150
- };
151
- }
152
- /**
153
- * Convert Headers object to plain object.
154
- */
155
- function getHeadersObject(headers) {
156
- if (!headers) {
157
- return undefined;
158
- }
159
- const obj = {};
160
- if (headers instanceof Headers) {
161
- headers.forEach((value, key) => {
162
- obj[key] = value;
163
- });
164
- return obj;
165
- }
166
- else {
167
- // It's already a Record<string, string>
168
- return headers;
169
- }
170
- }
171
- //# sourceMappingURL=logging.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../src/middleware/logging/logging.ts"],"names":[],"mappings":"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"}
@@ -1,90 +0,0 @@
1
- /**
2
- * @fileoverview Logging middleware types and configuration.
3
- */
4
- /**
5
- * Log levels for filtering log output.
6
- */
7
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
8
- /**
9
- * Log entry structure.
10
- */
11
- export interface LogEntry {
12
- level: LogLevel;
13
- timestamp: number;
14
- method: string;
15
- url: string;
16
- status?: number;
17
- duration?: number;
18
- error?: Error;
19
- requestHeaders?: Record<string, string>;
20
- responseHeaders?: Record<string, string>;
21
- requestBody?: unknown;
22
- responseBody?: unknown;
23
- }
24
- /**
25
- * Custom logger interface.
26
- */
27
- export interface Logger {
28
- debug(message: string, data?: unknown): void;
29
- info(message: string, data?: unknown): void;
30
- warn(message: string, data?: unknown): void;
31
- error(message: string, data?: unknown): void;
32
- }
33
- /**
34
- * Logging configuration options - optimized for "pit of success".
35
- *
36
- * Smart defaults:
37
- * - Logs to console
38
- * - Info level by default
39
- * - Excludes request/response bodies by default
40
- * - Includes timing information
41
- */
42
- export interface LoggingOptions {
43
- /**
44
- * Minimum log level to output (default: 'info')
45
- * Logs at this level and above will be output
46
- */
47
- level?: LogLevel;
48
- /**
49
- * Custom logger implementation (default: console)
50
- * Can be replaced with winston, pino, etc.
51
- */
52
- logger?: Logger;
53
- /**
54
- * Include request headers in logs (default: false)
55
- * May contain sensitive information
56
- */
57
- includeRequestHeaders?: boolean;
58
- /**
59
- * Include response headers in logs (default: false)
60
- * May contain sensitive information
61
- */
62
- includeResponseHeaders?: boolean;
63
- /**
64
- * Include request body in logs (default: false)
65
- * May contain sensitive information and increase log size
66
- */
67
- includeRequestBody?: boolean;
68
- /**
69
- * Include response body in logs (default: false)
70
- * May contain sensitive information and increase log size
71
- */
72
- includeResponseBody?: boolean;
73
- /**
74
- * Skip logging for requests matching these URL patterns
75
- * Useful for health checks, metrics endpoints, etc.
76
- *
77
- * @example
78
- * ```typescript
79
- * skipPatterns: ['/health', '/metrics', /\/static\//]
80
- * ```
81
- */
82
- skipPatterns?: (RegExp | string)[];
83
- /**
84
- * Custom log formatter function
85
- * Allows complete customization of log output
86
- */
87
- formatter?: (entry: LogEntry) => string;
88
- }
89
- export {};
90
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;CACzC;AAGD,OAAO,EAAE,CAAC"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Logging middleware types and configuration.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/logging/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -1,16 +0,0 @@
1
- /**
2
- * @fileoverview Rate limiting middleware - specialized use cases.
3
- */
4
- import type { FetchClient } from '../../client/fetch-client';
5
- import type { RateLimitOptions } from './types';
6
- export type { RateLimitOptions, RateLimitAlgorithm } from './types';
7
- export { createRateLimitMiddleware } from './rate-limit';
8
- /**
9
- * Rate limiting middleware - mainly for API quota management.
10
- * Note: This is primarily useful for specific scenarios like:
11
- * - Respecting third-party API limits
12
- * - Bulk operations that need throttling
13
- * - Pay-per-request API cost management
14
- */
15
- export declare function useRateLimit(client: FetchClient, options?: RateLimitOptions): FetchClient;
16
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIhD,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,gBAAqB,GAC7B,WAAW,CAEb"}
@@ -1,21 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Rate limiting middleware - specialized use cases.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createRateLimitMiddleware = void 0;
7
- exports.useRateLimit = useRateLimit;
8
- const rate_limit_1 = require("./rate-limit");
9
- var rate_limit_2 = require("./rate-limit");
10
- Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_2.createRateLimitMiddleware; } });
11
- /**
12
- * Rate limiting middleware - mainly for API quota management.
13
- * Note: This is primarily useful for specific scenarios like:
14
- * - Respecting third-party API limits
15
- * - Bulk operations that need throttling
16
- * - Pay-per-request API cost management
17
- */
18
- function useRateLimit(client, options = {}) {
19
- return client.use((0, rate_limit_1.createRateLimitMiddleware)(options));
20
- }
21
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiBH,oCAKC;AAlBD,6CAAyD;AAIzD,2CAAyD;AAAhD,uHAAA,yBAAyB,OAAA;AAElC;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,MAAmB,EACnB,UAA4B,EAAE;IAE9B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * @fileoverview Rate limiting middleware implementation.
3
- */
4
- import type { FetchMiddleware } from '../../client/fetch-client';
5
- import type { RateLimitOptions } from './types';
6
- /**
7
- * Creates rate limiting middleware - mainly for API quota management.
8
- * Note: Rate limiting is typically a server concern, but this can help with:
9
- * - Respecting API provider limits
10
- * - Preventing runaway requests in bulk operations
11
- * - Cost management for pay-per-request APIs
12
- */
13
- export declare function createRateLimitMiddleware(options?: RateLimitOptions): FetchMiddleware;
14
- //# sourceMappingURL=rate-limit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAyChD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA6DjB"}
@@ -1,87 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Rate limiting middleware implementation.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createRateLimitMiddleware = createRateLimitMiddleware;
7
- /**
8
- * Simple token bucket implementation for rate limiting.
9
- */
10
- class TokenBucket {
11
- constructor(maxTokens, refillRate, // tokens per millisecond
12
- timeProvider = () => Date.now()) {
13
- this.maxTokens = maxTokens;
14
- this.refillRate = refillRate;
15
- this.timeProvider = timeProvider;
16
- this.tokens = maxTokens;
17
- this.lastRefill = this.timeProvider();
18
- }
19
- tryConsume() {
20
- this.refill();
21
- if (this.tokens >= 1) {
22
- this.tokens--;
23
- return { allowed: true };
24
- }
25
- // Calculate when next token will be available
26
- const retryAfter = (1 - this.tokens) / this.refillRate;
27
- return { allowed: false, retryAfter: Math.ceil(retryAfter) };
28
- }
29
- refill() {
30
- const now = this.timeProvider();
31
- const timePassed = now - this.lastRefill;
32
- const tokensToAdd = timePassed * this.refillRate;
33
- this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);
34
- this.lastRefill = now;
35
- }
36
- }
37
- /**
38
- * Creates rate limiting middleware - mainly for API quota management.
39
- * Note: Rate limiting is typically a server concern, but this can help with:
40
- * - Respecting API provider limits
41
- * - Preventing runaway requests in bulk operations
42
- * - Cost management for pay-per-request APIs
43
- */
44
- function createRateLimitMiddleware(options = {}) {
45
- const { maxRequests = 60, windowMs = 60000, keyGenerator = () => 'default', skipPatterns = [], onRateLimitExceeded, } = options;
46
- const buckets = new Map();
47
- const refillRate = maxRequests / windowMs;
48
- return async (request, next) => {
49
- const url = request.url || '';
50
- // Skip rate limiting if URL matches skip patterns
51
- if (skipPatterns.some((pattern) => typeof pattern === 'string' ? url.includes(pattern) : pattern.test(url))) {
52
- return next(request);
53
- }
54
- const key = keyGenerator(request);
55
- if (!buckets.has(key)) {
56
- buckets.set(key, new TokenBucket(maxRequests, refillRate));
57
- }
58
- const bucket = buckets.get(key);
59
- const result = bucket.tryConsume();
60
- if (!result.allowed) {
61
- if (onRateLimitExceeded) {
62
- const customResponse = await onRateLimitExceeded(result.retryAfter || 0, request);
63
- // If the custom handler returns a response, use it
64
- if (customResponse) {
65
- return customResponse;
66
- }
67
- }
68
- // Return a 429 Too Many Requests response instead of throwing
69
- return {
70
- data: null,
71
- status: 429,
72
- statusText: 'Too Many Requests',
73
- headers: new Headers({
74
- 'Retry-After': Math.ceil((result.retryAfter || 0) / 1000).toString(),
75
- }),
76
- url: request.url || '',
77
- ok: false,
78
- error: {
79
- message: `Rate limit exceeded. Retry after ${result.retryAfter}ms`,
80
- body: { retryAfter: result.retryAfter },
81
- },
82
- };
83
- }
84
- return next(request);
85
- };
86
- }
87
- //# sourceMappingURL=rate-limit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -1,97 +0,0 @@
1
- /**
2
- * @fileoverview Rate limiting middleware types and configuration.
3
- */
4
- /**
5
- * Rate limiting algorithm types.
6
- */
7
- export type RateLimitAlgorithm = 'token-bucket' | 'sliding-window' | 'fixed-window';
8
- /**
9
- * Rate limiting configuration options - optimized for "pit of success".
10
- *
11
- * Smart defaults:
12
- * - 60 requests per minute
13
- * - Token bucket algorithm
14
- * - Per-client limiting
15
- * - Graceful handling when rate limit exceeded
16
- */
17
- export interface RateLimitOptions {
18
- /**
19
- * Maximum number of requests allowed (default: 60)
20
- */
21
- maxRequests?: number;
22
- /**
23
- * Time window in milliseconds (default: 60000 = 1 minute)
24
- */
25
- windowMs?: number;
26
- /**
27
- * Rate limiting algorithm (default: 'token-bucket')
28
- * - 'token-bucket': Allows bursts up to maxRequests, refills over time
29
- * - 'sliding-window': Smooth rate limiting over rolling window
30
- * - 'fixed-window': Fixed number of requests per fixed time window
31
- */
32
- algorithm?: RateLimitAlgorithm;
33
- /**
34
- * Custom key generator for rate limiting scope
35
- * Default: single global rate limit for all requests
36
- *
37
- * @example Per-endpoint rate limiting:
38
- * ```typescript
39
- * keyGenerator: (request) => request.url || 'default'
40
- * ```
41
- *
42
- * @example Per-user rate limiting:
43
- * ```typescript
44
- * keyGenerator: (request) => {
45
- * const auth = request.headers?.get('Authorization');
46
- * return auth ? `user:${auth}` : 'anonymous';
47
- * }
48
- * ```
49
- */
50
- keyGenerator?: (request: RequestInit & {
51
- url?: string;
52
- }) => string;
53
- /**
54
- * Skip rate limiting for requests matching these URL patterns
55
- *
56
- * @example
57
- * ```typescript
58
- * skipPatterns: ['/health', /^\/public\//]
59
- * ```
60
- */
61
- skipPatterns?: (RegExp | string)[];
62
- /**
63
- * Custom handler called when rate limit is exceeded
64
- * Can return a custom response or void to use default behavior
65
- *
66
- * @param retryAfter - Milliseconds until next request is allowed
67
- * @param request - The rate-limited request
68
- * @returns Custom response or void for default behavior
69
- */
70
- onRateLimitExceeded?: (retryAfter: number, request: RequestInit & {
71
- url?: string;
72
- }) => void | Promise<void> | {
73
- data: unknown;
74
- status: number;
75
- statusText: string;
76
- headers: Headers;
77
- url: string;
78
- ok: boolean;
79
- error?: {
80
- message: string;
81
- body?: unknown;
82
- };
83
- } | Promise<{
84
- data: unknown;
85
- status: number;
86
- statusText: string;
87
- headers: Headers;
88
- url: string;
89
- ok: boolean;
90
- error?: {
91
- message: string;
92
- body?: unknown;
93
- };
94
- }>;
95
- }
96
- export {};
97
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,gBAAgB,GAChB,cAAc,CAAC;AAEnB;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAEnE;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,WAAW,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KACpC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG;QAC1B,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAC7C,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAC7C,CAAC,CAAC;CACJ;AAGD,OAAO,EAAE,CAAC"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Rate limiting middleware types and configuration.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -1,6 +0,0 @@
1
- import type { FetchClient } from '../../client/fetch-client';
2
- import type { RetryOptions } from './types';
3
- export type { RetryOptions } from './types';
4
- export { createRetryMiddleware } from './retry';
5
- export declare function useRetry(client: FetchClient, options?: RetryOptions): FetchClient;
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/retry/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,QAAQ,CACtB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,WAAW,CAEb"}