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.
Files changed (251) hide show
  1. package/README.md +210 -182
  2. package/dist/cache/CacheInvalidation.d.ts +3 -3
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +119 -119
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/CacheManager.d.ts +5 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -1
  8. package/dist/cache/CacheManager.js +26 -16
  9. package/dist/cache/CacheManager.js.map +1 -1
  10. package/dist/cache/HttpCacheWrapper.d.ts +1 -1
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  12. package/dist/cache/HttpCacheWrapper.js +29 -29
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  14. package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
  15. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
  16. package/dist/cache/__tests__/CacheManager.test.js +113 -113
  17. package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
  18. package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
  19. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
  20. package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
  21. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
  22. package/dist/cache/index.d.ts +7 -7
  23. package/dist/cache/index.d.ts.map +1 -1
  24. package/dist/cache/index.js +4 -4
  25. package/dist/cache/index.js.map +1 -1
  26. package/dist/client/CachedWordPressClient.d.ts +4 -4
  27. package/dist/client/CachedWordPressClient.d.ts.map +1 -1
  28. package/dist/client/CachedWordPressClient.js +55 -51
  29. package/dist/client/CachedWordPressClient.js.map +1 -1
  30. package/dist/client/api.d.ts +10 -10
  31. package/dist/client/api.js +158 -158
  32. package/dist/client/api.js.map +1 -1
  33. package/dist/client/auth.d.ts +2 -2
  34. package/dist/client/auth.js +72 -72
  35. package/dist/client/managers/AuthenticationManager.d.ts +2 -2
  36. package/dist/client/managers/AuthenticationManager.js +46 -46
  37. package/dist/client/managers/BaseManager.d.ts +1 -1
  38. package/dist/client/managers/BaseManager.js +9 -9
  39. package/dist/client/managers/RequestManager.d.ts +5 -3
  40. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  41. package/dist/client/managers/RequestManager.js +39 -19
  42. package/dist/client/managers/RequestManager.js.map +1 -1
  43. package/dist/client/managers/index.d.ts +3 -3
  44. package/dist/client/managers/index.js +3 -3
  45. package/dist/config/ConfigurationSchema.d.ts +2 -2
  46. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  47. package/dist/config/ConfigurationSchema.js +40 -40
  48. package/dist/config/ConfigurationSchema.js.map +1 -1
  49. package/dist/config/ServerConfiguration.d.ts +2 -2
  50. package/dist/config/ServerConfiguration.js +35 -35
  51. package/dist/config/ServerConfiguration.js.map +1 -1
  52. package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
  53. package/dist/docs/DocumentationGenerator.js +296 -255
  54. package/dist/docs/DocumentationGenerator.js.map +1 -1
  55. package/dist/docs/MarkdownFormatter.d.ts +1 -1
  56. package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
  57. package/dist/docs/MarkdownFormatter.js +60 -51
  58. package/dist/docs/MarkdownFormatter.js.map +1 -1
  59. package/dist/docs/index.d.ts +3 -3
  60. package/dist/docs/index.d.ts.map +1 -1
  61. package/dist/docs/index.js +2 -2
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +16 -16
  64. package/dist/index.js.map +1 -1
  65. package/dist/mcp-wordpress-1.3.0.tgz +0 -0
  66. package/dist/performance/MetricsCollector.d.ts +3 -3
  67. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  68. package/dist/performance/MetricsCollector.js +33 -27
  69. package/dist/performance/MetricsCollector.js.map +1 -1
  70. package/dist/performance/PerformanceAnalytics.d.ts +12 -12
  71. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
  72. package/dist/performance/PerformanceAnalytics.js +200 -154
  73. package/dist/performance/PerformanceAnalytics.js.map +1 -1
  74. package/dist/performance/PerformanceMonitor.d.ts +5 -5
  75. package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
  76. package/dist/performance/PerformanceMonitor.js +53 -52
  77. package/dist/performance/PerformanceMonitor.js.map +1 -1
  78. package/dist/performance/index.d.ts +6 -6
  79. package/dist/performance/index.d.ts.map +1 -1
  80. package/dist/performance/index.js +3 -3
  81. package/dist/security/InputValidator.d.ts +1 -1
  82. package/dist/security/InputValidator.d.ts.map +1 -1
  83. package/dist/security/InputValidator.js +111 -88
  84. package/dist/security/InputValidator.js.map +1 -1
  85. package/dist/security/SecurityConfig.d.ts +5 -5
  86. package/dist/security/SecurityConfig.js +92 -92
  87. package/dist/security/SecurityConfig.js.map +1 -1
  88. package/dist/server/ConnectionTester.d.ts +1 -1
  89. package/dist/server/ConnectionTester.d.ts.map +1 -1
  90. package/dist/server/ConnectionTester.js +4 -4
  91. package/dist/server/ConnectionTester.js.map +1 -1
  92. package/dist/server/ToolRegistry.d.ts +2 -2
  93. package/dist/server/ToolRegistry.d.ts.map +1 -1
  94. package/dist/server/ToolRegistry.js +35 -32
  95. package/dist/server/ToolRegistry.js.map +1 -1
  96. package/dist/server.d.ts +2 -2
  97. package/dist/server.js +2 -2
  98. package/dist/tools/BaseToolManager.js +5 -5
  99. package/dist/tools/auth.d.ts +2 -2
  100. package/dist/tools/auth.d.ts.map +1 -1
  101. package/dist/tools/auth.js +32 -31
  102. package/dist/tools/auth.js.map +1 -1
  103. package/dist/tools/cache.d.ts +1 -1
  104. package/dist/tools/cache.d.ts.map +1 -1
  105. package/dist/tools/cache.js +71 -71
  106. package/dist/tools/cache.js.map +1 -1
  107. package/dist/tools/comments.d.ts +2 -2
  108. package/dist/tools/comments.d.ts.map +1 -1
  109. package/dist/tools/comments.js +79 -79
  110. package/dist/tools/comments.js.map +1 -1
  111. package/dist/tools/index.d.ts +10 -10
  112. package/dist/tools/index.js +10 -10
  113. package/dist/tools/media.d.ts +2 -2
  114. package/dist/tools/media.js +80 -80
  115. package/dist/tools/pages.d.ts +2 -2
  116. package/dist/tools/pages.d.ts.map +1 -1
  117. package/dist/tools/pages.js +75 -75
  118. package/dist/tools/pages.js.map +1 -1
  119. package/dist/tools/performance.d.ts +1 -1
  120. package/dist/tools/performance.d.ts.map +1 -1
  121. package/dist/tools/performance.js +311 -287
  122. package/dist/tools/performance.js.map +1 -1
  123. package/dist/tools/posts.d.ts +2 -2
  124. package/dist/tools/posts.d.ts.map +1 -1
  125. package/dist/tools/posts.js +94 -94
  126. package/dist/tools/posts.js.map +1 -1
  127. package/dist/tools/site.d.ts +2 -2
  128. package/dist/tools/site.d.ts.map +1 -1
  129. package/dist/tools/site.js +60 -60
  130. package/dist/tools/site.js.map +1 -1
  131. package/dist/tools/taxonomies.d.ts +2 -2
  132. package/dist/tools/taxonomies.js +89 -89
  133. package/dist/tools/users.d.ts +2 -2
  134. package/dist/tools/users.js +68 -68
  135. package/dist/tools/users.js.map +1 -1
  136. package/dist/types/client.d.ts +13 -13
  137. package/dist/types/client.d.ts.map +1 -1
  138. package/dist/types/client.js +12 -12
  139. package/dist/types/client.js.map +1 -1
  140. package/dist/types/index.d.ts +19 -19
  141. package/dist/types/index.d.ts.map +1 -1
  142. package/dist/types/index.js +3 -3
  143. package/dist/types/mcp.d.ts +7 -7
  144. package/dist/types/wordpress.d.ts +21 -21
  145. package/dist/types/wordpress.d.ts.map +1 -1
  146. package/dist/utils/debug.d.ts +2 -2
  147. package/dist/utils/debug.js +28 -28
  148. package/dist/utils/error.d.ts.map +1 -1
  149. package/dist/utils/error.js +13 -13
  150. package/dist/utils/error.js.map +1 -1
  151. package/dist/utils/toolWrapper.d.ts.map +1 -1
  152. package/dist/utils/toolWrapper.js +5 -5
  153. package/dist/utils/toolWrapper.js.map +1 -1
  154. package/dist/utils/validation.d.ts.map +1 -1
  155. package/dist/utils/validation.js +41 -31
  156. package/dist/utils/validation.js.map +1 -1
  157. package/docs/CACHING.md +36 -2
  158. package/docs/DOCKER.md +24 -18
  159. package/docs/PERFORMANCE_MONITORING.md +49 -1
  160. package/docs/SECURITY_TESTING.md +30 -1
  161. package/docs/api/README.md +9 -1
  162. package/docs/api/summary.json +1 -1
  163. package/docs/contract-testing.md +24 -3
  164. package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
  165. package/docs/developer/MAINTENANCE.md +29 -3
  166. package/docs/developer/MIGRATION_GUIDE.md +13 -1
  167. package/docs/developer/NPM_AUTH_SETUP.md +13 -2
  168. package/docs/developer/REFACTORING.md +31 -1
  169. package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
  170. package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
  171. package/docs/user-guides/DOCKER_SETUP.md +264 -0
  172. package/docs/user-guides/DTX_SETUP.md +327 -0
  173. package/docs/user-guides/NPM_SETUP.md +109 -0
  174. package/docs/user-guides/NPX_SETUP.md +281 -0
  175. package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
  176. package/package.json +27 -8
  177. package/src/cache/CacheInvalidation.ts +140 -132
  178. package/src/cache/CacheManager.ts +40 -29
  179. package/src/cache/HttpCacheWrapper.ts +105 -68
  180. package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
  181. package/src/cache/__tests__/CacheManager.test.ts +156 -152
  182. package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
  183. package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
  184. package/src/cache/index.ts +13 -13
  185. package/src/client/CachedWordPressClient.ts +90 -80
  186. package/src/client/api.ts +205 -205
  187. package/src/client/auth.ts +80 -80
  188. package/src/client/managers/AuthenticationManager.ts +61 -61
  189. package/src/client/managers/BaseManager.ts +11 -11
  190. package/src/client/managers/RequestManager.ts +79 -47
  191. package/src/client/managers/index.ts +3 -3
  192. package/src/config/ConfigurationSchema.ts +44 -44
  193. package/src/config/ServerConfiguration.ts +39 -39
  194. package/src/docs/DocumentationGenerator.ts +402 -295
  195. package/src/docs/MarkdownFormatter.ts +94 -69
  196. package/src/docs/index.ts +4 -4
  197. package/src/index.ts +24 -21
  198. package/src/performance/MetricsCollector.ts +90 -58
  199. package/src/performance/PerformanceAnalytics.ts +386 -262
  200. package/src/performance/PerformanceMonitor.ts +152 -118
  201. package/src/performance/index.ts +9 -9
  202. package/src/security/InputValidator.ts +148 -91
  203. package/src/security/SecurityConfig.ts +94 -94
  204. package/src/server/ConnectionTester.ts +21 -15
  205. package/src/server/ToolRegistry.ts +64 -51
  206. package/src/server.ts +2 -2
  207. package/src/tools/BaseToolManager.ts +6 -6
  208. package/src/tools/auth.ts +42 -37
  209. package/src/tools/cache.ts +85 -81
  210. package/src/tools/comments.ts +93 -91
  211. package/src/tools/index.ts +10 -10
  212. package/src/tools/media.ts +89 -89
  213. package/src/tools/pages.ts +89 -87
  214. package/src/tools/performance.ts +443 -352
  215. package/src/tools/posts.ts +109 -107
  216. package/src/tools/site.ts +86 -77
  217. package/src/tools/taxonomies.ts +102 -102
  218. package/src/tools/users.ts +77 -77
  219. package/src/types/client.ts +157 -60
  220. package/src/types/index.ts +49 -27
  221. package/src/types/mcp.ts +15 -15
  222. package/src/types/wordpress.ts +57 -29
  223. package/src/utils/debug.ts +37 -37
  224. package/src/utils/error.ts +47 -25
  225. package/src/utils/toolWrapper.ts +12 -8
  226. package/src/utils/validation.ts +116 -65
  227. package/dist/client/WordPressClient.d.ts +0 -81
  228. package/dist/client/WordPressClient.d.ts.map +0 -1
  229. package/dist/client/WordPressClient.js +0 -354
  230. package/dist/client/WordPressClient.js.map +0 -1
  231. package/dist/performance/AnomalyDetector.d.ts +0 -63
  232. package/dist/performance/AnomalyDetector.d.ts.map +0 -1
  233. package/dist/performance/AnomalyDetector.js +0 -222
  234. package/dist/performance/AnomalyDetector.js.map +0 -1
  235. package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
  236. package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
  237. package/dist/performance/BenchmarkAnalyzer.js +0 -301
  238. package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
  239. package/dist/performance/TrendAnalyzer.d.ts +0 -69
  240. package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
  241. package/dist/performance/TrendAnalyzer.js +0 -203
  242. package/dist/performance/TrendAnalyzer.js.map +0 -1
  243. package/dist/tools/BaseToolClass.d.ts +0 -76
  244. package/dist/tools/BaseToolClass.d.ts.map +0 -1
  245. package/dist/tools/BaseToolClass.js +0 -104
  246. package/dist/tools/BaseToolClass.js.map +0 -1
  247. package/dist/tools/base.d.ts +0 -37
  248. package/dist/tools/base.d.ts.map +0 -1
  249. package/dist/tools/base.js +0 -60
  250. package/dist/tools/base.js.map +0 -1
  251. 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 '../CacheManager.js';
6
- import { HttpCacheWrapper } from '../HttpCacheWrapper.js';
7
- import { CacheInvalidation, WordPressCachePatterns } from '../CacheInvalidation.js';
8
-
9
- describe('CacheInvalidation', () => {
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, 'test-site');
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('Default Invalidation Rules', () => {
31
- test('should have default rules for posts', () => {
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 === 'create');
39
+
40
+ const createRule = rules.posts.find((r) => r.trigger === "create");
38
41
  expect(createRule).toBeDefined();
39
- expect(createRule?.patterns).toContain('posts');
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('should have default rules for categories', () => {
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 === 'update');
51
+
52
+ const updateRule = rules.categories.find((r) => r.trigger === "update");
50
53
  expect(updateRule).toBeDefined();
51
- expect(updateRule?.patterns).toContain('categories/\\d+');
54
+ expect(updateRule?.patterns).toContain("categories/\\d+");
52
55
  expect(updateRule?.cascade).toBe(true);
53
56
  });
54
57
 
55
- test('should have default rules for users', () => {
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 === 'delete');
62
+
63
+ const deleteRule = rules.users.find((r) => r.trigger === "delete");
61
64
  expect(deleteRule).toBeDefined();
62
- expect(deleteRule?.patterns).toContain('users');
65
+ expect(deleteRule?.patterns).toContain("users");
63
66
  });
64
67
  });
65
68
 
66
- describe('Custom Invalidation Rules', () => {
67
- test('should register custom invalidation rules', () => {
69
+ describe("Custom Invalidation Rules", () => {
70
+ test("should register custom invalidation rules", () => {
68
71
  const customRule = {
69
- trigger: 'update' as const,
70
- patterns: ['custom-endpoint.*'],
71
- immediate: true
72
+ trigger: "update" as const,
73
+ patterns: ["custom-endpoint.*"],
74
+ immediate: true,
72
75
  };
73
76
 
74
- cacheInvalidation.registerRule('custom', customRule);
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('should support multiple rules per resource', () => {
84
+ test("should support multiple rules per resource", () => {
82
85
  const rule1 = {
83
- trigger: 'create' as const,
84
- patterns: ['test.*'],
85
- immediate: true
86
+ trigger: "create" as const,
87
+ patterns: ["test.*"],
88
+ immediate: true,
86
89
  };
87
-
90
+
88
91
  const rule2 = {
89
- trigger: 'update' as const,
90
- patterns: ['test/\\d+'],
91
- immediate: false
92
+ trigger: "update" as const,
93
+ patterns: ["test/\\d+"],
94
+ immediate: false,
92
95
  };
93
96
 
94
- cacheInvalidation.registerRule('test', rule1);
95
- cacheInvalidation.registerRule('test', rule2);
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('Event Processing', () => {
105
- test('should process invalidation events', async () => {
107
+ describe("Event Processing", () => {
108
+ test("should process invalidation events", async () => {
106
109
  // Pre-populate cache with some test data
107
- httpCache.warm('posts', [{ id: 1 }, { id: 2 }]);
108
- httpCache.warm('posts/1', { id: 1, title: 'Test Post' });
109
- httpCache.warm('categories', [{ id: 1 }]);
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: 'create',
116
- resource: 'posts',
118
+ type: "create",
119
+ resource: "posts",
117
120
  id: 3,
118
- siteId: 'test-site',
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('should process events in queue order', async () => {
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.fn().mockImplementation((pattern: string) => {
133
- processedEvents.push(pattern);
134
- return originalInvalidatePattern.call(httpCache, pattern);
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: 'create',
141
- resource: 'posts',
142
- siteId: 'test-site',
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: 'update',
147
- resource: 'categories',
148
- siteId: 'test-site',
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('should handle resource invalidation by type', async () => {
157
- httpCache.warm('posts', [{ id: 1 }]);
158
- httpCache.warm('posts/1', { id: 1 });
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('posts', 1, 'update');
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('Pattern Matching', () => {
171
- test('should replace placeholders in patterns', async () => {
175
+ describe("Pattern Matching", () => {
176
+ test("should replace placeholders in patterns", async () => {
172
177
  // Pre-populate cache
173
- httpCache.warm('posts/123', { id: 123 });
174
- httpCache.warm('posts/456', { id: 456 });
175
- httpCache.warm('pages/123', { id: 123 });
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: 'update',
182
- resource: 'posts',
186
+ type: "update",
187
+ resource: "posts",
183
188
  id: 123,
184
- siteId: 'test-site',
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('posts'));
199
+ expect(remainingKeys).not.toContain(expect.stringContaining("posts"));
195
200
  });
196
201
  });
197
202
 
198
- describe('Statistics', () => {
199
- test('should track invalidation statistics', () => {
203
+ describe("Statistics", () => {
204
+ test("should track invalidation statistics", () => {
200
205
  const stats = cacheInvalidation.getStats();
201
-
202
- expect(stats).toHaveProperty('queueSize');
203
- expect(stats).toHaveProperty('rulesCount');
204
- expect(stats).toHaveProperty('processing');
205
-
206
- expect(typeof stats.queueSize).toBe('number');
207
- expect(typeof stats.rulesCount).toBe('number');
208
- expect(typeof stats.processing).toBe('boolean');
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('should clear rules', () => {
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('WordPressCachePatterns', () => {
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, 'test-site');
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('should invalidate content-related caches', () => {
248
+ test("should invalidate content-related caches", () => {
244
249
  // Pre-populate cache
245
- httpCache.warm('posts', []);
246
- httpCache.warm('pages', []);
247
- httpCache.warm('comments', []);
248
- httpCache.warm('categories', []);
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('should invalidate taxonomy-related caches', () => {
260
- httpCache.warm('categories', []);
261
- httpCache.warm('tags', []);
262
- httpCache.warm('posts', []);
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('should invalidate user-related caches', () => {
274
- httpCache.warm('users', []);
275
- httpCache.warm('users/me', {});
276
- httpCache.warm('posts', []);
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('should invalidate all caches', () => {
288
- httpCache.warm('posts', []);
289
- httpCache.warm('categories', []);
290
- httpCache.warm('users', []);
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
  });