@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +194 -0
- package/README.md +121 -85
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +36 -13
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +166 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +104 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +2 -3
- package/api/index.mjs +5 -4
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
- package/api/integration/pack-check.mjs +111 -10
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -1
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +142 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1008 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +46 -9
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +359 -60
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +353 -104
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +11 -3
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +31 -8
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +5 -4
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +6 -5
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +48 -6
- package/authoring/doctypes/reference/type.ts +70 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/command-result-coverage.test.mjs +7 -7
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +24 -7
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +222 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +702 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -34
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +90 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- package/clients/cli/lib/json-shim.test.mjs +69 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +39 -10
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +775 -84
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +606 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +46 -38
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/browser.d.mts +3 -3
- package/foundation/xle/browser.mjs +3 -3
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +6 -5
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/parse.mjs +1 -1
- package/foundation/xle/print.mjs +2 -2
- package/foundation/xle/splice.mjs +1 -1
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/api/layout/_adapter.d.mts +0 -34
- package/api/layout/_adapter.mjs +0 -133
- package/api/layout/check/check.d.mts +0 -16
- package/api/layout/check/check.mjs +0 -40
- package/api/layout/expand/expand.d.mts +0 -22
- package/api/layout/expand/expand.mjs +0 -153
- package/api/layout/grammar/grammar.d.mts +0 -13
- package/api/layout/grammar/grammar.mjs +0 -86
- package/api/layout/layout.d.mts +0 -6
- package/api/layout/layout.mjs +0 -17
- package/api/layout/layout.test.mjs +0 -297
- package/api/layout/layout.type.d.mts +0 -89
- package/api/layout/layout.type.mjs +0 -103
- package/api/layout/layoutCheck.doc.d.mts +0 -11
- package/api/layout/layoutCheck.doc.mjs +0 -84
- package/api/layout/layoutExpand.doc.d.mts +0 -11
- package/api/layout/layoutExpand.doc.mjs +0 -106
- package/api/layout/layoutGrammar.doc.d.mts +0 -11
- package/api/layout/layoutGrammar.doc.mjs +0 -56
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/layout-check.doc.mjs +0 -54
- package/clients/cli/commands/layout-expand.doc.mjs +0 -66
- package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
- package/clients/cli/commands/layout.doc.mjs +0 -34
- package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
- package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
- package/clients/cli/commands/layout.mjs +0 -263
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Translation overlays for component and hook docs.
|
|
5
|
+
*
|
|
6
|
+
* @input An authored component or hook doc and the translation its module
|
|
7
|
+
* exports for the reading language (`docsZh`, `docsDense`).
|
|
8
|
+
* @output The doc in that language: translated text laid over the authored
|
|
9
|
+
* doc, never dropping a prop, param, or field the translation has not
|
|
10
|
+
* caught up with.
|
|
11
|
+
* @position Used by ./compile.mjs when it lowers a component or hook doc, so
|
|
12
|
+
* every reader sees one overlay rule. Reference topics overlay by section in
|
|
13
|
+
* ./compile.mjs instead.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The translation a doc module exports for `lang`, or null.
|
|
18
|
+
* @param {Record<string, any>} mod
|
|
19
|
+
* @param {string | null} lang
|
|
20
|
+
* @returns {any}
|
|
21
|
+
*/
|
|
22
|
+
export function translationFor(mod, lang) {
|
|
23
|
+
const key = lang === 'zh' ? 'docsZh' : lang === 'dense' ? 'docsDense' : null;
|
|
24
|
+
return key && mod?.[key] ? mod[key] : null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Lay a translation over an authored component or hook doc. A translation
|
|
29
|
+
* that carries props is a full translated doc, overlaid prop by prop; any other
|
|
30
|
+
* is a set of translated strings merged onto the doc.
|
|
31
|
+
* @param {any} docs
|
|
32
|
+
* @param {any} translation
|
|
33
|
+
* @returns {any}
|
|
34
|
+
*/
|
|
35
|
+
export function overlayAuthoredDoc(docs, translation) {
|
|
36
|
+
if (
|
|
37
|
+
translation.props ||
|
|
38
|
+
translation.components?.some((/** @type {any} */ c) => c.props)
|
|
39
|
+
) {
|
|
40
|
+
return overlayComponentDoc(docs, translation);
|
|
41
|
+
}
|
|
42
|
+
return mergeTranslation(docs, translation);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {any} docs
|
|
47
|
+
* @param {any} translation
|
|
48
|
+
* @returns {any}
|
|
49
|
+
*/
|
|
50
|
+
export function mergeTranslation(docs, translation) {
|
|
51
|
+
if (!translation) return docs;
|
|
52
|
+
|
|
53
|
+
/** @type {any} */
|
|
54
|
+
const merged = {...docs};
|
|
55
|
+
|
|
56
|
+
// Merge prose into usage
|
|
57
|
+
if (merged.usage) {
|
|
58
|
+
merged.usage = {...merged.usage};
|
|
59
|
+
if (translation.usage?.description)
|
|
60
|
+
merged.usage.description = translation.usage.description;
|
|
61
|
+
else if (translation.description)
|
|
62
|
+
merged.usage.description = translation.description;
|
|
63
|
+
if (translation.usage?.bestPractices)
|
|
64
|
+
merged.usage.bestPractices = translation.usage.bestPractices;
|
|
65
|
+
if (translation.usage?.accessibility)
|
|
66
|
+
merged.usage.accessibility = translation.usage.accessibility;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Legacy top-level fields (for docsZh that are full ComponentDoc clones)
|
|
70
|
+
if (translation.description && !merged.usage)
|
|
71
|
+
merged.description = translation.description;
|
|
72
|
+
|
|
73
|
+
// Merge prop descriptions for single-component docs
|
|
74
|
+
if (translation.propDescriptions && merged.props) {
|
|
75
|
+
merged.props = merged.props.map((/** @type {any} */ prop) => {
|
|
76
|
+
const desc = translation.propDescriptions[prop.name];
|
|
77
|
+
return desc != null ? {...prop, description: desc} : prop;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Merge hook param descriptions (HookTranslationDoc). Params are an array of
|
|
82
|
+
// {name, type, description, required}; override description by name where the
|
|
83
|
+
// translation has an entry. Names may include dots (e.g. 'options.isActive');
|
|
84
|
+
// the lookup is keyed by the exact param name.
|
|
85
|
+
if (translation.paramDescriptions && merged.params) {
|
|
86
|
+
merged.params = merged.params.map((/** @type {any} */ param) => {
|
|
87
|
+
const desc = translation.paramDescriptions[param.name];
|
|
88
|
+
return desc != null ? {...param, description: desc} : param;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Merge hook return descriptions (HookTranslationDoc). Returns are an array
|
|
93
|
+
// of {name, type, description}; override description by name where present.
|
|
94
|
+
if (translation.returnDescriptions && merged.returns) {
|
|
95
|
+
merged.returns = merged.returns.map((/** @type {any} */ ret) => {
|
|
96
|
+
const desc = translation.returnDescriptions[ret.name];
|
|
97
|
+
return desc != null ? {...ret, description: desc} : ret;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Merge sub-component translations
|
|
102
|
+
if (translation.components && merged.components) {
|
|
103
|
+
merged.components = merged.components.map(
|
|
104
|
+
(/** @type {any} */ comp, /** @type {any} */ i) => {
|
|
105
|
+
const trans =
|
|
106
|
+
translation.components.find(
|
|
107
|
+
(/** @type {any} */ t) => t.name === comp.name,
|
|
108
|
+
) || translation.components[i];
|
|
109
|
+
if (!trans) return comp;
|
|
110
|
+
|
|
111
|
+
const mergedComp = {...comp};
|
|
112
|
+
if (trans.description) mergedComp.description = trans.description;
|
|
113
|
+
if (trans.propDescriptions && comp.props) {
|
|
114
|
+
mergedComp.props = comp.props.map((/** @type {any} */ prop) => {
|
|
115
|
+
const desc = trans.propDescriptions[prop.name];
|
|
116
|
+
return desc != null ? {...prop, description: desc} : prop;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return mergedComp;
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return merged;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Overlay a full-ComponentDoc-shaped translation onto the English doc.
|
|
129
|
+
*
|
|
130
|
+
* Base order and completeness win; the translation supplies text for the
|
|
131
|
+
* entries it covers. Props are matched by name, never by position, so a
|
|
132
|
+
* translation that is missing entries (or lists them in another order) can no
|
|
133
|
+
* longer drop or misattribute one.
|
|
134
|
+
*
|
|
135
|
+
* @param {any} docs Base (English) component doc.
|
|
136
|
+
* @param {any} translation Translated doc, possibly covering only some props.
|
|
137
|
+
* @returns {any} Merged doc with every base prop present.
|
|
138
|
+
*/
|
|
139
|
+
function overlayComponentDoc(docs, translation) {
|
|
140
|
+
/** Merge one prop list: keep base entries and order, translate what's covered.
|
|
141
|
+
* @param {any[] | undefined} baseProps
|
|
142
|
+
* @param {any[] | undefined} tProps
|
|
143
|
+
*/
|
|
144
|
+
const overlayProps = (baseProps, tProps) => {
|
|
145
|
+
if (!baseProps) return baseProps;
|
|
146
|
+
const byName = new Map(
|
|
147
|
+
(tProps ?? []).map((/** @type {any} */ p) => [p.name, p]),
|
|
148
|
+
);
|
|
149
|
+
return baseProps.map((/** @type {any} */ prop) => {
|
|
150
|
+
const t = byName.get(prop.name);
|
|
151
|
+
// Take the translated text, but never let it drop the prop's contract
|
|
152
|
+
// (type/default/required stay authoritative from the English doc).
|
|
153
|
+
return t ? {...prop, ...t, name: prop.name, type: prop.type} : prop;
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/** Preserve canonical structured guidance added after legacy full-doc translations,
|
|
158
|
+
* without changing established translated prose behavior.
|
|
159
|
+
* @param {any} baseUsage
|
|
160
|
+
* @param {any} translatedUsage
|
|
161
|
+
*/
|
|
162
|
+
const mergeUsage = (baseUsage, translatedUsage) => {
|
|
163
|
+
if (!translatedUsage) return baseUsage;
|
|
164
|
+
return {
|
|
165
|
+
...translatedUsage,
|
|
166
|
+
...(translatedUsage.accessibility === undefined &&
|
|
167
|
+
baseUsage?.accessibility !== undefined
|
|
168
|
+
? {accessibility: baseUsage.accessibility}
|
|
169
|
+
: null),
|
|
170
|
+
...(translatedUsage.accessibilityThemeCoverage === undefined &&
|
|
171
|
+
baseUsage?.accessibilityThemeCoverage !== undefined
|
|
172
|
+
? {accessibilityThemeCoverage: baseUsage.accessibilityThemeCoverage}
|
|
173
|
+
: null),
|
|
174
|
+
...(translatedUsage.anatomy === undefined &&
|
|
175
|
+
baseUsage?.anatomy !== undefined
|
|
176
|
+
? {anatomy: baseUsage.anatomy}
|
|
177
|
+
: null),
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const merged = {
|
|
182
|
+
...docs,
|
|
183
|
+
...translation,
|
|
184
|
+
usage: mergeUsage(docs.usage, translation.usage),
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
merged.props = overlayProps(docs.props, translation.props);
|
|
188
|
+
|
|
189
|
+
if (docs.components) {
|
|
190
|
+
const tByName = new Map(
|
|
191
|
+
(translation.components ?? []).map((/** @type {any} */ c) => [c.name, c]),
|
|
192
|
+
);
|
|
193
|
+
merged.components = docs.components.map((/** @type {any} */ base) => {
|
|
194
|
+
const t = tByName.get(base.name);
|
|
195
|
+
if (!t) return base;
|
|
196
|
+
return {
|
|
197
|
+
...base,
|
|
198
|
+
...t,
|
|
199
|
+
usage: mergeUsage(base.usage, t.usage),
|
|
200
|
+
props: overlayProps(base.props, t.props),
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return merged;
|
|
206
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
* @param {unknown} input
|
|
6
|
+
* @param {string} [label]
|
|
7
|
+
* @returns {any}
|
|
8
|
+
*/
|
|
9
|
+
export function parseReadableDoc(input: unknown, label?: string): any;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file parseDoc as every reader outside the themes root has always seen it.
|
|
5
|
+
*
|
|
6
|
+
* @input Any authored doc value and a label for messages.
|
|
7
|
+
* @output The parsed doc, or the parser's error.
|
|
8
|
+
* @position The public `parseDoc` also accepts theme descriptors. Component,
|
|
9
|
+
* hook, self-doc, and topic readers never did: to them a theme descriptor is
|
|
10
|
+
* an unsupported type, with the message they have always printed.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {parseDoc} from '../../authoring/doctypes/parse.mjs';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {unknown} input
|
|
17
|
+
* @param {string} [label]
|
|
18
|
+
* @returns {any}
|
|
19
|
+
*/
|
|
20
|
+
export function parseReadableDoc(input, label = 'doc') {
|
|
21
|
+
const type =
|
|
22
|
+
input && typeof input === 'object' && 'type' in input
|
|
23
|
+
? /** @type {{type?: unknown}} */ (input).type
|
|
24
|
+
: undefined;
|
|
25
|
+
if (type === 'theme') {
|
|
26
|
+
throw new Error(`${label} has unsupported type ${JSON.stringify(type)}.`);
|
|
27
|
+
}
|
|
28
|
+
return parseDoc(input, label);
|
|
29
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
* Lower one descriptor file. Memoized per file and options for the life of the
|
|
6
|
+
* process; a file that failed to load is tried again on the next read, as a
|
|
7
|
+
* fresh import would be.
|
|
8
|
+
* @param {string} file absolute path
|
|
9
|
+
* @param {ReadOptions} options
|
|
10
|
+
* @param {{node?: boolean}} [want] also build the sealed node
|
|
11
|
+
* @returns {Promise<import('./compile.mjs').LoweredDoc>}
|
|
12
|
+
*/
|
|
13
|
+
export function compileDocFile(file: string, options: ReadOptions, { node }?: {
|
|
14
|
+
node?: boolean;
|
|
15
|
+
}): Promise<import("./compile.mjs").LoweredDoc>;
|
|
16
|
+
/**
|
|
17
|
+
* What a reader gets for one descriptor: the view it has always read.
|
|
18
|
+
*
|
|
19
|
+
* `strict` readers check the doc and throw what they always threw: the import
|
|
20
|
+
* error, the parser's error (for an empty export too), then a failed
|
|
21
|
+
* translation. Other readers skip the check, throw only what importing or
|
|
22
|
+
* translating threw, and read an empty export as the empty value itself.
|
|
23
|
+
* The view is shared, as the module's own export always was.
|
|
24
|
+
* @param {string} file absolute path
|
|
25
|
+
* @param {ReadOptions & {strict?: boolean}} options
|
|
26
|
+
* @returns {Promise<any>}
|
|
27
|
+
*/
|
|
28
|
+
export function readDocView(file: string, options: ReadOptions & {
|
|
29
|
+
strict?: boolean;
|
|
30
|
+
}): Promise<any>;
|
|
31
|
+
/**
|
|
32
|
+
* Freeze a value and everything in it.
|
|
33
|
+
* @template T
|
|
34
|
+
* @param {T} value
|
|
35
|
+
* @returns {T}
|
|
36
|
+
*/
|
|
37
|
+
export function deepFreeze<T>(value: T): T;
|
|
38
|
+
/**
|
|
39
|
+
* Where the `lang` overlay of a doc file lives: `{topic}.doc.{lang}.mjs`.
|
|
40
|
+
* @param {string} docPath
|
|
41
|
+
* @param {string} lang
|
|
42
|
+
* @returns {string}
|
|
43
|
+
*/
|
|
44
|
+
export function overlayPath(docPath: string, lang: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* The overlay languages a topic ships for its own file or any extension.
|
|
47
|
+
* @param {import('../discovery/docs-discovery.mjs').DocsTopicEntry} entry
|
|
48
|
+
* @returns {string[]}
|
|
49
|
+
*/
|
|
50
|
+
export function overlayLanguages(entry: import("../discovery/docs-discovery.mjs").DocsTopicEntry): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Load one topic file and the overlay for `lang`. A failure is recorded on the
|
|
53
|
+
* result, not thrown, so the compiler reports it in reading order.
|
|
54
|
+
* @param {string} docPath
|
|
55
|
+
* @param {string | null} lang
|
|
56
|
+
* @returns {Promise<import('./compile.mjs').AuthoredFile>}
|
|
57
|
+
*/
|
|
58
|
+
export function loadTopicFile(docPath: string, lang: string | null): Promise<import("./compile.mjs").AuthoredFile>;
|
|
59
|
+
/**
|
|
60
|
+
* Everything the compiler needs for one topic, read from disk.
|
|
61
|
+
* @param {import('../discovery/docs-discovery.mjs').DocsTopicEntry} entry
|
|
62
|
+
* @param {string | null} lang
|
|
63
|
+
* @returns {Promise<import('./compile.mjs').ReferenceTopicInput>}
|
|
64
|
+
*/
|
|
65
|
+
export function loadTopicInput(entry: import("../discovery/docs-discovery.mjs").DocsTopicEntry, lang: string | null): Promise<import("./compile.mjs").ReferenceTopicInput>;
|
|
66
|
+
/**
|
|
67
|
+
* How each root's module names its doc, in precedence order: the `??` chain
|
|
68
|
+
* each reader has always used, so a file that exports two docs keeps serving
|
|
69
|
+
* the one it served before.
|
|
70
|
+
*/
|
|
71
|
+
export const DOC_EXPORTS: Readonly<{
|
|
72
|
+
components: string[];
|
|
73
|
+
hooks: string[];
|
|
74
|
+
templates: string[];
|
|
75
|
+
'self-docs': string[];
|
|
76
|
+
tree: string[];
|
|
77
|
+
}>;
|
|
78
|
+
/** The localized overlays a docs read can apply. */
|
|
79
|
+
export const OVERLAY_LANGUAGES: string[];
|
|
80
|
+
export type ReadOptions = {
|
|
81
|
+
root: "components" | "hooks" | "templates" | "themes" | "self-docs" | "tree";
|
|
82
|
+
/**
|
|
83
|
+
* overlay language; null reads the authored
|
|
84
|
+
* text
|
|
85
|
+
*/
|
|
86
|
+
lang?: string | null | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* how a parse error names the file (default: its
|
|
89
|
+
* file name)
|
|
90
|
+
*/
|
|
91
|
+
label?: string | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* the owning package, when the caller knows it
|
|
94
|
+
*/
|
|
95
|
+
provider?: string | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* the node's id (default: provider, root, and file
|
|
98
|
+
* name)
|
|
99
|
+
*/
|
|
100
|
+
id?: string | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* how to import the module (default
|
|
103
|
+
* `user`)
|
|
104
|
+
*/
|
|
105
|
+
loader?: "template" | "native" | "user" | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* which exports name the doc, in
|
|
108
|
+
* precedence order, for a reader that has always read a narrower set than its
|
|
109
|
+
* root's default ({@link DOC_EXPORTS})
|
|
110
|
+
*/
|
|
111
|
+
exports?: readonly string[] | undefined;
|
|
112
|
+
/**
|
|
113
|
+
* for themes: the descriptor value, read
|
|
114
|
+
* without executing the file
|
|
115
|
+
*/
|
|
116
|
+
readStatic?: (() => unknown) | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* which value the view carries: the
|
|
119
|
+
* authored export (default) or its parser's result, for a reader that has
|
|
120
|
+
* always read the checked value
|
|
121
|
+
*/
|
|
122
|
+
value?: "authored" | "parsed" | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* hold the doc to its kind's parser
|
|
125
|
+
*/
|
|
126
|
+
check?: boolean | undefined;
|
|
127
|
+
};
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Doc reader — authored files in, lowered docs out, for every doc kind.
|
|
5
|
+
*
|
|
6
|
+
* @input A descriptor file, the root that reads it (components, hooks,
|
|
7
|
+
* templates, themes, self-docs, or doc topics), the reading language, and
|
|
8
|
+
* how strictly the reader checks.
|
|
9
|
+
* @output The lowered doc for that file. Readers get the view they have always
|
|
10
|
+
* read, lowered afresh on every read; a whole-project compile also gets the
|
|
11
|
+
* sealed node, memoized per file for the life of the process. For doc
|
|
12
|
+
* topics: the compiler input for a topic, with its extensions and overlays
|
|
13
|
+
* loaded.
|
|
14
|
+
* @position Loads authored doc files for the readers in api/ and clients/ and
|
|
15
|
+
* hands each to ./compile.mjs. Each reader keeps its own loader, export
|
|
16
|
+
* order, and strictness, so what it prints is what it printed before.
|
|
17
|
+
* ./doc-loads.test.mjs lists, site by site, every other place the CLI runs
|
|
18
|
+
* anything but its static imports of other CLI code, the doc reads that skip
|
|
19
|
+
* this module among them: discovery's catalog fields, each command's
|
|
20
|
+
* self-docs for its help text, and the build-time README. A new site fails
|
|
21
|
+
* it. It catches every ordinary way of running code, whatever the local
|
|
22
|
+
* names; deliberate obfuscation is out of scope. Internal to the CLI:
|
|
23
|
+
* nothing here is public API.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
import {
|
|
29
|
+
importDocModule,
|
|
30
|
+
importNativeModule,
|
|
31
|
+
importTemplateModule,
|
|
32
|
+
} from './import.mjs';
|
|
33
|
+
import {lowerDoc, parserFor} from './compile.mjs';
|
|
34
|
+
import {translationFor} from './overlays.mjs';
|
|
35
|
+
import {parseReadableDoc} from './parse-readable.mjs';
|
|
36
|
+
import {packageOf, packageSource} from './source.mjs';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* How each root's module names its doc, in precedence order: the `??` chain
|
|
40
|
+
* each reader has always used, so a file that exports two docs keeps serving
|
|
41
|
+
* the one it served before.
|
|
42
|
+
*/
|
|
43
|
+
export const DOC_EXPORTS = Object.freeze({
|
|
44
|
+
components: ['default', 'docs'],
|
|
45
|
+
hooks: ['default', 'docs'],
|
|
46
|
+
templates: ['default', 'doc'],
|
|
47
|
+
'self-docs': ['doc', 'docs', 'default'],
|
|
48
|
+
// The docs tree's own files: namespace docs and the guides it places.
|
|
49
|
+
tree: ['docs', 'default'],
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
/** How a reader imports a doc module. */
|
|
53
|
+
const LOADERS = Object.freeze({
|
|
54
|
+
// jiti for `.ts`, native otherwise: the checked loaders' import.
|
|
55
|
+
user: importDocModule,
|
|
56
|
+
// A plain `import()`: what the unchecked readers have always used.
|
|
57
|
+
native: importNativeModule,
|
|
58
|
+
// jiti with JSX for `.ts`: template discovery's import.
|
|
59
|
+
template: importTemplateModule,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @typedef {object} ReadOptions
|
|
64
|
+
* @property {'components' | 'hooks' | 'templates' | 'themes' | 'self-docs' | 'tree'} root
|
|
65
|
+
* @property {string | null} [lang] overlay language; null reads the authored
|
|
66
|
+
* text
|
|
67
|
+
* @property {string} [label] how a parse error names the file (default: its
|
|
68
|
+
* file name)
|
|
69
|
+
* @property {string} [provider] the owning package, when the caller knows it
|
|
70
|
+
* @property {string} [id] the node's id (default: provider, root, and file
|
|
71
|
+
* name)
|
|
72
|
+
* @property {keyof typeof LOADERS} [loader] how to import the module (default
|
|
73
|
+
* `user`)
|
|
74
|
+
* @property {readonly string[]} [exports] which exports name the doc, in
|
|
75
|
+
* precedence order, for a reader that has always read a narrower set than its
|
|
76
|
+
* root's default ({@link DOC_EXPORTS})
|
|
77
|
+
* @property {() => unknown} [readStatic] for themes: the descriptor value, read
|
|
78
|
+
* without executing the file
|
|
79
|
+
* @property {'authored' | 'parsed'} [value] which value the view carries: the
|
|
80
|
+
* authored export (default) or its parser's result, for a reader that has
|
|
81
|
+
* always read the checked value
|
|
82
|
+
* @property {boolean} [check] hold the doc to its kind's parser
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
/** @type {Map<string, Promise<import('./compile.mjs').LoweredDoc>>} */
|
|
86
|
+
const lowered = new Map();
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Lower one descriptor file. Memoized per file and options for the life of the
|
|
90
|
+
* process; a file that failed to load is tried again on the next read, as a
|
|
91
|
+
* fresh import would be.
|
|
92
|
+
* @param {string} file absolute path
|
|
93
|
+
* @param {ReadOptions} options
|
|
94
|
+
* @param {{node?: boolean}} [want] also build the sealed node
|
|
95
|
+
* @returns {Promise<import('./compile.mjs').LoweredDoc>}
|
|
96
|
+
*/
|
|
97
|
+
export function compileDocFile(file, options, {node = false} = {}) {
|
|
98
|
+
const lang = options.lang ?? null;
|
|
99
|
+
const check = options.check === true;
|
|
100
|
+
const key = JSON.stringify([
|
|
101
|
+
path.resolve(file),
|
|
102
|
+
options.root,
|
|
103
|
+
lang,
|
|
104
|
+
options.label ?? null,
|
|
105
|
+
options.provider ?? null,
|
|
106
|
+
options.id ?? null,
|
|
107
|
+
options.loader ?? 'user',
|
|
108
|
+
options.exports ?? null,
|
|
109
|
+
options.value ?? 'authored',
|
|
110
|
+
check,
|
|
111
|
+
node,
|
|
112
|
+
]);
|
|
113
|
+
let result = lowered.get(key);
|
|
114
|
+
if (!result) {
|
|
115
|
+
result = loadAuthored(file, options, lang).then(authored => {
|
|
116
|
+
const provider = options.provider ?? packageOf(file);
|
|
117
|
+
const out = lowerDoc(
|
|
118
|
+
{
|
|
119
|
+
id:
|
|
120
|
+
options.id ?? `${provider}:${options.root}:${path.basename(file)}`,
|
|
121
|
+
root: options.root,
|
|
122
|
+
provider,
|
|
123
|
+
source: packageSource(file),
|
|
124
|
+
lang,
|
|
125
|
+
file: authored,
|
|
126
|
+
...(options.label ? {label: options.label} : {}),
|
|
127
|
+
...(options.value === 'parsed' ? {useParsed: true} : {}),
|
|
128
|
+
},
|
|
129
|
+
{check, node},
|
|
130
|
+
);
|
|
131
|
+
if (out.node) deepFreeze(out.node);
|
|
132
|
+
if (out.loadFailed || 'overlayError' in authored) {
|
|
133
|
+
lowered.delete(key);
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
});
|
|
137
|
+
lowered.set(key, result);
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* What a reader gets for one descriptor: the view it has always read.
|
|
144
|
+
*
|
|
145
|
+
* `strict` readers check the doc and throw what they always threw: the import
|
|
146
|
+
* error, the parser's error (for an empty export too), then a failed
|
|
147
|
+
* translation. Other readers skip the check, throw only what importing or
|
|
148
|
+
* translating threw, and read an empty export as the empty value itself.
|
|
149
|
+
* The view is shared, as the module's own export always was.
|
|
150
|
+
* @param {string} file absolute path
|
|
151
|
+
* @param {ReadOptions & {strict?: boolean}} options
|
|
152
|
+
* @returns {Promise<any>}
|
|
153
|
+
*/
|
|
154
|
+
export async function readDocView(file, options) {
|
|
155
|
+
const strict = options.strict === true;
|
|
156
|
+
const lang = options.lang ?? null;
|
|
157
|
+
// Lowered on every read, as the readers always loaded: Node caches the
|
|
158
|
+
// module, and the translation and the check run fresh each time, so a
|
|
159
|
+
// reader never shares a translated or parsed result with the next one.
|
|
160
|
+
const provider = options.provider ?? packageOf(file);
|
|
161
|
+
const result = lowerDoc(
|
|
162
|
+
{
|
|
163
|
+
id: options.id ?? `${provider}:${options.root}:${path.basename(file)}`,
|
|
164
|
+
root: options.root,
|
|
165
|
+
provider,
|
|
166
|
+
source: packageSource(file),
|
|
167
|
+
lang,
|
|
168
|
+
file: await loadAuthored(file, options, lang),
|
|
169
|
+
...(options.label ? {label: options.label} : {}),
|
|
170
|
+
...(options.value === 'parsed' ? {useParsed: true} : {}),
|
|
171
|
+
},
|
|
172
|
+
{check: strict || options.check === true, node: false},
|
|
173
|
+
);
|
|
174
|
+
if (result.loadFailed) throw result.loadFailure;
|
|
175
|
+
if (result.missing) {
|
|
176
|
+
if (strict)
|
|
177
|
+
parserFor(options.root)(result.missingValue, options.label ?? file);
|
|
178
|
+
return result.missingValue;
|
|
179
|
+
}
|
|
180
|
+
if (strict && result.failed) throw result.failure;
|
|
181
|
+
if (result.overlayFailed) throw result.overlayFailure;
|
|
182
|
+
return result.view;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Load one file as its root reads it: the doc its module exports and, for a
|
|
187
|
+
* component or hook, the translation it exports for `lang`.
|
|
188
|
+
* @param {string} file
|
|
189
|
+
* @param {ReadOptions} options
|
|
190
|
+
* @param {string | null} lang
|
|
191
|
+
* @returns {Promise<import('./compile.mjs').AuthoredFile>}
|
|
192
|
+
*/
|
|
193
|
+
async function loadAuthored(file, options, lang) {
|
|
194
|
+
const name = path.basename(file);
|
|
195
|
+
if (options.root === 'themes') {
|
|
196
|
+
if (!options.readStatic) {
|
|
197
|
+
throw new Error(
|
|
198
|
+
'A theme descriptor is read statically; pass readStatic.',
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
return {file: name, doc: options.readStatic()};
|
|
203
|
+
} catch (error) {
|
|
204
|
+
return {file: name, error};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
let mod;
|
|
208
|
+
try {
|
|
209
|
+
mod = await LOADERS[options.loader ?? 'user'](file);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
return {file: name, error};
|
|
212
|
+
}
|
|
213
|
+
// `a ?? b ?? c`, exactly: the first value that is not null or undefined,
|
|
214
|
+
// else the last one.
|
|
215
|
+
const [first, ...rest] = options.exports ?? DOC_EXPORTS[options.root];
|
|
216
|
+
let doc = mod?.[first];
|
|
217
|
+
for (const key of rest) doc = doc ?? mod?.[key];
|
|
218
|
+
const overlay =
|
|
219
|
+
lang && (options.root === 'components' || options.root === 'hooks')
|
|
220
|
+
? translationFor(mod, lang)
|
|
221
|
+
: null;
|
|
222
|
+
return overlay ? {file: name, doc, overlay} : {file: name, doc};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Freeze a value and everything in it.
|
|
227
|
+
* @template T
|
|
228
|
+
* @param {T} value
|
|
229
|
+
* @returns {T}
|
|
230
|
+
*/
|
|
231
|
+
export function deepFreeze(value) {
|
|
232
|
+
if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
233
|
+
Object.freeze(value);
|
|
234
|
+
for (const child of Object.values(value)) deepFreeze(child);
|
|
235
|
+
}
|
|
236
|
+
return value;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ── Doc topics ─────────────────────────────────────────────────────────────
|
|
240
|
+
|
|
241
|
+
/** The localized overlays a docs read can apply. */
|
|
242
|
+
export const OVERLAY_LANGUAGES = ['zh', 'dense'];
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Where the `lang` overlay of a doc file lives: `{topic}.doc.{lang}.mjs`.
|
|
246
|
+
* @param {string} docPath
|
|
247
|
+
* @param {string} lang
|
|
248
|
+
* @returns {string}
|
|
249
|
+
*/
|
|
250
|
+
export function overlayPath(docPath, lang) {
|
|
251
|
+
return path.join(
|
|
252
|
+
path.dirname(docPath),
|
|
253
|
+
`${path.basename(docPath, '.doc.mjs')}.doc.${lang}.mjs`,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* The overlay languages a topic ships for its own file or any extension.
|
|
259
|
+
* @param {import('../discovery/docs-discovery.mjs').DocsTopicEntry} entry
|
|
260
|
+
* @returns {string[]}
|
|
261
|
+
*/
|
|
262
|
+
export function overlayLanguages(entry) {
|
|
263
|
+
const files = [entry.path, ...entry.extensions.map(ext => ext.path)];
|
|
264
|
+
return OVERLAY_LANGUAGES.filter(lang =>
|
|
265
|
+
files.some(file => fs.existsSync(overlayPath(file, lang))),
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Load one topic file and the overlay for `lang`. A failure is recorded on the
|
|
271
|
+
* result, not thrown, so the compiler reports it in reading order.
|
|
272
|
+
* @param {string} docPath
|
|
273
|
+
* @param {string | null} lang
|
|
274
|
+
* @returns {Promise<import('./compile.mjs').AuthoredFile>}
|
|
275
|
+
*/
|
|
276
|
+
export async function loadTopicFile(docPath, lang) {
|
|
277
|
+
const file = path.basename(docPath);
|
|
278
|
+
let doc;
|
|
279
|
+
try {
|
|
280
|
+
const mod = await importNativeModule(docPath);
|
|
281
|
+
doc = parseReadableDoc(mod.docs ?? mod.default, file);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
return {file, error};
|
|
284
|
+
}
|
|
285
|
+
if (!lang) return {file, doc};
|
|
286
|
+
const translationPath = overlayPath(docPath, lang);
|
|
287
|
+
if (!fs.existsSync(translationPath)) return {file, doc};
|
|
288
|
+
try {
|
|
289
|
+
const translationMod = await importNativeModule(translationPath);
|
|
290
|
+
return {
|
|
291
|
+
file,
|
|
292
|
+
doc,
|
|
293
|
+
overlay: translationMod.docsZh || translationMod.docsDense || null,
|
|
294
|
+
};
|
|
295
|
+
} catch (overlayError) {
|
|
296
|
+
return {file, doc, overlayError};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Everything the compiler needs for one topic, read from disk.
|
|
302
|
+
* @param {import('../discovery/docs-discovery.mjs').DocsTopicEntry} entry
|
|
303
|
+
* @param {string | null} lang
|
|
304
|
+
* @returns {Promise<import('./compile.mjs').ReferenceTopicInput>}
|
|
305
|
+
*/
|
|
306
|
+
export async function loadTopicInput(entry, lang) {
|
|
307
|
+
const extensions = [];
|
|
308
|
+
for (const extension of entry.extensions) {
|
|
309
|
+
extensions.push({
|
|
310
|
+
...(await loadTopicFile(extension.path, lang)),
|
|
311
|
+
provider: extension.package,
|
|
312
|
+
providerId: extension.providerId ?? extension.package,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
id: entry.name,
|
|
317
|
+
provider: entry.package,
|
|
318
|
+
providerId: entry.providerId ?? entry.package,
|
|
319
|
+
replaces: entry.replaces ?? null,
|
|
320
|
+
lang,
|
|
321
|
+
base: await loadTopicFile(entry.path, lang),
|
|
322
|
+
extensions,
|
|
323
|
+
...(entry.tree === true ? {tree: true} : {}),
|
|
324
|
+
};
|
|
325
|
+
}
|