@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,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Cache middleware implementation.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Default in-memory cache storage implementation.
|
|
6
|
-
*/
|
|
7
|
-
export class MemoryStorage {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.cache = new Map();
|
|
10
|
-
}
|
|
11
|
-
async get(key) {
|
|
12
|
-
const entry = this.cache.get(key);
|
|
13
|
-
if (!entry) {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
// Check if expired
|
|
17
|
-
if (Date.now() > entry.expiresAt) {
|
|
18
|
-
this.cache.delete(key);
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
return entry;
|
|
22
|
-
}
|
|
23
|
-
async getWithExpiry(key) {
|
|
24
|
-
const entry = this.cache.get(key);
|
|
25
|
-
if (!entry) {
|
|
26
|
-
return { entry: null, isExpired: false };
|
|
27
|
-
}
|
|
28
|
-
const isExpired = Date.now() > entry.expiresAt;
|
|
29
|
-
// Don't delete expired entries when using getWithExpiry - let the caller decide
|
|
30
|
-
return { entry, isExpired };
|
|
31
|
-
}
|
|
32
|
-
async set(key, entry) {
|
|
33
|
-
this.cache.set(key, entry);
|
|
34
|
-
}
|
|
35
|
-
async delete(key) {
|
|
36
|
-
this.cache.delete(key);
|
|
37
|
-
}
|
|
38
|
-
async clear() {
|
|
39
|
-
this.cache.clear();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Default cache key generator.
|
|
44
|
-
*/
|
|
45
|
-
const defaultKeyGenerator = (request) => {
|
|
46
|
-
const url = request.url || '';
|
|
47
|
-
const method = request.method || 'GET';
|
|
48
|
-
const headers = request.headers ? JSON.stringify(request.headers) : '';
|
|
49
|
-
return `${method}:${url}:${headers}`;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Checks if a URL should skip caching based on configured patterns.
|
|
53
|
-
*/
|
|
54
|
-
function shouldSkipCache(url, skipPatterns = []) {
|
|
55
|
-
return skipPatterns.some((pattern) => {
|
|
56
|
-
if (typeof pattern === 'string') {
|
|
57
|
-
return url.includes(pattern);
|
|
58
|
-
}
|
|
59
|
-
return pattern.test(url);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Creates cache middleware with smart defaults.
|
|
64
|
-
* Caches GET responses for faster subsequent requests.
|
|
65
|
-
*
|
|
66
|
-
* @param options - Cache configuration options
|
|
67
|
-
* @returns Cache middleware for use with FetchClient
|
|
68
|
-
*
|
|
69
|
-
* @example Basic caching:
|
|
70
|
-
* ```typescript
|
|
71
|
-
* const cachedClient = useCache(client);
|
|
72
|
-
* // GET requests will be cached for 5 minutes
|
|
73
|
-
* ```
|
|
74
|
-
*
|
|
75
|
-
* @example Custom TTL:
|
|
76
|
-
* ```typescript
|
|
77
|
-
* const cachedClient = useCache(client, {
|
|
78
|
-
* ttl: 10 * 60 * 1000 // 10 minutes
|
|
79
|
-
* });
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
export function createCacheMiddleware(options = {}) {
|
|
83
|
-
const { ttl = 5 * 60 * 1000, // 5 minutes
|
|
84
|
-
methods = ['GET'], storage = new MemoryStorage(), keyGenerator = defaultKeyGenerator, skipPatterns = [], staleWhileRevalidate = false, } = options;
|
|
85
|
-
return async (request, next) => {
|
|
86
|
-
const method = (request.method || 'GET').toUpperCase();
|
|
87
|
-
const url = request.url || '';
|
|
88
|
-
// Skip caching if:
|
|
89
|
-
// 1. Method is not in cached methods list
|
|
90
|
-
// 2. URL matches a skip pattern
|
|
91
|
-
if (!methods.includes(method) || shouldSkipCache(url, skipPatterns)) {
|
|
92
|
-
return next(request);
|
|
93
|
-
}
|
|
94
|
-
const cacheKey = keyGenerator(request);
|
|
95
|
-
try {
|
|
96
|
-
// Try to get cached response with expiry info
|
|
97
|
-
const { entry: cached, isExpired } = storage.getWithExpiry
|
|
98
|
-
? await storage.getWithExpiry(cacheKey)
|
|
99
|
-
: await (async () => {
|
|
100
|
-
const entry = await storage.get(cacheKey);
|
|
101
|
-
return { entry, isExpired: false };
|
|
102
|
-
})();
|
|
103
|
-
if (cached && !isExpired) {
|
|
104
|
-
// Return fresh cached response
|
|
105
|
-
return {
|
|
106
|
-
...cached.response,
|
|
107
|
-
headers: new Headers(cached.response.headers),
|
|
108
|
-
data: cached.response.data,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
// If stale-while-revalidate and we have cached data (even expired), return it immediately
|
|
112
|
-
// and update in background
|
|
113
|
-
if (cached && staleWhileRevalidate) {
|
|
114
|
-
// Return cached data immediately (even if stale)
|
|
115
|
-
const cachedResponse = {
|
|
116
|
-
...cached.response,
|
|
117
|
-
headers: new Headers(cached.response.headers),
|
|
118
|
-
data: cached.response.data,
|
|
119
|
-
};
|
|
120
|
-
// Update cache in background if expired
|
|
121
|
-
if (isExpired) {
|
|
122
|
-
next(request)
|
|
123
|
-
.then(async (freshResponse) => {
|
|
124
|
-
const headersObj = {};
|
|
125
|
-
freshResponse.headers.forEach((value, key) => {
|
|
126
|
-
headersObj[key] = value;
|
|
127
|
-
});
|
|
128
|
-
const cacheEntry = {
|
|
129
|
-
response: {
|
|
130
|
-
status: freshResponse.status,
|
|
131
|
-
statusText: freshResponse.statusText,
|
|
132
|
-
headers: headersObj,
|
|
133
|
-
data: freshResponse.data,
|
|
134
|
-
},
|
|
135
|
-
timestamp: Date.now(),
|
|
136
|
-
expiresAt: Date.now() + ttl,
|
|
137
|
-
};
|
|
138
|
-
await storage.set(cacheKey, cacheEntry);
|
|
139
|
-
})
|
|
140
|
-
.catch(() => {
|
|
141
|
-
// Ignore background update errors
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
return cachedResponse;
|
|
145
|
-
}
|
|
146
|
-
// No cached data or not using stale-while-revalidate
|
|
147
|
-
const response = await next(request);
|
|
148
|
-
// Cache successful responses
|
|
149
|
-
if (response.ok) {
|
|
150
|
-
try {
|
|
151
|
-
const headersObj = {};
|
|
152
|
-
response.headers.forEach((value, key) => {
|
|
153
|
-
headersObj[key] = value;
|
|
154
|
-
});
|
|
155
|
-
const cacheEntry = {
|
|
156
|
-
response: {
|
|
157
|
-
status: response.status,
|
|
158
|
-
statusText: response.statusText,
|
|
159
|
-
headers: headersObj,
|
|
160
|
-
data: response.data,
|
|
161
|
-
},
|
|
162
|
-
timestamp: Date.now(),
|
|
163
|
-
expiresAt: Date.now() + ttl,
|
|
164
|
-
};
|
|
165
|
-
await storage.set(cacheKey, cacheEntry);
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
// Ignore cache storage errors, but still return the response
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return response;
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
// Only catch cache retrieval errors, let network errors through
|
|
175
|
-
if (error && typeof error === 'object' && 'message' in error) {
|
|
176
|
-
const errorMessage = error.message;
|
|
177
|
-
if (errorMessage.includes('Network') || errorMessage.includes('fetch')) {
|
|
178
|
-
throw error; // Re-throw network errors
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// If cache retrieval fails, just proceed with the request
|
|
182
|
-
return next(request);
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/middleware/cache/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Cache middleware - "pit of success" API.
|
|
3
|
-
*/
|
|
4
|
-
import type { FetchClient } from '../../client/fetch-client';
|
|
5
|
-
import type { CacheOptions } from './types';
|
|
6
|
-
export type { CacheOptions, CacheStorage, CacheEntry, CacheKeyGenerator, } from './types';
|
|
7
|
-
export { createCacheMiddleware, MemoryStorage } from './cache';
|
|
8
|
-
/**
|
|
9
|
-
* "Pit of success" API for adding response caching to a FetchClient.
|
|
10
|
-
* Caches GET responses for faster subsequent requests.
|
|
11
|
-
*
|
|
12
|
-
* @param client - The FetchClient to add caching to
|
|
13
|
-
* @param options - Cache configuration options
|
|
14
|
-
* @returns A new FetchClient with cache middleware
|
|
15
|
-
*
|
|
16
|
-
* @example Basic caching (5 minute TTL):
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const cachedClient = useCache(client);
|
|
19
|
-
*
|
|
20
|
-
* // First call hits the network
|
|
21
|
-
* await cachedClient.get('/api/data');
|
|
22
|
-
*
|
|
23
|
-
* // Second call returns cached data
|
|
24
|
-
* await cachedClient.get('/api/data');
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* @example Custom TTL and methods:
|
|
28
|
-
* ```typescript
|
|
29
|
-
* const cachedClient = useCache(client, {
|
|
30
|
-
* ttl: 10 * 60 * 1000, // 10 minutes
|
|
31
|
-
* methods: ['GET', 'HEAD']
|
|
32
|
-
* });
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* @example Stale-while-revalidate:
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const cachedClient = useCache(client, {
|
|
38
|
-
* staleWhileRevalidate: true
|
|
39
|
-
* });
|
|
40
|
-
* // Returns stale data immediately, updates cache in background
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export declare function useCache(client: FetchClient, options?: CacheOptions): FetchClient;
|
|
44
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,WAAW,CAEb"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Cache middleware - "pit of success" API.
|
|
3
|
-
*/
|
|
4
|
-
import { createCacheMiddleware } from './cache';
|
|
5
|
-
export { createCacheMiddleware, MemoryStorage } from './cache';
|
|
6
|
-
/**
|
|
7
|
-
* "Pit of success" API for adding response caching to a FetchClient.
|
|
8
|
-
* Caches GET responses for faster subsequent requests.
|
|
9
|
-
*
|
|
10
|
-
* @param client - The FetchClient to add caching to
|
|
11
|
-
* @param options - Cache configuration options
|
|
12
|
-
* @returns A new FetchClient with cache middleware
|
|
13
|
-
*
|
|
14
|
-
* @example Basic caching (5 minute TTL):
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const cachedClient = useCache(client);
|
|
17
|
-
*
|
|
18
|
-
* // First call hits the network
|
|
19
|
-
* await cachedClient.get('/api/data');
|
|
20
|
-
*
|
|
21
|
-
* // Second call returns cached data
|
|
22
|
-
* await cachedClient.get('/api/data');
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Custom TTL and methods:
|
|
26
|
-
* ```typescript
|
|
27
|
-
* const cachedClient = useCache(client, {
|
|
28
|
-
* ttl: 10 * 60 * 1000, // 10 minutes
|
|
29
|
-
* methods: ['GET', 'HEAD']
|
|
30
|
-
* });
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example Stale-while-revalidate:
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const cachedClient = useCache(client, {
|
|
36
|
-
* staleWhileRevalidate: true
|
|
37
|
-
* });
|
|
38
|
-
* // Returns stale data immediately, updates cache in background
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export function useCache(client, options = {}) {
|
|
42
|
-
return client.use(createCacheMiddleware(options));
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAShD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAmB,EACnB,UAAwB,EAAE;IAE1B,OAAO,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Cache middleware types and configuration.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Cache key generator function.
|
|
6
|
-
* Should return a unique key for the request.
|
|
7
|
-
*/
|
|
8
|
-
export type CacheKeyGenerator = (request: RequestInit & {
|
|
9
|
-
url?: string;
|
|
10
|
-
}) => string;
|
|
11
|
-
/**
|
|
12
|
-
* Cache storage interface.
|
|
13
|
-
* Allows custom cache implementations.
|
|
14
|
-
*/
|
|
15
|
-
export interface CacheStorage {
|
|
16
|
-
get(key: string): Promise<CacheEntry | null>;
|
|
17
|
-
getWithExpiry?(key: string): Promise<{
|
|
18
|
-
entry: CacheEntry | null;
|
|
19
|
-
isExpired: boolean;
|
|
20
|
-
}>;
|
|
21
|
-
set(key: string, entry: CacheEntry): Promise<void>;
|
|
22
|
-
delete(key: string): Promise<void>;
|
|
23
|
-
clear(): Promise<void>;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Cached response entry.
|
|
27
|
-
*/
|
|
28
|
-
export interface CacheEntry {
|
|
29
|
-
response: {
|
|
30
|
-
status: number;
|
|
31
|
-
statusText: string;
|
|
32
|
-
headers: Record<string, string>;
|
|
33
|
-
data: unknown;
|
|
34
|
-
};
|
|
35
|
-
timestamp: number;
|
|
36
|
-
expiresAt: number;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Cache configuration options - optimized for "pit of success".
|
|
40
|
-
*
|
|
41
|
-
* Smart defaults:
|
|
42
|
-
* - Only caches GET requests
|
|
43
|
-
* - 5 minute default TTL
|
|
44
|
-
* - Memory-based storage
|
|
45
|
-
* - Automatic cache key generation
|
|
46
|
-
*/
|
|
47
|
-
export interface CacheOptions {
|
|
48
|
-
/**
|
|
49
|
-
* Time to live in milliseconds (default: 300000 = 5 minutes)
|
|
50
|
-
* How long responses should be cached
|
|
51
|
-
*/
|
|
52
|
-
ttl?: number;
|
|
53
|
-
/**
|
|
54
|
-
* HTTP methods to cache (default: ['GET'])
|
|
55
|
-
* Only these methods will be cached
|
|
56
|
-
*/
|
|
57
|
-
methods?: string[];
|
|
58
|
-
/**
|
|
59
|
-
* Cache storage implementation (default: in-memory)
|
|
60
|
-
* Can be replaced with localStorage, IndexedDB, etc.
|
|
61
|
-
*/
|
|
62
|
-
storage?: CacheStorage;
|
|
63
|
-
/**
|
|
64
|
-
* Custom cache key generator (default: URL + method + headers)
|
|
65
|
-
* Should return a unique key for each request
|
|
66
|
-
*
|
|
67
|
-
* @example Custom key generator:
|
|
68
|
-
* ```typescript
|
|
69
|
-
* keyGenerator: (request) => `${request.method}:${request.url}`
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
keyGenerator?: CacheKeyGenerator;
|
|
73
|
-
/**
|
|
74
|
-
* Skip caching for requests matching these URL patterns
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* ```typescript
|
|
78
|
-
* skipPatterns: [/\/api\/user/, '/dynamic-data']
|
|
79
|
-
* ```
|
|
80
|
-
*/
|
|
81
|
-
skipPatterns?: (RegExp | string)[];
|
|
82
|
-
/**
|
|
83
|
-
* Whether to serve stale cache entries while revalidating
|
|
84
|
-
* When true, returns cached data immediately and updates cache in background
|
|
85
|
-
*/
|
|
86
|
-
staleWhileRevalidate?: boolean;
|
|
87
|
-
}
|
|
88
|
-
export {};
|
|
89
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/middleware/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,WAAW,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KACpC,MAAM,CAAC;AAEZ;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC7C,aAAa,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACvF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/middleware/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CSRF protection middleware implementation.
|
|
3
|
-
*/
|
|
4
|
-
import type { FetchMiddleware } from '../../client/fetch-client';
|
|
5
|
-
import type { CSRFOptions } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* Creates CSRF protection middleware with smart defaults.
|
|
8
|
-
* Automatically adds CSRF tokens to state-changing requests.
|
|
9
|
-
*
|
|
10
|
-
* @param options - CSRF configuration options (all optional for "pit of success")
|
|
11
|
-
* @returns CSRF middleware for use with FetchClient
|
|
12
|
-
*
|
|
13
|
-
* @example Basic usage (uses cookies automatically):
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const client = new FetchClient();
|
|
16
|
-
* const csrfClient = useCSRF(client);
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @example Custom token provider:
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const csrfClient = useCSRF(client, {
|
|
22
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
23
|
-
* });
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @example Skip external APIs:
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const csrfClient = useCSRF(client, {
|
|
29
|
-
* skipPatterns: [/^https:\/\/api\.external\.com\//, '/webhook/']
|
|
30
|
-
* });
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export declare function createCSRFMiddleware(options?: CSRFOptions): FetchMiddleware;
|
|
34
|
-
//# sourceMappingURL=csrf.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../../src/middleware/csrf/csrf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwC3C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,WAAgB,GACxB,eAAe,CA4CjB"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CSRF protection middleware implementation.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Default CSRF token provider that extracts token from XSRF-TOKEN cookie.
|
|
6
|
-
* This follows the standard convention used by Rails, Laravel, and many other frameworks.
|
|
7
|
-
*/
|
|
8
|
-
function getTokenFromCookie(cookieName = 'XSRF-TOKEN') {
|
|
9
|
-
if (typeof document === 'undefined') {
|
|
10
|
-
return ''; // Server-side, no cookies available
|
|
11
|
-
}
|
|
12
|
-
const name = `${cookieName}=`;
|
|
13
|
-
const decodedCookie = decodeURIComponent(document.cookie);
|
|
14
|
-
const cookies = decodedCookie.split(';');
|
|
15
|
-
for (const cookie of cookies) {
|
|
16
|
-
const c = cookie.trim();
|
|
17
|
-
if (c.indexOf(name) === 0) {
|
|
18
|
-
return c.substring(name.length);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return '';
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Checks if a URL should skip CSRF protection based on configured patterns.
|
|
25
|
-
*/
|
|
26
|
-
function shouldSkipCSRF(url, skipPatterns = []) {
|
|
27
|
-
return skipPatterns.some((pattern) => {
|
|
28
|
-
if (typeof pattern === 'string') {
|
|
29
|
-
return url.includes(pattern);
|
|
30
|
-
}
|
|
31
|
-
return pattern.test(url);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Creates CSRF protection middleware with smart defaults.
|
|
36
|
-
* Automatically adds CSRF tokens to state-changing requests.
|
|
37
|
-
*
|
|
38
|
-
* @param options - CSRF configuration options (all optional for "pit of success")
|
|
39
|
-
* @returns CSRF middleware for use with FetchClient
|
|
40
|
-
*
|
|
41
|
-
* @example Basic usage (uses cookies automatically):
|
|
42
|
-
* ```typescript
|
|
43
|
-
* const client = new FetchClient();
|
|
44
|
-
* const csrfClient = useCSRF(client);
|
|
45
|
-
* ```
|
|
46
|
-
*
|
|
47
|
-
* @example Custom token provider:
|
|
48
|
-
* ```typescript
|
|
49
|
-
* const csrfClient = useCSRF(client, {
|
|
50
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
51
|
-
* });
|
|
52
|
-
* ```
|
|
53
|
-
*
|
|
54
|
-
* @example Skip external APIs:
|
|
55
|
-
* ```typescript
|
|
56
|
-
* const csrfClient = useCSRF(client, {
|
|
57
|
-
* skipPatterns: [/^https:\/\/api\.external\.com\//, '/webhook/']
|
|
58
|
-
* });
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
export function createCSRFMiddleware(options = {}) {
|
|
62
|
-
// Smart defaults for "pit of success"
|
|
63
|
-
const { headerName = 'X-XSRF-TOKEN', cookieName = 'XSRF-TOKEN', protectedMethods = ['POST', 'PUT', 'PATCH', 'DELETE'], skipPatterns = [], tokenProvider = () => getTokenFromCookie(cookieName), } = options;
|
|
64
|
-
return async (request, next) => {
|
|
65
|
-
const method = (request.method || 'GET').toUpperCase();
|
|
66
|
-
const url = request.url || '';
|
|
67
|
-
// Skip CSRF protection if:
|
|
68
|
-
// 1. Method is not in protected methods list
|
|
69
|
-
// 2. URL matches a skip pattern
|
|
70
|
-
if (!protectedMethods.includes(method) ||
|
|
71
|
-
shouldSkipCSRF(url, skipPatterns)) {
|
|
72
|
-
return next(request);
|
|
73
|
-
}
|
|
74
|
-
// Get CSRF token
|
|
75
|
-
const token = tokenProvider();
|
|
76
|
-
// Skip if no token available (let the server handle the error)
|
|
77
|
-
if (!token) {
|
|
78
|
-
return next(request);
|
|
79
|
-
}
|
|
80
|
-
// Add CSRF token to request headers
|
|
81
|
-
const headers = new Headers(request.headers);
|
|
82
|
-
headers.set(headerName, token);
|
|
83
|
-
// Create modified request with CSRF header
|
|
84
|
-
const modifiedRequest = {
|
|
85
|
-
...request,
|
|
86
|
-
headers,
|
|
87
|
-
};
|
|
88
|
-
return next(modifiedRequest);
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=csrf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../../src/middleware/csrf/csrf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;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,MAAM,UAAU,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,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview CSRF protection middleware - "pit of success" API.
|
|
3
|
-
*/
|
|
4
|
-
import { createCSRFMiddleware } from './csrf';
|
|
5
|
-
export { createCSRFMiddleware } from './csrf';
|
|
6
|
-
/**
|
|
7
|
-
* "Pit of success" API for adding CSRF protection to a FetchClient.
|
|
8
|
-
* Uses smart defaults that work with most web frameworks out of the box.
|
|
9
|
-
*
|
|
10
|
-
* Default behavior:
|
|
11
|
-
* - Reads CSRF token from XSRF-TOKEN cookie
|
|
12
|
-
* - Adds X-XSRF-TOKEN header to POST, PUT, PATCH, DELETE requests
|
|
13
|
-
* - Skips GET/HEAD requests (they don't need CSRF protection)
|
|
14
|
-
*
|
|
15
|
-
* @param client - The FetchClient to add CSRF protection to
|
|
16
|
-
* @param options - Optional CSRF configuration
|
|
17
|
-
* @returns A new FetchClient with CSRF protection
|
|
18
|
-
*
|
|
19
|
-
* @example Basic usage (automatic cookie-based CSRF):
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const client = new FetchClient();
|
|
22
|
-
* const protectedClient = useCSRF(client);
|
|
23
|
-
*
|
|
24
|
-
* // CSRF token automatically added to POST requests
|
|
25
|
-
* await protectedClient.post('/api/users', { name: 'John' });
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @example Custom token provider:
|
|
29
|
-
* ```typescript
|
|
30
|
-
* const protectedClient = useCSRF(client, {
|
|
31
|
-
* tokenProvider: () => localStorage.getItem('csrf-token') || ''
|
|
32
|
-
* });
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* @example Custom header and cookie names:
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const protectedClient = useCSRF(client, {
|
|
38
|
-
* headerName: 'X-CSRF-Token',
|
|
39
|
-
* cookieName: 'csrf-token'
|
|
40
|
-
* });
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* @example Skip patterns for external APIs:
|
|
44
|
-
* ```typescript
|
|
45
|
-
* const protectedClient = useCSRF(client, {
|
|
46
|
-
* skipPatterns: [
|
|
47
|
-
* /^https:\/\/api\.external\.com\//, // Skip external API
|
|
48
|
-
* '/webhook/', // Skip webhook endpoints
|
|
49
|
-
* '/public-api/' // Skip public API endpoints
|
|
50
|
-
* ]
|
|
51
|
-
* });
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export function useCSRF(client, options = {}) {
|
|
55
|
-
return client.use(createCSRFMiddleware(options));
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/csrf/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAI9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,UAAU,OAAO,CACrB,MAAmB,EACnB,UAAuB,EAAE;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}
|