@shoalrun/cli 0.1.0-beta.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/CODE-REFERENCES.md +156 -0
- package/README.md +18 -6
- package/adapters/python/requirements.txt +1 -0
- package/adapters/python/shoalrun_reference.py +234 -0
- package/adapters/typescript/README.md +27 -0
- package/adapters/typescript/shoalrun-reference.mjs +260 -0
- package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +6 -2
- package/agent-docs/SNAPSHOT.json +5 -5
- package/agent-docs/about.md +3 -3
- package/agent-docs/api-docs/code-reference-settings.md +160 -0
- package/agent-docs/api-docs/code-reference-settings.sections/catalog-settings.md +50 -0
- package/agent-docs/api-docs/code-reference-settings.sections/complete-reference-page.md +46 -0
- package/agent-docs/api-docs/code-reference-settings.sections/converter-snapshot.md +58 -0
- package/agent-docs/api-docs/code-reference-settings.sections/descriptions-type-links-and-source-links.md +40 -0
- package/agent-docs/api-docs/code-reference-settings.sections/html-markdown-and-agents.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/metadata-and-selection.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/publication-sources.md +54 -0
- package/agent-docs/api-docs/code-reference-settings.sections/python-adapter-limits.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/related-reading.md +32 -0
- package/agent-docs/api-docs/code-reference-settings.sections/symbol-fields.md +56 -0
- package/agent-docs/api-docs/code-references.md +151 -0
- package/agent-docs/api-docs/code-references.sections/a-real-typescript-example.md +38 -0
- package/agent-docs/api-docs/code-references.sections/add-python-source.md +56 -0
- package/agent-docs/api-docs/code-references.sections/before-you-start.md +40 -0
- package/agent-docs/api-docs/code-references.sections/build-and-verify.md +47 -0
- package/agent-docs/api-docs/code-references.sections/choose-the-reading-layout.md +46 -0
- package/agent-docs/api-docs/code-references.sections/extract-and-validate-a-snapshot.md +52 -0
- package/agent-docs/api-docs/code-references.sections/html-markdown-and-agents.md +42 -0
- package/agent-docs/api-docs/code-references.sections/register-the-catalog-and-navigation.md +58 -0
- package/agent-docs/api-docs/code-references.sections/related-reading.md +40 -0
- package/agent-docs/api-docs/code-references.sections/versions-profiles-and-delivery.md +40 -0
- package/agent-docs/api-docs/typescript-references.md +93 -0
- package/agent-docs/author/agent-overview.md +2 -2
- package/agent-docs/author/components/for-facet.md +127 -0
- package/agent-docs/author/components/only.md +3 -1
- package/agent-docs/author/components.md +2 -1
- package/agent-docs/author/reader-views.md +2 -2
- package/agent-docs/author/reader-views.sections/configure-the-choices.md +2 -2
- package/agent-docs/author/reader-views.sections/connect-your-own-control.md +2 -2
- package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +2 -2
- package/agent-docs/author/reader-views.sections/mark-pages.md +2 -2
- package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +2 -2
- package/agent-docs/author/reader-views.sections/place-filter-controls.md +2 -2
- package/agent-docs/author/reader-views.sections/try-the-controls-here.md +2 -2
- package/agent-docs/changelog/code-api-references.md +44 -0
- package/agent-docs/changelog/facet-typescript.md +54 -0
- package/agent-docs/changelog.md +17 -1
- package/agent-docs/cli.md +11 -1
- package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +1 -1
- package/agent-docs/cli.sections/author-pages.md +1 -1
- package/agent-docs/cli.sections/build-and-serve.md +1 -1
- package/agent-docs/cli.sections/inspect-config-and-operations.md +1 -1
- package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +1 -1
- package/agent-docs/cli.sections/related-reading.md +1 -1
- package/agent-docs/cli.sections/search-and-chat.md +1 -1
- package/agent-docs/cli.sections/start-a-project.md +1 -1
- package/agent-docs/cli.sections/validate-code-reference-snapshots.md +41 -0
- package/agent-docs/cli.sections/working-tree-authoring-tools.md +1 -1
- package/agent-docs/config/apis.md +5 -1
- package/agent-docs/config/examples.md +3 -3
- package/agent-docs/config/examples.sections/feature-showcase.md +3 -3
- package/agent-docs/config/examples.sections/minimal-site.md +2 -2
- package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
- package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
- package/agent-docs/config/examples.sections/related-reading.md +2 -2
- package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
- package/agent-docs/config/outputs.md +12 -12
- package/agent-docs/config/outputs.sections/exports.md +12 -12
- package/agent-docs/config/outputs.sections/metadata.md +1 -1
- package/agent-docs/config/outputs.sections/pdf-output.md +1 -1
- package/agent-docs/config/outputs.sections/related-reading.md +1 -1
- package/agent-docs/config/site.md +17 -17
- package/agent-docs/config/site.sections/related-reading.md +1 -1
- package/agent-docs/config/site.sections/theme.md +1 -1
- package/agent-docs/config.md +2 -2
- package/agent-docs/configuration.md +2 -2
- package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
- package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +1 -1
- package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
- package/agent-docs/configuration.sections/inspect-and-validate-changes.md +1 -1
- package/agent-docs/configuration.sections/related-reading.md +1 -1
- package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +1 -1
- package/agent-docs/configuration.sections/share-defaults-through-extends.md +1 -1
- package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
- package/agent-docs/configuration.sections/understand-the-three-stages.md +1 -1
- package/agent-docs/configuration.sections/understand-where-paths-point.md +1 -1
- package/agent-docs/content-delivery/api.md +10 -2
- package/agent-docs/content-delivery/api.sections/errors.md +52 -0
- package/agent-docs/content-delivery/api.sections/generated-typescript-reference.md +36 -0
- package/agent-docs/content-delivery/api.sections/html-markdown-and-agents.md +36 -0
- package/agent-docs/content-delivery/api.sections/mount-html.md +42 -0
- package/agent-docs/content-delivery/api.sections/open-a-rest-source.md +55 -0
- package/agent-docs/content-delivery/api.sections/open-a-source.md +51 -0
- package/agent-docs/content-delivery/api.sections/read-a-snapshot.md +55 -0
- package/agent-docs/content-delivery/api.sections/related-reading.md +42 -0
- package/agent-docs/content-delivery/api.sections/validate-a-manifest.md +40 -0
- package/agent-docs/content-delivery/client.md +9 -1
- package/agent-docs/content-delivery/sdk/all.md +1772 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-exportedid.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-id.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-title.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor.md +44 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentasset-mediatype.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentasset.md +40 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliveryerror-code.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliveryerror.md +46 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-manifestbytes.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-resourcebytes.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-resources.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits.md +44 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contenterrorcode.md +32 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-bytes.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-digest.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-path.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile.md +44 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentformat.md +32 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-asset.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-fragment.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-href.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-key.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-kind.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-query.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-ref.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink.md +52 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-assets.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-diagnostics.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-digest.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-files.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-kind.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-publication.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-publicbase.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-resources.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-review.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-schemaversion.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest.md +68 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-anchors.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-links.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-unmount.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount.md +49 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-channel.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-language.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-product.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-version.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication.md +46 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentref.md +43 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrefkey.md +42 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation-anchors.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation-links.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation.md +42 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-assets.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-canonicalurl.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-externaldependencies.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-publication.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-ref.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-representations.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-source.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-summary.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-title.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-type.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource.md +65 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresourcekey.md +42 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry-key.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry-resource.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry.md +42 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterror-error.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterror.md +43 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterrorcode.md +32 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-publication.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-resources.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-revision.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-schemaversion.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist.md +46 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-key.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-publication.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-resource.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-revision.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-schemaversion.md +34 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource.md +48 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-content.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-format.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-representation.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-resource.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-revision.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult.md +48 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-dispose.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-get.md +45 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-list.md +38 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-publication.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-revision.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot.md +47 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-fetch.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-limits.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-manifesturl.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-signal.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions.md +46 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-mountcontent.md +48 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-openmanifestcontentsource.md +54 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-openrestcontentsource.md +44 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-baseurl.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-fetch.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-limits.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-publication.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-revision.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-signal.md +36 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions.md +50 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-validatecontentmanifest.md +45 -0
- package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content.md +65 -0
- package/agent-docs/content-delivery/sdk/content-anchor/exported-id.md +25 -0
- package/agent-docs/content-delivery/sdk/content-anchor/id.md +25 -0
- package/agent-docs/content-delivery/sdk/content-anchor/title.md +25 -0
- package/agent-docs/content-delivery/sdk/content-anchor.md +71 -0
- package/agent-docs/content-delivery/sdk/content-asset/media-type.md +25 -0
- package/agent-docs/content-delivery/sdk/content-asset.md +43 -0
- package/agent-docs/content-delivery/sdk/content-delivery-error/code.md +25 -0
- package/agent-docs/content-delivery/sdk/content-delivery-error.md +53 -0
- package/agent-docs/content-delivery/sdk/content-delivery-limits/manifest-bytes.md +27 -0
- package/agent-docs/content-delivery/sdk/content-delivery-limits/resource-bytes.md +27 -0
- package/agent-docs/content-delivery/sdk/content-delivery-limits/resources.md +27 -0
- package/agent-docs/content-delivery/sdk/content-delivery-limits.md +77 -0
- package/agent-docs/content-delivery/sdk/content-error-code.md +23 -0
- package/agent-docs/content-delivery/sdk/content-file/bytes.md +25 -0
- package/agent-docs/content-delivery/sdk/content-file/digest.md +25 -0
- package/agent-docs/content-delivery/sdk/content-file/path.md +25 -0
- package/agent-docs/content-delivery/sdk/content-file.md +71 -0
- package/agent-docs/content-delivery/sdk/content-format.md +23 -0
- package/agent-docs/content-delivery/sdk/content-link/asset.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/fragment.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/href.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/key.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/kind.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/query.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link/ref.md +25 -0
- package/agent-docs/content-delivery/sdk/content-link.md +127 -0
- package/agent-docs/content-delivery/sdk/content-manifest/assets.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/diagnostics.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/digest.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/files.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/kind.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/public-base.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/publication.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/resources.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/review.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest/schema-version.md +25 -0
- package/agent-docs/content-delivery/sdk/content-manifest.md +179 -0
- package/agent-docs/content-delivery/sdk/content-mount/anchors.md +27 -0
- package/agent-docs/content-delivery/sdk/content-mount/links.md +27 -0
- package/agent-docs/content-delivery/sdk/content-mount/unmount.md +27 -0
- package/agent-docs/content-delivery/sdk/content-mount.md +82 -0
- package/agent-docs/content-delivery/sdk/content-publication/channel.md +25 -0
- package/agent-docs/content-delivery/sdk/content-publication/language.md +25 -0
- package/agent-docs/content-delivery/sdk/content-publication/product.md +25 -0
- package/agent-docs/content-delivery/sdk/content-publication/version.md +25 -0
- package/agent-docs/content-delivery/sdk/content-publication.md +85 -0
- package/agent-docs/content-delivery/sdk/content-ref-key.md +34 -0
- package/agent-docs/content-delivery/sdk/content-ref.md +40 -0
- package/agent-docs/content-delivery/sdk/content-representation/anchors.md +25 -0
- package/agent-docs/content-delivery/sdk/content-representation/links.md +25 -0
- package/agent-docs/content-delivery/sdk/content-representation.md +57 -0
- package/agent-docs/content-delivery/sdk/content-resource/assets.md +25 -0
- package/agent-docs/content-delivery/sdk/content-resource/canonical-url.md +25 -0
- package/agent-docs/content-delivery/sdk/content-resource/external-dependencies.md +25 -0
- package/agent-docs/content-delivery/sdk/content-resource/publication.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource/ref.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource/representations.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource/source.md +25 -0
- package/agent-docs/content-delivery/sdk/content-resource/summary.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource/title.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource/type.md +27 -0
- package/agent-docs/content-delivery/sdk/content-resource-key.md +34 -0
- package/agent-docs/content-delivery/sdk/content-resource.md +192 -0
- package/agent-docs/content-delivery/sdk/content-rest-entry/key.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-entry/resource.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-entry.md +57 -0
- package/agent-docs/content-delivery/sdk/content-rest-error/error.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-error-code.md +23 -0
- package/agent-docs/content-delivery/sdk/content-rest-error.md +46 -0
- package/agent-docs/content-delivery/sdk/content-rest-list/publication.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-list/resources.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-list/revision.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-list/schema-version.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-list.md +85 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource/key.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource/publication.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource/resource.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource/revision.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource/schema-version.md +25 -0
- package/agent-docs/content-delivery/sdk/content-rest-resource.md +99 -0
- package/agent-docs/content-delivery/sdk/content-result/content.md +27 -0
- package/agent-docs/content-delivery/sdk/content-result/format.md +27 -0
- package/agent-docs/content-delivery/sdk/content-result/representation.md +27 -0
- package/agent-docs/content-delivery/sdk/content-result/resource.md +27 -0
- package/agent-docs/content-delivery/sdk/content-result/revision.md +27 -0
- package/agent-docs/content-delivery/sdk/content-result.md +114 -0
- package/agent-docs/content-delivery/sdk/content-snapshot/dispose.md +27 -0
- package/agent-docs/content-delivery/sdk/content-snapshot/get.md +36 -0
- package/agent-docs/content-delivery/sdk/content-snapshot/list.md +29 -0
- package/agent-docs/content-delivery/sdk/content-snapshot/publication.md +27 -0
- package/agent-docs/content-delivery/sdk/content-snapshot/revision.md +27 -0
- package/agent-docs/content-delivery/sdk/content-snapshot.md +123 -0
- package/agent-docs/content-delivery/sdk/exports.md +742 -0
- package/agent-docs/content-delivery/sdk/exports.sections/functions.md +30 -0
- package/agent-docs/content-delivery/sdk/exports.sections/members.md +47 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentanchor.md +41 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentasset.md +37 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentdeliveryerror.md +43 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentdeliverylimits.md +41 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contenterrorcode.md +29 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentfile.md +41 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentformat.md +29 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentlink.md +49 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentmanifest.md +65 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentmount.md +46 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentpublication.md +43 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentref.md +40 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrefkey.md +39 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrepresentation.md +39 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresource.md +62 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresourcekey.md +39 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestentry.md +39 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresterror.md +40 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresterrorcode.md +29 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestlist.md +43 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestresource.md +45 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresult.md +45 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentsnapshot.md +44 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-manifestcontentsourceoptions.md +43 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-mountcontent.md +45 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-openmanifestcontentsource.md +51 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-openrestcontentsource.md +41 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-restcontentsourceoptions.md +47 -0
- package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-validatecontentmanifest.md +42 -0
- package/agent-docs/content-delivery/sdk/manifest-content-source-options/fetch.md +27 -0
- package/agent-docs/content-delivery/sdk/manifest-content-source-options/limits.md +27 -0
- package/agent-docs/content-delivery/sdk/manifest-content-source-options/manifest-url.md +27 -0
- package/agent-docs/content-delivery/sdk/manifest-content-source-options/signal.md +27 -0
- package/agent-docs/content-delivery/sdk/manifest-content-source-options.md +93 -0
- package/agent-docs/content-delivery/sdk/mount-content.md +46 -0
- package/agent-docs/content-delivery/sdk/open-manifest-content-source.md +51 -0
- package/agent-docs/content-delivery/sdk/open-rest-content-source.md +39 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/base-url.md +28 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/fetch.md +27 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/limits.md +27 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/publication.md +27 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/revision.md +27 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options/signal.md +27 -0
- package/agent-docs/content-delivery/sdk/rest-content-source-options.md +125 -0
- package/agent-docs/content-delivery/sdk/validate-content-manifest.md +38 -0
- package/agent-docs/contribute/agent-skills.md +33 -6
- package/agent-docs/documents.json +7710 -530
- package/agent-docs/features.md +20 -18
- package/agent-docs/provenance.json +6 -6
- package/agent-docs/publish/api-references.md +3 -1
- package/agent-docs/publish/api-references.sections/author-the-reference-page.md +3 -1
- package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -1
- package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +3 -1
- package/agent-docs/publish/api-references.sections/next-steps.md +3 -1
- package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +3 -1
- package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +3 -1
- package/agent-docs/publish/api-references.sections/register-the-operation.md +3 -1
- package/agent-docs/publish/api-references.sections/related-reading.md +3 -1
- package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -1
- package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -1
- package/agent-docs/publish/content-export.md +3 -1
- package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +1 -1
- package/agent-docs/publish/content-export.sections/check-the-result.md +1 -1
- package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +1 -1
- package/agent-docs/publish/content-export.sections/prerequisites.md +1 -1
- package/agent-docs/publish/content-export.sections/related-reading.md +1 -1
- package/agent-docs/publish/content-export.sections/review-exported-api-material.md +1 -1
- package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +1 -1
- package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +1 -1
- package/agent-docs/publish/pdf.md +2 -2
- package/agent-docs/publish/pdf.sections/apply-print-styling.md +1 -1
- package/agent-docs/publish/pdf.sections/check-the-result.md +1 -1
- package/agent-docs/publish/pdf.sections/export-a-page-or-publication.md +2 -2
- package/agent-docs/publish/pdf.sections/html-markdown-and-agents.md +1 -1
- package/agent-docs/publish/pdf.sections/offer-browser-page-printing.md +1 -1
- package/agent-docs/publish/pdf.sections/offer-direct-downloads-through-a-node-server.md +1 -1
- package/agent-docs/publish/pdf.sections/prerequisites.md +1 -1
- package/agent-docs/publish/pdf.sections/publish-an-optional-manual-download.md +1 -1
- package/agent-docs/publish/single-source-sites.md +26 -2
- package/agent-docs/publish/single-source-sites.sections/build-and-check-each-output.md +49 -0
- package/agent-docs/publish/single-source-sites.sections/html-markdown-and-agents.md +33 -0
- package/agent-docs/publish/single-source-sites.sections/include-additional-sections-in-a-build.md +47 -0
- package/agent-docs/publish/single-source-sites.sections/related-reading.md +43 -0
- package/agent-docs/publish/single-source-sites.sections/select-the-pages-for-each-site.md +74 -0
- package/agent-docs/publish/single-source-sites.sections/share-the-base-configuration.md +93 -0
- package/agent-docs/reference/agent-skills.md +2 -2
- package/agent-docs/search-index.json +1 -1
- package/agent-docs/start.md +3 -3
- package/agent-docs/start.sections/add-the-page-to-navigation.md +2 -2
- package/agent-docs/start.sections/build-and-check-both-outputs.md +2 -2
- package/agent-docs/start.sections/build-this-site.md +2 -2
- package/agent-docs/start.sections/check-writing-style.md +2 -2
- package/agent-docs/start.sections/create-a-page.md +2 -2
- package/agent-docs/start.sections/make-it-yours.md +2 -2
- package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
- package/agent-docs/start.sections/prerequisites.md +2 -2
- package/agent-docs/start.sections/related-reading.md +2 -2
- package/agent-docs/start.sections/start-your-own-project.md +3 -3
- package/agent-docs/status.md +6 -4
- package/agent-docs/styling/themes.md +7 -3
- package/agent-docs/what-is-shoalrun.md +2 -2
- package/assets/search-lexical.js +15 -4
- package/dist/artifact-bundle.d.ts +1 -0
- package/dist/artifact-bundle.js +11 -3
- package/dist/cli-discovery.d.ts +1 -1
- package/dist/cli-discovery.js +1 -0
- package/dist/cli.js +7 -0
- package/dist/code-reference-model.d.ts +85 -0
- package/dist/code-reference-model.js +73 -0
- package/dist/code-references.d.ts +23 -0
- package/dist/code-references.js +371 -0
- package/dist/compiler-config.d.ts +1 -0
- package/dist/compiler.d.ts +8 -0
- package/dist/compiler.js +14 -7
- package/dist/component-names.js +1 -1
- package/dist/component-transform.js +14 -22
- package/dist/conditional-tree.d.ts +2 -0
- package/dist/conditional-tree.js +14 -0
- package/dist/config.js +1 -1
- package/dist/content-delivery-contract.d.ts +39 -0
- package/dist/content-delivery-contract.js +2 -0
- package/dist/content-delivery-validation.d.ts +6 -0
- package/dist/content-delivery-validation.js +6 -0
- package/dist/content-delivery.d.ts +19 -1
- package/dist/content-delivery.js +10 -1
- package/dist/content-export-command.d.ts +42 -3
- package/dist/content-export.d.ts +42 -3
- package/dist/content-export.js +15 -6
- package/dist/content-filter.d.ts +2 -0
- package/dist/content-filter.js +4 -0
- package/dist/content-mount.d.ts +12 -1
- package/dist/content-mount.js +8 -1
- package/dist/content-rest-client.d.ts +11 -1
- package/dist/content-rest-client.js +4 -1
- package/dist/content-rest-contract.d.ts +5 -0
- package/dist/content-source.d.ts +2 -0
- package/dist/content-workspace.d.ts +5 -1
- package/dist/content-workspace.js +7 -2
- package/dist/deployment-profile.d.ts +3 -1
- package/dist/deployment-profile.js +18 -19
- package/dist/fonts.d.ts +9 -0
- package/dist/fonts.js +58 -3
- package/dist/page-materialization.js +3 -2
- package/dist/page-renderer.d.ts +1 -0
- package/dist/page-renderer.js +3 -1
- package/dist/palettes.d.ts +1 -1
- package/dist/publication-manifest.js +1 -1
- package/dist/publication-render.d.ts +2 -1
- package/dist/publication-render.js +2 -2
- package/dist/representation-tree.js +12 -2
- package/dist/search-query.js +13 -6
- package/dist/section-selection.d.ts +29 -0
- package/dist/section-selection.js +92 -0
- package/dist/snippets.d.ts +1 -0
- package/example-configs/facet-sections/README.md +37 -0
- package/example-configs/facet-sections/base.yaml +29 -0
- package/example-configs/facet-sections/content/billing.mdx +25 -0
- package/example-configs/facet-sections/customer.config.yaml +4 -0
- package/example-configs/facet-sections/docs.config.yaml +3 -0
- package/example-configs/faceted-sites/README.md +4 -2
- package/examples/code-references/content/start.md +53 -0
- package/examples/code-references/docs.config.yaml +262 -0
- package/examples/code-references/python/orchard/__init__.py +11 -0
- package/examples/code-references/python/orchard/client.py +212 -0
- package/examples/code-references/python/orchard/errors.py +31 -0
- package/examples/code-references/python/orchard/models.py +69 -0
- package/examples/code-references/python/orchard/pagination.py +39 -0
- package/examples/code-references/reference.json +1244 -0
- package/package.json +9 -1
- package/schemas/code-reference.schema.json +306 -0
- package/skills/shoalrun-author/SKILL.md +17 -0
- package/skills/shoalrun-author/references/code-api-references.md +19 -0
- package/skills/shoalrun-author/references/facet-selection.md +48 -0
- package/skills/shoalrun-brand/SKILL.md +9 -0
- package/skills/shoalrun-component-author/SKILL.md +9 -0
- package/skills/shoalrun-pdf/SKILL.md +9 -0
- package/skills/shoalrun-recipes/SKILL.md +9 -0
- package/skills/shoalrun-setup/SKILL.md +9 -0
- package/skills/shoalrun-walkthrough/SKILL.md +9 -0
- package/styles/site.css +61 -2
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { renderHtmlWithHeadings } from './html-renderer.js';
|
|
5
|
+
import { readCodeReference } from './code-reference-model.js';
|
|
6
|
+
import { explainSegments } from './config.js';
|
|
7
|
+
import { resolvePublication } from './compiler-config.js';
|
|
8
|
+
import { resolveFrontmatter, validateFrontmatter, applyFormattingLocale } from './frontmatter.js';
|
|
9
|
+
import { matchesFeatures, validateFeatureClassification } from './deployment-profile.js';
|
|
10
|
+
import { pageReaderFilters } from './reader-filters.js';
|
|
11
|
+
import { matchesContentFilter } from './content-filter.js';
|
|
12
|
+
import { documentKey } from './publication-identity.js';
|
|
13
|
+
import { routeFor, markdownRoute } from './content-source.js';
|
|
14
|
+
import { heading, paragraph, text, parsePlainMarkdown, root } from './semantic-markdown.js';
|
|
15
|
+
const mapping = z.record(z.string(), z.unknown());
|
|
16
|
+
const source = z.object({ kind: z.literal('file'), path: z.string().min(1) }).strict();
|
|
17
|
+
const override = z.object({ documentId: z.string().min(1).optional(), slug: z.string().startsWith('/').optional(), metadata: mapping.optional() }).strict();
|
|
18
|
+
const catalogSchema = z.object({
|
|
19
|
+
source: source.optional(),
|
|
20
|
+
sourceLink: z.object({ baseUrl: z.string().url().refine(value => { const url = new URL(value); return url.protocol === 'https:' && !url.username && !url.password && !url.search && !url.hash; }, 'Source links need an HTTPS base URL without credentials, query or fragment') }).strict().optional(),
|
|
21
|
+
publications: z.array(z.object({ product: z.string().optional(), channel: z.string(), version: z.string(), language: z.string().optional(), source }).strict()).min(1).optional(),
|
|
22
|
+
layout: z.enum(['symbols', 'classes', 'modules']).default('symbols'),
|
|
23
|
+
singlePage: z.union([z.literal(false), z.object({ documentId: z.string().min(1).optional(), slug: z.string().startsWith('/').optional(), title: z.string().min(1).default('Complete API reference'), summary: z.string().min(1).default('Classes, functions, and fields in this publication.'), metadata: mapping.optional() }).strict()]).optional(),
|
|
24
|
+
pathPrefix: z.string().regex(/^\/[a-zA-Z0-9_/-]+$/).default('/reference/code'),
|
|
25
|
+
metadata: mapping.optional(),
|
|
26
|
+
include: z.array(z.string()).optional(), exclude: z.array(z.string()).optional(),
|
|
27
|
+
symbols: z.record(z.string(), override).optional()
|
|
28
|
+
}).strict().refine(value => !!value.source !== !!value.publications, 'Declare source or publications');
|
|
29
|
+
const hash = (value) => createHash('sha256').update(value).digest('hex').slice(0, 16);
|
|
30
|
+
export function codeDocumentId(catalog, symbol) { return `reference.${catalog}.${/^[A-Za-z0-9_.-]+$/.test(symbol) ? symbol : hash(symbol)}`; }
|
|
31
|
+
export async function materializeCodeReferences(input) {
|
|
32
|
+
const { config, loaded, plan, base, basePath, variants, language, readerFilters, contentFilter, dependencies } = input;
|
|
33
|
+
if (config.codeReferences === undefined)
|
|
34
|
+
return;
|
|
35
|
+
const catalogs = z.record(z.string().regex(/^[a-z][a-z0-9-]*$/), catalogSchema).parse(config.codeReferences);
|
|
36
|
+
const owners = new Map([...plan.knownDocumentIds].map(id => [id, 'authored']));
|
|
37
|
+
for (const [catalogId, catalog] of Object.entries(catalogs)) {
|
|
38
|
+
const bindings = catalog.publications ?? [{ ...resolvePublication(config.publications, config.publications.defaults ?? {}, language), source: catalog.source }];
|
|
39
|
+
const seenPublications = new Set();
|
|
40
|
+
for (const [index, binding] of bindings.entries()) {
|
|
41
|
+
const variant = resolvePublication(config.publications, binding, language);
|
|
42
|
+
const identity = documentKey(catalogId, variant);
|
|
43
|
+
if (seenPublications.has(identity))
|
|
44
|
+
throw new Error(`Duplicate code reference publication ${identity}`);
|
|
45
|
+
seenPublications.add(identity);
|
|
46
|
+
const segments = ['codeReferences', catalogId, ...(catalog.publications ? ['publications', String(index)] : []), 'source', 'path'];
|
|
47
|
+
const owner = explainSegments(loaded, segments).source.file;
|
|
48
|
+
if (path.isAbsolute(binding.source.path) || /^[a-z][a-z0-9+.-]*:/i.test(binding.source.path))
|
|
49
|
+
throw new Error('Code reference sources need local relative paths');
|
|
50
|
+
const file = path.resolve(path.dirname(owner), binding.source.path);
|
|
51
|
+
dependencies.add(file);
|
|
52
|
+
const snapshot = await readCodeReference(file, base);
|
|
53
|
+
const symbols = new Map(snapshot.symbols.map(symbol => [symbol.id, symbol]));
|
|
54
|
+
for (const name of [...catalog.include ?? [], ...catalog.exclude ?? [], ...Object.keys(catalog.symbols ?? {})])
|
|
55
|
+
if (!symbols.has(name))
|
|
56
|
+
throw new Error(`Code reference ${catalogId}: unknown selected symbol ${name}`);
|
|
57
|
+
const visibility = new Map();
|
|
58
|
+
for (const symbol of snapshot.symbols) {
|
|
59
|
+
const chain = [];
|
|
60
|
+
let ancestor = symbol;
|
|
61
|
+
while (ancestor && !visibility.has(ancestor.id)) {
|
|
62
|
+
chain.push(ancestor);
|
|
63
|
+
ancestor = ancestor.parent ? symbols.get(ancestor.parent) : undefined;
|
|
64
|
+
}
|
|
65
|
+
let visible = ancestor ? visibility.get(ancestor.id) : true;
|
|
66
|
+
for (const entry of chain.reverse()) {
|
|
67
|
+
visible = visible && entry.visibility === 'public';
|
|
68
|
+
visibility.set(entry.id, visible);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const symbol of snapshot.symbols) {
|
|
72
|
+
const selected = visibility.get(symbol.id) && (!catalog.include || catalog.include.includes(symbol.id)) && !catalog.exclude?.includes(symbol.id);
|
|
73
|
+
const setting = catalog.symbols?.[symbol.id];
|
|
74
|
+
const inherited = { ...catalog.metadata };
|
|
75
|
+
if (setting?.metadata && (Object.hasOwn(setting.metadata, 'shared') || Object.hasOwn(setting.metadata, 'requires'))) {
|
|
76
|
+
delete inherited.shared;
|
|
77
|
+
delete inherited.requires;
|
|
78
|
+
}
|
|
79
|
+
const metadata = { ...inherited, ...setting?.metadata };
|
|
80
|
+
const id = setting?.documentId ?? codeDocumentId(catalogId, symbol.id);
|
|
81
|
+
const ownerId = `${catalogId}:${symbol.id}`;
|
|
82
|
+
if (owners.has(id) && owners.get(id) !== ownerId)
|
|
83
|
+
throw new Error(`Duplicate code reference document ID ${id}`);
|
|
84
|
+
owners.set(id, ownerId);
|
|
85
|
+
plan.knownDocumentIds.add(id);
|
|
86
|
+
const existing = plan.knownDocumentTypes.get(id);
|
|
87
|
+
if (existing && existing !== 'code-reference')
|
|
88
|
+
throw new Error(`Duplicate code reference document ID ${id}`);
|
|
89
|
+
plan.knownDocumentTypes.set(id, 'code-reference');
|
|
90
|
+
const pageSource = {
|
|
91
|
+
...metadata, id, title: symbol.name, summary: symbol.summary ?? `${symbol.kind}: ${symbol.id}`,
|
|
92
|
+
type: 'code-reference', slug: setting?.slug ?? `${catalog.pathPrefix}/${symbol.id.toLowerCase().replace(/[^a-z0-9_-]+/g, '-')}-${hash(symbol.id)}`,
|
|
93
|
+
...variant
|
|
94
|
+
};
|
|
95
|
+
const frontmatter = resolveFrontmatter(pageSource, config.frontmatter);
|
|
96
|
+
frontmatter.access ??= { policy: 'public' };
|
|
97
|
+
if (catalog.layout !== 'symbols')
|
|
98
|
+
frontmatter.tocDepth ??= 2;
|
|
99
|
+
for (const [field, expected] of Object.entries({ id, type: 'code-reference', ...variant }))
|
|
100
|
+
if (frontmatter[field] !== expected)
|
|
101
|
+
throw new Error(`Code reference ${id}: enforced ${field} conflicts with its catalog`);
|
|
102
|
+
applyFormattingLocale(frontmatter, config.frontmatter, pageSource);
|
|
103
|
+
validateFrontmatter(frontmatter, config.frontmatter, file, pageSource);
|
|
104
|
+
const classification = loaded.deployment?.context.classificationPublications ?? variants;
|
|
105
|
+
if (selected && frontmatter.access?.policy === 'public' && classification.some(item => documentKey(catalogId, item) === identity))
|
|
106
|
+
validateFeatureClassification(metadata, loaded.deployment?.context, `${file}: ${symbol.id}`);
|
|
107
|
+
if (!selected || !matchesFeatures(frontmatter.requires, loaded.deployment?.context, `${file}: ${symbol.id}`) || !variants.some(item => documentKey(catalogId, item) === identity))
|
|
108
|
+
continue;
|
|
109
|
+
if (frontmatter.access?.policy !== 'public')
|
|
110
|
+
continue;
|
|
111
|
+
const marks = pageReaderFilters(frontmatter, readerFilters, file);
|
|
112
|
+
if (!matchesContentFilter(marks, contentFilter))
|
|
113
|
+
continue;
|
|
114
|
+
const key = documentKey(id, variant);
|
|
115
|
+
if (plan.docs.has(key))
|
|
116
|
+
throw new Error(`Duplicate code reference document ${id}`);
|
|
117
|
+
const route = routeFor(frontmatter, variant, config);
|
|
118
|
+
const collision = plan.routeOwners.get(route.toLowerCase());
|
|
119
|
+
if (collision && !input.allowRouteCollisions)
|
|
120
|
+
throw new Error(`Code reference route collision ${route}`);
|
|
121
|
+
plan.routeOwners.set(route.toLowerCase(), key);
|
|
122
|
+
plan.docs.set(key, { file, frontmatter, variant, route, markdownRoute: markdownRoute(route, basePath), readerFilters: marks, featureContext: loaded.deployment?.context, body: '', tree: null, codeReference: { catalog: catalogId, programmingLanguage: snapshot.programmingLanguage, symbol, layout: catalog.layout, ...(catalog.sourceLink && symbol.source ? { sourceUrl: catalog.sourceLink.baseUrl.replace(/\/$/, '') + '/' + symbol.source.path.split('/').map(encodeURIComponent).join('/') + (symbol.source.line ? `#L${symbol.source.line}` : '') } : {}) } });
|
|
123
|
+
}
|
|
124
|
+
if (catalog.singlePage) {
|
|
125
|
+
const single = catalog.singlePage;
|
|
126
|
+
const id = single.documentId ?? `reference.${catalogId}.complete`;
|
|
127
|
+
const ownerId = `${catalogId}:complete-page`;
|
|
128
|
+
if (owners.has(id) && owners.get(id) !== ownerId)
|
|
129
|
+
throw new Error(`Duplicate code reference document ID ${id}`);
|
|
130
|
+
owners.set(id, ownerId);
|
|
131
|
+
plan.knownDocumentIds.add(id);
|
|
132
|
+
plan.knownDocumentTypes.set(id, 'code-reference');
|
|
133
|
+
const inherited = { ...catalog.metadata };
|
|
134
|
+
if (single.metadata && (Object.hasOwn(single.metadata, 'shared') || Object.hasOwn(single.metadata, 'requires'))) {
|
|
135
|
+
delete inherited.shared;
|
|
136
|
+
delete inherited.requires;
|
|
137
|
+
}
|
|
138
|
+
const metadata = { ...inherited, ...single.metadata };
|
|
139
|
+
const source = { ...metadata, id, title: single.title, summary: single.summary, type: 'code-reference', slug: single.slug ?? `${catalog.pathPrefix}/all`, ...variant };
|
|
140
|
+
const frontmatter = resolveFrontmatter(source, config.frontmatter);
|
|
141
|
+
frontmatter.access ??= { policy: 'public' };
|
|
142
|
+
for (const [field, expected] of Object.entries({ id, type: 'code-reference', ...variant }))
|
|
143
|
+
if (frontmatter[field] !== expected)
|
|
144
|
+
throw new Error(`Code reference ${id}: enforced ${field} conflicts with its catalog`);
|
|
145
|
+
applyFormattingLocale(frontmatter, config.frontmatter, source);
|
|
146
|
+
validateFrontmatter(frontmatter, config.frontmatter, file, source);
|
|
147
|
+
frontmatter.tocDepth ??= 2;
|
|
148
|
+
const active = variants.some(item => documentKey(catalogId, item) === identity);
|
|
149
|
+
const classification = loaded.deployment?.context.classificationPublications ?? variants;
|
|
150
|
+
if (frontmatter.access?.policy === 'public' && classification.some(item => documentKey(catalogId, item) === identity))
|
|
151
|
+
validateFeatureClassification(metadata, loaded.deployment?.context, `${file}: ${id}`);
|
|
152
|
+
const granted = matchesFeatures(frontmatter.requires, loaded.deployment?.context, `${file}: ${id}`);
|
|
153
|
+
const marks = pageReaderFilters(frontmatter, readerFilters, file);
|
|
154
|
+
const hasContent = [...plan.docs.values()].some(doc => doc.codeReference?.catalog === catalogId && documentKey(catalogId, doc.variant) === identity);
|
|
155
|
+
if (active && granted && hasContent && frontmatter.access.policy === 'public' && matchesContentFilter(marks, contentFilter)) {
|
|
156
|
+
const key = documentKey(id, variant);
|
|
157
|
+
if (plan.docs.has(key))
|
|
158
|
+
throw new Error(`Duplicate code reference document ${id}`);
|
|
159
|
+
const route = routeFor(frontmatter, variant, config);
|
|
160
|
+
if (plan.routeOwners.has(route.toLowerCase()) && !input.allowRouteCollisions)
|
|
161
|
+
throw new Error(`Code reference route collision ${route}`);
|
|
162
|
+
plan.routeOwners.set(route.toLowerCase(), key);
|
|
163
|
+
plan.docs.set(key, { file, frontmatter, variant, route, markdownRoute: markdownRoute(route, basePath), readerFilters: marks, featureContext: loaded.deployment?.context, body: '', tree: null,
|
|
164
|
+
codeReference: { catalog: catalogId, programmingLanguage: snapshot.programmingLanguage, complete: true, symbol: { id, name: single.title, kind: 'module', visibility: 'public' } } });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Imported prose is inert Markdown; it never enters MDX or project directive expansion. */
|
|
171
|
+
export function renderCodeReference(reference, doc, documents) {
|
|
172
|
+
const eligible = new Map();
|
|
173
|
+
for (const candidate of documents.values())
|
|
174
|
+
if (candidate.codeReference?.catalog === reference.catalog && !candidate.codeReference.complete && documentKey('scope', candidate.variant) === documentKey('scope', doc.variant))
|
|
175
|
+
eligible.set(candidate.codeReference.symbol.id, candidate);
|
|
176
|
+
const owner = (page) => {
|
|
177
|
+
let parent = page.codeReference.symbol.parent;
|
|
178
|
+
while (parent) {
|
|
179
|
+
const candidate = eligible.get(parent);
|
|
180
|
+
if (!candidate)
|
|
181
|
+
return;
|
|
182
|
+
const kind = candidate.codeReference.symbol.kind;
|
|
183
|
+
if (['module', 'namespace'].includes(kind) || reference.layout === 'classes' && ['class', 'interface', 'enum', 'type'].includes(kind))
|
|
184
|
+
return parent;
|
|
185
|
+
parent = candidate.codeReference.symbol.parent;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const embedded = [...eligible.values()].filter(page => reference.complete || reference.layout !== undefined && reference.layout !== 'symbols' && owner(page) === reference.symbol.id)
|
|
189
|
+
.sort((a, b) => a.codeReference.symbol.id < b.codeReference.symbol.id ? -1 : 1);
|
|
190
|
+
const blocks = reference.complete ? [] : renderCodeSymbol(reference, doc, eligible, false).children;
|
|
191
|
+
const headings = new Map();
|
|
192
|
+
for (const page of embedded) {
|
|
193
|
+
const entry = heading(2, page.codeReference.symbol.id);
|
|
194
|
+
headings.set(entry, page);
|
|
195
|
+
const content = renderCodeSymbol(page.codeReference, page, eligible, true).children;
|
|
196
|
+
const deepen = (node) => { if (node.type === 'heading')
|
|
197
|
+
node.depth = Math.min(6, node.depth + 1); for (const child of node.children ?? [])
|
|
198
|
+
deepen(child); };
|
|
199
|
+
content.forEach(deepen);
|
|
200
|
+
blocks.push(entry, ...content);
|
|
201
|
+
}
|
|
202
|
+
const tree = root(blocks);
|
|
203
|
+
if (embedded.length) {
|
|
204
|
+
// Use the renderer's actual heading allocation, including duplicate headings.
|
|
205
|
+
const reserved = ['main', 'docs-navigation', 'docs-sections', 'documentation-menu', 'page-outline', 'nav-filter', 'examples-title', 'api-view-select'];
|
|
206
|
+
const rendered = renderHtmlWithHeadings(tree, undefined, reserved).headings;
|
|
207
|
+
const targets = new Map();
|
|
208
|
+
let index = 0;
|
|
209
|
+
const collect = (node) => {
|
|
210
|
+
if (node.type === 'heading' && node.depth >= 2 && node.depth <= 6) {
|
|
211
|
+
const target = headings.get(node);
|
|
212
|
+
if (target)
|
|
213
|
+
targets.set(target.frontmatter.id, rendered[index].id);
|
|
214
|
+
index++;
|
|
215
|
+
}
|
|
216
|
+
for (const child of node.children ?? [])
|
|
217
|
+
collect(child);
|
|
218
|
+
};
|
|
219
|
+
collect(tree);
|
|
220
|
+
const relink = (node) => {
|
|
221
|
+
const anchor = targets.get(node.exportDocumentId);
|
|
222
|
+
if (node.type === 'link' && anchor) {
|
|
223
|
+
node.url = `${doc.route}#${anchor}`;
|
|
224
|
+
node.exportDocumentId = doc.frontmatter.id;
|
|
225
|
+
}
|
|
226
|
+
for (const child of node.children ?? [])
|
|
227
|
+
relink(child);
|
|
228
|
+
};
|
|
229
|
+
relink(tree);
|
|
230
|
+
}
|
|
231
|
+
return tree;
|
|
232
|
+
}
|
|
233
|
+
function renderCodeSymbol(reference, doc, eligible, embedded) {
|
|
234
|
+
const prose = (value = '') => {
|
|
235
|
+
const parsed = parsePlainMarkdown(value);
|
|
236
|
+
const definitions = new Map();
|
|
237
|
+
const collect = (node) => { if (node.type === 'definition')
|
|
238
|
+
definitions.set(node.identifier.toLowerCase(), node); for (const child of node.children ?? [])
|
|
239
|
+
collect(child); };
|
|
240
|
+
parsed.forEach(collect);
|
|
241
|
+
const clean = (node) => {
|
|
242
|
+
if (node.type === 'definition')
|
|
243
|
+
return [];
|
|
244
|
+
if (node.type === 'linkReference') {
|
|
245
|
+
const definition = definitions.get(node.identifier.toLowerCase());
|
|
246
|
+
if (!definition)
|
|
247
|
+
return (node.children ?? []).flatMap(clean);
|
|
248
|
+
node = { type: 'link', url: definition.url, title: definition.title, children: node.children };
|
|
249
|
+
}
|
|
250
|
+
if (node.type === 'image' || node.type === 'imageReference')
|
|
251
|
+
throw new Error(`${doc.file}: code reference prose images need explicit asset support`);
|
|
252
|
+
if (typeof node.url === 'string') {
|
|
253
|
+
if (node.url.startsWith('symbol:')) {
|
|
254
|
+
const target = eligible.get(node.url.slice(7));
|
|
255
|
+
if (!target)
|
|
256
|
+
return (node.children ?? []).flatMap(clean);
|
|
257
|
+
node = { ...node, url: target.route, exportDocumentId: target.frontmatter.id };
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const url = new URL(node.url, 'https://code-reference.invalid');
|
|
261
|
+
if (!['https:', 'mailto:'].includes(url.protocol) || url.username || url.password || url.origin === 'https://code-reference.invalid')
|
|
262
|
+
throw new Error(`${doc.file}: unsupported code reference prose URL ${node.url}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return [{ ...node, ...(node.children ? { children: node.children.flatMap(clean) } : {}) }];
|
|
266
|
+
};
|
|
267
|
+
return parsed.flatMap(clean);
|
|
268
|
+
};
|
|
269
|
+
const symbol = reference.symbol;
|
|
270
|
+
const inlineCode = (value) => ({ type: 'inlineCode', value });
|
|
271
|
+
const code = (value, signature = false) => ({ type: 'code', lang: reference.programmingLanguage, value,
|
|
272
|
+
...(signature ? { data: { hProperties: { className: [`language-${reference.programmingLanguage}`, 'code-reference-signature'] } } } : {}) });
|
|
273
|
+
const pageLink = (page, label = page.frontmatter.title) => ({ type: 'link', url: page.route, exportDocumentId: page.frontmatter.id, children: [inlineCode(label)] });
|
|
274
|
+
// References are explicit converter data; never guess an ambiguous short name.
|
|
275
|
+
const typeNodes = (value, context = symbol) => {
|
|
276
|
+
const tokens = Object.keys(context.typeReferences ?? {}).sort((a, b) => b.length - a.length);
|
|
277
|
+
if (!tokens.length)
|
|
278
|
+
return [inlineCode(value)];
|
|
279
|
+
const output = [];
|
|
280
|
+
let plain = '';
|
|
281
|
+
for (let offset = 0; offset < value.length;) {
|
|
282
|
+
const match = tokens.find(token => value.startsWith(token, offset) && !/[\p{L}\p{N}_.$]/u.test(value[offset - 1] ?? '') && !/[\p{L}\p{N}_.$]/u.test(value[offset + token.length] ?? ''));
|
|
283
|
+
const page = match ? eligible.get(context.typeReferences[match]) : undefined;
|
|
284
|
+
if (match && page) {
|
|
285
|
+
if (plain)
|
|
286
|
+
output.push(inlineCode(plain));
|
|
287
|
+
plain = '';
|
|
288
|
+
output.push(pageLink(page, match));
|
|
289
|
+
offset += match.length;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
plain += value[offset];
|
|
293
|
+
offset++;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (plain)
|
|
297
|
+
output.push(inlineCode(plain));
|
|
298
|
+
return output;
|
|
299
|
+
};
|
|
300
|
+
const table = (headers, rows, label) => ({ type: 'table', align: headers.map(() => null),
|
|
301
|
+
data: { referenceTableLabel: label, hProperties: { className: ['code-reference-table'] } }, children: [headers.map(value => [text(value)]), ...rows].map(cells => ({ type: 'tableRow', children: cells.map(children => ({ type: 'tableCell', children })) })) });
|
|
302
|
+
const summary = (value) => {
|
|
303
|
+
const nodes = prose(value);
|
|
304
|
+
const paragraph = nodes.find(node => node.type === 'paragraph');
|
|
305
|
+
return paragraph?.children ?? [text('—')];
|
|
306
|
+
};
|
|
307
|
+
const description = prose(symbol.description);
|
|
308
|
+
// Hide the repeated summary only in the website shell; exports retain it.
|
|
309
|
+
if (description[0]?.type === 'paragraph') {
|
|
310
|
+
const plain = (node) => node.value ?? (node.children ?? []).map(plain).join('');
|
|
311
|
+
if (!embedded && plain(description[0]).trim() === doc.frontmatter.summary.trim())
|
|
312
|
+
description[0] = { ...description[0], data: { hProperties: { className: ['code-reference-summary'] } } };
|
|
313
|
+
}
|
|
314
|
+
const identity = paragraph({ type: 'strong', children: [text(symbol.kind.charAt(0).toUpperCase() + symbol.kind.slice(1))] }, text(' '), inlineCode(symbol.id), ...(reference.sourceUrl ? [text(' · '), { type: 'link', url: reference.sourceUrl, children: [text('View source')] }] : []));
|
|
315
|
+
identity.data = { hProperties: { className: ['code-reference-identity'] } };
|
|
316
|
+
const blocks = [identity, ...(symbol.signatures?.length ? [code(symbol.signatures.join('\n\n'), true)] : []), ...description];
|
|
317
|
+
if (symbol.constructorSignature)
|
|
318
|
+
blocks.push(heading(2, 'Constructor'), code(symbol.constructorSignature, true));
|
|
319
|
+
if (symbol.bases?.length)
|
|
320
|
+
blocks.push(paragraph({ type: 'strong', children: [text('Bases: ')] }, ...symbol.bases.flatMap((base, i) => [...(i ? [text(', ')] : []), ...typeNodes(base)])));
|
|
321
|
+
if (symbol.annotation)
|
|
322
|
+
blocks.push(paragraph({ type: 'strong', children: [text('Type: ')] }, ...typeNodes(symbol.annotation)));
|
|
323
|
+
if (symbol.required !== undefined || symbol.default !== undefined)
|
|
324
|
+
blocks.push(paragraph(...(symbol.required === undefined ? [] : [text(symbol.required ? 'Required' : 'Optional')]), ...(symbol.default === undefined ? [] : [text(symbol.required === undefined ? 'Default: ' : ' · Default: '), inlineCode(symbol.default)])));
|
|
325
|
+
const details = (title, items) => {
|
|
326
|
+
if (!items.length)
|
|
327
|
+
return;
|
|
328
|
+
blocks.push(heading(2, title));
|
|
329
|
+
blocks.push(table(title === 'Parameters' ? ['Parameter', 'Type / default', 'Description'] : ['Exception', 'Description'], items.map(item => {
|
|
330
|
+
const kind = [...(item.type ? typeNodes(item.type) : [text('—')]), ...(item.default === undefined ? [] : [text(' = '), inlineCode(item.default)])];
|
|
331
|
+
return title === 'Parameters' ? [[inlineCode(item.name)], kind, summary(item.description)] : [typeNodes(item.name), summary(item.description)];
|
|
332
|
+
}), title));
|
|
333
|
+
// Preserve richer Markdown without forcing block content into a table cell.
|
|
334
|
+
for (const item of items) {
|
|
335
|
+
const content = prose(item.description);
|
|
336
|
+
if (content.length > 1 || content.some(node => node.type !== 'paragraph'))
|
|
337
|
+
blocks.push(heading(3, item.name), ...content);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
details('Parameters', symbol.parameters ?? []);
|
|
341
|
+
for (const [title, result] of [['Returns', symbol.returns], ['Yields', symbol.yields]])
|
|
342
|
+
if (result) {
|
|
343
|
+
blocks.push(heading(2, title));
|
|
344
|
+
if (result.type)
|
|
345
|
+
blocks.push(paragraph(...typeNodes(result.type)));
|
|
346
|
+
blocks.push(...prose(result.description));
|
|
347
|
+
}
|
|
348
|
+
details('Raises', symbol.raises ?? []);
|
|
349
|
+
if (symbol.examples?.length) {
|
|
350
|
+
blocks.push(heading(2, 'Examples'));
|
|
351
|
+
for (const example of symbol.examples)
|
|
352
|
+
blocks.push(...(example.title ? [heading(3, example.title)] : []), code(example.code));
|
|
353
|
+
}
|
|
354
|
+
const members = [...eligible.values()].filter(item => item.codeReference?.symbol.parent === symbol.id).sort((a, b) => a.frontmatter.title < b.frontmatter.title ? -1 : a.frontmatter.title > b.frontmatter.title ? 1 : 0);
|
|
355
|
+
const fields = members.filter(page => ['attribute', 'property', 'constant'].includes(page.codeReference.symbol.kind));
|
|
356
|
+
const callables = members.filter(page => ['function', 'method', 'constructor'].includes(page.codeReference.symbol.kind));
|
|
357
|
+
const types = members.filter(page => !fields.includes(page) && !callables.includes(page));
|
|
358
|
+
for (const [title, pages] of [['Fields', fields], [['module', 'namespace'].includes(symbol.kind) ? 'Functions' : 'Methods', callables], ['Members', types]])
|
|
359
|
+
if (pages.length) {
|
|
360
|
+
blocks.push(heading(2, title), table(title === 'Fields' ? ['Name', 'Type', 'Required / default', 'Description'] : ['Name', 'Kind', 'Description'], pages.map(page => {
|
|
361
|
+
const member = page.codeReference.symbol;
|
|
362
|
+
const declaration = member.signatures?.[0];
|
|
363
|
+
const annotation = declaration?.startsWith(member.name + ': ') ? declaration.slice(member.name.length + 2) : undefined;
|
|
364
|
+
return title === 'Fields' ? [[pageLink(page)], typeNodes(member.annotation ?? annotation ?? member.kind, member), [...(member.required === undefined ? [] : [text(member.required ? 'Required' : 'Optional')]), ...(member.default === undefined ? [] : [text(member.required === undefined ? '' : ' · '), inlineCode(member.default)]), ...(member.required === undefined && member.default === undefined ? [text('—')] : [])], summary(member.summary ?? member.description)] : [[pageLink(page)], [inlineCode(member.kind)], summary(member.summary ?? member.description)];
|
|
365
|
+
}), title));
|
|
366
|
+
}
|
|
367
|
+
const related = (symbol.seeAlso ?? []).flatMap(id => eligible.has(id) ? [eligible.get(id)] : []);
|
|
368
|
+
if (related.length)
|
|
369
|
+
blocks.push(heading(2, 'See also'), { type: 'list', ordered: false, children: related.map(page => ({ type: 'listItem', children: [paragraph(pageLink(page))] })) });
|
|
370
|
+
return root(blocks);
|
|
371
|
+
}
|
package/dist/compiler.d.ts
CHANGED
|
@@ -39,6 +39,14 @@ export declare function compile(configFile: string, destination?: string, proven
|
|
|
39
39
|
}>;
|
|
40
40
|
}>;
|
|
41
41
|
}[];
|
|
42
|
+
contentSelection: {
|
|
43
|
+
selection: import("./reader-filters.js").ReaderSelection | null;
|
|
44
|
+
decisions: Record<string, unknown>[];
|
|
45
|
+
warnings: {
|
|
46
|
+
code: string;
|
|
47
|
+
message: string;
|
|
48
|
+
}[];
|
|
49
|
+
};
|
|
42
50
|
profileSelection: {
|
|
43
51
|
schemaVersion: number;
|
|
44
52
|
profileDigest: string;
|
package/dist/compiler.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sectionSelectionReport, writeSectionSelectionReport } from './section-selection.js';
|
|
1
2
|
import { buildPdfSiteArtifacts } from './pdf-site.js';
|
|
2
3
|
import { resolvePdfButton, validatePdfButtonStyle } from './pdf-button.js';
|
|
3
4
|
import { documentKey, publicationKey, samePublication } from './publication-identity.js';
|
|
@@ -18,7 +19,7 @@ import { validateAuthoringGuidance } from './authoring-guidance.js';
|
|
|
18
19
|
import { loadFreshness } from './freshness.js';
|
|
19
20
|
import { resolveAgentDiscovery } from './agent-discovery.js';
|
|
20
21
|
import { iconLicenseFile } from './icons.js';
|
|
21
|
-
import { bundledFontLicenses, bundledFonts, fontsCss, resolveFonts } from './fonts.js';
|
|
22
|
+
import { bundledFontLicenses, bundledFonts, fontsCss, resolveFonts, prepareFontAssets, customFontPreloads } from './fonts.js';
|
|
22
23
|
import { bundledShareFonts, resolveShareImages, shareRoute } from './share-images.js';
|
|
23
24
|
import { buildInfo } from './build-info.js';
|
|
24
25
|
import { validateRelationships } from './cards.js';
|
|
@@ -175,6 +176,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
|
|
|
175
176
|
for (const face of fonts.faces)
|
|
176
177
|
if (fonts.faces.some(other => other.route === face.route && other.file !== face.file))
|
|
177
178
|
throw new Error(`theme.fonts: two font files share the name ${path.basename(face.file)}; rename one`);
|
|
179
|
+
const projectFontAssets = await prepareFontAssets(fonts);
|
|
178
180
|
const generatedFontsCss = fontsCss(fonts);
|
|
179
181
|
// A temporary preview aid: a floating shape and palette switcher on every page. Remove it before launch.
|
|
180
182
|
// `demo` ships it hidden until a page is opened with ?theme-switcher.
|
|
@@ -305,7 +307,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
|
|
|
305
307
|
const varying = (field) => new Set(variants.map(variant => variant[field])).size > 1;
|
|
306
308
|
const editionLabel = (variant) => editionBadge === 'never' ? '' : ['product', 'channel', 'version', 'language']
|
|
307
309
|
.filter(field => variant[field] !== undefined && (editionBadge === 'always' || varying(field))).map(field => variant[field]).join(' · ');
|
|
308
|
-
const { docs, knownDocumentIds, knownDocumentTypes, routeOwners, contentDir, snippets, apiPlan, api, sourceForVariant, knownOperations, relatedApiTargets, guidesByApi, sourceForOperation } = await prepareContentWorkspace({
|
|
310
|
+
const { sectionSelection, docs, knownDocumentIds, knownDocumentTypes, routeOwners, contentDir, snippets, apiPlan, api, sourceForVariant, knownOperations, relatedApiTargets, guidesByApi, sourceForOperation } = await prepareContentWorkspace({
|
|
309
311
|
base, basePath, config, loaded, variants, language, readerFilters, contentFilter, metadataProvider, metadataDependencies,
|
|
310
312
|
sourceOverrides: options.sourceOverrides, authoringFiles: options.authoringFiles
|
|
311
313
|
});
|
|
@@ -397,7 +399,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
|
|
|
397
399
|
freshness,
|
|
398
400
|
rendered, docs, relationships, knownOperations, cardUses, publishedRelationships, cookbooks, documentRoutes,
|
|
399
401
|
basePath, siteOrigin, colorMode, config: options.authoringFiles ? { ...config, outputs: { ...config.outputs, html: { ...htmlOptions, pdf: false } } } : config, highlighter, editionLabel, customStyleFile, themePreset, palette,
|
|
400
|
-
themeStyleFile, generatedPaletteCss, generatedBadgeCss, themeSwitcherData, generatedFontsCss, fontsPreload: fonts.preload,
|
|
402
|
+
themeStyleFile, generatedPaletteCss, generatedBadgeCss, themeSwitcherData, generatedFontsCss, fontsPreload: fonts.preload, customFontPreloads: customFontPreloads(fonts),
|
|
401
403
|
shareFor, faviconRoute, logoRoute, modeToggle, header, footer, search, readerFilters, variants, externalDocuments,
|
|
402
404
|
externalSiteLinks, navigationSpec, navigationEntries, navigationTagOrder
|
|
403
405
|
});
|
|
@@ -480,12 +482,15 @@ async function compileProject(configFile, destination, provenance, options, ownH
|
|
|
480
482
|
const { artifacts, buildId } = await assembleArtifacts({
|
|
481
483
|
extraArtifacts: sitePdfs.artifacts,
|
|
482
484
|
base, basePath, publicPath, canonical, siteOrigin, manifest, provenanceRecord, rendered, sitemaps,
|
|
483
|
-
privateDependencies: new Set([
|
|
485
|
+
privateDependencies: new Set([
|
|
486
|
+
...[...snippets.values()].filter(snippet => !snippetUses.some(use => use.file === snippet.file)).map(snippet => snippet.file),
|
|
487
|
+
...(sectionSelection.hasConditions || contentFilter ? componentPlugins.dependencies : []), ...(loaded.deployment?.file ? [loaded.deployment.file] : []), ...(loaded.deployment?.assetFiles ?? [])
|
|
488
|
+
]),
|
|
484
489
|
diagramAssets, heroImages, focusedContracts, styleFiles, themeStyleFile, generatedPaletteCss,
|
|
485
490
|
generatedBadgeCss, search, synonyms, config: artifactConfig, builtInSearchProvider, customReaderModule, analyticsModule, mcpAnalyticsModule,
|
|
486
491
|
previewFiles, assetDirectory, themeSwitcher, themeDirectory, palette, colorMode, generatedFontsCss,
|
|
487
|
-
fontFiles, fonts, shareImages, shareFor, themePreset, shareFontFiles, shareCache, faviconFile,
|
|
488
|
-
faviconRoute, customStyleFile, scriptFiles, componentAssets: loaded.deployment?.context.grants ? componentPlugins.assets.filter(asset => usedComponentAssets.has(asset.route)) : componentPlugins.assets, redirects, apiPublications, api, catalog, headers,
|
|
492
|
+
fontFiles, projectFontAssets, fonts, shareImages, shareFor, themePreset, shareFontFiles, shareCache, faviconFile,
|
|
493
|
+
faviconRoute, customStyleFile, scriptFiles, componentAssets: loaded.deployment?.context.grants || sectionSelection.hasConditions || contentFilter ? componentPlugins.assets.filter(asset => usedComponentAssets.has(asset.route)) : componentPlugins.assets, redirects, apiPublications, api, catalog, headers,
|
|
489
494
|
documentRoutes, readerFilters, apiSources
|
|
490
495
|
});
|
|
491
496
|
if (destination) {
|
|
@@ -499,9 +504,11 @@ async function compileProject(configFile, destination, provenance, options, ownH
|
|
|
499
504
|
if (loaded.deployment?.context.grants && !options.authoringFiles)
|
|
500
505
|
await writeFile(path.join(localGuide, 'profile-selection.json'), JSON.stringify({ ...profileSelection(loaded.deployment), buildId, configDigest: loaded.digest }, null, 2) + '\n');
|
|
501
506
|
});
|
|
507
|
+
if (!options.authoringFiles)
|
|
508
|
+
await writeSectionSelectionReport(base, sectionSelection, { target: { kind: 'site', output: target }, buildId, configDigest: loaded.digest, filterOrigin: 'site.contentFilter' });
|
|
502
509
|
// Authoring captures resolve revision dates without changing captured inputs.
|
|
503
510
|
if (!options.authoringFiles)
|
|
504
511
|
await freshness?.commit();
|
|
505
512
|
}
|
|
506
|
-
return { ...manifest, buildId, apiPublicationReview, profileSelection: profileSelection(loaded.deployment), ...(options.authoringFiles ? { authoringSources: rendered.map(({ doc }) => ({ id: doc.frontmatter.id, file: doc.file, url: doc.route, markdownUrl: doc.markdownRoute })) } : {}) };
|
|
513
|
+
return { ...manifest, buildId, apiPublicationReview, contentSelection: sectionSelectionReport(sectionSelection), profileSelection: profileSelection(loaded.deployment), ...(options.authoringFiles ? { authoringSources: rendered.map(({ doc }) => ({ id: doc.frontmatter.id, file: doc.file, url: doc.route, markdownUrl: doc.markdownRoute })) } : {}) };
|
|
507
514
|
}
|
package/dist/component-names.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const builtinComponentNames = new Set('Anchor FrontmatterReference ForFeature ForPublication ReaderSection ReaderChoice ReaderFilter Only Badge Kbd Tooltip InfoHint Progress Math ActionLink Button DefinitionList Term Definition Steps Timeline Milestone FileTree Tree Folder File Table CollapsibleGroup Collapsible Section Hero ThemePreview Diagram Image Tabs Walkthrough Step Tab Fields Field CookbookChooser DocCard DocCards DocCollection RelatedReading ApiExample ApiSchema Snippet Var DocLink Callout'.split(' '));
|
|
1
|
+
export const builtinComponentNames = new Set('Anchor FrontmatterReference ForFeature ForFacet ForPublication ReaderSection ReaderChoice ReaderFilter Only Badge Kbd Tooltip InfoHint Progress Math ActionLink Button DefinitionList Term Definition Steps Timeline Milestone FileTree Tree Folder File Table CollapsibleGroup Collapsible Section Hero ThemePreview Diagram Image Tabs Walkthrough Step Tab Fields Field CookbookChooser DocCard DocCards DocCollection RelatedReading ApiExample ApiSchema Snippet Var DocLink Callout'.split(' '));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { documentKey } from './publication-identity.js';
|
|
2
|
-
import {
|
|
2
|
+
import { createSectionSelection, evaluatePublicationGuard, pruneSelectedTree, warnReaderSection } from './section-selection.js';
|
|
3
3
|
import { lowerComponent } from './component-plugins.js';
|
|
4
4
|
import { cardComponent } from './cards.js';
|
|
5
5
|
import { cookbookChooserComponent } from './cookbook-chooser.js';
|
|
@@ -61,8 +61,10 @@ function literalAttributes(attributes) {
|
|
|
61
61
|
export function transformMdx(tree, current, registry, snippets = new Map(), projectValues = {}, uses = [], calloutTypes = resolveCalloutTypes(undefined, current.file), projectRoot, readerConfig, frontmatterConfig = {}, publicationConfig, badgeVariants = resolveBadgeVariants(undefined, current.file), componentPlugins = new Map(), publicationRegistry) {
|
|
62
62
|
if (!isMdxRoot(tree))
|
|
63
63
|
throw new Error(`${current.file}: parsed content must be a root with children`);
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
current.sectionSelection ??= createSectionSelection(readerConfig, undefined, publicationConfig);
|
|
65
|
+
const originalSnippets = snippets;
|
|
66
|
+
tree = lowerSectionMarkers(pruneSelectedTree(tree, current), current.file);
|
|
67
|
+
snippets = new Map([...snippets].map(([id, definition]) => [id, { ...definition, tree: pruneSelectedTree(definition.tree, current, definition.file, false) }]));
|
|
66
68
|
let pluginDepth = 0;
|
|
67
69
|
let tabsIndex = 0;
|
|
68
70
|
let walkthroughIndex = 0;
|
|
@@ -133,27 +135,14 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
|
|
|
133
135
|
throw new Error(`${sourceFile}: <FrontmatterReference> must be an empty block`);
|
|
134
136
|
return childrenOf(parsePlainMarkdown(frontmatterReference(frontmatterConfig, true)), scope, stack, sourceFile);
|
|
135
137
|
}
|
|
136
|
-
if (node.name === 'ForFeature') {
|
|
137
|
-
const selected =
|
|
138
|
+
if (node.name === 'ForFeature' || node.name === 'ForFacet') {
|
|
139
|
+
const selected = pruneSelectedTree({ type: 'root', children: [node] }, current, sourceFile);
|
|
138
140
|
return childrenOf(selected.children, scope, stack, sourceFile);
|
|
139
141
|
}
|
|
140
142
|
if (node.name === 'ForPublication') {
|
|
141
|
-
|
|
142
|
-
const allowed = ['product', 'channel', 'version', 'language'];
|
|
143
|
-
if (node.type !== 'mdxJsxFlowElement' || !node.children?.length || !attributes.length || !literalAttributes(attributes) || attributes.some((item) => !allowed.includes(item.name) || !item.value.trim()) || new Set(attributes.map((item) => item.name)).size !== attributes.length) {
|
|
144
|
-
throw new Error(`${sourceFile}: <ForPublication> needs block content and distinct literal channel, version, or language attributes`);
|
|
145
|
-
}
|
|
146
|
-
const product = attributes.find(item => item.name === 'product')?.value ?? current.variant.product;
|
|
147
|
-
for (const item of attributes) {
|
|
148
|
-
const catalog = item.name === 'product' ? publicationConfig?.products
|
|
149
|
-
: item.name === 'channel' ? publicationConfig?.channels
|
|
150
|
-
: item.name === 'version' ? (product ? publicationConfig?.products?.[product]?.versions : publicationConfig?.versions) : undefined;
|
|
151
|
-
if (publicationConfig && item.name !== 'language' && (!catalog || !Object.hasOwn(catalog, item.value)))
|
|
152
|
-
throw new Error(`${sourceFile}: <ForPublication> names unknown ${item.name} ${item.value}`);
|
|
153
|
-
}
|
|
154
|
-
if (attributes.some((item) => current.variant[item.name] !== item.value))
|
|
143
|
+
if (!evaluatePublicationGuard(node, current, sourceFile, publicationConfig))
|
|
155
144
|
return [];
|
|
156
|
-
return childrenOf(node.children, scope, stack, sourceFile);
|
|
145
|
+
return childrenOf(node.children ?? [], scope, stack, sourceFile);
|
|
157
146
|
}
|
|
158
147
|
if (node.name === 'ReaderSection' || node.name === 'ReaderChoice' || node.name === 'ReaderFilter') {
|
|
159
148
|
if (!readerConfig || node.type !== 'mdxJsxFlowElement')
|
|
@@ -179,6 +168,8 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
|
|
|
179
168
|
const selection = validateReaderSelection(choices, readerConfig, `${sourceFile}: <${node.name}>`);
|
|
180
169
|
if (!Object.keys(selection).length)
|
|
181
170
|
throw new Error(`${sourceFile}: <${node.name}> needs at least one filter choice`);
|
|
171
|
+
if (node.name === 'ReaderSection')
|
|
172
|
+
warnReaderSection(current, sourceFile, node.position?.start?.line ?? 1, selection);
|
|
182
173
|
const description = Object.entries(selection).map(([facet, values]) => `${readerConfig.facets[facet].label}: ${values.map(value => readerConfig.facets[facet].options[value]).join(' or ')}`).join('; ');
|
|
183
174
|
const children = node.name === 'ReaderSection' ? childrenOf(node.children ?? [], scope, stack, sourceFile) : [];
|
|
184
175
|
const containsSection = (item) => item.type === 'docReaderSection' || (item.children ?? []).some(containsSection);
|
|
@@ -628,8 +619,9 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
|
|
|
628
619
|
if (!invocation || typeof invocation !== 'object' || Array.isArray(invocation))
|
|
629
620
|
throw new Error(`${sourceFile}: snippet values must be a literal mapping`);
|
|
630
621
|
const values = resolveSnippetValues(id, definition, projectValues, { ...(current.frontmatter.variables ?? {}), ...scope }, invocation);
|
|
631
|
-
uses.push({ id, file: definition.file, documentId: current.frontmatter.id });
|
|
632
|
-
|
|
622
|
+
uses.push({ id, file: definition.file, documentId: current.frontmatter.id, documentKey: documentKey(current.frontmatter.id, current.variant) });
|
|
623
|
+
const selectedTree = pruneSelectedTree(originalSnippets.get(id).tree, current, definition.file);
|
|
624
|
+
return childrenOf(selectedTree.children, values, [...stack, id], definition.file);
|
|
633
625
|
}
|
|
634
626
|
if (node.name === 'Var') {
|
|
635
627
|
if (!stack.length || node.type !== 'mdxJsxTextElement' || node.children?.length)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Validate every guard, including excluded descendants, without expanding dependencies. */
|
|
2
|
+
export function pruneConditionalTree(tree, evaluate) {
|
|
3
|
+
const walk = (node, ancestorIncluded = true) => {
|
|
4
|
+
if (!node || typeof node !== 'object')
|
|
5
|
+
return [node];
|
|
6
|
+
const match = evaluate(node, ancestorIncluded);
|
|
7
|
+
if (match !== undefined) {
|
|
8
|
+
const children = (node.children ?? []).flatMap((child) => walk(child, ancestorIncluded && match));
|
|
9
|
+
return ancestorIncluded && match ? children : [];
|
|
10
|
+
}
|
|
11
|
+
return [{ ...node, ...(node.children ? { children: node.children.flatMap((child) => walk(child, ancestorIncluded)) } : {}) }];
|
|
12
|
+
};
|
|
13
|
+
return walk(tree)[0];
|
|
14
|
+
}
|
package/dist/config.js
CHANGED
|
@@ -9,7 +9,7 @@ import { parseYaml } from './yaml-value.js';
|
|
|
9
9
|
import { validateSearch } from './search-config.js';
|
|
10
10
|
import { resolveTaxonomy } from './taxonomy.js';
|
|
11
11
|
import { validateCookbooks } from './cookbook-chooser.js';
|
|
12
|
-
const allowed = new Set(['profiles', 'exports', 'schemaVersion', 'site', 'navigation', 'redirects', 'apis', 'relationships', 'variables', 'snippets', 'callouts', 'badges', 'publications', 'outputs', 'templates', 'theme', 'frontmatter', 'metadata', 'audit', 'readerFilters', 'retrieval', 'chat', 'authoring', 'search', 'cookbooks', 'analytics', 'mcp', 'components']);
|
|
12
|
+
const allowed = new Set(['profiles', 'exports', 'schemaVersion', 'site', 'navigation', 'redirects', 'apis', 'codeReferences', 'relationships', 'variables', 'snippets', 'callouts', 'badges', 'publications', 'outputs', 'templates', 'theme', 'frontmatter', 'metadata', 'audit', 'readerFilters', 'retrieval', 'chat', 'authoring', 'search', 'cookbooks', 'analytics', 'mcp', 'components']);
|
|
13
13
|
const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
14
14
|
const treeObject = (v) => object(v) && !('kind' in v && 'items' in v);
|
|
15
15
|
export class ConfigError extends Error {
|