@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,558 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Doc compiler — authored docs in, compiled nodes out.
|
|
5
|
+
*
|
|
6
|
+
* @input A {@link ReferenceTopicInput}: one topic's own file and the files of
|
|
7
|
+
* the extensions merged onto it, each already through the authored-doc parser
|
|
8
|
+
* and each carrying the overlay for the language being read. Discovery
|
|
9
|
+
* assembles it, and records a file that failed to load instead of throwing,
|
|
10
|
+
* so problems surface here in the order a reader meets them.
|
|
11
|
+
* @output A compiled reference node: plain JSON carrying a schema version, the
|
|
12
|
+
* topic after overlay, extension merge and key stamping, and the authored
|
|
13
|
+
* title of every section. Linking then resolves each token reference against
|
|
14
|
+
* its target. Nothing in a node is a function, a symbol, or a file path: an
|
|
15
|
+
* authored value JSON cannot hold (a function, a Date, `undefined`) takes its
|
|
16
|
+
* JSON form, the one `--json` output has always shown.
|
|
17
|
+
* @position The one step between authored docs and every docs reader. The docs
|
|
18
|
+
* API, doctor and search read compiled nodes, and ./lenses.mjs turns them into
|
|
19
|
+
* response shapes. Every other doc kind (components, hooks, templates, themes,
|
|
20
|
+
* and the CLI's self-docs) lowers through {@link lowerDoc}, which ./read.mjs
|
|
21
|
+
* feeds. Internal to the CLI: the public way in is the docs API.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {parseTemplate} from '../../authoring/doctypes/template/parse.mjs';
|
|
25
|
+
import {parseTheme} from '../../authoring/doctypes/theme/parse.mjs';
|
|
26
|
+
import {mergeTopic, problemsInTopic} from '../discovery/docs-discovery.mjs';
|
|
27
|
+
import {
|
|
28
|
+
sectionKey,
|
|
29
|
+
sectionKeyErrors,
|
|
30
|
+
sourceTitle,
|
|
31
|
+
withSectionKeys,
|
|
32
|
+
withSourceTitle,
|
|
33
|
+
} from '../discovery/docs-section-key.mjs';
|
|
34
|
+
import {diagnostic as rawDiagnostic} from './diagnostics.mjs';
|
|
35
|
+
import {scrubPaths} from './source.mjs';
|
|
36
|
+
import {overlayAuthoredDoc} from './overlays.mjs';
|
|
37
|
+
import {parseReadableDoc} from './parse-readable.mjs';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A compiler diagnostic whose message names files by package, never by their
|
|
41
|
+
* location on this machine.
|
|
42
|
+
* @param {string} code
|
|
43
|
+
* @param {Parameters<typeof rawDiagnostic>[1]} at
|
|
44
|
+
*/
|
|
45
|
+
function diagnostic(code, at) {
|
|
46
|
+
return rawDiagnostic(code, {
|
|
47
|
+
...at,
|
|
48
|
+
message: scrubPaths(at.message) || '(the error had no message)',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Bumped whenever the shape of a compiled node changes. */
|
|
53
|
+
export const COMPILED_DOC_SCHEMA_VERSION = 1;
|
|
54
|
+
|
|
55
|
+
/** Every kind a compiled node has: one per authored doc kind a root reads. */
|
|
56
|
+
export const COMPILED_DOC_KINDS = /** @type {const} */ ([
|
|
57
|
+
'component',
|
|
58
|
+
'function',
|
|
59
|
+
'reference',
|
|
60
|
+
'page',
|
|
61
|
+
'block',
|
|
62
|
+
'schema',
|
|
63
|
+
'command',
|
|
64
|
+
'enum',
|
|
65
|
+
'theme',
|
|
66
|
+
'namespace',
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The roots that read docs, and the kinds each may hold. A doc without a
|
|
71
|
+
* stamped `type` (the legacy form) takes its root's first kind.
|
|
72
|
+
* @type {Readonly<Record<string, readonly string[]>>}
|
|
73
|
+
*/
|
|
74
|
+
export const ROOT_KINDS = Object.freeze({
|
|
75
|
+
components: ['component'],
|
|
76
|
+
hooks: ['function'],
|
|
77
|
+
templates: ['page', 'block'],
|
|
78
|
+
themes: ['theme'],
|
|
79
|
+
'self-docs': ['command', 'function', 'schema', 'enum'],
|
|
80
|
+
tree: ['namespace', 'generic'],
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* One authored file, as discovery loaded it.
|
|
85
|
+
* @typedef {object} AuthoredFile
|
|
86
|
+
* @property {string} file the file's name, for messages only
|
|
87
|
+
* @property {any} [doc] the parsed doc, when it loaded
|
|
88
|
+
* @property {unknown} [error] why it did not load or parse
|
|
89
|
+
* @property {any} [overlay] the language overlay's export, when one applies
|
|
90
|
+
* @property {unknown} [overlayError] why the overlay did not load
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @typedef {object} ReferenceTopicInput
|
|
95
|
+
* @property {string} id the topic's name in the catalog
|
|
96
|
+
* @property {string} provider the package that owns the topic
|
|
97
|
+
* @property {string | null} replaces the topic it took the place of
|
|
98
|
+
* @property {string | null} lang the overlay language, or null for authored text
|
|
99
|
+
* @property {string} [providerId] the owner's provider id; the package name
|
|
100
|
+
* when absent. The base file's sections resolve their links against it.
|
|
101
|
+
* @property {AuthoredFile} base
|
|
102
|
+
* @property {Array<AuthoredFile & {provider: string, providerId?: string}>} extensions
|
|
103
|
+
* in merge order; each extension's sections resolve their links against its
|
|
104
|
+
* own provider id
|
|
105
|
+
* @property {boolean} [tree] a guide the docs tree places: its `placement` is
|
|
106
|
+
* read by the tree, so the topic reader accepts it
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* A token reference after linking: the target section's content, or why it
|
|
111
|
+
* has none.
|
|
112
|
+
* @typedef {{status: 'resolved', topic: string, section: string, previewType?: string, content: any[]}
|
|
113
|
+
* | {status: 'unknown-topic'}
|
|
114
|
+
* | {status: 'unknown-section'}} TokenRefResolution
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @typedef {object} CompiledReferenceNode
|
|
119
|
+
* @property {number} schemaVersion
|
|
120
|
+
* @property {'reference'} kind
|
|
121
|
+
* @property {'lowered' | 'linked'} stage `linked` once every token reference
|
|
122
|
+
* carries its resolution; a lowered node carries none
|
|
123
|
+
* @property {string} id the topic's name in the catalog
|
|
124
|
+
* @property {string | null} lang
|
|
125
|
+
* @property {{provider: string, replaces: string | null, extensions: string[]}} provenance
|
|
126
|
+
* @property {Record<string, string>} sourceTitles section key -> authored title
|
|
127
|
+
* @property {Record<string, string>} sectionProviders section key -> the
|
|
128
|
+
* provider id that wrote the section: a topic merges sections from its base
|
|
129
|
+
* and its extensions, and each section's links resolve against its own
|
|
130
|
+
* provider (spec:AST-047 FR9)
|
|
131
|
+
* @property {any} doc the topic: authored fields in authored order, every
|
|
132
|
+
* section keyed; a linked node's token references carry `resolved`
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
/** Which provider wrote a section, until lowering records it by key. */
|
|
136
|
+
const SECTION_PROVIDER = Symbol('astryx.docs.sectionProvider');
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Mark each section of one authored file with the provider that wrote it. The
|
|
140
|
+
* overlay, the merge, and the key stamp copy the mark with the section.
|
|
141
|
+
* @param {any} doc
|
|
142
|
+
* @param {string} provider
|
|
143
|
+
* @returns {any}
|
|
144
|
+
*/
|
|
145
|
+
function markProvider(doc, provider) {
|
|
146
|
+
return {
|
|
147
|
+
...doc,
|
|
148
|
+
sections: doc.sections.map((/** @type {any} */ section) =>
|
|
149
|
+
withSourceTitle({...section, [SECTION_PROVIDER]: provider}, sourceTitle(section)),
|
|
150
|
+
),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Lower one topic: overlay each file, merge the extensions in order, and stamp
|
|
156
|
+
* every section with its key.
|
|
157
|
+
* @param {ReferenceTopicInput} input
|
|
158
|
+
* @returns {CompiledReferenceNode}
|
|
159
|
+
*/
|
|
160
|
+
export function lowerReferenceTopic(input) {
|
|
161
|
+
let doc = markProvider(
|
|
162
|
+
readAuthoredFile(input.base, {placement: input.tree === true}),
|
|
163
|
+
input.providerId ?? input.provider,
|
|
164
|
+
);
|
|
165
|
+
for (const extension of input.extensions) {
|
|
166
|
+
doc = mergeTopic(
|
|
167
|
+
doc,
|
|
168
|
+
markProvider(
|
|
169
|
+
readAuthoredFile(extension),
|
|
170
|
+
extension.providerId ?? extension.provider,
|
|
171
|
+
),
|
|
172
|
+
);
|
|
173
|
+
// Explicit authored IDs remain strict. Legacy title-derived collisions are
|
|
174
|
+
// assigned deterministic compatibility keys after every extension merges.
|
|
175
|
+
const problems = sectionKeyErrors(doc.sections);
|
|
176
|
+
if (problems.length > 0) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`${extension.file}, extending ${input.id}, leaves duplicate authored section IDs: ${problems.join('; ')}`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Derived keys are stamped only now, so they never take part in merging.
|
|
183
|
+
const keyed = withSectionKeys(doc);
|
|
184
|
+
/** @type {Record<string, string>} */
|
|
185
|
+
const sourceTitles = {};
|
|
186
|
+
/** @type {Record<string, string>} */
|
|
187
|
+
const sectionProviders = {};
|
|
188
|
+
for (const section of keyed.sections) {
|
|
189
|
+
sourceTitles[section.id] = sourceTitle(section);
|
|
190
|
+
sectionProviders[section.id] =
|
|
191
|
+
section[SECTION_PROVIDER] ?? input.providerId ?? input.provider;
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
schemaVersion: COMPILED_DOC_SCHEMA_VERSION,
|
|
195
|
+
kind: 'reference',
|
|
196
|
+
stage: 'lowered',
|
|
197
|
+
id: input.id,
|
|
198
|
+
lang: input.lang,
|
|
199
|
+
provenance: {
|
|
200
|
+
provider: input.provider,
|
|
201
|
+
replaces: input.replaces,
|
|
202
|
+
extensions: input.extensions.map(extension => extension.provider),
|
|
203
|
+
},
|
|
204
|
+
sourceTitles,
|
|
205
|
+
sectionProviders,
|
|
206
|
+
// The authored title and provider travel in sourceTitles and
|
|
207
|
+
// sectionProviders; JSON drops the symbols.
|
|
208
|
+
doc: asJson(keyed, input.id),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Link every section of a lowered node.
|
|
214
|
+
* @param {CompiledReferenceNode} node
|
|
215
|
+
* @param {(topic: string) => Promise<CompiledReferenceNode | null>} lowerTarget
|
|
216
|
+
* the lowered node a reference names, or null when no topic has that name
|
|
217
|
+
* @returns {Promise<CompiledReferenceNode>}
|
|
218
|
+
*/
|
|
219
|
+
export async function linkReferenceTopic(node, lowerTarget) {
|
|
220
|
+
const sections = [];
|
|
221
|
+
for (const section of node.doc.sections) {
|
|
222
|
+
sections.push(await linkReferenceSection(section, lowerTarget));
|
|
223
|
+
}
|
|
224
|
+
return {...node, stage: 'linked', doc: {...node.doc, sections}};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Resolve the token references in one section. A section with none comes back
|
|
229
|
+
* as it went in.
|
|
230
|
+
* @template {{content: any[]}} S
|
|
231
|
+
* @param {S} section
|
|
232
|
+
* @param {(topic: string) => Promise<CompiledReferenceNode | null>} lowerTarget
|
|
233
|
+
* @returns {Promise<S>}
|
|
234
|
+
*/
|
|
235
|
+
export async function linkReferenceSection(section, lowerTarget) {
|
|
236
|
+
if (!section.content.some(block => block?.type === 'token-ref')) {
|
|
237
|
+
return section;
|
|
238
|
+
}
|
|
239
|
+
const content = [];
|
|
240
|
+
for (const block of section.content) {
|
|
241
|
+
content.push(
|
|
242
|
+
block?.type === 'token-ref'
|
|
243
|
+
? {...block, resolved: await resolveTokenRef(block, lowerTarget)}
|
|
244
|
+
: block,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
return {...section, content};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* The section a token reference names — by key, or by authored title in any
|
|
252
|
+
* letter case — in the target topic lowered for the same language.
|
|
253
|
+
* @param {any} block
|
|
254
|
+
* @param {(topic: string) => Promise<CompiledReferenceNode | null>} lowerTarget
|
|
255
|
+
* @returns {Promise<TokenRefResolution>}
|
|
256
|
+
*/
|
|
257
|
+
async function resolveTokenRef(block, lowerTarget) {
|
|
258
|
+
const target = await lowerTarget(block.topic);
|
|
259
|
+
if (!target) return {status: 'unknown-topic'};
|
|
260
|
+
const wanted = block.section.toLowerCase();
|
|
261
|
+
const found = target.doc.sections.find(
|
|
262
|
+
(/** @type {any} */ section) =>
|
|
263
|
+
sectionKey(section) === block.section ||
|
|
264
|
+
(target.sourceTitles[section.id] ?? section.title).toLowerCase() ===
|
|
265
|
+
wanted,
|
|
266
|
+
);
|
|
267
|
+
if (!found) return {status: 'unknown-section'};
|
|
268
|
+
return {
|
|
269
|
+
status: 'resolved',
|
|
270
|
+
topic: target.id,
|
|
271
|
+
section: found.id,
|
|
272
|
+
...(found.previewType ? {previewType: found.previewType} : {}),
|
|
273
|
+
content: found.content,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* A value as JSON carries it: functions, symbols and `undefined` dropped,
|
|
279
|
+
* Dates as ISO strings.
|
|
280
|
+
* @param {any} value
|
|
281
|
+
* @param {string} topic for the message when the value cannot be serialized
|
|
282
|
+
* @returns {any}
|
|
283
|
+
*/
|
|
284
|
+
function asJson(value, topic) {
|
|
285
|
+
try {
|
|
286
|
+
return JSON.parse(JSON.stringify(value));
|
|
287
|
+
} catch (err) {
|
|
288
|
+
throw Object.assign(
|
|
289
|
+
new Error(
|
|
290
|
+
`${topic} cannot be compiled: ${err instanceof Error ? err.message : String(err)}`,
|
|
291
|
+
{cause: err},
|
|
292
|
+
),
|
|
293
|
+
{compilerCode: 'not_json'},
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* One file's doc, checked and in the reading language. Problems throw in the
|
|
300
|
+
* order a reader meets them: the file itself, then its overlay.
|
|
301
|
+
* @param {AuthoredFile} file
|
|
302
|
+
* @returns {any}
|
|
303
|
+
*/
|
|
304
|
+
function readAuthoredFile(file, {placement = false} = {}) {
|
|
305
|
+
if ('error' in file) throw file.error;
|
|
306
|
+
const parsed = file.doc;
|
|
307
|
+
if (!('sections' in parsed)) {
|
|
308
|
+
throw new Error(`${file.file} is not a reference document.`);
|
|
309
|
+
}
|
|
310
|
+
const problems = problemsInTopic(parsed, {placement});
|
|
311
|
+
if (problems.length > 0) {
|
|
312
|
+
throw new Error(`${file.file} is invalid: ${problems.join('; ')}`);
|
|
313
|
+
}
|
|
314
|
+
if ('overlayError' in file) throw file.overlayError;
|
|
315
|
+
return file.overlay ? applyOverlay(parsed, file.overlay) : parsed;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Lay a translation over a doc. Overlays are keyed to a base section by title
|
|
320
|
+
* (`section`), not by array position: position keying grafted each overlay
|
|
321
|
+
* title onto whatever base section shared its index, so an overlay that omitted
|
|
322
|
+
* or reordered a section corrupted every section after it (#2182). An overlay
|
|
323
|
+
* may cover any subset of sections, in any order; the rest keep their base
|
|
324
|
+
* content.
|
|
325
|
+
* @param {any} docs
|
|
326
|
+
* @param {any} translation
|
|
327
|
+
* @returns {any}
|
|
328
|
+
*/
|
|
329
|
+
function applyOverlay(docs, translation) {
|
|
330
|
+
/** @type {Map<string, any>} */
|
|
331
|
+
const bySection = new Map();
|
|
332
|
+
for (const ts of translation.sections ?? []) {
|
|
333
|
+
if (ts?.section != null) bySection.set(ts.section, ts);
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
...docs,
|
|
337
|
+
description: translation.description || docs.description,
|
|
338
|
+
sections: docs.sections.map((/** @type {any} */ section) => {
|
|
339
|
+
const ts = bySection.get(section.title);
|
|
340
|
+
if (!ts) return section;
|
|
341
|
+
const localized = {
|
|
342
|
+
...section,
|
|
343
|
+
title: ts.title || section.title,
|
|
344
|
+
content: section.content.map(
|
|
345
|
+
(/** @type {any} */ block, /** @type {number} */ bi) => {
|
|
346
|
+
const tb = ts.content?.[bi];
|
|
347
|
+
if (!tb) return block;
|
|
348
|
+
if (tb.type === 'prose' && block.type === 'prose')
|
|
349
|
+
return {...block, text: tb.text};
|
|
350
|
+
if (tb.type === 'list' && block.type === 'list')
|
|
351
|
+
return {...block, items: tb.items};
|
|
352
|
+
return block;
|
|
353
|
+
},
|
|
354
|
+
),
|
|
355
|
+
};
|
|
356
|
+
return withSourceTitle(localized, section.title);
|
|
357
|
+
}),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @typedef {import('./diagnostics.mjs').CompilerDiagnostic} CompilerDiagnostic
|
|
363
|
+
*/
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* One authored doc of any kind but a reference topic, as its root loaded it.
|
|
367
|
+
* @typedef {object} DocFileInput
|
|
368
|
+
* @property {string} id the input's id: provider, root, and name
|
|
369
|
+
* @property {keyof typeof ROOT_KINDS} root
|
|
370
|
+
* @property {string} provider the package that contributes it
|
|
371
|
+
* @property {string} source `<package>/<path>` of the file
|
|
372
|
+
* @property {string | null} lang the overlay language, or null
|
|
373
|
+
* @property {AuthoredFile} file `doc` is the authored export, not a parse
|
|
374
|
+
* result; `overlay` is the translation the module exports for `lang`
|
|
375
|
+
* @property {string} [label] how a parse error names the file (default: its
|
|
376
|
+
* file name)
|
|
377
|
+
* @property {boolean} [useParsed] carry the parser's result instead of the
|
|
378
|
+
* authored export, for a reader that has always read the checked value
|
|
379
|
+
*/
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* The parser that checks a root's docs. Templates and themes have their own;
|
|
383
|
+
* every other root dispatches on the stamped type.
|
|
384
|
+
* @param {string} root
|
|
385
|
+
* @returns {(input: unknown, label?: string) => any}
|
|
386
|
+
*/
|
|
387
|
+
export function parserFor(root) {
|
|
388
|
+
if (root === 'themes') return parseTheme;
|
|
389
|
+
if (root === 'templates') return parseTemplate;
|
|
390
|
+
return parseReadableDoc;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* A compiled node for any kind but a reference topic.
|
|
395
|
+
* @typedef {object} CompiledDocNode
|
|
396
|
+
* @property {number} schemaVersion
|
|
397
|
+
* @property {Exclude<typeof COMPILED_DOC_KINDS[number], 'reference'>} kind
|
|
398
|
+
* @property {'lowered'} stage
|
|
399
|
+
* @property {string} id
|
|
400
|
+
* @property {string | null} lang
|
|
401
|
+
* @property {{provider: string, source: string}} provenance
|
|
402
|
+
* @property {any} doc the authored doc, overlaid for `lang`, as JSON carries
|
|
403
|
+
* it: key order kept, `undefined` and functions dropped
|
|
404
|
+
*/
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* The result of lowering one doc.
|
|
408
|
+
*
|
|
409
|
+
* `view` is the doc as readers have always read it: the authored export (or,
|
|
410
|
+
* where a reader has always read it, the parser's result), with its
|
|
411
|
+
* translation laid over it, not copied and not converted. Readers print from
|
|
412
|
+
* the view, so nothing they print depends on JSON. `node` is the sealed,
|
|
413
|
+
* JSON-only form a whole-project compile collects.
|
|
414
|
+
*
|
|
415
|
+
* @typedef {object} LoweredDoc
|
|
416
|
+
* @property {any} [view] absent when the file could not be read
|
|
417
|
+
* @property {CompiledDocNode | null} node null when not asked for, or when a
|
|
418
|
+
* problem is fatal to the node
|
|
419
|
+
* @property {CompilerDiagnostic[]} diagnostics
|
|
420
|
+
* @property {boolean} [loadFailed] importing the file threw
|
|
421
|
+
* @property {unknown} [loadFailure] what importing the file threw (any value,
|
|
422
|
+
* `undefined` included)
|
|
423
|
+
* @property {boolean} [missing] the file exports no doc
|
|
424
|
+
* @property {null | undefined} [missingValue] the empty export, as the reader
|
|
425
|
+
* picked it
|
|
426
|
+
* @property {boolean} [failed] the kind's parser threw
|
|
427
|
+
* @property {unknown} [failure] what the kind's parser threw
|
|
428
|
+
* @property {boolean} [overlayFailed] laying the translation over threw
|
|
429
|
+
* @property {unknown} [overlayFailure] what laying the translation over threw
|
|
430
|
+
*/
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Lower one doc of any kind but a reference topic.
|
|
434
|
+
*
|
|
435
|
+
* With `check`, the doc is held to its kind's parser, and a failure is
|
|
436
|
+
* recorded, not fatal: readers that never checked docs keep reading it, and a
|
|
437
|
+
* checked reader turns it into the error it has always thrown. A doc stamped
|
|
438
|
+
* with a kind its root does not read keeps its root's kind and carries a
|
|
439
|
+
* `wrong_kind` diagnostic. With `node`, the view is also carried as JSON; a
|
|
440
|
+
* value JSON cannot hold withdraws the node, never the view.
|
|
441
|
+
*
|
|
442
|
+
* @param {DocFileInput} input
|
|
443
|
+
* @param {{check?: boolean, node?: boolean}} [options]
|
|
444
|
+
* @returns {LoweredDoc}
|
|
445
|
+
*/
|
|
446
|
+
export function lowerDoc(input, {check = true, node: wantNode = true} = {}) {
|
|
447
|
+
const {file} = input;
|
|
448
|
+
const at = {provider: input.provider, source: input.source};
|
|
449
|
+
/** @type {CompilerDiagnostic[]} */
|
|
450
|
+
const diagnostics = [];
|
|
451
|
+
if ('error' in file) {
|
|
452
|
+
diagnostics.push(
|
|
453
|
+
diagnostic('load_failed', {
|
|
454
|
+
...at,
|
|
455
|
+
message: `${file.file} could not be loaded: ${messageOf(file.error)}`,
|
|
456
|
+
}),
|
|
457
|
+
);
|
|
458
|
+
return {node: null, diagnostics, loadFailed: true, loadFailure: file.error};
|
|
459
|
+
}
|
|
460
|
+
if (file.doc == null) {
|
|
461
|
+
diagnostics.push(
|
|
462
|
+
diagnostic('missing_export', {
|
|
463
|
+
...at,
|
|
464
|
+
message: `${file.file} exports no doc.`,
|
|
465
|
+
}),
|
|
466
|
+
);
|
|
467
|
+
return {node: null, diagnostics, missing: true, missingValue: file.doc};
|
|
468
|
+
}
|
|
469
|
+
const allowed = ROOT_KINDS[input.root];
|
|
470
|
+
if (!allowed) throw new Error(`No doc root is named "${input.root}".`);
|
|
471
|
+
const stamped =
|
|
472
|
+
typeof file.doc === 'object' && 'type' in file.doc
|
|
473
|
+
? file.doc.type
|
|
474
|
+
: undefined;
|
|
475
|
+
const kindFits = stamped === undefined || allowed.includes(stamped);
|
|
476
|
+
if (!kindFits) {
|
|
477
|
+
diagnostics.push(
|
|
478
|
+
diagnostic('wrong_kind', {
|
|
479
|
+
...at,
|
|
480
|
+
message: `${file.file} is stamped type ${JSON.stringify(stamped)}, which the ${input.root} root does not read (it reads ${allowed.join(', ')}).`,
|
|
481
|
+
}),
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
/** @type {LoweredDoc} */
|
|
485
|
+
const result = {node: null, diagnostics};
|
|
486
|
+
let view = file.doc;
|
|
487
|
+
// A theme descriptor is read statically; its parse result is the doc.
|
|
488
|
+
if (check || input.root === 'themes') {
|
|
489
|
+
try {
|
|
490
|
+
const parsed = parserFor(input.root)(file.doc, input.label ?? file.file);
|
|
491
|
+
if (input.useParsed || input.root === 'themes') view = parsed;
|
|
492
|
+
} catch (error) {
|
|
493
|
+
result.failed = true;
|
|
494
|
+
result.failure = error;
|
|
495
|
+
diagnostics.push(
|
|
496
|
+
diagnostic('invalid_doc', {...at, message: messageOf(error)}),
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if ('overlayError' in file) {
|
|
501
|
+
result.overlayFailed = true;
|
|
502
|
+
result.overlayFailure = file.overlayError;
|
|
503
|
+
} else if (file.overlay) {
|
|
504
|
+
try {
|
|
505
|
+
view = overlayAuthoredDoc(view, file.overlay);
|
|
506
|
+
} catch (error) {
|
|
507
|
+
result.overlayFailed = true;
|
|
508
|
+
result.overlayFailure = error;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
if (result.overlayFailed) {
|
|
512
|
+
diagnostics.push(
|
|
513
|
+
diagnostic('overlay_failed', {
|
|
514
|
+
...at,
|
|
515
|
+
message: `${file.file}'s translation could not be applied: ${messageOf(result.overlayFailure)}`,
|
|
516
|
+
}),
|
|
517
|
+
);
|
|
518
|
+
return result;
|
|
519
|
+
}
|
|
520
|
+
result.view = view;
|
|
521
|
+
if (!wantNode) return result;
|
|
522
|
+
let json;
|
|
523
|
+
try {
|
|
524
|
+
const text = JSON.stringify(view);
|
|
525
|
+
if (text === undefined) throw new TypeError('the doc is not a JSON value');
|
|
526
|
+
json = JSON.parse(text);
|
|
527
|
+
} catch (error) {
|
|
528
|
+
diagnostics.push(
|
|
529
|
+
diagnostic('not_json', {
|
|
530
|
+
...at,
|
|
531
|
+
message: `${file.file} cannot be compiled: ${messageOf(error)}`,
|
|
532
|
+
}),
|
|
533
|
+
);
|
|
534
|
+
return result;
|
|
535
|
+
}
|
|
536
|
+
result.node = {
|
|
537
|
+
schemaVersion: COMPILED_DOC_SCHEMA_VERSION,
|
|
538
|
+
kind: /** @type {CompiledDocNode['kind']} */ (
|
|
539
|
+
kindFits && stamped !== undefined ? stamped : allowed[0]
|
|
540
|
+
),
|
|
541
|
+
stage: 'lowered',
|
|
542
|
+
id: input.id,
|
|
543
|
+
lang: input.lang,
|
|
544
|
+
provenance: {provider: input.provider, source: input.source},
|
|
545
|
+
doc: json,
|
|
546
|
+
};
|
|
547
|
+
return result;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/** @param {unknown} error */
|
|
551
|
+
function messageOf(error) {
|
|
552
|
+
// Any value can be thrown; describing one must never throw in its place.
|
|
553
|
+
try {
|
|
554
|
+
return error instanceof Error ? String(error.message) : String(error);
|
|
555
|
+
} catch {
|
|
556
|
+
return Object.prototype.toString.call(error);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 {string} code
|
|
6
|
+
* @param {object} at
|
|
7
|
+
* @param {string | null} [at.provider]
|
|
8
|
+
* @param {string | null} [at.source]
|
|
9
|
+
* @param {string | null} [at.field]
|
|
10
|
+
* @param {string} at.message
|
|
11
|
+
* @returns {CompilerDiagnostic}
|
|
12
|
+
*/
|
|
13
|
+
export function diagnostic(code: string, { provider, source, field, message }: {
|
|
14
|
+
provider?: string | null | undefined;
|
|
15
|
+
source?: string | null | undefined;
|
|
16
|
+
field?: string | null | undefined;
|
|
17
|
+
message: string;
|
|
18
|
+
}): CompilerDiagnostic;
|
|
19
|
+
/**
|
|
20
|
+
* Diagnostics in one order, whatever order the phases found them in: by
|
|
21
|
+
* source, then phase, then code, field, and message.
|
|
22
|
+
* @param {CompilerDiagnostic[]} list
|
|
23
|
+
* @returns {CompilerDiagnostic[]} a new array
|
|
24
|
+
*/
|
|
25
|
+
export function sortDiagnostics(list: CompilerDiagnostic[]): CompilerDiagnostic[];
|
|
26
|
+
/**
|
|
27
|
+
* What is wrong with a value that claims to be a diagnostic, or null. A known
|
|
28
|
+
* code must carry its own phase, severity, scope, and remediation: a reader
|
|
29
|
+
* never reinterprets them.
|
|
30
|
+
* @param {unknown} value
|
|
31
|
+
* @returns {string | null}
|
|
32
|
+
*/
|
|
33
|
+
export function diagnosticProblem(value: unknown): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* A `<package>/<path>` that names no location on one machine: not absolute,
|
|
36
|
+
* no drive letter or URL scheme, no backslash, no `..` segment.
|
|
37
|
+
* @param {string} source
|
|
38
|
+
* @returns {boolean}
|
|
39
|
+
*/
|
|
40
|
+
export function isPortableSource(source: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* @file Compiler diagnostics — one shape for every problem the doc compiler
|
|
43
|
+
* finds.
|
|
44
|
+
*
|
|
45
|
+
* @input A diagnostic code, the package and file it concerns, and a message.
|
|
46
|
+
* @output A plain-JSON diagnostic: a stable code, the phase that found it,
|
|
47
|
+
* severity, provider, source, field, message, remediation, and the scope of
|
|
48
|
+
* what it invalidates. Lists sort into one deterministic order.
|
|
49
|
+
* @position Shared by every compiler phase: listing inputs, loading, parsing,
|
|
50
|
+
* overlaying, lowering, linking, serializing, and reading a bundle back. A
|
|
51
|
+
* code fixes its phase, severity, scope, and remediation, so no phase or
|
|
52
|
+
* reader can report the same problem two ways or downgrade it.
|
|
53
|
+
*/
|
|
54
|
+
/** Compiler phases, in the order a descriptor passes through them. */
|
|
55
|
+
export const DIAGNOSTIC_PHASES: readonly ["discover", "load", "parse", "overlay", "lower", "link", "serialize", "bundle"];
|
|
56
|
+
/**
|
|
57
|
+
* What a failure invalidates: the one node it concerns, or the whole
|
|
58
|
+
* compilation (a bundle that cannot be read at all).
|
|
59
|
+
* @typedef {'node' | 'compilation'} DiagnosticScope
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* @typedef {typeof DIAGNOSTIC_PHASES[number]} DiagnosticPhase
|
|
63
|
+
* @typedef {'error' | 'warning'} DiagnosticSeverity
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* @typedef {object} CompilerDiagnostic
|
|
67
|
+
* @property {string} code stable; one of {@link DIAGNOSTIC_CODES}
|
|
68
|
+
* @property {DiagnosticPhase} phase
|
|
69
|
+
* @property {DiagnosticSeverity} severity
|
|
70
|
+
* @property {DiagnosticScope} scope
|
|
71
|
+
* @property {string | null} provider the package the problem is in
|
|
72
|
+
* @property {string | null} source `<package>/<path>` of the file, never a
|
|
73
|
+
* machine path
|
|
74
|
+
* @property {string | null} field the field or reference at fault, when known
|
|
75
|
+
* @property {string} message
|
|
76
|
+
* @property {string} remediation what to do about it
|
|
77
|
+
*/
|
|
78
|
+
/**
|
|
79
|
+
* @typedef {object} DiagnosticRule
|
|
80
|
+
* @property {DiagnosticPhase} phase
|
|
81
|
+
* @property {DiagnosticSeverity} severity
|
|
82
|
+
* @property {DiagnosticScope} scope
|
|
83
|
+
* @property {string} remediation
|
|
84
|
+
*/
|
|
85
|
+
/** Every code the compiler emits, with the facts it fixes. */
|
|
86
|
+
export const DIAGNOSTIC_CODES: Readonly<Record<string, DiagnosticRule>>;
|
|
87
|
+
/**
|
|
88
|
+
* What a failure invalidates: the one node it concerns, or the whole
|
|
89
|
+
* compilation (a bundle that cannot be read at all).
|
|
90
|
+
*/
|
|
91
|
+
export type DiagnosticScope = "node" | "compilation";
|
|
92
|
+
export type DiagnosticPhase = (typeof DIAGNOSTIC_PHASES)[number];
|
|
93
|
+
export type DiagnosticSeverity = "error" | "warning";
|
|
94
|
+
export type CompilerDiagnostic = {
|
|
95
|
+
/**
|
|
96
|
+
* stable; one of {@link DIAGNOSTIC_CODES}
|
|
97
|
+
*/
|
|
98
|
+
code: string;
|
|
99
|
+
phase: DiagnosticPhase;
|
|
100
|
+
severity: DiagnosticSeverity;
|
|
101
|
+
scope: DiagnosticScope;
|
|
102
|
+
/**
|
|
103
|
+
* the package the problem is in
|
|
104
|
+
*/
|
|
105
|
+
provider: string | null;
|
|
106
|
+
/**
|
|
107
|
+
* `<package>/<path>` of the file, never a
|
|
108
|
+
* machine path
|
|
109
|
+
*/
|
|
110
|
+
source: string | null;
|
|
111
|
+
/**
|
|
112
|
+
* the field or reference at fault, when known
|
|
113
|
+
*/
|
|
114
|
+
field: string | null;
|
|
115
|
+
message: string;
|
|
116
|
+
/**
|
|
117
|
+
* what to do about it
|
|
118
|
+
*/
|
|
119
|
+
remediation: string;
|
|
120
|
+
};
|
|
121
|
+
export type DiagnosticRule = {
|
|
122
|
+
phase: DiagnosticPhase;
|
|
123
|
+
severity: DiagnosticSeverity;
|
|
124
|
+
scope: DiagnosticScope;
|
|
125
|
+
remediation: string;
|
|
126
|
+
};
|