@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25
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 +152 -107
- 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 +22 -10
- package/api/build/build.test.mjs +219 -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 +208 -53
- 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 +49 -19
- 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 +277 -41
- package/api/docs/_adapter.mjs +993 -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/docOverlays.test.mjs +27 -1
- 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.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/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 +18 -8
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/doctor/doctor.type.d.mts +1 -1
- package/api/doctor/doctor.type.mjs +1 -1
- package/api/gap-report/gap-report.doc.mjs +27 -14
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +7 -3
- 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 -1
- package/api/index.mjs +6 -3
- package/api/init/init.doc.mjs +22 -12
- 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 +56 -65
- package/api/integration/add-theme.test.mjs +139 -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 +5 -4
- 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 +107 -0
- package/api/integration/pack-check.mjs +160 -11
- package/api/integration/pack-check.test.mjs +477 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +15 -2
- 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 +2 -1
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +2 -1
- 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 +89 -12
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +697 -97
- 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 +8 -5
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +18 -24
- package/api/template/copy/copy.test.mjs +26 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +32 -9
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +2 -2
- 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 +12 -12
- package/api/theme/themeBuild.doc.mjs +21 -17
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +6 -3
- package/api/theme/themePaletteGenerate.doc.mjs +16 -8
- package/api/theme/themeTargets.doc.mjs +4 -2
- package/api/theme/themeTemplate.doc.mjs +8 -3
- 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 +358 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +32 -23
- 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 +12 -1
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +8 -2
- package/assets/docs/elevation.doc.mjs +6 -4
- package/assets/docs/getting-started.doc.mjs +6 -17
- package/assets/docs/icons.doc.mjs +2 -21
- package/assets/docs/illustrations.doc.mjs +7 -15
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +132 -84
- package/assets/docs/layout.doc.mjs +134 -78
- package/assets/docs/migration.doc.mjs +19 -21
- package/assets/docs/motion.doc.mjs +16 -3
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +14 -6
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +8 -3
- package/assets/docs/spacing.doc.mjs +7 -2
- package/assets/docs/styling-libraries.doc.mjs +10 -6
- package/assets/docs/styling.doc.mjs +22 -26
- package/assets/docs/theme.doc.dense.mjs +58 -18
- package/assets/docs/theme.doc.mjs +60 -50
- package/assets/docs/theme.doc.zh.mjs +9 -8
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +390 -9
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/add-a-component.doc.mjs +75 -0
- package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
- package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
- package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/block-template.doc.mjs +130 -0
- package/assets/docs/tree/build-the-template.doc.mjs +28 -0
- package/assets/docs/tree/building-blocks.doc.mjs +46 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
- package/assets/docs/tree/checks.doc.mjs +119 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/codemods.doc.mjs +147 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-family.doc.mjs +113 -0
- package/assets/docs/tree/component-imports.doc.mjs +69 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/tree/components.doc.mjs +23 -0
- package/assets/docs/tree/configuration.doc.mjs +23 -0
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
- package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
- package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
- package/assets/docs/tree/docs.doc.mjs +21 -0
- package/assets/docs/tree/document-the-template.doc.mjs +28 -0
- package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
- package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
- package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
- package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
- package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
- package/assets/docs/tree/help.doc.mjs +16 -0
- package/assets/docs/tree/integrations.doc.mjs +40 -0
- package/assets/docs/tree/links.doc.mjs +98 -0
- package/assets/docs/tree/package-and-test.doc.mjs +32 -0
- package/assets/docs/tree/page-template.doc.mjs +71 -0
- package/assets/docs/tree/publishing.doc.mjs +111 -0
- package/assets/docs/tree/quick-start.doc.mjs +272 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
- package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
- package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
- package/assets/docs/tree/ship.doc.mjs +16 -0
- package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
- package/assets/docs/tree/single-component.doc.mjs +165 -0
- package/assets/docs/tree/start-a-template.doc.mjs +143 -0
- package/assets/docs/tree/subcomponent.doc.mjs +115 -0
- package/assets/docs/tree/template-assets.doc.mjs +64 -0
- package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
- package/assets/docs/tree/template-fonts.doc.mjs +102 -0
- package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
- package/assets/docs/tree/template-icons.doc.mjs +97 -0
- package/assets/docs/tree/template-images-media.doc.mjs +127 -0
- package/assets/docs/tree/template-styles.doc.mjs +93 -0
- package/assets/docs/tree/templates.doc.mjs +34 -0
- package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
- package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
- package/assets/docs/tree/themes.doc.mjs +39 -0
- package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
- package/assets/docs/tree/upgrading.doc.mjs +103 -0
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
- package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
- package/assets/docs/tree/versioning.doc.mjs +161 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
- package/assets/docs/typography.doc.mjs +24 -4
- package/assets/docs/working-with-ai.doc.mjs +34 -26
- 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 +29 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +792 -24
- package/authoring/doctypes/_schema.mjs +549 -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 +43 -0
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- package/authoring/doctypes/component/component.doc.mjs +12 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +14 -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 +55 -6
- package/authoring/doctypes/reference/type.ts +75 -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 +2 -2
- 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 +22 -13
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +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 +28 -10
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +295 -38
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
- 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 +143 -8
- package/clients/cli/commands/doctor.doc.mjs +4 -2
- package/clients/cli/commands/doctor.mjs +108 -37
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +27 -15
- 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 +24 -10
- 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 +39 -13
- package/clients/cli/commands/integration-authoring.test.mjs +74 -19
- package/clients/cli/commands/integration-pack.doc.mjs +6 -10
- package/clients/cli/commands/integration-real-world.test.mjs +4 -10
- package/clients/cli/commands/integration-verify.doc.mjs +22 -0
- package/clients/cli/commands/integration.doc.mjs +5 -5
- package/clients/cli/commands/integration.mjs +75 -43
- 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 +2 -2
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +16 -6
- package/clients/cli/commands/search.mjs +49 -11
- package/clients/cli/commands/search.test.mjs +92 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +4 -3
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +53 -14
- 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 +725 -0
- package/clients/cli/commands/theme-add.doc.mjs +5 -4
- 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 +12 -7
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +2 -3
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +3 -3
- 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 +3 -2
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +83 -12
- 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 +47 -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 +56 -6
- package/clients/cli/lib/define-command.test.mjs +54 -0
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +113 -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 +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +53 -6
- 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 +83 -13
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- 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 +174 -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 +504 -0
- package/foundation/discovery/cli-self-docs.test.mjs +395 -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 +427 -108
- package/foundation/discovery/docs-discovery.test.mjs +386 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +774 -83
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1643 -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 +298 -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 +292 -0
- package/foundation/doc-compiler/tree.mjs +881 -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 +65 -0
- package/foundation/integrations/cli-requirement.mjs +189 -0
- package/foundation/integrations/cli-requirement.test.mjs +89 -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 +28 -25
- 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 +19 -12
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +166 -14
- 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 +7 -2
- package/foundation/response/response-types.doc.mjs +69 -25
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +12 -11
- 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/api/docs/docs.test.mjs +0 -83
- package/api/docs/integrationDocs.test.mjs +0 -208
- package/api/search/search.test.mjs +0 -389
- package/assets/docs/cli-integrations.doc.mjs +0 -367
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/docs.test.mjs +0 -102
- 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
- package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Record the authored title of a section whose visible title a translation
|
|
6
|
+
* overlay replaces.
|
|
7
|
+
* @template {object} T
|
|
8
|
+
* @param {T} section
|
|
9
|
+
* @param {string} title
|
|
10
|
+
* @returns {T}
|
|
11
|
+
*/
|
|
12
|
+
export function withSourceTitle<T extends object>(section: T, title: string): T;
|
|
13
|
+
/**
|
|
14
|
+
* @param {any} section
|
|
15
|
+
* @returns {string}
|
|
16
|
+
*/
|
|
17
|
+
export function sourceTitle(section: any): string;
|
|
18
|
+
/**
|
|
19
|
+
* The key a title derives: accents folded, `&` spelled out, and every other
|
|
20
|
+
* run of non-alphanumerics collapsed to one hyphen. Empty when the title has
|
|
21
|
+
* no Latin letters or digits to derive from.
|
|
22
|
+
* @param {unknown} title
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
export function sectionTitleKey(title: unknown): string;
|
|
26
|
+
/**
|
|
27
|
+
* The key a section is addressed by: its authored `id`, else the key its
|
|
28
|
+
* authored title derives.
|
|
29
|
+
* @param {any} section
|
|
30
|
+
* @returns {string}
|
|
31
|
+
*/
|
|
32
|
+
export function sectionKey(section: any): string;
|
|
33
|
+
/**
|
|
34
|
+
* A name as a docs-tree route segment: lowercase words joined by hyphens, so
|
|
35
|
+
* `integrationPackCheck` and `integration verify` both read naturally.
|
|
36
|
+
* @param {string} name
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
39
|
+
export function routeSegment(name: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Fatal key problems: only an explicitly authored `id` can make a previously
|
|
42
|
+
* readable topic invalid. Derived-key collisions and titles with no Latin
|
|
43
|
+
* letters or digits are handled by {@link withSectionKeys} for 0.6.x
|
|
44
|
+
* compatibility.
|
|
45
|
+
* @param {any[]} sections
|
|
46
|
+
* @returns {string[]}
|
|
47
|
+
*/
|
|
48
|
+
export function sectionKeyErrors(sections: any[]): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Compatibility notices for section keys. These inputs loaded in 0.6.x, so
|
|
51
|
+
* readers keep accepting them and assign deterministic fallback keys.
|
|
52
|
+
* @param {any[]} sections
|
|
53
|
+
* @returns {string[]}
|
|
54
|
+
*/
|
|
55
|
+
export function sectionKeyProblems(sections: any[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Stamp every section with the key it is addressed by. Runs only after
|
|
58
|
+
* extensions merge: a derived key must never take part in merge matching.
|
|
59
|
+
* @template {{sections: any[]}} T
|
|
60
|
+
* @param {T} doc
|
|
61
|
+
* @returns {T}
|
|
62
|
+
*/
|
|
63
|
+
export function withSectionKeys<T extends {
|
|
64
|
+
sections: any[];
|
|
65
|
+
}>(doc: T): T;
|
|
66
|
+
/**
|
|
67
|
+
* Find the section a reader asked for. The 0.6.x first-match title-substring
|
|
68
|
+
* lookup remains first in the authored-title view. In a localized view, an
|
|
69
|
+
* exact stable key resolves before translated title substrings because those
|
|
70
|
+
* translations cannot participate in language-stable key allocation. Generated
|
|
71
|
+
* keys avoid authored-title conflicts, and authored IDs that would shadow an
|
|
72
|
+
* authored legacy query are rejected.
|
|
73
|
+
* @param {any[]} sections
|
|
74
|
+
* @param {string} query
|
|
75
|
+
* @returns {{section: any | null, candidates: any[]}} `candidates` lists every
|
|
76
|
+
* legacy title match when the query is ambiguous
|
|
77
|
+
*/
|
|
78
|
+
export function findDocSection(sections: any[], query: string): {
|
|
79
|
+
section: any | null;
|
|
80
|
+
candidates: any[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* One line that says what a section holds: its first prose or list text,
|
|
84
|
+
* whitespace collapsed, cut at a word boundary.
|
|
85
|
+
* @param {any} section
|
|
86
|
+
* @param {number} [max]
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
export function sectionSummary(section: any, max?: number): string;
|
|
90
|
+
/**
|
|
91
|
+
* The index a topic-only read returns: what the topic is, and one entry per
|
|
92
|
+
* section with the key to read it by.
|
|
93
|
+
* @param {{name: string, title: string, description: string, sections: any[]}} doc
|
|
94
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
95
|
+
*/
|
|
96
|
+
export function buildDocsIndexData(doc: {
|
|
97
|
+
name: string;
|
|
98
|
+
title: string;
|
|
99
|
+
description: string;
|
|
100
|
+
sections: any[];
|
|
101
|
+
}): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
|
|
102
|
+
/**
|
|
103
|
+
* @file Stable section keys, section lookup, and the topic index.
|
|
104
|
+
*
|
|
105
|
+
* @input Reference-doc sections, each with an optional authored `id`.
|
|
106
|
+
* @output The key a section is addressed by (its `id`, else a kebab-case key
|
|
107
|
+
* derived from its authored title), lookup by key or title, and the compact
|
|
108
|
+
* index a topic-only docs read returns.
|
|
109
|
+
* @position Shared by docs discovery (which rejects colliding keys before a
|
|
110
|
+
* reader sees them), the docs leaves (index, section, detail), and Doctor
|
|
111
|
+
* (output budgets). Imports nothing from discovery, so both can use it.
|
|
112
|
+
*/
|
|
113
|
+
/** A stable key: lowercase letters and digits, joined by single hyphens. */
|
|
114
|
+
export const SECTION_KEY_RE: RegExp;
|
|
115
|
+
/** The longest summary an index entry carries, in characters. */
|
|
116
|
+
export const SECTION_SUMMARY_MAX: 240;
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Stable section keys, section lookup, and the topic index.
|
|
5
|
+
*
|
|
6
|
+
* @input Reference-doc sections, each with an optional authored `id`.
|
|
7
|
+
* @output The key a section is addressed by (its `id`, else a kebab-case key
|
|
8
|
+
* derived from its authored title), lookup by key or title, and the compact
|
|
9
|
+
* index a topic-only docs read returns.
|
|
10
|
+
* @position Shared by docs discovery (which rejects colliding keys before a
|
|
11
|
+
* reader sees them), the docs leaves (index, section, detail), and Doctor
|
|
12
|
+
* (output budgets). Imports nothing from discovery, so both can use it.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** A stable key: lowercase letters and digits, joined by single hyphens. */
|
|
16
|
+
export const SECTION_KEY_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
17
|
+
|
|
18
|
+
/** The longest summary an index entry carries, in characters. */
|
|
19
|
+
export const SECTION_SUMMARY_MAX = 240;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A section's authored title. A `--zh`/`--dense` overlay replaces the visible
|
|
23
|
+
* title, but extensions are written against the authored one and keys derive
|
|
24
|
+
* from it, so both stay the same in every language.
|
|
25
|
+
*/
|
|
26
|
+
const SOURCE_TITLE = Symbol('astryx.docs.sourceTitle');
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Record the authored title of a section whose visible title a translation
|
|
30
|
+
* overlay replaces.
|
|
31
|
+
* @template {object} T
|
|
32
|
+
* @param {T} section
|
|
33
|
+
* @param {string} title
|
|
34
|
+
* @returns {T}
|
|
35
|
+
*/
|
|
36
|
+
export function withSourceTitle(section, title) {
|
|
37
|
+
Object.defineProperty(section, SOURCE_TITLE, {
|
|
38
|
+
value: title,
|
|
39
|
+
configurable: true,
|
|
40
|
+
});
|
|
41
|
+
return section;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {any} section
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
export function sourceTitle(section) {
|
|
49
|
+
return section?.[SOURCE_TITLE] ?? section?.title;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The key a title derives: accents folded, `&` spelled out, and every other
|
|
54
|
+
* run of non-alphanumerics collapsed to one hyphen. Empty when the title has
|
|
55
|
+
* no Latin letters or digits to derive from.
|
|
56
|
+
* @param {unknown} title
|
|
57
|
+
* @returns {string}
|
|
58
|
+
*/
|
|
59
|
+
export function sectionTitleKey(title) {
|
|
60
|
+
if (typeof title !== 'string') return '';
|
|
61
|
+
return title
|
|
62
|
+
.normalize('NFKD')
|
|
63
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
64
|
+
.toLowerCase()
|
|
65
|
+
.replace(/&/g, ' and ')
|
|
66
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
67
|
+
.replace(/^-+|-+$/g, '');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The key a section is addressed by: its authored `id`, else the key its
|
|
72
|
+
* authored title derives.
|
|
73
|
+
* @param {any} section
|
|
74
|
+
* @returns {string}
|
|
75
|
+
*/
|
|
76
|
+
export function sectionKey(section) {
|
|
77
|
+
return typeof section?.id === 'string'
|
|
78
|
+
? section.id
|
|
79
|
+
: sectionTitleKey(sourceTitle(section));
|
|
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 verify` 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.
|
|
154
|
+
* @param {any[]} sections
|
|
155
|
+
* @returns {string[]}
|
|
156
|
+
*/
|
|
157
|
+
export function sectionKeyProblems(sections) {
|
|
158
|
+
/** @type {string[]} */
|
|
159
|
+
const problems = [];
|
|
160
|
+
/** @type {Map<string, number>} */
|
|
161
|
+
const seen = new Map();
|
|
162
|
+
sections.forEach((section, s) => {
|
|
163
|
+
const at = `sections[${s}]`;
|
|
164
|
+
if (
|
|
165
|
+
section?.id == null &&
|
|
166
|
+
(typeof section?.title !== 'string' || section.title === '')
|
|
167
|
+
) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (
|
|
171
|
+
section?.id != null &&
|
|
172
|
+
(typeof section.id !== 'string' || !SECTION_KEY_RE.test(section.id))
|
|
173
|
+
) {
|
|
174
|
+
problems.push(
|
|
175
|
+
`${at}.id: ${JSON.stringify(section.id)} is not a stable key. Use lowercase letters and digits joined by single hyphens.`,
|
|
176
|
+
);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const key = sectionKey(section);
|
|
180
|
+
if (key === '') {
|
|
181
|
+
problems.push(
|
|
182
|
+
`${at}: no key derives from the title ${JSON.stringify(section?.title)}. A deterministic section-N compatibility key is used; add an explicit id.`,
|
|
183
|
+
);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const first = seen.get(key);
|
|
187
|
+
if (first != null) {
|
|
188
|
+
problems.push(
|
|
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.`,
|
|
190
|
+
);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
seen.set(key, s);
|
|
194
|
+
});
|
|
195
|
+
return problems;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Stamp every section with the key it is addressed by. Runs only after
|
|
200
|
+
* extensions merge: a derived key must never take part in merge matching.
|
|
201
|
+
* @template {{sections: any[]}} T
|
|
202
|
+
* @param {T} doc
|
|
203
|
+
* @returns {T}
|
|
204
|
+
*/
|
|
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();
|
|
212
|
+
return {
|
|
213
|
+
...doc,
|
|
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
|
+
}),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
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.
|
|
245
|
+
* @param {any[]} sections
|
|
246
|
+
* @param {string} query
|
|
247
|
+
* @returns {{section: any | null, candidates: any[]}} `candidates` lists every
|
|
248
|
+
* legacy title match when the query is ambiguous
|
|
249
|
+
*/
|
|
250
|
+
export function findDocSection(sections, query) {
|
|
251
|
+
const wanted = query.trim();
|
|
252
|
+
const byKey = sections.find(section => sectionKey(section) === wanted);
|
|
253
|
+
const hasLocalizedTitles = sections.some(
|
|
254
|
+
section => sourceTitle(section) !== section.title,
|
|
255
|
+
);
|
|
256
|
+
if (byKey && hasLocalizedTitles) {
|
|
257
|
+
return {section: byKey, candidates: []};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const lower = wanted.toLowerCase();
|
|
261
|
+
const legacy = sections.filter(section =>
|
|
262
|
+
section.title.toLowerCase().includes(lower),
|
|
263
|
+
);
|
|
264
|
+
if (legacy.length > 0) {
|
|
265
|
+
return {section: legacy[0], candidates: legacy.length > 1 ? legacy : []};
|
|
266
|
+
}
|
|
267
|
+
|
|
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,
|
|
277
|
+
);
|
|
278
|
+
return {section: byDerivedKey ?? null, candidates: []};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* One line that says what a section holds: its first prose or list text,
|
|
283
|
+
* whitespace collapsed, cut at a word boundary.
|
|
284
|
+
* @param {any} section
|
|
285
|
+
* @param {number} [max]
|
|
286
|
+
* @returns {string}
|
|
287
|
+
*/
|
|
288
|
+
export function sectionSummary(section, max = SECTION_SUMMARY_MAX) {
|
|
289
|
+
const first = (section?.content ?? []).find(
|
|
290
|
+
(/** @type {any} */ block) =>
|
|
291
|
+
(block?.type === 'prose' && typeof block.text === 'string') ||
|
|
292
|
+
(block?.type === 'list' && Array.isArray(block.items)),
|
|
293
|
+
);
|
|
294
|
+
const raw =
|
|
295
|
+
first == null ? '' : first.type === 'prose' ? first.text : first.items[0];
|
|
296
|
+
const text = String(raw ?? '')
|
|
297
|
+
.replace(/\s+/g, ' ')
|
|
298
|
+
.trim();
|
|
299
|
+
if (text.length <= max) return text;
|
|
300
|
+
const cut = text.slice(0, max - 1);
|
|
301
|
+
const space = cut.lastIndexOf(' ');
|
|
302
|
+
return `${(space > max / 2 ? cut.slice(0, space) : cut).trimEnd()}…`;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* The index a topic-only read returns: what the topic is, and one entry per
|
|
307
|
+
* section with the key to read it by.
|
|
308
|
+
* @param {{name: string, title: string, description: string, sections: any[]}} doc
|
|
309
|
+
* @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
|
|
310
|
+
*/
|
|
311
|
+
export function buildDocsIndexData(doc) {
|
|
312
|
+
return {
|
|
313
|
+
name: doc.name,
|
|
314
|
+
title: doc.title,
|
|
315
|
+
description: doc.description,
|
|
316
|
+
sections: doc.sections.map(section => ({
|
|
317
|
+
id: sectionKey(section),
|
|
318
|
+
title: section.title,
|
|
319
|
+
summary: sectionSummary(section),
|
|
320
|
+
})),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import {
|
|
5
|
+
SECTION_KEY_RE,
|
|
6
|
+
SECTION_SUMMARY_MAX,
|
|
7
|
+
buildDocsIndexData,
|
|
8
|
+
findDocSection,
|
|
9
|
+
sectionKey,
|
|
10
|
+
sectionKeyErrors,
|
|
11
|
+
sectionKeyProblems,
|
|
12
|
+
sectionSummary,
|
|
13
|
+
sectionTitleKey,
|
|
14
|
+
sourceTitle,
|
|
15
|
+
withSectionKeys,
|
|
16
|
+
withSourceTitle,
|
|
17
|
+
} from './docs-section-key.mjs';
|
|
18
|
+
|
|
19
|
+
/** @param {string} title @param {object} [fields] */
|
|
20
|
+
const section = (title, fields = {}) => ({title, content: [], ...fields});
|
|
21
|
+
|
|
22
|
+
describe('sectionTitleKey', () => {
|
|
23
|
+
it.each([
|
|
24
|
+
['Quick Start', 'quick-start'],
|
|
25
|
+
['Light/Dark Mode', 'light-dark-mode'],
|
|
26
|
+
["Do & Don't", 'do-and-don-t'],
|
|
27
|
+
[' Café Crème ', 'cafe-creme'],
|
|
28
|
+
['useTheme()', 'usetheme'],
|
|
29
|
+
['--- Tokens ---', 'tokens'],
|
|
30
|
+
['亮/暗模式', ''],
|
|
31
|
+
['', ''],
|
|
32
|
+
])('%j derives %j', (title, key) => {
|
|
33
|
+
expect(sectionTitleKey(title)).toBe(key);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('derives only stable keys', () => {
|
|
37
|
+
for (const title of ['A B', 'x__y', 'Élan 2.0', 'a-b-', '-a']) {
|
|
38
|
+
expect(sectionTitleKey(title)).toMatch(SECTION_KEY_RE);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('derives nothing from a non-string', () => {
|
|
43
|
+
expect(sectionTitleKey(undefined)).toBe('');
|
|
44
|
+
expect(sectionTitleKey(42)).toBe('');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('sectionKey', () => {
|
|
49
|
+
it('prefers the authored id', () => {
|
|
50
|
+
expect(sectionKey(section('Quick Start', {id: 'start'}))).toBe('start');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('derives from the authored title, not a translated one', () => {
|
|
54
|
+
const translated = withSourceTitle(section('快速开始'), 'Quick Start');
|
|
55
|
+
expect(sectionKey(translated)).toBe('quick-start');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('sectionKeyProblems', () => {
|
|
60
|
+
it('accepts distinct keys', () => {
|
|
61
|
+
expect(
|
|
62
|
+
sectionKeyProblems([section('Install'), section('Usage', {id: 'use'})]),
|
|
63
|
+
).toEqual([]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('rejects two sections that share a key', () => {
|
|
67
|
+
const problems = sectionKeyProblems([
|
|
68
|
+
section('Quick Start'),
|
|
69
|
+
section('Quick-start'),
|
|
70
|
+
]);
|
|
71
|
+
expect(problems).toHaveLength(1);
|
|
72
|
+
expect(problems[0]).toContain(
|
|
73
|
+
'"quick-start" is already used by sections[0]',
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('rejects an authored id that collides with a derived key', () => {
|
|
78
|
+
expect(
|
|
79
|
+
sectionKeyProblems([
|
|
80
|
+
section('Install'),
|
|
81
|
+
section('Setup', {id: 'install'}),
|
|
82
|
+
]),
|
|
83
|
+
).toHaveLength(1);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('rejects an unsafe id and never suffixes one', () => {
|
|
87
|
+
for (const id of ['Quick Start', 'a_b', 'a--b', '-a', '', 7]) {
|
|
88
|
+
expect(sectionKeyProblems([section('Install', {id})])[0]).toContain(
|
|
89
|
+
'is not a stable key',
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('reports a title no key derives from', () => {
|
|
95
|
+
expect(sectionKeyProblems([section('亮/暗模式')])[0]).toContain(
|
|
96
|
+
'compatibility key is used',
|
|
97
|
+
);
|
|
98
|
+
expect(
|
|
99
|
+
sectionKeyProblems([section('亮/暗模式', {id: 'light-dark'})]),
|
|
100
|
+
).toEqual([]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('leaves a missing title to the title check', () => {
|
|
104
|
+
expect(sectionKeyProblems([{content: []}, section('')])).toEqual([]);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe('withSectionKeys', () => {
|
|
109
|
+
it('stamps derived keys and keeps authored ones', () => {
|
|
110
|
+
const doc = withSectionKeys({
|
|
111
|
+
sections: [section('Quick Start'), section('Usage', {id: 'use'})],
|
|
112
|
+
});
|
|
113
|
+
expect(doc.sections.map(s => s.id)).toEqual(['quick-start', 'use']);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('keeps authored titles and keys stable for translated sections', () => {
|
|
117
|
+
const doc = withSectionKeys({
|
|
118
|
+
sections: [
|
|
119
|
+
withSourceTitle(section('高级安装'), 'Install advanced'),
|
|
120
|
+
withSourceTitle(section('安装'), 'Install'),
|
|
121
|
+
],
|
|
122
|
+
});
|
|
123
|
+
expect(doc.sections.map(s => s.id)).toEqual([
|
|
124
|
+
'install-advanced',
|
|
125
|
+
'install-2',
|
|
126
|
+
]);
|
|
127
|
+
for (const target of doc.sections) {
|
|
128
|
+
expect(findDocSection(doc.sections, target.id).section).toBe(target);
|
|
129
|
+
}
|
|
130
|
+
expect(sourceTitle(doc.sections[0])).toBe('Install advanced');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('findDocSection', () => {
|
|
135
|
+
const sections = withSectionKeys({
|
|
136
|
+
sections: [
|
|
137
|
+
section('Quick Start'),
|
|
138
|
+
section('Theme Props'),
|
|
139
|
+
section('Theme Tokens', {id: 'tokens'}),
|
|
140
|
+
section('Overview', {id: 'overview-a'}),
|
|
141
|
+
section('Overview', {id: 'overview-b'}),
|
|
142
|
+
],
|
|
143
|
+
}).sections;
|
|
144
|
+
|
|
145
|
+
it('finds every emitted key without changing a legacy query', () => {
|
|
146
|
+
const colliding = withSectionKeys({
|
|
147
|
+
sections: [section('Install advanced'), section('Install')],
|
|
148
|
+
}).sections;
|
|
149
|
+
expect(findDocSection(colliding, 'install').section).toBe(colliding[0]);
|
|
150
|
+
for (const target of colliding) {
|
|
151
|
+
expect(findDocSection(colliding, target.id).section).toBe(target);
|
|
152
|
+
}
|
|
153
|
+
expect(findDocSection(sections, 'tokens').section.title).toBe(
|
|
154
|
+
'Theme Tokens',
|
|
155
|
+
);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('finds a section by exact title, case-insensitively', () => {
|
|
159
|
+
expect(findDocSection(sections, 'quick start').section.id).toBe(
|
|
160
|
+
'quick-start',
|
|
161
|
+
);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('finds a section by the key its query derives', () => {
|
|
165
|
+
expect(findDocSection(sections, 'Quick-Start!').section.id).toBe(
|
|
166
|
+
'quick-start',
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('finds a section by a unique part of its title', () => {
|
|
171
|
+
expect(findDocSection(sections, 'props').section.id).toBe('theme-props');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('keeps the first ambiguous exact-title match and lists the candidates', () => {
|
|
175
|
+
const {section: match, candidates} = findDocSection(sections, 'Overview');
|
|
176
|
+
expect(match?.id).toBe('overview-a');
|
|
177
|
+
expect(candidates.map(s => s.id)).toEqual(['overview-a', 'overview-b']);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('keeps the first ambiguous partial-title match', () => {
|
|
181
|
+
const {section: match, candidates} = findDocSection(sections, 'theme');
|
|
182
|
+
expect(match?.id).toBe('theme-props');
|
|
183
|
+
expect(candidates.map(s => s.id)).toEqual(['theme-props', 'tokens']);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('returns nothing for no match', () => {
|
|
187
|
+
expect(findDocSection(sections, 'zzz')).toEqual({
|
|
188
|
+
section: null,
|
|
189
|
+
candidates: [],
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe('sectionSummary', () => {
|
|
195
|
+
it('uses the first prose or list text, whitespace collapsed', () => {
|
|
196
|
+
expect(
|
|
197
|
+
sectionSummary({
|
|
198
|
+
content: [
|
|
199
|
+
{type: 'code', lang: 'ts', code: 'x'},
|
|
200
|
+
{type: 'prose', text: 'Line one.\n\n Line two.'},
|
|
201
|
+
],
|
|
202
|
+
}),
|
|
203
|
+
).toBe('Line one. Line two.');
|
|
204
|
+
expect(
|
|
205
|
+
sectionSummary({content: [{type: 'list', items: ['First', 'Second']}]}),
|
|
206
|
+
).toBe('First');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('is empty when the section has no text', () => {
|
|
210
|
+
expect(
|
|
211
|
+
sectionSummary({content: [{type: 'table', headers: [], rows: []}]}),
|
|
212
|
+
).toBe('');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('cuts a long summary at a word boundary', () => {
|
|
216
|
+
const summary = sectionSummary({
|
|
217
|
+
content: [{type: 'prose', text: 'word '.repeat(200)}],
|
|
218
|
+
});
|
|
219
|
+
expect(summary.length).toBeLessThanOrEqual(SECTION_SUMMARY_MAX);
|
|
220
|
+
expect(summary.endsWith('word…')).toBe(true);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe('buildDocsIndexData', () => {
|
|
225
|
+
it('lists each section by key, title, and summary', () => {
|
|
226
|
+
expect(
|
|
227
|
+
buildDocsIndexData({
|
|
228
|
+
name: 'theme',
|
|
229
|
+
title: 'Theme',
|
|
230
|
+
description: 'Theming.',
|
|
231
|
+
sections: [
|
|
232
|
+
section('Quick Start', {content: [{type: 'prose', text: 'Start.'}]}),
|
|
233
|
+
section('Usage', {id: 'use'}),
|
|
234
|
+
],
|
|
235
|
+
}),
|
|
236
|
+
).toEqual({
|
|
237
|
+
name: 'theme',
|
|
238
|
+
title: 'Theme',
|
|
239
|
+
description: 'Theming.',
|
|
240
|
+
sections: [
|
|
241
|
+
{id: 'quick-start', title: 'Quick Start', summary: 'Start.'},
|
|
242
|
+
{id: 'use', title: 'Usage', summary: ''},
|
|
243
|
+
],
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|