@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.
- package/LICENSE +34 -0
- package/dist/esm/.builder.pid +9 -0
- package/dist/esm/astro/blog-post-bridge.d.ts +324 -0
- package/dist/esm/astro/blog-post-bridge.d.ts.map +1 -0
- package/dist/esm/astro/blog-post-bridge.js +57 -0
- package/dist/esm/astro/blog-post-bridge.js.map +1 -0
- package/dist/esm/astro/blog-post-head.renderer.d.ts +129 -0
- package/dist/esm/astro/blog-post-head.renderer.d.ts.map +1 -0
- package/dist/esm/astro/blog-post-head.renderer.js +139 -0
- package/dist/esm/astro/blog-post-head.renderer.js.map +1 -0
- package/dist/esm/astro/bridge-runtime.d.ts +224 -0
- package/dist/esm/astro/bridge-runtime.d.ts.map +1 -0
- package/dist/esm/astro/bridge-runtime.js +30 -0
- package/dist/esm/astro/bridge-runtime.js.map +1 -0
- package/dist/esm/astro/collect-expected-label-keys.d.ts +65 -0
- package/dist/esm/astro/collect-expected-label-keys.d.ts.map +1 -0
- package/dist/esm/astro/collect-expected-label-keys.js +101 -0
- package/dist/esm/astro/collect-expected-label-keys.js.map +1 -0
- package/dist/esm/astro/headers-renderer.d.ts +32 -0
- package/dist/esm/astro/headers-renderer.d.ts.map +1 -0
- package/dist/esm/astro/headers-renderer.js +64 -0
- package/dist/esm/astro/headers-renderer.js.map +1 -0
- package/dist/esm/astro/i18n-routing.helper.d.ts +91 -0
- package/dist/esm/astro/i18n-routing.helper.d.ts.map +1 -0
- package/dist/esm/astro/i18n-routing.helper.js +23 -0
- package/dist/esm/astro/i18n-routing.helper.js.map +1 -0
- package/dist/esm/astro/internal/html-escape.d.ts +31 -0
- package/dist/esm/astro/internal/html-escape.d.ts.map +1 -0
- package/dist/esm/astro/internal/html-escape.js +40 -0
- package/dist/esm/astro/internal/html-escape.js.map +1 -0
- package/dist/esm/astro/label-pack-loader.d.ts +134 -0
- package/dist/esm/astro/label-pack-loader.d.ts.map +1 -0
- package/dist/esm/astro/label-pack-loader.js +298 -0
- package/dist/esm/astro/label-pack-loader.js.map +1 -0
- package/dist/esm/astro/llms-txt-server.d.ts +28 -0
- package/dist/esm/astro/llms-txt-server.d.ts.map +1 -0
- package/dist/esm/astro/llms-txt-server.js +33 -0
- package/dist/esm/astro/llms-txt-server.js.map +1 -0
- package/dist/esm/astro/pick-labels-for-page.d.ts +63 -0
- package/dist/esm/astro/pick-labels-for-page.d.ts.map +1 -0
- package/dist/esm/astro/pick-labels-for-page.js +73 -0
- package/dist/esm/astro/pick-labels-for-page.js.map +1 -0
- package/dist/esm/astro/robots-renderer.d.ts +85 -0
- package/dist/esm/astro/robots-renderer.d.ts.map +1 -0
- package/dist/esm/astro/robots-renderer.js +157 -0
- package/dist/esm/astro/robots-renderer.js.map +1 -0
- package/dist/esm/astro/sitemap-coverage.d.ts +101 -0
- package/dist/esm/astro/sitemap-coverage.d.ts.map +1 -0
- package/dist/esm/astro/sitemap-coverage.js +67 -0
- package/dist/esm/astro/sitemap-coverage.js.map +1 -0
- package/dist/esm/astro/structured-data.renderer.d.ts +21 -0
- package/dist/esm/astro/structured-data.renderer.d.ts.map +1 -0
- package/dist/esm/astro/structured-data.renderer.js +142 -0
- package/dist/esm/astro/structured-data.renderer.js.map +1 -0
- package/dist/esm/astro/website-page-head.renderer.d.ts +93 -0
- package/dist/esm/astro/website-page-head.renderer.d.ts.map +1 -0
- package/dist/esm/astro/website-page-head.renderer.js +184 -0
- package/dist/esm/astro/website-page-head.renderer.js.map +1 -0
- package/dist/esm/astro/website-page-runtime.helper.d.ts +112 -0
- package/dist/esm/astro/website-page-runtime.helper.d.ts.map +1 -0
- package/dist/esm/astro/website-page-runtime.helper.js +60 -0
- package/dist/esm/astro/website-page-runtime.helper.js.map +1 -0
- package/dist/esm/astro/website-site-context.d.ts +126 -0
- package/dist/esm/astro/website-site-context.d.ts.map +1 -0
- package/dist/esm/astro/website-site-context.js +37 -0
- package/dist/esm/astro/website-site-context.js.map +1 -0
- package/dist/esm/astro-island.d.ts +56 -0
- package/dist/esm/astro-island.d.ts.map +1 -0
- package/dist/esm/astro-island.js +61 -0
- package/dist/esm/astro-island.js.map +1 -0
- package/dist/esm/astro.d.ts +151 -0
- package/dist/esm/astro.d.ts.map +1 -0
- package/dist/esm/astro.js +151 -0
- package/dist/esm/astro.js.map +1 -0
- package/dist/esm/companion-exports.d.ts +38 -0
- package/dist/esm/companion-exports.d.ts.map +1 -0
- package/dist/esm/companion-exports.js +38 -0
- package/dist/esm/companion-exports.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteButton.d.ts +73 -0
- package/dist/esm/components/low-level/WebsiteButton.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteButton.js +68 -0
- package/dist/esm/components/low-level/WebsiteButton.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteHeading.d.ts +78 -0
- package/dist/esm/components/low-level/WebsiteHeading.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteHeading.js +41 -0
- package/dist/esm/components/low-level/WebsiteHeading.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteImage.d.ts +73 -0
- package/dist/esm/components/low-level/WebsiteImage.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteImage.js +21 -0
- package/dist/esm/components/low-level/WebsiteImage.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.d.ts +90 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.js +47 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.d.ts +99 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.js +68 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteLink.d.ts +50 -0
- package/dist/esm/components/low-level/WebsiteLink.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteLink.js +22 -0
- package/dist/esm/components/low-level/WebsiteLink.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteText.d.ts +57 -0
- package/dist/esm/components/low-level/WebsiteText.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteText.js +57 -0
- package/dist/esm/components/low-level/WebsiteText.js.map +1 -0
- package/dist/esm/config/define-website-config.d.ts +83 -0
- package/dist/esm/config/define-website-config.d.ts.map +1 -0
- package/dist/esm/config/define-website-config.js +126 -0
- package/dist/esm/config/define-website-config.js.map +1 -0
- package/dist/esm/config/index.d.ts +38 -0
- package/dist/esm/config/index.d.ts.map +1 -0
- package/dist/esm/config/index.js +38 -0
- package/dist/esm/config/index.js.map +1 -0
- package/dist/esm/config/load-website-config.d.ts +136 -0
- package/dist/esm/config/load-website-config.d.ts.map +1 -0
- package/dist/esm/config/load-website-config.js +177 -0
- package/dist/esm/config/load-website-config.js.map +1 -0
- package/dist/esm/config/wildo-website-config.schemas.d.ts +251 -0
- package/dist/esm/config/wildo-website-config.schemas.d.ts.map +1 -0
- package/dist/esm/config/wildo-website-config.schemas.js +302 -0
- package/dist/esm/config/wildo-website-config.schemas.js.map +1 -0
- package/dist/esm/config-loader.d.ts +35 -0
- package/dist/esm/config-loader.d.ts.map +1 -0
- package/dist/esm/config-loader.js +35 -0
- package/dist/esm/config-loader.js.map +1 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.d.ts +38 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.js +77 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.js.map +1 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts +41 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js +58 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js.map +1 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts +81 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.js +177 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.js.map +1 -0
- package/dist/esm/core/contexts/WebsitePageContext.d.ts +40 -0
- package/dist/esm/core/contexts/WebsitePageContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsitePageContext.js +8 -0
- package/dist/esm/core/contexts/WebsitePageContext.js.map +1 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts +162 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.js +22 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.js.map +1 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.d.ts +47 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.js +8 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.js.map +1 -0
- package/dist/esm/core/contexts/useWebsitePage.d.ts +13 -0
- package/dist/esm/core/contexts/useWebsitePage.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsitePage.js +22 -0
- package/dist/esm/core/contexts/useWebsitePage.js.map +1 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.d.ts +19 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.js +28 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.js.map +1 -0
- package/dist/esm/core/contexts/useWebsiteSection.d.ts +12 -0
- package/dist/esm/core/contexts/useWebsiteSection.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsiteSection.js +22 -0
- package/dist/esm/core/contexts/useWebsiteSection.js.map +1 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts +17 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts.map +1 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.js +23 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.js.map +1 -0
- package/dist/esm/core/factories/define-website-page-manifest.d.ts +70 -0
- package/dist/esm/core/factories/define-website-page-manifest.d.ts.map +1 -0
- package/dist/esm/core/factories/define-website-page-manifest.js +51 -0
- package/dist/esm/core/factories/define-website-page-manifest.js.map +1 -0
- package/dist/esm/core/factories/define-website-section.d.ts +101 -0
- package/dist/esm/core/factories/define-website-section.d.ts.map +1 -0
- package/dist/esm/core/factories/define-website-section.js +71 -0
- package/dist/esm/core/factories/define-website-section.js.map +1 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts +23 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts.map +1 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.js +25 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.js.map +1 -0
- package/dist/esm/core/hooks/useWebsiteLabel.d.ts +68 -0
- package/dist/esm/core/hooks/useWebsiteLabel.d.ts.map +1 -0
- package/dist/esm/core/hooks/useWebsiteLabel.js +103 -0
- package/dist/esm/core/hooks/useWebsiteLabel.js.map +1 -0
- package/dist/esm/core/layouts/WebsitePageLayout.d.ts +87 -0
- package/dist/esm/core/layouts/WebsitePageLayout.d.ts.map +1 -0
- package/dist/esm/core/layouts/WebsitePageLayout.js +170 -0
- package/dist/esm/core/layouts/WebsitePageLayout.js.map +1 -0
- package/dist/esm/core/layouts/WebsiteSection.d.ts +91 -0
- package/dist/esm/core/layouts/WebsiteSection.d.ts.map +1 -0
- package/dist/esm/core/layouts/WebsiteSection.js +26 -0
- package/dist/esm/core/layouts/WebsiteSection.js.map +1 -0
- package/dist/esm/core/routing/internal-routing.utils.d.ts +65 -0
- package/dist/esm/core/routing/internal-routing.utils.d.ts.map +1 -0
- package/dist/esm/core/routing/internal-routing.utils.js +14 -0
- package/dist/esm/core/routing/internal-routing.utils.js.map +1 -0
- package/dist/esm/index.d.ts +129 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +129 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mdx/BlogPost.d.ts +193 -0
- package/dist/esm/mdx/BlogPost.d.ts.map +1 -0
- package/dist/esm/mdx/BlogPost.js +161 -0
- package/dist/esm/mdx/BlogPost.js.map +1 -0
- package/dist/esm/mdx/blog-post-collection.config.d.ts +139 -0
- package/dist/esm/mdx/blog-post-collection.config.d.ts.map +1 -0
- package/dist/esm/mdx/blog-post-collection.config.js +27 -0
- package/dist/esm/mdx/blog-post-collection.config.js.map +1 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.d.ts +12 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.d.ts.map +1 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.js +13 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.js.map +1 -0
- package/dist/esm/mdx/index.d.ts +22 -0
- package/dist/esm/mdx/index.d.ts.map +1 -0
- package/dist/esm/mdx/index.js +22 -0
- package/dist/esm/mdx/index.js.map +1 -0
- package/dist/esm/mdx/website-mdx-provider.d.ts +90 -0
- package/dist/esm/mdx/website-mdx-provider.d.ts.map +1 -0
- package/dist/esm/mdx/website-mdx-provider.js +8 -0
- package/dist/esm/mdx/website-mdx-provider.js.map +1 -0
- package/dist/esm/mdx.d.ts +38 -0
- package/dist/esm/mdx.d.ts.map +1 -0
- package/dist/esm/mdx.js +38 -0
- package/dist/esm/mdx.js.map +1 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts +75 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js +85 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts +120 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js +152 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts +73 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.js +76 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.js.map +1 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts +209 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js +218 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts +431 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js +438 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/refs/page-ref.schemas.d.ts +40 -0
- package/dist/esm/schemas/refs/page-ref.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/refs/page-ref.schemas.js +43 -0
- package/dist/esm/schemas/refs/page-ref.schemas.js.map +1 -0
- package/dist/esm/schemas/refs/section-ref.schemas.d.ts +41 -0
- package/dist/esm/schemas/refs/section-ref.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/refs/section-ref.schemas.js +44 -0
- package/dist/esm/schemas/refs/section-ref.schemas.js.map +1 -0
- package/dist/esm/schemas/sections/website-section-category.shared.d.ts +63 -0
- package/dist/esm/schemas/sections/website-section-category.shared.d.ts.map +1 -0
- package/dist/esm/schemas/sections/website-section-category.shared.js +64 -0
- package/dist/esm/schemas/sections/website-section-category.shared.js.map +1 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts +114 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js +69 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts +100 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts.map +1 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js +355 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js.map +1 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts +58 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js +2 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/validators/label-pack.validator.d.ts +144 -0
- package/dist/esm/schemas/validators/label-pack.validator.d.ts.map +1 -0
- package/dist/esm/schemas/validators/label-pack.validator.js +100 -0
- package/dist/esm/schemas/validators/label-pack.validator.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +143 -0
- package/src/__tests__/bundle-isolation.test.ts +607 -0
- package/src/astro/__tests__/blog-post-bridge.test.tsx +288 -0
- package/src/astro/__tests__/blog-post-head.renderer.test.ts +249 -0
- package/src/astro/__tests__/bridge-runtime.test.tsx +198 -0
- package/src/astro/__tests__/collect-expected-label-keys.test.ts +69 -0
- package/src/astro/__tests__/headers-renderer.test.ts +143 -0
- package/src/astro/__tests__/i18n-routing.helper.test.ts +116 -0
- package/src/astro/__tests__/label-pack-loader.test.ts +305 -0
- package/src/astro/__tests__/llms-txt-server.test.ts +127 -0
- package/src/astro/__tests__/pick-labels-for-page.test.ts +60 -0
- package/src/astro/__tests__/robots-renderer.test.ts +228 -0
- package/src/astro/__tests__/sitemap-coverage.test.ts +230 -0
- package/src/astro/__tests__/structured-data.renderer.test.ts +172 -0
- package/src/astro/__tests__/website-page-head.renderer.test.ts +424 -0
- package/src/astro/__tests__/website-page-runtime.helper.test.ts +157 -0
- package/src/astro/__tests__/website-site-context.test.ts +121 -0
- package/src/astro/blog-post-bridge.tsx +404 -0
- package/src/astro/blog-post-head.renderer.ts +293 -0
- package/src/astro/bridge-runtime.tsx +270 -0
- package/src/astro/collect-expected-label-keys.ts +113 -0
- package/src/astro/headers-renderer.ts +82 -0
- package/src/astro/i18n-routing.helper.ts +116 -0
- package/src/astro/internal/html-escape.ts +41 -0
- package/src/astro/label-pack-loader.ts +385 -0
- package/src/astro/llms-txt-server.ts +56 -0
- package/src/astro/pick-labels-for-page.ts +85 -0
- package/src/astro/robots-renderer.ts +171 -0
- package/src/astro/sitemap-coverage.ts +186 -0
- package/src/astro/structured-data.renderer.ts +171 -0
- package/src/astro/website-page-head.renderer.ts +279 -0
- package/src/astro/website-page-runtime.helper.ts +188 -0
- package/src/astro/website-site-context.ts +136 -0
- package/src/astro-island.ts +61 -0
- package/src/astro.ts +151 -0
- package/src/companion-exports.ts +38 -0
- package/src/components/low-level/WebsiteButton.tsx +118 -0
- package/src/components/low-level/WebsiteHeading.tsx +96 -0
- package/src/components/low-level/WebsiteImage.tsx +96 -0
- package/src/components/low-level/WebsiteInternalButton.tsx +172 -0
- package/src/components/low-level/WebsiteInternalLink.tsx +193 -0
- package/src/components/low-level/WebsiteLink.tsx +71 -0
- package/src/components/low-level/WebsiteText.tsx +75 -0
- package/src/components/low-level/__tests__/WebsiteInternalButton.test.tsx +169 -0
- package/src/components/low-level/__tests__/WebsiteInternalLink.test.tsx +202 -0
- package/src/components/low-level/__tests__/primitives.test.tsx +141 -0
- package/src/config/__tests__/define-website-config.test.ts +231 -0
- package/src/config/__tests__/load-website-config.test.ts +215 -0
- package/src/config/define-website-config.ts +134 -0
- package/src/config/index.ts +38 -0
- package/src/config/load-website-config.ts +229 -0
- package/src/config/wildo-website-config.schemas.ts +322 -0
- package/src/config-loader.ts +35 -0
- package/src/core/__tests__/WebsitePageLayout.test.tsx +184 -0
- package/src/core/__tests__/WebsiteSection.test.tsx +85 -0
- package/src/core/__tests__/contexts.test.tsx +133 -0
- package/src/core/__tests__/core-boundary.test.ts +85 -0
- package/src/core/__tests__/define-website-page-manifest.test.tsx +111 -0
- package/src/core/__tests__/define-website-section.test.tsx +89 -0
- package/src/core/__tests__/useWebsiteDesignTokens.test.tsx +41 -0
- package/src/core/__tests__/useWebsiteLabel.test.tsx +117 -0
- package/src/core/anonymous-session/InboundContactForm.tsx +157 -0
- package/src/core/anonymous-session/__tests__/inbound-contact-form.schema.test.ts +44 -0
- package/src/core/anonymous-session/inbound-contact-form.schema.ts +62 -0
- package/src/core/anonymous-session/website-anonymous-session-client.ts +194 -0
- package/src/core/contexts/WebsitePageContext.tsx +52 -0
- package/src/core/contexts/WebsiteRuntimeContext.tsx +175 -0
- package/src/core/contexts/WebsiteSectionContext.tsx +59 -0
- package/src/core/contexts/useWebsitePage.ts +28 -0
- package/src/core/contexts/useWebsiteRuntime.ts +34 -0
- package/src/core/contexts/useWebsiteSection.ts +28 -0
- package/src/core/external-providers/frontend-provider-registry.website.ts +62 -0
- package/src/core/factories/define-website-page-manifest.ts +102 -0
- package/src/core/factories/define-website-section.ts +128 -0
- package/src/core/hooks/useWebsiteDesignTokens.ts +26 -0
- package/src/core/hooks/useWebsiteLabel.ts +121 -0
- package/src/core/layouts/WebsitePageLayout.tsx +311 -0
- package/src/core/layouts/WebsiteSection.tsx +139 -0
- package/src/core/routing/__tests__/internal-routing.utils.test.ts +134 -0
- package/src/core/routing/internal-routing.utils.ts +77 -0
- package/src/index.ts +132 -0
- package/src/mdx/BlogPost.tsx +296 -0
- package/src/mdx/__tests__/BlogPost.test.tsx +218 -0
- package/src/mdx/__tests__/blog-post-collection.config.test.ts +127 -0
- package/src/mdx/__tests__/website-mdx-provider.test.tsx +82 -0
- package/src/mdx/blog-post-collection.config.ts +177 -0
- package/src/mdx/blog-post-frontmatter-source.ts +31 -0
- package/src/mdx/index.ts +39 -0
- package/src/mdx/website-mdx-provider.tsx +95 -0
- package/src/mdx.ts +38 -0
- package/src/schemas/__tests__/blog-frontmatter.test.ts +50 -0
- package/src/schemas/__tests__/companion-exports-react-free.test.ts +51 -0
- package/src/schemas/__tests__/design-tokens.test.ts +163 -0
- package/src/schemas/__tests__/label-key.test.ts +46 -0
- package/src/schemas/__tests__/label-pack-validator.test.ts +146 -0
- package/src/schemas/__tests__/page-manifest.test.ts +66 -0
- package/src/schemas/__tests__/refs.test.ts +37 -0
- package/src/schemas/__tests__/root-config.test.ts +292 -0
- package/src/schemas/__tests__/section-definition.test.ts +47 -0
- package/src/schemas/__tests__/structured-data-reconciliation.test.ts +543 -0
- package/src/schemas/blog/blog-post-frontmatter.shared.schemas.ts +111 -0
- package/src/schemas/design-tokens/website-design-tokens.shared.schemas.ts +166 -0
- package/src/schemas/label-keys/website-label-key.schemas.ts +88 -0
- package/src/schemas/manifests/website-page-manifest.shared.schemas.ts +266 -0
- package/src/schemas/manifests/website-root-config.shared.schemas.ts +504 -0
- package/src/schemas/refs/page-ref.schemas.ts +49 -0
- package/src/schemas/refs/section-ref.schemas.ts +50 -0
- package/src/schemas/sections/website-section-category.shared.ts +65 -0
- package/src/schemas/sections/website-section-definition.shared.schemas.ts +120 -0
- package/src/schemas/structured-data/structured-data-reconciliation.shared.ts +579 -0
- package/src/schemas/structured-data/website-structured-data.shared.schemas.ts +62 -0
- 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"]}
|