@fgrzl/fetch 1.1.0-alpha.8 → 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.
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +327 -0
- package/README.md +50 -21
- package/dist/cjs/index.js +1110 -105
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +2 -0
- package/dist/cjs/index.min.js.map +1 -0
- package/dist/index.d.ts +1381 -10
- package/dist/index.js +1066 -91
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +1 -0
- package/package.json +14 -5
- package/dist/cjs/client/fetch-client.d.ts +0 -189
- package/dist/cjs/client/fetch-client.d.ts.map +0 -1
- package/dist/cjs/client/fetch-client.js +0 -339
- package/dist/cjs/client/fetch-client.js.map +0 -1
- package/dist/cjs/client/index.d.ts +0 -11
- package/dist/cjs/client/index.d.ts.map +0 -1
- package/dist/cjs/client/index.js +0 -14
- package/dist/cjs/client/index.js.map +0 -1
- package/dist/cjs/client/types.d.ts +0 -63
- package/dist/cjs/client/types.d.ts.map +0 -1
- package/dist/cjs/client/types.js +0 -9
- package/dist/cjs/client/types.js.map +0 -1
- package/dist/cjs/errors/index.d.ts +0 -64
- package/dist/cjs/errors/index.d.ts.map +0 -1
- package/dist/cjs/errors/index.js +0 -79
- package/dist/cjs/errors/index.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -65
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/authentication.d.ts +0 -31
- package/dist/cjs/middleware/authentication/authentication.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/authentication.js +0 -93
- package/dist/cjs/middleware/authentication/authentication.js.map +0 -1
- package/dist/cjs/middleware/authentication/index.d.ts +0 -37
- package/dist/cjs/middleware/authentication/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/index.js +0 -42
- package/dist/cjs/middleware/authentication/index.js.map +0 -1
- package/dist/cjs/middleware/authentication/types.d.ts +0 -73
- package/dist/cjs/middleware/authentication/types.d.ts.map +0 -1
- package/dist/cjs/middleware/authentication/types.js +0 -6
- package/dist/cjs/middleware/authentication/types.js.map +0 -1
- package/dist/cjs/middleware/authorization/authorization.d.ts +0 -30
- package/dist/cjs/middleware/authorization/authorization.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/authorization.js +0 -82
- package/dist/cjs/middleware/authorization/authorization.js.map +0 -1
- package/dist/cjs/middleware/authorization/index.d.ts +0 -36
- package/dist/cjs/middleware/authorization/index.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/index.js +0 -41
- package/dist/cjs/middleware/authorization/index.js.map +0 -1
- package/dist/cjs/middleware/authorization/types.d.ts +0 -67
- package/dist/cjs/middleware/authorization/types.d.ts.map +0 -1
- package/dist/cjs/middleware/authorization/types.js +0 -6
- package/dist/cjs/middleware/authorization/types.js.map +0 -1
- package/dist/cjs/middleware/cache/cache.d.ts +0 -41
- package/dist/cjs/middleware/cache/cache.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/cache.js +0 -191
- package/dist/cjs/middleware/cache/cache.js.map +0 -1
- package/dist/cjs/middleware/cache/index.d.ts +0 -44
- package/dist/cjs/middleware/cache/index.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/index.js +0 -50
- package/dist/cjs/middleware/cache/index.js.map +0 -1
- package/dist/cjs/middleware/cache/types.d.ts +0 -89
- package/dist/cjs/middleware/cache/types.d.ts.map +0 -1
- package/dist/cjs/middleware/cache/types.js +0 -6
- package/dist/cjs/middleware/cache/types.js.map +0 -1
- package/dist/cjs/middleware/csrf/csrf.d.ts +0 -34
- package/dist/cjs/middleware/csrf/csrf.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/csrf.js +0 -94
- package/dist/cjs/middleware/csrf/csrf.js.map +0 -1
- package/dist/cjs/middleware/csrf/index.d.ts +0 -57
- package/dist/cjs/middleware/csrf/index.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/index.js +0 -62
- package/dist/cjs/middleware/csrf/index.js.map +0 -1
- package/dist/cjs/middleware/csrf/types.d.ts +0 -57
- package/dist/cjs/middleware/csrf/types.d.ts.map +0 -1
- package/dist/cjs/middleware/csrf/types.js +0 -6
- package/dist/cjs/middleware/csrf/types.js.map +0 -1
- package/dist/cjs/middleware/index.d.ts +0 -115
- package/dist/cjs/middleware/index.d.ts.map +0 -1
- package/dist/cjs/middleware/index.js +0 -153
- package/dist/cjs/middleware/index.js.map +0 -1
- package/dist/cjs/middleware/logging/index.d.ts +0 -42
- package/dist/cjs/middleware/logging/index.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/index.js +0 -47
- package/dist/cjs/middleware/logging/index.js.map +0 -1
- package/dist/cjs/middleware/logging/logging.d.ts +0 -29
- package/dist/cjs/middleware/logging/logging.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/logging.js +0 -171
- package/dist/cjs/middleware/logging/logging.js.map +0 -1
- package/dist/cjs/middleware/logging/types.d.ts +0 -90
- package/dist/cjs/middleware/logging/types.d.ts.map +0 -1
- package/dist/cjs/middleware/logging/types.js +0 -6
- package/dist/cjs/middleware/logging/types.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/index.d.ts +0 -16
- package/dist/cjs/middleware/rate-limit/index.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/index.js +0 -21
- package/dist/cjs/middleware/rate-limit/index.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +0 -14
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/rate-limit.js +0 -87
- package/dist/cjs/middleware/rate-limit/rate-limit.js.map +0 -1
- package/dist/cjs/middleware/rate-limit/types.d.ts +0 -97
- package/dist/cjs/middleware/rate-limit/types.d.ts.map +0 -1
- package/dist/cjs/middleware/rate-limit/types.js +0 -6
- package/dist/cjs/middleware/rate-limit/types.js.map +0 -1
- package/dist/cjs/middleware/retry/index.d.ts +0 -6
- package/dist/cjs/middleware/retry/index.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/index.js +0 -11
- package/dist/cjs/middleware/retry/index.js.map +0 -1
- package/dist/cjs/middleware/retry/retry.d.ts +0 -39
- package/dist/cjs/middleware/retry/retry.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/retry.js +0 -144
- package/dist/cjs/middleware/retry/retry.js.map +0 -1
- package/dist/cjs/middleware/retry/types.d.ts +0 -61
- package/dist/cjs/middleware/retry/types.d.ts.map +0 -1
- package/dist/cjs/middleware/retry/types.js +0 -6
- package/dist/cjs/middleware/retry/types.js.map +0 -1
- package/dist/client/fetch-client.d.ts +0 -189
- package/dist/client/fetch-client.d.ts.map +0 -1
- package/dist/client/fetch-client.js +0 -335
- package/dist/client/fetch-client.js.map +0 -1
- package/dist/client/index.d.ts +0 -11
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -10
- package/dist/client/index.js.map +0 -1
- package/dist/client/types.d.ts +0 -63
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -8
- package/dist/client/types.js.map +0 -1
- package/dist/errors/index.d.ts +0 -64
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -73
- package/dist/errors/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/authentication/authentication.d.ts +0 -31
- package/dist/middleware/authentication/authentication.d.ts.map +0 -1
- package/dist/middleware/authentication/authentication.js +0 -90
- package/dist/middleware/authentication/authentication.js.map +0 -1
- package/dist/middleware/authentication/index.d.ts +0 -37
- package/dist/middleware/authentication/index.d.ts.map +0 -1
- package/dist/middleware/authentication/index.js +0 -37
- package/dist/middleware/authentication/index.js.map +0 -1
- package/dist/middleware/authentication/types.d.ts +0 -73
- package/dist/middleware/authentication/types.d.ts.map +0 -1
- package/dist/middleware/authentication/types.js +0 -5
- package/dist/middleware/authentication/types.js.map +0 -1
- package/dist/middleware/authorization/authorization.d.ts +0 -30
- package/dist/middleware/authorization/authorization.d.ts.map +0 -1
- package/dist/middleware/authorization/authorization.js +0 -79
- package/dist/middleware/authorization/authorization.js.map +0 -1
- package/dist/middleware/authorization/index.d.ts +0 -36
- package/dist/middleware/authorization/index.d.ts.map +0 -1
- package/dist/middleware/authorization/index.js +0 -36
- package/dist/middleware/authorization/index.js.map +0 -1
- package/dist/middleware/authorization/types.d.ts +0 -67
- package/dist/middleware/authorization/types.d.ts.map +0 -1
- package/dist/middleware/authorization/types.js +0 -5
- package/dist/middleware/authorization/types.js.map +0 -1
- package/dist/middleware/cache/cache.d.ts +0 -41
- package/dist/middleware/cache/cache.d.ts.map +0 -1
- package/dist/middleware/cache/cache.js +0 -186
- package/dist/middleware/cache/cache.js.map +0 -1
- package/dist/middleware/cache/index.d.ts +0 -44
- package/dist/middleware/cache/index.d.ts.map +0 -1
- package/dist/middleware/cache/index.js +0 -44
- package/dist/middleware/cache/index.js.map +0 -1
- package/dist/middleware/cache/types.d.ts +0 -89
- package/dist/middleware/cache/types.d.ts.map +0 -1
- package/dist/middleware/cache/types.js +0 -5
- package/dist/middleware/cache/types.js.map +0 -1
- package/dist/middleware/csrf/csrf.d.ts +0 -34
- package/dist/middleware/csrf/csrf.d.ts.map +0 -1
- package/dist/middleware/csrf/csrf.js +0 -91
- package/dist/middleware/csrf/csrf.js.map +0 -1
- package/dist/middleware/csrf/index.d.ts +0 -57
- package/dist/middleware/csrf/index.d.ts.map +0 -1
- package/dist/middleware/csrf/index.js +0 -57
- package/dist/middleware/csrf/index.js.map +0 -1
- package/dist/middleware/csrf/types.d.ts +0 -57
- package/dist/middleware/csrf/types.d.ts.map +0 -1
- package/dist/middleware/csrf/types.js +0 -5
- package/dist/middleware/csrf/types.js.map +0 -1
- package/dist/middleware/index.d.ts +0 -115
- package/dist/middleware/index.d.ts.map +0 -1
- package/dist/middleware/index.js +0 -134
- package/dist/middleware/index.js.map +0 -1
- package/dist/middleware/logging/index.d.ts +0 -42
- package/dist/middleware/logging/index.d.ts.map +0 -1
- package/dist/middleware/logging/index.js +0 -42
- package/dist/middleware/logging/index.js.map +0 -1
- package/dist/middleware/logging/logging.d.ts +0 -29
- package/dist/middleware/logging/logging.d.ts.map +0 -1
- package/dist/middleware/logging/logging.js +0 -168
- package/dist/middleware/logging/logging.js.map +0 -1
- package/dist/middleware/logging/types.d.ts +0 -90
- package/dist/middleware/logging/types.d.ts.map +0 -1
- package/dist/middleware/logging/types.js +0 -5
- package/dist/middleware/logging/types.js.map +0 -1
- package/dist/middleware/rate-limit/index.d.ts +0 -16
- package/dist/middleware/rate-limit/index.d.ts.map +0 -1
- package/dist/middleware/rate-limit/index.js +0 -16
- package/dist/middleware/rate-limit/index.js.map +0 -1
- package/dist/middleware/rate-limit/rate-limit.d.ts +0 -14
- package/dist/middleware/rate-limit/rate-limit.d.ts.map +0 -1
- package/dist/middleware/rate-limit/rate-limit.js +0 -84
- package/dist/middleware/rate-limit/rate-limit.js.map +0 -1
- package/dist/middleware/rate-limit/types.d.ts +0 -97
- package/dist/middleware/rate-limit/types.d.ts.map +0 -1
- package/dist/middleware/rate-limit/types.js +0 -5
- package/dist/middleware/rate-limit/types.js.map +0 -1
- package/dist/middleware/retry/index.d.ts +0 -6
- package/dist/middleware/retry/index.d.ts.map +0 -1
- package/dist/middleware/retry/index.js +0 -6
- package/dist/middleware/retry/index.js.map +0 -1
- package/dist/middleware/retry/retry.d.ts +0 -39
- package/dist/middleware/retry/retry.d.ts.map +0 -1
- package/dist/middleware/retry/retry.js +0 -141
- package/dist/middleware/retry/retry.js.map +0 -1
- package/dist/middleware/retry/types.d.ts +0 -61
- package/dist/middleware/retry/types.d.ts.map +0 -1
- package/dist/middleware/retry/types.js +0 -5
- package/dist/middleware/retry/types.js.map +0 -1
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview CSRF protection middleware implementation.
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createCSRFMiddleware = createCSRFMiddleware;
|
|
7
|
-
/**
|
|
8
|
-
* Default CSRF token provider that extracts token from XSRF-TOKEN cookie.
|
|
9
|
-
* This follows the standard convention used by Rails, Laravel, and many other frameworks.
|
|
10
|
-
*/
|
|
11
|
-
function getTokenFromCookie(cookieName = 'XSRF-TOKEN') {
|
|
12
|
-
if (typeof document === 'undefined') {
|
|
13
|
-
return ''; // Server-side, no cookies available
|
|
14
|
-
}
|
|
15
|
-
const name = `${cookieName}=`;
|
|
16
|
-
const decodedCookie = decodeURIComponent(document.cookie);
|
|
17
|
-
const cookies = decodedCookie.split(';');
|
|
18
|
-
for (const cookie of cookies) {
|
|
19
|
-
const c = cookie.trim();
|
|
20
|
-
if (c.indexOf(name) === 0) {
|
|
21
|
-
return c.substring(name.length);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return '';
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Checks if a URL should skip CSRF protection based on configured patterns.
|
|
28
|
-
*/
|
|
29
|
-
function shouldSkipCSRF(url, skipPatterns = []) {
|
|
30
|
-
return skipPatterns.some((pattern) => {
|
|
31
|
-
if (typeof pattern === 'string') {
|
|
32
|
-
return url.includes(pattern);
|
|
33
|
-
}
|
|
34
|
-
return pattern.test(url);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Creates CSRF protection middleware with smart defaults.
|
|
39
|
-
* Automatically adds CSRF tokens to state-changing requests.
|
|
40
|
-
*
|
|
41
|
-
* @param options - CSRF configuration options (all optional for "pit of success")
|
|
42
|
-
* @returns CSRF middleware for use with FetchClient
|
|
43
|
-
*
|
|
44
|
-
* @example Basic usage (uses cookies automatically):
|
|
45
|
-
* ```typescript
|
|
46
|
-
* const client = new FetchClient();
|
|
47
|
-
* const csrfClient = useCSRF(client);
|
|
48
|
-
* ```
|
|
49
|
-
*
|
|
50
|
-
* @example Custom token provider:
|
|
51
|
-
* ```typescript
|
|
52
|
-
* const csrfClient = useCSRF(client, {
|
|
53
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
54
|
-
* });
|
|
55
|
-
* ```
|
|
56
|
-
*
|
|
57
|
-
* @example Skip external APIs:
|
|
58
|
-
* ```typescript
|
|
59
|
-
* const csrfClient = useCSRF(client, {
|
|
60
|
-
* skipPatterns: [/^https:\/\/api\.external\.com\//, '/webhook/']
|
|
61
|
-
* });
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
function createCSRFMiddleware(options = {}) {
|
|
65
|
-
// Smart defaults for "pit of success"
|
|
66
|
-
const { headerName = 'X-XSRF-TOKEN', cookieName = 'XSRF-TOKEN', protectedMethods = ['POST', 'PUT', 'PATCH', 'DELETE'], skipPatterns = [], tokenProvider = () => getTokenFromCookie(cookieName), } = options;
|
|
67
|
-
return async (request, next) => {
|
|
68
|
-
const method = (request.method || 'GET').toUpperCase();
|
|
69
|
-
const url = request.url || '';
|
|
70
|
-
// Skip CSRF protection if:
|
|
71
|
-
// 1. Method is not in protected methods list
|
|
72
|
-
// 2. URL matches a skip pattern
|
|
73
|
-
if (!protectedMethods.includes(method) ||
|
|
74
|
-
shouldSkipCSRF(url, skipPatterns)) {
|
|
75
|
-
return next(request);
|
|
76
|
-
}
|
|
77
|
-
// Get CSRF token
|
|
78
|
-
const token = tokenProvider();
|
|
79
|
-
// Skip if no token available (let the server handle the error)
|
|
80
|
-
if (!token) {
|
|
81
|
-
return next(request);
|
|
82
|
-
}
|
|
83
|
-
// Add CSRF token to request headers
|
|
84
|
-
const headers = new Headers(request.headers);
|
|
85
|
-
headers.set(headerName, token);
|
|
86
|
-
// Create modified request with CSRF header
|
|
87
|
-
const modifiedRequest = {
|
|
88
|
-
...request,
|
|
89
|
-
headers,
|
|
90
|
-
};
|
|
91
|
-
return next(modifiedRequest);
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=csrf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../../../src/middleware/csrf/csrf.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAsEH,oDA8CC;AA/GD;;;GAGG;AACH,SAAS,kBAAkB,CAAC,aAAqB,YAAY;IAC3D,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,CAAC,oCAAoC;IACjD,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,UAAU,GAAG,CAAC;IAC9B,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,GAAW,EACX,eAAoC,EAAE;IAEtC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,oBAAoB,CAClC,UAAuB,EAAE;IAEzB,sCAAsC;IACtC,MAAM,EACJ,UAAU,GAAG,cAAc,EAC3B,UAAU,GAAG,YAAY,EACzB,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EACrD,YAAY,GAAG,EAAE,EACjB,aAAa,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,GACrD,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAE9B,2BAA2B;QAC3B,6CAA6C;QAC7C,gCAAgC;QAChC,IACE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;YAClC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EACjC,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAE9B,+DAA+D;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/B,2CAA2C;QAC3C,MAAM,eAAe,GAAG;YACtB,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CSRF protection middleware - "pit of success" API.
|
|
3
|
-
*/
|
|
4
|
-
import type { FetchClient } from '../../client/fetch-client';
|
|
5
|
-
import type { CSRFOptions } from './types';
|
|
6
|
-
export type { CSRFOptions, CSRFTokenProvider } from './types';
|
|
7
|
-
export { createCSRFMiddleware } from './csrf';
|
|
8
|
-
/**
|
|
9
|
-
* "Pit of success" API for adding CSRF protection to a FetchClient.
|
|
10
|
-
* Uses smart defaults that work with most web frameworks out of the box.
|
|
11
|
-
*
|
|
12
|
-
* Default behavior:
|
|
13
|
-
* - Reads CSRF token from XSRF-TOKEN cookie
|
|
14
|
-
* - Adds X-XSRF-TOKEN header to POST, PUT, PATCH, DELETE requests
|
|
15
|
-
* - Skips GET/HEAD requests (they don't need CSRF protection)
|
|
16
|
-
*
|
|
17
|
-
* @param client - The FetchClient to add CSRF protection to
|
|
18
|
-
* @param options - Optional CSRF configuration
|
|
19
|
-
* @returns A new FetchClient with CSRF protection
|
|
20
|
-
*
|
|
21
|
-
* @example Basic usage (automatic cookie-based CSRF):
|
|
22
|
-
* ```typescript
|
|
23
|
-
* const client = new FetchClient();
|
|
24
|
-
* const protectedClient = useCSRF(client);
|
|
25
|
-
*
|
|
26
|
-
* // CSRF token automatically added to POST requests
|
|
27
|
-
* await protectedClient.post('/api/users', { name: 'John' });
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* @example Custom token provider:
|
|
31
|
-
* ```typescript
|
|
32
|
-
* const protectedClient = useCSRF(client, {
|
|
33
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
34
|
-
* });
|
|
35
|
-
* ```
|
|
36
|
-
*
|
|
37
|
-
* @example Custom header and cookie names:
|
|
38
|
-
* ```typescript
|
|
39
|
-
* const protectedClient = useCSRF(client, {
|
|
40
|
-
* headerName: 'X-CSRF-Token',
|
|
41
|
-
* cookieName: 'csrf-token'
|
|
42
|
-
* });
|
|
43
|
-
* ```
|
|
44
|
-
*
|
|
45
|
-
* @example Skip patterns for external APIs:
|
|
46
|
-
* ```typescript
|
|
47
|
-
* const protectedClient = useCSRF(client, {
|
|
48
|
-
* skipPatterns: [
|
|
49
|
-
* /^https:\/\/api\.external\.com\//, // Skip external API
|
|
50
|
-
* '/webhook/', // Skip webhook endpoints
|
|
51
|
-
* '/public-api/' // Skip public API endpoints
|
|
52
|
-
* ]
|
|
53
|
-
* });
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
export declare function useCSRF(client: FetchClient, options?: CSRFOptions): FetchClient;
|
|
57
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/csrf/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,WAAgB,GACxB,WAAW,CAEb"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview CSRF protection middleware - "pit of success" API.
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createCSRFMiddleware = void 0;
|
|
7
|
-
exports.useCSRF = useCSRF;
|
|
8
|
-
const csrf_1 = require("./csrf");
|
|
9
|
-
var csrf_2 = require("./csrf");
|
|
10
|
-
Object.defineProperty(exports, "createCSRFMiddleware", { enumerable: true, get: function () { return csrf_2.createCSRFMiddleware; } });
|
|
11
|
-
/**
|
|
12
|
-
* "Pit of success" API for adding CSRF protection to a FetchClient.
|
|
13
|
-
* Uses smart defaults that work with most web frameworks out of the box.
|
|
14
|
-
*
|
|
15
|
-
* Default behavior:
|
|
16
|
-
* - Reads CSRF token from XSRF-TOKEN cookie
|
|
17
|
-
* - Adds X-XSRF-TOKEN header to POST, PUT, PATCH, DELETE requests
|
|
18
|
-
* - Skips GET/HEAD requests (they don't need CSRF protection)
|
|
19
|
-
*
|
|
20
|
-
* @param client - The FetchClient to add CSRF protection to
|
|
21
|
-
* @param options - Optional CSRF configuration
|
|
22
|
-
* @returns A new FetchClient with CSRF protection
|
|
23
|
-
*
|
|
24
|
-
* @example Basic usage (automatic cookie-based CSRF):
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const client = new FetchClient();
|
|
27
|
-
* const protectedClient = useCSRF(client);
|
|
28
|
-
*
|
|
29
|
-
* // CSRF token automatically added to POST requests
|
|
30
|
-
* await protectedClient.post('/api/users', { name: 'John' });
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example Custom token provider:
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const protectedClient = useCSRF(client, {
|
|
36
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
37
|
-
* });
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @example Custom header and cookie names:
|
|
41
|
-
* ```typescript
|
|
42
|
-
* const protectedClient = useCSRF(client, {
|
|
43
|
-
* headerName: 'X-CSRF-Token',
|
|
44
|
-
* cookieName: 'csrf-token'
|
|
45
|
-
* });
|
|
46
|
-
* ```
|
|
47
|
-
*
|
|
48
|
-
* @example Skip patterns for external APIs:
|
|
49
|
-
* ```typescript
|
|
50
|
-
* const protectedClient = useCSRF(client, {
|
|
51
|
-
* skipPatterns: [
|
|
52
|
-
* /^https:\/\/api\.external\.com\//, // Skip external API
|
|
53
|
-
* '/webhook/', // Skip webhook endpoints
|
|
54
|
-
* '/public-api/' // Skip public API endpoints
|
|
55
|
-
* ]
|
|
56
|
-
* });
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
function useCSRF(client, options = {}) {
|
|
60
|
-
return client.use((0, csrf_1.createCSRFMiddleware)(options));
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/csrf/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA0DH,0BAKC;AA3DD,iCAA8C;AAI9C,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,SAAgB,OAAO,CACrB,MAAmB,EACnB,UAAuB,EAAE;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CSRF protection middleware types and configuration.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* CSRF token provider function.
|
|
6
|
-
* Should return the current CSRF token or empty string if not available.
|
|
7
|
-
*/
|
|
8
|
-
export type CSRFTokenProvider = () => string;
|
|
9
|
-
/**
|
|
10
|
-
* CSRF configuration options - optimized for "pit of success".
|
|
11
|
-
*
|
|
12
|
-
* Smart defaults:
|
|
13
|
-
* - Uses standard X-XSRF-TOKEN header
|
|
14
|
-
* - Automatically extracts token from XSRF-TOKEN cookie
|
|
15
|
-
* - Only adds token to state-changing methods (POST, PUT, PATCH, DELETE)
|
|
16
|
-
*/
|
|
17
|
-
export interface CSRFOptions {
|
|
18
|
-
/**
|
|
19
|
-
* Function to get the current CSRF token.
|
|
20
|
-
* Default: extracts from XSRF-TOKEN cookie (standard Rails/Laravel convention)
|
|
21
|
-
*
|
|
22
|
-
* @returns The CSRF token or empty string if not available
|
|
23
|
-
*
|
|
24
|
-
* @example Custom token provider:
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const getToken = () => localStorage.getItem('csrf-token') || '';
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
tokenProvider?: CSRFTokenProvider;
|
|
30
|
-
/**
|
|
31
|
-
* Header name to use for CSRF token (default: 'X-XSRF-TOKEN')
|
|
32
|
-
* Common alternatives: 'X-CSRF-Token', 'X-CSRFToken'
|
|
33
|
-
*/
|
|
34
|
-
headerName?: string;
|
|
35
|
-
/**
|
|
36
|
-
* Cookie name to read token from when using default provider (default: 'XSRF-TOKEN')
|
|
37
|
-
* Common alternatives: 'csrf-token', '_token'
|
|
38
|
-
*/
|
|
39
|
-
cookieName?: string;
|
|
40
|
-
/**
|
|
41
|
-
* HTTP methods that require CSRF protection (default: ['POST', 'PUT', 'PATCH', 'DELETE'])
|
|
42
|
-
* GET and HEAD requests typically don't need CSRF tokens
|
|
43
|
-
*/
|
|
44
|
-
protectedMethods?: string[];
|
|
45
|
-
/**
|
|
46
|
-
* Skip CSRF protection for requests matching these URL patterns
|
|
47
|
-
* Useful for external API calls that don't need CSRF tokens
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* skipPatterns: [/^https:\/\/api\.external\.com\//, '/public-api/']
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
skipPatterns?: (RegExp | string)[];
|
|
55
|
-
}
|
|
56
|
-
export {};
|
|
57
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/csrf/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAElC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACpC;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/csrf/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Complete middleware collection for FetchClient - "pit of success" APIs.
|
|
3
|
-
*
|
|
4
|
-
* This module provides a comprehensive set of middleware for common HTTP client concerns:
|
|
5
|
-
* - 🔐 Authentication: Bearer token injection
|
|
6
|
-
* - 🛡️ Authorization: 401/403 response handling
|
|
7
|
-
* - 💾 Cache: Response caching with TTL
|
|
8
|
-
* - 🔒 CSRF: Cross-site request forgery protection
|
|
9
|
-
* - 📝 Logging: Request/response logging
|
|
10
|
-
* - 🚦 Rate Limiting: Request rate limiting with token bucket
|
|
11
|
-
* - 🔄 Retry: Automatic retry with backoff
|
|
12
|
-
*
|
|
13
|
-
* Each middleware follows the "pit of success" pattern with:
|
|
14
|
-
* - Smart defaults for common scenarios
|
|
15
|
-
* - Simple `use{Middleware}()` convenience functions
|
|
16
|
-
* - Advanced `create{Middleware}Middleware()` for custom scenarios
|
|
17
|
-
* - Comprehensive TypeScript support
|
|
18
|
-
*
|
|
19
|
-
* @example Quick setup with multiple middleware:
|
|
20
|
-
* ```typescript
|
|
21
|
-
* import { FetchClient } from '@fgrzl/fetch';
|
|
22
|
-
* import { useAuthentication, useRetry, useLogging } from '@fgrzl/fetch/middleware';
|
|
23
|
-
*
|
|
24
|
-
* const client = new FetchClient();
|
|
25
|
-
* const enhancedClient = useAuthentication(client, {
|
|
26
|
-
* tokenProvider: () => localStorage.getItem('auth-token') || ''
|
|
27
|
-
* })
|
|
28
|
-
* .pipe(useRetry, { retries: 3 })
|
|
29
|
-
* .pipe(useLogging);
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export type { AuthenticationOptions, AuthTokenProvider, } from './authentication';
|
|
33
|
-
export { useAuthentication, createAuthenticationMiddleware, } from './authentication';
|
|
34
|
-
export type { AuthorizationOptions, UnauthorizedHandler, } from './authorization';
|
|
35
|
-
export { useAuthorization, createAuthorizationMiddleware, } from './authorization';
|
|
36
|
-
export type { CacheOptions, CacheStorage, CacheEntry, CacheKeyGenerator, } from './cache';
|
|
37
|
-
export { useCache, createCacheMiddleware } from './cache';
|
|
38
|
-
export { useCSRF } from './csrf';
|
|
39
|
-
export type { LoggingOptions, Logger, LogLevel } from './logging';
|
|
40
|
-
export { useLogging, createLoggingMiddleware } from './logging';
|
|
41
|
-
export type { RateLimitOptions, RateLimitAlgorithm } from './rate-limit';
|
|
42
|
-
export { useRateLimit, createRateLimitMiddleware } from './rate-limit';
|
|
43
|
-
export type { RetryOptions } from './retry';
|
|
44
|
-
export { useRetry, createRetryMiddleware } from './retry';
|
|
45
|
-
/**
|
|
46
|
-
* Common middleware combinations for typical use cases.
|
|
47
|
-
* These provide pre-configured middleware stacks for common scenarios.
|
|
48
|
-
*/
|
|
49
|
-
import type { FetchClient } from '../client/fetch-client';
|
|
50
|
-
import { useAuthentication } from './authentication';
|
|
51
|
-
import { useRetry } from './retry';
|
|
52
|
-
import { useLogging } from './logging';
|
|
53
|
-
import { useCache } from './cache';
|
|
54
|
-
import { useRateLimit } from './rate-limit';
|
|
55
|
-
/**
|
|
56
|
-
* Production-ready middleware stack with authentication, retry, logging, and caching.
|
|
57
|
-
* Perfect for API clients that need reliability and observability.
|
|
58
|
-
*
|
|
59
|
-
* @param client - The FetchClient to enhance
|
|
60
|
-
* @param config - Configuration for each middleware
|
|
61
|
-
* @returns Enhanced FetchClient with production middleware stack
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```typescript
|
|
65
|
-
* const apiClient = useProductionStack(new FetchClient(), {
|
|
66
|
-
* auth: { tokenProvider: () => getAuthToken() },
|
|
67
|
-
* cache: { ttl: 5 * 60 * 1000 }, // 5 minutes
|
|
68
|
-
* logging: { level: 'info' }
|
|
69
|
-
* });
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
export declare function useProductionStack(client: FetchClient, config?: {
|
|
73
|
-
auth?: Parameters<typeof useAuthentication>[1];
|
|
74
|
-
retry?: Parameters<typeof useRetry>[1];
|
|
75
|
-
cache?: Parameters<typeof useCache>[1];
|
|
76
|
-
logging?: Parameters<typeof useLogging>[1];
|
|
77
|
-
rateLimit?: Parameters<typeof useRateLimit>[1];
|
|
78
|
-
}): FetchClient;
|
|
79
|
-
/**
|
|
80
|
-
* Development-friendly middleware stack with comprehensive logging and retries.
|
|
81
|
-
* Perfect for local development and debugging.
|
|
82
|
-
*
|
|
83
|
-
* @param client - The FetchClient to enhance
|
|
84
|
-
* @param config - Configuration for development middleware
|
|
85
|
-
* @returns Enhanced FetchClient with development middleware stack
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* ```typescript
|
|
89
|
-
* const devClient = useDevelopmentStack(new FetchClient(), {
|
|
90
|
-
* auth: { tokenProvider: () => 'dev-token' }
|
|
91
|
-
* });
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
export declare function useDevelopmentStack(client: FetchClient, config?: {
|
|
95
|
-
auth?: Parameters<typeof useAuthentication>[1];
|
|
96
|
-
}): FetchClient;
|
|
97
|
-
/**
|
|
98
|
-
* Basic middleware stack with just authentication and retry.
|
|
99
|
-
* Perfect for simple API clients that need minimal overhead.
|
|
100
|
-
*
|
|
101
|
-
* @param client - The FetchClient to enhance
|
|
102
|
-
* @param config - Basic configuration
|
|
103
|
-
* @returns Enhanced FetchClient with basic middleware stack
|
|
104
|
-
*
|
|
105
|
-
* @example
|
|
106
|
-
* ```typescript
|
|
107
|
-
* const basicClient = useBasicStack(new FetchClient(), {
|
|
108
|
-
* auth: { tokenProvider: () => getToken() }
|
|
109
|
-
* });
|
|
110
|
-
* ```
|
|
111
|
-
*/
|
|
112
|
-
export declare function useBasicStack(client: FetchClient, config: {
|
|
113
|
-
auth: Parameters<typeof useAuthentication>[1];
|
|
114
|
-
}): FetchClient;
|
|
115
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,YAAY,EACV,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAGhE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAGvE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE1D;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE;IACN,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3C,GACL,WAAW,CAyBb;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE;IACN,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3C,GACL,WAAW,CAsBb;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE;IACN,IAAI,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/C,GACA,WAAW,CAEb"}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @fileoverview Complete middleware collection for FetchClient - "pit of success" APIs.
|
|
4
|
-
*
|
|
5
|
-
* This module provides a comprehensive set of middleware for common HTTP client concerns:
|
|
6
|
-
* - 🔐 Authentication: Bearer token injection
|
|
7
|
-
* - 🛡️ Authorization: 401/403 response handling
|
|
8
|
-
* - 💾 Cache: Response caching with TTL
|
|
9
|
-
* - 🔒 CSRF: Cross-site request forgery protection
|
|
10
|
-
* - 📝 Logging: Request/response logging
|
|
11
|
-
* - 🚦 Rate Limiting: Request rate limiting with token bucket
|
|
12
|
-
* - 🔄 Retry: Automatic retry with backoff
|
|
13
|
-
*
|
|
14
|
-
* Each middleware follows the "pit of success" pattern with:
|
|
15
|
-
* - Smart defaults for common scenarios
|
|
16
|
-
* - Simple `use{Middleware}()` convenience functions
|
|
17
|
-
* - Advanced `create{Middleware}Middleware()` for custom scenarios
|
|
18
|
-
* - Comprehensive TypeScript support
|
|
19
|
-
*
|
|
20
|
-
* @example Quick setup with multiple middleware:
|
|
21
|
-
* ```typescript
|
|
22
|
-
* import { FetchClient } from '@fgrzl/fetch';
|
|
23
|
-
* import { useAuthentication, useRetry, useLogging } from '@fgrzl/fetch/middleware';
|
|
24
|
-
*
|
|
25
|
-
* const client = new FetchClient();
|
|
26
|
-
* const enhancedClient = useAuthentication(client, {
|
|
27
|
-
* tokenProvider: () => localStorage.getItem('auth-token') || ''
|
|
28
|
-
* })
|
|
29
|
-
* .pipe(useRetry, { retries: 3 })
|
|
30
|
-
* .pipe(useLogging);
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.createRetryMiddleware = exports.useRetry = exports.createRateLimitMiddleware = exports.useRateLimit = exports.createLoggingMiddleware = exports.useLogging = exports.useCSRF = exports.createCacheMiddleware = exports.useCache = exports.createAuthorizationMiddleware = exports.useAuthorization = exports.createAuthenticationMiddleware = exports.useAuthentication = void 0;
|
|
35
|
-
exports.useProductionStack = useProductionStack;
|
|
36
|
-
exports.useDevelopmentStack = useDevelopmentStack;
|
|
37
|
-
exports.useBasicStack = useBasicStack;
|
|
38
|
-
var authentication_1 = require("./authentication");
|
|
39
|
-
Object.defineProperty(exports, "useAuthentication", { enumerable: true, get: function () { return authentication_1.useAuthentication; } });
|
|
40
|
-
Object.defineProperty(exports, "createAuthenticationMiddleware", { enumerable: true, get: function () { return authentication_1.createAuthenticationMiddleware; } });
|
|
41
|
-
var authorization_1 = require("./authorization");
|
|
42
|
-
Object.defineProperty(exports, "useAuthorization", { enumerable: true, get: function () { return authorization_1.useAuthorization; } });
|
|
43
|
-
Object.defineProperty(exports, "createAuthorizationMiddleware", { enumerable: true, get: function () { return authorization_1.createAuthorizationMiddleware; } });
|
|
44
|
-
var cache_1 = require("./cache");
|
|
45
|
-
Object.defineProperty(exports, "useCache", { enumerable: true, get: function () { return cache_1.useCache; } });
|
|
46
|
-
Object.defineProperty(exports, "createCacheMiddleware", { enumerable: true, get: function () { return cache_1.createCacheMiddleware; } });
|
|
47
|
-
// 🔒 CSRF middleware
|
|
48
|
-
var csrf_1 = require("./csrf");
|
|
49
|
-
Object.defineProperty(exports, "useCSRF", { enumerable: true, get: function () { return csrf_1.useCSRF; } });
|
|
50
|
-
var logging_1 = require("./logging");
|
|
51
|
-
Object.defineProperty(exports, "useLogging", { enumerable: true, get: function () { return logging_1.useLogging; } });
|
|
52
|
-
Object.defineProperty(exports, "createLoggingMiddleware", { enumerable: true, get: function () { return logging_1.createLoggingMiddleware; } });
|
|
53
|
-
var rate_limit_1 = require("./rate-limit");
|
|
54
|
-
Object.defineProperty(exports, "useRateLimit", { enumerable: true, get: function () { return rate_limit_1.useRateLimit; } });
|
|
55
|
-
Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_1.createRateLimitMiddleware; } });
|
|
56
|
-
var retry_1 = require("./retry");
|
|
57
|
-
Object.defineProperty(exports, "useRetry", { enumerable: true, get: function () { return retry_1.useRetry; } });
|
|
58
|
-
Object.defineProperty(exports, "createRetryMiddleware", { enumerable: true, get: function () { return retry_1.createRetryMiddleware; } });
|
|
59
|
-
const authentication_2 = require("./authentication");
|
|
60
|
-
const retry_2 = require("./retry");
|
|
61
|
-
const logging_2 = require("./logging");
|
|
62
|
-
const cache_2 = require("./cache");
|
|
63
|
-
const rate_limit_2 = require("./rate-limit");
|
|
64
|
-
/**
|
|
65
|
-
* Production-ready middleware stack with authentication, retry, logging, and caching.
|
|
66
|
-
* Perfect for API clients that need reliability and observability.
|
|
67
|
-
*
|
|
68
|
-
* @param client - The FetchClient to enhance
|
|
69
|
-
* @param config - Configuration for each middleware
|
|
70
|
-
* @returns Enhanced FetchClient with production middleware stack
|
|
71
|
-
*
|
|
72
|
-
* @example
|
|
73
|
-
* ```typescript
|
|
74
|
-
* const apiClient = useProductionStack(new FetchClient(), {
|
|
75
|
-
* auth: { tokenProvider: () => getAuthToken() },
|
|
76
|
-
* cache: { ttl: 5 * 60 * 1000 }, // 5 minutes
|
|
77
|
-
* logging: { level: 'info' }
|
|
78
|
-
* });
|
|
79
|
-
* ```
|
|
80
|
-
*/
|
|
81
|
-
function useProductionStack(client, config = {}) {
|
|
82
|
-
let enhanced = client;
|
|
83
|
-
// Apply middleware in order: auth → cache → retry → rate-limit → logging
|
|
84
|
-
if (config.auth) {
|
|
85
|
-
enhanced = (0, authentication_2.useAuthentication)(enhanced, config.auth);
|
|
86
|
-
}
|
|
87
|
-
if (config.cache !== undefined) {
|
|
88
|
-
enhanced = (0, cache_2.useCache)(enhanced, config.cache);
|
|
89
|
-
}
|
|
90
|
-
if (config.retry !== undefined) {
|
|
91
|
-
enhanced = (0, retry_2.useRetry)(enhanced, config.retry);
|
|
92
|
-
}
|
|
93
|
-
if (config.rateLimit !== undefined) {
|
|
94
|
-
enhanced = (0, rate_limit_2.useRateLimit)(enhanced, config.rateLimit);
|
|
95
|
-
}
|
|
96
|
-
if (config.logging !== undefined) {
|
|
97
|
-
enhanced = (0, logging_2.useLogging)(enhanced, config.logging);
|
|
98
|
-
}
|
|
99
|
-
return enhanced;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Development-friendly middleware stack with comprehensive logging and retries.
|
|
103
|
-
* Perfect for local development and debugging.
|
|
104
|
-
*
|
|
105
|
-
* @param client - The FetchClient to enhance
|
|
106
|
-
* @param config - Configuration for development middleware
|
|
107
|
-
* @returns Enhanced FetchClient with development middleware stack
|
|
108
|
-
*
|
|
109
|
-
* @example
|
|
110
|
-
* ```typescript
|
|
111
|
-
* const devClient = useDevelopmentStack(new FetchClient(), {
|
|
112
|
-
* auth: { tokenProvider: () => 'dev-token' }
|
|
113
|
-
* });
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
function useDevelopmentStack(client, config = {}) {
|
|
117
|
-
let enhanced = client;
|
|
118
|
-
if (config.auth) {
|
|
119
|
-
enhanced = (0, authentication_2.useAuthentication)(enhanced, config.auth);
|
|
120
|
-
}
|
|
121
|
-
// Development-optimized settings
|
|
122
|
-
enhanced = (0, retry_2.useRetry)(enhanced, {
|
|
123
|
-
maxRetries: 1,
|
|
124
|
-
delay: 100,
|
|
125
|
-
});
|
|
126
|
-
enhanced = (0, logging_2.useLogging)(enhanced, {
|
|
127
|
-
level: 'debug',
|
|
128
|
-
includeRequestHeaders: true,
|
|
129
|
-
includeResponseHeaders: true,
|
|
130
|
-
includeRequestBody: true,
|
|
131
|
-
includeResponseBody: true,
|
|
132
|
-
});
|
|
133
|
-
return enhanced;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Basic middleware stack with just authentication and retry.
|
|
137
|
-
* Perfect for simple API clients that need minimal overhead.
|
|
138
|
-
*
|
|
139
|
-
* @param client - The FetchClient to enhance
|
|
140
|
-
* @param config - Basic configuration
|
|
141
|
-
* @returns Enhanced FetchClient with basic middleware stack
|
|
142
|
-
*
|
|
143
|
-
* @example
|
|
144
|
-
* ```typescript
|
|
145
|
-
* const basicClient = useBasicStack(new FetchClient(), {
|
|
146
|
-
* auth: { tokenProvider: () => getToken() }
|
|
147
|
-
* });
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
function useBasicStack(client, config) {
|
|
151
|
-
return (0, retry_2.useRetry)((0, authentication_2.useAuthentication)(client, config.auth), { maxRetries: 2 });
|
|
152
|
-
}
|
|
153
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Logging middleware - "pit of success" API.
|
|
3
|
-
*/
|
|
4
|
-
import type { FetchClient } from '../../client/fetch-client';
|
|
5
|
-
import type { LoggingOptions } from './types';
|
|
6
|
-
export type { LoggingOptions, Logger, LogEntry, LogLevel } from './types';
|
|
7
|
-
export { createLoggingMiddleware } from './logging';
|
|
8
|
-
/**
|
|
9
|
-
* "Pit of success" API for adding logging to a FetchClient.
|
|
10
|
-
* Logs HTTP requests and responses for debugging and monitoring.
|
|
11
|
-
*
|
|
12
|
-
* @param client - The FetchClient to add logging to
|
|
13
|
-
* @param options - Logging configuration options
|
|
14
|
-
* @returns A new FetchClient with logging middleware
|
|
15
|
-
*
|
|
16
|
-
* @example Basic logging to console:
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const loggedClient = useLogging(client);
|
|
19
|
-
*
|
|
20
|
-
* // Logs: → GET /api/users
|
|
21
|
-
* // Logs: ← GET /api/users → 200 (245ms)
|
|
22
|
-
* await loggedClient.get('/api/users');
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Custom log level and headers:
|
|
26
|
-
* ```typescript
|
|
27
|
-
* const loggedClient = useLogging(client, {
|
|
28
|
-
* level: 'debug',
|
|
29
|
-
* includeRequestHeaders: true,
|
|
30
|
-
* includeResponseHeaders: true
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @example Skip health check endpoints:
|
|
35
|
-
* ```typescript
|
|
36
|
-
* const loggedClient = useLogging(client, {
|
|
37
|
-
* skipPatterns: ['/health', '/metrics', '/ping']
|
|
38
|
-
* });
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export declare function useLogging(client: FetchClient, options?: LoggingOptions): FetchClient;
|
|
42
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,cAAmB,GAC3B,WAAW,CAEb"}
|