@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d
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/README.md +117 -79
- 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 +268 -47
- package/api/docs/_adapter.mjs +970 -149
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.d.mts +0 -15
- package/api/docs/detail/detail.mjs +22 -78
- package/api/docs/detail/section/section.mjs +39 -24
- package/api/docs/detail/section/section.test.mjs +19 -9
- package/api/docs/docs.d.mts +5 -3
- package/api/docs/docs.doc.mjs +39 -17
- package/api/docs/docs.mjs +44 -8
- package/api/docs/docs.test.mjs +158 -4
- package/api/docs/docs.type.d.mts +185 -6
- package/api/docs/docs.type.mjs +127 -13
- package/api/docs/index/index.mjs +15 -6
- package/api/docs/index/index.test.mjs +1 -1
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +14 -14
- 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 +54 -4
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +332 -21
- package/api/doctor/doctor.test.mjs +420 -7
- 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 +1 -1
- 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 +2 -0
- 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 +61 -10
- 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 +14 -2
- 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.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +11 -13
- 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 +124 -73
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -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 +8 -2
- package/api/upgrade/upgrade.type.d.mts +42 -4
- package/api/upgrade/upgrade.type.mjs +26 -10
- 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/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/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -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/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} +95 -39
- 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/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 +7 -7
- 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 +240 -128
- package/authoring/doctypes/_schema.mjs +198 -16
- package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
- package/authoring/doctypes/base/type.ts +9 -4
- 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 +4 -4
- package/authoring/doctypes/component/component.doc.mjs +5 -2
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +3 -3
- 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 +2 -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 +4 -3
- 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 +3 -3
- package/authoring/doctypes/legacy.d.mts +6 -6
- package/authoring/doctypes/legacy.mjs +3 -3
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
- package/authoring/doctypes/namespace/parse.d.mts +2 -2
- package/authoring/doctypes/namespace/parse.mjs +1 -1
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +6 -3
- package/authoring/doctypes/parse.d.mts +22 -20
- package/authoring/doctypes/parse.mjs +19 -14
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +1 -1
- package/authoring/doctypes/reference/reference.doc.mjs +39 -6
- package/authoring/doctypes/reference/type.ts +31 -14
- 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 +3 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +37 -1
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +12 -1
- 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 -11
- 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 +9 -9
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.mjs +3 -2
- package/authoring/identity/type.ts +10 -10
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +32 -19
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/schema.d.mts +4 -4
- package/authoring/integration/schema.mjs +3 -3
- package/authoring/integration/type.ts +5 -11
- 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 +21 -9
- package/clients/cli/commands/docs.mjs +184 -70
- package/clients/cli/commands/docs.test.mjs +120 -16
- 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 +3 -3
- 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 +20 -8
- 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 +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -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 +32 -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 +246 -89
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +38 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
- 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 +38 -0
- package/foundation/discovery/component-discovery.mjs +48 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +114 -9
- package/foundation/discovery/docs-discovery.mjs +239 -30
- package/foundation/discovery/docs-discovery.test.mjs +150 -35
- package/foundation/discovery/docs-output-budget.d.mts +2 -2
- package/foundation/discovery/docs-output-budget.mjs +1 -1
- package/foundation/discovery/docs-section-key.d.mts +28 -10
- package/foundation/discovery/docs-section-key.mjs +134 -33
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- 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 +772 -82
- 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/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -52
- 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 +51 -26
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +17 -1
- package/foundation/integrations/integrations.mjs +52 -98
- package/foundation/integrations/integrations.test.mjs +31 -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.mjs +121 -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 +11 -0
- 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 +37 -22
- 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
|
@@ -74,16 +74,16 @@ describe('discoverBuiltinTopics', () => {
|
|
|
74
74
|
|
|
75
75
|
describe('discoverIntegrationDocs', () => {
|
|
76
76
|
it('contributes nothing when no docs root is declared or the root is gone', async () => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
const nothing = {records: [], errors: [], namespaces: [], guides: []};
|
|
78
|
+
expect(await discoverIntegrationDocs({name: '@acme/widgets'})).toEqual(
|
|
79
|
+
nothing,
|
|
80
|
+
);
|
|
81
81
|
expect(
|
|
82
82
|
await discoverIntegrationDocs({
|
|
83
83
|
name: '@acme/widgets',
|
|
84
84
|
docs: path.join(tmpDir, 'nope'),
|
|
85
85
|
}),
|
|
86
|
-
).toEqual(
|
|
86
|
+
).toEqual(nothing);
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
it('reads every topic under the root, with what it declares', async () => {
|
|
@@ -169,10 +169,7 @@ describe('discoverIntegrationDocs', () => {
|
|
|
169
169
|
id: 'steps',
|
|
170
170
|
title: 'Steps',
|
|
171
171
|
content: [
|
|
172
|
-
{
|
|
173
|
-
type: 'workflow',
|
|
174
|
-
steps: [{title: 'Install', description: 'Run install.'}],
|
|
175
|
-
},
|
|
172
|
+
{type: 'collection', source: {slot: 'guides'}},
|
|
176
173
|
],
|
|
177
174
|
},
|
|
178
175
|
],
|
|
@@ -180,7 +177,69 @@ describe('discoverIntegrationDocs', () => {
|
|
|
180
177
|
}),
|
|
181
178
|
);
|
|
182
179
|
expect(records).toEqual([]);
|
|
183
|
-
expect(errors[0].message).toContain('
|
|
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
|
+
);
|
|
184
243
|
});
|
|
185
244
|
});
|
|
186
245
|
|
|
@@ -251,6 +310,46 @@ describe('problemsInTopic', () => {
|
|
|
251
310
|
}
|
|
252
311
|
});
|
|
253
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
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
254
353
|
it('rejects a name that is not URL-safe', () => {
|
|
255
354
|
expect(problemsInTopic(topic({name: 'not a topic'})).join('\n')).toContain(
|
|
256
355
|
'URL-safe',
|
|
@@ -485,11 +584,14 @@ describe('mergeTopic', () => {
|
|
|
485
584
|
]);
|
|
486
585
|
});
|
|
487
586
|
|
|
488
|
-
it('
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
'
|
|
492
|
-
|
|
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.');
|
|
493
595
|
});
|
|
494
596
|
});
|
|
495
597
|
|
|
@@ -500,30 +602,29 @@ describe('problemsInTopic section keys', () => {
|
|
|
500
602
|
name: 'keys',
|
|
501
603
|
title: 'Keys',
|
|
502
604
|
description: 'Section keys.',
|
|
503
|
-
sections: sections.map(s => ({
|
|
605
|
+
sections: sections.map(s => ({
|
|
606
|
+
content: [{type: 'prose', text: 'x'}],
|
|
607
|
+
...s,
|
|
608
|
+
})),
|
|
504
609
|
});
|
|
505
610
|
|
|
506
|
-
it('
|
|
611
|
+
it('keeps legacy title-only key conflicts readable', () => {
|
|
507
612
|
expect(
|
|
508
613
|
problemsInTopic(doc([{title: 'Quick Start'}, {title: 'Quick-start'}])),
|
|
509
|
-
).toEqual([
|
|
510
|
-
expect.stringContaining('"quick-start" is already used by sections[0]'),
|
|
511
|
-
]);
|
|
614
|
+
).toEqual([]);
|
|
512
615
|
});
|
|
513
616
|
|
|
514
617
|
it('rejects an unsafe id', () => {
|
|
515
|
-
expect(
|
|
516
|
-
[
|
|
517
|
-
);
|
|
618
|
+
expect(
|
|
619
|
+
problemsInTopic(doc([{id: 'Quick Start', title: 'Quick Start'}])),
|
|
620
|
+
).toEqual([expect.stringContaining('is not a stable key')]);
|
|
518
621
|
});
|
|
519
622
|
|
|
520
|
-
it('
|
|
521
|
-
expect(problemsInTopic(doc([{title: '亮/暗模式'}]))).toEqual([
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
[],
|
|
526
|
-
);
|
|
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([]);
|
|
527
628
|
});
|
|
528
629
|
});
|
|
529
630
|
|
|
@@ -535,12 +636,17 @@ describe('mergeTopic by section key', () => {
|
|
|
535
636
|
{title: 'Light/Dark Mode', content: [{type: 'prose', text: 'base'}]},
|
|
536
637
|
],
|
|
537
638
|
};
|
|
538
|
-
const titles = doc =>
|
|
639
|
+
const titles = doc =>
|
|
640
|
+
doc.sections.map(s => [s.id ?? null, s.title, s.content[0].text]);
|
|
539
641
|
|
|
540
642
|
it('replaces the section whose derived key an extension id names', () => {
|
|
541
643
|
const merged = mergeTopic(base, {
|
|
542
644
|
sections: [
|
|
543
|
-
{
|
|
645
|
+
{
|
|
646
|
+
id: 'quick-start',
|
|
647
|
+
title: 'Quick Start with Acme',
|
|
648
|
+
content: [{type: 'prose', text: 'acme'}],
|
|
649
|
+
},
|
|
544
650
|
],
|
|
545
651
|
});
|
|
546
652
|
expect(titles(merged)).toEqual([
|
|
@@ -549,19 +655,28 @@ describe('mergeTopic by section key', () => {
|
|
|
549
655
|
]);
|
|
550
656
|
});
|
|
551
657
|
|
|
552
|
-
it('
|
|
658
|
+
it('keeps a legacy title variant as a separate section', () => {
|
|
553
659
|
const merged = mergeTopic(base, {
|
|
554
|
-
sections: [
|
|
660
|
+
sections: [
|
|
661
|
+
{title: 'Light-Dark Mode', content: [{type: 'prose', text: 'acme'}]},
|
|
662
|
+
],
|
|
555
663
|
});
|
|
556
664
|
expect(titles(merged)).toEqual([
|
|
557
665
|
[null, 'Quick Start', 'base'],
|
|
666
|
+
[null, 'Light/Dark Mode', 'base'],
|
|
558
667
|
[null, 'Light-Dark Mode', 'acme'],
|
|
559
668
|
]);
|
|
560
669
|
});
|
|
561
670
|
|
|
562
671
|
it('prefers the key over a legacy title for an extension with an id', () => {
|
|
563
672
|
const merged = mergeTopic(base, {
|
|
564
|
-
sections: [
|
|
673
|
+
sections: [
|
|
674
|
+
{
|
|
675
|
+
id: 'light-dark-mode',
|
|
676
|
+
title: 'Quick Start',
|
|
677
|
+
content: [{type: 'prose', text: 'acme'}],
|
|
678
|
+
},
|
|
679
|
+
],
|
|
565
680
|
});
|
|
566
681
|
expect(titles(merged)).toEqual([
|
|
567
682
|
[null, 'Quick Start', 'base'],
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export function docPayloadBytes(payload: unknown): number;
|
|
11
11
|
/**
|
|
12
|
-
* @param {import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
12
|
+
* @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
13
13
|
* @returns {number}
|
|
14
14
|
*/
|
|
15
|
-
export function docsIndexBytes(index: import("../../api/docs/docs.type.mjs").DocsIndex): number;
|
|
15
|
+
export function docsIndexBytes(index: Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links"> | import("../../api/docs/docs.type.mjs").DocsIndex): number;
|
|
16
16
|
/**
|
|
17
17
|
* The sections a single read would return more than `budget` bytes for.
|
|
18
18
|
* @param {any[]} sections
|
|
@@ -26,7 +26,7 @@ export function docPayloadBytes(payload) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* @param {import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
29
|
+
* @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
|
|
30
30
|
* @returns {number}
|
|
31
31
|
*/
|
|
32
32
|
export function docsIndexBytes(index) {
|
|
@@ -31,9 +31,24 @@ export function sectionTitleKey(title: unknown): string;
|
|
|
31
31
|
*/
|
|
32
32
|
export function sectionKey(section: any): string;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
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.
|
|
37
52
|
* @param {any[]} sections
|
|
38
53
|
* @returns {string[]}
|
|
39
54
|
*/
|
|
@@ -49,13 +64,16 @@ export function withSectionKeys<T extends {
|
|
|
49
64
|
sections: any[];
|
|
50
65
|
}>(doc: T): T;
|
|
51
66
|
/**
|
|
52
|
-
* Find the section a reader asked for
|
|
53
|
-
*
|
|
54
|
-
*
|
|
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.
|
|
55
73
|
* @param {any[]} sections
|
|
56
74
|
* @param {string} query
|
|
57
|
-
* @returns {{section: any | null, candidates: any[]}} `candidates` lists
|
|
58
|
-
*
|
|
75
|
+
* @returns {{section: any | null, candidates: any[]}} `candidates` lists every
|
|
76
|
+
* legacy title match when the query is ambiguous
|
|
59
77
|
*/
|
|
60
78
|
export function findDocSection(sections: any[], query: string): {
|
|
61
79
|
section: any | null;
|
|
@@ -73,14 +91,14 @@ export function sectionSummary(section: any, max?: number): string;
|
|
|
73
91
|
* The index a topic-only read returns: what the topic is, and one entry per
|
|
74
92
|
* section with the key to read it by.
|
|
75
93
|
* @param {{name: string, title: string, description: string, sections: any[]}} doc
|
|
76
|
-
* @returns {import('../../api/docs/docs.type.mjs').DocsIndex}
|
|
94
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
77
95
|
*/
|
|
78
96
|
export function buildDocsIndexData(doc: {
|
|
79
97
|
name: string;
|
|
80
98
|
title: string;
|
|
81
99
|
description: string;
|
|
82
100
|
sections: any[];
|
|
83
|
-
}): import("../../api/docs/docs.type.mjs").DocsIndex
|
|
101
|
+
}): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
|
|
84
102
|
/**
|
|
85
103
|
* @file Stable section keys, section lookup, and the topic index.
|
|
86
104
|
*
|
|
@@ -34,7 +34,10 @@ const SOURCE_TITLE = Symbol('astryx.docs.sourceTitle');
|
|
|
34
34
|
* @returns {T}
|
|
35
35
|
*/
|
|
36
36
|
export function withSourceTitle(section, title) {
|
|
37
|
-
Object.defineProperty(section, SOURCE_TITLE, {
|
|
37
|
+
Object.defineProperty(section, SOURCE_TITLE, {
|
|
38
|
+
value: title,
|
|
39
|
+
configurable: true,
|
|
40
|
+
});
|
|
38
41
|
return section;
|
|
39
42
|
}
|
|
40
43
|
|
|
@@ -77,9 +80,77 @@ export function sectionKey(section) {
|
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
+
* The first section the 0.6.x title-substring lookup would return for a query.
|
|
84
|
+
* @param {any[]} sections
|
|
85
|
+
* @param {string} query
|
|
86
|
+
* @returns {number}
|
|
87
|
+
*/
|
|
88
|
+
function legacyTitleMatchIndex(sections, query) {
|
|
89
|
+
const lower = query.toLowerCase();
|
|
90
|
+
return sections.findIndex(section => {
|
|
91
|
+
const title = sourceTitle(section);
|
|
92
|
+
return typeof title === 'string' && title.toLowerCase().includes(lower);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A name as a docs-tree route segment: lowercase words joined by hyphens, so
|
|
98
|
+
* `integrationPackCheck` and `integration pack` both read naturally.
|
|
99
|
+
* @param {string} name
|
|
100
|
+
* @returns {string}
|
|
101
|
+
*/
|
|
102
|
+
export function routeSegment(name) {
|
|
103
|
+
return String(name)
|
|
104
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
105
|
+
.toLowerCase()
|
|
106
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
107
|
+
.replace(/^-+|-+$/g, '');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Fatal key problems: only an explicitly authored `id` can make a previously
|
|
112
|
+
* readable topic invalid. Derived-key collisions and titles with no Latin
|
|
113
|
+
* letters or digits are handled by {@link withSectionKeys} for 0.6.x
|
|
114
|
+
* compatibility.
|
|
115
|
+
* @param {any[]} sections
|
|
116
|
+
* @returns {string[]}
|
|
117
|
+
*/
|
|
118
|
+
export function sectionKeyErrors(sections) {
|
|
119
|
+
/** @type {string[]} */
|
|
120
|
+
const problems = [];
|
|
121
|
+
/** @type {Map<string, number>} */
|
|
122
|
+
const seen = new Map();
|
|
123
|
+
sections.forEach((section, s) => {
|
|
124
|
+
if (section?.id == null) return;
|
|
125
|
+
const at = `sections[${s}]`;
|
|
126
|
+
if (typeof section.id !== 'string' || !SECTION_KEY_RE.test(section.id)) {
|
|
127
|
+
problems.push(
|
|
128
|
+
`${at}.id: ${JSON.stringify(section.id)} is not a stable key. Use lowercase letters and digits joined by single hyphens.`,
|
|
129
|
+
);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const first = seen.get(section.id);
|
|
133
|
+
if (first != null) {
|
|
134
|
+
problems.push(
|
|
135
|
+
`${at}: the key "${section.id}" is already used by sections[${first}]. Give one of them a distinct id.`,
|
|
136
|
+
);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const legacyOwner = legacyTitleMatchIndex(sections, section.id);
|
|
140
|
+
if (legacyOwner !== -1 && legacyOwner !== s) {
|
|
141
|
+
problems.push(
|
|
142
|
+
`${at}.id: the key "${section.id}" is already a legacy title query for sections[${legacyOwner}]. Choose an id that resolves to this section.`,
|
|
143
|
+
);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
seen.set(section.id, s);
|
|
147
|
+
});
|
|
148
|
+
return problems;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Compatibility notices for section keys. These inputs loaded in 0.6.x, so
|
|
153
|
+
* readers keep accepting them and assign deterministic fallback keys.
|
|
83
154
|
* @param {any[]} sections
|
|
84
155
|
* @returns {string[]}
|
|
85
156
|
*/
|
|
@@ -90,7 +161,6 @@ export function sectionKeyProblems(sections) {
|
|
|
90
161
|
const seen = new Map();
|
|
91
162
|
sections.forEach((section, s) => {
|
|
92
163
|
const at = `sections[${s}]`;
|
|
93
|
-
// A missing title is reported where titles are checked; no key to judge.
|
|
94
164
|
if (
|
|
95
165
|
section?.id == null &&
|
|
96
166
|
(typeof section?.title !== 'string' || section.title === '')
|
|
@@ -109,14 +179,14 @@ export function sectionKeyProblems(sections) {
|
|
|
109
179
|
const key = sectionKey(section);
|
|
110
180
|
if (key === '') {
|
|
111
181
|
problems.push(
|
|
112
|
-
`${at}: no key derives from the title ${JSON.stringify(section?.title)}.
|
|
182
|
+
`${at}: no key derives from the title ${JSON.stringify(section?.title)}. A deterministic section-N compatibility key is used; add an explicit id.`,
|
|
113
183
|
);
|
|
114
184
|
return;
|
|
115
185
|
}
|
|
116
186
|
const first = seen.get(key);
|
|
117
187
|
if (first != null) {
|
|
118
188
|
problems.push(
|
|
119
|
-
`${at}: the key "${key}" is already used by sections[${first}].
|
|
189
|
+
`${at}: the key "${key}" is already used by sections[${first}]. A suffixed compatibility key is used for title-derived collisions; give one of them a distinct id or title.`,
|
|
120
190
|
);
|
|
121
191
|
return;
|
|
122
192
|
}
|
|
@@ -133,48 +203,79 @@ export function sectionKeyProblems(sections) {
|
|
|
133
203
|
* @returns {T}
|
|
134
204
|
*/
|
|
135
205
|
export function withSectionKeys(doc) {
|
|
206
|
+
const reserved = new Set(
|
|
207
|
+
doc.sections
|
|
208
|
+
.map(section => section?.id)
|
|
209
|
+
.filter(id => typeof id === 'string' && SECTION_KEY_RE.test(id)),
|
|
210
|
+
);
|
|
211
|
+
const used = new Set();
|
|
136
212
|
return {
|
|
137
213
|
...doc,
|
|
138
|
-
sections: doc.sections.map(section =>
|
|
139
|
-
section.id != null
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
214
|
+
sections: doc.sections.map((section, index) => {
|
|
215
|
+
if (section.id != null) {
|
|
216
|
+
used.add(section.id);
|
|
217
|
+
return section;
|
|
218
|
+
}
|
|
219
|
+
const base =
|
|
220
|
+
sectionTitleKey(sourceTitle(section)) || `section-${index + 1}`;
|
|
221
|
+
let key = base;
|
|
222
|
+
let suffix = 2;
|
|
223
|
+
while (
|
|
224
|
+
reserved.has(key) ||
|
|
225
|
+
used.has(key) ||
|
|
226
|
+
(legacyTitleMatchIndex(doc.sections, key) !== -1 &&
|
|
227
|
+
legacyTitleMatchIndex(doc.sections, key) !== index)
|
|
228
|
+
) {
|
|
229
|
+
key = `${base}-${suffix}`;
|
|
230
|
+
suffix += 1;
|
|
231
|
+
}
|
|
232
|
+
used.add(key);
|
|
233
|
+
return withSourceTitle({...section, id: key}, sourceTitle(section));
|
|
234
|
+
}),
|
|
146
235
|
};
|
|
147
236
|
}
|
|
148
237
|
|
|
149
238
|
/**
|
|
150
|
-
* Find the section a reader asked for
|
|
151
|
-
*
|
|
152
|
-
*
|
|
239
|
+
* Find the section a reader asked for. The 0.6.x first-match title-substring
|
|
240
|
+
* lookup remains first in the authored-title view. In a localized view, an
|
|
241
|
+
* exact stable key resolves before translated title substrings because those
|
|
242
|
+
* translations cannot participate in language-stable key allocation. Generated
|
|
243
|
+
* keys avoid authored-title conflicts, and authored IDs that would shadow an
|
|
244
|
+
* authored legacy query are rejected.
|
|
153
245
|
* @param {any[]} sections
|
|
154
246
|
* @param {string} query
|
|
155
|
-
* @returns {{section: any | null, candidates: any[]}} `candidates` lists
|
|
156
|
-
*
|
|
247
|
+
* @returns {{section: any | null, candidates: any[]}} `candidates` lists every
|
|
248
|
+
* legacy title match when the query is ambiguous
|
|
157
249
|
*/
|
|
158
250
|
export function findDocSection(sections, query) {
|
|
159
251
|
const wanted = query.trim();
|
|
160
252
|
const byKey = sections.find(section => sectionKey(section) === wanted);
|
|
161
|
-
|
|
253
|
+
const hasLocalizedTitles = sections.some(
|
|
254
|
+
section => sourceTitle(section) !== section.title,
|
|
255
|
+
);
|
|
256
|
+
if (byKey && hasLocalizedTitles) {
|
|
257
|
+
return {section: byKey, candidates: []};
|
|
258
|
+
}
|
|
162
259
|
|
|
163
260
|
const lower = wanted.toLowerCase();
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
section =>
|
|
167
|
-
section.title.toLowerCase() === lower ||
|
|
168
|
-
(derived !== '' && sectionTitleKey(sourceTitle(section)) === derived),
|
|
261
|
+
const legacy = sections.filter(section =>
|
|
262
|
+
section.title.toLowerCase().includes(lower),
|
|
169
263
|
);
|
|
170
|
-
if (
|
|
171
|
-
|
|
264
|
+
if (legacy.length > 0) {
|
|
265
|
+
return {section: legacy[0], candidates: legacy.length > 1 ? legacy : []};
|
|
266
|
+
}
|
|
172
267
|
|
|
173
|
-
const
|
|
174
|
-
section
|
|
268
|
+
const byFallbackKey = sections.find(
|
|
269
|
+
section => sectionKey(section) === wanted,
|
|
270
|
+
);
|
|
271
|
+
if (byFallbackKey) return {section: byFallbackKey, candidates: []};
|
|
272
|
+
|
|
273
|
+
const derived = sectionTitleKey(wanted);
|
|
274
|
+
const byDerivedKey = sections.find(
|
|
275
|
+
section =>
|
|
276
|
+
derived !== '' && sectionTitleKey(sourceTitle(section)) === derived,
|
|
175
277
|
);
|
|
176
|
-
|
|
177
|
-
return {section: null, candidates: partial};
|
|
278
|
+
return {section: byDerivedKey ?? null, candidates: []};
|
|
178
279
|
}
|
|
179
280
|
|
|
180
281
|
/**
|
|
@@ -205,7 +306,7 @@ export function sectionSummary(section, max = SECTION_SUMMARY_MAX) {
|
|
|
205
306
|
* The index a topic-only read returns: what the topic is, and one entry per
|
|
206
307
|
* section with the key to read it by.
|
|
207
308
|
* @param {{name: string, title: string, description: string, sections: any[]}} doc
|
|
208
|
-
* @returns {import('../../api/docs/docs.type.mjs').DocsIndex}
|
|
309
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
209
310
|
*/
|
|
210
311
|
export function buildDocsIndexData(doc) {
|
|
211
312
|
return {
|