@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3
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 +194 -0
- package/README.md +121 -85
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +36 -13
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +166 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +104 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +2 -3
- package/api/index.mjs +5 -4
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
- package/api/integration/pack-check.mjs +111 -10
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -1
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +142 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1008 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +46 -9
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +359 -60
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +353 -104
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +11 -3
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +31 -8
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +5 -4
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +6 -5
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +48 -6
- package/authoring/doctypes/reference/type.ts +70 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/command-result-coverage.test.mjs +7 -7
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +24 -7
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +222 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +702 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -34
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +90 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- package/clients/cli/lib/json-shim.test.mjs +69 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +39 -10
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +775 -84
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +606 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +46 -38
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/browser.d.mts +3 -3
- package/foundation/xle/browser.mjs +3 -3
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +6 -5
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/parse.mjs +1 -1
- package/foundation/xle/print.mjs +2 -2
- package/foundation/xle/splice.mjs +1 -1
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/api/layout/_adapter.d.mts +0 -34
- package/api/layout/_adapter.mjs +0 -133
- package/api/layout/check/check.d.mts +0 -16
- package/api/layout/check/check.mjs +0 -40
- package/api/layout/expand/expand.d.mts +0 -22
- package/api/layout/expand/expand.mjs +0 -153
- package/api/layout/grammar/grammar.d.mts +0 -13
- package/api/layout/grammar/grammar.mjs +0 -86
- package/api/layout/layout.d.mts +0 -6
- package/api/layout/layout.mjs +0 -17
- package/api/layout/layout.test.mjs +0 -297
- package/api/layout/layout.type.d.mts +0 -89
- package/api/layout/layout.type.mjs +0 -103
- package/api/layout/layoutCheck.doc.d.mts +0 -11
- package/api/layout/layoutCheck.doc.mjs +0 -84
- package/api/layout/layoutExpand.doc.d.mts +0 -11
- package/api/layout/layoutExpand.doc.mjs +0 -106
- package/api/layout/layoutGrammar.doc.d.mts +0 -11
- package/api/layout/layoutGrammar.doc.mjs +0 -56
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/layout-check.doc.mjs +0 -54
- package/clients/cli/commands/layout-expand.doc.mjs +0 -66
- package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
- package/clients/cli/commands/layout.doc.mjs +0 -34
- package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
- package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
- package/clients/cli/commands/layout.mjs +0 -263
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file The compiled-doc contract and its sealed parsers.
|
|
5
|
+
*
|
|
6
|
+
* @input Any value that claims to be a compiled node or a compiled docs bundle
|
|
7
|
+
* — typically one read back from JSON.
|
|
8
|
+
* @output The same value once it validates; a thrown Error naming the problems
|
|
9
|
+
* otherwise, carrying a compiler diagnostic (`unsupported_schema` or
|
|
10
|
+
* `invalid_bundle`). An unsupported schema version fails with its own message
|
|
11
|
+
* before anything else is checked.
|
|
12
|
+
* @position The load boundary for compiled nodes that did not come straight
|
|
13
|
+
* from ./compile.mjs in this process. The value is returned as given, not
|
|
14
|
+
* rebuilt, so key order (which response JSON follows) survives. A node is
|
|
15
|
+
* plain JSON throughout, so nothing it holds can surprise a reader.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {SECTION_KEY_RE} from '../discovery/docs-section-key.mjs';
|
|
19
|
+
import {COMPILED_DOC_KINDS, COMPILED_DOC_SCHEMA_VERSION} from './compile.mjs';
|
|
20
|
+
import {diagnostic, diagnosticProblem} from './diagnostics.mjs';
|
|
21
|
+
|
|
22
|
+
const NODE_FIELDS = new Set([
|
|
23
|
+
'schemaVersion',
|
|
24
|
+
'kind',
|
|
25
|
+
'stage',
|
|
26
|
+
'id',
|
|
27
|
+
'lang',
|
|
28
|
+
'provenance',
|
|
29
|
+
'sourceTitles',
|
|
30
|
+
'sectionProviders',
|
|
31
|
+
'doc',
|
|
32
|
+
]);
|
|
33
|
+
const RESOLVED_FIELDS = new Set([
|
|
34
|
+
'status',
|
|
35
|
+
'topic',
|
|
36
|
+
'section',
|
|
37
|
+
'previewType',
|
|
38
|
+
'content',
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/** How many problems one message lists before it stops. */
|
|
42
|
+
const MAX_PROBLEMS = 10;
|
|
43
|
+
|
|
44
|
+
/** @param {unknown} value @returns {value is Record<string, any>} */
|
|
45
|
+
const isRecord = value =>
|
|
46
|
+
value != null && typeof value === 'object' && !Array.isArray(value);
|
|
47
|
+
|
|
48
|
+
/** @param {unknown} value @returns {value is string} */
|
|
49
|
+
const isText = value => typeof value === 'string' && value !== '';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A package name, never a location: provenance must not leak a path.
|
|
53
|
+
* @param {unknown} value
|
|
54
|
+
* @returns {boolean}
|
|
55
|
+
*/
|
|
56
|
+
const isPackageName = value =>
|
|
57
|
+
isText(value) &&
|
|
58
|
+
!value.startsWith('/') &&
|
|
59
|
+
!value.startsWith('.') &&
|
|
60
|
+
!value.startsWith('\\') &&
|
|
61
|
+
!value.startsWith('file:') &&
|
|
62
|
+
!/^[A-Za-z]:[\\/]/.test(value);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Validate a compiled reference node.
|
|
66
|
+
* @param {unknown} value
|
|
67
|
+
* @returns {import('./compile.mjs').CompiledReferenceNode}
|
|
68
|
+
*/
|
|
69
|
+
export function parseCompiledReferenceNode(value) {
|
|
70
|
+
const node = /** @type {any} */ (value);
|
|
71
|
+
const skew = schemaVersionProblem(node);
|
|
72
|
+
if (skew) throw compiledDocError('unsupported_schema', skew);
|
|
73
|
+
const problems = jsonProblems(node, 'node');
|
|
74
|
+
if (problems.length === 0) problems.push(...structureProblems(node));
|
|
75
|
+
if (problems.length > 0) {
|
|
76
|
+
throw compiledDocError(
|
|
77
|
+
'invalid_bundle',
|
|
78
|
+
`Invalid compiled doc node: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return node;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Where a value stops being plain JSON: anything but null, booleans, finite
|
|
86
|
+
* numbers, strings, arrays and plain objects; a symbol key; or a cycle.
|
|
87
|
+
* @param {unknown} value
|
|
88
|
+
* @param {string} at
|
|
89
|
+
* @param {Set<object>} [ancestors]
|
|
90
|
+
* @param {string[]} [out]
|
|
91
|
+
* @returns {string[]}
|
|
92
|
+
*/
|
|
93
|
+
function jsonProblems(value, at, ancestors = new Set(), out = []) {
|
|
94
|
+
if (out.length >= MAX_PROBLEMS) return out;
|
|
95
|
+
if (
|
|
96
|
+
value === null ||
|
|
97
|
+
typeof value === 'string' ||
|
|
98
|
+
typeof value === 'boolean'
|
|
99
|
+
) {
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value === 'number') {
|
|
103
|
+
if (!Number.isFinite(value))
|
|
104
|
+
out.push(`${at}: ${value} is not a JSON number`);
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
if (value === undefined) {
|
|
108
|
+
out.push(`${at}: undefined is not JSON`);
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
if (typeof value !== 'object') {
|
|
112
|
+
out.push(`${at}: a ${typeof value} is not JSON`);
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
if (ancestors.has(value)) {
|
|
116
|
+
out.push(`${at}: refers back to itself`);
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
const proto = Object.getPrototypeOf(value);
|
|
120
|
+
if (!Array.isArray(value) && proto !== Object.prototype && proto !== null) {
|
|
121
|
+
out.push(
|
|
122
|
+
`${at}: a ${proto?.constructor?.name ?? 'non-plain object'} is not JSON`,
|
|
123
|
+
);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
if (Object.getOwnPropertySymbols(value).length > 0) {
|
|
127
|
+
out.push(`${at}: has symbol keys`);
|
|
128
|
+
}
|
|
129
|
+
ancestors.add(value);
|
|
130
|
+
if (Array.isArray(value)) {
|
|
131
|
+
value.forEach((item, index) =>
|
|
132
|
+
jsonProblems(item, `${at}[${index}]`, ancestors, out),
|
|
133
|
+
);
|
|
134
|
+
} else {
|
|
135
|
+
for (const [key, item] of Object.entries(value)) {
|
|
136
|
+
jsonProblems(item, `${at}.${key}`, ancestors, out);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
ancestors.delete(value);
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The node's own shape, once it is known to be JSON.
|
|
145
|
+
* @param {Record<string, any>} node
|
|
146
|
+
* @returns {string[]}
|
|
147
|
+
*/
|
|
148
|
+
function structureProblems(node) {
|
|
149
|
+
/** @type {string[]} */
|
|
150
|
+
const problems = [];
|
|
151
|
+
const unknown = Object.keys(node).filter(key => !NODE_FIELDS.has(key));
|
|
152
|
+
if (unknown.length > 0)
|
|
153
|
+
problems.push(`unknown fields: ${unknown.join(', ')}`);
|
|
154
|
+
if (node.kind !== 'reference') problems.push('kind: expected "reference"');
|
|
155
|
+
if (node.stage !== 'lowered' && node.stage !== 'linked') {
|
|
156
|
+
problems.push('stage: expected "lowered" or "linked"');
|
|
157
|
+
}
|
|
158
|
+
if (!isText(node.id)) problems.push('id: expected a topic name');
|
|
159
|
+
if (node.lang !== null && !isText(node.lang)) {
|
|
160
|
+
problems.push('lang: expected a language or null');
|
|
161
|
+
}
|
|
162
|
+
const provenance = node.provenance;
|
|
163
|
+
if (
|
|
164
|
+
!isRecord(provenance) ||
|
|
165
|
+
!isPackageName(provenance.provider) ||
|
|
166
|
+
(provenance.replaces !== null && !isText(provenance.replaces)) ||
|
|
167
|
+
!Array.isArray(provenance.extensions) ||
|
|
168
|
+
!provenance.extensions.every(isPackageName)
|
|
169
|
+
) {
|
|
170
|
+
problems.push(
|
|
171
|
+
'provenance: expected {provider, replaces, extensions} naming packages, not paths',
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const providers = isRecord(node.sectionProviders)
|
|
175
|
+
? node.sectionProviders
|
|
176
|
+
: null;
|
|
177
|
+
if (!providers || !Object.values(providers).every(isText)) {
|
|
178
|
+
problems.push('sectionProviders: expected section key -> provider id');
|
|
179
|
+
}
|
|
180
|
+
const titles = isRecord(node.sourceTitles) ? node.sourceTitles : null;
|
|
181
|
+
if (!titles || !Object.values(titles).every(isText)) {
|
|
182
|
+
problems.push('sourceTitles: expected section key -> authored title');
|
|
183
|
+
}
|
|
184
|
+
const doc = node.doc;
|
|
185
|
+
if (
|
|
186
|
+
!isRecord(doc) ||
|
|
187
|
+
!isText(doc.name) ||
|
|
188
|
+
!isText(doc.title) ||
|
|
189
|
+
typeof doc.description !== 'string' ||
|
|
190
|
+
!Array.isArray(doc.sections) ||
|
|
191
|
+
doc.sections.length === 0
|
|
192
|
+
) {
|
|
193
|
+
problems.push('doc: expected {name, title, description, sections}');
|
|
194
|
+
} else {
|
|
195
|
+
problems.push(...sectionProblems(doc.sections, titles, node.stage));
|
|
196
|
+
}
|
|
197
|
+
return problems;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @param {any[]} sections
|
|
202
|
+
* @param {Record<string, any> | null} titles
|
|
203
|
+
* @param {unknown} stage
|
|
204
|
+
* @returns {string[]}
|
|
205
|
+
*/
|
|
206
|
+
function sectionProblems(sections, titles, stage) {
|
|
207
|
+
/** @type {string[]} */
|
|
208
|
+
const problems = [];
|
|
209
|
+
const seen = new Set();
|
|
210
|
+
sections.forEach((section, index) => {
|
|
211
|
+
const at = `doc.sections[${index}]`;
|
|
212
|
+
if (
|
|
213
|
+
!isRecord(section) ||
|
|
214
|
+
typeof section.id !== 'string' ||
|
|
215
|
+
!SECTION_KEY_RE.test(section.id)
|
|
216
|
+
) {
|
|
217
|
+
problems.push(`${at}.id: expected a section key`);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (seen.has(section.id)) {
|
|
221
|
+
problems.push(`${at}.id: two sections have the key "${section.id}"`);
|
|
222
|
+
}
|
|
223
|
+
seen.add(section.id);
|
|
224
|
+
if (!isText(section.title)) problems.push(`${at}.title: expected a title`);
|
|
225
|
+
if (titles && !Object.hasOwn(titles, section.id)) {
|
|
226
|
+
problems.push(
|
|
227
|
+
`sourceTitles: no authored title for section "${section.id}"`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
if (!Array.isArray(section.content)) {
|
|
231
|
+
problems.push(`${at}.content: expected an array of blocks`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
section.content.forEach((/** @type {unknown} */ block, blockIndex) => {
|
|
235
|
+
const where = `${at}.content[${blockIndex}]`;
|
|
236
|
+
if (!isRecord(block) || !isText(block.type)) {
|
|
237
|
+
problems.push(`${where}: expected a block with a type`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (block.type !== 'token-ref') return;
|
|
241
|
+
const ref = `${where}: token reference to "${block.topic}"`;
|
|
242
|
+
if (stage === 'lowered') {
|
|
243
|
+
if ('resolved' in block) {
|
|
244
|
+
problems.push(`${ref}: a lowered node carries no resolution`);
|
|
245
|
+
}
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (!('resolved' in block)) {
|
|
249
|
+
problems.push(`${ref}: a linked node resolves every reference`);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const problem = resolutionProblem(block.resolved);
|
|
253
|
+
if (problem) problems.push(`${ref}: ${problem}`);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
return problems;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @param {unknown} resolved
|
|
261
|
+
* @returns {string | null}
|
|
262
|
+
*/
|
|
263
|
+
function resolutionProblem(resolved) {
|
|
264
|
+
if (!isRecord(resolved)) return 'expected a resolution';
|
|
265
|
+
switch (resolved.status) {
|
|
266
|
+
case 'unknown-topic':
|
|
267
|
+
case 'unknown-section':
|
|
268
|
+
return Object.keys(resolved).length === 1 ? null : 'unexpected fields';
|
|
269
|
+
case 'resolved': {
|
|
270
|
+
if (!isText(resolved.topic)) return 'topic: expected a topic name';
|
|
271
|
+
if (
|
|
272
|
+
typeof resolved.section !== 'string' ||
|
|
273
|
+
!SECTION_KEY_RE.test(resolved.section)
|
|
274
|
+
) {
|
|
275
|
+
return 'section: expected a section key';
|
|
276
|
+
}
|
|
277
|
+
if ('previewType' in resolved && !isText(resolved.previewType)) {
|
|
278
|
+
return 'previewType: expected a preview type';
|
|
279
|
+
}
|
|
280
|
+
if (
|
|
281
|
+
!Array.isArray(resolved.content) ||
|
|
282
|
+
!resolved.content.every(block => isRecord(block) && isText(block.type))
|
|
283
|
+
) {
|
|
284
|
+
return 'content: expected blocks with a type';
|
|
285
|
+
}
|
|
286
|
+
const extra = Object.keys(resolved).filter(
|
|
287
|
+
key => !RESOLVED_FIELDS.has(key),
|
|
288
|
+
);
|
|
289
|
+
return extra.length > 0 ? `unexpected fields: ${extra.join(', ')}` : null;
|
|
290
|
+
}
|
|
291
|
+
default:
|
|
292
|
+
return `status: expected resolved, unknown-topic or unknown-section, got ${JSON.stringify(resolved.status)}`;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const DOC_NODE_FIELDS = new Set([
|
|
297
|
+
'schemaVersion',
|
|
298
|
+
'kind',
|
|
299
|
+
'stage',
|
|
300
|
+
'id',
|
|
301
|
+
'lang',
|
|
302
|
+
'provenance',
|
|
303
|
+
'doc',
|
|
304
|
+
]);
|
|
305
|
+
const BUNDLE_FIELDS = new Set([
|
|
306
|
+
'schemaVersion',
|
|
307
|
+
'lang',
|
|
308
|
+
'nodes',
|
|
309
|
+
'diagnostics',
|
|
310
|
+
]);
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* A package-relative source, never a location on one machine.
|
|
314
|
+
* @param {unknown} value
|
|
315
|
+
* @returns {boolean}
|
|
316
|
+
*/
|
|
317
|
+
const isPackageSource = value =>
|
|
318
|
+
isPackageName(value) &&
|
|
319
|
+
!/(^|\/)\.\.(\/|$)/.test(/** @type {string} */ (value));
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* An Error for a value that is not a compiled doc, carrying the diagnostic a
|
|
323
|
+
* reader reports.
|
|
324
|
+
* @param {'unsupported_schema' | 'invalid_bundle'} code
|
|
325
|
+
* @param {string} message
|
|
326
|
+
* @returns {Error & {diagnostic: import('./diagnostics.mjs').CompilerDiagnostic}}
|
|
327
|
+
*/
|
|
328
|
+
function compiledDocError(code, message) {
|
|
329
|
+
const error = /** @type {Error & {diagnostic: any}} */ (new Error(message));
|
|
330
|
+
error.diagnostic = diagnostic(code, {message});
|
|
331
|
+
return error;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* @param {unknown} value
|
|
336
|
+
*/
|
|
337
|
+
function schemaVersionProblem(value) {
|
|
338
|
+
const version = /** @type {any} */ (value)?.schemaVersion;
|
|
339
|
+
return version === COMPILED_DOC_SCHEMA_VERSION
|
|
340
|
+
? null
|
|
341
|
+
: `Compiled doc schema version ${JSON.stringify(version)} is not supported; this CLI reads version ${COMPILED_DOC_SCHEMA_VERSION}. Compile the docs again with this CLI.`;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Validate a compiled node of any kind.
|
|
346
|
+
* @param {unknown} value
|
|
347
|
+
* @returns {import('./compile.mjs').CompiledDocNode | import('./compile.mjs').CompiledReferenceNode}
|
|
348
|
+
*/
|
|
349
|
+
export function parseCompiledDocNode(value) {
|
|
350
|
+
const skew = schemaVersionProblem(value);
|
|
351
|
+
if (skew) throw compiledDocError('unsupported_schema', skew);
|
|
352
|
+
const problems = nodeProblems(value, 'node');
|
|
353
|
+
if (problems.length > 0) {
|
|
354
|
+
throw compiledDocError(
|
|
355
|
+
'invalid_bundle',
|
|
356
|
+
`Invalid compiled doc node: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
return /** @type {any} */ (value);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Validate a compiled docs bundle: every node, every diagnostic, and one node
|
|
364
|
+
* per id.
|
|
365
|
+
* @param {unknown} value
|
|
366
|
+
* @returns {import('./bundle.mjs').CompiledDocsBundle}
|
|
367
|
+
*/
|
|
368
|
+
export function parseCompiledDocsBundle(value) {
|
|
369
|
+
const skew = schemaVersionProblem(value);
|
|
370
|
+
if (skew) throw compiledDocError('unsupported_schema', skew);
|
|
371
|
+
const bundle = /** @type {any} */ (value);
|
|
372
|
+
/** @type {string[]} */
|
|
373
|
+
const problems = jsonProblems(bundle, 'bundle');
|
|
374
|
+
if (problems.length === 0) {
|
|
375
|
+
const unknown = Object.keys(bundle).filter(key => !BUNDLE_FIELDS.has(key));
|
|
376
|
+
if (unknown.length > 0)
|
|
377
|
+
problems.push(`unknown fields: ${unknown.join(', ')}`);
|
|
378
|
+
if (bundle.lang !== null && !isText(bundle.lang)) {
|
|
379
|
+
problems.push('lang: expected a language or null');
|
|
380
|
+
}
|
|
381
|
+
if (!Array.isArray(bundle.nodes)) {
|
|
382
|
+
problems.push('nodes: expected an array');
|
|
383
|
+
} else {
|
|
384
|
+
const ids = new Set();
|
|
385
|
+
bundle.nodes.forEach(
|
|
386
|
+
(/** @type {unknown} */ node, /** @type {number} */ index) => {
|
|
387
|
+
for (const problem of nodeProblems(node, `nodes[${index}]`)) {
|
|
388
|
+
problems.push(problem);
|
|
389
|
+
}
|
|
390
|
+
const id = /** @type {any} */ (node)?.id;
|
|
391
|
+
if (ids.has(id))
|
|
392
|
+
problems.push(`nodes[${index}].id: "${id}" appears twice`);
|
|
393
|
+
ids.add(id);
|
|
394
|
+
},
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
if (!Array.isArray(bundle.diagnostics)) {
|
|
398
|
+
problems.push('diagnostics: expected an array');
|
|
399
|
+
} else {
|
|
400
|
+
bundle.diagnostics.forEach(
|
|
401
|
+
(/** @type {unknown} */ d, /** @type {number} */ index) => {
|
|
402
|
+
const problem = diagnosticProblem(d);
|
|
403
|
+
if (problem) problems.push(`diagnostics[${index}]: ${problem}`);
|
|
404
|
+
},
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (problems.length > 0) {
|
|
409
|
+
throw compiledDocError(
|
|
410
|
+
'invalid_bundle',
|
|
411
|
+
`Invalid compiled docs bundle: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
return bundle;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Problems with one node of any kind, each prefixed with where it is.
|
|
419
|
+
* @param {unknown} value
|
|
420
|
+
* @param {string} at
|
|
421
|
+
* @returns {string[]}
|
|
422
|
+
*/
|
|
423
|
+
function nodeProblems(value, at) {
|
|
424
|
+
const node = /** @type {any} */ (value);
|
|
425
|
+
if (node?.schemaVersion !== COMPILED_DOC_SCHEMA_VERSION) {
|
|
426
|
+
return [`${at}.schemaVersion: expected ${COMPILED_DOC_SCHEMA_VERSION}`];
|
|
427
|
+
}
|
|
428
|
+
const json = jsonProblems(node, at);
|
|
429
|
+
if (json.length > 0) return json;
|
|
430
|
+
if (node.kind === 'reference') {
|
|
431
|
+
return structureProblems(node).map(problem => `${at}: ${problem}`);
|
|
432
|
+
}
|
|
433
|
+
/** @type {string[]} */
|
|
434
|
+
const problems = [];
|
|
435
|
+
const unknown = Object.keys(node).filter(key => !DOC_NODE_FIELDS.has(key));
|
|
436
|
+
if (unknown.length > 0)
|
|
437
|
+
problems.push(`${at}: unknown fields: ${unknown.join(', ')}`);
|
|
438
|
+
if (!COMPILED_DOC_KINDS.includes(node.kind)) {
|
|
439
|
+
problems.push(
|
|
440
|
+
`${at}.kind: ${JSON.stringify(node.kind)} is not a compiled doc kind`,
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
if (node.stage !== 'lowered')
|
|
444
|
+
problems.push(`${at}.stage: expected "lowered"`);
|
|
445
|
+
if (!isText(node.id)) problems.push(`${at}.id: expected an id`);
|
|
446
|
+
if (node.lang !== null && !isText(node.lang)) {
|
|
447
|
+
problems.push(`${at}.lang: expected a language or null`);
|
|
448
|
+
}
|
|
449
|
+
const provenance = node.provenance;
|
|
450
|
+
if (
|
|
451
|
+
!isRecord(provenance) ||
|
|
452
|
+
Object.keys(provenance).length !== 2 ||
|
|
453
|
+
!isPackageName(provenance.provider) ||
|
|
454
|
+
!isPackageSource(provenance.source)
|
|
455
|
+
) {
|
|
456
|
+
problems.push(
|
|
457
|
+
`${at}.provenance: expected {provider, source} naming a package and a path inside it, not a machine path`,
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
if (!isRecord(node.doc) || !isText(node.doc.name)) {
|
|
461
|
+
problems.push(`${at}.doc: expected a doc with a name`);
|
|
462
|
+
} else if (
|
|
463
|
+
(node.kind === 'page' || node.kind === 'block' || node.kind === 'theme') &&
|
|
464
|
+
node.doc.type !== node.kind
|
|
465
|
+
) {
|
|
466
|
+
problems.push(
|
|
467
|
+
`${at}.doc.type: a ${node.kind} node holds a ${node.kind} doc`,
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
return problems;
|
|
471
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The node's sections as readers look them up: each one knows its authored
|
|
6
|
+
* title, so a query in the authoring language finds a translated section.
|
|
7
|
+
* For lookup only; a section a reader gets back comes from
|
|
8
|
+
* {@link sectionView}.
|
|
9
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
10
|
+
* @returns {any[]}
|
|
11
|
+
*/
|
|
12
|
+
export function readerSections(node: import("./compile.mjs").CompiledReferenceNode): any[];
|
|
13
|
+
/**
|
|
14
|
+
* `docs.detail`: the whole topic, with every token reference inlined.
|
|
15
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node a linked node
|
|
16
|
+
* @returns {any}
|
|
17
|
+
*/
|
|
18
|
+
export function detailView(node: import("./compile.mjs").CompiledReferenceNode): any;
|
|
19
|
+
/**
|
|
20
|
+
* `docs.index`: what the topic is, and each section's key, title and summary.
|
|
21
|
+
* The index leaf adds the moves.
|
|
22
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
23
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
24
|
+
*/
|
|
25
|
+
export function indexView(node: import("./compile.mjs").CompiledReferenceNode): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
|
|
26
|
+
/**
|
|
27
|
+
* `docs.detail.section`: one section with its token references and reference
|
|
28
|
+
* blocks inlined, so a read returns only the stable block kinds. A referenced
|
|
29
|
+
* section's content takes the token reference's place; the section takes the
|
|
30
|
+
* preview type of the last reference that has one, unless it has its own. A
|
|
31
|
+
* reference block becomes the content it includes (see referenceView).
|
|
32
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
33
|
+
* @param {any} section a linked section of `node`
|
|
34
|
+
* @returns {any}
|
|
35
|
+
*/
|
|
36
|
+
export function sectionView(node: import("./compile.mjs").CompiledReferenceNode, section: any): any;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Lenses — the docs API's response shapes, read off compiled nodes.
|
|
5
|
+
*
|
|
6
|
+
* @input A compiled reference node from ./compile.mjs: lowered for the index
|
|
7
|
+
* and for section lookup, linked for anything that inlines token references.
|
|
8
|
+
* @output The `docs.detail` topic, the `docs.index` section index, one
|
|
9
|
+
* `docs.detail.section` section, and the sections as readers look them up.
|
|
10
|
+
* Every view is a fresh copy, so a reader may edit what it gets back without
|
|
11
|
+
* touching the node, which other reads of the same catalog share.
|
|
12
|
+
* @position Between the compiler and api/docs. A lens only projects: it never
|
|
13
|
+
* loads, merges, overlays, keys, or resolves a reference itself.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
buildDocsIndexData,
|
|
18
|
+
withSourceTitle,
|
|
19
|
+
} from '../discovery/docs-section-key.mjs';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
23
|
+
* @param {any} section
|
|
24
|
+
* @returns {string}
|
|
25
|
+
*/
|
|
26
|
+
function authoredTitle(node, section) {
|
|
27
|
+
return node.sourceTitles[section.id] ?? section.title;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The node's sections as readers look them up: each one knows its authored
|
|
32
|
+
* title, so a query in the authoring language finds a translated section.
|
|
33
|
+
* For lookup only; a section a reader gets back comes from
|
|
34
|
+
* {@link sectionView}.
|
|
35
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
36
|
+
* @returns {any[]}
|
|
37
|
+
*/
|
|
38
|
+
export function readerSections(node) {
|
|
39
|
+
return node.doc.sections.map((/** @type {any} */ section) =>
|
|
40
|
+
withSourceTitle({...section}, authoredTitle(node, section)),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* `docs.detail`: the whole topic, with every token reference inlined.
|
|
46
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node a linked node
|
|
47
|
+
* @returns {any}
|
|
48
|
+
*/
|
|
49
|
+
export function detailView(node) {
|
|
50
|
+
if (node.stage !== 'linked') {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`"${node.id}" must be linked before its whole doc is read.`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
// Assigning `sections` keeps it where the authored doc put it.
|
|
56
|
+
const view = structuredClone({...node.doc, sections: []});
|
|
57
|
+
view.sections = node.doc.sections.map((/** @type {any} */ section) =>
|
|
58
|
+
sectionView(node, section),
|
|
59
|
+
);
|
|
60
|
+
return view;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* `docs.index`: what the topic is, and each section's key, title and summary.
|
|
65
|
+
* The index leaf adds the moves.
|
|
66
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
67
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
68
|
+
*/
|
|
69
|
+
export function indexView(node) {
|
|
70
|
+
return buildDocsIndexData(node.doc);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* `docs.detail.section`: one section with its token references and reference
|
|
75
|
+
* blocks inlined, so a read returns only the stable block kinds. A referenced
|
|
76
|
+
* section's content takes the token reference's place; the section takes the
|
|
77
|
+
* preview type of the last reference that has one, unless it has its own. A
|
|
78
|
+
* reference block becomes the content it includes (see referenceView).
|
|
79
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
80
|
+
* @param {any} section a linked section of `node`
|
|
81
|
+
* @returns {any}
|
|
82
|
+
*/
|
|
83
|
+
export function sectionView(node, section) {
|
|
84
|
+
/** @type {any[]} */
|
|
85
|
+
const content = [];
|
|
86
|
+
/** @type {string | null} */
|
|
87
|
+
let previewType = null;
|
|
88
|
+
for (const block of section.content) {
|
|
89
|
+
if (block?.type === 'reference') {
|
|
90
|
+
content.push(...referenceView(node, block));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (block?.type !== 'token-ref') {
|
|
94
|
+
content.push(structuredClone(block));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const target = block.resolved;
|
|
98
|
+
if (target == null) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`The token reference to "${block.topic}" in "${node.id}" was read before it was linked.`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (target.status === 'unknown-topic') {
|
|
104
|
+
content.push({
|
|
105
|
+
type: 'prose',
|
|
106
|
+
text: `[token-ref: unknown topic "${block.topic}"]`,
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (target.status === 'unknown-section') {
|
|
111
|
+
content.push({
|
|
112
|
+
type: 'prose',
|
|
113
|
+
text: `[token-ref: section "${block.section}" not found in "${block.topic}"]`,
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// A copy per reference: two references to one section share nothing.
|
|
118
|
+
for (const refBlock of target.content) {
|
|
119
|
+
content.push(structuredClone(refBlock));
|
|
120
|
+
}
|
|
121
|
+
if (target.previewType && !section.previewType) {
|
|
122
|
+
previewType = target.previewType;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Assigning `content` keeps it where the section put it; a carried preview
|
|
126
|
+
// type lands after the section's own keys, as it always has.
|
|
127
|
+
const view = structuredClone(
|
|
128
|
+
previewType == null
|
|
129
|
+
? {...section, content: []}
|
|
130
|
+
: {...section, previewType, content: []},
|
|
131
|
+
);
|
|
132
|
+
view.content = content;
|
|
133
|
+
return withSourceTitle(view, authoredTitle(node, section));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* A reference block as a read shows it (spec:AST-047 FR9): the content it
|
|
138
|
+
* includes, then where that content comes from and the command that opens it.
|
|
139
|
+
* A reference that includes nothing (a summary, or a doc that is not included
|
|
140
|
+
* whole) shows the doc's title and summary; one whose doc is missing says so
|
|
141
|
+
* where its content would be, as a token reference does.
|
|
142
|
+
* @param {import('./compile.mjs').CompiledReferenceNode} node
|
|
143
|
+
* @param {any} block a linked reference block
|
|
144
|
+
* @returns {any[]}
|
|
145
|
+
*/
|
|
146
|
+
function referenceView(node, block) {
|
|
147
|
+
if (!('link' in block)) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`The reference to "${block.target}" in "${node.id}" was read before it was linked.`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
const link = block.link;
|
|
153
|
+
if (link == null) {
|
|
154
|
+
return [
|
|
155
|
+
{type: 'prose', text: `[reference: "${block.target}" names no doc]`},
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
const included = (block.content ?? []).map((/** @type {any} */ each) =>
|
|
159
|
+
structuredClone(each),
|
|
160
|
+
);
|
|
161
|
+
if (included.length === 0) {
|
|
162
|
+
const summary = String(link.summary ?? '').trim();
|
|
163
|
+
const lead =
|
|
164
|
+
summary === ''
|
|
165
|
+
? link.title
|
|
166
|
+
: `${link.title}: ${summary}${/[.!?]$/.test(summary) ? '' : '.'}`;
|
|
167
|
+
return [{type: 'prose', text: `${lead} Read it with \`${link.command}\`.`}];
|
|
168
|
+
}
|
|
169
|
+
return [
|
|
170
|
+
...included,
|
|
171
|
+
{type: 'prose', text: `From ${link.title}: \`${link.command}\``},
|
|
172
|
+
];
|
|
173
|
+
}
|