@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683
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 +117 -78
- 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 +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -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 +164 -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 +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +548 -1
- package/api/doctor/doctor.test.mjs +610 -1
- 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 +1 -1
- package/api/index.mjs +1 -0
- 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.mjs +83 -7
- 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 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- 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 +124 -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 +1072 -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 +45 -8
- 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/run.mjs +356 -59
- 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 +27 -11
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- 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 +350 -102
- 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/{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 +10 -2
- 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 +29 -6
- 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 +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- 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/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 +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -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 +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- 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 +193 -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/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -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 +719 -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 -30
- 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 +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +37 -2
- package/clients/cli/lib/manifest.test.mjs +17 -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 +774 -83
- 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 +1642 -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 +598 -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/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 +41 -21
- package/foundation/response/response-types.doc.test.mjs +158 -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/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- 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
|
@@ -31,7 +31,9 @@ function topic(fields) {
|
|
|
31
31
|
name: 'deploying',
|
|
32
32
|
title: 'Deploying',
|
|
33
33
|
description: 'How to ship it.',
|
|
34
|
-
sections: [
|
|
34
|
+
sections: [
|
|
35
|
+
{title: 'Overview', content: [{type: 'prose', text: 'Ship it.'}]},
|
|
36
|
+
],
|
|
35
37
|
...fields,
|
|
36
38
|
};
|
|
37
39
|
}
|
|
@@ -72,16 +74,16 @@ describe('discoverBuiltinTopics', () => {
|
|
|
72
74
|
|
|
73
75
|
describe('discoverIntegrationDocs', () => {
|
|
74
76
|
it('contributes nothing when no docs root is declared or the root is gone', async () => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
const nothing = {records: [], errors: [], namespaces: [], guides: []};
|
|
78
|
+
expect(await discoverIntegrationDocs({name: '@acme/widgets'})).toEqual(
|
|
79
|
+
nothing,
|
|
80
|
+
);
|
|
79
81
|
expect(
|
|
80
82
|
await discoverIntegrationDocs({
|
|
81
83
|
name: '@acme/widgets',
|
|
82
84
|
docs: path.join(tmpDir, 'nope'),
|
|
83
85
|
}),
|
|
84
|
-
).toEqual(
|
|
86
|
+
).toEqual(nothing);
|
|
85
87
|
});
|
|
86
88
|
|
|
87
89
|
it('reads every topic under the root, with what it declares', async () => {
|
|
@@ -97,7 +99,9 @@ describe('discoverIntegrationDocs', () => {
|
|
|
97
99
|
}),
|
|
98
100
|
);
|
|
99
101
|
expect(errors).toEqual([]);
|
|
100
|
-
expect(
|
|
102
|
+
expect(
|
|
103
|
+
records.map(r => [r.name, r.package, r.replaces, r.extendsTopic]),
|
|
104
|
+
).toEqual([
|
|
101
105
|
['deploying', '@acme/widgets', undefined, undefined],
|
|
102
106
|
['getting-started', '@acme/widgets', 'getting-started', undefined],
|
|
103
107
|
['theme-extra', '@acme/widgets', undefined, 'theme'],
|
|
@@ -126,7 +130,9 @@ describe('discoverIntegrationDocs', () => {
|
|
|
126
130
|
|
|
127
131
|
it('reports a doc that exports nothing, rather than skipping it silently', async () => {
|
|
128
132
|
const {records, errors} = await discoverIntegrationDocs(
|
|
129
|
-
integration('@acme/empty', {
|
|
133
|
+
integration('@acme/empty', {
|
|
134
|
+
'deploying.doc.mjs': 'export const nope = 1;\n',
|
|
135
|
+
}),
|
|
130
136
|
);
|
|
131
137
|
expect(records).toEqual([]);
|
|
132
138
|
expect(errors).toHaveLength(1);
|
|
@@ -153,6 +159,88 @@ describe('discoverIntegrationDocs', () => {
|
|
|
153
159
|
expect(records).toEqual([]);
|
|
154
160
|
expect(errors[0].message).toContain('declares both');
|
|
155
161
|
});
|
|
162
|
+
|
|
163
|
+
it('rejects graph blocks at the legacy topic-reader boundary', async () => {
|
|
164
|
+
const {records, errors} = await discoverIntegrationDocs(
|
|
165
|
+
integration('@acme/graph-block', {
|
|
166
|
+
'deploying.doc.mjs': topic({
|
|
167
|
+
sections: [
|
|
168
|
+
{
|
|
169
|
+
id: 'steps',
|
|
170
|
+
title: 'Steps',
|
|
171
|
+
content: [
|
|
172
|
+
{type: 'collection', source: {slot: 'guides'}},
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}),
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
179
|
+
expect(records).toEqual([]);
|
|
180
|
+
expect(errors[0].message).toContain('Invalid discriminator value');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('hands namespace docs and placed guides to the docs tree, by provider id', async () => {
|
|
184
|
+
const found = await discoverIntegrationDocs({
|
|
185
|
+
...integration('@acme/namespace', {
|
|
186
|
+
'guides.doc.mjs': {
|
|
187
|
+
type: 'namespace',
|
|
188
|
+
name: 'guides',
|
|
189
|
+
title: 'Guides',
|
|
190
|
+
summary: 'Every guide.',
|
|
191
|
+
slots: {guides: {title: 'Guides', accepts: {kinds: ['generic']}}},
|
|
192
|
+
},
|
|
193
|
+
'setup.doc.mjs': topic({
|
|
194
|
+
name: 'setup',
|
|
195
|
+
title: 'Set up',
|
|
196
|
+
placement: {parent: 'namespace:guides', slot: 'guides', order: 1},
|
|
197
|
+
}),
|
|
198
|
+
'deploying.doc.mjs': topic(),
|
|
199
|
+
}),
|
|
200
|
+
providerId: '@acme/tree-provider',
|
|
201
|
+
});
|
|
202
|
+
expect(found.errors).toEqual([]);
|
|
203
|
+
expect(found.records.map(record => record.name)).toEqual(['deploying']);
|
|
204
|
+
expect(found.records[0].providerId).toBe('@acme/tree-provider');
|
|
205
|
+
expect(found.namespaces).toMatchObject([
|
|
206
|
+
{
|
|
207
|
+
provider: '@acme/namespace',
|
|
208
|
+
providerId: '@acme/tree-provider',
|
|
209
|
+
source: '@acme/namespace/guides.doc.mjs',
|
|
210
|
+
doc: {name: 'guides'},
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
expect(found.guides).toMatchObject([
|
|
214
|
+
{
|
|
215
|
+
provider: '@acme/namespace',
|
|
216
|
+
providerId: '@acme/tree-provider',
|
|
217
|
+
kind: 'generic',
|
|
218
|
+
name: 'setup',
|
|
219
|
+
placement: {parent: 'namespace:guides', slot: 'guides', order: 1},
|
|
220
|
+
},
|
|
221
|
+
]);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('names what a namespace doc lacks, and refuses a placed guide that replaces a topic', async () => {
|
|
225
|
+
const {errors, namespaces, guides} = await discoverIntegrationDocs(
|
|
226
|
+
integration('@acme/namespace', {
|
|
227
|
+
'guides.doc.mjs': {type: 'namespace', name: 'guides', title: 'Guides'},
|
|
228
|
+
'setup.doc.mjs': topic({
|
|
229
|
+
name: 'setup',
|
|
230
|
+
replaces: 'getting-started',
|
|
231
|
+
placement: {parent: 'namespace:guides', slot: 'guides'},
|
|
232
|
+
}),
|
|
233
|
+
}),
|
|
234
|
+
);
|
|
235
|
+
expect(namespaces).toEqual([]);
|
|
236
|
+
expect(guides).toEqual([]);
|
|
237
|
+
expect(errors.map(error => error.message).join('\n')).toMatch(
|
|
238
|
+
/guides\.doc\.mjs.*slots/,
|
|
239
|
+
);
|
|
240
|
+
expect(errors.map(error => error.message).join('\n')).toContain(
|
|
241
|
+
'is placed in the docs tree and also declares `replaces`',
|
|
242
|
+
);
|
|
243
|
+
});
|
|
156
244
|
});
|
|
157
245
|
|
|
158
246
|
describe('problemsInTopic', () => {
|
|
@@ -170,7 +258,11 @@ describe('problemsInTopic', () => {
|
|
|
170
258
|
// A misspelled required field: the block renders nothing at all.
|
|
171
259
|
expect(
|
|
172
260
|
problemsInTopic(
|
|
173
|
-
topic({
|
|
261
|
+
topic({
|
|
262
|
+
sections: [
|
|
263
|
+
{title: 'Overview', content: [{type: 'prose', txt: 'oops'}]},
|
|
264
|
+
],
|
|
265
|
+
}),
|
|
174
266
|
),
|
|
175
267
|
).toEqual([
|
|
176
268
|
'sections[0].content[0].text: required for a prose block',
|
|
@@ -180,7 +272,12 @@ describe('problemsInTopic', () => {
|
|
|
180
272
|
expect(
|
|
181
273
|
problemsInTopic(
|
|
182
274
|
topic({
|
|
183
|
-
sections: [
|
|
275
|
+
sections: [
|
|
276
|
+
{
|
|
277
|
+
title: 'Overview',
|
|
278
|
+
content: [{type: 'heading', level: 2, text: 'x'}],
|
|
279
|
+
},
|
|
280
|
+
],
|
|
184
281
|
}),
|
|
185
282
|
),
|
|
186
283
|
).toContain('sections[0].content[0].level: 2 is not one of 3, 4, 5, 6');
|
|
@@ -196,11 +293,67 @@ describe('problemsInTopic', () => {
|
|
|
196
293
|
],
|
|
197
294
|
}),
|
|
198
295
|
),
|
|
199
|
-
).toContain(
|
|
296
|
+
).toContain(
|
|
297
|
+
'sections[0].content[0].rows[0]: has 1 cells but the table has 2 headers',
|
|
298
|
+
);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('rejects graph metadata at the legacy topic-reader boundary', () => {
|
|
302
|
+
for (const fields of [
|
|
303
|
+
{placement: {parent: 'namespace:cli'}},
|
|
304
|
+
{aliases: ['setup']},
|
|
305
|
+
{audience: 'internal'},
|
|
306
|
+
]) {
|
|
307
|
+
expect(problemsInTopic(topic(fields)).join('\n')).toContain(
|
|
308
|
+
'requires the compiled graph reader',
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it('takes a reference block, and checks its projection and presentation', () => {
|
|
314
|
+
/** @param {any[]} content */
|
|
315
|
+
const withBlocks = content =>
|
|
316
|
+
problemsInTopic(topic({sections: [{title: 'Overview', content}]}));
|
|
317
|
+
expect(
|
|
318
|
+
withBlocks([
|
|
319
|
+
{type: 'reference', target: 'schema:integration'},
|
|
320
|
+
{
|
|
321
|
+
type: 'reference',
|
|
322
|
+
target: '@astryxdesign/cli:schema:integration',
|
|
323
|
+
projection: {fields: ['docs']},
|
|
324
|
+
presentation: 'compact',
|
|
325
|
+
},
|
|
326
|
+
]),
|
|
327
|
+
).toEqual([]);
|
|
328
|
+
expect(
|
|
329
|
+
withBlocks([
|
|
330
|
+
{type: 'reference', target: ''},
|
|
331
|
+
{type: 'reference', target: 'schema:x', presentation: 'card'},
|
|
332
|
+
{type: 'reference', target: 'schema:x', projection: {fields: []}},
|
|
333
|
+
{type: 'reference', target: 'schema:x', projection: {rows: ['a']}},
|
|
334
|
+
{type: 'reference', target: 'schema:x', projection: ['docs']},
|
|
335
|
+
{type: 'reference', target: 'schema:x', link: {}},
|
|
336
|
+
]),
|
|
337
|
+
).toEqual([
|
|
338
|
+
'sections[0].content[0].target: expected a non-empty string',
|
|
339
|
+
'sections[0].content[1].presentation: "card" is not one of summary, compact, full',
|
|
340
|
+
'sections[0].content[2].projection.fields: expected a non-empty array of names',
|
|
341
|
+
'sections[0].content[3].projection.rows: not a field of a projection',
|
|
342
|
+
'sections[0].content[4].projection: expected {fields?, sections?}, naming the parts of the doc to include',
|
|
343
|
+
'sections[0].content[5].link: not a field of a reference block',
|
|
344
|
+
]);
|
|
345
|
+
// Workflow and collection blocks stay in a namespace doc's `blocks`.
|
|
346
|
+
for (const type of ['workflow', 'collection']) {
|
|
347
|
+
expect(withBlocks([{type}]).join('\n')).toContain(
|
|
348
|
+
'requires the compiled graph renderer',
|
|
349
|
+
);
|
|
350
|
+
}
|
|
200
351
|
});
|
|
201
352
|
|
|
202
353
|
it('rejects a name that is not URL-safe', () => {
|
|
203
|
-
expect(problemsInTopic(topic({name: 'not a topic'})).join('\n')).toContain(
|
|
354
|
+
expect(problemsInTopic(topic({name: 'not a topic'})).join('\n')).toContain(
|
|
355
|
+
'URL-safe',
|
|
356
|
+
);
|
|
204
357
|
});
|
|
205
358
|
});
|
|
206
359
|
|
|
@@ -228,11 +381,23 @@ describe('DocsCatalog', () => {
|
|
|
228
381
|
expect(catalog.resolve('deploying').package).toBe('@acme/widgets');
|
|
229
382
|
});
|
|
230
383
|
|
|
384
|
+
it('treats topic identities case-insensitively without losing display case', () => {
|
|
385
|
+
const catalog = DocsCatalog.fromBuiltins();
|
|
386
|
+
expect(catalog.add(record({name: 'Deploying'}))).toBeNull();
|
|
387
|
+
expect(catalog.resolve('deploying').name).toBe('Deploying');
|
|
388
|
+
expect(catalog.resolve('DEPLOYING').name).toBe('Deploying');
|
|
389
|
+
|
|
390
|
+
const issue = catalog.add(
|
|
391
|
+
record({name: 'deploying', package: '@acme/duplicate'}),
|
|
392
|
+
);
|
|
393
|
+
expect(issue).toMatchObject({code: 'invalid_doc', severity: 'error'});
|
|
394
|
+
});
|
|
395
|
+
|
|
231
396
|
it('refuses to shadow an existing topic by name alone', () => {
|
|
232
397
|
const catalog = DocsCatalog.fromBuiltins({tokens: '/cli/tokens.doc.mjs'});
|
|
233
398
|
const issue = catalog.add(record({name: 'tokens'}));
|
|
234
399
|
expect(issue).toMatchObject({code: 'invalid_doc', severity: 'error'});
|
|
235
|
-
expect(issue.message).toContain(
|
|
400
|
+
expect(issue.message).toContain('already provided by @astryxdesign/cli');
|
|
236
401
|
expect(issue.message).toContain("replaces: 'tokens'");
|
|
237
402
|
// The built-in topic is untouched.
|
|
238
403
|
expect(catalog.resolve('tokens').package).toBe(BUILTIN_DOCS_PACKAGE);
|
|
@@ -244,7 +409,9 @@ describe('DocsCatalog', () => {
|
|
|
244
409
|
tokens: '/cli/tokens.doc.mjs',
|
|
245
410
|
});
|
|
246
411
|
expect(
|
|
247
|
-
catalog.add(
|
|
412
|
+
catalog.add(
|
|
413
|
+
record({name: 'getting-started', replaces: 'getting-started'}),
|
|
414
|
+
),
|
|
248
415
|
).toBeNull();
|
|
249
416
|
expect(catalog.names()).toEqual(['getting-started', 'tokens']);
|
|
250
417
|
const entry = catalog.resolve('getting-started');
|
|
@@ -276,12 +443,16 @@ describe('DocsCatalog', () => {
|
|
|
276
443
|
|
|
277
444
|
it('warns, and lets the later package win, when two replace one topic', () => {
|
|
278
445
|
const catalog = DocsCatalog.fromBuiltins({tokens: '/cli/tokens.doc.mjs'});
|
|
279
|
-
expect(
|
|
446
|
+
expect(
|
|
447
|
+
catalog.add(record({name: 'tokens', replaces: 'tokens'})),
|
|
448
|
+
).toBeNull();
|
|
280
449
|
const issue = catalog.add(
|
|
281
450
|
record({name: 'tokens', package: '@acme/later', replaces: 'tokens'}),
|
|
282
451
|
);
|
|
283
452
|
expect(issue).toMatchObject({code: 'duplicate_doc', severity: 'warning'});
|
|
284
|
-
expect(issue.message).toContain(
|
|
453
|
+
expect(issue.message).toContain(
|
|
454
|
+
'@acme/later is configured later, so it wins',
|
|
455
|
+
);
|
|
285
456
|
expect(catalog.resolve('tokens').package).toBe('@acme/later');
|
|
286
457
|
});
|
|
287
458
|
|
|
@@ -327,15 +498,189 @@ describe('mergeTopic', () => {
|
|
|
327
498
|
{title: 'Internal', content: [{type: 'prose', text: 'the meta way'}]},
|
|
328
499
|
],
|
|
329
500
|
});
|
|
330
|
-
expect(merged.sections.map(s => s.title)).toEqual([
|
|
501
|
+
expect(merged.sections.map(s => s.title)).toEqual([
|
|
502
|
+
'Install',
|
|
503
|
+
'Tokens',
|
|
504
|
+
'Internal',
|
|
505
|
+
]);
|
|
331
506
|
expect(merged.sections[0].content[0].text).toBe('yarn add');
|
|
332
507
|
expect(merged.sections[1].content[0].text).toBe('use tokens');
|
|
333
508
|
// The base is untouched.
|
|
334
509
|
expect(base.sections[0].content[0].text).toBe('npm i');
|
|
335
510
|
});
|
|
336
511
|
|
|
337
|
-
it('
|
|
338
|
-
|
|
339
|
-
|
|
512
|
+
it('replaces a section by stable ID even when its title changes', () => {
|
|
513
|
+
const merged = mergeTopic(
|
|
514
|
+
{
|
|
515
|
+
...base,
|
|
516
|
+
sections: [
|
|
517
|
+
{id: 'install', title: 'Install', content: []},
|
|
518
|
+
{id: 'tokens', title: 'Tokens', content: []},
|
|
519
|
+
],
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
sections: [{id: 'install', title: 'Setup', content: []}],
|
|
523
|
+
},
|
|
524
|
+
);
|
|
525
|
+
expect(merged.sections.map(section => [section.id, section.title])).toEqual(
|
|
526
|
+
[
|
|
527
|
+
['install', 'Setup'],
|
|
528
|
+
['tokens', 'Tokens'],
|
|
529
|
+
],
|
|
530
|
+
);
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('migrates a legacy section to a stable ID without duplicating it', () => {
|
|
534
|
+
const merged = mergeTopic(base, {
|
|
535
|
+
sections: [
|
|
536
|
+
{
|
|
537
|
+
id: 'install',
|
|
538
|
+
title: 'Install',
|
|
539
|
+
content: [{type: 'prose', text: 'yarn add'}],
|
|
540
|
+
},
|
|
541
|
+
],
|
|
542
|
+
});
|
|
543
|
+
expect(
|
|
544
|
+
merged.sections.map(section => [section.id ?? null, section.title]),
|
|
545
|
+
).toEqual([
|
|
546
|
+
['install', 'Install'],
|
|
547
|
+
[null, 'Tokens'],
|
|
548
|
+
]);
|
|
549
|
+
expect(merged.sections[0].content[0].text).toBe('yarn add');
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
it('lets a legacy extension replace a section that has since gained an ID', () => {
|
|
553
|
+
const merged = mergeTopic(
|
|
554
|
+
{
|
|
555
|
+
...base,
|
|
556
|
+
sections: [
|
|
557
|
+
{id: 'setup-steps', title: 'Install', content: []},
|
|
558
|
+
{title: 'Tokens', content: []},
|
|
559
|
+
],
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
sections: [
|
|
563
|
+
{title: 'Install', content: [{type: 'prose', text: 'yarn add'}]},
|
|
564
|
+
],
|
|
565
|
+
},
|
|
566
|
+
);
|
|
567
|
+
expect(
|
|
568
|
+
merged.sections.map(section => [section.id ?? null, section.title]),
|
|
569
|
+
).toEqual([
|
|
570
|
+
['setup-steps', 'Install'],
|
|
571
|
+
[null, 'Tokens'],
|
|
572
|
+
]);
|
|
573
|
+
expect(merged.sections[0].content[0].text).toBe('yarn add');
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
it('keeps two different authored IDs distinct under one title', () => {
|
|
577
|
+
const merged = mergeTopic(
|
|
578
|
+
{...base, sections: [{id: 'install', title: 'Install', content: []}]},
|
|
579
|
+
{sections: [{id: 'install-yarn', title: 'Install', content: []}]},
|
|
580
|
+
);
|
|
581
|
+
expect(merged.sections.map(section => section.id)).toEqual([
|
|
582
|
+
'install',
|
|
583
|
+
'install-yarn',
|
|
584
|
+
]);
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
it('keeps the base title and description: an extension never renames a topic', () => {
|
|
588
|
+
const merged = mergeTopic(base, {
|
|
589
|
+
title: 'Acme theme notes',
|
|
590
|
+
description: 'Our additions.',
|
|
591
|
+
sections: [],
|
|
592
|
+
});
|
|
593
|
+
expect(merged.title).toBe('Theme');
|
|
594
|
+
expect(merged.description).toBe('Theming.');
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
describe('problemsInTopic section keys', () => {
|
|
599
|
+
/** @param {object[]} sections */
|
|
600
|
+
const doc = sections => ({
|
|
601
|
+
type: 'generic',
|
|
602
|
+
name: 'keys',
|
|
603
|
+
title: 'Keys',
|
|
604
|
+
description: 'Section keys.',
|
|
605
|
+
sections: sections.map(s => ({
|
|
606
|
+
content: [{type: 'prose', text: 'x'}],
|
|
607
|
+
...s,
|
|
608
|
+
})),
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it('keeps legacy title-only key conflicts readable', () => {
|
|
612
|
+
expect(
|
|
613
|
+
problemsInTopic(doc([{title: 'Quick Start'}, {title: 'Quick-start'}])),
|
|
614
|
+
).toEqual([]);
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('rejects an unsafe id', () => {
|
|
618
|
+
expect(
|
|
619
|
+
problemsInTopic(doc([{id: 'Quick Start', title: 'Quick Start'}])),
|
|
620
|
+
).toEqual([expect.stringContaining('is not a stable key')]);
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
it('keeps a legacy title that has no derived key readable', () => {
|
|
624
|
+
expect(problemsInTopic(doc([{title: '亮/暗模式'}]))).toEqual([]);
|
|
625
|
+
expect(
|
|
626
|
+
problemsInTopic(doc([{id: 'light-dark', title: '亮/暗模式'}])),
|
|
627
|
+
).toEqual([]);
|
|
628
|
+
});
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
describe('mergeTopic by section key', () => {
|
|
632
|
+
const base = {
|
|
633
|
+
title: 'Theme',
|
|
634
|
+
sections: [
|
|
635
|
+
{title: 'Quick Start', content: [{type: 'prose', text: 'base'}]},
|
|
636
|
+
{title: 'Light/Dark Mode', content: [{type: 'prose', text: 'base'}]},
|
|
637
|
+
],
|
|
638
|
+
};
|
|
639
|
+
const titles = doc =>
|
|
640
|
+
doc.sections.map(s => [s.id ?? null, s.title, s.content[0].text]);
|
|
641
|
+
|
|
642
|
+
it('replaces the section whose derived key an extension id names', () => {
|
|
643
|
+
const merged = mergeTopic(base, {
|
|
644
|
+
sections: [
|
|
645
|
+
{
|
|
646
|
+
id: 'quick-start',
|
|
647
|
+
title: 'Quick Start with Acme',
|
|
648
|
+
content: [{type: 'prose', text: 'acme'}],
|
|
649
|
+
},
|
|
650
|
+
],
|
|
651
|
+
});
|
|
652
|
+
expect(titles(merged)).toEqual([
|
|
653
|
+
['quick-start', 'Quick Start with Acme', 'acme'],
|
|
654
|
+
[null, 'Light/Dark Mode', 'base'],
|
|
655
|
+
]);
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
it('keeps a legacy title variant as a separate section', () => {
|
|
659
|
+
const merged = mergeTopic(base, {
|
|
660
|
+
sections: [
|
|
661
|
+
{title: 'Light-Dark Mode', content: [{type: 'prose', text: 'acme'}]},
|
|
662
|
+
],
|
|
663
|
+
});
|
|
664
|
+
expect(titles(merged)).toEqual([
|
|
665
|
+
[null, 'Quick Start', 'base'],
|
|
666
|
+
[null, 'Light/Dark Mode', 'base'],
|
|
667
|
+
[null, 'Light-Dark Mode', 'acme'],
|
|
668
|
+
]);
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
it('prefers the key over a legacy title for an extension with an id', () => {
|
|
672
|
+
const merged = mergeTopic(base, {
|
|
673
|
+
sections: [
|
|
674
|
+
{
|
|
675
|
+
id: 'light-dark-mode',
|
|
676
|
+
title: 'Quick Start',
|
|
677
|
+
content: [{type: 'prose', text: 'acme'}],
|
|
678
|
+
},
|
|
679
|
+
],
|
|
680
|
+
});
|
|
681
|
+
expect(titles(merged)).toEqual([
|
|
682
|
+
[null, 'Quick Start', 'base'],
|
|
683
|
+
['light-dark-mode', 'Quick Start', 'acme'],
|
|
684
|
+
]);
|
|
340
685
|
});
|
|
341
686
|
});
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
* A payload's size as `--json` prints it: the envelope data, two-space
|
|
6
|
+
* indented, in UTF-8 bytes.
|
|
7
|
+
* @param {unknown} payload
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function docPayloadBytes(payload: unknown): number;
|
|
11
|
+
/**
|
|
12
|
+
* @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
13
|
+
* @returns {number}
|
|
14
|
+
*/
|
|
15
|
+
export function docsIndexBytes(index: Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links"> | import("../../api/docs/docs.type.mjs").DocsIndex): number;
|
|
16
|
+
/**
|
|
17
|
+
* The sections a single read would return more than `budget` bytes for.
|
|
18
|
+
* @param {any[]} sections
|
|
19
|
+
* @param {number} [budget]
|
|
20
|
+
* @returns {{key: string, title: string, bytes: number}[]}
|
|
21
|
+
*/
|
|
22
|
+
export function oversizedDocSections(sections: any[], budget?: number): {
|
|
23
|
+
key: string;
|
|
24
|
+
title: string;
|
|
25
|
+
bytes: number;
|
|
26
|
+
}[];
|
|
27
|
+
/** The most one index or one section read may return, in bytes. */
|
|
28
|
+
export const DOC_OUTPUT_BUDGET_BYTES: number;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file The most one progressive docs read may return.
|
|
5
|
+
*
|
|
6
|
+
* @input Docs payloads: one topic's section index, or one section.
|
|
7
|
+
* @output Their size in bytes as `--json` prints them, and the sections over
|
|
8
|
+
* the budget.
|
|
9
|
+
* @position Shared by Doctor's docs checks and the authoring self-doc audit, so
|
|
10
|
+
* both hold every read to the same limit.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {sectionKey} from './docs-section-key.mjs';
|
|
14
|
+
|
|
15
|
+
/** The most one index or one section read may return, in bytes. */
|
|
16
|
+
export const DOC_OUTPUT_BUDGET_BYTES = 32 * 1024;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A payload's size as `--json` prints it: the envelope data, two-space
|
|
20
|
+
* indented, in UTF-8 bytes.
|
|
21
|
+
* @param {unknown} payload
|
|
22
|
+
* @returns {number}
|
|
23
|
+
*/
|
|
24
|
+
export function docPayloadBytes(payload) {
|
|
25
|
+
return Buffer.byteLength(JSON.stringify(payload, null, 2), 'utf8');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
30
|
+
* @returns {number}
|
|
31
|
+
*/
|
|
32
|
+
export function docsIndexBytes(index) {
|
|
33
|
+
return docPayloadBytes({type: 'docs.index', data: index});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The sections a single read would return more than `budget` bytes for.
|
|
38
|
+
* @param {any[]} sections
|
|
39
|
+
* @param {number} [budget]
|
|
40
|
+
* @returns {{key: string, title: string, bytes: number}[]}
|
|
41
|
+
*/
|
|
42
|
+
export function oversizedDocSections(sections, budget = DOC_OUTPUT_BUDGET_BYTES) {
|
|
43
|
+
return sections
|
|
44
|
+
.map(section => ({
|
|
45
|
+
key: sectionKey(section),
|
|
46
|
+
title: section.title,
|
|
47
|
+
bytes: docPayloadBytes({type: 'docs.detail.section', data: section}),
|
|
48
|
+
}))
|
|
49
|
+
.filter(entry => entry.bytes > budget);
|
|
50
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
* Record the authored title of a section whose visible title a translation
|
|
6
|
+
* overlay replaces.
|
|
7
|
+
* @template {object} T
|
|
8
|
+
* @param {T} section
|
|
9
|
+
* @param {string} title
|
|
10
|
+
* @returns {T}
|
|
11
|
+
*/
|
|
12
|
+
export function withSourceTitle<T extends object>(section: T, title: string): T;
|
|
13
|
+
/**
|
|
14
|
+
* @param {any} section
|
|
15
|
+
* @returns {string}
|
|
16
|
+
*/
|
|
17
|
+
export function sourceTitle(section: any): string;
|
|
18
|
+
/**
|
|
19
|
+
* The key a title derives: accents folded, `&` spelled out, and every other
|
|
20
|
+
* run of non-alphanumerics collapsed to one hyphen. Empty when the title has
|
|
21
|
+
* no Latin letters or digits to derive from.
|
|
22
|
+
* @param {unknown} title
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
export function sectionTitleKey(title: unknown): string;
|
|
26
|
+
/**
|
|
27
|
+
* The key a section is addressed by: its authored `id`, else the key its
|
|
28
|
+
* authored title derives.
|
|
29
|
+
* @param {any} section
|
|
30
|
+
* @returns {string}
|
|
31
|
+
*/
|
|
32
|
+
export function sectionKey(section: any): string;
|
|
33
|
+
/**
|
|
34
|
+
* A name as a docs-tree route segment: lowercase words joined by hyphens, so
|
|
35
|
+
* `integrationPackCheck` and `integration pack` both read naturally.
|
|
36
|
+
* @param {string} name
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
39
|
+
export function routeSegment(name: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Fatal key problems: only an explicitly authored `id` can make a previously
|
|
42
|
+
* readable topic invalid. Derived-key collisions and titles with no Latin
|
|
43
|
+
* letters or digits are handled by {@link withSectionKeys} for 0.6.x
|
|
44
|
+
* compatibility.
|
|
45
|
+
* @param {any[]} sections
|
|
46
|
+
* @returns {string[]}
|
|
47
|
+
*/
|
|
48
|
+
export function sectionKeyErrors(sections: any[]): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Compatibility notices for section keys. These inputs loaded in 0.6.x, so
|
|
51
|
+
* readers keep accepting them and assign deterministic fallback keys.
|
|
52
|
+
* @param {any[]} sections
|
|
53
|
+
* @returns {string[]}
|
|
54
|
+
*/
|
|
55
|
+
export function sectionKeyProblems(sections: any[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Stamp every section with the key it is addressed by. Runs only after
|
|
58
|
+
* extensions merge: a derived key must never take part in merge matching.
|
|
59
|
+
* @template {{sections: any[]}} T
|
|
60
|
+
* @param {T} doc
|
|
61
|
+
* @returns {T}
|
|
62
|
+
*/
|
|
63
|
+
export function withSectionKeys<T extends {
|
|
64
|
+
sections: any[];
|
|
65
|
+
}>(doc: T): T;
|
|
66
|
+
/**
|
|
67
|
+
* Find the section a reader asked for. The 0.6.x first-match title-substring
|
|
68
|
+
* lookup remains first in the authored-title view. In a localized view, an
|
|
69
|
+
* exact stable key resolves before translated title substrings because those
|
|
70
|
+
* translations cannot participate in language-stable key allocation. Generated
|
|
71
|
+
* keys avoid authored-title conflicts, and authored IDs that would shadow an
|
|
72
|
+
* authored legacy query are rejected.
|
|
73
|
+
* @param {any[]} sections
|
|
74
|
+
* @param {string} query
|
|
75
|
+
* @returns {{section: any | null, candidates: any[]}} `candidates` lists every
|
|
76
|
+
* legacy title match when the query is ambiguous
|
|
77
|
+
*/
|
|
78
|
+
export function findDocSection(sections: any[], query: string): {
|
|
79
|
+
section: any | null;
|
|
80
|
+
candidates: any[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* One line that says what a section holds: its first prose or list text,
|
|
84
|
+
* whitespace collapsed, cut at a word boundary.
|
|
85
|
+
* @param {any} section
|
|
86
|
+
* @param {number} [max]
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
export function sectionSummary(section: any, max?: number): string;
|
|
90
|
+
/**
|
|
91
|
+
* The index a topic-only read returns: what the topic is, and one entry per
|
|
92
|
+
* section with the key to read it by.
|
|
93
|
+
* @param {{name: string, title: string, description: string, sections: any[]}} doc
|
|
94
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
95
|
+
*/
|
|
96
|
+
export function buildDocsIndexData(doc: {
|
|
97
|
+
name: string;
|
|
98
|
+
title: string;
|
|
99
|
+
description: string;
|
|
100
|
+
sections: any[];
|
|
101
|
+
}): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
|
|
102
|
+
/**
|
|
103
|
+
* @file Stable section keys, section lookup, and the topic index.
|
|
104
|
+
*
|
|
105
|
+
* @input Reference-doc sections, each with an optional authored `id`.
|
|
106
|
+
* @output The key a section is addressed by (its `id`, else a kebab-case key
|
|
107
|
+
* derived from its authored title), lookup by key or title, and the compact
|
|
108
|
+
* index a topic-only docs read returns.
|
|
109
|
+
* @position Shared by docs discovery (which rejects colliding keys before a
|
|
110
|
+
* reader sees them), the docs leaves (index, section, detail), and Doctor
|
|
111
|
+
* (output budgets). Imports nothing from discovery, so both can use it.
|
|
112
|
+
*/
|
|
113
|
+
/** A stable key: lowercase letters and digits, joined by single hyphens. */
|
|
114
|
+
export const SECTION_KEY_RE: RegExp;
|
|
115
|
+
/** The longest summary an index entry carries, in characters. */
|
|
116
|
+
export const SECTION_SUMMARY_MAX: 240;
|