mcp-wordpress 2.6.4 → 2.7.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 (332) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/CacheInvalidation.d.ts +25 -6
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +168 -16
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  7. package/dist/cache/HttpCacheWrapper.js +3 -4
  8. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  9. package/dist/cache/SEOCacheManager.d.ts +150 -0
  10. package/dist/cache/SEOCacheManager.d.ts.map +1 -0
  11. package/dist/cache/SEOCacheManager.js +275 -0
  12. package/dist/cache/SEOCacheManager.js.map +1 -0
  13. package/dist/client/SEOWordPressClient.d.ts +164 -0
  14. package/dist/client/SEOWordPressClient.d.ts.map +1 -0
  15. package/dist/client/SEOWordPressClient.js +674 -0
  16. package/dist/client/SEOWordPressClient.js.map +1 -0
  17. package/dist/client/api.d.ts.map +1 -1
  18. package/dist/client/api.js +50 -20
  19. package/dist/client/api.js.map +1 -1
  20. package/dist/client/auth.js +19 -19
  21. package/dist/client/auth.js.map +1 -1
  22. package/dist/client/index.d.ts +11 -0
  23. package/dist/client/index.d.ts.map +1 -0
  24. package/dist/client/index.js +14 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/client/managers/AuthManager.d.ts +39 -0
  27. package/dist/client/managers/AuthManager.d.ts.map +1 -0
  28. package/dist/client/managers/AuthManager.js +142 -0
  29. package/dist/client/managers/AuthManager.js.map +1 -0
  30. package/dist/client/managers/AuthenticationManager.d.ts.map +1 -1
  31. package/dist/client/managers/AuthenticationManager.js +10 -9
  32. package/dist/client/managers/AuthenticationManager.js.map +1 -1
  33. package/dist/client/managers/BaseManager.d.ts.map +1 -1
  34. package/dist/client/managers/BaseManager.js +12 -0
  35. package/dist/client/managers/BaseManager.js.map +1 -1
  36. package/dist/client/managers/ComposedAuthenticationManager.d.ts +94 -0
  37. package/dist/client/managers/ComposedAuthenticationManager.d.ts.map +1 -0
  38. package/dist/client/managers/ComposedAuthenticationManager.js +340 -0
  39. package/dist/client/managers/ComposedAuthenticationManager.js.map +1 -0
  40. package/dist/client/managers/ComposedManagerFactory.d.ts +104 -0
  41. package/dist/client/managers/ComposedManagerFactory.d.ts.map +1 -0
  42. package/dist/client/managers/ComposedManagerFactory.js +180 -0
  43. package/dist/client/managers/ComposedManagerFactory.js.map +1 -0
  44. package/dist/client/managers/ComposedRequestManager.d.ts +82 -0
  45. package/dist/client/managers/ComposedRequestManager.d.ts.map +1 -0
  46. package/dist/client/managers/ComposedRequestManager.js +260 -0
  47. package/dist/client/managers/ComposedRequestManager.js.map +1 -0
  48. package/dist/client/managers/JWTAuthImplementation.d.ts +86 -0
  49. package/dist/client/managers/JWTAuthImplementation.d.ts.map +1 -0
  50. package/dist/client/managers/JWTAuthImplementation.js +240 -0
  51. package/dist/client/managers/JWTAuthImplementation.js.map +1 -0
  52. package/dist/client/managers/ManagersIndex.d.ts +6 -0
  53. package/dist/client/managers/ManagersIndex.d.ts.map +1 -0
  54. package/dist/client/managers/ManagersIndex.js +6 -0
  55. package/dist/client/managers/ManagersIndex.js.map +1 -0
  56. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  57. package/dist/client/managers/RequestManager.js +5 -3
  58. package/dist/client/managers/RequestManager.js.map +1 -1
  59. package/dist/client/managers/composed/MigrationAdapter.d.ts +80 -0
  60. package/dist/client/managers/composed/MigrationAdapter.d.ts.map +1 -0
  61. package/dist/client/managers/composed/MigrationAdapter.js +214 -0
  62. package/dist/client/managers/composed/MigrationAdapter.js.map +1 -0
  63. package/dist/client/managers/composed/index.d.ts +23 -0
  64. package/dist/client/managers/composed/index.d.ts.map +1 -0
  65. package/dist/client/managers/composed/index.js +26 -0
  66. package/dist/client/managers/composed/index.js.map +1 -0
  67. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts +27 -0
  68. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts.map +1 -0
  69. package/dist/client/managers/implementations/ConfigurationProviderImpl.js +41 -0
  70. package/dist/client/managers/implementations/ConfigurationProviderImpl.js.map +1 -0
  71. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts +31 -0
  72. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts.map +1 -0
  73. package/dist/client/managers/implementations/ErrorHandlerImpl.js +73 -0
  74. package/dist/client/managers/implementations/ErrorHandlerImpl.js.map +1 -0
  75. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts +47 -0
  76. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts.map +1 -0
  77. package/dist/client/managers/implementations/ParameterValidatorImpl.js +141 -0
  78. package/dist/client/managers/implementations/ParameterValidatorImpl.js.map +1 -0
  79. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts +147 -0
  80. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts.map +1 -0
  81. package/dist/client/managers/interfaces/ManagerInterfaces.js +6 -0
  82. package/dist/client/managers/interfaces/ManagerInterfaces.js.map +1 -0
  83. package/dist/config/Config.d.ts +30 -0
  84. package/dist/config/Config.d.ts.map +1 -1
  85. package/dist/config/Config.js +30 -0
  86. package/dist/config/Config.js.map +1 -1
  87. package/dist/config/ConfigurationSchema.d.ts +75 -198
  88. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  89. package/dist/config/ConfigurationSchema.js +17 -17
  90. package/dist/config/ConfigurationSchema.js.map +1 -1
  91. package/dist/config/ServerConfiguration.d.ts +2 -2
  92. package/dist/config/ServerConfiguration.d.ts.map +1 -1
  93. package/dist/config/ServerConfiguration.js +15 -13
  94. package/dist/config/ServerConfiguration.js.map +1 -1
  95. package/dist/config/index.d.ts +8 -0
  96. package/dist/config/index.d.ts.map +1 -0
  97. package/dist/config/index.js +11 -0
  98. package/dist/config/index.js.map +1 -0
  99. package/dist/docs/DocumentationGenerator.js +2 -2
  100. package/dist/docs/DocumentationGenerator.js.map +1 -1
  101. package/dist/dxt-entry.js +3 -3
  102. package/dist/dxt-entry.js.map +1 -1
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +38 -37
  106. package/dist/index.js.map +1 -1
  107. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  108. package/dist/performance/MetricsCollector.js +5 -4
  109. package/dist/performance/MetricsCollector.js.map +1 -1
  110. package/dist/security/AISecurityScanner.js +7 -7
  111. package/dist/security/AISecurityScanner.js.map +1 -1
  112. package/dist/security/AutomatedRemediation.d.ts.map +1 -1
  113. package/dist/security/AutomatedRemediation.js +11 -11
  114. package/dist/security/AutomatedRemediation.js.map +1 -1
  115. package/dist/security/InputValidator.d.ts +50 -126
  116. package/dist/security/InputValidator.d.ts.map +1 -1
  117. package/dist/security/InputValidator.js +9 -9
  118. package/dist/security/InputValidator.js.map +1 -1
  119. package/dist/security/SecurityCIPipeline.d.ts +47 -5
  120. package/dist/security/SecurityCIPipeline.d.ts.map +1 -1
  121. package/dist/security/SecurityCIPipeline.js +390 -49
  122. package/dist/security/SecurityCIPipeline.js.map +1 -1
  123. package/dist/security/SecurityConfigManager.js +10 -10
  124. package/dist/security/SecurityConfigManager.js.map +1 -1
  125. package/dist/security/SecurityMonitoring.js +4 -4
  126. package/dist/security/SecurityMonitoring.js.map +1 -1
  127. package/dist/security/SecurityReviewer.d.ts.map +1 -1
  128. package/dist/security/SecurityReviewer.js +13 -6
  129. package/dist/security/SecurityReviewer.js.map +1 -1
  130. package/dist/security/index.js +3 -3
  131. package/dist/security/index.js.map +1 -1
  132. package/dist/server/ConnectionTester.js +5 -5
  133. package/dist/server/ConnectionTester.js.map +1 -1
  134. package/dist/server/ToolRegistry.d.ts +2 -2
  135. package/dist/server/ToolRegistry.d.ts.map +1 -1
  136. package/dist/server/ToolRegistry.js +7 -6
  137. package/dist/server/ToolRegistry.js.map +1 -1
  138. package/dist/server/index.d.ts +7 -0
  139. package/dist/server/index.d.ts.map +1 -0
  140. package/dist/server/index.js +9 -0
  141. package/dist/server/index.js.map +1 -0
  142. package/dist/tools/BaseToolManager.d.ts.map +1 -1
  143. package/dist/tools/BaseToolManager.js +11 -11
  144. package/dist/tools/BaseToolManager.js.map +1 -1
  145. package/dist/tools/auth.d.ts.map +1 -1
  146. package/dist/tools/auth.js +7 -7
  147. package/dist/tools/auth.js.map +1 -1
  148. package/dist/tools/comments.d.ts.map +1 -1
  149. package/dist/tools/comments.js +14 -14
  150. package/dist/tools/comments.js.map +1 -1
  151. package/dist/tools/index.d.ts +1 -0
  152. package/dist/tools/index.d.ts.map +1 -1
  153. package/dist/tools/index.js +1 -0
  154. package/dist/tools/index.js.map +1 -1
  155. package/dist/tools/media.d.ts.map +1 -1
  156. package/dist/tools/media.js +14 -11
  157. package/dist/tools/media.js.map +1 -1
  158. package/dist/tools/pages.d.ts.map +1 -1
  159. package/dist/tools/pages.js +12 -12
  160. package/dist/tools/pages.js.map +1 -1
  161. package/dist/tools/performance.d.ts.map +1 -1
  162. package/dist/tools/performance.js +13 -11
  163. package/dist/tools/performance.js.map +1 -1
  164. package/dist/tools/posts/PostHandlers.d.ts.map +1 -1
  165. package/dist/tools/posts/PostHandlers.js +16 -16
  166. package/dist/tools/posts/PostHandlers.js.map +1 -1
  167. package/dist/tools/posts/PostToolDefinitions.d.ts.map +1 -1
  168. package/dist/tools/posts/index.d.ts.map +1 -1
  169. package/dist/tools/seo/BulkOperations.d.ts +113 -0
  170. package/dist/tools/seo/BulkOperations.d.ts.map +1 -0
  171. package/dist/tools/seo/BulkOperations.js +398 -0
  172. package/dist/tools/seo/BulkOperations.js.map +1 -0
  173. package/dist/tools/seo/SEOHandlers.d.ts +55 -0
  174. package/dist/tools/seo/SEOHandlers.d.ts.map +1 -0
  175. package/dist/tools/seo/SEOHandlers.js +255 -0
  176. package/dist/tools/seo/SEOHandlers.js.map +1 -0
  177. package/dist/tools/seo/SEOToolDefinitions.d.ts +59 -0
  178. package/dist/tools/seo/SEOToolDefinitions.d.ts.map +1 -0
  179. package/dist/tools/seo/SEOToolDefinitions.js +385 -0
  180. package/dist/tools/seo/SEOToolDefinitions.js.map +1 -0
  181. package/dist/tools/seo/SEOTools.d.ts +203 -0
  182. package/dist/tools/seo/SEOTools.d.ts.map +1 -0
  183. package/dist/tools/seo/SEOTools.js +708 -0
  184. package/dist/tools/seo/SEOTools.js.map +1 -0
  185. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts +94 -0
  186. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts.map +1 -0
  187. package/dist/tools/seo/analyzers/ContentAnalyzer.js +402 -0
  188. package/dist/tools/seo/analyzers/ContentAnalyzer.js.map +1 -0
  189. package/dist/tools/seo/auditors/SiteAuditor.d.ts +121 -0
  190. package/dist/tools/seo/auditors/SiteAuditor.d.ts.map +1 -0
  191. package/dist/tools/seo/auditors/SiteAuditor.js +600 -0
  192. package/dist/tools/seo/auditors/SiteAuditor.js.map +1 -0
  193. package/dist/tools/seo/generators/MetaGenerator.d.ts +128 -0
  194. package/dist/tools/seo/generators/MetaGenerator.d.ts.map +1 -0
  195. package/dist/tools/seo/generators/MetaGenerator.js +547 -0
  196. package/dist/tools/seo/generators/MetaGenerator.js.map +1 -0
  197. package/dist/tools/seo/generators/SchemaGenerator.d.ts +204 -0
  198. package/dist/tools/seo/generators/SchemaGenerator.d.ts.map +1 -0
  199. package/dist/tools/seo/generators/SchemaGenerator.js +670 -0
  200. package/dist/tools/seo/generators/SchemaGenerator.js.map +1 -0
  201. package/dist/tools/seo/index.d.ts +17 -0
  202. package/dist/tools/seo/index.d.ts.map +1 -0
  203. package/dist/tools/seo/index.js +18 -0
  204. package/dist/tools/seo/index.js.map +1 -0
  205. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts +186 -0
  206. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts.map +1 -0
  207. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js +683 -0
  208. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js.map +1 -0
  209. package/dist/tools/site.d.ts.map +1 -1
  210. package/dist/tools/site.js +12 -12
  211. package/dist/tools/site.js.map +1 -1
  212. package/dist/tools/taxonomies.d.ts.map +1 -1
  213. package/dist/tools/taxonomies.js +20 -20
  214. package/dist/tools/taxonomies.js.map +1 -1
  215. package/dist/tools/users.d.ts.map +1 -1
  216. package/dist/tools/users.js +12 -12
  217. package/dist/tools/users.js.map +1 -1
  218. package/dist/types/client.d.ts +8 -6
  219. package/dist/types/client.d.ts.map +1 -1
  220. package/dist/types/client.js.map +1 -1
  221. package/dist/types/seo.d.ts +473 -0
  222. package/dist/types/seo.d.ts.map +1 -0
  223. package/dist/types/seo.js +94 -0
  224. package/dist/types/seo.js.map +1 -0
  225. package/dist/utils/enhancedError.js +1 -1
  226. package/dist/utils/enhancedError.js.map +1 -1
  227. package/dist/utils/error.d.ts.map +1 -1
  228. package/dist/utils/error.js +0 -1
  229. package/dist/utils/error.js.map +1 -1
  230. package/dist/utils/index.d.ts +12 -0
  231. package/dist/utils/index.d.ts.map +1 -0
  232. package/dist/utils/index.js +18 -0
  233. package/dist/utils/index.js.map +1 -0
  234. package/dist/utils/logger.js +3 -3
  235. package/dist/utils/logger.js.map +1 -1
  236. package/dist/utils/toolWrapper.d.ts +2 -2
  237. package/dist/utils/toolWrapper.js +8 -8
  238. package/dist/utils/toolWrapper.js.map +1 -1
  239. package/dist/utils/validation/core.d.ts.map +1 -1
  240. package/dist/utils/validation/core.js.map +1 -1
  241. package/dist/utils/validation/index.d.ts.map +1 -1
  242. package/dist/utils/validation/index.js.map +1 -1
  243. package/dist/utils/validation/network.js +3 -3
  244. package/dist/utils/validation/network.js.map +1 -1
  245. package/dist/utils/validation/rateLimit.js.map +1 -1
  246. package/dist/utils/validation/security.js.map +1 -1
  247. package/dist/utils/validation/wordpress.js.map +1 -1
  248. package/dist/utils/version.d.ts +144 -0
  249. package/dist/utils/version.d.ts.map +1 -0
  250. package/dist/utils/version.js +318 -0
  251. package/dist/utils/version.js.map +1 -0
  252. package/package.json +21 -55
  253. package/src/cache/CacheInvalidation.ts +183 -20
  254. package/src/cache/HttpCacheWrapper.ts +8 -5
  255. package/src/cache/SEOCacheManager.ts +330 -0
  256. package/src/cache/__tests__/CacheInvalidation.test.ts +6 -11
  257. package/src/cache/__tests__/CachedWordPressClient.test.ts +37 -62
  258. package/src/client/SEOWordPressClient.ts +876 -0
  259. package/src/client/api.ts +50 -21
  260. package/src/client/auth.ts +19 -19
  261. package/src/client/index.ts +16 -0
  262. package/src/client/managers/AuthManager.ts +175 -0
  263. package/src/client/managers/AuthenticationManager.ts +16 -14
  264. package/src/client/managers/BaseManager.ts +24 -5
  265. package/src/client/managers/ComposedAuthenticationManager.ts +409 -0
  266. package/src/client/managers/ComposedManagerFactory.ts +231 -0
  267. package/src/client/managers/ComposedRequestManager.ts +336 -0
  268. package/src/client/managers/JWTAuthImplementation.ts +326 -0
  269. package/src/client/managers/ManagersIndex.ts +6 -0
  270. package/src/client/managers/RequestManager.ts +9 -7
  271. package/src/client/managers/composed/MigrationAdapter.ts +263 -0
  272. package/src/client/managers/composed/index.ts +47 -0
  273. package/src/client/managers/implementations/ConfigurationProviderImpl.ts +52 -0
  274. package/src/client/managers/implementations/ErrorHandlerImpl.ts +102 -0
  275. package/src/client/managers/implementations/ParameterValidatorImpl.ts +221 -0
  276. package/src/client/managers/interfaces/ManagerInterfaces.ts +171 -0
  277. package/src/config/Config.ts +63 -0
  278. package/src/config/ConfigurationSchema.ts +17 -17
  279. package/src/config/ServerConfiguration.ts +18 -16
  280. package/src/config/index.ts +13 -0
  281. package/src/docs/DocumentationGenerator.ts +2 -2
  282. package/src/dxt-entry.ts +3 -3
  283. package/src/index.ts +43 -43
  284. package/src/performance/MetricsCollector.ts +15 -11
  285. package/src/security/AISecurityScanner.ts +7 -7
  286. package/src/security/AutomatedRemediation.ts +13 -11
  287. package/src/security/InputValidator.ts +10 -9
  288. package/src/security/SecurityCIPipeline.ts +494 -56
  289. package/src/security/SecurityConfigManager.ts +10 -10
  290. package/src/security/SecurityMonitoring.ts +5 -5
  291. package/src/security/SecurityReviewer.ts +13 -6
  292. package/src/security/index.ts +3 -3
  293. package/src/server/ConnectionTester.ts +5 -5
  294. package/src/server/ToolRegistry.ts +9 -8
  295. package/src/server/index.ts +10 -0
  296. package/src/tools/BaseToolManager.ts +55 -83
  297. package/src/tools/auth.ts +21 -12
  298. package/src/tools/comments.ts +23 -19
  299. package/src/tools/index.ts +1 -0
  300. package/src/tools/media.ts +23 -20
  301. package/src/tools/pages.ts +20 -13
  302. package/src/tools/performance.ts +101 -32
  303. package/src/tools/posts/PostHandlers.ts +23 -23
  304. package/src/tools/posts/PostToolDefinitions.ts +1 -1
  305. package/src/tools/posts/index.ts +2 -2
  306. package/src/tools/seo/BulkOperations.ts +557 -0
  307. package/src/tools/seo/SEOHandlers.ts +296 -0
  308. package/src/tools/seo/SEOToolDefinitions.ts +402 -0
  309. package/src/tools/seo/SEOTools.ts +871 -0
  310. package/src/tools/seo/analyzers/ContentAnalyzer.ts +493 -0
  311. package/src/tools/seo/auditors/SiteAuditor.ts +787 -0
  312. package/src/tools/seo/generators/MetaGenerator.ts +694 -0
  313. package/src/tools/seo/generators/SchemaGenerator.ts +955 -0
  314. package/src/tools/seo/index.ts +47 -0
  315. package/src/tools/seo/optimizers/InternalLinkingSuggester.ts +934 -0
  316. package/src/tools/site.ts +27 -26
  317. package/src/tools/taxonomies.ts +29 -25
  318. package/src/tools/users.ts +20 -13
  319. package/src/types/client.ts +8 -6
  320. package/src/types/seo.ts +546 -0
  321. package/src/utils/enhancedError.ts +1 -1
  322. package/src/utils/error.ts +1 -2
  323. package/src/utils/index.ts +23 -0
  324. package/src/utils/logger.ts +3 -3
  325. package/src/utils/toolWrapper.ts +10 -10
  326. package/src/utils/validation/core.ts +2 -2
  327. package/src/utils/validation/index.ts +2 -2
  328. package/src/utils/validation/network.ts +5 -5
  329. package/src/utils/validation/rateLimit.ts +1 -1
  330. package/src/utils/validation/security.ts +1 -1
  331. package/src/utils/validation/wordpress.ts +1 -1
  332. package/src/utils/version.ts +402 -0
@@ -0,0 +1,670 @@
1
+ /**
2
+ * Schema Generator
3
+ *
4
+ * This module generates JSON-LD structured data markup for WordPress content.
5
+ * It supports all major Schema.org types and provides intelligent content extraction
6
+ * and schema optimization for better search engine understanding.
7
+ *
8
+ * Supported Schema Types:
9
+ * - Article, BlogPosting, NewsArticle
10
+ * - Product, Offer, AggregateRating
11
+ * - FAQ, Question, Answer
12
+ * - HowTo, HowToStep, HowToDirection
13
+ * - Organization, LocalBusiness, Person
14
+ * - Website, WebPage, BreadcrumbList
15
+ * - Event, Recipe, Course, VideoObject
16
+ *
17
+ * @since 2.7.0
18
+ */
19
+ import { LoggerFactory } from "../../../utils/logger.js";
20
+ /**
21
+ * Schema Generator Class
22
+ */
23
+ export class SchemaGenerator {
24
+ logger = LoggerFactory.tool("schema_generator");
25
+ constructor() { }
26
+ /**
27
+ * Generate schema markup for a WordPress post
28
+ */
29
+ async generateSchema(post, params, options = {}) {
30
+ this.logger.debug("Generating schema markup", {
31
+ postId: post.id,
32
+ schemaType: params.schemaType,
33
+ title: post.title?.rendered?.substring(0, 50),
34
+ });
35
+ if (!params.schemaType) {
36
+ throw new Error("Schema type is required for schema generation");
37
+ }
38
+ const baseSchema = {
39
+ "@context": "https://schema.org",
40
+ "@type": params.schemaType,
41
+ };
42
+ // Generate schema based on type
43
+ switch (params.schemaType) {
44
+ case "Article":
45
+ return this.generateArticleSchema(post, baseSchema, options);
46
+ case "Product":
47
+ return this.generateProductSchema(post, baseSchema, options);
48
+ case "FAQ":
49
+ return this.generateFAQSchema(post, baseSchema, options);
50
+ case "HowTo":
51
+ return this.generateHowToSchema(post, baseSchema, options);
52
+ case "Organization":
53
+ return this.generateOrganizationSchema(post, baseSchema, options);
54
+ case "LocalBusiness":
55
+ return this.generateLocalBusinessSchema(post, baseSchema, options);
56
+ case "Website":
57
+ return this.generateWebsiteSchema(post, baseSchema, options);
58
+ case "BreadcrumbList":
59
+ return this.generateBreadcrumbSchema(post, baseSchema, options);
60
+ case "Event":
61
+ return this.generateEventSchema(post, baseSchema, options);
62
+ case "Recipe":
63
+ return this.generateRecipeSchema(post, baseSchema, options);
64
+ case "Course":
65
+ return this.generateCourseSchema(post, baseSchema, options);
66
+ case "VideoObject":
67
+ return this.generateVideoSchema(post, baseSchema, options);
68
+ case "Person":
69
+ return this.generatePersonSchema(post, baseSchema, options);
70
+ case "Review":
71
+ return this.generateReviewSchema(post, baseSchema, options);
72
+ default:
73
+ throw new Error(`Unsupported schema type: ${params.schemaType}`);
74
+ }
75
+ }
76
+ /**
77
+ * Generate Article schema markup
78
+ */
79
+ generateArticleSchema(post, baseSchema, options) {
80
+ const content = this.extractTextContent(post.content?.rendered || "");
81
+ const excerpt = this.extractTextContent(post.excerpt?.rendered || "");
82
+ const images = this.extractImages(post.content?.rendered || "");
83
+ const articleData = {
84
+ headline: post.title?.rendered || "Untitled",
85
+ description: excerpt || content.substring(0, 160) + "...",
86
+ datePublished: post.date || new Date().toISOString(),
87
+ dateModified: post.modified || post.date || new Date().toISOString(),
88
+ author: {
89
+ "@type": "Person",
90
+ name: this.getAuthorName(post),
91
+ ...(this.getAuthorUrl(post) ? { url: this.getAuthorUrl(post) } : {}),
92
+ },
93
+ publisher: this.getPublisherInfo(options),
94
+ mainEntityOfPage: post.link || `https://example.com/post/${post.id}`,
95
+ wordCount: this.countWords(content),
96
+ ...(images.length > 0 && { image: images }),
97
+ ...(options.customProperties?.keywords ? { keywords: options.customProperties.keywords } : {}),
98
+ };
99
+ return {
100
+ ...baseSchema,
101
+ ...articleData,
102
+ };
103
+ }
104
+ /**
105
+ * Generate Product schema markup
106
+ */
107
+ generateProductSchema(post, baseSchema, options) {
108
+ const content = this.extractTextContent(post.content?.rendered || "");
109
+ const excerpt = this.extractTextContent(post.excerpt?.rendered || "");
110
+ const images = this.extractImages(post.content?.rendered || "");
111
+ // Extract product information from content
112
+ const productInfo = this.extractProductInfo(content);
113
+ const productData = {
114
+ name: post.title?.rendered || "Untitled Product",
115
+ description: excerpt || content.substring(0, 160) + "...",
116
+ ...(images.length > 0 && { image: images }),
117
+ ...(productInfo.brand && {
118
+ brand: {
119
+ "@type": "Brand",
120
+ name: productInfo.brand,
121
+ },
122
+ }),
123
+ ...(productInfo.price && {
124
+ offers: {
125
+ "@type": "Offer",
126
+ price: productInfo.price,
127
+ priceCurrency: productInfo.currency || "USD",
128
+ availability: productInfo.availability || "https://schema.org/InStock",
129
+ url: post.link || `https://example.com/product/${post.id}`,
130
+ ...(productInfo.validFrom && { validFrom: productInfo.validFrom }),
131
+ ...(productInfo.validThrough && { validThrough: productInfo.validThrough }),
132
+ },
133
+ }),
134
+ ...(productInfo.rating && {
135
+ aggregateRating: {
136
+ "@type": "AggregateRating",
137
+ ratingValue: productInfo.rating.average,
138
+ reviewCount: productInfo.rating.count,
139
+ bestRating: productInfo.rating.best || 5,
140
+ worstRating: productInfo.rating.worst || 1,
141
+ },
142
+ }),
143
+ };
144
+ return {
145
+ ...baseSchema,
146
+ ...productData,
147
+ };
148
+ }
149
+ /**
150
+ * Generate FAQ schema markup
151
+ */
152
+ generateFAQSchema(post, baseSchema, options) {
153
+ const content = post.content?.rendered || "";
154
+ const faqItems = this.extractFAQItems(content);
155
+ if (faqItems.length === 0) {
156
+ this.logger.warn("No FAQ items found in content", { postId: post.id });
157
+ }
158
+ const faqData = {
159
+ mainEntity: faqItems.map((item) => ({
160
+ "@type": "Question",
161
+ name: item.question,
162
+ acceptedAnswer: {
163
+ "@type": "Answer",
164
+ text: item.answer,
165
+ },
166
+ })),
167
+ };
168
+ return {
169
+ ...baseSchema,
170
+ ...faqData,
171
+ };
172
+ }
173
+ /**
174
+ * Generate HowTo schema markup
175
+ */
176
+ generateHowToSchema(post, baseSchema, options) {
177
+ const content = post.content?.rendered || "";
178
+ const steps = this.extractHowToSteps(content);
179
+ const images = this.extractImages(content);
180
+ const totalTime = this.extractDuration(content);
181
+ return {
182
+ ...baseSchema,
183
+ name: post.title?.rendered || "Untitled Guide",
184
+ description: this.extractTextContent(post.excerpt?.rendered || "").substring(0, 160),
185
+ ...(images.length > 0 && { image: images }),
186
+ ...(totalTime && { totalTime }),
187
+ supply: this.extractSupplies(content),
188
+ tool: this.extractTools(content),
189
+ step: steps.map((step, index) => ({
190
+ "@type": "HowToStep",
191
+ position: index + 1,
192
+ name: step.name,
193
+ text: step.text,
194
+ ...(step.image && { image: step.image }),
195
+ })),
196
+ };
197
+ }
198
+ /**
199
+ * Generate Organization schema markup
200
+ */
201
+ generateOrganizationSchema(post, baseSchema, options) {
202
+ const siteConfig = options.siteConfig || {};
203
+ return {
204
+ ...baseSchema,
205
+ name: siteConfig.name || post.title?.rendered || "Organization",
206
+ description: siteConfig.description || this.extractTextContent(post.excerpt?.rendered || ""),
207
+ url: siteConfig.url || post.link || "https://example.com",
208
+ ...(siteConfig.logo && {
209
+ logo: {
210
+ "@type": "ImageObject",
211
+ url: siteConfig.logo,
212
+ },
213
+ }),
214
+ ...(siteConfig.socialProfiles && { sameAs: siteConfig.socialProfiles }),
215
+ ...(siteConfig.contactInfo && {
216
+ contactPoint: {
217
+ "@type": "ContactPoint",
218
+ ...(siteConfig.contactInfo.telephone && { telephone: siteConfig.contactInfo.telephone }),
219
+ ...(siteConfig.contactInfo.email && { email: siteConfig.contactInfo.email }),
220
+ },
221
+ }),
222
+ };
223
+ }
224
+ /**
225
+ * Generate LocalBusiness schema markup
226
+ */
227
+ generateLocalBusinessSchema(post, baseSchema, options) {
228
+ const organizationSchema = this.generateOrganizationSchema(post, baseSchema, options);
229
+ const businessInfo = this.extractBusinessInfo(post.content?.rendered || "");
230
+ return {
231
+ ...organizationSchema,
232
+ "@type": "LocalBusiness",
233
+ ...(businessInfo.address && {
234
+ address: {
235
+ "@type": "PostalAddress",
236
+ streetAddress: businessInfo.address.street,
237
+ addressLocality: businessInfo.address.city,
238
+ addressRegion: businessInfo.address.state,
239
+ postalCode: businessInfo.address.zip,
240
+ addressCountry: businessInfo.address.country,
241
+ },
242
+ }),
243
+ ...(businessInfo.phone && { telephone: businessInfo.phone }),
244
+ ...(businessInfo.hours && { openingHours: businessInfo.hours }),
245
+ ...(businessInfo.priceRange && { priceRange: businessInfo.priceRange }),
246
+ };
247
+ }
248
+ /**
249
+ * Generate Website schema markup
250
+ */
251
+ generateWebsiteSchema(post, baseSchema, options) {
252
+ const siteConfig = options.siteConfig || {};
253
+ return {
254
+ ...baseSchema,
255
+ name: siteConfig.name || "Website",
256
+ description: siteConfig.description || this.extractTextContent(post.excerpt?.rendered || ""),
257
+ url: siteConfig.url || "https://example.com",
258
+ ...(options.includeAuthor && {
259
+ author: {
260
+ "@type": "Organization",
261
+ name: siteConfig.name || "Website Owner",
262
+ },
263
+ }),
264
+ potentialAction: {
265
+ "@type": "SearchAction",
266
+ target: {
267
+ "@type": "EntryPoint",
268
+ urlTemplate: `${siteConfig.url || "https://example.com"}?s={search_term_string}`,
269
+ },
270
+ "query-input": "required name=search_term_string",
271
+ },
272
+ };
273
+ }
274
+ /**
275
+ * Generate BreadcrumbList schema markup
276
+ */
277
+ generateBreadcrumbSchema(post, baseSchema, options) {
278
+ // Extract breadcrumb path from post URL or categories
279
+ const breadcrumbs = this.extractBreadcrumbs(post);
280
+ return {
281
+ ...baseSchema,
282
+ itemListElement: breadcrumbs.map((breadcrumb, index) => ({
283
+ "@type": "ListItem",
284
+ position: index + 1,
285
+ name: breadcrumb.name,
286
+ item: breadcrumb.url,
287
+ })),
288
+ };
289
+ }
290
+ /**
291
+ * Generate Event schema markup
292
+ */
293
+ generateEventSchema(post, baseSchema, options) {
294
+ const eventInfo = this.extractEventInfo(post.content?.rendered || "");
295
+ return {
296
+ ...baseSchema,
297
+ name: post.title?.rendered || "Event",
298
+ description: this.extractTextContent(post.excerpt?.rendered || ""),
299
+ startDate: eventInfo.startDate || new Date().toISOString(),
300
+ ...(eventInfo.endDate && { endDate: eventInfo.endDate }),
301
+ ...(eventInfo.location && {
302
+ location: {
303
+ "@type": "Place",
304
+ name: eventInfo.location.name,
305
+ ...(eventInfo.location.address && {
306
+ address: {
307
+ "@type": "PostalAddress",
308
+ streetAddress: eventInfo.location.address,
309
+ },
310
+ }),
311
+ },
312
+ }),
313
+ ...(eventInfo.organizer && {
314
+ organizer: {
315
+ "@type": "Organization",
316
+ name: eventInfo.organizer,
317
+ },
318
+ }),
319
+ };
320
+ }
321
+ /**
322
+ * Generate Recipe schema markup
323
+ */
324
+ generateRecipeSchema(post, baseSchema, options) {
325
+ const recipeInfo = this.extractRecipeInfo(post.content?.rendered || "");
326
+ const images = this.extractImages(post.content?.rendered || "");
327
+ return {
328
+ ...baseSchema,
329
+ name: post.title?.rendered || "Recipe",
330
+ description: this.extractTextContent(post.excerpt?.rendered || ""),
331
+ ...(images.length > 0 && { image: images }),
332
+ author: {
333
+ "@type": "Person",
334
+ name: this.getAuthorName(post),
335
+ },
336
+ ...(recipeInfo.prepTime && { prepTime: recipeInfo.prepTime }),
337
+ ...(recipeInfo.cookTime && { cookTime: recipeInfo.cookTime }),
338
+ ...(recipeInfo.totalTime && { totalTime: recipeInfo.totalTime }),
339
+ ...(recipeInfo.servings && { recipeYield: recipeInfo.servings }),
340
+ ...(recipeInfo.ingredients.length > 0 && { recipeIngredient: recipeInfo.ingredients }),
341
+ ...(recipeInfo.instructions.length > 0 && {
342
+ recipeInstructions: recipeInfo.instructions.map((instruction, index) => ({
343
+ "@type": "HowToStep",
344
+ position: index + 1,
345
+ text: instruction,
346
+ })),
347
+ }),
348
+ ...(recipeInfo.nutrition && {
349
+ nutrition: {
350
+ "@type": "NutritionInformation",
351
+ calories: recipeInfo.nutrition.calories,
352
+ },
353
+ }),
354
+ };
355
+ }
356
+ /**
357
+ * Generate Course schema markup
358
+ */
359
+ generateCourseSchema(post, baseSchema, options) {
360
+ const courseInfo = this.extractCourseInfo(post.content?.rendered || "");
361
+ return {
362
+ ...baseSchema,
363
+ name: post.title?.rendered || "Course",
364
+ description: this.extractTextContent(post.excerpt?.rendered || ""),
365
+ provider: {
366
+ "@type": "Organization",
367
+ name: options.siteConfig?.name || "Course Provider",
368
+ },
369
+ ...(courseInfo.instructor && {
370
+ instructor: {
371
+ "@type": "Person",
372
+ name: courseInfo.instructor,
373
+ },
374
+ }),
375
+ ...(courseInfo.duration && { timeRequired: courseInfo.duration }),
376
+ ...(courseInfo.level && { courseLevel: courseInfo.level }),
377
+ ...(courseInfo.prerequisites.length > 0 && { coursePrerequisites: courseInfo.prerequisites }),
378
+ };
379
+ }
380
+ /**
381
+ * Generate VideoObject schema markup
382
+ */
383
+ generateVideoSchema(post, baseSchema, options) {
384
+ const videoInfo = this.extractVideoInfo(post.content?.rendered || "");
385
+ return {
386
+ ...baseSchema,
387
+ name: post.title?.rendered || "Video",
388
+ description: this.extractTextContent(post.excerpt?.rendered || ""),
389
+ ...(videoInfo.url && { contentUrl: videoInfo.url }),
390
+ ...(videoInfo.thumbnail && { thumbnailUrl: videoInfo.thumbnail }),
391
+ ...(videoInfo.duration && { duration: videoInfo.duration }),
392
+ uploadDate: post.date || new Date().toISOString(),
393
+ author: {
394
+ "@type": "Person",
395
+ name: this.getAuthorName(post),
396
+ },
397
+ };
398
+ }
399
+ /**
400
+ * Generate Person schema markup
401
+ */
402
+ generatePersonSchema(post, baseSchema, options) {
403
+ const personInfo = this.extractPersonInfo(post.content?.rendered || "");
404
+ return {
405
+ ...baseSchema,
406
+ name: post.title?.rendered || "Person",
407
+ description: this.extractTextContent(post.excerpt?.rendered || ""),
408
+ ...(personInfo.jobTitle && { jobTitle: personInfo.jobTitle }),
409
+ ...(personInfo.affiliation && {
410
+ affiliation: {
411
+ "@type": "Organization",
412
+ name: personInfo.affiliation,
413
+ },
414
+ }),
415
+ ...(personInfo.email && { email: personInfo.email }),
416
+ ...(personInfo.socialProfiles && { sameAs: personInfo.socialProfiles }),
417
+ };
418
+ }
419
+ /**
420
+ * Generate Review schema markup
421
+ */
422
+ generateReviewSchema(post, baseSchema, options) {
423
+ const reviewInfo = this.extractReviewInfo(post.content?.rendered || "");
424
+ return {
425
+ ...baseSchema,
426
+ itemReviewed: {
427
+ "@type": reviewInfo.itemType || "Thing",
428
+ name: reviewInfo.itemName || "Reviewed Item",
429
+ },
430
+ reviewRating: {
431
+ "@type": "Rating",
432
+ ratingValue: reviewInfo.rating || 5,
433
+ bestRating: reviewInfo.bestRating || 5,
434
+ worstRating: reviewInfo.worstRating || 1,
435
+ },
436
+ author: {
437
+ "@type": "Person",
438
+ name: this.getAuthorName(post),
439
+ },
440
+ reviewBody: this.extractTextContent(post.content?.rendered || ""),
441
+ datePublished: post.date || new Date().toISOString(),
442
+ };
443
+ }
444
+ // Helper methods for content extraction
445
+ /**
446
+ * Extract plain text from HTML content
447
+ */
448
+ extractTextContent(html) {
449
+ return html
450
+ .replace(/<[^>]*>/g, " ")
451
+ .replace(/\s+/g, " ")
452
+ .trim();
453
+ }
454
+ /**
455
+ * Extract images from HTML content
456
+ */
457
+ extractImages(html) {
458
+ const images = [];
459
+ const imgRegex = /<img[^>]+src="([^"]+)"/gi;
460
+ let match;
461
+ while ((match = imgRegex.exec(html)) !== null) {
462
+ images.push(match[1]);
463
+ }
464
+ return images;
465
+ }
466
+ /**
467
+ * Count words in text
468
+ */
469
+ countWords(text) {
470
+ return text.split(/\s+/).filter((word) => word.length > 0).length;
471
+ }
472
+ /**
473
+ * Get author name from post
474
+ */
475
+ getAuthorName(post) {
476
+ // This would typically come from WordPress API author data
477
+ return "Author"; // Placeholder
478
+ }
479
+ /**
480
+ * Get author URL from post
481
+ */
482
+ getAuthorUrl(post) {
483
+ // This would typically come from WordPress API author data
484
+ return undefined; // Placeholder
485
+ }
486
+ /**
487
+ * Get publisher information
488
+ */
489
+ getPublisherInfo(options) {
490
+ const siteConfig = options.siteConfig || {};
491
+ return {
492
+ "@type": "Organization",
493
+ name: siteConfig.name || "Publisher",
494
+ ...(siteConfig.logo && {
495
+ logo: {
496
+ "@type": "ImageObject",
497
+ url: siteConfig.logo,
498
+ },
499
+ }),
500
+ };
501
+ }
502
+ /**
503
+ * Extract product information from content
504
+ */
505
+ extractProductInfo(content) {
506
+ // Implement product information extraction logic
507
+ return {}; // Placeholder
508
+ }
509
+ /**
510
+ * Extract FAQ items from content
511
+ */
512
+ extractFAQItems(html) {
513
+ const faqItems = [];
514
+ // Look for FAQ patterns in HTML
515
+ const faqRegex = /<h[23][^>]*>(.*?)<\/h[23]>\s*<p[^>]*>(.*?)<\/p>/gi;
516
+ let match;
517
+ while ((match = faqRegex.exec(html)) !== null) {
518
+ const question = this.extractTextContent(match[1]);
519
+ const answer = this.extractTextContent(match[2]);
520
+ if (question && answer) {
521
+ faqItems.push({ question, answer });
522
+ }
523
+ }
524
+ return faqItems;
525
+ }
526
+ /**
527
+ * Extract HowTo steps from content
528
+ */
529
+ extractHowToSteps(html) {
530
+ const steps = [];
531
+ // Look for step patterns in HTML
532
+ const stepRegex = /<h[23][^>]*>(.*?)<\/h[23]>\s*<p[^>]*>(.*?)<\/p>/gi;
533
+ let match;
534
+ while ((match = stepRegex.exec(html)) !== null) {
535
+ const name = this.extractTextContent(match[1]);
536
+ const text = this.extractTextContent(match[2]);
537
+ if (name && text) {
538
+ steps.push({ name, text });
539
+ }
540
+ }
541
+ return steps;
542
+ }
543
+ /**
544
+ * Extract duration from content
545
+ */
546
+ extractDuration(content) {
547
+ const durationMatch = content.match(/(\d+)\s*(minutes?|hours?|mins?)/i);
548
+ if (durationMatch) {
549
+ const value = parseInt(durationMatch[1]);
550
+ const unit = durationMatch[2].toLowerCase();
551
+ if (unit.startsWith("min")) {
552
+ return `PT${value}M`;
553
+ }
554
+ else if (unit.startsWith("hour")) {
555
+ return `PT${value}H`;
556
+ }
557
+ }
558
+ return undefined;
559
+ }
560
+ /**
561
+ * Extract supplies from content
562
+ */
563
+ extractSupplies(content) {
564
+ // Implement supplies extraction logic
565
+ return []; // Placeholder
566
+ }
567
+ /**
568
+ * Extract tools from content
569
+ */
570
+ extractTools(content) {
571
+ // Implement tools extraction logic
572
+ return []; // Placeholder
573
+ }
574
+ /**
575
+ * Extract business information from content
576
+ */
577
+ extractBusinessInfo(content) {
578
+ // Implement business info extraction logic
579
+ return {}; // Placeholder
580
+ }
581
+ /**
582
+ * Extract breadcrumbs from post
583
+ */
584
+ extractBreadcrumbs(post) {
585
+ // Implement breadcrumb extraction logic
586
+ return [
587
+ { name: "Home", url: "https://example.com" },
588
+ { name: post.title?.rendered || "Post", url: post.link || "#" },
589
+ ]; // Placeholder
590
+ }
591
+ /**
592
+ * Extract event information from content
593
+ */
594
+ extractEventInfo(content) {
595
+ // Implement event info extraction logic
596
+ return {}; // Placeholder
597
+ }
598
+ /**
599
+ * Extract recipe information from content
600
+ */
601
+ extractRecipeInfo(content) {
602
+ // Implement recipe info extraction logic
603
+ return {
604
+ ingredients: [],
605
+ instructions: [],
606
+ }; // Placeholder
607
+ }
608
+ /**
609
+ * Extract course information from content
610
+ */
611
+ extractCourseInfo(content) {
612
+ // Implement course info extraction logic
613
+ return {
614
+ prerequisites: [],
615
+ }; // Placeholder
616
+ }
617
+ /**
618
+ * Extract video information from content
619
+ */
620
+ extractVideoInfo(content) {
621
+ // Implement video info extraction logic
622
+ return {}; // Placeholder
623
+ }
624
+ /**
625
+ * Extract person information from content
626
+ */
627
+ extractPersonInfo(content) {
628
+ // Implement person info extraction logic
629
+ return {}; // Placeholder
630
+ }
631
+ /**
632
+ * Extract review information from content
633
+ */
634
+ extractReviewInfo(content) {
635
+ // Look for rating patterns in content
636
+ const ratingMatch = content.match(/(\d+(?:\.\d+)?)\s*(?:out of|\/)\s*(\d+)/i);
637
+ if (ratingMatch) {
638
+ return {
639
+ rating: parseFloat(ratingMatch[1]),
640
+ bestRating: parseInt(ratingMatch[2]),
641
+ };
642
+ }
643
+ return {}; // Placeholder
644
+ }
645
+ /**
646
+ * Validate generated schema markup
647
+ */
648
+ validateSchema(schema) {
649
+ const errors = [];
650
+ // Basic validation
651
+ if (!schema["@context"]) {
652
+ errors.push("Missing @context");
653
+ }
654
+ if (!schema["@type"]) {
655
+ errors.push("Missing @type");
656
+ }
657
+ // Type-specific validation
658
+ if (schema["@type"] === "Article" && !schema.headline) {
659
+ errors.push("Article schema missing required headline property");
660
+ }
661
+ if (schema["@type"] === "Product" && !schema.name) {
662
+ errors.push("Product schema missing required name property");
663
+ }
664
+ return {
665
+ valid: errors.length === 0,
666
+ errors,
667
+ };
668
+ }
669
+ }
670
+ //# sourceMappingURL=SchemaGenerator.js.map