mcp-wordpress 1.2.2 → 1.3.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/README.md +210 -182
- package/dist/cache/CacheInvalidation.d.ts +3 -3
- package/dist/cache/CacheInvalidation.d.ts.map +1 -1
- package/dist/cache/CacheInvalidation.js +119 -119
- package/dist/cache/CacheInvalidation.js.map +1 -1
- package/dist/cache/CacheManager.d.ts +5 -0
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +26 -16
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
- package/dist/cache/HttpCacheWrapper.js +29 -29
- package/dist/cache/HttpCacheWrapper.js.map +1 -1
- package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
- package/dist/cache/__tests__/CacheManager.test.js +113 -113
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
- package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
- package/dist/cache/index.d.ts +7 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/client/CachedWordPressClient.d.ts +4 -4
- package/dist/client/CachedWordPressClient.d.ts.map +1 -1
- package/dist/client/CachedWordPressClient.js +55 -51
- package/dist/client/CachedWordPressClient.js.map +1 -1
- package/dist/client/api.d.ts +10 -10
- package/dist/client/api.js +158 -158
- package/dist/client/api.js.map +1 -1
- package/dist/client/auth.d.ts +2 -2
- package/dist/client/auth.js +72 -72
- package/dist/client/managers/AuthenticationManager.d.ts +2 -2
- package/dist/client/managers/AuthenticationManager.js +46 -46
- package/dist/client/managers/BaseManager.d.ts +1 -1
- package/dist/client/managers/BaseManager.js +9 -9
- package/dist/client/managers/RequestManager.d.ts +5 -3
- package/dist/client/managers/RequestManager.d.ts.map +1 -1
- package/dist/client/managers/RequestManager.js +39 -19
- package/dist/client/managers/RequestManager.js.map +1 -1
- package/dist/client/managers/index.d.ts +3 -3
- package/dist/client/managers/index.js +3 -3
- package/dist/config/ConfigurationSchema.d.ts +2 -2
- package/dist/config/ConfigurationSchema.d.ts.map +1 -1
- package/dist/config/ConfigurationSchema.js +40 -40
- package/dist/config/ConfigurationSchema.js.map +1 -1
- package/dist/config/ServerConfiguration.d.ts +2 -2
- package/dist/config/ServerConfiguration.js +35 -35
- package/dist/config/ServerConfiguration.js.map +1 -1
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
- package/dist/docs/DocumentationGenerator.js +296 -255
- package/dist/docs/DocumentationGenerator.js.map +1 -1
- package/dist/docs/MarkdownFormatter.d.ts +1 -1
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
- package/dist/docs/MarkdownFormatter.js +60 -51
- package/dist/docs/MarkdownFormatter.js.map +1 -1
- package/dist/docs/index.d.ts +3 -3
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp-wordpress-1.3.0.tgz +0 -0
- package/dist/performance/MetricsCollector.d.ts +3 -3
- package/dist/performance/MetricsCollector.d.ts.map +1 -1
- package/dist/performance/MetricsCollector.js +33 -27
- package/dist/performance/MetricsCollector.js.map +1 -1
- package/dist/performance/PerformanceAnalytics.d.ts +12 -12
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
- package/dist/performance/PerformanceAnalytics.js +200 -154
- package/dist/performance/PerformanceAnalytics.js.map +1 -1
- package/dist/performance/PerformanceMonitor.d.ts +5 -5
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
- package/dist/performance/PerformanceMonitor.js +53 -52
- package/dist/performance/PerformanceMonitor.js.map +1 -1
- package/dist/performance/index.d.ts +6 -6
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/security/InputValidator.d.ts +1 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +111 -88
- package/dist/security/InputValidator.js.map +1 -1
- package/dist/security/SecurityConfig.d.ts +5 -5
- package/dist/security/SecurityConfig.js +92 -92
- package/dist/security/SecurityConfig.js.map +1 -1
- package/dist/server/ConnectionTester.d.ts +1 -1
- package/dist/server/ConnectionTester.d.ts.map +1 -1
- package/dist/server/ConnectionTester.js +4 -4
- package/dist/server/ConnectionTester.js.map +1 -1
- package/dist/server/ToolRegistry.d.ts +2 -2
- package/dist/server/ToolRegistry.d.ts.map +1 -1
- package/dist/server/ToolRegistry.js +35 -32
- package/dist/server/ToolRegistry.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/tools/BaseToolManager.js +5 -5
- package/dist/tools/auth.d.ts +2 -2
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +32 -31
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/cache.d.ts +1 -1
- package/dist/tools/cache.d.ts.map +1 -1
- package/dist/tools/cache.js +71 -71
- package/dist/tools/cache.js.map +1 -1
- package/dist/tools/comments.d.ts +2 -2
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +79 -79
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/index.d.ts +10 -10
- package/dist/tools/index.js +10 -10
- package/dist/tools/media.d.ts +2 -2
- package/dist/tools/media.js +80 -80
- package/dist/tools/pages.d.ts +2 -2
- package/dist/tools/pages.d.ts.map +1 -1
- package/dist/tools/pages.js +75 -75
- package/dist/tools/pages.js.map +1 -1
- package/dist/tools/performance.d.ts +1 -1
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +311 -287
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/posts.d.ts +2 -2
- package/dist/tools/posts.d.ts.map +1 -1
- package/dist/tools/posts.js +94 -94
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/site.d.ts +2 -2
- package/dist/tools/site.d.ts.map +1 -1
- package/dist/tools/site.js +60 -60
- package/dist/tools/site.js.map +1 -1
- package/dist/tools/taxonomies.d.ts +2 -2
- package/dist/tools/taxonomies.js +89 -89
- package/dist/tools/users.d.ts +2 -2
- package/dist/tools/users.js +68 -68
- package/dist/tools/users.js.map +1 -1
- package/dist/types/client.d.ts +13 -13
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js +12 -12
- package/dist/types/client.js.map +1 -1
- package/dist/types/index.d.ts +19 -19
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -3
- package/dist/types/mcp.d.ts +7 -7
- package/dist/types/wordpress.d.ts +21 -21
- package/dist/types/wordpress.d.ts.map +1 -1
- package/dist/utils/debug.d.ts +2 -2
- package/dist/utils/debug.js +28 -28
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +13 -13
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +5 -5
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +41 -31
- package/dist/utils/validation.js.map +1 -1
- package/docs/CACHING.md +36 -2
- package/docs/DOCKER.md +24 -18
- package/docs/PERFORMANCE_MONITORING.md +49 -1
- package/docs/SECURITY_TESTING.md +30 -1
- package/docs/api/README.md +9 -1
- package/docs/api/summary.json +1 -1
- package/docs/contract-testing.md +24 -3
- package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
- package/docs/developer/MAINTENANCE.md +29 -3
- package/docs/developer/MIGRATION_GUIDE.md +13 -1
- package/docs/developer/NPM_AUTH_SETUP.md +13 -2
- package/docs/developer/REFACTORING.md +31 -1
- package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
- package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
- package/docs/user-guides/DOCKER_SETUP.md +264 -0
- package/docs/user-guides/DTX_SETUP.md +327 -0
- package/docs/user-guides/NPM_SETUP.md +109 -0
- package/docs/user-guides/NPX_SETUP.md +281 -0
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
- package/package.json +27 -8
- package/src/cache/CacheInvalidation.ts +140 -132
- package/src/cache/CacheManager.ts +40 -29
- package/src/cache/HttpCacheWrapper.ts +105 -68
- package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
- package/src/cache/__tests__/CacheManager.test.ts +156 -152
- package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
- package/src/cache/index.ts +13 -13
- package/src/client/CachedWordPressClient.ts +90 -80
- package/src/client/api.ts +205 -205
- package/src/client/auth.ts +80 -80
- package/src/client/managers/AuthenticationManager.ts +61 -61
- package/src/client/managers/BaseManager.ts +11 -11
- package/src/client/managers/RequestManager.ts +79 -47
- package/src/client/managers/index.ts +3 -3
- package/src/config/ConfigurationSchema.ts +44 -44
- package/src/config/ServerConfiguration.ts +39 -39
- package/src/docs/DocumentationGenerator.ts +402 -295
- package/src/docs/MarkdownFormatter.ts +94 -69
- package/src/docs/index.ts +4 -4
- package/src/index.ts +24 -21
- package/src/performance/MetricsCollector.ts +90 -58
- package/src/performance/PerformanceAnalytics.ts +386 -262
- package/src/performance/PerformanceMonitor.ts +152 -118
- package/src/performance/index.ts +9 -9
- package/src/security/InputValidator.ts +148 -91
- package/src/security/SecurityConfig.ts +94 -94
- package/src/server/ConnectionTester.ts +21 -15
- package/src/server/ToolRegistry.ts +64 -51
- package/src/server.ts +2 -2
- package/src/tools/BaseToolManager.ts +6 -6
- package/src/tools/auth.ts +42 -37
- package/src/tools/cache.ts +85 -81
- package/src/tools/comments.ts +93 -91
- package/src/tools/index.ts +10 -10
- package/src/tools/media.ts +89 -89
- package/src/tools/pages.ts +89 -87
- package/src/tools/performance.ts +443 -352
- package/src/tools/posts.ts +109 -107
- package/src/tools/site.ts +86 -77
- package/src/tools/taxonomies.ts +102 -102
- package/src/tools/users.ts +77 -77
- package/src/types/client.ts +157 -60
- package/src/types/index.ts +49 -27
- package/src/types/mcp.ts +15 -15
- package/src/types/wordpress.ts +57 -29
- package/src/utils/debug.ts +37 -37
- package/src/utils/error.ts +47 -25
- package/src/utils/toolWrapper.ts +12 -8
- package/src/utils/validation.ts +116 -65
- package/dist/client/WordPressClient.d.ts +0 -81
- package/dist/client/WordPressClient.d.ts.map +0 -1
- package/dist/client/WordPressClient.js +0 -354
- package/dist/client/WordPressClient.js.map +0 -1
- package/dist/performance/AnomalyDetector.d.ts +0 -63
- package/dist/performance/AnomalyDetector.d.ts.map +0 -1
- package/dist/performance/AnomalyDetector.js +0 -222
- package/dist/performance/AnomalyDetector.js.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
- package/dist/performance/BenchmarkAnalyzer.js +0 -301
- package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
- package/dist/performance/TrendAnalyzer.d.ts +0 -69
- package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
- package/dist/performance/TrendAnalyzer.js +0 -203
- package/dist/performance/TrendAnalyzer.js.map +0 -1
- package/dist/tools/BaseToolClass.d.ts +0 -76
- package/dist/tools/BaseToolClass.d.ts.map +0 -1
- package/dist/tools/BaseToolClass.js +0 -104
- package/dist/tools/BaseToolClass.js.map +0 -1
- package/dist/tools/base.d.ts +0 -37
- package/dist/tools/base.d.ts.map +0 -1
- package/dist/tools/base.js +0 -60
- package/dist/tools/base.js.map +0 -1
- package/docs/user-guides/CLAUDE_DESKTOP_SETUP.md +0 -187
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* HTTP-level caching wrapper with ETags and Cache-Control headers
|
|
3
3
|
* Implements WordPress REST API caching best practices
|
|
4
4
|
*/
|
|
5
|
-
import { CachePresets } from
|
|
6
|
-
import * as crypto from
|
|
5
|
+
import { CachePresets } from "./CacheManager.js";
|
|
6
|
+
import * as crypto from "crypto";
|
|
7
7
|
/**
|
|
8
8
|
* HTTP caching wrapper that adds intelligent caching to HTTP requests
|
|
9
9
|
*/
|
|
@@ -19,7 +19,7 @@ export class HttpCacheWrapper {
|
|
|
19
19
|
*/
|
|
20
20
|
async request(requestFn, options, cacheOptions) {
|
|
21
21
|
// Only cache GET requests
|
|
22
|
-
if (options.method.toUpperCase() !==
|
|
22
|
+
if (options.method.toUpperCase() !== "GET") {
|
|
23
23
|
return await requestFn();
|
|
24
24
|
}
|
|
25
25
|
const cacheKey = this.generateCacheKey(options);
|
|
@@ -32,8 +32,8 @@ export class HttpCacheWrapper {
|
|
|
32
32
|
...options,
|
|
33
33
|
headers: {
|
|
34
34
|
...options.headers,
|
|
35
|
-
...conditionalHeaders
|
|
36
|
-
}
|
|
35
|
+
...conditionalHeaders,
|
|
36
|
+
},
|
|
37
37
|
};
|
|
38
38
|
try {
|
|
39
39
|
const response = await this.executeRequestWithHeaders(requestFn, requestWithHeaders);
|
|
@@ -43,7 +43,7 @@ export class HttpCacheWrapper {
|
|
|
43
43
|
data: cachedEntry.value.data,
|
|
44
44
|
status: 200,
|
|
45
45
|
headers: cachedEntry.value.headers,
|
|
46
|
-
cached: true
|
|
46
|
+
cached: true,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
// Content changed - update cache
|
|
@@ -51,7 +51,7 @@ export class HttpCacheWrapper {
|
|
|
51
51
|
}
|
|
52
52
|
catch (error) {
|
|
53
53
|
// If conditional request fails, try without conditions
|
|
54
|
-
console.warn(
|
|
54
|
+
console.warn("Conditional request failed, falling back to regular request:", error);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
// Check for valid cached response
|
|
@@ -61,7 +61,7 @@ export class HttpCacheWrapper {
|
|
|
61
61
|
data: cached.data,
|
|
62
62
|
status: cached.status,
|
|
63
63
|
headers: cached.headers,
|
|
64
|
-
cached: true
|
|
64
|
+
cached: true,
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
// Execute fresh request
|
|
@@ -100,7 +100,7 @@ export class HttpCacheWrapper {
|
|
|
100
100
|
headers: this.generateCacheHeaders(cacheOptions, endpoint),
|
|
101
101
|
etag: this.generateETag(data),
|
|
102
102
|
lastModified: new Date().toUTCString(),
|
|
103
|
-
cacheControl: cacheOptions?.cacheControl || this.getDefaultCacheControl(endpoint)
|
|
103
|
+
cacheControl: cacheOptions?.cacheControl || this.getDefaultCacheControl(endpoint),
|
|
104
104
|
};
|
|
105
105
|
this.cacheManager.set(cacheKey, cachedResponse, ttl, cachedResponse.etag, cachedResponse.lastModified);
|
|
106
106
|
}
|
|
@@ -118,7 +118,7 @@ export class HttpCacheWrapper {
|
|
|
118
118
|
return this.cacheManager.generateKey(this.siteId, endpoint, {
|
|
119
119
|
...options.params,
|
|
120
120
|
// Include relevant headers that affect response
|
|
121
|
-
...this.extractCacheableHeaders(options.headers)
|
|
121
|
+
...this.extractCacheableHeaders(options.headers),
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
@@ -136,7 +136,7 @@ export class HttpCacheWrapper {
|
|
|
136
136
|
if (!headers)
|
|
137
137
|
return {};
|
|
138
138
|
const cacheableHeaders = {};
|
|
139
|
-
const relevantHeaders = [
|
|
139
|
+
const relevantHeaders = ["accept", "accept-language", "authorization"];
|
|
140
140
|
for (const header of relevantHeaders) {
|
|
141
141
|
if (headers[header]) {
|
|
142
142
|
cacheableHeaders[header] = headers[header];
|
|
@@ -171,13 +171,13 @@ export class HttpCacheWrapper {
|
|
|
171
171
|
status: response.status,
|
|
172
172
|
headers: {
|
|
173
173
|
...response.headers,
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
174
|
+
etag: etag,
|
|
175
|
+
"last-modified": lastModified,
|
|
176
|
+
"cache-control": cacheControl,
|
|
177
177
|
},
|
|
178
178
|
etag,
|
|
179
179
|
lastModified,
|
|
180
|
-
cacheControl
|
|
180
|
+
cacheControl,
|
|
181
181
|
};
|
|
182
182
|
// Store in cache
|
|
183
183
|
this.cacheManager.set(cacheKey, cachedResponse, ttl, etag, lastModified);
|
|
@@ -185,7 +185,7 @@ export class HttpCacheWrapper {
|
|
|
185
185
|
data: response.data,
|
|
186
186
|
status: response.status,
|
|
187
187
|
headers: cachedResponse.headers,
|
|
188
|
-
cached: false
|
|
188
|
+
cached: false,
|
|
189
189
|
};
|
|
190
190
|
}
|
|
191
191
|
/**
|
|
@@ -193,9 +193,9 @@ export class HttpCacheWrapper {
|
|
|
193
193
|
*/
|
|
194
194
|
generateETag(data) {
|
|
195
195
|
const hash = crypto
|
|
196
|
-
.createHash(
|
|
196
|
+
.createHash("md5")
|
|
197
197
|
.update(JSON.stringify(data))
|
|
198
|
-
.digest(
|
|
198
|
+
.digest("hex");
|
|
199
199
|
return `"${hash}"`;
|
|
200
200
|
}
|
|
201
201
|
/**
|
|
@@ -238,13 +238,13 @@ export class HttpCacheWrapper {
|
|
|
238
238
|
generateCacheHeaders(options, endpoint) {
|
|
239
239
|
const headers = {};
|
|
240
240
|
if (options?.cacheControl) {
|
|
241
|
-
headers[
|
|
241
|
+
headers["cache-control"] = options.cacheControl;
|
|
242
242
|
}
|
|
243
243
|
else if (endpoint) {
|
|
244
|
-
headers[
|
|
244
|
+
headers["cache-control"] = this.getDefaultCacheControl(endpoint);
|
|
245
245
|
}
|
|
246
246
|
if (options?.varyHeaders?.length) {
|
|
247
|
-
headers[
|
|
247
|
+
headers["vary"] = options.varyHeaders.join(", ");
|
|
248
248
|
}
|
|
249
249
|
return headers;
|
|
250
250
|
}
|
|
@@ -252,29 +252,29 @@ export class HttpCacheWrapper {
|
|
|
252
252
|
* Check if endpoint contains static data
|
|
253
253
|
*/
|
|
254
254
|
isStaticEndpoint(endpoint) {
|
|
255
|
-
const staticEndpoints = [
|
|
256
|
-
return staticEndpoints.some(pattern => endpoint.includes(pattern));
|
|
255
|
+
const staticEndpoints = ["settings", "types", "statuses"];
|
|
256
|
+
return staticEndpoints.some((pattern) => endpoint.includes(pattern));
|
|
257
257
|
}
|
|
258
258
|
/**
|
|
259
259
|
* Check if endpoint contains semi-static data
|
|
260
260
|
*/
|
|
261
261
|
isSemiStaticEndpoint(endpoint) {
|
|
262
|
-
const semiStaticEndpoints = [
|
|
263
|
-
return semiStaticEndpoints.some(pattern => endpoint.includes(pattern));
|
|
262
|
+
const semiStaticEndpoints = ["categories", "tags", "users", "taxonomies"];
|
|
263
|
+
return semiStaticEndpoints.some((pattern) => endpoint.includes(pattern));
|
|
264
264
|
}
|
|
265
265
|
/**
|
|
266
266
|
* Check if endpoint is session-related
|
|
267
267
|
*/
|
|
268
268
|
isSessionEndpoint(endpoint) {
|
|
269
|
-
const sessionEndpoints = [
|
|
270
|
-
return sessionEndpoints.some(pattern => endpoint.includes(pattern));
|
|
269
|
+
const sessionEndpoints = ["users/me", "application-passwords"];
|
|
270
|
+
return sessionEndpoints.some((pattern) => endpoint.includes(pattern));
|
|
271
271
|
}
|
|
272
272
|
/**
|
|
273
273
|
* Extract endpoint from cache key
|
|
274
274
|
*/
|
|
275
275
|
extractEndpointFromKey(cacheKey) {
|
|
276
|
-
const parts = cacheKey.split(
|
|
277
|
-
return parts[1] ||
|
|
276
|
+
const parts = cacheKey.split(":");
|
|
277
|
+
return parts[1] || "";
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
//# sourceMappingURL=HttpCacheWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpCacheWrapper.js","sourceRoot":"","sources":["../../src/cache/HttpCacheWrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AA2BjC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAEjB;IACA;IAFV,YACU,YAA0B,EAC1B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAc;QAC1B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,
|
|
1
|
+
{"version":3,"file":"HttpCacheWrapper.js","sourceRoot":"","sources":["../../src/cache/HttpCacheWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for CacheInvalidation
|
|
3
3
|
*/
|
|
4
|
-
import { CacheManager } from
|
|
5
|
-
import { HttpCacheWrapper } from
|
|
6
|
-
import { CacheInvalidation, WordPressCachePatterns } from
|
|
7
|
-
describe(
|
|
4
|
+
import { CacheManager } from "../CacheManager.js";
|
|
5
|
+
import { HttpCacheWrapper } from "../HttpCacheWrapper.js";
|
|
6
|
+
import { CacheInvalidation, WordPressCachePatterns, } from "../CacheInvalidation.js";
|
|
7
|
+
describe("CacheInvalidation", () => {
|
|
8
8
|
let cacheManager;
|
|
9
9
|
let httpCache;
|
|
10
10
|
let cacheInvalidation;
|
|
@@ -13,161 +13,163 @@ describe('CacheInvalidation', () => {
|
|
|
13
13
|
maxSize: 100,
|
|
14
14
|
defaultTTL: 10000,
|
|
15
15
|
enableLRU: true,
|
|
16
|
-
enableStats: true
|
|
16
|
+
enableStats: true,
|
|
17
17
|
});
|
|
18
|
-
httpCache = new HttpCacheWrapper(cacheManager,
|
|
18
|
+
httpCache = new HttpCacheWrapper(cacheManager, "test-site");
|
|
19
19
|
cacheInvalidation = new CacheInvalidation(httpCache);
|
|
20
20
|
});
|
|
21
21
|
afterEach(() => {
|
|
22
22
|
cacheManager.clear();
|
|
23
23
|
});
|
|
24
|
-
describe(
|
|
25
|
-
test(
|
|
24
|
+
describe("Default Invalidation Rules", () => {
|
|
25
|
+
test("should have default rules for posts", () => {
|
|
26
26
|
const rules = cacheInvalidation.getRules();
|
|
27
27
|
expect(rules.posts).toBeDefined();
|
|
28
28
|
expect(rules.posts.length).toBeGreaterThan(0);
|
|
29
|
-
const createRule = rules.posts.find(r => r.trigger ===
|
|
29
|
+
const createRule = rules.posts.find((r) => r.trigger === "create");
|
|
30
30
|
expect(createRule).toBeDefined();
|
|
31
|
-
expect(createRule?.patterns).toContain(
|
|
31
|
+
expect(createRule?.patterns).toContain("posts");
|
|
32
32
|
expect(createRule?.immediate).toBe(true);
|
|
33
33
|
expect(createRule?.cascade).toBe(true);
|
|
34
34
|
});
|
|
35
|
-
test(
|
|
35
|
+
test("should have default rules for categories", () => {
|
|
36
36
|
const rules = cacheInvalidation.getRules();
|
|
37
37
|
expect(rules.categories).toBeDefined();
|
|
38
|
-
const updateRule = rules.categories.find(r => r.trigger ===
|
|
38
|
+
const updateRule = rules.categories.find((r) => r.trigger === "update");
|
|
39
39
|
expect(updateRule).toBeDefined();
|
|
40
|
-
expect(updateRule?.patterns).toContain(
|
|
40
|
+
expect(updateRule?.patterns).toContain("categories/\\d+");
|
|
41
41
|
expect(updateRule?.cascade).toBe(true);
|
|
42
42
|
});
|
|
43
|
-
test(
|
|
43
|
+
test("should have default rules for users", () => {
|
|
44
44
|
const rules = cacheInvalidation.getRules();
|
|
45
45
|
expect(rules.users).toBeDefined();
|
|
46
|
-
const deleteRule = rules.users.find(r => r.trigger ===
|
|
46
|
+
const deleteRule = rules.users.find((r) => r.trigger === "delete");
|
|
47
47
|
expect(deleteRule).toBeDefined();
|
|
48
|
-
expect(deleteRule?.patterns).toContain(
|
|
48
|
+
expect(deleteRule?.patterns).toContain("users");
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
|
-
describe(
|
|
52
|
-
test(
|
|
51
|
+
describe("Custom Invalidation Rules", () => {
|
|
52
|
+
test("should register custom invalidation rules", () => {
|
|
53
53
|
const customRule = {
|
|
54
|
-
trigger:
|
|
55
|
-
patterns: [
|
|
56
|
-
immediate: true
|
|
54
|
+
trigger: "update",
|
|
55
|
+
patterns: ["custom-endpoint.*"],
|
|
56
|
+
immediate: true,
|
|
57
57
|
};
|
|
58
|
-
cacheInvalidation.registerRule(
|
|
58
|
+
cacheInvalidation.registerRule("custom", customRule);
|
|
59
59
|
const rules = cacheInvalidation.getRules();
|
|
60
60
|
expect(rules.custom).toBeDefined();
|
|
61
61
|
expect(rules.custom).toContain(customRule);
|
|
62
62
|
});
|
|
63
|
-
test(
|
|
63
|
+
test("should support multiple rules per resource", () => {
|
|
64
64
|
const rule1 = {
|
|
65
|
-
trigger:
|
|
66
|
-
patterns: [
|
|
67
|
-
immediate: true
|
|
65
|
+
trigger: "create",
|
|
66
|
+
patterns: ["test.*"],
|
|
67
|
+
immediate: true,
|
|
68
68
|
};
|
|
69
69
|
const rule2 = {
|
|
70
|
-
trigger:
|
|
71
|
-
patterns: [
|
|
72
|
-
immediate: false
|
|
70
|
+
trigger: "update",
|
|
71
|
+
patterns: ["test/\\d+"],
|
|
72
|
+
immediate: false,
|
|
73
73
|
};
|
|
74
|
-
cacheInvalidation.registerRule(
|
|
75
|
-
cacheInvalidation.registerRule(
|
|
74
|
+
cacheInvalidation.registerRule("test", rule1);
|
|
75
|
+
cacheInvalidation.registerRule("test", rule2);
|
|
76
76
|
const rules = cacheInvalidation.getRules();
|
|
77
77
|
expect(rules.test).toHaveLength(2);
|
|
78
78
|
expect(rules.test).toContain(rule1);
|
|
79
79
|
expect(rules.test).toContain(rule2);
|
|
80
80
|
});
|
|
81
81
|
});
|
|
82
|
-
describe(
|
|
83
|
-
test(
|
|
82
|
+
describe("Event Processing", () => {
|
|
83
|
+
test("should process invalidation events", async () => {
|
|
84
84
|
// Pre-populate cache with some test data
|
|
85
|
-
httpCache.warm(
|
|
86
|
-
httpCache.warm(
|
|
87
|
-
httpCache.warm(
|
|
85
|
+
httpCache.warm("posts", [{ id: 1 }, { id: 2 }]);
|
|
86
|
+
httpCache.warm("posts/1", { id: 1, title: "Test Post" });
|
|
87
|
+
httpCache.warm("categories", [{ id: 1 }]);
|
|
88
88
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
89
89
|
// Trigger post creation event
|
|
90
90
|
await cacheInvalidation.trigger({
|
|
91
|
-
type:
|
|
92
|
-
resource:
|
|
91
|
+
type: "create",
|
|
92
|
+
resource: "posts",
|
|
93
93
|
id: 3,
|
|
94
|
-
siteId:
|
|
95
|
-
timestamp: Date.now()
|
|
94
|
+
siteId: "test-site",
|
|
95
|
+
timestamp: Date.now(),
|
|
96
96
|
});
|
|
97
97
|
// Should invalidate posts listings but not specific post
|
|
98
98
|
const stats = cacheManager.getStats();
|
|
99
99
|
expect(stats.totalSize).toBeLessThan(3);
|
|
100
100
|
});
|
|
101
|
-
test(
|
|
101
|
+
test("should process events in queue order", async () => {
|
|
102
102
|
const processedEvents = [];
|
|
103
103
|
// Mock the invalidation process to track order
|
|
104
104
|
const originalInvalidatePattern = httpCache.invalidatePattern;
|
|
105
|
-
httpCache.invalidatePattern = jest
|
|
105
|
+
httpCache.invalidatePattern = jest
|
|
106
|
+
.fn()
|
|
107
|
+
.mockImplementation((pattern) => {
|
|
106
108
|
processedEvents.push(pattern);
|
|
107
109
|
return originalInvalidatePattern.call(httpCache, pattern);
|
|
108
110
|
});
|
|
109
111
|
// Queue multiple events
|
|
110
112
|
await Promise.all([
|
|
111
113
|
cacheInvalidation.trigger({
|
|
112
|
-
type:
|
|
113
|
-
resource:
|
|
114
|
-
siteId:
|
|
115
|
-
timestamp: Date.now()
|
|
114
|
+
type: "create",
|
|
115
|
+
resource: "posts",
|
|
116
|
+
siteId: "test-site",
|
|
117
|
+
timestamp: Date.now(),
|
|
116
118
|
}),
|
|
117
119
|
cacheInvalidation.trigger({
|
|
118
|
-
type:
|
|
119
|
-
resource:
|
|
120
|
-
siteId:
|
|
121
|
-
timestamp: Date.now()
|
|
122
|
-
})
|
|
120
|
+
type: "update",
|
|
121
|
+
resource: "categories",
|
|
122
|
+
siteId: "test-site",
|
|
123
|
+
timestamp: Date.now(),
|
|
124
|
+
}),
|
|
123
125
|
]);
|
|
124
126
|
expect(processedEvents.length).toBeGreaterThan(0);
|
|
125
127
|
});
|
|
126
|
-
test(
|
|
127
|
-
httpCache.warm(
|
|
128
|
-
httpCache.warm(
|
|
128
|
+
test("should handle resource invalidation by type", async () => {
|
|
129
|
+
httpCache.warm("posts", [{ id: 1 }]);
|
|
130
|
+
httpCache.warm("posts/1", { id: 1 });
|
|
129
131
|
expect(cacheManager.getStats().totalSize).toBe(2);
|
|
130
|
-
await cacheInvalidation.invalidateResource(
|
|
132
|
+
await cacheInvalidation.invalidateResource("posts", 1, "update");
|
|
131
133
|
// Should clear specific post and related caches
|
|
132
134
|
const stats = cacheManager.getStats();
|
|
133
135
|
expect(stats.totalSize).toBeLessThan(2);
|
|
134
136
|
});
|
|
135
137
|
});
|
|
136
|
-
describe(
|
|
137
|
-
test(
|
|
138
|
+
describe("Pattern Matching", () => {
|
|
139
|
+
test("should replace placeholders in patterns", async () => {
|
|
138
140
|
// Pre-populate cache
|
|
139
|
-
httpCache.warm(
|
|
140
|
-
httpCache.warm(
|
|
141
|
-
httpCache.warm(
|
|
141
|
+
httpCache.warm("posts/123", { id: 123 });
|
|
142
|
+
httpCache.warm("posts/456", { id: 456 });
|
|
143
|
+
httpCache.warm("pages/123", { id: 123 });
|
|
142
144
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
143
145
|
// Trigger event with specific ID
|
|
144
146
|
await cacheInvalidation.trigger({
|
|
145
|
-
type:
|
|
146
|
-
resource:
|
|
147
|
+
type: "update",
|
|
148
|
+
resource: "posts",
|
|
147
149
|
id: 123,
|
|
148
|
-
siteId:
|
|
149
|
-
timestamp: Date.now()
|
|
150
|
+
siteId: "test-site",
|
|
151
|
+
timestamp: Date.now(),
|
|
150
152
|
});
|
|
151
153
|
// Should only invalidate posts/123, not posts/456 or pages/123
|
|
152
154
|
const remainingKeys = [];
|
|
153
155
|
for (const [key] of cacheManager.cache.entries()) {
|
|
154
156
|
remainingKeys.push(key);
|
|
155
157
|
}
|
|
156
|
-
expect(remainingKeys).not.toContain(expect.stringContaining(
|
|
158
|
+
expect(remainingKeys).not.toContain(expect.stringContaining("posts"));
|
|
157
159
|
});
|
|
158
160
|
});
|
|
159
|
-
describe(
|
|
160
|
-
test(
|
|
161
|
+
describe("Statistics", () => {
|
|
162
|
+
test("should track invalidation statistics", () => {
|
|
161
163
|
const stats = cacheInvalidation.getStats();
|
|
162
|
-
expect(stats).toHaveProperty(
|
|
163
|
-
expect(stats).toHaveProperty(
|
|
164
|
-
expect(stats).toHaveProperty(
|
|
165
|
-
expect(typeof stats.queueSize).toBe(
|
|
166
|
-
expect(typeof stats.rulesCount).toBe(
|
|
167
|
-
expect(typeof stats.processing).toBe(
|
|
164
|
+
expect(stats).toHaveProperty("queueSize");
|
|
165
|
+
expect(stats).toHaveProperty("rulesCount");
|
|
166
|
+
expect(stats).toHaveProperty("processing");
|
|
167
|
+
expect(typeof stats.queueSize).toBe("number");
|
|
168
|
+
expect(typeof stats.rulesCount).toBe("number");
|
|
169
|
+
expect(typeof stats.processing).toBe("boolean");
|
|
168
170
|
expect(stats.rulesCount).toBeGreaterThan(0);
|
|
169
171
|
});
|
|
170
|
-
test(
|
|
172
|
+
test("should clear rules", () => {
|
|
171
173
|
const initialStats = cacheInvalidation.getStats();
|
|
172
174
|
expect(initialStats.rulesCount).toBeGreaterThan(0);
|
|
173
175
|
cacheInvalidation.clearRules();
|
|
@@ -176,7 +178,7 @@ describe('CacheInvalidation', () => {
|
|
|
176
178
|
});
|
|
177
179
|
});
|
|
178
180
|
});
|
|
179
|
-
describe(
|
|
181
|
+
describe("WordPressCachePatterns", () => {
|
|
180
182
|
let cacheManager;
|
|
181
183
|
let httpCache;
|
|
182
184
|
beforeEach(() => {
|
|
@@ -184,49 +186,49 @@ describe('WordPressCachePatterns', () => {
|
|
|
184
186
|
maxSize: 100,
|
|
185
187
|
defaultTTL: 10000,
|
|
186
188
|
enableLRU: true,
|
|
187
|
-
enableStats: true
|
|
189
|
+
enableStats: true,
|
|
188
190
|
});
|
|
189
|
-
httpCache = new HttpCacheWrapper(cacheManager,
|
|
191
|
+
httpCache = new HttpCacheWrapper(cacheManager, "test-site");
|
|
190
192
|
});
|
|
191
193
|
afterEach(() => {
|
|
192
194
|
cacheManager.clear();
|
|
193
195
|
});
|
|
194
|
-
test(
|
|
196
|
+
test("should invalidate content-related caches", () => {
|
|
195
197
|
// Pre-populate cache
|
|
196
|
-
httpCache.warm(
|
|
197
|
-
httpCache.warm(
|
|
198
|
-
httpCache.warm(
|
|
199
|
-
httpCache.warm(
|
|
198
|
+
httpCache.warm("posts", []);
|
|
199
|
+
httpCache.warm("pages", []);
|
|
200
|
+
httpCache.warm("comments", []);
|
|
201
|
+
httpCache.warm("categories", []);
|
|
200
202
|
expect(cacheManager.getStats().totalSize).toBe(4);
|
|
201
203
|
const invalidated = WordPressCachePatterns.invalidateContent(httpCache);
|
|
202
204
|
expect(invalidated).toBeGreaterThan(0);
|
|
203
205
|
// Should invalidate posts, pages, comments but not categories
|
|
204
206
|
expect(cacheManager.getStats().totalSize).toBeLessThan(4);
|
|
205
207
|
});
|
|
206
|
-
test(
|
|
207
|
-
httpCache.warm(
|
|
208
|
-
httpCache.warm(
|
|
209
|
-
httpCache.warm(
|
|
208
|
+
test("should invalidate taxonomy-related caches", () => {
|
|
209
|
+
httpCache.warm("categories", []);
|
|
210
|
+
httpCache.warm("tags", []);
|
|
211
|
+
httpCache.warm("posts", []);
|
|
210
212
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
211
213
|
const invalidated = WordPressCachePatterns.invalidateTaxonomies(httpCache);
|
|
212
214
|
expect(invalidated).toBeGreaterThan(0);
|
|
213
215
|
// Should invalidate categories and tags but not posts
|
|
214
216
|
expect(cacheManager.getStats().totalSize).toBeLessThan(3);
|
|
215
217
|
});
|
|
216
|
-
test(
|
|
217
|
-
httpCache.warm(
|
|
218
|
-
httpCache.warm(
|
|
219
|
-
httpCache.warm(
|
|
218
|
+
test("should invalidate user-related caches", () => {
|
|
219
|
+
httpCache.warm("users", []);
|
|
220
|
+
httpCache.warm("users/me", {});
|
|
221
|
+
httpCache.warm("posts", []);
|
|
220
222
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
221
223
|
const invalidated = WordPressCachePatterns.invalidateUsers(httpCache);
|
|
222
224
|
expect(invalidated).toBeGreaterThan(0);
|
|
223
225
|
// Should invalidate user caches but not posts
|
|
224
226
|
expect(cacheManager.getStats().totalSize).toBeLessThan(3);
|
|
225
227
|
});
|
|
226
|
-
test(
|
|
227
|
-
httpCache.warm(
|
|
228
|
-
httpCache.warm(
|
|
229
|
-
httpCache.warm(
|
|
228
|
+
test("should invalidate all caches", () => {
|
|
229
|
+
httpCache.warm("posts", []);
|
|
230
|
+
httpCache.warm("categories", []);
|
|
231
|
+
httpCache.warm("users", []);
|
|
230
232
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
231
233
|
const invalidated = WordPressCachePatterns.invalidateAll(httpCache);
|
|
232
234
|
expect(invalidated).toBe(3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInvalidation.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/CacheInvalidation.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"CacheInvalidation.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/CacheInvalidation.test.ts"],"names":[],"mappings":"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"}
|