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,11 +2,14 @@
|
|
|
2
2
|
* Tests for CacheInvalidation
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { CacheManager } from
|
|
6
|
-
import { HttpCacheWrapper } from
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
import { CacheManager } from "../CacheManager.js";
|
|
6
|
+
import { HttpCacheWrapper } from "../HttpCacheWrapper.js";
|
|
7
|
+
import {
|
|
8
|
+
CacheInvalidation,
|
|
9
|
+
WordPressCachePatterns,
|
|
10
|
+
} from "../CacheInvalidation.js";
|
|
11
|
+
|
|
12
|
+
describe("CacheInvalidation", () => {
|
|
10
13
|
let cacheManager: CacheManager;
|
|
11
14
|
let httpCache: HttpCacheWrapper;
|
|
12
15
|
let cacheInvalidation: CacheInvalidation;
|
|
@@ -16,10 +19,10 @@ describe('CacheInvalidation', () => {
|
|
|
16
19
|
maxSize: 100,
|
|
17
20
|
defaultTTL: 10000,
|
|
18
21
|
enableLRU: true,
|
|
19
|
-
enableStats: true
|
|
22
|
+
enableStats: true,
|
|
20
23
|
});
|
|
21
|
-
|
|
22
|
-
httpCache = new HttpCacheWrapper(cacheManager,
|
|
24
|
+
|
|
25
|
+
httpCache = new HttpCacheWrapper(cacheManager, "test-site");
|
|
23
26
|
cacheInvalidation = new CacheInvalidation(httpCache);
|
|
24
27
|
});
|
|
25
28
|
|
|
@@ -27,73 +30,73 @@ describe('CacheInvalidation', () => {
|
|
|
27
30
|
cacheManager.clear();
|
|
28
31
|
});
|
|
29
32
|
|
|
30
|
-
describe(
|
|
31
|
-
test(
|
|
33
|
+
describe("Default Invalidation Rules", () => {
|
|
34
|
+
test("should have default rules for posts", () => {
|
|
32
35
|
const rules = cacheInvalidation.getRules();
|
|
33
|
-
|
|
36
|
+
|
|
34
37
|
expect(rules.posts).toBeDefined();
|
|
35
38
|
expect(rules.posts.length).toBeGreaterThan(0);
|
|
36
|
-
|
|
37
|
-
const createRule = rules.posts.find(r => r.trigger ===
|
|
39
|
+
|
|
40
|
+
const createRule = rules.posts.find((r) => r.trigger === "create");
|
|
38
41
|
expect(createRule).toBeDefined();
|
|
39
|
-
expect(createRule?.patterns).toContain(
|
|
42
|
+
expect(createRule?.patterns).toContain("posts");
|
|
40
43
|
expect(createRule?.immediate).toBe(true);
|
|
41
44
|
expect(createRule?.cascade).toBe(true);
|
|
42
45
|
});
|
|
43
46
|
|
|
44
|
-
test(
|
|
47
|
+
test("should have default rules for categories", () => {
|
|
45
48
|
const rules = cacheInvalidation.getRules();
|
|
46
|
-
|
|
49
|
+
|
|
47
50
|
expect(rules.categories).toBeDefined();
|
|
48
|
-
|
|
49
|
-
const updateRule = rules.categories.find(r => r.trigger ===
|
|
51
|
+
|
|
52
|
+
const updateRule = rules.categories.find((r) => r.trigger === "update");
|
|
50
53
|
expect(updateRule).toBeDefined();
|
|
51
|
-
expect(updateRule?.patterns).toContain(
|
|
54
|
+
expect(updateRule?.patterns).toContain("categories/\\d+");
|
|
52
55
|
expect(updateRule?.cascade).toBe(true);
|
|
53
56
|
});
|
|
54
57
|
|
|
55
|
-
test(
|
|
58
|
+
test("should have default rules for users", () => {
|
|
56
59
|
const rules = cacheInvalidation.getRules();
|
|
57
|
-
|
|
60
|
+
|
|
58
61
|
expect(rules.users).toBeDefined();
|
|
59
|
-
|
|
60
|
-
const deleteRule = rules.users.find(r => r.trigger ===
|
|
62
|
+
|
|
63
|
+
const deleteRule = rules.users.find((r) => r.trigger === "delete");
|
|
61
64
|
expect(deleteRule).toBeDefined();
|
|
62
|
-
expect(deleteRule?.patterns).toContain(
|
|
65
|
+
expect(deleteRule?.patterns).toContain("users");
|
|
63
66
|
});
|
|
64
67
|
});
|
|
65
68
|
|
|
66
|
-
describe(
|
|
67
|
-
test(
|
|
69
|
+
describe("Custom Invalidation Rules", () => {
|
|
70
|
+
test("should register custom invalidation rules", () => {
|
|
68
71
|
const customRule = {
|
|
69
|
-
trigger:
|
|
70
|
-
patterns: [
|
|
71
|
-
immediate: true
|
|
72
|
+
trigger: "update" as const,
|
|
73
|
+
patterns: ["custom-endpoint.*"],
|
|
74
|
+
immediate: true,
|
|
72
75
|
};
|
|
73
76
|
|
|
74
|
-
cacheInvalidation.registerRule(
|
|
75
|
-
|
|
77
|
+
cacheInvalidation.registerRule("custom", customRule);
|
|
78
|
+
|
|
76
79
|
const rules = cacheInvalidation.getRules();
|
|
77
80
|
expect(rules.custom).toBeDefined();
|
|
78
81
|
expect(rules.custom).toContain(customRule);
|
|
79
82
|
});
|
|
80
83
|
|
|
81
|
-
test(
|
|
84
|
+
test("should support multiple rules per resource", () => {
|
|
82
85
|
const rule1 = {
|
|
83
|
-
trigger:
|
|
84
|
-
patterns: [
|
|
85
|
-
immediate: true
|
|
86
|
+
trigger: "create" as const,
|
|
87
|
+
patterns: ["test.*"],
|
|
88
|
+
immediate: true,
|
|
86
89
|
};
|
|
87
|
-
|
|
90
|
+
|
|
88
91
|
const rule2 = {
|
|
89
|
-
trigger:
|
|
90
|
-
patterns: [
|
|
91
|
-
immediate: false
|
|
92
|
+
trigger: "update" as const,
|
|
93
|
+
patterns: ["test/\\d+"],
|
|
94
|
+
immediate: false,
|
|
92
95
|
};
|
|
93
96
|
|
|
94
|
-
cacheInvalidation.registerRule(
|
|
95
|
-
cacheInvalidation.registerRule(
|
|
96
|
-
|
|
97
|
+
cacheInvalidation.registerRule("test", rule1);
|
|
98
|
+
cacheInvalidation.registerRule("test", rule2);
|
|
99
|
+
|
|
97
100
|
const rules = cacheInvalidation.getRules();
|
|
98
101
|
expect(rules.test).toHaveLength(2);
|
|
99
102
|
expect(rules.test).toContain(rule1);
|
|
@@ -101,22 +104,22 @@ describe('CacheInvalidation', () => {
|
|
|
101
104
|
});
|
|
102
105
|
});
|
|
103
106
|
|
|
104
|
-
describe(
|
|
105
|
-
test(
|
|
107
|
+
describe("Event Processing", () => {
|
|
108
|
+
test("should process invalidation events", async () => {
|
|
106
109
|
// Pre-populate cache with some test data
|
|
107
|
-
httpCache.warm(
|
|
108
|
-
httpCache.warm(
|
|
109
|
-
httpCache.warm(
|
|
110
|
+
httpCache.warm("posts", [{ id: 1 }, { id: 2 }]);
|
|
111
|
+
httpCache.warm("posts/1", { id: 1, title: "Test Post" });
|
|
112
|
+
httpCache.warm("categories", [{ id: 1 }]);
|
|
110
113
|
|
|
111
114
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
112
115
|
|
|
113
116
|
// Trigger post creation event
|
|
114
117
|
await cacheInvalidation.trigger({
|
|
115
|
-
type:
|
|
116
|
-
resource:
|
|
118
|
+
type: "create",
|
|
119
|
+
resource: "posts",
|
|
117
120
|
id: 3,
|
|
118
|
-
siteId:
|
|
119
|
-
timestamp: Date.now()
|
|
121
|
+
siteId: "test-site",
|
|
122
|
+
timestamp: Date.now(),
|
|
120
123
|
});
|
|
121
124
|
|
|
122
125
|
// Should invalidate posts listings but not specific post
|
|
@@ -124,42 +127,44 @@ describe('CacheInvalidation', () => {
|
|
|
124
127
|
expect(stats.totalSize).toBeLessThan(3);
|
|
125
128
|
});
|
|
126
129
|
|
|
127
|
-
test(
|
|
130
|
+
test("should process events in queue order", async () => {
|
|
128
131
|
const processedEvents: string[] = [];
|
|
129
|
-
|
|
132
|
+
|
|
130
133
|
// Mock the invalidation process to track order
|
|
131
134
|
const originalInvalidatePattern = httpCache.invalidatePattern;
|
|
132
|
-
httpCache.invalidatePattern = jest
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
135
|
+
httpCache.invalidatePattern = jest
|
|
136
|
+
.fn()
|
|
137
|
+
.mockImplementation((pattern: string) => {
|
|
138
|
+
processedEvents.push(pattern);
|
|
139
|
+
return originalInvalidatePattern.call(httpCache, pattern);
|
|
140
|
+
});
|
|
136
141
|
|
|
137
142
|
// Queue multiple events
|
|
138
143
|
await Promise.all([
|
|
139
144
|
cacheInvalidation.trigger({
|
|
140
|
-
type:
|
|
141
|
-
resource:
|
|
142
|
-
siteId:
|
|
143
|
-
timestamp: Date.now()
|
|
145
|
+
type: "create",
|
|
146
|
+
resource: "posts",
|
|
147
|
+
siteId: "test-site",
|
|
148
|
+
timestamp: Date.now(),
|
|
144
149
|
}),
|
|
145
150
|
cacheInvalidation.trigger({
|
|
146
|
-
type:
|
|
147
|
-
resource:
|
|
148
|
-
siteId:
|
|
149
|
-
timestamp: Date.now()
|
|
150
|
-
})
|
|
151
|
+
type: "update",
|
|
152
|
+
resource: "categories",
|
|
153
|
+
siteId: "test-site",
|
|
154
|
+
timestamp: Date.now(),
|
|
155
|
+
}),
|
|
151
156
|
]);
|
|
152
157
|
|
|
153
158
|
expect(processedEvents.length).toBeGreaterThan(0);
|
|
154
159
|
});
|
|
155
160
|
|
|
156
|
-
test(
|
|
157
|
-
httpCache.warm(
|
|
158
|
-
httpCache.warm(
|
|
159
|
-
|
|
161
|
+
test("should handle resource invalidation by type", async () => {
|
|
162
|
+
httpCache.warm("posts", [{ id: 1 }]);
|
|
163
|
+
httpCache.warm("posts/1", { id: 1 });
|
|
164
|
+
|
|
160
165
|
expect(cacheManager.getStats().totalSize).toBe(2);
|
|
161
166
|
|
|
162
|
-
await cacheInvalidation.invalidateResource(
|
|
167
|
+
await cacheInvalidation.invalidateResource("posts", 1, "update");
|
|
163
168
|
|
|
164
169
|
// Should clear specific post and related caches
|
|
165
170
|
const stats = cacheManager.getStats();
|
|
@@ -167,22 +172,22 @@ describe('CacheInvalidation', () => {
|
|
|
167
172
|
});
|
|
168
173
|
});
|
|
169
174
|
|
|
170
|
-
describe(
|
|
171
|
-
test(
|
|
175
|
+
describe("Pattern Matching", () => {
|
|
176
|
+
test("should replace placeholders in patterns", async () => {
|
|
172
177
|
// Pre-populate cache
|
|
173
|
-
httpCache.warm(
|
|
174
|
-
httpCache.warm(
|
|
175
|
-
httpCache.warm(
|
|
178
|
+
httpCache.warm("posts/123", { id: 123 });
|
|
179
|
+
httpCache.warm("posts/456", { id: 456 });
|
|
180
|
+
httpCache.warm("pages/123", { id: 123 });
|
|
176
181
|
|
|
177
182
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
178
183
|
|
|
179
184
|
// Trigger event with specific ID
|
|
180
185
|
await cacheInvalidation.trigger({
|
|
181
|
-
type:
|
|
182
|
-
resource:
|
|
186
|
+
type: "update",
|
|
187
|
+
resource: "posts",
|
|
183
188
|
id: 123,
|
|
184
|
-
siteId:
|
|
185
|
-
timestamp: Date.now()
|
|
189
|
+
siteId: "test-site",
|
|
190
|
+
timestamp: Date.now(),
|
|
186
191
|
});
|
|
187
192
|
|
|
188
193
|
// Should only invalidate posts/123, not posts/456 or pages/123
|
|
@@ -191,37 +196,37 @@ describe('CacheInvalidation', () => {
|
|
|
191
196
|
remainingKeys.push(key);
|
|
192
197
|
}
|
|
193
198
|
|
|
194
|
-
expect(remainingKeys).not.toContain(expect.stringContaining(
|
|
199
|
+
expect(remainingKeys).not.toContain(expect.stringContaining("posts"));
|
|
195
200
|
});
|
|
196
201
|
});
|
|
197
202
|
|
|
198
|
-
describe(
|
|
199
|
-
test(
|
|
203
|
+
describe("Statistics", () => {
|
|
204
|
+
test("should track invalidation statistics", () => {
|
|
200
205
|
const stats = cacheInvalidation.getStats();
|
|
201
|
-
|
|
202
|
-
expect(stats).toHaveProperty(
|
|
203
|
-
expect(stats).toHaveProperty(
|
|
204
|
-
expect(stats).toHaveProperty(
|
|
205
|
-
|
|
206
|
-
expect(typeof stats.queueSize).toBe(
|
|
207
|
-
expect(typeof stats.rulesCount).toBe(
|
|
208
|
-
expect(typeof stats.processing).toBe(
|
|
206
|
+
|
|
207
|
+
expect(stats).toHaveProperty("queueSize");
|
|
208
|
+
expect(stats).toHaveProperty("rulesCount");
|
|
209
|
+
expect(stats).toHaveProperty("processing");
|
|
210
|
+
|
|
211
|
+
expect(typeof stats.queueSize).toBe("number");
|
|
212
|
+
expect(typeof stats.rulesCount).toBe("number");
|
|
213
|
+
expect(typeof stats.processing).toBe("boolean");
|
|
209
214
|
expect(stats.rulesCount).toBeGreaterThan(0);
|
|
210
215
|
});
|
|
211
216
|
|
|
212
|
-
test(
|
|
217
|
+
test("should clear rules", () => {
|
|
213
218
|
const initialStats = cacheInvalidation.getStats();
|
|
214
219
|
expect(initialStats.rulesCount).toBeGreaterThan(0);
|
|
215
220
|
|
|
216
221
|
cacheInvalidation.clearRules();
|
|
217
|
-
|
|
222
|
+
|
|
218
223
|
const clearedStats = cacheInvalidation.getStats();
|
|
219
224
|
expect(clearedStats.rulesCount).toBe(0);
|
|
220
225
|
});
|
|
221
226
|
});
|
|
222
227
|
});
|
|
223
228
|
|
|
224
|
-
describe(
|
|
229
|
+
describe("WordPressCachePatterns", () => {
|
|
225
230
|
let cacheManager: CacheManager;
|
|
226
231
|
let httpCache: HttpCacheWrapper;
|
|
227
232
|
|
|
@@ -230,69 +235,69 @@ describe('WordPressCachePatterns', () => {
|
|
|
230
235
|
maxSize: 100,
|
|
231
236
|
defaultTTL: 10000,
|
|
232
237
|
enableLRU: true,
|
|
233
|
-
enableStats: true
|
|
238
|
+
enableStats: true,
|
|
234
239
|
});
|
|
235
|
-
|
|
236
|
-
httpCache = new HttpCacheWrapper(cacheManager,
|
|
240
|
+
|
|
241
|
+
httpCache = new HttpCacheWrapper(cacheManager, "test-site");
|
|
237
242
|
});
|
|
238
243
|
|
|
239
244
|
afterEach(() => {
|
|
240
245
|
cacheManager.clear();
|
|
241
246
|
});
|
|
242
247
|
|
|
243
|
-
test(
|
|
248
|
+
test("should invalidate content-related caches", () => {
|
|
244
249
|
// Pre-populate cache
|
|
245
|
-
httpCache.warm(
|
|
246
|
-
httpCache.warm(
|
|
247
|
-
httpCache.warm(
|
|
248
|
-
httpCache.warm(
|
|
250
|
+
httpCache.warm("posts", []);
|
|
251
|
+
httpCache.warm("pages", []);
|
|
252
|
+
httpCache.warm("comments", []);
|
|
253
|
+
httpCache.warm("categories", []);
|
|
249
254
|
|
|
250
255
|
expect(cacheManager.getStats().totalSize).toBe(4);
|
|
251
256
|
|
|
252
257
|
const invalidated = WordPressCachePatterns.invalidateContent(httpCache);
|
|
253
|
-
|
|
258
|
+
|
|
254
259
|
expect(invalidated).toBeGreaterThan(0);
|
|
255
260
|
// Should invalidate posts, pages, comments but not categories
|
|
256
261
|
expect(cacheManager.getStats().totalSize).toBeLessThan(4);
|
|
257
262
|
});
|
|
258
263
|
|
|
259
|
-
test(
|
|
260
|
-
httpCache.warm(
|
|
261
|
-
httpCache.warm(
|
|
262
|
-
httpCache.warm(
|
|
264
|
+
test("should invalidate taxonomy-related caches", () => {
|
|
265
|
+
httpCache.warm("categories", []);
|
|
266
|
+
httpCache.warm("tags", []);
|
|
267
|
+
httpCache.warm("posts", []);
|
|
263
268
|
|
|
264
269
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
265
270
|
|
|
266
271
|
const invalidated = WordPressCachePatterns.invalidateTaxonomies(httpCache);
|
|
267
|
-
|
|
272
|
+
|
|
268
273
|
expect(invalidated).toBeGreaterThan(0);
|
|
269
274
|
// Should invalidate categories and tags but not posts
|
|
270
275
|
expect(cacheManager.getStats().totalSize).toBeLessThan(3);
|
|
271
276
|
});
|
|
272
277
|
|
|
273
|
-
test(
|
|
274
|
-
httpCache.warm(
|
|
275
|
-
httpCache.warm(
|
|
276
|
-
httpCache.warm(
|
|
278
|
+
test("should invalidate user-related caches", () => {
|
|
279
|
+
httpCache.warm("users", []);
|
|
280
|
+
httpCache.warm("users/me", {});
|
|
281
|
+
httpCache.warm("posts", []);
|
|
277
282
|
|
|
278
283
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
279
284
|
|
|
280
285
|
const invalidated = WordPressCachePatterns.invalidateUsers(httpCache);
|
|
281
|
-
|
|
286
|
+
|
|
282
287
|
expect(invalidated).toBeGreaterThan(0);
|
|
283
288
|
// Should invalidate user caches but not posts
|
|
284
289
|
expect(cacheManager.getStats().totalSize).toBeLessThan(3);
|
|
285
290
|
});
|
|
286
291
|
|
|
287
|
-
test(
|
|
288
|
-
httpCache.warm(
|
|
289
|
-
httpCache.warm(
|
|
290
|
-
httpCache.warm(
|
|
292
|
+
test("should invalidate all caches", () => {
|
|
293
|
+
httpCache.warm("posts", []);
|
|
294
|
+
httpCache.warm("categories", []);
|
|
295
|
+
httpCache.warm("users", []);
|
|
291
296
|
|
|
292
297
|
expect(cacheManager.getStats().totalSize).toBe(3);
|
|
293
298
|
|
|
294
299
|
const invalidated = WordPressCachePatterns.invalidateAll(httpCache);
|
|
295
|
-
|
|
300
|
+
|
|
296
301
|
expect(invalidated).toBe(3);
|
|
297
302
|
expect(cacheManager.getStats().totalSize).toBe(0);
|
|
298
303
|
});
|