@pixelated-tech/components 3.5.14 → 3.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 (358) hide show
  1. package/README.md +27 -0
  2. package/dist/components/admin/site-health/google.api.integration.js +258 -0
  3. package/dist/components/admin/site-health/google.api.utils.js +47 -0
  4. package/dist/components/admin/site-health/site-health-accessibility.js +4 -10
  5. package/dist/components/admin/site-health/site-health-axe-core.js +4 -10
  6. package/dist/components/admin/site-health/site-health-cloudwatch.js +24 -26
  7. package/dist/components/admin/site-health/site-health-dependency-vulnerabilities.js +4 -10
  8. package/dist/components/admin/site-health/site-health-github.js +8 -14
  9. package/dist/components/admin/site-health/site-health-google-analytics.integration.js +1 -107
  10. package/dist/components/admin/site-health/site-health-google-analytics.js +21 -29
  11. package/dist/components/admin/site-health/site-health-google-search-console.integration.js +1 -113
  12. package/dist/components/admin/site-health/site-health-google-search-console.js +22 -28
  13. package/dist/components/admin/site-health/site-health-mock-context.js +15 -0
  14. package/dist/components/admin/site-health/site-health-on-site-seo.js +10 -33
  15. package/dist/components/admin/site-health/site-health-overview.js +4 -10
  16. package/dist/components/admin/site-health/site-health-performance.js +4 -10
  17. package/dist/components/admin/site-health/site-health-security.js +6 -10
  18. package/dist/components/admin/site-health/site-health-seo.js +4 -10
  19. package/dist/components/admin/site-health/site-health-template.js +102 -44
  20. package/dist/components/admin/site-health/site-health-uptime.js +4 -9
  21. package/dist/components/admin/site-health/site-health.css +7 -0
  22. package/dist/components/{seo → general}/404.js +1 -1
  23. package/dist/components/{callout → general}/callout.js +1 -1
  24. package/dist/components/{carousel → general}/carousel.js +1 -1
  25. package/dist/components/{cms → general}/contentful.items.components.js +2 -2
  26. package/dist/components/{cms → general}/gravatar.components.js +1 -1
  27. package/dist/components/{cms → general}/instagram.components.js +2 -2
  28. package/dist/components/{structured → general}/markdown.js +1 -1
  29. package/dist/components/{structured → general}/recipe.js +1 -1
  30. package/dist/components/{structured → general}/resume.js +1 -1
  31. package/dist/components/general/semantic.js +1 -1
  32. package/dist/components/{seo → general}/sitemap.js +2 -2
  33. package/dist/components/{cms → general}/smartimage.js +1 -1
  34. package/dist/components/{structured → general}/socialcard.js +1 -1
  35. package/dist/components/general/table.js +1 -1
  36. package/dist/components/{carousel → general}/tiles.js +1 -1
  37. package/dist/components/{structured → general}/timeline.js +1 -1
  38. package/dist/components/{cms → general}/wordpress.components.js +2 -2
  39. package/dist/components/shoppingcart/ebay.components.js +3 -3
  40. package/dist/components/shoppingcart/ebay.functions.js +1 -1
  41. package/dist/components/shoppingcart/shoppingcart.components.js +2 -2
  42. package/dist/components/shoppingcart/shoppingcart.functions.js +1 -1
  43. package/dist/components/sitebuilder/page/lib/componentMap.js +1 -1
  44. package/dist/components/sitebuilder/page/lib/componentMetadata.js +1 -1
  45. package/dist/components/sitebuilder/page/lib/pageStorageContentful.js +2 -2
  46. package/dist/index.adminclient.js +3 -6
  47. package/dist/index.adminserver.js +7 -6
  48. package/dist/index.js +67 -73
  49. package/dist/index.server.js +19 -21
  50. package/dist/mocks/browser.js +1 -0
  51. package/dist/mocks/handlers.js +206 -0
  52. package/dist/mocks/index.js +1 -0
  53. package/dist/types/components/admin/site-health/google.api.integration.d.ts +82 -0
  54. package/dist/types/components/admin/site-health/google.api.integration.d.ts.map +1 -0
  55. package/dist/types/components/admin/site-health/google.api.utils.d.ts +32 -0
  56. package/dist/types/components/admin/site-health/google.api.utils.d.ts.map +1 -0
  57. package/dist/types/components/admin/site-health/site-health-accessibility.d.ts.map +1 -1
  58. package/dist/types/components/admin/site-health/site-health-axe-core.d.ts.map +1 -1
  59. package/dist/types/components/admin/site-health/site-health-cloudwatch.d.ts.map +1 -1
  60. package/dist/types/components/admin/site-health/site-health-dependency-vulnerabilities.d.ts.map +1 -1
  61. package/dist/types/components/admin/site-health/site-health-github.d.ts.map +1 -1
  62. package/dist/types/components/admin/site-health/site-health-google-analytics.d.ts.map +1 -1
  63. package/dist/types/components/admin/site-health/site-health-google-analytics.integration.d.ts +1 -21
  64. package/dist/types/components/admin/site-health/site-health-google-analytics.integration.d.ts.map +1 -1
  65. package/dist/types/components/admin/site-health/site-health-google-search-console.d.ts.map +1 -1
  66. package/dist/types/components/admin/site-health/site-health-google-search-console.integration.d.ts +1 -41
  67. package/dist/types/components/admin/site-health/site-health-google-search-console.integration.d.ts.map +1 -1
  68. package/dist/types/components/admin/site-health/site-health-mock-context.d.ts +18 -0
  69. package/dist/types/components/admin/site-health/site-health-mock-context.d.ts.map +1 -0
  70. package/dist/types/components/admin/site-health/site-health-on-site-seo.d.ts.map +1 -1
  71. package/dist/types/components/admin/site-health/site-health-overview.d.ts.map +1 -1
  72. package/dist/types/components/admin/site-health/site-health-performance.d.ts.map +1 -1
  73. package/dist/types/components/admin/site-health/site-health-security.d.ts.map +1 -1
  74. package/dist/types/components/admin/site-health/site-health-seo.d.ts.map +1 -1
  75. package/dist/types/components/admin/site-health/site-health-template.d.ts +9 -1
  76. package/dist/types/components/admin/site-health/site-health-template.d.ts.map +1 -1
  77. package/dist/types/components/admin/site-health/site-health-uptime.d.ts.map +1 -1
  78. package/dist/types/components/general/404.d.ts.map +1 -0
  79. package/dist/types/components/general/buzzwordbingo.d.ts.map +1 -0
  80. package/dist/types/components/general/buzzwordbingo.words.d.ts.map +1 -0
  81. package/dist/types/components/general/calendly.d.ts.map +1 -0
  82. package/dist/types/components/{callout → general}/callout.d.ts.map +1 -1
  83. package/dist/types/components/general/carousel.d.ts.map +1 -0
  84. package/dist/types/components/general/carousel.drag.d.ts.map +1 -0
  85. package/dist/types/components/general/cloudinary.d.ts.map +1 -0
  86. package/dist/types/components/general/contentful.delivery.d.ts.map +1 -0
  87. package/dist/types/components/general/contentful.items.components.d.ts.map +1 -0
  88. package/dist/types/components/general/contentful.management.d.ts.map +1 -0
  89. package/dist/types/components/general/faq-accordion.d.ts.map +1 -0
  90. package/dist/types/components/{cms → general}/flickr.d.ts +1 -1
  91. package/dist/types/components/general/flickr.d.ts.map +1 -0
  92. package/dist/types/components/general/google.reviews.components.d.ts.map +1 -0
  93. package/dist/types/components/general/google.reviews.functions.d.ts.map +1 -0
  94. package/dist/types/components/general/googleanalytics.d.ts.map +1 -0
  95. package/dist/types/components/general/googlemap.d.ts.map +1 -0
  96. package/dist/types/components/general/googlesearch.d.ts.map +1 -0
  97. package/dist/types/components/general/gravatar.components.d.ts.map +1 -0
  98. package/dist/types/components/general/gravatar.functions.d.ts.map +1 -0
  99. package/dist/types/components/general/hubspot.components.d.ts.map +1 -0
  100. package/dist/types/components/general/instagram.components.d.ts.map +1 -0
  101. package/dist/types/components/{cms → general}/instagram.functions.d.ts +1 -1
  102. package/dist/types/components/general/instagram.functions.d.ts.map +1 -0
  103. package/dist/types/components/general/manifest.d.ts.map +1 -0
  104. package/dist/types/components/general/markdown.d.ts.map +1 -0
  105. package/dist/types/components/general/menu-accordion.d.ts.map +1 -0
  106. package/dist/types/components/general/menu-expando.d.ts.map +1 -0
  107. package/dist/types/components/general/menu-simple.d.ts.map +1 -0
  108. package/dist/types/components/general/metadata.components.d.ts.map +1 -0
  109. package/dist/types/components/general/metadata.functions.d.ts.map +1 -0
  110. package/dist/types/components/general/nerdjoke.d.ts.map +1 -0
  111. package/dist/types/components/general/recipe.d.ts.map +1 -0
  112. package/dist/types/components/general/resume.d.ts.map +1 -0
  113. package/dist/types/components/general/schema-blogposting.d.ts.map +1 -0
  114. package/dist/types/components/{seo → general}/schema-blogposting.functions.d.ts +1 -1
  115. package/dist/types/components/general/schema-blogposting.functions.d.ts.map +1 -0
  116. package/dist/types/components/general/schema-faq.d.ts.map +1 -0
  117. package/dist/types/components/general/schema-localbusiness.d.ts.map +1 -0
  118. package/dist/types/components/general/schema-recipe.d.ts.map +1 -0
  119. package/dist/types/components/general/schema-services.d.ts.map +1 -0
  120. package/dist/types/components/general/schema-website.d.ts.map +1 -0
  121. package/dist/types/components/general/sitemap.d.ts.map +1 -0
  122. package/dist/types/components/general/smartimage.d.ts.map +1 -0
  123. package/dist/types/components/general/socialcard.d.ts.map +1 -0
  124. package/dist/types/components/general/tiles.d.ts.map +1 -0
  125. package/dist/types/components/general/timeline.d.ts.map +1 -0
  126. package/dist/types/components/general/wordpress.components.d.ts.map +1 -0
  127. package/dist/types/components/general/wordpress.functions.d.ts.map +1 -0
  128. package/dist/types/components/general/yelp.d.ts.map +1 -0
  129. package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts +1 -1
  130. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts +1 -1
  131. package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -1
  132. package/dist/types/index.adminclient.d.ts +3 -6
  133. package/dist/types/index.adminserver.d.ts +7 -6
  134. package/dist/types/index.d.ts +66 -72
  135. package/dist/types/index.server.d.ts +19 -19
  136. package/dist/types/mocks/browser.d.ts +1 -0
  137. package/dist/types/mocks/browser.d.ts.map +1 -0
  138. package/dist/types/mocks/handlers.d.ts +2 -0
  139. package/dist/types/mocks/handlers.d.ts.map +1 -0
  140. package/dist/types/mocks/index.d.ts +1 -0
  141. package/dist/types/mocks/index.d.ts.map +1 -0
  142. package/dist/types/stories/admin/site-health.mocks.d.ts +82 -0
  143. package/dist/types/stories/admin/site-health.mocks.d.ts.map +1 -0
  144. package/dist/types/stories/admin/site-health.stories.d.ts.map +1 -1
  145. package/dist/types/stories/callout/callout.stories.d.ts +1 -1
  146. package/dist/types/stories/carousel/carousel-hero.stories.d.ts +1 -1
  147. package/dist/types/stories/carousel/carousel-hero.stories.d.ts.map +1 -1
  148. package/dist/types/stories/carousel/carousel-reviews.stories.d.ts +1 -1
  149. package/dist/types/stories/carousel/carousel-reviews.stories.d.ts.map +1 -1
  150. package/dist/types/stories/carousel/carousel-workportfolio.stories.d.ts +1 -1
  151. package/dist/types/stories/carousel/carousel-workportfolio.stories.d.ts.map +1 -1
  152. package/dist/types/stories/carousel/carousel.stories.d.ts +1 -1
  153. package/dist/types/stories/carousel/carousel.stories.d.ts.map +1 -1
  154. package/dist/types/stories/carousel/tiles.stories.d.ts +1 -1
  155. package/dist/types/stories/carousel/tiles.stories.d.ts.map +1 -1
  156. package/dist/types/stories/cms/contentful.item.stories.d.ts +1 -1
  157. package/dist/types/stories/cms/contentful.item.stories.d.ts.map +1 -1
  158. package/dist/types/stories/cms/contentful.items.stories.d.ts +1 -1
  159. package/dist/types/stories/cms/contentful.items.stories.d.ts.map +1 -1
  160. package/dist/types/stories/cms/contentful.stories.d.ts +1 -1
  161. package/dist/types/stories/cms/contentful.stories.d.ts.map +1 -1
  162. package/dist/types/stories/cms/google.reviews.stories.d.ts +1 -1
  163. package/dist/types/stories/cms/google.reviews.stories.d.ts.map +1 -1
  164. package/dist/types/stories/cms/gravatar.stories.d.ts +1 -1
  165. package/dist/types/stories/cms/gravatar.stories.d.ts.map +1 -1
  166. package/dist/types/stories/cms/instagram.stories.d.ts +1 -1
  167. package/dist/types/stories/cms/instagram.stories.d.ts.map +1 -1
  168. package/dist/types/stories/cms/wordpress.stories.d.ts +1 -1
  169. package/dist/types/stories/cms/wordpress.stories.d.ts.map +1 -1
  170. package/dist/types/stories/general/smartimage.stories.d.ts +1 -1
  171. package/dist/types/stories/general/smartimage.stories.d.ts.map +1 -1
  172. package/dist/types/stories/menu/menu-accordion.stories.d.ts +1 -1
  173. package/dist/types/stories/menu/menu-accordion.stories.d.ts.map +1 -1
  174. package/dist/types/stories/menu/menu-expando.stories.d.ts +1 -1
  175. package/dist/types/stories/menu/menu-expando.stories.d.ts.map +1 -1
  176. package/dist/types/stories/menu/menu-simple.stories.d.ts +1 -1
  177. package/dist/types/stories/menu/menu-simple.stories.d.ts.map +1 -1
  178. package/dist/types/stories/nerdjoke.stories.d.ts +1 -1
  179. package/dist/types/stories/nerdjoke.stories.d.ts.map +1 -1
  180. package/dist/types/stories/seo/seo.404.stories.d.ts +1 -1
  181. package/dist/types/stories/seo/seo.404.stories.d.ts.map +1 -1
  182. package/dist/types/stories/seo/seo.faq-accordion.stories.d.ts +1 -1
  183. package/dist/types/stories/seo/seo.faq-accordion.stories.d.ts.map +1 -1
  184. package/dist/types/stories/seo/seo.googleanalytics.stories.d.ts +1 -1
  185. package/dist/types/stories/seo/seo.googleanalytics.stories.d.ts.map +1 -1
  186. package/dist/types/stories/seo/seo.googlesearch.stories.d.ts +1 -1
  187. package/dist/types/stories/seo/seo.googlesearch.stories.d.ts.map +1 -1
  188. package/dist/types/stories/seo/seo.metadata.stories.d.ts +1 -1
  189. package/dist/types/stories/seo/seo.metadata.stories.d.ts.map +1 -1
  190. package/dist/types/stories/seo/seo.schema.stories.d.ts +1 -1
  191. package/dist/types/stories/seo/seo.schema.stories.d.ts.map +1 -1
  192. package/dist/types/stories/seo/seo.sitemap.stories.d.ts +1 -1
  193. package/dist/types/stories/seo/seo.sitemap.stories.d.ts.map +1 -1
  194. package/dist/types/stories/structured/buzzword-bingo.stories.d.ts +2 -2
  195. package/dist/types/stories/structured/buzzword-bingo.stories.d.ts.map +1 -1
  196. package/dist/types/stories/structured/markdown.stories.d.ts +1 -1
  197. package/dist/types/stories/structured/markdown.stories.d.ts.map +1 -1
  198. package/dist/types/stories/structured/recipe.stories.d.ts +1 -1
  199. package/dist/types/stories/structured/recipe.stories.d.ts.map +1 -1
  200. package/dist/types/stories/structured/resume.stories.d.ts +1 -1
  201. package/dist/types/stories/structured/resume.stories.d.ts.map +1 -1
  202. package/dist/types/stories/structured/socialcard.stories.d.ts +1 -1
  203. package/dist/types/stories/structured/socialcard.stories.d.ts.map +1 -1
  204. package/dist/types/stories/structured/timeline.stories.d.ts +1 -1
  205. package/dist/types/stories/structured/timeline.stories.d.ts.map +1 -1
  206. package/dist/types/tests/google.api.integration.test.d.ts +2 -0
  207. package/dist/types/tests/google.api.integration.test.d.ts.map +1 -0
  208. package/dist/types/tests/google.api.utils.test.d.ts +5 -0
  209. package/dist/types/tests/google.api.utils.test.d.ts.map +1 -0
  210. package/package.json +10 -5
  211. package/dist/components/admin/site-health/google-api-auth.js +0 -69
  212. package/dist/types/components/admin/site-health/google-api-auth.d.ts +0 -37
  213. package/dist/types/components/admin/site-health/google-api-auth.d.ts.map +0 -1
  214. package/dist/types/components/carousel/carousel.d.ts.map +0 -1
  215. package/dist/types/components/carousel/carousel.drag.d.ts.map +0 -1
  216. package/dist/types/components/carousel/tiles.d.ts.map +0 -1
  217. package/dist/types/components/cms/calendly.d.ts.map +0 -1
  218. package/dist/types/components/cms/cloudinary.d.ts.map +0 -1
  219. package/dist/types/components/cms/contentful.delivery.d.ts.map +0 -1
  220. package/dist/types/components/cms/contentful.items.components.d.ts.map +0 -1
  221. package/dist/types/components/cms/contentful.management.d.ts.map +0 -1
  222. package/dist/types/components/cms/flickr.d.ts.map +0 -1
  223. package/dist/types/components/cms/google.reviews.components.d.ts.map +0 -1
  224. package/dist/types/components/cms/google.reviews.functions.d.ts.map +0 -1
  225. package/dist/types/components/cms/gravatar.components.d.ts.map +0 -1
  226. package/dist/types/components/cms/gravatar.functions.d.ts.map +0 -1
  227. package/dist/types/components/cms/hubspot.components.d.ts.map +0 -1
  228. package/dist/types/components/cms/instagram.components.d.ts.map +0 -1
  229. package/dist/types/components/cms/instagram.functions.d.ts.map +0 -1
  230. package/dist/types/components/cms/smartimage.d.ts.map +0 -1
  231. package/dist/types/components/cms/wordpress.components.d.ts.map +0 -1
  232. package/dist/types/components/cms/wordpress.functions.d.ts.map +0 -1
  233. package/dist/types/components/cms/yelp.d.ts.map +0 -1
  234. package/dist/types/components/menu/menu-accordion.d.ts.map +0 -1
  235. package/dist/types/components/menu/menu-expando.d.ts.map +0 -1
  236. package/dist/types/components/menu/menu-simple.d.ts.map +0 -1
  237. package/dist/types/components/nerdjoke/nerdjoke.d.ts.map +0 -1
  238. package/dist/types/components/seo/404.d.ts.map +0 -1
  239. package/dist/types/components/seo/faq-accordion.d.ts.map +0 -1
  240. package/dist/types/components/seo/googleanalytics.d.ts.map +0 -1
  241. package/dist/types/components/seo/googlemap.d.ts.map +0 -1
  242. package/dist/types/components/seo/googlesearch.d.ts.map +0 -1
  243. package/dist/types/components/seo/manifest.d.ts.map +0 -1
  244. package/dist/types/components/seo/metadata.components.d.ts.map +0 -1
  245. package/dist/types/components/seo/metadata.functions.d.ts.map +0 -1
  246. package/dist/types/components/seo/schema-blogposting.d.ts.map +0 -1
  247. package/dist/types/components/seo/schema-blogposting.functions.d.ts.map +0 -1
  248. package/dist/types/components/seo/schema-faq.d.ts.map +0 -1
  249. package/dist/types/components/seo/schema-localbusiness.d.ts.map +0 -1
  250. package/dist/types/components/seo/schema-recipe.d.ts.map +0 -1
  251. package/dist/types/components/seo/schema-services.d.ts.map +0 -1
  252. package/dist/types/components/seo/schema-website.d.ts.map +0 -1
  253. package/dist/types/components/seo/sitemap.d.ts.map +0 -1
  254. package/dist/types/components/structured/buzzwordbingo.d.ts.map +0 -1
  255. package/dist/types/components/structured/buzzwordbingo.words.d.ts.map +0 -1
  256. package/dist/types/components/structured/markdown.d.ts.map +0 -1
  257. package/dist/types/components/structured/recipe.d.ts.map +0 -1
  258. package/dist/types/components/structured/resume.d.ts.map +0 -1
  259. package/dist/types/components/structured/socialcard.d.ts.map +0 -1
  260. package/dist/types/components/structured/timeline.d.ts.map +0 -1
  261. /package/dist/components/{seo → general}/404.css +0 -0
  262. /package/dist/components/{structured → general}/buzzwordbingo.css +0 -0
  263. /package/dist/components/{structured → general}/buzzwordbingo.js +0 -0
  264. /package/dist/components/{structured → general}/buzzwordbingo.words.js +0 -0
  265. /package/dist/components/{cms → general}/calendly.js +0 -0
  266. /package/dist/components/{callout → general}/callout.scss +0 -0
  267. /package/dist/components/{carousel → general}/carousel.css +0 -0
  268. /package/dist/components/{carousel → general}/carousel.drag.js +0 -0
  269. /package/dist/components/{cms → general}/cloudinary.js +0 -0
  270. /package/dist/components/{cms → general}/contentful.delivery.js +0 -0
  271. /package/dist/components/{cms → general}/contentful.items.css +0 -0
  272. /package/dist/components/{cms → general}/contentful.management.js +0 -0
  273. /package/dist/components/{seo → general}/faq-accordion.css +0 -0
  274. /package/dist/components/{seo → general}/faq-accordion.js +0 -0
  275. /package/dist/components/{cms → general}/flickr.js +0 -0
  276. /package/dist/components/{cms → general}/google.reviews.components.js +0 -0
  277. /package/dist/components/{cms → general}/google.reviews.css +0 -0
  278. /package/dist/components/{cms → general}/google.reviews.functions.js +0 -0
  279. /package/dist/components/{seo → general}/googleanalytics.js +0 -0
  280. /package/dist/components/{seo → general}/googlemap.js +0 -0
  281. /package/dist/components/{seo → general}/googlesearch.css +0 -0
  282. /package/dist/components/{seo → general}/googlesearch.js +0 -0
  283. /package/dist/components/{cms → general}/gravatar.css +0 -0
  284. /package/dist/components/{cms → general}/gravatar.functions.js +0 -0
  285. /package/dist/components/{cms → general}/hubspot.components.js +0 -0
  286. /package/dist/components/{cms → general}/instagram.functions.js +0 -0
  287. /package/dist/components/{seo → general}/manifest.js +0 -0
  288. /package/dist/components/{structured → general}/markdown.css +0 -0
  289. /package/dist/components/{menu → general}/menu-accordion.css +0 -0
  290. /package/dist/components/{menu → general}/menu-accordion.js +0 -0
  291. /package/dist/components/{menu → general}/menu-expando.css +0 -0
  292. /package/dist/components/{menu → general}/menu-expando.js +0 -0
  293. /package/dist/components/{menu → general}/menu-simple.css +0 -0
  294. /package/dist/components/{menu → general}/menu-simple.js +0 -0
  295. /package/dist/components/{seo → general}/metadata.components.js +0 -0
  296. /package/dist/components/{seo → general}/metadata.functions.js +0 -0
  297. /package/dist/components/{nerdjoke → general}/nerdjoke.css +0 -0
  298. /package/dist/components/{nerdjoke → general}/nerdjoke.js +0 -0
  299. /package/dist/components/{structured → general}/recipe.css +0 -0
  300. /package/dist/components/{structured → general}/resume.css +0 -0
  301. /package/dist/components/{seo → general}/schema-blogposting.functions.js +0 -0
  302. /package/dist/components/{seo → general}/schema-blogposting.js +0 -0
  303. /package/dist/components/{seo → general}/schema-faq.js +0 -0
  304. /package/dist/components/{seo → general}/schema-localbusiness.js +0 -0
  305. /package/dist/components/{seo → general}/schema-recipe.js +0 -0
  306. /package/dist/components/{seo → general}/schema-services.js +0 -0
  307. /package/dist/components/{seo → general}/schema-website.js +0 -0
  308. /package/dist/components/{structured → general}/socialcard.css +0 -0
  309. /package/dist/components/{carousel → general}/tiles.css +0 -0
  310. /package/dist/components/{structured → general}/timeline.css +0 -0
  311. /package/dist/components/{cms → general}/wordpress.css +0 -0
  312. /package/dist/components/{cms → general}/wordpress.functions.js +0 -0
  313. /package/dist/components/{cms → general}/yelp.js +0 -0
  314. /package/dist/types/components/{seo → general}/404.d.ts +0 -0
  315. /package/dist/types/components/{structured → general}/buzzwordbingo.d.ts +0 -0
  316. /package/dist/types/components/{structured → general}/buzzwordbingo.words.d.ts +0 -0
  317. /package/dist/types/components/{cms → general}/calendly.d.ts +0 -0
  318. /package/dist/types/components/{callout → general}/callout.d.ts +0 -0
  319. /package/dist/types/components/{carousel → general}/carousel.d.ts +0 -0
  320. /package/dist/types/components/{carousel → general}/carousel.drag.d.ts +0 -0
  321. /package/dist/types/components/{cms → general}/cloudinary.d.ts +0 -0
  322. /package/dist/types/components/{cms → general}/contentful.delivery.d.ts +0 -0
  323. /package/dist/types/components/{cms → general}/contentful.items.components.d.ts +0 -0
  324. /package/dist/types/components/{cms → general}/contentful.management.d.ts +0 -0
  325. /package/dist/types/components/{seo → general}/faq-accordion.d.ts +0 -0
  326. /package/dist/types/components/{cms → general}/google.reviews.components.d.ts +0 -0
  327. /package/dist/types/components/{cms → general}/google.reviews.functions.d.ts +0 -0
  328. /package/dist/types/components/{seo → general}/googleanalytics.d.ts +0 -0
  329. /package/dist/types/components/{seo → general}/googlemap.d.ts +0 -0
  330. /package/dist/types/components/{seo → general}/googlesearch.d.ts +0 -0
  331. /package/dist/types/components/{cms → general}/gravatar.components.d.ts +0 -0
  332. /package/dist/types/components/{cms → general}/gravatar.functions.d.ts +0 -0
  333. /package/dist/types/components/{cms → general}/hubspot.components.d.ts +0 -0
  334. /package/dist/types/components/{cms → general}/instagram.components.d.ts +0 -0
  335. /package/dist/types/components/{seo → general}/manifest.d.ts +0 -0
  336. /package/dist/types/components/{structured → general}/markdown.d.ts +0 -0
  337. /package/dist/types/components/{menu → general}/menu-accordion.d.ts +0 -0
  338. /package/dist/types/components/{menu → general}/menu-expando.d.ts +0 -0
  339. /package/dist/types/components/{menu → general}/menu-simple.d.ts +0 -0
  340. /package/dist/types/components/{seo → general}/metadata.components.d.ts +0 -0
  341. /package/dist/types/components/{seo → general}/metadata.functions.d.ts +0 -0
  342. /package/dist/types/components/{nerdjoke → general}/nerdjoke.d.ts +0 -0
  343. /package/dist/types/components/{structured → general}/recipe.d.ts +0 -0
  344. /package/dist/types/components/{structured → general}/resume.d.ts +0 -0
  345. /package/dist/types/components/{seo → general}/schema-blogposting.d.ts +0 -0
  346. /package/dist/types/components/{seo → general}/schema-faq.d.ts +0 -0
  347. /package/dist/types/components/{seo → general}/schema-localbusiness.d.ts +0 -0
  348. /package/dist/types/components/{seo → general}/schema-recipe.d.ts +0 -0
  349. /package/dist/types/components/{seo → general}/schema-services.d.ts +0 -0
  350. /package/dist/types/components/{seo → general}/schema-website.d.ts +0 -0
  351. /package/dist/types/components/{seo → general}/sitemap.d.ts +0 -0
  352. /package/dist/types/components/{cms → general}/smartimage.d.ts +0 -0
  353. /package/dist/types/components/{structured → general}/socialcard.d.ts +0 -0
  354. /package/dist/types/components/{carousel → general}/tiles.d.ts +0 -0
  355. /package/dist/types/components/{structured → general}/timeline.d.ts +0 -0
  356. /package/dist/types/components/{cms → general}/wordpress.components.d.ts +0 -0
  357. /package/dist/types/components/{cms → general}/wordpress.functions.d.ts +0 -0
  358. /package/dist/types/components/{cms → general}/yelp.d.ts +0 -0
@@ -9,41 +9,33 @@ SiteHealthGoogleAnalytics.propTypes = {
9
9
  endDate: PropTypes.string,
10
10
  };
11
11
  export function SiteHealthGoogleAnalytics({ siteName, startDate, endDate }) {
12
- const fetchAnalyticsData = async (site) => {
13
- const params = new URLSearchParams({ siteName: site });
14
- if (startDate)
15
- params.append('startDate', startDate);
16
- if (endDate)
17
- params.append('endDate', endDate);
18
- const response = await fetch(`/api/site-health/google-analytics?${params.toString()}`);
19
- if (!response.ok) {
20
- throw new Error(`Failed to fetch analytics data: ${response.status}`);
21
- }
22
- const result = await response.json();
23
- if (!result.success) {
24
- // Handle specific error types
25
- if (result.error?.includes('invalid_grant') || result.error?.includes('authentication')) {
26
- throw new Error('Google Analytics authentication expired. Please re-authorize the application.');
27
- }
28
- else if (result.error?.includes('GA4 Property ID not configured')) {
29
- throw new Error('GA4 Property ID not configured for this site');
30
- }
31
- else {
32
- throw new Error(result.error || 'Failed to load analytics data');
33
- }
34
- }
35
- return result.data;
36
- };
37
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Google Analytics", columnSpan: 2, fetchData: fetchAnalyticsData, children: (data) => {
38
- if (!data || data.length === 0) {
12
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Google Analytics", columnSpan: 2, endpoint: {
13
+ endpoint: '/api/site-health/google-analytics',
14
+ params: {
15
+ ...(startDate && { startDate }),
16
+ ...(endDate && { endDate }),
17
+ },
18
+ responseTransformer: (result) => result.data, // Extract the data array from the response
19
+ }, children: (data) => {
20
+ // Ensure data is an array
21
+ if (!data || !Array.isArray(data) || data.length === 0) {
39
22
  return (_jsx("div", { className: "health-visualization-placeholder", children: _jsx("div", { className: "health-text-secondary", children: "No data available for the selected date range" }) }));
40
23
  }
41
- return (_jsx("div", { children: _jsx("div", { style: { width: '100%', height: '400px', border: '1px solid #ddd' }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(ComposedChart, { data: data, margin: { top: 40, right: 30, left: 20, bottom: 5 }, children: [_jsx("text", { x: "50%", y: 20, textAnchor: "middle", fontSize: "16", fontWeight: "bold", fill: "#374151", children: "Page Views (Current vs Previous Period)" }), _jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: "date", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 60 }), _jsx(YAxis, { tick: { fontSize: 12 } }), _jsx(Tooltip, { formatter: (value, name) => [
24
+ // Filter out any invalid data points
25
+ const validData = data.filter((point) => point &&
26
+ typeof point === 'object' &&
27
+ typeof point.date === 'string' &&
28
+ typeof point.currentPageViews === 'number' &&
29
+ typeof point.previousPageViews === 'number');
30
+ if (validData.length === 0) {
31
+ return (_jsx("div", { className: "health-visualization-placeholder", children: _jsx("div", { className: "health-text-secondary", children: "Invalid data format received from Google Analytics API." }) }));
32
+ }
33
+ return (_jsx("div", { children: _jsx("div", { style: { width: '100%', height: '400px', border: '1px solid #ddd' }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(ComposedChart, { data: validData, margin: { top: 40, right: 30, left: 20, bottom: 5 }, children: [_jsx("text", { x: "50%", y: 20, textAnchor: "middle", fontSize: "16", fontWeight: "bold", fill: "#374151", children: "Page Views (Current vs Previous Period)" }), _jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: "date", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 60 }), _jsx(YAxis, { tick: { fontSize: 12 } }), _jsx(Tooltip, { formatter: (value, name) => [
42
34
  value?.toLocaleString() || '0',
43
35
  name || 'Unknown'
44
36
  ], labelFormatter: (label) => `Date: ${label}` }), _jsx(Legend, { wrapperStyle: {
45
37
  fontSize: '12px',
46
38
  paddingTop: '10px'
47
- } }), _jsx(Bar, { dataKey: "currentPageViews", fill: "#3b82f6", name: "Current Period", radius: [2, 2, 0, 0] }), _jsx(Line, { type: "monotone", dataKey: "previousPageViews", stroke: "#ef4444", strokeWidth: 2, strokeDasharray: "5 5", dot: { fill: '#ef4444', strokeWidth: 2, r: 3 }, activeDot: { r: 5, stroke: '#ef4444', strokeWidth: 2 }, name: "Previous Period" })] }, `chart-${data.length}`) }) }) }));
39
+ } }), _jsx(Bar, { dataKey: "currentPageViews", fill: "#3b82f6", name: "Current Period", radius: [2, 2, 0, 0] }), _jsx(Line, { type: "monotone", dataKey: "previousPageViews", stroke: "#ef4444", strokeWidth: 2, strokeDasharray: "5 5", dot: { fill: '#ef4444', strokeWidth: 2, r: 3 }, activeDot: { r: 5, stroke: '#ef4444', strokeWidth: 2 }, name: "Previous Period" })] }, `chart-${validData.length}`) }) }) }));
48
40
  } }));
49
41
  }
@@ -3,116 +3,4 @@
3
3
  * Server-side utilities for Google Search Console data retrieval
4
4
  */
5
5
  "use server";
6
- import { RouteCache } from './site-health-cache';
7
- import { createSearchConsoleClient } from './google-api-auth';
8
- // Cache for search console data (1 hour)
9
- const searchConsoleCache = new RouteCache();
10
- /**
11
- * Get Google Search Console data for a site with current/previous period comparison
12
- */
13
- export async function getSearchConsoleData(config, siteName, startDate, endDate) {
14
- try {
15
- // Check cache first
16
- const cacheKey = `searchconsole-${siteName}-${startDate || 'default'}-${endDate || 'default'}`;
17
- const cached = searchConsoleCache.get(cacheKey);
18
- if (cached) {
19
- return { success: true, data: cached };
20
- }
21
- if (!config.siteUrl) {
22
- return {
23
- success: false,
24
- error: 'Site URL not configured for Search Console'
25
- };
26
- }
27
- // Set up authentication
28
- const authResult = await createSearchConsoleClient(config);
29
- if (!authResult.success) {
30
- return {
31
- success: false,
32
- error: authResult.error || 'Authentication failed'
33
- };
34
- }
35
- const searchconsole = authResult.client;
36
- // Calculate date ranges
37
- const currentEndDate = endDate ? new Date(endDate) : new Date();
38
- const currentStartDate = startDate ? new Date(startDate) : new Date(currentEndDate.getTime() - 30 * 24 * 60 * 60 * 1000);
39
- // Calculate previous period (same duration before the current period)
40
- const periodDuration = currentEndDate.getTime() - currentStartDate.getTime();
41
- const previousEndDate = new Date(currentStartDate.getTime() - 24 * 60 * 60 * 1000); // One day before start
42
- const previousStartDate = new Date(previousEndDate.getTime() - periodDuration);
43
- const currentStartStr = currentStartDate.toISOString().split('T')[0];
44
- const currentEndStr = currentEndDate.toISOString().split('T')[0];
45
- const previousStartStr = previousStartDate.toISOString().split('T')[0];
46
- const previousEndStr = previousEndDate.toISOString().split('T')[0];
47
- // Fetch current period data
48
- const currentResponse = await searchconsole.searchanalytics.query({
49
- siteUrl: config.siteUrl,
50
- requestBody: {
51
- startDate: currentStartStr,
52
- endDate: currentEndStr,
53
- dimensions: ['date'],
54
- rowLimit: 10000,
55
- },
56
- });
57
- // Fetch previous period data
58
- const previousResponse = await searchconsole.searchanalytics.query({
59
- siteUrl: config.siteUrl,
60
- requestBody: {
61
- startDate: previousStartStr,
62
- endDate: previousEndStr,
63
- dimensions: ['date'],
64
- rowLimit: 10000,
65
- },
66
- });
67
- // Create a map of previous period data by date
68
- const previousDataMap = new Map();
69
- previousResponse.data.rows?.forEach((row) => {
70
- const dateStr = row.keys?.[0] || '';
71
- if (dateStr) {
72
- previousDataMap.set(dateStr, {
73
- clicks: parseFloat(String(row.clicks || '0')),
74
- impressions: parseFloat(String(row.impressions || '0'))
75
- });
76
- }
77
- });
78
- // Combine current and previous period data
79
- const chartData = [];
80
- const daysInRange = Math.ceil((currentEndDate.getTime() - currentStartDate.getTime()) / (24 * 60 * 60 * 1000));
81
- for (let i = daysInRange - 1; i >= 0; i--) {
82
- const currentDate = new Date(currentEndDate);
83
- currentDate.setDate(currentDate.getDate() - i);
84
- const currentDateStr = currentDate.toISOString().split('T')[0];
85
- // Calculate corresponding previous period date
86
- const previousDate = new Date(currentDate.getTime() - periodDuration);
87
- const previousDateStr = previousDate.toISOString().split('T')[0];
88
- // Get current period data
89
- const currentRow = currentResponse.data.rows?.find((row) => row.keys?.[0] === currentDateStr);
90
- const currentClicks = parseFloat(String(currentRow?.clicks || '0'));
91
- const currentImpressions = parseFloat(String(currentRow?.impressions || '0'));
92
- // Get previous period data
93
- const previousData = previousDataMap.get(previousDateStr) || { clicks: 0, impressions: 0 };
94
- // Format date for display
95
- const formattedDate = currentDate.toLocaleDateString('en-US', {
96
- month: 'short',
97
- day: 'numeric'
98
- });
99
- chartData.push({
100
- date: formattedDate,
101
- currentImpressions: Math.round(currentImpressions),
102
- currentClicks: Math.round(currentClicks),
103
- previousImpressions: Math.round(previousData.impressions),
104
- previousClicks: Math.round(previousData.clicks),
105
- });
106
- }
107
- // Cache the result
108
- searchConsoleCache.set(cacheKey, chartData);
109
- return { success: true, data: chartData };
110
- }
111
- catch (error) {
112
- console.error('Google Search Console error:', error);
113
- return {
114
- success: false,
115
- error: error.message
116
- };
117
- }
118
- }
6
+ export {};
@@ -9,36 +9,30 @@ SiteHealthGoogleSearchConsole.propTypes = {
9
9
  endDate: PropTypes.string,
10
10
  };
11
11
  export function SiteHealthGoogleSearchConsole({ siteName, startDate, endDate }) {
12
- const fetchSearchConsoleData = async (site) => {
13
- const params = new URLSearchParams({ siteName: site });
14
- if (startDate)
15
- params.append('startDate', startDate);
16
- if (endDate)
17
- params.append('endDate', endDate);
18
- const response = await fetch(`/api/site-health/google-search-console?${params.toString()}`);
19
- if (!response.ok) {
20
- throw new Error(`Failed to fetch search console data: ${response.status}`);
21
- }
22
- const result = await response.json();
23
- if (!result.success) {
24
- // Handle specific error types
25
- if (result.error?.includes('invalid_grant') || result.error?.includes('authentication')) {
26
- throw new Error('Google Search Console authentication expired. Please re-authorize the application.');
27
- }
28
- else if (result.error?.includes('GSC Site URL not configured')) {
29
- throw new Error('GSC Site URL not configured for this site');
30
- }
31
- else {
32
- throw new Error(result.error || 'Failed to load search console data');
33
- }
34
- }
35
- return result.data;
36
- };
37
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Google Search Console", columnSpan: 2, fetchData: fetchSearchConsoleData, children: (data) => {
38
- if (!data || data.length === 0) {
12
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Google Search Console", columnSpan: 2, endpoint: {
13
+ endpoint: '/api/site-health/google-search-console',
14
+ params: {
15
+ ...(startDate && { startDate }),
16
+ ...(endDate && { endDate }),
17
+ },
18
+ responseTransformer: (result) => result.data, // Extract the data array from the response
19
+ }, children: (data) => {
20
+ // Ensure data is an array
21
+ if (!data || !Array.isArray(data) || data.length === 0) {
39
22
  return (_jsx("div", { className: "health-visualization-placeholder", children: _jsx("div", { className: "health-text-secondary", children: "No indexing data available for the selected date range" }) }));
40
23
  }
41
- return (_jsx("div", { children: _jsx("div", { style: { width: '100%', height: '400px', border: '1px solid #ddd' }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(ComposedChart, { data: data, margin: { top: 40, right: 30, left: 20, bottom: 5 }, children: [_jsx("text", { x: "50%", y: 20, textAnchor: "middle", fontSize: "16", fontWeight: "bold", fill: "#374151", children: "Impressions vs Clicks (Current vs Previous Period)" }), _jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: "date", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 60 }), _jsx(YAxis, { tick: { fontSize: 12 } }), _jsx(Tooltip, { formatter: (value, name) => [
24
+ // Filter out any invalid data points
25
+ const validData = data.filter((point) => point &&
26
+ typeof point === 'object' &&
27
+ typeof point.date === 'string' &&
28
+ typeof point.currentImpressions === 'number' &&
29
+ typeof point.currentClicks === 'number' &&
30
+ typeof point.previousImpressions === 'number' &&
31
+ typeof point.previousClicks === 'number');
32
+ if (validData.length === 0) {
33
+ return (_jsx("div", { className: "health-visualization-placeholder", children: _jsx("div", { className: "health-text-secondary", children: "Invalid data format received from Google Search Console API." }) }));
34
+ }
35
+ return (_jsx("div", { children: _jsx("div", { style: { width: '100%', height: '400px', border: '1px solid #ddd' }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(ComposedChart, { data: validData, margin: { top: 40, right: 30, left: 20, bottom: 5 }, children: [_jsx("text", { x: "50%", y: 20, textAnchor: "middle", fontSize: "16", fontWeight: "bold", fill: "#374151", children: "Impressions vs Clicks (Current vs Previous Period)" }), _jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: "date", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 60 }), _jsx(YAxis, { tick: { fontSize: 12 } }), _jsx(Tooltip, { formatter: (value, name) => [
42
36
  value?.toLocaleString() || '0',
43
37
  name || 'Unknown'
44
38
  ], labelFormatter: (label) => `Date: ${label}` }), _jsx(Legend, { wrapperStyle: {
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ const SiteHealthMockDataContext = createContext(null);
6
+ export const SiteHealthMockProvider = ({ mocks, children }) => {
7
+ return (_jsx(SiteHealthMockDataContext.Provider, { value: mocks, children: children }));
8
+ };
9
+ SiteHealthMockProvider.propTypes = {
10
+ mocks: PropTypes.object.isRequired,
11
+ children: PropTypes.node.isRequired
12
+ };
13
+ export function useSiteHealthMockData() {
14
+ return useContext(SiteHealthMockDataContext);
15
+ }
@@ -61,42 +61,14 @@ function restructureAuditsByType(pagesAnalyzed) {
61
61
  });
62
62
  return restructuredAudits.sort((a, b) => (b.score || 0) - (a.score || 0));
63
63
  }
64
- // Fetch real SEO data from API
65
- async function fetchOnSiteSEOData(siteName) {
66
- try {
67
- const response = await fetch(`/api/site-health/on-site-seo?siteName=${encodeURIComponent(siteName)}`);
68
- if (!response.ok) {
69
- throw new Error(`API request failed: ${response.status} ${response.statusText}`);
70
- }
71
- const data = await response.json();
72
- if (data.status === 'error') {
73
- throw new Error(data.error || 'SEO analysis failed');
74
- }
75
- // Process data to aggregate audits by type across all pages
76
- // const aggregatedOnPageAudits = restructureAuditsByType(data.pagesAnalyzed);
77
- return data;
78
- }
79
- catch (error) {
80
- console.error('Error fetching SEO data:', error);
81
- // Return error structure that the template can display
82
- return {
83
- site: siteName,
84
- url: '',
85
- overallScore: null,
86
- pagesAnalyzed: [],
87
- onSiteAudits: [],
88
- totalPages: 0,
89
- timestamp: new Date().toISOString(),
90
- status: 'error',
91
- error: error instanceof Error ? error.message : 'Failed to fetch SEO data'
92
- };
93
- }
94
- }
95
64
  SiteHealthOnSiteSEO.propTypes = {
96
65
  siteName: PropTypes.string.isRequired,
97
66
  };
98
67
  export function SiteHealthOnSiteSEO({ siteName }) {
99
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "On-Site SEO", fetchData: fetchOnSiteSEOData, children: (data) => {
68
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "On-Site SEO", endpoint: {
69
+ endpoint: '/api/site-health/on-site-seo',
70
+ responseTransformer: (result) => result.data, // Extract the data from the response
71
+ }, children: (data) => {
100
72
  if (!data)
101
73
  return null;
102
74
  if (data.status === 'error') {
@@ -147,7 +119,12 @@ export function SiteHealthOnSiteSEO({ siteName }) {
147
119
  // Fallback to original formatting
148
120
  return formatAuditItem(item);
149
121
  };
150
- return (_jsxs(_Fragment, { children: [data.onSiteAudits.length > 0 && (_jsxs("div", { style: { marginTop: data.pagesAnalyzed.length > 0 ? '2rem' : '0' }, children: [_jsx("h5", { style: { fontSize: '1rem', fontWeight: '600', marginBottom: '1rem' }, children: "On-Site SEO Audits" }), _jsx("div", { className: "health-audit-list", children: data.onSiteAudits
122
+ return (_jsxs(_Fragment, { children: [aggregatedOnPageAudits.length > 0 && (_jsxs("div", { children: [_jsx("h5", { style: { fontSize: '1rem', fontWeight: '600', marginBottom: '1rem' }, children: "On-Page SEO Audits" }), _jsx("div", { className: "health-audit-list", children: aggregatedOnPageAudits
123
+ .filter(audit => audit.scoreDisplayMode !== 'notApplicable')
124
+ .sort((a, b) => (b.score || 0) - (a.score || 0))
125
+ .map((audit) => (_jsxs("div", { className: "health-audit-item", children: [_jsx("span", { className: "health-audit-icon", children: getAuditScoreIcon(audit.score) }), _jsxs("div", { className: "health-audit-content", children: [_jsxs("span", { className: "health-audit-title", children: [audit.score === null ? '(N/A)' : `(${Math.round((audit.score || 0) * 100)}%)`, " ", audit.title] }), audit.displayValue && audit.score !== 1 && (_jsx("p", { className: "health-audit-description", children: audit.displayValue })), audit.details && audit.details.items && Array.isArray(audit.details.items) && audit.details.items.length > 0 && audit.score !== 1 && (_jsx("div", { className: "health-audit-details", children: _jsx("div", { style: { fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }, children: audit.details.items
126
+ .filter((item) => item.score !== 1)
127
+ .map((item, idx) => (_jsx("div", { style: { marginBottom: '0.125rem' }, children: formatPageIssue(item) }, idx))) }) }))] })] }, audit.id))) })] })), data.onSiteAudits.length > 0 && (_jsxs("div", { style: { marginTop: aggregatedOnPageAudits.length > 0 ? '2rem' : '0' }, children: [_jsx("h5", { style: { fontSize: '1rem', fontWeight: '600', marginBottom: '1rem' }, children: "On-Site SEO Audits" }), _jsx("div", { className: "health-audit-list", children: data.onSiteAudits
151
128
  .filter(audit => audit.scoreDisplayMode !== 'notApplicable')
152
129
  .sort((a, b) => (b.score || 0) - (a.score || 0))
153
130
  .map((audit) => (_jsxs("div", { className: "health-audit-item", children: [_jsx("span", { className: "health-audit-icon", children: getAuditScoreIcon(audit.score) }), _jsxs("div", { className: "health-audit-content", children: [_jsxs("span", { className: "health-audit-title", children: [audit.score === null ? '(N/A)' : `(${Math.round((audit.score || 0) * 100)}%)`, " ", audit.title] }), audit.displayValue && audit.score !== 1 && (_jsx("p", { className: "health-audit-description", children: audit.displayValue })), audit.details && audit.details.items && Array.isArray(audit.details.items) && audit.details.items.length > 0 && audit.score !== 1 && (_jsx("div", { className: "health-audit-details", children: _jsx("div", { style: { fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }, children: audit.details.items
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback } from 'react';
4
3
  import PropTypes from 'prop-types';
5
4
  import { SiteHealthTemplate } from './site-health-template';
6
5
  import { formatScore, getScoreColor } from './site-health-utils';
@@ -8,15 +7,10 @@ SiteHealthOverview.propTypes = {
8
7
  siteName: PropTypes.string.isRequired,
9
8
  };
10
9
  export function SiteHealthOverview({ siteName }) {
11
- const fetchCWVData = useCallback(async (site) => {
12
- const response = await fetch(`/api/site-health/core-web-vitals?siteName=${encodeURIComponent(site)}`);
13
- const result = await response.json();
14
- if (!result.success) {
15
- throw new Error(result.error || 'Failed to fetch Core Web Vitals data');
16
- }
17
- return result;
18
- }, []);
19
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Site Overview", fetchData: fetchCWVData, children: (data) => {
10
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Site Overview", endpoint: {
11
+ endpoint: '/api/site-health/core-web-vitals',
12
+ responseTransformer: (result) => result, // Result is already in the correct format
13
+ }, children: (data) => {
20
14
  if (!data?.data || data.data.length === 0) {
21
15
  return (_jsx("p", { style: { color: '#6b7280' }, children: "No site health data available for this site." }));
22
16
  }
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback } from 'react';
4
3
  import PropTypes from 'prop-types';
5
4
  import { SiteHealthTemplate } from './site-health-template';
6
5
  import { formatAuditItem, getAuditScoreIcon, getScoreColor, formatScore } from './site-health-utils';
@@ -8,15 +7,10 @@ SiteHealthPerformance.propTypes = {
8
7
  siteName: PropTypes.string.isRequired,
9
8
  };
10
9
  export function SiteHealthPerformance({ siteName }) {
11
- const fetchCWVData = useCallback(async (site) => {
12
- const response = await fetch(`/api/site-health/core-web-vitals?siteName=${encodeURIComponent(site)}`);
13
- const result = await response.json();
14
- if (!result.success) {
15
- throw new Error(result.error || 'Failed to fetch Core Web Vitals data');
16
- }
17
- return result;
18
- }, []);
19
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Performance", fetchData: fetchCWVData, children: (data) => {
10
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Performance", endpoint: {
11
+ endpoint: '/api/site-health/core-web-vitals',
12
+ responseTransformer: (result) => result, // Result is already in the correct format
13
+ }, children: (data) => {
20
14
  if (!data?.data || data.data.length === 0) {
21
15
  return (_jsx("p", { style: { color: '#6b7280' }, children: "No site health data available for this site." }));
22
16
  }
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback } from 'react';
4
3
  import PropTypes from 'prop-types';
5
4
  import { SiteHealthTemplate } from './site-health-template';
6
5
  import { formatAuditItem, getAuditScoreIcon, getScoreColor } from './site-health-utils';
@@ -8,15 +7,12 @@ SiteHealthSecurity.propTypes = {
8
7
  siteName: PropTypes.string.isRequired,
9
8
  };
10
9
  export function SiteHealthSecurity({ siteName }) {
11
- const fetchSecurityData = useCallback(async (site) => {
12
- // Fetch PSI data for best practices security audits
13
- const psiResponse = await fetch(`/api/site-health/core-web-vitals?siteName=${encodeURIComponent(site)}`);
14
- const psiResult = await psiResponse.json();
15
- return {
16
- psiData: psiResult.success ? psiResult : undefined
17
- };
18
- }, []);
19
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Site Security", fetchData: fetchSecurityData, children: (data) => {
10
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - Security", endpoint: {
11
+ endpoint: '/api/site-health/core-web-vitals',
12
+ responseTransformer: (result) => ({
13
+ psiData: result.success ? result : undefined
14
+ }),
15
+ }, children: (data) => {
20
16
  const psiData = data?.psiData?.data?.[0];
21
17
  if (!psiData) {
22
18
  return (_jsx("p", { style: { color: '#6b7280' }, children: "No security data available for this site." }));
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback } from 'react';
4
3
  import PropTypes from 'prop-types';
5
4
  import { SiteHealthTemplate } from './site-health-template';
6
5
  import { formatAuditItem, getAuditScoreIcon, getScoreColor } from './site-health-utils';
@@ -8,15 +7,10 @@ SiteHealthSEO.propTypes = {
8
7
  siteName: PropTypes.string.isRequired,
9
8
  };
10
9
  export function SiteHealthSEO({ siteName }) {
11
- const fetchSEOData = useCallback(async (site) => {
12
- const response = await fetch(`/api/site-health/core-web-vitals?siteName=${encodeURIComponent(site)}`);
13
- const result = await response.json();
14
- if (!result.success) {
15
- throw new Error(result.error || 'Failed to fetch SEO data');
16
- }
17
- return result;
18
- }, []);
19
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - SEO", fetchData: fetchSEOData, children: (data) => {
10
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "PageSpeed - SEO", endpoint: {
11
+ endpoint: '/api/site-health/core-web-vitals',
12
+ responseTransformer: (result) => result, // Result is already in the correct format
13
+ }, children: (data) => {
20
14
  if (!data?.data || data.data.length === 0) {
21
15
  return (_jsx("p", { style: { color: '#6b7280' }, children: "No SEO data available for this site." }));
22
16
  }
@@ -1,65 +1,123 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useEffect, useState } from 'react';
3
+ import { useEffect, useState, useCallback } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import { PageGridItem } from '../../general/semantic';
6
6
  import "./site-health.css";
7
+ import { useSiteHealthMockData } from './site-health-mock-context';
7
8
  SiteHealthTemplate.propTypes = {
8
9
  siteName: PropTypes.string.isRequired,
9
10
  title: PropTypes.string,
10
11
  children: PropTypes.func.isRequired,
11
- fetchData: PropTypes.func.isRequired,
12
+ endpoint: PropTypes.shape({
13
+ endpoint: PropTypes.string.isRequired,
14
+ method: PropTypes.oneOf(['GET', 'POST', 'PUT', 'DELETE']),
15
+ headers: PropTypes.object,
16
+ params: PropTypes.object,
17
+ body: PropTypes.any,
18
+ responseTransformer: PropTypes.func,
19
+ }),
12
20
  enableCacheControl: PropTypes.bool,
13
21
  columnSpan: PropTypes.number,
22
+ data: PropTypes.any,
14
23
  };
15
24
  export function SiteHealthTemplate(props) {
16
25
  const typedProps = props;
17
- const [data, setData] = useState(null);
26
+ const mockDataMap = useSiteHealthMockData();
27
+ const storyMockData = typedProps.title ? mockDataMap?.[typedProps.title] : undefined;
28
+ const [data, setData] = useState(typedProps.data ?? storyMockData ?? null);
18
29
  const [loading, setLoading] = useState(false);
19
30
  const [error, setError] = useState(null);
31
+ // Default fetch function for endpoint-based requests
32
+ const fetchFromEndpoint = useCallback(async (useCache = true) => {
33
+ if (!typedProps.endpoint) {
34
+ throw new Error('Endpoint is not configured for SiteHealthTemplate');
35
+ }
36
+ const { endpoint: endpointUrl, method = 'GET', headers = {}, params = {}, body, responseTransformer } = typedProps.endpoint;
37
+ // Build URL with siteName parameter
38
+ const url = new URL(endpointUrl, window.location.origin);
39
+ url.searchParams.set('siteName', encodeURIComponent(typedProps.siteName));
40
+ // Add additional params
41
+ Object.entries(params).forEach(([key, value]) => {
42
+ url.searchParams.set(key, value);
43
+ });
44
+ // Add cache control if not using cache
45
+ if (!useCache) {
46
+ url.searchParams.set('cache', 'false');
47
+ }
48
+ const response = await fetch(url.toString(), {
49
+ method,
50
+ headers: {
51
+ 'Content-Type': 'application/json',
52
+ ...headers,
53
+ },
54
+ body: body ? JSON.stringify(body) : undefined,
55
+ });
56
+ if (!response.ok) {
57
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
58
+ }
59
+ const result = await response.json();
60
+ if (!result.success) {
61
+ throw new Error(result.error || 'API request failed');
62
+ }
63
+ // Apply response transformer if provided
64
+ return responseTransformer ? responseTransformer(result) : result;
65
+ }, [typedProps.endpoint, typedProps.siteName]);
66
+ const loadData = useCallback(async () => {
67
+ if (!typedProps.siteName) {
68
+ setData(null);
69
+ setLoading(false);
70
+ setError(null);
71
+ return;
72
+ }
73
+ setLoading(true);
74
+ setError(null);
75
+ try {
76
+ // Check for cache control from URL query parameters
77
+ const urlParams = new URLSearchParams(window.location.search);
78
+ const cacheParam = urlParams.get('cache');
79
+ const useCache = typedProps.enableCacheControl ?? true ? (cacheParam !== 'false') : true;
80
+ const result = await fetchFromEndpoint(useCache);
81
+ setData(result);
82
+ setError(null);
83
+ }
84
+ catch (err) {
85
+ setError(err instanceof Error ? err.message : 'Failed to load data');
86
+ setData(null);
87
+ }
88
+ finally {
89
+ setLoading(false);
90
+ }
91
+ }, [typedProps.siteName, fetchFromEndpoint, typedProps.enableCacheControl]);
20
92
  useEffect(() => {
21
- let isMounted = true;
22
- const loadData = async () => {
23
- if (!typedProps.siteName) {
24
- if (isMounted) {
25
- setData(null);
26
- setLoading(false);
27
- setError(null);
28
- }
29
- return;
30
- }
31
- if (isMounted) {
32
- setLoading(true);
33
- setError(null);
34
- }
35
- try {
36
- // Check for cache control from URL query parameters
37
- const urlParams = new URLSearchParams(window.location.search);
38
- const cacheParam = urlParams.get('cache');
39
- const useCache = typedProps.enableCacheControl ? (cacheParam !== 'false') : true;
40
- const result = await typedProps.fetchData(typedProps.siteName, useCache);
41
- if (isMounted) {
42
- setData(result);
43
- setError(null);
44
- }
45
- }
46
- catch (err) {
47
- if (isMounted) {
48
- setError(err instanceof Error ? err.message : 'Failed to load data');
49
- setData(null);
50
- }
51
- }
52
- finally {
53
- if (isMounted) {
54
- setLoading(false);
55
- }
56
- }
57
- };
93
+ if (!typedProps.siteName) {
94
+ return;
95
+ }
96
+ if (storyMockData || typeof typedProps.data !== 'undefined') {
97
+ return;
98
+ }
58
99
  loadData();
59
- return () => {
60
- isMounted = false;
61
- };
62
- }, [typedProps.siteName, typedProps.fetchData]);
100
+ }, [loadData, typedProps.siteName, typedProps.data, storyMockData]);
101
+ useEffect(() => {
102
+ if (!typedProps.siteName) {
103
+ setData(null);
104
+ setLoading(false);
105
+ setError(null);
106
+ return;
107
+ }
108
+ if (storyMockData) {
109
+ setData(storyMockData);
110
+ setLoading(false);
111
+ setError(null);
112
+ return;
113
+ }
114
+ if (typeof typedProps.data !== 'undefined') {
115
+ setData(typedProps.data);
116
+ setLoading(false);
117
+ setError(null);
118
+ return;
119
+ }
120
+ }, [typedProps.siteName, typedProps.data, storyMockData]);
63
121
  // If no site selected, show nothing
64
122
  if (!typedProps.siteName) {
65
123
  return null;
@@ -6,15 +6,10 @@ SiteHealthUptime.propTypes = {
6
6
  siteName: PropTypes.string.isRequired,
7
7
  };
8
8
  export function SiteHealthUptime({ siteName }) {
9
- const fetchUptimeData = async (site) => {
10
- const response = await fetch(`/api/site-health/uptime?siteName=${encodeURIComponent(site)}`);
11
- const result = await response.json();
12
- if (!result.success) {
13
- throw new Error('Failed to load health status');
14
- }
15
- return result;
16
- };
17
- return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Health Status", fetchData: fetchUptimeData, children: (data) => {
9
+ return (_jsx(SiteHealthTemplate, { siteName: siteName, title: "Health Status", endpoint: {
10
+ endpoint: '/api/site-health/uptime',
11
+ responseTransformer: (result) => result, // Result is already in the correct format
12
+ }, children: (data) => {
18
13
  if (!data) {
19
14
  return (_jsx("p", { style: { color: '#6b7280' }, children: "No uptime data available for this site." }));
20
15
  }
@@ -455,3 +455,10 @@ th, td {
455
455
  padding: 1rem 0;
456
456
  color: var(--color-text-secondary);
457
457
  }
458
+
459
+ /* Print Styles */
460
+ @media print {
461
+ .site-health-header {
462
+ display: none;
463
+ }
464
+ }