@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,162 @@
|
|
|
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
|
+
* @typedef {object} LinkTarget
|
|
6
|
+
* @property {string | null} provider the provider id it names, or null for the
|
|
7
|
+
* linking doc's own provider
|
|
8
|
+
* @property {string} kind
|
|
9
|
+
* @property {string} name
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The doc a link opens, as a docs read returns it.
|
|
13
|
+
* @typedef {object} DocLink
|
|
14
|
+
* @property {string} target the target as written: `[<provider>:]<kind>:<name>`
|
|
15
|
+
* @property {string} id the doc's identity (a DocId)
|
|
16
|
+
* @property {string} route what `astryx docs <route>` opens
|
|
17
|
+
* @property {string} title
|
|
18
|
+
* @property {string} summary
|
|
19
|
+
* @property {string} command the command that opens it, `astryx docs <route>`
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Finds the doc a target names, or says why none matches.
|
|
23
|
+
* @typedef {(target: string) => Promise<DocLink | {problem: string}>} LinkResolver
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* @typedef {object} LinkProblem
|
|
27
|
+
* @property {string} target the target as written
|
|
28
|
+
* @property {string} message
|
|
29
|
+
* @property {string} [section] the key of the section the link sits in
|
|
30
|
+
* @property {true} [include] the problem is in a `reference` block, which
|
|
31
|
+
* includes content rather than linking to it: a reader loses that content,
|
|
32
|
+
* so the authoring check fails on it
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* What a `reference` block in a topic section includes of the doc it names:
|
|
36
|
+
* stable content blocks, with anything it could not include named in
|
|
37
|
+
* `problems`.
|
|
38
|
+
* @typedef {(block: any) => Promise<{content: any[], problems: string[]}>} DocIncluder
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
|
|
42
|
+
* (`command:theme build`); no part holds a colon.
|
|
43
|
+
* @param {unknown} target
|
|
44
|
+
* @returns {LinkTarget | {error: string}}
|
|
45
|
+
*/
|
|
46
|
+
export function parseLinkTarget(target: unknown): LinkTarget | {
|
|
47
|
+
error: string;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Text with each inline link replaced by its name, for indexes that must not
|
|
51
|
+
* read the link syntax as words.
|
|
52
|
+
* @param {string} text
|
|
53
|
+
* @returns {string}
|
|
54
|
+
*/
|
|
55
|
+
export function unlinkText(text: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve every link in a list of content blocks, in order.
|
|
58
|
+
* @param {any[]} blocks
|
|
59
|
+
* @param {LinkResolver} resolve
|
|
60
|
+
* @param {{section?: string}} [at]
|
|
61
|
+
* @param {DocIncluder} [include] how a `reference` block includes the doc it
|
|
62
|
+
* names; without it, the block only carries its `link`
|
|
63
|
+
* @returns {Promise<{content: any[], problems: LinkProblem[]}>}
|
|
64
|
+
*/
|
|
65
|
+
export function linkBlocks(blocks: any[], resolve: LinkResolver, at?: {
|
|
66
|
+
section?: string;
|
|
67
|
+
}, include?: DocIncluder): Promise<{
|
|
68
|
+
content: any[];
|
|
69
|
+
problems: LinkProblem[];
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Resolve every link in a topic's sections.
|
|
73
|
+
* @param {any[]} sections
|
|
74
|
+
* @param {LinkResolver} resolve
|
|
75
|
+
* @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
|
|
76
|
+
*/
|
|
77
|
+
export function linkSections(sections: any[], resolve: LinkResolver): Promise<{
|
|
78
|
+
sections: any[];
|
|
79
|
+
problems: LinkProblem[];
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* @file Links between docs, named by doc identity (spec:AST-047 FR9).
|
|
83
|
+
*
|
|
84
|
+
* @input A link target, `[<provider>:]<kind>:<name>`, written as a `reference`
|
|
85
|
+
* block, in a `workflow` step's `references`, or inline in text as
|
|
86
|
+
* `{@link <target>}`; and a resolver that finds the doc a target names.
|
|
87
|
+
* @output The same content with every link resolved: an inline link becomes
|
|
88
|
+
* the `astryx docs` command that opens its doc, and a block carries a `link`
|
|
89
|
+
* with the doc's identity, route, title, summary, and command. A reference
|
|
90
|
+
* block in a topic section also carries the `content` it includes. A link
|
|
91
|
+
* that names no doc is a problem, never a guess.
|
|
92
|
+
* @position Pure. The docs adapter owns the resolver (the project's docs tree
|
|
93
|
+
* and topic catalog) and applies this to every read and every doctor check.
|
|
94
|
+
*/
|
|
95
|
+
/** The kinds a link can name: every authored doc kind. */
|
|
96
|
+
export const LINK_KINDS: Set<string>;
|
|
97
|
+
/** An inline link in text: `{@link <target>}`. */
|
|
98
|
+
export const INLINE_LINK: RegExp;
|
|
99
|
+
export type LinkTarget = {
|
|
100
|
+
/**
|
|
101
|
+
* the provider id it names, or null for the
|
|
102
|
+
* linking doc's own provider
|
|
103
|
+
*/
|
|
104
|
+
provider: string | null;
|
|
105
|
+
kind: string;
|
|
106
|
+
name: string;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* The doc a link opens, as a docs read returns it.
|
|
110
|
+
*/
|
|
111
|
+
export type DocLink = {
|
|
112
|
+
/**
|
|
113
|
+
* the target as written: `[<provider>:]<kind>:<name>`
|
|
114
|
+
*/
|
|
115
|
+
target: string;
|
|
116
|
+
/**
|
|
117
|
+
* the doc's identity (a DocId)
|
|
118
|
+
*/
|
|
119
|
+
id: string;
|
|
120
|
+
/**
|
|
121
|
+
* what `astryx docs <route>` opens
|
|
122
|
+
*/
|
|
123
|
+
route: string;
|
|
124
|
+
title: string;
|
|
125
|
+
summary: string;
|
|
126
|
+
/**
|
|
127
|
+
* the command that opens it, `astryx docs <route>`
|
|
128
|
+
*/
|
|
129
|
+
command: string;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Finds the doc a target names, or says why none matches.
|
|
133
|
+
*/
|
|
134
|
+
export type LinkResolver = (target: string) => Promise<DocLink | {
|
|
135
|
+
problem: string;
|
|
136
|
+
}>;
|
|
137
|
+
export type LinkProblem = {
|
|
138
|
+
/**
|
|
139
|
+
* the target as written
|
|
140
|
+
*/
|
|
141
|
+
target: string;
|
|
142
|
+
message: string;
|
|
143
|
+
/**
|
|
144
|
+
* the key of the section the link sits in
|
|
145
|
+
*/
|
|
146
|
+
section?: string | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* the problem is in a `reference` block, which
|
|
149
|
+
* includes content rather than linking to it: a reader loses that content,
|
|
150
|
+
* so the authoring check fails on it
|
|
151
|
+
*/
|
|
152
|
+
include?: true | undefined;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* What a `reference` block in a topic section includes of the doc it names:
|
|
156
|
+
* stable content blocks, with anything it could not include named in
|
|
157
|
+
* `problems`.
|
|
158
|
+
*/
|
|
159
|
+
export type DocIncluder = (block: any) => Promise<{
|
|
160
|
+
content: any[];
|
|
161
|
+
problems: string[];
|
|
162
|
+
}>;
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Links between docs, named by doc identity (spec:AST-047 FR9).
|
|
5
|
+
*
|
|
6
|
+
* @input A link target, `[<provider>:]<kind>:<name>`, written as a `reference`
|
|
7
|
+
* block, in a `workflow` step's `references`, or inline in text as
|
|
8
|
+
* `{@link <target>}`; and a resolver that finds the doc a target names.
|
|
9
|
+
* @output The same content with every link resolved: an inline link becomes
|
|
10
|
+
* the `astryx docs` command that opens its doc, and a block carries a `link`
|
|
11
|
+
* with the doc's identity, route, title, summary, and command. A reference
|
|
12
|
+
* block in a topic section also carries the `content` it includes. A link
|
|
13
|
+
* that names no doc is a problem, never a guess.
|
|
14
|
+
* @position Pure. The docs adapter owns the resolver (the project's docs tree
|
|
15
|
+
* and topic catalog) and applies this to every read and every doctor check.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** The kinds a link can name: every authored doc kind. */
|
|
19
|
+
export const LINK_KINDS = new Set([
|
|
20
|
+
'generic',
|
|
21
|
+
'command',
|
|
22
|
+
'function',
|
|
23
|
+
'schema',
|
|
24
|
+
'enum',
|
|
25
|
+
'namespace',
|
|
26
|
+
'component',
|
|
27
|
+
'page',
|
|
28
|
+
'block',
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
/** An inline link in text: `{@link <target>}`. */
|
|
32
|
+
export const INLINE_LINK = /\{@link\s+([^{}]+?)\s*\}/g;
|
|
33
|
+
|
|
34
|
+
/** Code spans in text, which show link syntax as written. */
|
|
35
|
+
const CODE_SPAN = /(`[^`]*`)/;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @typedef {object} LinkTarget
|
|
39
|
+
* @property {string | null} provider the provider id it names, or null for the
|
|
40
|
+
* linking doc's own provider
|
|
41
|
+
* @property {string} kind
|
|
42
|
+
* @property {string} name
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The doc a link opens, as a docs read returns it.
|
|
47
|
+
* @typedef {object} DocLink
|
|
48
|
+
* @property {string} target the target as written: `[<provider>:]<kind>:<name>`
|
|
49
|
+
* @property {string} id the doc's identity (a DocId)
|
|
50
|
+
* @property {string} route what `astryx docs <route>` opens
|
|
51
|
+
* @property {string} title
|
|
52
|
+
* @property {string} summary
|
|
53
|
+
* @property {string} command the command that opens it, `astryx docs <route>`
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Finds the doc a target names, or says why none matches.
|
|
58
|
+
* @typedef {(target: string) => Promise<DocLink | {problem: string}>} LinkResolver
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @typedef {object} LinkProblem
|
|
63
|
+
* @property {string} target the target as written
|
|
64
|
+
* @property {string} message
|
|
65
|
+
* @property {string} [section] the key of the section the link sits in
|
|
66
|
+
* @property {true} [include] the problem is in a `reference` block, which
|
|
67
|
+
* includes content rather than linking to it: a reader loses that content,
|
|
68
|
+
* so the authoring check fails on it
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* What a `reference` block in a topic section includes of the doc it names:
|
|
73
|
+
* stable content blocks, with anything it could not include named in
|
|
74
|
+
* `problems`.
|
|
75
|
+
* @typedef {(block: any) => Promise<{content: any[], problems: string[]}>} DocIncluder
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
|
|
80
|
+
* (`command:theme build`); no part holds a colon.
|
|
81
|
+
* @param {unknown} target
|
|
82
|
+
* @returns {LinkTarget | {error: string}}
|
|
83
|
+
*/
|
|
84
|
+
export function parseLinkTarget(target) {
|
|
85
|
+
if (typeof target !== 'string' || target.trim() === '') {
|
|
86
|
+
return {
|
|
87
|
+
error:
|
|
88
|
+
'a link target is a non-empty string: `[<provider>:]<kind>:<name>`',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const parts = target.trim().split(':');
|
|
92
|
+
if (parts.length < 2 || parts.length > 3 || parts.some(p => p.trim() === '')) {
|
|
93
|
+
return {error: `"${target}" is not \`[<provider>:]<kind>:<name>\``};
|
|
94
|
+
}
|
|
95
|
+
const provider = parts.length === 3 ? parts[0].trim() : null;
|
|
96
|
+
const kind = parts[parts.length - 2].trim();
|
|
97
|
+
const name = parts[parts.length - 1].trim();
|
|
98
|
+
if (!LINK_KINDS.has(kind)) {
|
|
99
|
+
return {
|
|
100
|
+
error: `"${target}" names the kind "${kind}"; a doc kind is one of ${[
|
|
101
|
+
...LINK_KINDS,
|
|
102
|
+
].join(', ')}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {provider, kind, name};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Text with each inline link replaced by its name, for indexes that must not
|
|
110
|
+
* read the link syntax as words.
|
|
111
|
+
* @param {string} text
|
|
112
|
+
* @returns {string}
|
|
113
|
+
*/
|
|
114
|
+
export function unlinkText(text) {
|
|
115
|
+
return text
|
|
116
|
+
.split(CODE_SPAN)
|
|
117
|
+
.map(part =>
|
|
118
|
+
part.startsWith('`')
|
|
119
|
+
? part
|
|
120
|
+
: part.replace(INLINE_LINK, (_, target) => {
|
|
121
|
+
const parsed = parseLinkTarget(target);
|
|
122
|
+
return 'error' in parsed ? target : parsed.name;
|
|
123
|
+
}),
|
|
124
|
+
)
|
|
125
|
+
.join('');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Resolve every link in a list of content blocks, in order.
|
|
130
|
+
* @param {any[]} blocks
|
|
131
|
+
* @param {LinkResolver} resolve
|
|
132
|
+
* @param {{section?: string}} [at]
|
|
133
|
+
* @param {DocIncluder} [include] how a `reference` block includes the doc it
|
|
134
|
+
* names; without it, the block only carries its `link`
|
|
135
|
+
* @returns {Promise<{content: any[], problems: LinkProblem[]}>}
|
|
136
|
+
*/
|
|
137
|
+
export async function linkBlocks(blocks, resolve, at = {}, include) {
|
|
138
|
+
/** @type {LinkProblem[]} */
|
|
139
|
+
const problems = [];
|
|
140
|
+
const where = at.section ? {section: at.section} : {};
|
|
141
|
+
/**
|
|
142
|
+
* @param {string} target
|
|
143
|
+
* @returns {Promise<DocLink | null>}
|
|
144
|
+
*/
|
|
145
|
+
const find = async target => {
|
|
146
|
+
const found = await resolve(target);
|
|
147
|
+
if ('problem' in found) {
|
|
148
|
+
problems.push({target, message: found.problem, ...where});
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return found;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* @param {unknown} text
|
|
155
|
+
* @returns {Promise<any>}
|
|
156
|
+
*/
|
|
157
|
+
const linkText = async text => {
|
|
158
|
+
if (typeof text !== 'string' || !text.includes('{@link')) return text;
|
|
159
|
+
let out = '';
|
|
160
|
+
// A link written inside code ticks is shown as written: it documents the
|
|
161
|
+
// syntax, it does not link.
|
|
162
|
+
for (const part of text.split(CODE_SPAN)) {
|
|
163
|
+
if (part.startsWith('`')) {
|
|
164
|
+
out += part;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
let last = 0;
|
|
168
|
+
for (const match of part.matchAll(INLINE_LINK)) {
|
|
169
|
+
const link = await find(match[1]);
|
|
170
|
+
const at = /** @type {number} */ (match.index);
|
|
171
|
+
out += part.slice(last, at);
|
|
172
|
+
// A link that names no doc prints as written: text that was never
|
|
173
|
+
// meant as a link reads the way it did, and doctor names the problem.
|
|
174
|
+
out += link ? `\`${link.command}\`` : match[0];
|
|
175
|
+
last = at + match[0].length;
|
|
176
|
+
}
|
|
177
|
+
out += part.slice(last);
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* @param {unknown[]} values
|
|
183
|
+
* @returns {Promise<any[]>}
|
|
184
|
+
*/
|
|
185
|
+
const linkAll = async values => {
|
|
186
|
+
const out = [];
|
|
187
|
+
for (const value of values) out.push(await linkText(value));
|
|
188
|
+
return out;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
const content = [];
|
|
192
|
+
for (const block of blocks ?? []) {
|
|
193
|
+
switch (block?.type) {
|
|
194
|
+
case 'prose':
|
|
195
|
+
case 'heading':
|
|
196
|
+
content.push({...block, text: await linkText(block.text)});
|
|
197
|
+
break;
|
|
198
|
+
case 'list':
|
|
199
|
+
content.push({...block, items: await linkAll(block.items ?? [])});
|
|
200
|
+
break;
|
|
201
|
+
case 'table': {
|
|
202
|
+
const rows = [];
|
|
203
|
+
for (const row of block.rows ?? []) rows.push(await linkAll(row));
|
|
204
|
+
content.push({
|
|
205
|
+
...block,
|
|
206
|
+
headers: await linkAll(block.headers ?? []),
|
|
207
|
+
rows,
|
|
208
|
+
});
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case 'reference': {
|
|
212
|
+
// A reference includes content, so what it cannot include is a
|
|
213
|
+
// problem the authoring check fails on, not one that prints as written.
|
|
214
|
+
const found = await resolve(block.target);
|
|
215
|
+
if ('problem' in found) {
|
|
216
|
+
problems.push({
|
|
217
|
+
target: block.target,
|
|
218
|
+
message: found.problem,
|
|
219
|
+
include: true,
|
|
220
|
+
...where,
|
|
221
|
+
});
|
|
222
|
+
content.push({...block, link: null});
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
/** @type {any} */
|
|
226
|
+
const linked = {...block, link: found};
|
|
227
|
+
if (include) {
|
|
228
|
+
const included = await include(block);
|
|
229
|
+
for (const message of included.problems) {
|
|
230
|
+
problems.push({
|
|
231
|
+
target: block.target,
|
|
232
|
+
message,
|
|
233
|
+
include: true,
|
|
234
|
+
...where,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
linked.content = included.content;
|
|
238
|
+
}
|
|
239
|
+
content.push(linked);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
case 'workflow': {
|
|
243
|
+
const steps = [];
|
|
244
|
+
for (const step of block.steps ?? []) {
|
|
245
|
+
/** @type {any} */
|
|
246
|
+
const linked = {...step};
|
|
247
|
+
if (step.description != null) {
|
|
248
|
+
linked.description = await linkText(step.description);
|
|
249
|
+
}
|
|
250
|
+
if (Array.isArray(step.references)) {
|
|
251
|
+
const links = [];
|
|
252
|
+
for (const target of step.references) links.push(await find(target));
|
|
253
|
+
linked.links = links;
|
|
254
|
+
}
|
|
255
|
+
steps.push(linked);
|
|
256
|
+
}
|
|
257
|
+
content.push({...block, steps});
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
case 'collection':
|
|
261
|
+
problems.push({
|
|
262
|
+
target: `collection:${block.source?.slot ?? ''}`,
|
|
263
|
+
message:
|
|
264
|
+
'a collection block is not rendered yet; link each doc with a reference block instead',
|
|
265
|
+
...where,
|
|
266
|
+
});
|
|
267
|
+
content.push(block);
|
|
268
|
+
break;
|
|
269
|
+
default:
|
|
270
|
+
content.push(block);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return {content, problems};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Resolve every link in a topic's sections.
|
|
278
|
+
* @param {any[]} sections
|
|
279
|
+
* @param {LinkResolver} resolve
|
|
280
|
+
* @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
|
|
281
|
+
*/
|
|
282
|
+
export async function linkSections(sections, resolve) {
|
|
283
|
+
/** @type {LinkProblem[]} */
|
|
284
|
+
const problems = [];
|
|
285
|
+
const out = [];
|
|
286
|
+
for (const section of sections ?? []) {
|
|
287
|
+
const linked = await linkBlocks(section.content, resolve, {
|
|
288
|
+
section: section.id ?? section.title,
|
|
289
|
+
});
|
|
290
|
+
problems.push(...linked.problems);
|
|
291
|
+
out.push({...section, content: linked.content});
|
|
292
|
+
}
|
|
293
|
+
return {sections: out, problems};
|
|
294
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Links between docs (spec:AST-047 FR9): the target grammar, and how a
|
|
5
|
+
* list of blocks comes back with every link resolved or named as a problem.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {describe, expect, it} from 'vitest';
|
|
9
|
+
import {
|
|
10
|
+
linkBlocks,
|
|
11
|
+
linkSections,
|
|
12
|
+
parseLinkTarget,
|
|
13
|
+
unlinkText,
|
|
14
|
+
} from './links.mjs';
|
|
15
|
+
|
|
16
|
+
/** A resolver over two docs, the second from another provider. */
|
|
17
|
+
const resolve = async (/** @type {string} */ target) => {
|
|
18
|
+
const docs = {
|
|
19
|
+
'command:doctor': {route: 'cli/commands/doctor', title: 'astryx doctor'},
|
|
20
|
+
'@acme/kit:generic:setup': {route: 'acme/setup', title: 'Set up Acme'},
|
|
21
|
+
};
|
|
22
|
+
const doc = /** @type {any} */ (docs)[target];
|
|
23
|
+
return doc
|
|
24
|
+
? {
|
|
25
|
+
target,
|
|
26
|
+
id: `id:${target}`,
|
|
27
|
+
route: doc.route,
|
|
28
|
+
title: doc.title,
|
|
29
|
+
summary: `About ${doc.title}.`,
|
|
30
|
+
command: `astryx docs ${doc.route}`,
|
|
31
|
+
}
|
|
32
|
+
: {problem: `"${target}" names no doc`};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
describe('parseLinkTarget', () => {
|
|
36
|
+
it('reads a doc of the same provider, or of a named one', () => {
|
|
37
|
+
expect(parseLinkTarget('command:theme build')).toEqual({
|
|
38
|
+
provider: null,
|
|
39
|
+
kind: 'command',
|
|
40
|
+
name: 'theme build',
|
|
41
|
+
});
|
|
42
|
+
expect(parseLinkTarget('@astryxdesign/cli:function:search')).toEqual({
|
|
43
|
+
provider: '@astryxdesign/cli',
|
|
44
|
+
kind: 'function',
|
|
45
|
+
name: 'search',
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('refuses a target that is not `[<provider>:]<kind>:<name>`', () => {
|
|
50
|
+
for (const bad of ['', 'search', 'a:b:c:d', 'command:', 'widget:x']) {
|
|
51
|
+
expect(parseLinkTarget(bad)).toHaveProperty('error');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe('linkBlocks', () => {
|
|
57
|
+
it('reads an inline link as the command that opens its doc', async () => {
|
|
58
|
+
const {content, problems} = await linkBlocks(
|
|
59
|
+
[
|
|
60
|
+
{type: 'prose', text: 'Check it with {@link command:doctor}.'},
|
|
61
|
+
{type: 'list', style: 'unordered', items: ['See {@link @acme/kit:generic:setup}']},
|
|
62
|
+
{type: 'table', headers: ['Doc'], rows: [['{@link command:doctor}']]},
|
|
63
|
+
{type: 'code', lang: 'js', code: '{@link command:doctor}'},
|
|
64
|
+
],
|
|
65
|
+
resolve,
|
|
66
|
+
);
|
|
67
|
+
expect(problems).toEqual([]);
|
|
68
|
+
expect(content[0].text).toBe('Check it with `astryx docs cli/commands/doctor`.');
|
|
69
|
+
expect(content[1].items).toEqual(['See `astryx docs acme/setup`']);
|
|
70
|
+
expect(content[2].rows).toEqual([['`astryx docs cli/commands/doctor`']]);
|
|
71
|
+
// Code is an example: it is shown as written.
|
|
72
|
+
expect(content[3].code).toBe('{@link command:doctor}');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('shows a link written in code ticks as written', async () => {
|
|
76
|
+
const {content, problems} = await linkBlocks(
|
|
77
|
+
[{type: 'prose', text: 'Write `{@link <target>}` to link; {@link command:doctor} checks it.'}],
|
|
78
|
+
resolve,
|
|
79
|
+
);
|
|
80
|
+
expect(problems).toEqual([]);
|
|
81
|
+
expect(content[0].text).toBe(
|
|
82
|
+
'Write `{@link <target>}` to link; `astryx docs cli/commands/doctor` checks it.',
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('gives a reference block and each workflow step the doc they name', async () => {
|
|
87
|
+
const {content, problems} = await linkBlocks(
|
|
88
|
+
[
|
|
89
|
+
{type: 'reference', target: 'command:doctor'},
|
|
90
|
+
{
|
|
91
|
+
type: 'workflow',
|
|
92
|
+
steps: [{title: 'Check', references: ['command:doctor']}],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
resolve,
|
|
96
|
+
);
|
|
97
|
+
expect(problems).toEqual([]);
|
|
98
|
+
expect(content[0].link).toMatchObject({
|
|
99
|
+
route: 'cli/commands/doctor',
|
|
100
|
+
command: 'astryx docs cli/commands/doctor',
|
|
101
|
+
title: 'astryx doctor',
|
|
102
|
+
});
|
|
103
|
+
expect(content[1].steps[0].links[0].command).toBe(
|
|
104
|
+
'astryx docs cli/commands/doctor',
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('includes what a reference block names, and marks what it cannot include', async () => {
|
|
109
|
+
/** @type {any[]} */
|
|
110
|
+
const asked = [];
|
|
111
|
+
const include = async (/** @type {any} */ block) => {
|
|
112
|
+
asked.push(block.target);
|
|
113
|
+
return {
|
|
114
|
+
content: [{type: 'prose', text: 'The doctor command.'}],
|
|
115
|
+
problems: block.projection ? ['projection.fields: no such field'] : [],
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
const {content, problems} = await linkBlocks(
|
|
119
|
+
[
|
|
120
|
+
{type: 'reference', target: 'command:doctor'},
|
|
121
|
+
{
|
|
122
|
+
type: 'reference',
|
|
123
|
+
target: 'command:doctor',
|
|
124
|
+
projection: {fields: ['--nope']},
|
|
125
|
+
},
|
|
126
|
+
{type: 'reference', target: 'command:gone'},
|
|
127
|
+
],
|
|
128
|
+
resolve,
|
|
129
|
+
{section: 'check'},
|
|
130
|
+
include,
|
|
131
|
+
);
|
|
132
|
+
// A target that names no doc is never handed to the includer.
|
|
133
|
+
expect(asked).toEqual(['command:doctor', 'command:doctor']);
|
|
134
|
+
expect(content[0]).toMatchObject({
|
|
135
|
+
link: {command: 'astryx docs cli/commands/doctor'},
|
|
136
|
+
content: [{type: 'prose', text: 'The doctor command.'}],
|
|
137
|
+
});
|
|
138
|
+
expect(content[2]).toEqual({
|
|
139
|
+
type: 'reference',
|
|
140
|
+
target: 'command:gone',
|
|
141
|
+
link: null,
|
|
142
|
+
});
|
|
143
|
+
// Both are the authoring check's: the block includes content, where a
|
|
144
|
+
// link only points at it.
|
|
145
|
+
expect(problems).toEqual([
|
|
146
|
+
{
|
|
147
|
+
target: 'command:doctor',
|
|
148
|
+
message: 'projection.fields: no such field',
|
|
149
|
+
include: true,
|
|
150
|
+
section: 'check',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
target: 'command:gone',
|
|
154
|
+
message: '"command:gone" names no doc',
|
|
155
|
+
include: true,
|
|
156
|
+
section: 'check',
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('names every link that finds no doc, and never guesses', async () => {
|
|
162
|
+
const {content, problems} = await linkSections(
|
|
163
|
+
[
|
|
164
|
+
{
|
|
165
|
+
id: 'one',
|
|
166
|
+
title: 'One',
|
|
167
|
+
content: [
|
|
168
|
+
{type: 'prose', text: 'See {@link command:nope}.'},
|
|
169
|
+
{type: 'reference', target: 'generic:gone'},
|
|
170
|
+
{type: 'collection', source: {slot: 'guides'}},
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
resolve,
|
|
175
|
+
).then(({sections, problems}) => ({content: sections[0].content, problems}));
|
|
176
|
+
expect(content[0].text).toBe('See {@link command:nope}.');
|
|
177
|
+
expect(content[1].link).toBeNull();
|
|
178
|
+
expect(problems.map(p => [p.section, p.target])).toEqual([
|
|
179
|
+
['one', 'command:nope'],
|
|
180
|
+
['one', 'generic:gone'],
|
|
181
|
+
['one', 'collection:guides'],
|
|
182
|
+
]);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
describe('unlinkText', () => {
|
|
187
|
+
it('keeps the name of each link, for an index', () => {
|
|
188
|
+
expect(unlinkText('Run {@link command:theme build} or {@link x}.')).toBe(
|
|
189
|
+
'Run theme build or x.',
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
});
|