mcp-wordpress 1.1.7 → 1.2.2

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 (255) hide show
  1. package/README.md +388 -66
  2. package/dist/cache/CacheInvalidation.d.ts +118 -0
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -0
  4. package/dist/cache/CacheInvalidation.js +349 -0
  5. package/dist/cache/CacheInvalidation.js.map +1 -0
  6. package/dist/cache/CacheManager.d.ts +143 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -0
  8. package/dist/cache/CacheManager.js +308 -0
  9. package/dist/cache/CacheManager.js.map +1 -0
  10. package/dist/cache/HttpCacheWrapper.d.ts +121 -0
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
  12. package/dist/cache/HttpCacheWrapper.js +280 -0
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -0
  14. package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
  15. package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
  17. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
  18. package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
  19. package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
  20. package/dist/cache/__tests__/CacheManager.test.js +233 -0
  21. package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
  22. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
  23. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
  24. package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
  25. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
  26. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
  27. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
  28. package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
  29. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
  30. package/dist/cache/index.d.ts +12 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +9 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/client/CachedWordPressClient.d.ts +160 -0
  35. package/dist/client/CachedWordPressClient.d.ts.map +1 -0
  36. package/dist/client/CachedWordPressClient.js +338 -0
  37. package/dist/client/CachedWordPressClient.js.map +1 -0
  38. package/dist/client/WordPressClient.d.ts +81 -0
  39. package/dist/client/WordPressClient.d.ts.map +1 -0
  40. package/dist/client/WordPressClient.js +354 -0
  41. package/dist/client/WordPressClient.js.map +1 -0
  42. package/dist/config/ConfigurationSchema.d.ts +281 -0
  43. package/dist/config/ConfigurationSchema.d.ts.map +1 -0
  44. package/dist/config/ConfigurationSchema.js +205 -0
  45. package/dist/config/ConfigurationSchema.js.map +1 -0
  46. package/dist/config/ServerConfiguration.d.ts +38 -0
  47. package/dist/config/ServerConfiguration.d.ts.map +1 -0
  48. package/dist/config/ServerConfiguration.js +158 -0
  49. package/dist/config/ServerConfiguration.js.map +1 -0
  50. package/dist/docs/DocumentationGenerator.d.ts +184 -0
  51. package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
  52. package/dist/docs/DocumentationGenerator.js +735 -0
  53. package/dist/docs/DocumentationGenerator.js.map +1 -0
  54. package/dist/docs/MarkdownFormatter.d.ts +84 -0
  55. package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
  56. package/dist/docs/MarkdownFormatter.js +448 -0
  57. package/dist/docs/MarkdownFormatter.js.map +1 -0
  58. package/dist/docs/index.d.ts +8 -0
  59. package/dist/docs/index.d.ts.map +1 -0
  60. package/dist/docs/index.js +7 -0
  61. package/dist/docs/index.js.map +1 -0
  62. package/dist/index.d.ts +1 -4
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +12 -212
  65. package/dist/index.js.map +1 -1
  66. package/dist/performance/AnomalyDetector.d.ts +63 -0
  67. package/dist/performance/AnomalyDetector.d.ts.map +1 -0
  68. package/dist/performance/AnomalyDetector.js +222 -0
  69. package/dist/performance/AnomalyDetector.js.map +1 -0
  70. package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
  71. package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
  72. package/dist/performance/BenchmarkAnalyzer.js +301 -0
  73. package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
  74. package/dist/performance/MetricsCollector.d.ts +139 -0
  75. package/dist/performance/MetricsCollector.d.ts.map +1 -0
  76. package/dist/performance/MetricsCollector.js +320 -0
  77. package/dist/performance/MetricsCollector.js.map +1 -0
  78. package/dist/performance/PerformanceAnalytics.d.ts +162 -0
  79. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
  80. package/dist/performance/PerformanceAnalytics.js +554 -0
  81. package/dist/performance/PerformanceAnalytics.js.map +1 -0
  82. package/dist/performance/PerformanceMonitor.d.ts +202 -0
  83. package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
  84. package/dist/performance/PerformanceMonitor.js +478 -0
  85. package/dist/performance/PerformanceMonitor.js.map +1 -0
  86. package/dist/performance/TrendAnalyzer.d.ts +69 -0
  87. package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
  88. package/dist/performance/TrendAnalyzer.js +203 -0
  89. package/dist/performance/TrendAnalyzer.js.map +1 -0
  90. package/dist/performance/index.d.ts +11 -0
  91. package/dist/performance/index.d.ts.map +1 -0
  92. package/dist/performance/index.js +8 -0
  93. package/dist/performance/index.js.map +1 -0
  94. package/dist/security/InputValidator.d.ts +215 -0
  95. package/dist/security/InputValidator.d.ts.map +1 -0
  96. package/dist/security/InputValidator.js +278 -0
  97. package/dist/security/InputValidator.js.map +1 -0
  98. package/dist/security/SecurityConfig.d.ts +129 -0
  99. package/dist/security/SecurityConfig.d.ts.map +1 -0
  100. package/dist/security/SecurityConfig.js +262 -0
  101. package/dist/security/SecurityConfig.js.map +1 -0
  102. package/dist/server/ConnectionTester.d.ts +24 -0
  103. package/dist/server/ConnectionTester.d.ts.map +1 -0
  104. package/dist/server/ConnectionTester.js +61 -0
  105. package/dist/server/ConnectionTester.js.map +1 -0
  106. package/dist/server/ToolRegistry.d.ts +46 -0
  107. package/dist/server/ToolRegistry.d.ts.map +1 -0
  108. package/dist/server/ToolRegistry.js +148 -0
  109. package/dist/server/ToolRegistry.js.map +1 -0
  110. package/dist/tools/BaseToolClass.d.ts +76 -0
  111. package/dist/tools/BaseToolClass.d.ts.map +1 -0
  112. package/dist/tools/BaseToolClass.js +104 -0
  113. package/dist/tools/BaseToolClass.js.map +1 -0
  114. package/dist/tools/BaseToolManager.d.ts +26 -0
  115. package/dist/tools/BaseToolManager.d.ts.map +1 -0
  116. package/dist/tools/BaseToolManager.js +56 -0
  117. package/dist/tools/BaseToolManager.js.map +1 -0
  118. package/dist/tools/base.d.ts +37 -0
  119. package/dist/tools/base.d.ts.map +1 -0
  120. package/dist/tools/base.js +60 -0
  121. package/dist/tools/base.js.map +1 -0
  122. package/dist/tools/cache.d.ts +260 -0
  123. package/dist/tools/cache.d.ts.map +1 -0
  124. package/dist/tools/cache.js +237 -0
  125. package/dist/tools/cache.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -0
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +2 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/performance.d.ts +63 -0
  131. package/dist/tools/performance.d.ts.map +1 -0
  132. package/dist/tools/performance.js +865 -0
  133. package/dist/tools/performance.js.map +1 -0
  134. package/dist/types/client.d.ts +1 -0
  135. package/dist/types/client.d.ts.map +1 -1
  136. package/dist/types/client.js.map +1 -1
  137. package/dist/utils/toolWrapper.d.ts +4 -0
  138. package/dist/utils/toolWrapper.d.ts.map +1 -1
  139. package/dist/utils/toolWrapper.js +11 -0
  140. package/dist/utils/toolWrapper.js.map +1 -1
  141. package/dist/utils/validation.d.ts +68 -0
  142. package/dist/utils/validation.d.ts.map +1 -0
  143. package/dist/utils/validation.js +185 -0
  144. package/dist/utils/validation.js.map +1 -0
  145. package/docs/CACHING.md +340 -0
  146. package/docs/DOCKER.md +451 -0
  147. package/docs/PERFORMANCE_MONITORING.md +471 -0
  148. package/docs/SECURITY_TESTING.md +393 -0
  149. package/docs/api/README.md +200 -0
  150. package/docs/api/categories/auth.md +40 -0
  151. package/docs/api/categories/cache.md +41 -0
  152. package/docs/api/categories/comment.md +44 -0
  153. package/docs/api/categories/media.md +43 -0
  154. package/docs/api/categories/page.md +43 -0
  155. package/docs/api/categories/performance.md +44 -0
  156. package/docs/api/categories/post.md +43 -0
  157. package/docs/api/categories/site.md +43 -0
  158. package/docs/api/categories/taxonomy.md +47 -0
  159. package/docs/api/categories/user.md +43 -0
  160. package/docs/api/openapi.json +3305 -0
  161. package/docs/api/summary.json +12 -0
  162. package/docs/api/tools/wp_approve_comment.md +98 -0
  163. package/docs/api/tools/wp_cache_clear.md +120 -0
  164. package/docs/api/tools/wp_cache_info.md +119 -0
  165. package/docs/api/tools/wp_cache_stats.md +119 -0
  166. package/docs/api/tools/wp_cache_warm.md +119 -0
  167. package/docs/api/tools/wp_create_application_password.md +102 -0
  168. package/docs/api/tools/wp_create_category.md +102 -0
  169. package/docs/api/tools/wp_create_comment.md +128 -0
  170. package/docs/api/tools/wp_create_page.md +135 -0
  171. package/docs/api/tools/wp_create_post.md +147 -0
  172. package/docs/api/tools/wp_create_tag.md +101 -0
  173. package/docs/api/tools/wp_create_user.md +135 -0
  174. package/docs/api/tools/wp_delete_application_password.md +101 -0
  175. package/docs/api/tools/wp_delete_category.md +100 -0
  176. package/docs/api/tools/wp_delete_comment.md +101 -0
  177. package/docs/api/tools/wp_delete_media.md +108 -0
  178. package/docs/api/tools/wp_delete_page.md +108 -0
  179. package/docs/api/tools/wp_delete_post.md +117 -0
  180. package/docs/api/tools/wp_delete_tag.md +100 -0
  181. package/docs/api/tools/wp_delete_user.md +108 -0
  182. package/docs/api/tools/wp_get_application_passwords.md +103 -0
  183. package/docs/api/tools/wp_get_auth_status.md +101 -0
  184. package/docs/api/tools/wp_get_category.md +103 -0
  185. package/docs/api/tools/wp_get_comment.md +103 -0
  186. package/docs/api/tools/wp_get_current_user.md +101 -0
  187. package/docs/api/tools/wp_get_media.md +103 -0
  188. package/docs/api/tools/wp_get_page.md +103 -0
  189. package/docs/api/tools/wp_get_page_revisions.md +103 -0
  190. package/docs/api/tools/wp_get_post.md +112 -0
  191. package/docs/api/tools/wp_get_post_revisions.md +103 -0
  192. package/docs/api/tools/wp_get_site_settings.md +108 -0
  193. package/docs/api/tools/wp_get_tag.md +103 -0
  194. package/docs/api/tools/wp_get_user.md +103 -0
  195. package/docs/api/tools/wp_list_categories.md +111 -0
  196. package/docs/api/tools/wp_list_comments.md +111 -0
  197. package/docs/api/tools/wp_list_media.md +145 -0
  198. package/docs/api/tools/wp_list_pages.md +145 -0
  199. package/docs/api/tools/wp_list_posts.md +156 -0
  200. package/docs/api/tools/wp_list_tags.md +110 -0
  201. package/docs/api/tools/wp_list_users.md +111 -0
  202. package/docs/api/tools/wp_performance_alerts.md +162 -0
  203. package/docs/api/tools/wp_performance_benchmark.md +160 -0
  204. package/docs/api/tools/wp_performance_export.md +162 -0
  205. package/docs/api/tools/wp_performance_history.md +161 -0
  206. package/docs/api/tools/wp_performance_optimize.md +162 -0
  207. package/docs/api/tools/wp_performance_stats.md +160 -0
  208. package/docs/api/tools/wp_search_site.md +99 -0
  209. package/docs/api/tools/wp_spam_comment.md +98 -0
  210. package/docs/api/tools/wp_switch_auth_method.md +122 -0
  211. package/docs/api/tools/wp_test_auth.md +96 -0
  212. package/docs/api/tools/wp_update_category.md +102 -0
  213. package/docs/api/tools/wp_update_comment.md +127 -0
  214. package/docs/api/tools/wp_update_media.md +129 -0
  215. package/docs/api/tools/wp_update_page.md +135 -0
  216. package/docs/api/tools/wp_update_post.md +144 -0
  217. package/docs/api/tools/wp_update_site_settings.md +127 -0
  218. package/docs/api/tools/wp_update_tag.md +102 -0
  219. package/docs/api/tools/wp_update_user.md +134 -0
  220. package/docs/api/tools/wp_upload_media.md +131 -0
  221. package/docs/api/types/WordPressPost.md +39 -0
  222. package/docs/contract-testing.md +183 -0
  223. package/docs/developer/NPM_AUTH_SETUP.md +3 -3
  224. package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
  225. package/package.json +84 -64
  226. package/src/cache/CacheInvalidation.ts +421 -0
  227. package/src/cache/CacheManager.ts +391 -0
  228. package/src/cache/HttpCacheWrapper.ts +372 -0
  229. package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
  230. package/src/cache/__tests__/CacheManager.test.ts +300 -0
  231. package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
  232. package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
  233. package/src/cache/index.ts +26 -0
  234. package/src/client/CachedWordPressClient.ts +442 -0
  235. package/src/config/ConfigurationSchema.ts +246 -0
  236. package/src/config/ServerConfiguration.ts +215 -0
  237. package/src/docs/DocumentationGenerator.ts +952 -0
  238. package/src/docs/MarkdownFormatter.ts +494 -0
  239. package/src/docs/index.ts +21 -0
  240. package/src/index.ts +14 -274
  241. package/src/performance/MetricsCollector.ts +447 -0
  242. package/src/performance/PerformanceAnalytics.ts +762 -0
  243. package/src/performance/PerformanceMonitor.ts +649 -0
  244. package/src/performance/index.ts +28 -0
  245. package/src/security/InputValidator.ts +319 -0
  246. package/src/security/SecurityConfig.ts +301 -0
  247. package/src/server/ConnectionTester.ts +74 -0
  248. package/src/server/ToolRegistry.ts +194 -0
  249. package/src/tools/BaseToolManager.ts +66 -0
  250. package/src/tools/cache.ts +259 -0
  251. package/src/tools/index.ts +2 -0
  252. package/src/tools/performance.ts +948 -0
  253. package/src/types/client.ts +1 -0
  254. package/src/utils/toolWrapper.ts +11 -0
  255. package/src/utils/validation.ts +259 -0
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Intelligent cache invalidation strategies for WordPress MCP Server
3
+ * Implements event-based and pattern-based invalidation
4
+ */
5
+
6
+ import { HttpCacheWrapper } from './HttpCacheWrapper.js';
7
+
8
+ export interface InvalidationRule {
9
+ trigger: string;
10
+ patterns: string[];
11
+ immediate?: boolean;
12
+ cascade?: boolean;
13
+ }
14
+
15
+ export interface InvalidationEvent {
16
+ type: 'create' | 'update' | 'delete';
17
+ resource: string;
18
+ id?: number | undefined;
19
+ siteId: string;
20
+ timestamp: number;
21
+ data?: any;
22
+ }
23
+
24
+ /**
25
+ * Cache invalidation manager that handles intelligent cache clearing
26
+ */
27
+ export class CacheInvalidation {
28
+ private invalidationRules: Map<string, InvalidationRule[]> = new Map();
29
+ private eventQueue: InvalidationEvent[] = [];
30
+ private processing = false;
31
+
32
+ constructor(private httpCache: HttpCacheWrapper) {
33
+ this.setupDefaultRules();
34
+ }
35
+
36
+ /**
37
+ * Register invalidation rule
38
+ */
39
+ registerRule(resource: string, rule: InvalidationRule): void {
40
+ if (!this.invalidationRules.has(resource)) {
41
+ this.invalidationRules.set(resource, []);
42
+ }
43
+ this.invalidationRules.get(resource)!.push(rule);
44
+ }
45
+
46
+ /**
47
+ * Trigger invalidation event
48
+ */
49
+ async trigger(event: InvalidationEvent): Promise<void> {
50
+ this.eventQueue.push(event);
51
+
52
+ if (!this.processing) {
53
+ await this.processQueue();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Invalidate cache for specific resource
59
+ */
60
+ async invalidateResource(
61
+ resource: string,
62
+ id?: number,
63
+ type: 'create' | 'update' | 'delete' = 'update'
64
+ ): Promise<void> {
65
+ const event: InvalidationEvent = {
66
+ type,
67
+ resource,
68
+ id,
69
+ siteId: this.httpCache['siteId'], // Access private property
70
+ timestamp: Date.now()
71
+ };
72
+
73
+ await this.trigger(event);
74
+ }
75
+
76
+ /**
77
+ * Setup default invalidation rules
78
+ */
79
+ private setupDefaultRules(): void {
80
+ // Post invalidation rules
81
+ this.registerRule('posts', {
82
+ trigger: 'create',
83
+ patterns: [
84
+ 'posts', // All posts listings
85
+ 'posts/\\d+', // Specific post
86
+ 'categories', // Category listings (if post has categories)
87
+ 'tags', // Tag listings (if post has tags)
88
+ 'search' // Search results
89
+ ],
90
+ immediate: true,
91
+ cascade: true
92
+ });
93
+
94
+ this.registerRule('posts', {
95
+ trigger: 'update',
96
+ patterns: [
97
+ 'posts/\\d+', // Specific post
98
+ 'posts.*', // All posts with parameters
99
+ 'search' // Search results
100
+ ],
101
+ immediate: true
102
+ });
103
+
104
+ this.registerRule('posts', {
105
+ trigger: 'delete',
106
+ patterns: [
107
+ 'posts', // All posts listings
108
+ 'posts/\\d+', // Specific post
109
+ 'categories', // Category counts might change
110
+ 'tags', // Tag counts might change
111
+ 'search' // Search results
112
+ ],
113
+ immediate: true,
114
+ cascade: true
115
+ });
116
+
117
+ // Page invalidation rules
118
+ this.registerRule('pages', {
119
+ trigger: 'create',
120
+ patterns: ['pages', 'pages/\\d+'],
121
+ immediate: true
122
+ });
123
+
124
+ this.registerRule('pages', {
125
+ trigger: 'update',
126
+ patterns: ['pages/\\d+', 'pages.*'],
127
+ immediate: true
128
+ });
129
+
130
+ this.registerRule('pages', {
131
+ trigger: 'delete',
132
+ patterns: ['pages', 'pages/\\d+'],
133
+ immediate: true
134
+ });
135
+
136
+ // Comment invalidation rules
137
+ this.registerRule('comments', {
138
+ trigger: 'create',
139
+ patterns: [
140
+ 'comments',
141
+ 'comments.*',
142
+ 'posts/\\d+.*' // Parent post cache
143
+ ],
144
+ immediate: true
145
+ });
146
+
147
+ this.registerRule('comments', {
148
+ trigger: 'update',
149
+ patterns: [
150
+ 'comments/\\d+',
151
+ 'comments.*',
152
+ 'posts/\\d+.*' // Parent post cache
153
+ ],
154
+ immediate: true
155
+ });
156
+
157
+ this.registerRule('comments', {
158
+ trigger: 'delete',
159
+ patterns: [
160
+ 'comments',
161
+ 'comments/\\d+',
162
+ 'posts/\\d+.*' // Parent post cache
163
+ ],
164
+ immediate: true
165
+ });
166
+
167
+ // Media invalidation rules
168
+ this.registerRule('media', {
169
+ trigger: 'create',
170
+ patterns: ['media', 'media.*'],
171
+ immediate: true
172
+ });
173
+
174
+ this.registerRule('media', {
175
+ trigger: 'update',
176
+ patterns: ['media/\\d+', 'media.*'],
177
+ immediate: true
178
+ });
179
+
180
+ this.registerRule('media', {
181
+ trigger: 'delete',
182
+ patterns: ['media', 'media/\\d+'],
183
+ immediate: true
184
+ });
185
+
186
+ // User invalidation rules
187
+ this.registerRule('users', {
188
+ trigger: 'create',
189
+ patterns: ['users', 'users.*'],
190
+ immediate: true
191
+ });
192
+
193
+ this.registerRule('users', {
194
+ trigger: 'update',
195
+ patterns: [
196
+ 'users/\\d+',
197
+ 'users.*',
198
+ 'users/me' // Current user info
199
+ ],
200
+ immediate: true
201
+ });
202
+
203
+ this.registerRule('users', {
204
+ trigger: 'delete',
205
+ patterns: ['users', 'users/\\d+'],
206
+ immediate: true
207
+ });
208
+
209
+ // Category invalidation rules
210
+ this.registerRule('categories', {
211
+ trigger: 'create',
212
+ patterns: ['categories', 'categories.*', 'posts.*'],
213
+ immediate: true,
214
+ cascade: true
215
+ });
216
+
217
+ this.registerRule('categories', {
218
+ trigger: 'update',
219
+ patterns: ['categories/\\d+', 'categories.*', 'posts.*'],
220
+ immediate: true,
221
+ cascade: true
222
+ });
223
+
224
+ this.registerRule('categories', {
225
+ trigger: 'delete',
226
+ patterns: ['categories', 'categories/\\d+', 'posts.*'],
227
+ immediate: true,
228
+ cascade: true
229
+ });
230
+
231
+ // Tag invalidation rules
232
+ this.registerRule('tags', {
233
+ trigger: 'create',
234
+ patterns: ['tags', 'tags.*', 'posts.*'],
235
+ immediate: true,
236
+ cascade: true
237
+ });
238
+
239
+ this.registerRule('tags', {
240
+ trigger: 'update',
241
+ patterns: ['tags/\\d+', 'tags.*', 'posts.*'],
242
+ immediate: true,
243
+ cascade: true
244
+ });
245
+
246
+ this.registerRule('tags', {
247
+ trigger: 'delete',
248
+ patterns: ['tags', 'tags/\\d+', 'posts.*'],
249
+ immediate: true,
250
+ cascade: true
251
+ });
252
+
253
+ // Settings invalidation rules (rarely change)
254
+ this.registerRule('settings', {
255
+ trigger: 'update',
256
+ patterns: ['settings.*'],
257
+ immediate: true,
258
+ cascade: false
259
+ });
260
+ }
261
+
262
+ /**
263
+ * Process invalidation event queue
264
+ */
265
+ private async processQueue(): Promise<void> {
266
+ if (this.processing || this.eventQueue.length === 0) {
267
+ return;
268
+ }
269
+
270
+ this.processing = true;
271
+
272
+ try {
273
+ while (this.eventQueue.length > 0) {
274
+ const event = this.eventQueue.shift()!;
275
+ await this.processEvent(event);
276
+ }
277
+ } finally {
278
+ this.processing = false;
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Process single invalidation event
284
+ */
285
+ private async processEvent(event: InvalidationEvent): Promise<void> {
286
+ const rules = this.invalidationRules.get(event.resource) || [];
287
+
288
+ for (const rule of rules) {
289
+ if (rule.trigger === event.type || rule.trigger === '*') {
290
+ await this.applyInvalidationRule(event, rule);
291
+ }
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Apply invalidation rule to cache
297
+ */
298
+ private async applyInvalidationRule(
299
+ event: InvalidationEvent,
300
+ rule: InvalidationRule
301
+ ): Promise<void> {
302
+ for (const pattern of rule.patterns) {
303
+ let invalidationPattern = pattern;
304
+
305
+ // Replace placeholders with actual values
306
+ if (event.id) {
307
+ invalidationPattern = invalidationPattern.replace('\\d+', event.id.toString());
308
+ }
309
+
310
+ // Invalidate matching cache entries
311
+ const invalidated = this.httpCache.invalidatePattern(invalidationPattern);
312
+
313
+ if (invalidated > 0) {
314
+ console.log(`Invalidated ${invalidated} cache entries for pattern: ${invalidationPattern}`);
315
+ }
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Get invalidation statistics
321
+ */
322
+ getStats(): {
323
+ queueSize: number;
324
+ rulesCount: number;
325
+ processing: boolean;
326
+ } {
327
+ return {
328
+ queueSize: this.eventQueue.length,
329
+ rulesCount: Array.from(this.invalidationRules.values()).reduce((acc, rules) => acc + rules.length, 0),
330
+ processing: this.processing
331
+ };
332
+ }
333
+
334
+ /**
335
+ * Clear all invalidation rules
336
+ */
337
+ clearRules(): void {
338
+ this.invalidationRules.clear();
339
+ }
340
+
341
+ /**
342
+ * Get all registered rules
343
+ */
344
+ getRules(): Record<string, InvalidationRule[]> {
345
+ const rules: Record<string, InvalidationRule[]> = {};
346
+ for (const [resource, ruleList] of this.invalidationRules.entries()) {
347
+ rules[resource] = [...ruleList];
348
+ }
349
+ return rules;
350
+ }
351
+ }
352
+
353
+ /**
354
+ * Cache invalidation patterns for common WordPress operations
355
+ */
356
+ export class WordPressCachePatterns {
357
+ /**
358
+ * Invalidate all content-related caches
359
+ */
360
+ static invalidateContent(cache: HttpCacheWrapper): number {
361
+ return cache.invalidatePattern('(posts|pages|comments|media)');
362
+ }
363
+
364
+ /**
365
+ * Invalidate all taxonomy-related caches
366
+ */
367
+ static invalidateTaxonomies(cache: HttpCacheWrapper): number {
368
+ return cache.invalidatePattern('(categories|tags|taxonomies)');
369
+ }
370
+
371
+ /**
372
+ * Invalidate all user-related caches
373
+ */
374
+ static invalidateUsers(cache: HttpCacheWrapper): number {
375
+ return cache.invalidatePattern('users');
376
+ }
377
+
378
+ /**
379
+ * Invalidate search-related caches
380
+ */
381
+ static invalidateSearch(cache: HttpCacheWrapper): number {
382
+ return cache.invalidatePattern('search');
383
+ }
384
+
385
+ /**
386
+ * Invalidate all caches (nuclear option)
387
+ */
388
+ static invalidateAll(cache: HttpCacheWrapper): number {
389
+ return cache.invalidateAll();
390
+ }
391
+ }
392
+
393
+ /**
394
+ * Cache warming strategies for common WordPress data
395
+ */
396
+ export class CacheWarmer {
397
+ constructor(private httpCache: HttpCacheWrapper) {}
398
+
399
+ /**
400
+ * Warm cache with essential WordPress data
401
+ */
402
+ async warmEssentials(): Promise<void> {
403
+ // Implementation would depend on your specific WordPress client
404
+ // This is a placeholder for the structure
405
+ console.log('Warming essential caches...');
406
+ }
407
+
408
+ /**
409
+ * Warm cache with taxonomy data
410
+ */
411
+ async warmTaxonomies(): Promise<void> {
412
+ console.log('Warming taxonomy caches...');
413
+ }
414
+
415
+ /**
416
+ * Warm cache with user data
417
+ */
418
+ async warmUsers(): Promise<void> {
419
+ console.log('Warming user caches...');
420
+ }
421
+ }