@wildo-ai/saas-website 1.1.1

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 (383) hide show
  1. package/LICENSE +34 -0
  2. package/dist/esm/.builder.pid +9 -0
  3. package/dist/esm/astro/blog-post-bridge.d.ts +324 -0
  4. package/dist/esm/astro/blog-post-bridge.d.ts.map +1 -0
  5. package/dist/esm/astro/blog-post-bridge.js +57 -0
  6. package/dist/esm/astro/blog-post-bridge.js.map +1 -0
  7. package/dist/esm/astro/blog-post-head.renderer.d.ts +129 -0
  8. package/dist/esm/astro/blog-post-head.renderer.d.ts.map +1 -0
  9. package/dist/esm/astro/blog-post-head.renderer.js +139 -0
  10. package/dist/esm/astro/blog-post-head.renderer.js.map +1 -0
  11. package/dist/esm/astro/bridge-runtime.d.ts +224 -0
  12. package/dist/esm/astro/bridge-runtime.d.ts.map +1 -0
  13. package/dist/esm/astro/bridge-runtime.js +30 -0
  14. package/dist/esm/astro/bridge-runtime.js.map +1 -0
  15. package/dist/esm/astro/collect-expected-label-keys.d.ts +65 -0
  16. package/dist/esm/astro/collect-expected-label-keys.d.ts.map +1 -0
  17. package/dist/esm/astro/collect-expected-label-keys.js +101 -0
  18. package/dist/esm/astro/collect-expected-label-keys.js.map +1 -0
  19. package/dist/esm/astro/headers-renderer.d.ts +32 -0
  20. package/dist/esm/astro/headers-renderer.d.ts.map +1 -0
  21. package/dist/esm/astro/headers-renderer.js +64 -0
  22. package/dist/esm/astro/headers-renderer.js.map +1 -0
  23. package/dist/esm/astro/i18n-routing.helper.d.ts +91 -0
  24. package/dist/esm/astro/i18n-routing.helper.d.ts.map +1 -0
  25. package/dist/esm/astro/i18n-routing.helper.js +23 -0
  26. package/dist/esm/astro/i18n-routing.helper.js.map +1 -0
  27. package/dist/esm/astro/internal/html-escape.d.ts +31 -0
  28. package/dist/esm/astro/internal/html-escape.d.ts.map +1 -0
  29. package/dist/esm/astro/internal/html-escape.js +40 -0
  30. package/dist/esm/astro/internal/html-escape.js.map +1 -0
  31. package/dist/esm/astro/label-pack-loader.d.ts +134 -0
  32. package/dist/esm/astro/label-pack-loader.d.ts.map +1 -0
  33. package/dist/esm/astro/label-pack-loader.js +298 -0
  34. package/dist/esm/astro/label-pack-loader.js.map +1 -0
  35. package/dist/esm/astro/llms-txt-server.d.ts +28 -0
  36. package/dist/esm/astro/llms-txt-server.d.ts.map +1 -0
  37. package/dist/esm/astro/llms-txt-server.js +33 -0
  38. package/dist/esm/astro/llms-txt-server.js.map +1 -0
  39. package/dist/esm/astro/pick-labels-for-page.d.ts +63 -0
  40. package/dist/esm/astro/pick-labels-for-page.d.ts.map +1 -0
  41. package/dist/esm/astro/pick-labels-for-page.js +73 -0
  42. package/dist/esm/astro/pick-labels-for-page.js.map +1 -0
  43. package/dist/esm/astro/robots-renderer.d.ts +85 -0
  44. package/dist/esm/astro/robots-renderer.d.ts.map +1 -0
  45. package/dist/esm/astro/robots-renderer.js +157 -0
  46. package/dist/esm/astro/robots-renderer.js.map +1 -0
  47. package/dist/esm/astro/sitemap-coverage.d.ts +101 -0
  48. package/dist/esm/astro/sitemap-coverage.d.ts.map +1 -0
  49. package/dist/esm/astro/sitemap-coverage.js +67 -0
  50. package/dist/esm/astro/sitemap-coverage.js.map +1 -0
  51. package/dist/esm/astro/structured-data.renderer.d.ts +21 -0
  52. package/dist/esm/astro/structured-data.renderer.d.ts.map +1 -0
  53. package/dist/esm/astro/structured-data.renderer.js +142 -0
  54. package/dist/esm/astro/structured-data.renderer.js.map +1 -0
  55. package/dist/esm/astro/website-page-head.renderer.d.ts +93 -0
  56. package/dist/esm/astro/website-page-head.renderer.d.ts.map +1 -0
  57. package/dist/esm/astro/website-page-head.renderer.js +184 -0
  58. package/dist/esm/astro/website-page-head.renderer.js.map +1 -0
  59. package/dist/esm/astro/website-page-runtime.helper.d.ts +112 -0
  60. package/dist/esm/astro/website-page-runtime.helper.d.ts.map +1 -0
  61. package/dist/esm/astro/website-page-runtime.helper.js +60 -0
  62. package/dist/esm/astro/website-page-runtime.helper.js.map +1 -0
  63. package/dist/esm/astro/website-site-context.d.ts +126 -0
  64. package/dist/esm/astro/website-site-context.d.ts.map +1 -0
  65. package/dist/esm/astro/website-site-context.js +37 -0
  66. package/dist/esm/astro/website-site-context.js.map +1 -0
  67. package/dist/esm/astro-island.d.ts +56 -0
  68. package/dist/esm/astro-island.d.ts.map +1 -0
  69. package/dist/esm/astro-island.js +61 -0
  70. package/dist/esm/astro-island.js.map +1 -0
  71. package/dist/esm/astro.d.ts +151 -0
  72. package/dist/esm/astro.d.ts.map +1 -0
  73. package/dist/esm/astro.js +151 -0
  74. package/dist/esm/astro.js.map +1 -0
  75. package/dist/esm/companion-exports.d.ts +38 -0
  76. package/dist/esm/companion-exports.d.ts.map +1 -0
  77. package/dist/esm/companion-exports.js +38 -0
  78. package/dist/esm/companion-exports.js.map +1 -0
  79. package/dist/esm/components/low-level/WebsiteButton.d.ts +73 -0
  80. package/dist/esm/components/low-level/WebsiteButton.d.ts.map +1 -0
  81. package/dist/esm/components/low-level/WebsiteButton.js +68 -0
  82. package/dist/esm/components/low-level/WebsiteButton.js.map +1 -0
  83. package/dist/esm/components/low-level/WebsiteHeading.d.ts +78 -0
  84. package/dist/esm/components/low-level/WebsiteHeading.d.ts.map +1 -0
  85. package/dist/esm/components/low-level/WebsiteHeading.js +41 -0
  86. package/dist/esm/components/low-level/WebsiteHeading.js.map +1 -0
  87. package/dist/esm/components/low-level/WebsiteImage.d.ts +73 -0
  88. package/dist/esm/components/low-level/WebsiteImage.d.ts.map +1 -0
  89. package/dist/esm/components/low-level/WebsiteImage.js +21 -0
  90. package/dist/esm/components/low-level/WebsiteImage.js.map +1 -0
  91. package/dist/esm/components/low-level/WebsiteInternalButton.d.ts +90 -0
  92. package/dist/esm/components/low-level/WebsiteInternalButton.d.ts.map +1 -0
  93. package/dist/esm/components/low-level/WebsiteInternalButton.js +47 -0
  94. package/dist/esm/components/low-level/WebsiteInternalButton.js.map +1 -0
  95. package/dist/esm/components/low-level/WebsiteInternalLink.d.ts +99 -0
  96. package/dist/esm/components/low-level/WebsiteInternalLink.d.ts.map +1 -0
  97. package/dist/esm/components/low-level/WebsiteInternalLink.js +68 -0
  98. package/dist/esm/components/low-level/WebsiteInternalLink.js.map +1 -0
  99. package/dist/esm/components/low-level/WebsiteLink.d.ts +50 -0
  100. package/dist/esm/components/low-level/WebsiteLink.d.ts.map +1 -0
  101. package/dist/esm/components/low-level/WebsiteLink.js +22 -0
  102. package/dist/esm/components/low-level/WebsiteLink.js.map +1 -0
  103. package/dist/esm/components/low-level/WebsiteText.d.ts +57 -0
  104. package/dist/esm/components/low-level/WebsiteText.d.ts.map +1 -0
  105. package/dist/esm/components/low-level/WebsiteText.js +57 -0
  106. package/dist/esm/components/low-level/WebsiteText.js.map +1 -0
  107. package/dist/esm/config/define-website-config.d.ts +83 -0
  108. package/dist/esm/config/define-website-config.d.ts.map +1 -0
  109. package/dist/esm/config/define-website-config.js +126 -0
  110. package/dist/esm/config/define-website-config.js.map +1 -0
  111. package/dist/esm/config/index.d.ts +38 -0
  112. package/dist/esm/config/index.d.ts.map +1 -0
  113. package/dist/esm/config/index.js +38 -0
  114. package/dist/esm/config/index.js.map +1 -0
  115. package/dist/esm/config/load-website-config.d.ts +136 -0
  116. package/dist/esm/config/load-website-config.d.ts.map +1 -0
  117. package/dist/esm/config/load-website-config.js +177 -0
  118. package/dist/esm/config/load-website-config.js.map +1 -0
  119. package/dist/esm/config/wildo-website-config.schemas.d.ts +251 -0
  120. package/dist/esm/config/wildo-website-config.schemas.d.ts.map +1 -0
  121. package/dist/esm/config/wildo-website-config.schemas.js +302 -0
  122. package/dist/esm/config/wildo-website-config.schemas.js.map +1 -0
  123. package/dist/esm/config-loader.d.ts +35 -0
  124. package/dist/esm/config-loader.d.ts.map +1 -0
  125. package/dist/esm/config-loader.js +35 -0
  126. package/dist/esm/config-loader.js.map +1 -0
  127. package/dist/esm/core/anonymous-session/InboundContactForm.d.ts +38 -0
  128. package/dist/esm/core/anonymous-session/InboundContactForm.d.ts.map +1 -0
  129. package/dist/esm/core/anonymous-session/InboundContactForm.js +77 -0
  130. package/dist/esm/core/anonymous-session/InboundContactForm.js.map +1 -0
  131. package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts +41 -0
  132. package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts.map +1 -0
  133. package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js +58 -0
  134. package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js.map +1 -0
  135. package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts +81 -0
  136. package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts.map +1 -0
  137. package/dist/esm/core/anonymous-session/website-anonymous-session-client.js +177 -0
  138. package/dist/esm/core/anonymous-session/website-anonymous-session-client.js.map +1 -0
  139. package/dist/esm/core/contexts/WebsitePageContext.d.ts +40 -0
  140. package/dist/esm/core/contexts/WebsitePageContext.d.ts.map +1 -0
  141. package/dist/esm/core/contexts/WebsitePageContext.js +8 -0
  142. package/dist/esm/core/contexts/WebsitePageContext.js.map +1 -0
  143. package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts +162 -0
  144. package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts.map +1 -0
  145. package/dist/esm/core/contexts/WebsiteRuntimeContext.js +22 -0
  146. package/dist/esm/core/contexts/WebsiteRuntimeContext.js.map +1 -0
  147. package/dist/esm/core/contexts/WebsiteSectionContext.d.ts +47 -0
  148. package/dist/esm/core/contexts/WebsiteSectionContext.d.ts.map +1 -0
  149. package/dist/esm/core/contexts/WebsiteSectionContext.js +8 -0
  150. package/dist/esm/core/contexts/WebsiteSectionContext.js.map +1 -0
  151. package/dist/esm/core/contexts/useWebsitePage.d.ts +13 -0
  152. package/dist/esm/core/contexts/useWebsitePage.d.ts.map +1 -0
  153. package/dist/esm/core/contexts/useWebsitePage.js +22 -0
  154. package/dist/esm/core/contexts/useWebsitePage.js.map +1 -0
  155. package/dist/esm/core/contexts/useWebsiteRuntime.d.ts +19 -0
  156. package/dist/esm/core/contexts/useWebsiteRuntime.d.ts.map +1 -0
  157. package/dist/esm/core/contexts/useWebsiteRuntime.js +28 -0
  158. package/dist/esm/core/contexts/useWebsiteRuntime.js.map +1 -0
  159. package/dist/esm/core/contexts/useWebsiteSection.d.ts +12 -0
  160. package/dist/esm/core/contexts/useWebsiteSection.d.ts.map +1 -0
  161. package/dist/esm/core/contexts/useWebsiteSection.js +22 -0
  162. package/dist/esm/core/contexts/useWebsiteSection.js.map +1 -0
  163. package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts +17 -0
  164. package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts.map +1 -0
  165. package/dist/esm/core/external-providers/frontend-provider-registry.website.js +23 -0
  166. package/dist/esm/core/external-providers/frontend-provider-registry.website.js.map +1 -0
  167. package/dist/esm/core/factories/define-website-page-manifest.d.ts +70 -0
  168. package/dist/esm/core/factories/define-website-page-manifest.d.ts.map +1 -0
  169. package/dist/esm/core/factories/define-website-page-manifest.js +51 -0
  170. package/dist/esm/core/factories/define-website-page-manifest.js.map +1 -0
  171. package/dist/esm/core/factories/define-website-section.d.ts +101 -0
  172. package/dist/esm/core/factories/define-website-section.d.ts.map +1 -0
  173. package/dist/esm/core/factories/define-website-section.js +71 -0
  174. package/dist/esm/core/factories/define-website-section.js.map +1 -0
  175. package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts +23 -0
  176. package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts.map +1 -0
  177. package/dist/esm/core/hooks/useWebsiteDesignTokens.js +25 -0
  178. package/dist/esm/core/hooks/useWebsiteDesignTokens.js.map +1 -0
  179. package/dist/esm/core/hooks/useWebsiteLabel.d.ts +68 -0
  180. package/dist/esm/core/hooks/useWebsiteLabel.d.ts.map +1 -0
  181. package/dist/esm/core/hooks/useWebsiteLabel.js +103 -0
  182. package/dist/esm/core/hooks/useWebsiteLabel.js.map +1 -0
  183. package/dist/esm/core/layouts/WebsitePageLayout.d.ts +87 -0
  184. package/dist/esm/core/layouts/WebsitePageLayout.d.ts.map +1 -0
  185. package/dist/esm/core/layouts/WebsitePageLayout.js +170 -0
  186. package/dist/esm/core/layouts/WebsitePageLayout.js.map +1 -0
  187. package/dist/esm/core/layouts/WebsiteSection.d.ts +91 -0
  188. package/dist/esm/core/layouts/WebsiteSection.d.ts.map +1 -0
  189. package/dist/esm/core/layouts/WebsiteSection.js +26 -0
  190. package/dist/esm/core/layouts/WebsiteSection.js.map +1 -0
  191. package/dist/esm/core/routing/internal-routing.utils.d.ts +65 -0
  192. package/dist/esm/core/routing/internal-routing.utils.d.ts.map +1 -0
  193. package/dist/esm/core/routing/internal-routing.utils.js +14 -0
  194. package/dist/esm/core/routing/internal-routing.utils.js.map +1 -0
  195. package/dist/esm/index.d.ts +129 -0
  196. package/dist/esm/index.d.ts.map +1 -0
  197. package/dist/esm/index.js +129 -0
  198. package/dist/esm/index.js.map +1 -0
  199. package/dist/esm/mdx/BlogPost.d.ts +193 -0
  200. package/dist/esm/mdx/BlogPost.d.ts.map +1 -0
  201. package/dist/esm/mdx/BlogPost.js +161 -0
  202. package/dist/esm/mdx/BlogPost.js.map +1 -0
  203. package/dist/esm/mdx/blog-post-collection.config.d.ts +139 -0
  204. package/dist/esm/mdx/blog-post-collection.config.d.ts.map +1 -0
  205. package/dist/esm/mdx/blog-post-collection.config.js +27 -0
  206. package/dist/esm/mdx/blog-post-collection.config.js.map +1 -0
  207. package/dist/esm/mdx/blog-post-frontmatter-source.d.ts +12 -0
  208. package/dist/esm/mdx/blog-post-frontmatter-source.d.ts.map +1 -0
  209. package/dist/esm/mdx/blog-post-frontmatter-source.js +13 -0
  210. package/dist/esm/mdx/blog-post-frontmatter-source.js.map +1 -0
  211. package/dist/esm/mdx/index.d.ts +22 -0
  212. package/dist/esm/mdx/index.d.ts.map +1 -0
  213. package/dist/esm/mdx/index.js +22 -0
  214. package/dist/esm/mdx/index.js.map +1 -0
  215. package/dist/esm/mdx/website-mdx-provider.d.ts +90 -0
  216. package/dist/esm/mdx/website-mdx-provider.d.ts.map +1 -0
  217. package/dist/esm/mdx/website-mdx-provider.js +8 -0
  218. package/dist/esm/mdx/website-mdx-provider.js.map +1 -0
  219. package/dist/esm/mdx.d.ts +38 -0
  220. package/dist/esm/mdx.d.ts.map +1 -0
  221. package/dist/esm/mdx.js +38 -0
  222. package/dist/esm/mdx.js.map +1 -0
  223. package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts +75 -0
  224. package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts.map +1 -0
  225. package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js +85 -0
  226. package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js.map +1 -0
  227. package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts +120 -0
  228. package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts.map +1 -0
  229. package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js +152 -0
  230. package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js.map +1 -0
  231. package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts +73 -0
  232. package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts.map +1 -0
  233. package/dist/esm/schemas/label-keys/website-label-key.schemas.js +76 -0
  234. package/dist/esm/schemas/label-keys/website-label-key.schemas.js.map +1 -0
  235. package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts +209 -0
  236. package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts.map +1 -0
  237. package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js +218 -0
  238. package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js.map +1 -0
  239. package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts +431 -0
  240. package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts.map +1 -0
  241. package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js +438 -0
  242. package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js.map +1 -0
  243. package/dist/esm/schemas/refs/page-ref.schemas.d.ts +40 -0
  244. package/dist/esm/schemas/refs/page-ref.schemas.d.ts.map +1 -0
  245. package/dist/esm/schemas/refs/page-ref.schemas.js +43 -0
  246. package/dist/esm/schemas/refs/page-ref.schemas.js.map +1 -0
  247. package/dist/esm/schemas/refs/section-ref.schemas.d.ts +41 -0
  248. package/dist/esm/schemas/refs/section-ref.schemas.d.ts.map +1 -0
  249. package/dist/esm/schemas/refs/section-ref.schemas.js +44 -0
  250. package/dist/esm/schemas/refs/section-ref.schemas.js.map +1 -0
  251. package/dist/esm/schemas/sections/website-section-category.shared.d.ts +63 -0
  252. package/dist/esm/schemas/sections/website-section-category.shared.d.ts.map +1 -0
  253. package/dist/esm/schemas/sections/website-section-category.shared.js +64 -0
  254. package/dist/esm/schemas/sections/website-section-category.shared.js.map +1 -0
  255. package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts +114 -0
  256. package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts.map +1 -0
  257. package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js +69 -0
  258. package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js.map +1 -0
  259. package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts +100 -0
  260. package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts.map +1 -0
  261. package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js +355 -0
  262. package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js.map +1 -0
  263. package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts +58 -0
  264. package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts.map +1 -0
  265. package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js +2 -0
  266. package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js.map +1 -0
  267. package/dist/esm/schemas/validators/label-pack.validator.d.ts +144 -0
  268. package/dist/esm/schemas/validators/label-pack.validator.d.ts.map +1 -0
  269. package/dist/esm/schemas/validators/label-pack.validator.js +100 -0
  270. package/dist/esm/schemas/validators/label-pack.validator.js.map +1 -0
  271. package/dist/tsconfig.build.tsbuildinfo +1 -0
  272. package/package.json +143 -0
  273. package/src/__tests__/bundle-isolation.test.ts +607 -0
  274. package/src/astro/__tests__/blog-post-bridge.test.tsx +288 -0
  275. package/src/astro/__tests__/blog-post-head.renderer.test.ts +249 -0
  276. package/src/astro/__tests__/bridge-runtime.test.tsx +198 -0
  277. package/src/astro/__tests__/collect-expected-label-keys.test.ts +69 -0
  278. package/src/astro/__tests__/headers-renderer.test.ts +143 -0
  279. package/src/astro/__tests__/i18n-routing.helper.test.ts +116 -0
  280. package/src/astro/__tests__/label-pack-loader.test.ts +305 -0
  281. package/src/astro/__tests__/llms-txt-server.test.ts +127 -0
  282. package/src/astro/__tests__/pick-labels-for-page.test.ts +60 -0
  283. package/src/astro/__tests__/robots-renderer.test.ts +228 -0
  284. package/src/astro/__tests__/sitemap-coverage.test.ts +230 -0
  285. package/src/astro/__tests__/structured-data.renderer.test.ts +172 -0
  286. package/src/astro/__tests__/website-page-head.renderer.test.ts +424 -0
  287. package/src/astro/__tests__/website-page-runtime.helper.test.ts +157 -0
  288. package/src/astro/__tests__/website-site-context.test.ts +121 -0
  289. package/src/astro/blog-post-bridge.tsx +404 -0
  290. package/src/astro/blog-post-head.renderer.ts +293 -0
  291. package/src/astro/bridge-runtime.tsx +270 -0
  292. package/src/astro/collect-expected-label-keys.ts +113 -0
  293. package/src/astro/headers-renderer.ts +82 -0
  294. package/src/astro/i18n-routing.helper.ts +116 -0
  295. package/src/astro/internal/html-escape.ts +41 -0
  296. package/src/astro/label-pack-loader.ts +385 -0
  297. package/src/astro/llms-txt-server.ts +56 -0
  298. package/src/astro/pick-labels-for-page.ts +85 -0
  299. package/src/astro/robots-renderer.ts +171 -0
  300. package/src/astro/sitemap-coverage.ts +186 -0
  301. package/src/astro/structured-data.renderer.ts +171 -0
  302. package/src/astro/website-page-head.renderer.ts +279 -0
  303. package/src/astro/website-page-runtime.helper.ts +188 -0
  304. package/src/astro/website-site-context.ts +136 -0
  305. package/src/astro-island.ts +61 -0
  306. package/src/astro.ts +151 -0
  307. package/src/companion-exports.ts +38 -0
  308. package/src/components/low-level/WebsiteButton.tsx +118 -0
  309. package/src/components/low-level/WebsiteHeading.tsx +96 -0
  310. package/src/components/low-level/WebsiteImage.tsx +96 -0
  311. package/src/components/low-level/WebsiteInternalButton.tsx +172 -0
  312. package/src/components/low-level/WebsiteInternalLink.tsx +193 -0
  313. package/src/components/low-level/WebsiteLink.tsx +71 -0
  314. package/src/components/low-level/WebsiteText.tsx +75 -0
  315. package/src/components/low-level/__tests__/WebsiteInternalButton.test.tsx +169 -0
  316. package/src/components/low-level/__tests__/WebsiteInternalLink.test.tsx +202 -0
  317. package/src/components/low-level/__tests__/primitives.test.tsx +141 -0
  318. package/src/config/__tests__/define-website-config.test.ts +231 -0
  319. package/src/config/__tests__/load-website-config.test.ts +215 -0
  320. package/src/config/define-website-config.ts +134 -0
  321. package/src/config/index.ts +38 -0
  322. package/src/config/load-website-config.ts +229 -0
  323. package/src/config/wildo-website-config.schemas.ts +322 -0
  324. package/src/config-loader.ts +35 -0
  325. package/src/core/__tests__/WebsitePageLayout.test.tsx +184 -0
  326. package/src/core/__tests__/WebsiteSection.test.tsx +85 -0
  327. package/src/core/__tests__/contexts.test.tsx +133 -0
  328. package/src/core/__tests__/core-boundary.test.ts +85 -0
  329. package/src/core/__tests__/define-website-page-manifest.test.tsx +111 -0
  330. package/src/core/__tests__/define-website-section.test.tsx +89 -0
  331. package/src/core/__tests__/useWebsiteDesignTokens.test.tsx +41 -0
  332. package/src/core/__tests__/useWebsiteLabel.test.tsx +117 -0
  333. package/src/core/anonymous-session/InboundContactForm.tsx +157 -0
  334. package/src/core/anonymous-session/__tests__/inbound-contact-form.schema.test.ts +44 -0
  335. package/src/core/anonymous-session/inbound-contact-form.schema.ts +62 -0
  336. package/src/core/anonymous-session/website-anonymous-session-client.ts +194 -0
  337. package/src/core/contexts/WebsitePageContext.tsx +52 -0
  338. package/src/core/contexts/WebsiteRuntimeContext.tsx +175 -0
  339. package/src/core/contexts/WebsiteSectionContext.tsx +59 -0
  340. package/src/core/contexts/useWebsitePage.ts +28 -0
  341. package/src/core/contexts/useWebsiteRuntime.ts +34 -0
  342. package/src/core/contexts/useWebsiteSection.ts +28 -0
  343. package/src/core/external-providers/frontend-provider-registry.website.ts +62 -0
  344. package/src/core/factories/define-website-page-manifest.ts +102 -0
  345. package/src/core/factories/define-website-section.ts +128 -0
  346. package/src/core/hooks/useWebsiteDesignTokens.ts +26 -0
  347. package/src/core/hooks/useWebsiteLabel.ts +121 -0
  348. package/src/core/layouts/WebsitePageLayout.tsx +311 -0
  349. package/src/core/layouts/WebsiteSection.tsx +139 -0
  350. package/src/core/routing/__tests__/internal-routing.utils.test.ts +134 -0
  351. package/src/core/routing/internal-routing.utils.ts +77 -0
  352. package/src/index.ts +132 -0
  353. package/src/mdx/BlogPost.tsx +296 -0
  354. package/src/mdx/__tests__/BlogPost.test.tsx +218 -0
  355. package/src/mdx/__tests__/blog-post-collection.config.test.ts +127 -0
  356. package/src/mdx/__tests__/website-mdx-provider.test.tsx +82 -0
  357. package/src/mdx/blog-post-collection.config.ts +177 -0
  358. package/src/mdx/blog-post-frontmatter-source.ts +31 -0
  359. package/src/mdx/index.ts +39 -0
  360. package/src/mdx/website-mdx-provider.tsx +95 -0
  361. package/src/mdx.ts +38 -0
  362. package/src/schemas/__tests__/blog-frontmatter.test.ts +50 -0
  363. package/src/schemas/__tests__/companion-exports-react-free.test.ts +51 -0
  364. package/src/schemas/__tests__/design-tokens.test.ts +163 -0
  365. package/src/schemas/__tests__/label-key.test.ts +46 -0
  366. package/src/schemas/__tests__/label-pack-validator.test.ts +146 -0
  367. package/src/schemas/__tests__/page-manifest.test.ts +66 -0
  368. package/src/schemas/__tests__/refs.test.ts +37 -0
  369. package/src/schemas/__tests__/root-config.test.ts +292 -0
  370. package/src/schemas/__tests__/section-definition.test.ts +47 -0
  371. package/src/schemas/__tests__/structured-data-reconciliation.test.ts +543 -0
  372. package/src/schemas/blog/blog-post-frontmatter.shared.schemas.ts +111 -0
  373. package/src/schemas/design-tokens/website-design-tokens.shared.schemas.ts +166 -0
  374. package/src/schemas/label-keys/website-label-key.schemas.ts +88 -0
  375. package/src/schemas/manifests/website-page-manifest.shared.schemas.ts +266 -0
  376. package/src/schemas/manifests/website-root-config.shared.schemas.ts +504 -0
  377. package/src/schemas/refs/page-ref.schemas.ts +49 -0
  378. package/src/schemas/refs/section-ref.schemas.ts +50 -0
  379. package/src/schemas/sections/website-section-category.shared.ts +65 -0
  380. package/src/schemas/sections/website-section-definition.shared.schemas.ts +120 -0
  381. package/src/schemas/structured-data/structured-data-reconciliation.shared.ts +579 -0
  382. package/src/schemas/structured-data/website-structured-data.shared.schemas.ts +62 -0
  383. package/src/schemas/validators/label-pack.validator.ts +201 -0
@@ -0,0 +1,126 @@
1
+ import type { WildoMarketingWebsiteConfig } from '../config/wildo-website-config.schemas';
2
+ import type { WebsiteRootConfig } from '../schemas/manifests/website-root-config.shared.schemas';
3
+ import type { FrontendProvidersBlock } from '@wildo-ai/saas-models/public-runtime';
4
+ /**
5
+ * @wildo_source:part:start saas.website.astro.site-context facet:layer:astro facet:family:website
6
+ *
7
+ * `WebsiteSiteContext` — the aggregated site-level inputs every Astro
8
+ * build-time engine helper consumes. Composes the consumer-authored
9
+ * `WebsiteRootConfig` (page registry, design tokens, navigation chrome,
10
+ * site-level SEO branding) with the per-service `WildoMarketingWebsiteConfig`
11
+ * loaded from `wildo.website.config.ts` (locales, default locale,
12
+ * public origin, future `appOrigin` cross-origin handoff target).
13
+ *
14
+ * # Why a dedicated aggregator type (vs. threading both raw configs)
15
+ *
16
+ * The seam-collapse (`saas-website-seam-collapse.md`, Option B) made
17
+ * `WildoMarketingWebsiteConfig` the SINGLE source of truth for the
18
+ * marketing-site routing surface (`defaultLocale`, `locales`,
19
+ * `publicOrigin`). Every engine helper that previously read those
20
+ * fields from `WebsiteRootConfig` now reads them from
21
+ * `WildoMarketingWebsiteConfig` — and four out of five of those helpers
22
+ * also still read OTHER fields from `WebsiteRootConfig` (page
23
+ * manifests, chrome label keys, design tokens, `seo.siteName`,
24
+ * `seo.defaultOgImageUrl`, `skipToMainContentLabelKey`). Threading
25
+ * both raw configs through every helper signature would:
26
+ *
27
+ * 1. **Bloat call sites.** Every consumer `.astro` file would have
28
+ * to import both `WEBSITE_ROOT_CONFIG` and the loaded
29
+ * `WILDO_WEBSITE_CONFIG`, then forward both to every helper.
30
+ * 2. **Spread the consumer-side composition responsibility.**
31
+ * Each `.astro` file would need to know which subset of the
32
+ * configs each helper consumes — a refactor hazard the next time
33
+ * we add a field that the head renderer reads from the website
34
+ * config but the runtime loader does not.
35
+ * 3. **Defeat top-level `await` ergonomics.** The website config
36
+ * load is async (`loadWebsiteConfig` does jiti-backed file I/O);
37
+ * forcing every `.astro` file to `await` it would either spread
38
+ * the await across every page or force every page to receive the
39
+ * already-loaded config from a separate consumer module —
40
+ * duplicating the composition logic this aggregator centralizes.
41
+ *
42
+ * One aggregator, composed once at the consumer's
43
+ * `<service-root>/src/website-site-context.ts`, is the minimum-blast
44
+ * shape: every engine helper takes `siteContext: WebsiteSiteContext`,
45
+ * every `.astro` file imports the singleton `WEBSITE_SITE_CONTEXT`
46
+ * once, and the next field move (consumer-config-only field, or
47
+ * root-config-only field) lands in this type's shape with no
48
+ * helper-signature ripple.
49
+ *
50
+ * # Why frozen (defensive)
51
+ *
52
+ * The composed value is shared across every page render in the build
53
+ * graph. A misbehaving Astro plugin (or a future consumer-side audit
54
+ * subprocess) that mutated either nested config in place would
55
+ * silently corrupt every subsequent page. `Object.freeze` is a cheap
56
+ * top-level guard — the inner configs are themselves already produced
57
+ * by Zod parsers (which return fresh objects), so mutating their
58
+ * fields would require a deliberate `as any` cast at the consumer's
59
+ * call site rather than an accidental in-place edit.
60
+ *
61
+ * # When this type WOULD grow
62
+ *
63
+ * Future inputs that are also "site-wide" but neither belong to
64
+ * `WebsiteRootConfig` (chrome-rendered) nor to
65
+ * `WildoMarketingWebsiteConfig` (per-service routing/origins) — e.g.
66
+ * a build-environment block (`production` / `preview` / `dev`), or
67
+ * a feature-flag bag — would land here as a third sibling field
68
+ * rather than being plumbed through every helper signature
69
+ * individually. The aggregator is the right place for that
70
+ * orchestration concern; per-call ergonomics ride along for free.
71
+ */
72
+ export interface WebsiteSiteContext {
73
+ /**
74
+ * The consumer's `WebsiteRootConfig` — page registry, design tokens,
75
+ * navigation chrome, site-level SEO branding (`siteName`,
76
+ * `defaultOgImageUrl?`), `chromeLabelKeys`,
77
+ * `skipToMainContentLabelKey`. Single source of truth for chrome
78
+ * + per-page meta declarations.
79
+ */
80
+ readonly rootConfig: WebsiteRootConfig;
81
+ /**
82
+ * The per-service `WildoMarketingWebsiteConfig` loaded from
83
+ * `wildo.website.config.ts`. Single source of truth for the
84
+ * marketing-site ROUTING + ORIGIN surface (`defaultLocale`,
85
+ * `locales`, `publicOrigin`, future `appOrigin`).
86
+ */
87
+ readonly websiteConfig: WildoMarketingWebsiteConfig;
88
+ /**
89
+ * Optional website-facing public provider block materialized from the
90
+ * app's provider graph for the concrete `STATIC_WEBSITE` service.
91
+ * Build-time only: the consumer loads it once and forwards it into the
92
+ * React island as JSON-serializable data.
93
+ */
94
+ readonly frontendProviders?: FrontendProvidersBlock;
95
+ }
96
+ /**
97
+ * Compose a `WebsiteSiteContext` from the two source configs. Pure +
98
+ * synchronous — the I/O happens upstream in `loadWebsiteConfig` and
99
+ * in the consumer's `WEBSITE_ROOT_CONFIG` module evaluation.
100
+ *
101
+ * **Defensive freezing**: the returned object is `Object.freeze`-d
102
+ * top-level so the singleton handed to every helper cannot have its
103
+ * `rootConfig` / `websiteConfig` references swapped in place by a
104
+ * misbehaving plugin. The nested configs are NOT deep-frozen — Zod
105
+ * already produces fresh objects per parse, and a deep freeze would
106
+ * cost a recursive walk per build for protection that no realistic
107
+ * plugin would breach.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * // examples/<app>/website/src/website-site-context.ts
112
+ * import { composeWebsiteSiteContext } from '@wildo-ai/saas-website/astro';
113
+ * import { loadWebsiteConfig } from '@wildo-ai/saas-website/config-loader';
114
+ *
115
+ * import { WEBSITE_ROOT_CONFIG } from './website-root.config';
116
+ *
117
+ * const websiteConfig = await loadWebsiteConfig({ saasRoot: '...' });
118
+ * export const WEBSITE_SITE_CONTEXT = composeWebsiteSiteContext({
119
+ * rootConfig: WEBSITE_ROOT_CONFIG,
120
+ * websiteConfig,
121
+ * });
122
+ * ```
123
+ */
124
+ export declare function composeWebsiteSiteContext(parts: WebsiteSiteContext): WebsiteSiteContext;
125
+ /** @wildo_source:part:end saas.website.astro.site-context */
126
+ //# sourceMappingURL=website-site-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-site-context.d.ts","sourceRoot":"","sources":["../../../../src/astro/website-site-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAC;AACjG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IAEvC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,2BAA2B,CAAC;IACpD;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GACxB,kBAAkB,CAMpB;AACD,6DAA6D"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Compose a `WebsiteSiteContext` from the two source configs. Pure +
3
+ * synchronous — the I/O happens upstream in `loadWebsiteConfig` and
4
+ * in the consumer's `WEBSITE_ROOT_CONFIG` module evaluation.
5
+ *
6
+ * **Defensive freezing**: the returned object is `Object.freeze`-d
7
+ * top-level so the singleton handed to every helper cannot have its
8
+ * `rootConfig` / `websiteConfig` references swapped in place by a
9
+ * misbehaving plugin. The nested configs are NOT deep-frozen — Zod
10
+ * already produces fresh objects per parse, and a deep freeze would
11
+ * cost a recursive walk per build for protection that no realistic
12
+ * plugin would breach.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // examples/<app>/website/src/website-site-context.ts
17
+ * import { composeWebsiteSiteContext } from '@wildo-ai/saas-website/astro';
18
+ * import { loadWebsiteConfig } from '@wildo-ai/saas-website/config-loader';
19
+ *
20
+ * import { WEBSITE_ROOT_CONFIG } from './website-root.config.js';
21
+ *
22
+ * const websiteConfig = await loadWebsiteConfig({ saasRoot: '...' });
23
+ * export const WEBSITE_SITE_CONTEXT = composeWebsiteSiteContext({
24
+ * rootConfig: WEBSITE_ROOT_CONFIG,
25
+ * websiteConfig,
26
+ * });
27
+ * ```
28
+ */
29
+ export function composeWebsiteSiteContext(parts) {
30
+ return Object.freeze({
31
+ rootConfig: parts.rootConfig,
32
+ websiteConfig: parts.websiteConfig,
33
+ frontendProviders: parts.frontendProviders,
34
+ });
35
+ }
36
+ /** @wildo_source:part:end saas.website.astro.site-context */
37
+ //# sourceMappingURL=website-site-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-site-context.js","sourceRoot":"","sources":["../../../../src/astro/website-site-context.ts"],"names":[],"mappings":"AAkGA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAyB;IAEzB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;KAC3C,CAAC,CAAC;AACL,CAAC;AACD,6DAA6D","sourcesContent":["import type { WildoMarketingWebsiteConfig } from '../config/wildo-website-config.schemas';\nimport type { WebsiteRootConfig } from '../schemas/manifests/website-root-config.shared.schemas';\nimport type { FrontendProvidersBlock } from '@wildo-ai/saas-models/public-runtime';\n\n/**\n * @wildo_source:part:start saas.website.astro.site-context facet:layer:astro facet:family:website\n *\n * `WebsiteSiteContext` — the aggregated site-level inputs every Astro\n * build-time engine helper consumes. Composes the consumer-authored\n * `WebsiteRootConfig` (page registry, design tokens, navigation chrome,\n * site-level SEO branding) with the per-service `WildoMarketingWebsiteConfig`\n * loaded from `wildo.website.config.ts` (locales, default locale,\n * public origin, future `appOrigin` cross-origin handoff target).\n *\n * # Why a dedicated aggregator type (vs. threading both raw configs)\n *\n * The seam-collapse (`saas-website-seam-collapse.md`, Option B) made\n * `WildoMarketingWebsiteConfig` the SINGLE source of truth for the\n * marketing-site routing surface (`defaultLocale`, `locales`,\n * `publicOrigin`). Every engine helper that previously read those\n * fields from `WebsiteRootConfig` now reads them from\n * `WildoMarketingWebsiteConfig` — and four out of five of those helpers\n * also still read OTHER fields from `WebsiteRootConfig` (page\n * manifests, chrome label keys, design tokens, `seo.siteName`,\n * `seo.defaultOgImageUrl`, `skipToMainContentLabelKey`). Threading\n * both raw configs through every helper signature would:\n *\n * 1. **Bloat call sites.** Every consumer `.astro` file would have\n * to import both `WEBSITE_ROOT_CONFIG` and the loaded\n * `WILDO_WEBSITE_CONFIG`, then forward both to every helper.\n * 2. **Spread the consumer-side composition responsibility.**\n * Each `.astro` file would need to know which subset of the\n * configs each helper consumes — a refactor hazard the next time\n * we add a field that the head renderer reads from the website\n * config but the runtime loader does not.\n * 3. **Defeat top-level `await` ergonomics.** The website config\n * load is async (`loadWebsiteConfig` does jiti-backed file I/O);\n * forcing every `.astro` file to `await` it would either spread\n * the await across every page or force every page to receive the\n * already-loaded config from a separate consumer module —\n * duplicating the composition logic this aggregator centralizes.\n *\n * One aggregator, composed once at the consumer's\n * `<service-root>/src/website-site-context.ts`, is the minimum-blast\n * shape: every engine helper takes `siteContext: WebsiteSiteContext`,\n * every `.astro` file imports the singleton `WEBSITE_SITE_CONTEXT`\n * once, and the next field move (consumer-config-only field, or\n * root-config-only field) lands in this type's shape with no\n * helper-signature ripple.\n *\n * # Why frozen (defensive)\n *\n * The composed value is shared across every page render in the build\n * graph. A misbehaving Astro plugin (or a future consumer-side audit\n * subprocess) that mutated either nested config in place would\n * silently corrupt every subsequent page. `Object.freeze` is a cheap\n * top-level guard — the inner configs are themselves already produced\n * by Zod parsers (which return fresh objects), so mutating their\n * fields would require a deliberate `as any` cast at the consumer's\n * call site rather than an accidental in-place edit.\n *\n * # When this type WOULD grow\n *\n * Future inputs that are also \"site-wide\" but neither belong to\n * `WebsiteRootConfig` (chrome-rendered) nor to\n * `WildoMarketingWebsiteConfig` (per-service routing/origins) — e.g.\n * a build-environment block (`production` / `preview` / `dev`), or\n * a feature-flag bag — would land here as a third sibling field\n * rather than being plumbed through every helper signature\n * individually. The aggregator is the right place for that\n * orchestration concern; per-call ergonomics ride along for free.\n */\nexport interface WebsiteSiteContext {\n /**\n * The consumer's `WebsiteRootConfig` — page registry, design tokens,\n * navigation chrome, site-level SEO branding (`siteName`,\n * `defaultOgImageUrl?`), `chromeLabelKeys`,\n * `skipToMainContentLabelKey`. Single source of truth for chrome\n * + per-page meta declarations.\n */\n readonly rootConfig: WebsiteRootConfig;\n\n /**\n * The per-service `WildoMarketingWebsiteConfig` loaded from\n * `wildo.website.config.ts`. Single source of truth for the\n * marketing-site ROUTING + ORIGIN surface (`defaultLocale`,\n * `locales`, `publicOrigin`, future `appOrigin`).\n */\n readonly websiteConfig: WildoMarketingWebsiteConfig;\n /**\n * Optional website-facing public provider block materialized from the\n * app's provider graph for the concrete `STATIC_WEBSITE` service.\n * Build-time only: the consumer loads it once and forwards it into the\n * React island as JSON-serializable data.\n */\n readonly frontendProviders?: FrontendProvidersBlock;\n}\n\n/**\n * Compose a `WebsiteSiteContext` from the two source configs. Pure +\n * synchronous — the I/O happens upstream in `loadWebsiteConfig` and\n * in the consumer's `WEBSITE_ROOT_CONFIG` module evaluation.\n *\n * **Defensive freezing**: the returned object is `Object.freeze`-d\n * top-level so the singleton handed to every helper cannot have its\n * `rootConfig` / `websiteConfig` references swapped in place by a\n * misbehaving plugin. The nested configs are NOT deep-frozen — Zod\n * already produces fresh objects per parse, and a deep freeze would\n * cost a recursive walk per build for protection that no realistic\n * plugin would breach.\n *\n * @example\n * ```ts\n * // examples/<app>/website/src/website-site-context.ts\n * import { composeWebsiteSiteContext } from '@wildo-ai/saas-website/astro';\n * import { loadWebsiteConfig } from '@wildo-ai/saas-website/config-loader';\n *\n * import { WEBSITE_ROOT_CONFIG } from './website-root.config';\n *\n * const websiteConfig = await loadWebsiteConfig({ saasRoot: '...' });\n * export const WEBSITE_SITE_CONTEXT = composeWebsiteSiteContext({\n * rootConfig: WEBSITE_ROOT_CONFIG,\n * websiteConfig,\n * });\n * ```\n */\nexport function composeWebsiteSiteContext(\n parts: WebsiteSiteContext,\n): WebsiteSiteContext {\n return Object.freeze({\n rootConfig: parts.rootConfig,\n websiteConfig: parts.websiteConfig,\n frontendProviders: parts.frontendProviders,\n });\n}\n/** @wildo_source:part:end saas.website.astro.site-context */\n"]}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @wildo-package @wildo-ai/saas-website (astro client-island sub-entry)
3
+ *
4
+ * Astro / React **client-island** sub-entry. This entry exposes ONLY
5
+ * `createWebsitePageBridgeIsland(...)` — the closure-based factory a
6
+ * consumer's per-page `*.bridge.tsx` module imports to mint the React
7
+ * island that an `.astro` page will hydrate with `client:idle` /
8
+ * `client:load`.
9
+ *
10
+ * **Why a dedicated subpath instead of folding into `./astro`**:
11
+ * Vite (Astro's bundler) must be able to follow every `import` from
12
+ * a client-bound module to a fully-resolvable browser graph. The
13
+ * `./astro` barrel re-exports Node-only helpers (`label-pack-loader`,
14
+ * `website-page-runtime.helper`, `website-page-head.renderer`, etc.)
15
+ * via `export *`, which forces Vite to RESOLVE `node:fs` / `node:path`
16
+ * for the client bundle even when the consumer only imports the
17
+ * bridge factory. Resolution happens BEFORE tree-shaking, so the
18
+ * unused Node imports surface as hard build errors
19
+ * (`"resolve" is not exported by "__vite-browser-external"`). Splitting
20
+ * the bridge factory into this dedicated entry keeps the client-side
21
+ * import graph 100% bundle-clean — Vite never has to resolve any
22
+ * Node specifier when following the consumer's `*.bridge.tsx` graph.
23
+ *
24
+ * @wildo-boundary
25
+ * Strictly client-bundle-safe. MAY import:
26
+ * - `react`, `react-dom`
27
+ * - peer-shared shape modules from `@wildo-ai/saas-models/public-runtime`
28
+ * - the framework's React layout / context modules (themselves bundle-clean)
29
+ * MUST NOT import:
30
+ * - `node:*` (any Node built-in)
31
+ * - `fs`, `path`, or any filesystem / process helper
32
+ * - the Astro runtime (`astro` package, `astro:*` virtual modules)
33
+ * - SSR-tier specifiers (`axios`, `jsonwebtoken`, `socket.io-client`, …)
34
+ *
35
+ * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`
36
+ * which walks `astro-island.ts` as one of `ENTRY_FILES` and runs a
37
+ * targeted negative test that `node:fs` / `node:path` are NOT
38
+ * reachable from this entry.
39
+ */
40
+ export * from './astro/bridge-runtime';
41
+ /**
42
+ * The marketing-blog adapter's per-locale bridge factory
43
+ * (`createWebsiteBlogPostBridgeIsland`) is DELIBERATELY NOT re-exported
44
+ * here, even though it lives beside `bridge-runtime.tsx` and follows the
45
+ * same closure-over-deps pattern. It hard-imports `../mdx/BlogPost`,
46
+ * whose `@mdx-js/react` peer is declared OPTIONAL — re-exporting it from
47
+ * this entry (the mandatory per-page bridge surface every marketing site
48
+ * consumes) made that optional peer a de-facto install requirement for
49
+ * every NON-blog site: Vite resolves the whole `export *` graph before
50
+ * tree-shaking, so a landing-page-only build failed on the unresolved
51
+ * `@mdx-js/react` specifier. Blog consumers import the factory from
52
+ * `@wildo-ai/saas-website/mdx` (the blog adapter's own entry) instead.
53
+ * Pinned by the "@mdx-js/react reaches the closure ONLY through mdx.ts"
54
+ * test in `__tests__/bundle-isolation.test.ts`.
55
+ */
56
+ //# sourceMappingURL=astro-island.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-island.d.ts","sourceRoot":"","sources":["../../../src/astro-island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAOH,cAAc,wBAAwB,CAAC;AACvC;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @wildo-package @wildo-ai/saas-website (astro client-island sub-entry)
3
+ *
4
+ * Astro / React **client-island** sub-entry. This entry exposes ONLY
5
+ * `createWebsitePageBridgeIsland(...)` — the closure-based factory a
6
+ * consumer's per-page `*.bridge.tsx` module imports to mint the React
7
+ * island that an `.astro` page will hydrate with `client:idle` /
8
+ * `client:load`.
9
+ *
10
+ * **Why a dedicated subpath instead of folding into `./astro`**:
11
+ * Vite (Astro's bundler) must be able to follow every `import` from
12
+ * a client-bound module to a fully-resolvable browser graph. The
13
+ * `./astro` barrel re-exports Node-only helpers (`label-pack-loader`,
14
+ * `website-page-runtime.helper`, `website-page-head.renderer`, etc.)
15
+ * via `export *`, which forces Vite to RESOLVE `node:fs` / `node:path`
16
+ * for the client bundle even when the consumer only imports the
17
+ * bridge factory. Resolution happens BEFORE tree-shaking, so the
18
+ * unused Node imports surface as hard build errors
19
+ * (`"resolve" is not exported by "__vite-browser-external"`). Splitting
20
+ * the bridge factory into this dedicated entry keeps the client-side
21
+ * import graph 100% bundle-clean — Vite never has to resolve any
22
+ * Node specifier when following the consumer's `*.bridge.tsx` graph.
23
+ *
24
+ * @wildo-boundary
25
+ * Strictly client-bundle-safe. MAY import:
26
+ * - `react`, `react-dom`
27
+ * - peer-shared shape modules from `@wildo-ai/saas-models/public-runtime`
28
+ * - the framework's React layout / context modules (themselves bundle-clean)
29
+ * MUST NOT import:
30
+ * - `node:*` (any Node built-in)
31
+ * - `fs`, `path`, or any filesystem / process helper
32
+ * - the Astro runtime (`astro` package, `astro:*` virtual modules)
33
+ * - SSR-tier specifiers (`axios`, `jsonwebtoken`, `socket.io-client`, …)
34
+ *
35
+ * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`
36
+ * which walks `astro-island.ts` as one of `ENTRY_FILES` and runs a
37
+ * targeted negative test that `node:fs` / `node:path` are NOT
38
+ * reachable from this entry.
39
+ */
40
+ // entrypoint-waiver: this subpath is a BUNDLE-TIER boundary (the client-island entry Vite must be
41
+ // able to resolve without any Node specifier — see the rationale above), not a file alias. It
42
+ // re-exports a single module only since the blog bridge deliberately moved behind ./mdx to keep the
43
+ // optional @mdx-js/react peer off non-blog consumers; the tier boundary itself is load-bearing and
44
+ // walked as its own entry by the bundle-isolation test.
45
+ export * from './astro/bridge-runtime.js';
46
+ /**
47
+ * The marketing-blog adapter's per-locale bridge factory
48
+ * (`createWebsiteBlogPostBridgeIsland`) is DELIBERATELY NOT re-exported
49
+ * here, even though it lives beside `bridge-runtime.tsx` and follows the
50
+ * same closure-over-deps pattern. It hard-imports `../mdx/BlogPost`,
51
+ * whose `@mdx-js/react` peer is declared OPTIONAL — re-exporting it from
52
+ * this entry (the mandatory per-page bridge surface every marketing site
53
+ * consumes) made that optional peer a de-facto install requirement for
54
+ * every NON-blog site: Vite resolves the whole `export *` graph before
55
+ * tree-shaking, so a landing-page-only build failed on the unresolved
56
+ * `@mdx-js/react` specifier. Blog consumers import the factory from
57
+ * `@wildo-ai/saas-website/mdx` (the blog adapter's own entry) instead.
58
+ * Pinned by the "@mdx-js/react reaches the closure ONLY through mdx.ts"
59
+ * test in `__tests__/bundle-isolation.test.ts`.
60
+ */
61
+ //# sourceMappingURL=astro-island.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-island.js","sourceRoot":"","sources":["../../../src/astro-island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,kGAAkG;AAClG,8FAA8F;AAC9F,oGAAoG;AACpG,mGAAmG;AACnG,wDAAwD;AAExD,cAAc,wBAAwB,CAAC;AACvC;;;;;;;;;;;;;;GAcG","sourcesContent":["/**\n * @wildo-package @wildo-ai/saas-website (astro client-island sub-entry)\n *\n * Astro / React **client-island** sub-entry. This entry exposes ONLY\n * `createWebsitePageBridgeIsland(...)` — the closure-based factory a\n * consumer's per-page `*.bridge.tsx` module imports to mint the React\n * island that an `.astro` page will hydrate with `client:idle` /\n * `client:load`.\n *\n * **Why a dedicated subpath instead of folding into `./astro`**:\n * Vite (Astro's bundler) must be able to follow every `import` from\n * a client-bound module to a fully-resolvable browser graph. The\n * `./astro` barrel re-exports Node-only helpers (`label-pack-loader`,\n * `website-page-runtime.helper`, `website-page-head.renderer`, etc.)\n * via `export *`, which forces Vite to RESOLVE `node:fs` / `node:path`\n * for the client bundle even when the consumer only imports the\n * bridge factory. Resolution happens BEFORE tree-shaking, so the\n * unused Node imports surface as hard build errors\n * (`\"resolve\" is not exported by \"__vite-browser-external\"`). Splitting\n * the bridge factory into this dedicated entry keeps the client-side\n * import graph 100% bundle-clean — Vite never has to resolve any\n * Node specifier when following the consumer's `*.bridge.tsx` graph.\n *\n * @wildo-boundary\n * Strictly client-bundle-safe. MAY import:\n * - `react`, `react-dom`\n * - peer-shared shape modules from `@wildo-ai/saas-models/public-runtime`\n * - the framework's React layout / context modules (themselves bundle-clean)\n * MUST NOT import:\n * - `node:*` (any Node built-in)\n * - `fs`, `path`, or any filesystem / process helper\n * - the Astro runtime (`astro` package, `astro:*` virtual modules)\n * - SSR-tier specifiers (`axios`, `jsonwebtoken`, `socket.io-client`, …)\n *\n * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`\n * which walks `astro-island.ts` as one of `ENTRY_FILES` and runs a\n * targeted negative test that `node:fs` / `node:path` are NOT\n * reachable from this entry.\n */\n// entrypoint-waiver: this subpath is a BUNDLE-TIER boundary (the client-island entry Vite must be\n// able to resolve without any Node specifier — see the rationale above), not a file alias. It\n// re-exports a single module only since the blog bridge deliberately moved behind ./mdx to keep the\n// optional @mdx-js/react peer off non-blog consumers; the tier boundary itself is load-bearing and\n// walked as its own entry by the bundle-isolation test.\n\nexport * from './astro/bridge-runtime';\n/**\n * The marketing-blog adapter's per-locale bridge factory\n * (`createWebsiteBlogPostBridgeIsland`) is DELIBERATELY NOT re-exported\n * here, even though it lives beside `bridge-runtime.tsx` and follows the\n * same closure-over-deps pattern. It hard-imports `../mdx/BlogPost`,\n * whose `@mdx-js/react` peer is declared OPTIONAL — re-exporting it from\n * this entry (the mandatory per-page bridge surface every marketing site\n * consumes) made that optional peer a de-facto install requirement for\n * every NON-blog site: Vite resolves the whole `export *` graph before\n * tree-shaking, so a landing-page-only build failed on the unresolved\n * `@mdx-js/react` specifier. Blog consumers import the factory from\n * `@wildo-ai/saas-website/mdx` (the blog adapter's own entry) instead.\n * Pinned by the \"@mdx-js/react reaches the closure ONLY through mdx.ts\"\n * test in `__tests__/bundle-isolation.test.ts`.\n */\n"]}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @wildo-package @wildo-ai/saas-website (astro adapter SSR/frontmatter entry)
3
+ *
4
+ * Astro **frontmatter / SSR** sub-entry. Re-exports the TypeScript
5
+ * helpers a consumer's per-page `.astro` files consume INSIDE
6
+ * frontmatter to render a marketing-site page (locale resolution,
7
+ * label-pack loading, `<head>` HTML rendering, design-token CSS
8
+ * rendering, i18n routing config, expected-label-key collection).
9
+ *
10
+ * **The `createWebsitePageBridgeIsland` factory lives in a SEPARATE
11
+ * subpath — `@wildo-ai/saas-website/astro-island`** — and is NOT
12
+ * re-exported here. The split exists because the consumer's per-page
13
+ * `*.bridge.tsx` module is bundled into BOTH the SSR graph (via the
14
+ * `.astro` page that statically imports it) AND the client graph
15
+ * (Astro's hydration pipeline). Re-exporting the bridge factory
16
+ * alongside the Node-using helpers here would force Vite to resolve
17
+ * `node:fs` / `node:path` for the client bundle even though
18
+ * tree-shaking would later drop them — resolution happens BEFORE
19
+ * tree-shaking, so the build hard-fails with
20
+ * `"resolve" is not exported by "__vite-browser-external"`. The
21
+ * dedicated `astro-island` subpath keeps the client import graph
22
+ * 100% bundle-clean.
23
+ *
24
+ * **No `.astro` shell shipped.** The Phase-5 redesign deliberately
25
+ * removed the previously-planned `WebsitePageBridge.astro` shell
26
+ * because:
27
+ * 1. A `.astro` file cannot be re-exported from a TS subpath barrel
28
+ * and `tsc` does not copy non-TS files to `dist/`, so the shell
29
+ * was unreachable from `@wildo-ai/saas-website/astro`.
30
+ * 2. The shell would have had to pass `pageComponent` /
31
+ * `headerComponent` / `footerComponent` (`ComponentType` refs)
32
+ * as React-island props — Astro's `devalue`-style island prop
33
+ * serialization cannot transport function values, so hydration
34
+ * would have mismatched on first interaction.
35
+ * Both failure modes are sidestepped by giving consumers two
36
+ * primitive-string-only TS helpers (`renderWebsitePageHeadHtml`,
37
+ * `renderWebsiteDesignTokensCss`) for the Astro-side `<head>` work
38
+ * and a closure-based island factory (`createWebsitePageBridgeIsland`,
39
+ * exported from `@wildo-ai/saas-website/astro-island`) for the
40
+ * React-island side. The consumer authors a thin per-page `.astro`
41
+ * file that statically imports the per-page bridge island — Astro's
42
+ * compiler then resolves the `client:*` directive against a static
43
+ * module export, which is the only pattern that makes Astro's
44
+ * hydration bundling work correctly. See `bridge-runtime.tsx`'s
45
+ * file-level JSDoc for the full rationale.
46
+ *
47
+ * @wildo-boundary
48
+ * This entry is on the SSR / Astro-build-time side of the bundle
49
+ * boundary (D12 second loosening). It MAY import:
50
+ * - `node:fs`, `node:path` (label-pack-loader, runtime-helper)
51
+ * It MUST NOT import:
52
+ * - the bridge-runtime module — that module ships into the
53
+ * client island bundle and is exposed via the
54
+ * `@wildo-ai/saas-website/astro-island` subpath instead.
55
+ * - the Astro runtime (`astro` package, `astro:*` virtual modules)
56
+ * — those live exclusively inside `.astro` files. Adding
57
+ * `astro` here would make the engine package unimportable
58
+ * from any context that does not boot the Astro compiler
59
+ * (Vitest tests, the `wildo website audit` CLI, companion
60
+ * subprocesses).
61
+ *
62
+ * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`
63
+ * which walks `astro.ts` as one of `ENTRY_FILES` AND runs a targeted
64
+ * negative test that `node:fs` / `node:path` are reachable from
65
+ * `astro.ts` ONLY — never from `index.ts`, `companion-exports.ts`,
66
+ * or `astro-island.ts`.
67
+ */
68
+ export * from './astro/website-site-context';
69
+ export * from './astro/i18n-routing.helper';
70
+ export * from './astro/collect-expected-label-keys';
71
+ export * from './astro/label-pack-loader';
72
+ /**
73
+ * `pick-labels-for-page` is INTENTIONALLY NOT re-exported here.
74
+ * It is an internal helper consumed only by `loadWebsitePageRuntime`
75
+ * (which IS exported via the runtime helper below). Exposing it as a
76
+ * public sub-entry surface would (a) invite consumers to call it
77
+ * directly from `.astro` frontmatter — which they should never do
78
+ * (the runtime helper already wires the slicing transparently), and
79
+ * (b) lock the engine into an extra public API the audit step would
80
+ * have to keep stable. Tests import the helper via its relative
81
+ * path, which keeps the behavior covered without leaking the surface.
82
+ * (Phase 6 audit fix M-B.)
83
+ */
84
+ export * from './astro/website-page-runtime.helper';
85
+ export * from './astro/website-page-head.renderer';
86
+ export * from './astro/structured-data.renderer';
87
+ /**
88
+ * Phase 7 — sibling head renderer for blog posts. Reads from a
89
+ * validated `BlogPostFrontmatter` instead of the page manifest's
90
+ * `metaLabelKeys`; emits `og:type=article` plus the
91
+ * `article:published_time` / `article:author` / `article:tag` lines
92
+ * the OG "article" vertical requires. See the renderer file's
93
+ * preamble for why this is a sibling rather than a flag on
94
+ * `renderWebsitePageHeadHtml`.
95
+ */
96
+ export * from './astro/blog-post-head.renderer';
97
+ /**
98
+ * Phase 8 close-out — `renderRobotsTxt(siteContext)` pure string
99
+ * builder for the marketing site's `robots.txt` body. Sibling of
100
+ * `renderWebsitePageHeadHtml` (same Astro-frontmatter consumption
101
+ * shape: pure TypeScript, no Astro runtime dependency, vitest-
102
+ * friendly). See `engine/saas-website/src/astro/robots-renderer.ts`
103
+ * for the field-by-field rationale and
104
+ * `.cursor/plans/saas-website-seo-sitemap.md` for the slice context.
105
+ */
106
+ export * from './astro/robots-renderer';
107
+ /**
108
+ * Phase 8 close-out — `enumerateMarketingPageSitemapUrls(siteContext)`
109
+ * pure helper that returns every (page-manifest × locale) absolute
110
+ * URL the marketing site's sitemap MUST advertise, paired with its
111
+ * hreflang alternates. Two consumption surfaces:
112
+ *
113
+ * 1. Vitest enforcement — a regression that drops a manifest-
114
+ * registered route fails fast in unit tests, well before
115
+ * `astro build` would surface it.
116
+ * 2. `@astrojs/sitemap` `customPages` integration — when the
117
+ * consumer needs to surface routes Astro's file-based router
118
+ * cannot auto-discover (data-driven landing variants, etc.),
119
+ * this helper computes the canonical URL list to spread into
120
+ * the plugin config.
121
+ *
122
+ * See `engine/saas-website/src/astro/sitemap-coverage.ts` and
123
+ * `.cursor/plans/saas-website-seo-sitemap.md` for the full
124
+ * rationale + scope boundary.
125
+ */
126
+ export * from './astro/sitemap-coverage';
127
+ /**
128
+ * AEO — `renderPageStructuredData(opts)` pure string builder that
129
+ * collects every section's `getStructuredData()` (when present),
130
+ * dedupes by `@id`, and emits one
131
+ * `<script type="application/ld+json">` block per surviving payload.
132
+ * Sibling of `renderWebsitePageHeadHtml` (same pure-TS, vitest-
133
+ * friendly contract). See
134
+ * `engine/saas-website/src/astro/structured-data.renderer.ts`
135
+ * for the safety + dedupe semantics and
136
+ * `.cursor/plans/saas-website-aeo-geo.md` for the slice context.
137
+ */
138
+ export * from './astro/structured-data.renderer';
139
+ export * from './astro/headers-renderer';
140
+ export * from './astro/llms-txt-server';
141
+ /**
142
+ * AEO — runtime payload type (`WebsiteStructuredDataPayload`) and
143
+ * convenience return-shape union (`WebsiteStructuredDataReturn`)
144
+ * the section author imports to type their `getStructuredData()`.
145
+ * Defined locally in `saas-website` (not in `saas-specifications`)
146
+ * because the runtime engine cannot depend on the spec layer; the
147
+ * companion catalog at `_catalogs/schema-org/` describes the same
148
+ * vocabulary at the COMPANION layer.
149
+ */
150
+ export * from './schemas/structured-data/website-structured-data.shared.schemas';
151
+ //# sourceMappingURL=astro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../../../src/astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C;;;;;;;;;;;GAWG;AACH,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD;;;;;;;;GAQG;AACH,cAAc,iCAAiC,CAAC;AAChD;;;;;;;;GAQG;AACH,cAAc,yBAAyB,CAAC;AACxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,cAAc,0BAA0B,CAAC;AACzC;;;;;;;;;;GAUG;AACH,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC;;;;;;;;GAQG;AACH,cAAc,kEAAkE,CAAC"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @wildo-package @wildo-ai/saas-website (astro adapter SSR/frontmatter entry)
3
+ *
4
+ * Astro **frontmatter / SSR** sub-entry. Re-exports the TypeScript
5
+ * helpers a consumer's per-page `.astro` files consume INSIDE
6
+ * frontmatter to render a marketing-site page (locale resolution,
7
+ * label-pack loading, `<head>` HTML rendering, design-token CSS
8
+ * rendering, i18n routing config, expected-label-key collection).
9
+ *
10
+ * **The `createWebsitePageBridgeIsland` factory lives in a SEPARATE
11
+ * subpath — `@wildo-ai/saas-website/astro-island`** — and is NOT
12
+ * re-exported here. The split exists because the consumer's per-page
13
+ * `*.bridge.tsx` module is bundled into BOTH the SSR graph (via the
14
+ * `.astro` page that statically imports it) AND the client graph
15
+ * (Astro's hydration pipeline). Re-exporting the bridge factory
16
+ * alongside the Node-using helpers here would force Vite to resolve
17
+ * `node:fs` / `node:path` for the client bundle even though
18
+ * tree-shaking would later drop them — resolution happens BEFORE
19
+ * tree-shaking, so the build hard-fails with
20
+ * `"resolve" is not exported by "__vite-browser-external"`. The
21
+ * dedicated `astro-island` subpath keeps the client import graph
22
+ * 100% bundle-clean.
23
+ *
24
+ * **No `.astro` shell shipped.** The Phase-5 redesign deliberately
25
+ * removed the previously-planned `WebsitePageBridge.astro` shell
26
+ * because:
27
+ * 1. A `.astro` file cannot be re-exported from a TS subpath barrel
28
+ * and `tsc` does not copy non-TS files to `dist/`, so the shell
29
+ * was unreachable from `@wildo-ai/saas-website/astro`.
30
+ * 2. The shell would have had to pass `pageComponent` /
31
+ * `headerComponent` / `footerComponent` (`ComponentType` refs)
32
+ * as React-island props — Astro's `devalue`-style island prop
33
+ * serialization cannot transport function values, so hydration
34
+ * would have mismatched on first interaction.
35
+ * Both failure modes are sidestepped by giving consumers two
36
+ * primitive-string-only TS helpers (`renderWebsitePageHeadHtml`,
37
+ * `renderWebsiteDesignTokensCss`) for the Astro-side `<head>` work
38
+ * and a closure-based island factory (`createWebsitePageBridgeIsland`,
39
+ * exported from `@wildo-ai/saas-website/astro-island`) for the
40
+ * React-island side. The consumer authors a thin per-page `.astro`
41
+ * file that statically imports the per-page bridge island — Astro's
42
+ * compiler then resolves the `client:*` directive against a static
43
+ * module export, which is the only pattern that makes Astro's
44
+ * hydration bundling work correctly. See `bridge-runtime.tsx`'s
45
+ * file-level JSDoc for the full rationale.
46
+ *
47
+ * @wildo-boundary
48
+ * This entry is on the SSR / Astro-build-time side of the bundle
49
+ * boundary (D12 second loosening). It MAY import:
50
+ * - `node:fs`, `node:path` (label-pack-loader, runtime-helper)
51
+ * It MUST NOT import:
52
+ * - the bridge-runtime module — that module ships into the
53
+ * client island bundle and is exposed via the
54
+ * `@wildo-ai/saas-website/astro-island` subpath instead.
55
+ * - the Astro runtime (`astro` package, `astro:*` virtual modules)
56
+ * — those live exclusively inside `.astro` files. Adding
57
+ * `astro` here would make the engine package unimportable
58
+ * from any context that does not boot the Astro compiler
59
+ * (Vitest tests, the `wildo website audit` CLI, companion
60
+ * subprocesses).
61
+ *
62
+ * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`
63
+ * which walks `astro.ts` as one of `ENTRY_FILES` AND runs a targeted
64
+ * negative test that `node:fs` / `node:path` are reachable from
65
+ * `astro.ts` ONLY — never from `index.ts`, `companion-exports.ts`,
66
+ * or `astro-island.ts`.
67
+ */
68
+ export * from './astro/website-site-context.js';
69
+ export * from './astro/i18n-routing.helper.js';
70
+ export * from './astro/collect-expected-label-keys.js';
71
+ export * from './astro/label-pack-loader.js';
72
+ /**
73
+ * `pick-labels-for-page` is INTENTIONALLY NOT re-exported here.
74
+ * It is an internal helper consumed only by `loadWebsitePageRuntime`
75
+ * (which IS exported via the runtime helper below). Exposing it as a
76
+ * public sub-entry surface would (a) invite consumers to call it
77
+ * directly from `.astro` frontmatter — which they should never do
78
+ * (the runtime helper already wires the slicing transparently), and
79
+ * (b) lock the engine into an extra public API the audit step would
80
+ * have to keep stable. Tests import the helper via its relative
81
+ * path, which keeps the behavior covered without leaking the surface.
82
+ * (Phase 6 audit fix M-B.)
83
+ */
84
+ export * from './astro/website-page-runtime.helper.js';
85
+ export * from './astro/website-page-head.renderer.js';
86
+ export * from './astro/structured-data.renderer.js';
87
+ /**
88
+ * Phase 7 — sibling head renderer for blog posts. Reads from a
89
+ * validated `BlogPostFrontmatter` instead of the page manifest's
90
+ * `metaLabelKeys`; emits `og:type=article` plus the
91
+ * `article:published_time` / `article:author` / `article:tag` lines
92
+ * the OG "article" vertical requires. See the renderer file's
93
+ * preamble for why this is a sibling rather than a flag on
94
+ * `renderWebsitePageHeadHtml`.
95
+ */
96
+ export * from './astro/blog-post-head.renderer.js';
97
+ /**
98
+ * Phase 8 close-out — `renderRobotsTxt(siteContext)` pure string
99
+ * builder for the marketing site's `robots.txt` body. Sibling of
100
+ * `renderWebsitePageHeadHtml` (same Astro-frontmatter consumption
101
+ * shape: pure TypeScript, no Astro runtime dependency, vitest-
102
+ * friendly). See `engine/saas-website/src/astro/robots-renderer.ts`
103
+ * for the field-by-field rationale and
104
+ * `.cursor/plans/saas-website-seo-sitemap.md` for the slice context.
105
+ */
106
+ export * from './astro/robots-renderer.js';
107
+ /**
108
+ * Phase 8 close-out — `enumerateMarketingPageSitemapUrls(siteContext)`
109
+ * pure helper that returns every (page-manifest × locale) absolute
110
+ * URL the marketing site's sitemap MUST advertise, paired with its
111
+ * hreflang alternates. Two consumption surfaces:
112
+ *
113
+ * 1. Vitest enforcement — a regression that drops a manifest-
114
+ * registered route fails fast in unit tests, well before
115
+ * `astro build` would surface it.
116
+ * 2. `@astrojs/sitemap` `customPages` integration — when the
117
+ * consumer needs to surface routes Astro's file-based router
118
+ * cannot auto-discover (data-driven landing variants, etc.),
119
+ * this helper computes the canonical URL list to spread into
120
+ * the plugin config.
121
+ *
122
+ * See `engine/saas-website/src/astro/sitemap-coverage.ts` and
123
+ * `.cursor/plans/saas-website-seo-sitemap.md` for the full
124
+ * rationale + scope boundary.
125
+ */
126
+ export * from './astro/sitemap-coverage.js';
127
+ /**
128
+ * AEO — `renderPageStructuredData(opts)` pure string builder that
129
+ * collects every section's `getStructuredData()` (when present),
130
+ * dedupes by `@id`, and emits one
131
+ * `<script type="application/ld+json">` block per surviving payload.
132
+ * Sibling of `renderWebsitePageHeadHtml` (same pure-TS, vitest-
133
+ * friendly contract). See
134
+ * `engine/saas-website/src/astro/structured-data.renderer.ts`
135
+ * for the safety + dedupe semantics and
136
+ * `.cursor/plans/saas-website-aeo-geo.md` for the slice context.
137
+ */
138
+ export * from './astro/structured-data.renderer.js';
139
+ export * from './astro/headers-renderer.js';
140
+ export * from './astro/llms-txt-server.js';
141
+ /**
142
+ * AEO — runtime payload type (`WebsiteStructuredDataPayload`) and
143
+ * convenience return-shape union (`WebsiteStructuredDataReturn`)
144
+ * the section author imports to type their `getStructuredData()`.
145
+ * Defined locally in `saas-website` (not in `saas-specifications`)
146
+ * because the runtime engine cannot depend on the spec layer; the
147
+ * companion catalog at `_catalogs/schema-org/` describes the same
148
+ * vocabulary at the COMPANION layer.
149
+ */
150
+ export * from './schemas/structured-data/website-structured-data.shared.schemas.js';
151
+ //# sourceMappingURL=astro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro.js","sourceRoot":"","sources":["../../../src/astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAEH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C;;;;;;;;;;;GAWG;AACH,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD;;;;;;;;GAQG;AACH,cAAc,iCAAiC,CAAC;AAChD;;;;;;;;GAQG;AACH,cAAc,yBAAyB,CAAC;AACxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,cAAc,0BAA0B,CAAC;AACzC;;;;;;;;;;GAUG;AACH,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC;;;;;;;;GAQG;AACH,cAAc,kEAAkE,CAAC","sourcesContent":["/**\n * @wildo-package @wildo-ai/saas-website (astro adapter SSR/frontmatter entry)\n *\n * Astro **frontmatter / SSR** sub-entry. Re-exports the TypeScript\n * helpers a consumer's per-page `.astro` files consume INSIDE\n * frontmatter to render a marketing-site page (locale resolution,\n * label-pack loading, `<head>` HTML rendering, design-token CSS\n * rendering, i18n routing config, expected-label-key collection).\n *\n * **The `createWebsitePageBridgeIsland` factory lives in a SEPARATE\n * subpath — `@wildo-ai/saas-website/astro-island`** — and is NOT\n * re-exported here. The split exists because the consumer's per-page\n * `*.bridge.tsx` module is bundled into BOTH the SSR graph (via the\n * `.astro` page that statically imports it) AND the client graph\n * (Astro's hydration pipeline). Re-exporting the bridge factory\n * alongside the Node-using helpers here would force Vite to resolve\n * `node:fs` / `node:path` for the client bundle even though\n * tree-shaking would later drop them — resolution happens BEFORE\n * tree-shaking, so the build hard-fails with\n * `\"resolve\" is not exported by \"__vite-browser-external\"`. The\n * dedicated `astro-island` subpath keeps the client import graph\n * 100% bundle-clean.\n *\n * **No `.astro` shell shipped.** The Phase-5 redesign deliberately\n * removed the previously-planned `WebsitePageBridge.astro` shell\n * because:\n * 1. A `.astro` file cannot be re-exported from a TS subpath barrel\n * and `tsc` does not copy non-TS files to `dist/`, so the shell\n * was unreachable from `@wildo-ai/saas-website/astro`.\n * 2. The shell would have had to pass `pageComponent` /\n * `headerComponent` / `footerComponent` (`ComponentType` refs)\n * as React-island props — Astro's `devalue`-style island prop\n * serialization cannot transport function values, so hydration\n * would have mismatched on first interaction.\n * Both failure modes are sidestepped by giving consumers two\n * primitive-string-only TS helpers (`renderWebsitePageHeadHtml`,\n * `renderWebsiteDesignTokensCss`) for the Astro-side `<head>` work\n * and a closure-based island factory (`createWebsitePageBridgeIsland`,\n * exported from `@wildo-ai/saas-website/astro-island`) for the\n * React-island side. The consumer authors a thin per-page `.astro`\n * file that statically imports the per-page bridge island — Astro's\n * compiler then resolves the `client:*` directive against a static\n * module export, which is the only pattern that makes Astro's\n * hydration bundling work correctly. See `bridge-runtime.tsx`'s\n * file-level JSDoc for the full rationale.\n *\n * @wildo-boundary\n * This entry is on the SSR / Astro-build-time side of the bundle\n * boundary (D12 second loosening). It MAY import:\n * - `node:fs`, `node:path` (label-pack-loader, runtime-helper)\n * It MUST NOT import:\n * - the bridge-runtime module — that module ships into the\n * client island bundle and is exposed via the\n * `@wildo-ai/saas-website/astro-island` subpath instead.\n * - the Astro runtime (`astro` package, `astro:*` virtual modules)\n * — those live exclusively inside `.astro` files. Adding\n * `astro` here would make the engine package unimportable\n * from any context that does not boot the Astro compiler\n * (Vitest tests, the `wildo website audit` CLI, companion\n * subprocesses).\n *\n * Enforced by `engine/saas-website/src/__tests__/bundle-isolation.test.ts`\n * which walks `astro.ts` as one of `ENTRY_FILES` AND runs a targeted\n * negative test that `node:fs` / `node:path` are reachable from\n * `astro.ts` ONLY — never from `index.ts`, `companion-exports.ts`,\n * or `astro-island.ts`.\n */\n\nexport * from './astro/website-site-context';\nexport * from './astro/i18n-routing.helper';\nexport * from './astro/collect-expected-label-keys';\nexport * from './astro/label-pack-loader';\n/**\n * `pick-labels-for-page` is INTENTIONALLY NOT re-exported here.\n * It is an internal helper consumed only by `loadWebsitePageRuntime`\n * (which IS exported via the runtime helper below). Exposing it as a\n * public sub-entry surface would (a) invite consumers to call it\n * directly from `.astro` frontmatter — which they should never do\n * (the runtime helper already wires the slicing transparently), and\n * (b) lock the engine into an extra public API the audit step would\n * have to keep stable. Tests import the helper via its relative\n * path, which keeps the behavior covered without leaking the surface.\n * (Phase 6 audit fix M-B.)\n */\nexport * from './astro/website-page-runtime.helper';\nexport * from './astro/website-page-head.renderer';\nexport * from './astro/structured-data.renderer';\n/**\n * Phase 7 — sibling head renderer for blog posts. Reads from a\n * validated `BlogPostFrontmatter` instead of the page manifest's\n * `metaLabelKeys`; emits `og:type=article` plus the\n * `article:published_time` / `article:author` / `article:tag` lines\n * the OG \"article\" vertical requires. See the renderer file's\n * preamble for why this is a sibling rather than a flag on\n * `renderWebsitePageHeadHtml`.\n */\nexport * from './astro/blog-post-head.renderer';\n/**\n * Phase 8 close-out — `renderRobotsTxt(siteContext)` pure string\n * builder for the marketing site's `robots.txt` body. Sibling of\n * `renderWebsitePageHeadHtml` (same Astro-frontmatter consumption\n * shape: pure TypeScript, no Astro runtime dependency, vitest-\n * friendly). See `engine/saas-website/src/astro/robots-renderer.ts`\n * for the field-by-field rationale and\n * `.cursor/plans/saas-website-seo-sitemap.md` for the slice context.\n */\nexport * from './astro/robots-renderer';\n/**\n * Phase 8 close-out — `enumerateMarketingPageSitemapUrls(siteContext)`\n * pure helper that returns every (page-manifest × locale) absolute\n * URL the marketing site's sitemap MUST advertise, paired with its\n * hreflang alternates. Two consumption surfaces:\n *\n * 1. Vitest enforcement — a regression that drops a manifest-\n * registered route fails fast in unit tests, well before\n * `astro build` would surface it.\n * 2. `@astrojs/sitemap` `customPages` integration — when the\n * consumer needs to surface routes Astro's file-based router\n * cannot auto-discover (data-driven landing variants, etc.),\n * this helper computes the canonical URL list to spread into\n * the plugin config.\n *\n * See `engine/saas-website/src/astro/sitemap-coverage.ts` and\n * `.cursor/plans/saas-website-seo-sitemap.md` for the full\n * rationale + scope boundary.\n */\nexport * from './astro/sitemap-coverage';\n/**\n * AEO — `renderPageStructuredData(opts)` pure string builder that\n * collects every section's `getStructuredData()` (when present),\n * dedupes by `@id`, and emits one\n * `<script type=\"application/ld+json\">` block per surviving payload.\n * Sibling of `renderWebsitePageHeadHtml` (same pure-TS, vitest-\n * friendly contract). See\n * `engine/saas-website/src/astro/structured-data.renderer.ts`\n * for the safety + dedupe semantics and\n * `.cursor/plans/saas-website-aeo-geo.md` for the slice context.\n */\nexport * from './astro/structured-data.renderer';\nexport * from './astro/headers-renderer';\nexport * from './astro/llms-txt-server';\n/**\n * AEO — runtime payload type (`WebsiteStructuredDataPayload`) and\n * convenience return-shape union (`WebsiteStructuredDataReturn`)\n * the section author imports to type their `getStructuredData()`.\n * Defined locally in `saas-website` (not in `saas-specifications`)\n * because the runtime engine cannot depend on the spec layer; the\n * companion catalog at `_catalogs/schema-org/` describes the same\n * vocabulary at the COMPANION layer.\n */\nexport * from './schemas/structured-data/website-structured-data.shared.schemas';\n"]}