@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
|
@@ -6,14 +6,28 @@
|
|
|
6
6
|
* invariant (the counts must always add up to the number of checks).
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {describe, it, expect, afterEach} from 'vitest';
|
|
9
|
+
import {describe, it, expect, afterEach, vi} from 'vitest';
|
|
10
10
|
import * as fs from 'node:fs';
|
|
11
11
|
import * as os from 'node:os';
|
|
12
12
|
import * as path from 'node:path';
|
|
13
13
|
import {fileURLToPath} from 'node:url';
|
|
14
|
+
import {DocsCatalog} from '../../foundation/discovery/docs-discovery.mjs';
|
|
15
|
+
import {
|
|
16
|
+
AUTHORING_ROOT,
|
|
17
|
+
AUTHORING_SELF_DOCS,
|
|
18
|
+
auditAuthoringSelfDocs,
|
|
19
|
+
} from '../../foundation/discovery/authoring-self-docs.mjs';
|
|
20
|
+
import {docs} from '../docs/docs.mjs';
|
|
21
|
+
import {auditCliSelfDocs} from '../../foundation/discovery/cli-self-docs.mjs';
|
|
14
22
|
import {
|
|
15
23
|
doctor,
|
|
24
|
+
checkAuthoringDocs,
|
|
25
|
+
checkCliDocs,
|
|
26
|
+
checkDocsTree,
|
|
27
|
+
checkDocsProgressiveDisclosure,
|
|
16
28
|
checkImplicitIntegrations,
|
|
29
|
+
checkProviderIdentity,
|
|
30
|
+
checkIntegrationIssues,
|
|
17
31
|
checkVersionAlignment,
|
|
18
32
|
checkPackageManager,
|
|
19
33
|
} from './doctor.mjs';
|
|
@@ -72,6 +86,27 @@ describe('doctor leaf', () => {
|
|
|
72
86
|
}, SLOW);
|
|
73
87
|
});
|
|
74
88
|
|
|
89
|
+
describe('integration issue check', () => {
|
|
90
|
+
it('surfaces cross-package replacement warnings', () => {
|
|
91
|
+
const check = checkIntegrationIssues({
|
|
92
|
+
integrationIssues: [
|
|
93
|
+
{
|
|
94
|
+
package: '@acme/later',
|
|
95
|
+
code: 'ambiguous_template_replacement',
|
|
96
|
+
severity: 'warning',
|
|
97
|
+
message: 'Later configured replacement wins.',
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
expect(check).toMatchObject({
|
|
103
|
+
id: 'integration-issues',
|
|
104
|
+
status: 'warn',
|
|
105
|
+
message: expect.stringContaining('Later configured replacement wins.'),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
75
110
|
describe('doctor leaf — degradation & error paths', () => {
|
|
76
111
|
it('does not crash on multiple config files; reports a config FAIL', async () => {
|
|
77
112
|
const dir = mkProject({
|
|
@@ -214,6 +249,77 @@ describe('checkPackageManager', () => {
|
|
|
214
249
|
});
|
|
215
250
|
});
|
|
216
251
|
|
|
252
|
+
describe('checkProviderIdentity', () => {
|
|
253
|
+
/** @param {object} [fields] */
|
|
254
|
+
const loaded = (fields = {}) => ({
|
|
255
|
+
name: '@acme/widgets',
|
|
256
|
+
providerId: '@acme/widgets',
|
|
257
|
+
version: '1.0.0',
|
|
258
|
+
__spec: '@acme/widgets',
|
|
259
|
+
__packageDir: '/abs/node_modules/@acme/widgets',
|
|
260
|
+
__manifestFile: '/abs/node_modules/@acme/widgets/astryx.integration.mjs',
|
|
261
|
+
...fields,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('skips when the project could not be read', () => {
|
|
265
|
+
expect(checkProviderIdentity({integrations: null}).status).toBe('info');
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('reports none when nothing is loaded', () => {
|
|
269
|
+
const c = checkProviderIdentity({integrations: []});
|
|
270
|
+
expect(c.status).toBe('info');
|
|
271
|
+
expect(c.message).toContain('None');
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('passes when each loaded integration has its own provider ID', () => {
|
|
275
|
+
const c = checkProviderIdentity({
|
|
276
|
+
integrations: [
|
|
277
|
+
loaded(),
|
|
278
|
+
loaded({
|
|
279
|
+
name: '@acme/charts',
|
|
280
|
+
providerId: '@acme/charts',
|
|
281
|
+
__spec: '@acme/charts',
|
|
282
|
+
}),
|
|
283
|
+
],
|
|
284
|
+
});
|
|
285
|
+
expect(c.status).toBe('pass');
|
|
286
|
+
expect(c.message).toContain('2 loaded integrations');
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('warns and names both packages when a later claimant is set aside', () => {
|
|
290
|
+
const message =
|
|
291
|
+
'@acme/renamed@2.0.0 and @acme/widgets@1.0.0 both claim provider ID ' +
|
|
292
|
+
'"@acme/widgets". @acme/widgets@1.0.0 loads first and is used; ' +
|
|
293
|
+
'@acme/renamed@2.0.0 contributes nothing until one package changes ' +
|
|
294
|
+
'its providerId.';
|
|
295
|
+
const c = checkProviderIdentity({
|
|
296
|
+
integrations: [
|
|
297
|
+
loaded(),
|
|
298
|
+
loaded({
|
|
299
|
+
name: '@acme/renamed',
|
|
300
|
+
version: '2.0.0',
|
|
301
|
+
__spec: '@acme/renamed',
|
|
302
|
+
__providerConflict: {
|
|
303
|
+
providerId: '@acme/widgets',
|
|
304
|
+
claimedBy: '@acme/widgets',
|
|
305
|
+
message,
|
|
306
|
+
},
|
|
307
|
+
}),
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
expect(c.status).toBe('warn');
|
|
311
|
+
expect(c.message).toBe(message);
|
|
312
|
+
expect(c.fix).toContain('providerId');
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it('is part of the report doctor returns', async () => {
|
|
316
|
+
const r = await doctor({cwd});
|
|
317
|
+
expect(r.data.checks.map(check => check.id)).toContain(
|
|
318
|
+
'provider-identity',
|
|
319
|
+
);
|
|
320
|
+
}, SLOW);
|
|
321
|
+
});
|
|
322
|
+
|
|
217
323
|
describe('checkImplicitIntegrations', () => {
|
|
218
324
|
/** @param {object} [fields] */
|
|
219
325
|
const autolinked = (fields = {}) => ({
|
|
@@ -248,16 +354,31 @@ describe('checkImplicitIntegrations', () => {
|
|
|
248
354
|
});
|
|
249
355
|
|
|
250
356
|
it('names the package, the field, and what it contributes', () => {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
357
|
+
// Roots count only when they exist, so this one gives them real folders.
|
|
358
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-implicit-'));
|
|
359
|
+
try {
|
|
360
|
+
const dir = name => {
|
|
361
|
+
fs.mkdirSync(path.join(root, name));
|
|
362
|
+
return path.join(root, name);
|
|
363
|
+
};
|
|
364
|
+
const c = checkImplicitIntegrations({
|
|
365
|
+
integrations: [
|
|
366
|
+
autolinked({
|
|
367
|
+
components: dir('components'),
|
|
368
|
+
templates: dir('templates'),
|
|
369
|
+
themes: dir('themes'),
|
|
370
|
+
}),
|
|
371
|
+
],
|
|
372
|
+
});
|
|
373
|
+
expect(c.message).toContain('@acme/widgets@1.0.0');
|
|
374
|
+
expect(c.message).toContain('from dependencies');
|
|
375
|
+
expect(c.message).toContain(
|
|
376
|
+
'contributing components, templates, themes',
|
|
377
|
+
);
|
|
378
|
+
expect(c.message).not.toContain('missing on disk');
|
|
379
|
+
} finally {
|
|
380
|
+
fs.rmSync(root, {recursive: true, force: true});
|
|
381
|
+
}
|
|
261
382
|
});
|
|
262
383
|
|
|
263
384
|
it('names the declared key too when an npm alias makes them differ', () => {
|
|
@@ -297,3 +418,603 @@ describe('checkImplicitIntegrations', () => {
|
|
|
297
418
|
expect(r.data.checks.map(c => c.id)).toContain('implicit-integrations');
|
|
298
419
|
}, SLOW);
|
|
299
420
|
});
|
|
421
|
+
|
|
422
|
+
describe('checkDocsProgressiveDisclosure', () => {
|
|
423
|
+
it('passes when every topic index and section fits one read', async () => {
|
|
424
|
+
const c = await checkDocsProgressiveDisclosure({
|
|
425
|
+
docsCatalog: DocsCatalog.fromBuiltins(),
|
|
426
|
+
docsCatalogIssues: [],
|
|
427
|
+
});
|
|
428
|
+
expect(c).toMatchObject({id: 'docs-progressive-disclosure', status: 'pass'});
|
|
429
|
+
expect(c.message).toMatch(/^\d+ topics: /);
|
|
430
|
+
}, SLOW);
|
|
431
|
+
|
|
432
|
+
it('warns on an invalid doc an integration contributed', async () => {
|
|
433
|
+
const c = await checkDocsProgressiveDisclosure({
|
|
434
|
+
docsCatalogIssues: [
|
|
435
|
+
{
|
|
436
|
+
package: '@acme/widgets',
|
|
437
|
+
code: 'invalid_doc',
|
|
438
|
+
severity: 'error',
|
|
439
|
+
message: 'bad.doc.mjs exports no doc',
|
|
440
|
+
},
|
|
441
|
+
],
|
|
442
|
+
});
|
|
443
|
+
expect(c.status).toBe('warn');
|
|
444
|
+
expect(c.message).toBe('@acme/widgets: bad.doc.mjs exports no doc');
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
it('warns when the docs catalog cannot be built', async () => {
|
|
448
|
+
const c = await checkDocsProgressiveDisclosure({docsCatalogError: 'boom'});
|
|
449
|
+
expect(c.status).toBe('warn');
|
|
450
|
+
expect(c.message).toContain('boom');
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('names a section over the budget and a topic that fails to load', async () => {
|
|
454
|
+
const dir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-doctor-docs-'));
|
|
455
|
+
tmpDirs.push(dir);
|
|
456
|
+
const huge = {
|
|
457
|
+
name: 'huge',
|
|
458
|
+
title: 'Huge',
|
|
459
|
+
description: 'Too big for one read.',
|
|
460
|
+
sections: [
|
|
461
|
+
{title: 'Small', content: [{type: 'prose', text: 'Fits.'}]},
|
|
462
|
+
{title: 'Everything', content: [{type: 'prose', text: 'x'.repeat(40 * 1024)}]},
|
|
463
|
+
],
|
|
464
|
+
};
|
|
465
|
+
fs.writeFileSync(
|
|
466
|
+
path.join(dir, 'huge.doc.mjs'),
|
|
467
|
+
`export const docs = ${JSON.stringify(huge)};\n`,
|
|
468
|
+
);
|
|
469
|
+
fs.writeFileSync(path.join(dir, 'broken.doc.mjs'), 'export const docs = {;\n');
|
|
470
|
+
const c = await checkDocsProgressiveDisclosure({
|
|
471
|
+
docsCatalog: DocsCatalog.fromBuiltins({
|
|
472
|
+
huge: path.join(dir, 'huge.doc.mjs'),
|
|
473
|
+
broken: path.join(dir, 'broken.doc.mjs'),
|
|
474
|
+
}),
|
|
475
|
+
docsCatalogIssues: [],
|
|
476
|
+
});
|
|
477
|
+
expect(c.status).toBe('warn');
|
|
478
|
+
expect(c.message).toMatch(/^2 problems: /);
|
|
479
|
+
expect(c.message).toContain('huge everything: 41 KB, over the 32 KB one read may return');
|
|
480
|
+
expect(c.message).toContain('broken: ');
|
|
481
|
+
expect(c.message).not.toContain('huge small');
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
describe('checkAuthoringDocs', () => {
|
|
486
|
+
it('passes when every authoring self-doc is reachable and fits one read', async () => {
|
|
487
|
+
const c = await checkAuthoringDocs();
|
|
488
|
+
expect(c).toMatchObject({id: 'authoring-docs', status: 'pass'});
|
|
489
|
+
expect(c.message).toContain('astryx docs authoring');
|
|
490
|
+
}, SLOW);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
describe('checkCliDocs', () => {
|
|
494
|
+
const CLI_DOCS_FIX =
|
|
495
|
+
'Set `namespace` on each CLI doc to the one that reads it: cli/commands for a command, cli/api for an API function or the output schema, error codes, and response types, and authoring for a file an author writes (and list it in AUTHORING_SELF_DOCS).';
|
|
496
|
+
|
|
497
|
+
/** A doc tree under the working directory, as the CLI root. */
|
|
498
|
+
function writeRoot(/** @type {Record<string, any>} */ docsByPath) {
|
|
499
|
+
const root = fs.mkdtempSync(path.join(process.cwd(), '.astryx-doctor-cli-docs-'));
|
|
500
|
+
tmpDirs.push(root);
|
|
501
|
+
for (const [rel, doc] of Object.entries(docsByPath)) {
|
|
502
|
+
const file = path.join(root, rel);
|
|
503
|
+
fs.mkdirSync(path.dirname(file), {recursive: true});
|
|
504
|
+
fs.writeFileSync(file, `export const doc = ${JSON.stringify(doc)};\n`);
|
|
505
|
+
}
|
|
506
|
+
return root;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
it(
|
|
510
|
+
'passes on this repo, counting where each CLI doc is read',
|
|
511
|
+
async () => {
|
|
512
|
+
const audit = await auditCliSelfDocs();
|
|
513
|
+
expect(await checkCliDocs()).toEqual({
|
|
514
|
+
id: 'cli-docs',
|
|
515
|
+
label: 'CLI docs',
|
|
516
|
+
status: 'pass',
|
|
517
|
+
message: `All ${audit.docs} CLI docs are readable: ${audit.tree} in the \`astryx docs cli\` tree and ${audit.authoring} in \`astryx docs authoring\`.`,
|
|
518
|
+
});
|
|
519
|
+
},
|
|
520
|
+
SLOW,
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
it(
|
|
524
|
+
'fails on a doc with no namespace and one no topic reads, and names the fix',
|
|
525
|
+
async () => {
|
|
526
|
+
const root = writeRoot({
|
|
527
|
+
'api/alpha/alpha.doc.mjs': {
|
|
528
|
+
type: 'function',
|
|
529
|
+
kind: 'api',
|
|
530
|
+
name: 'alpha',
|
|
531
|
+
displayName: 'alpha()',
|
|
532
|
+
summary: 'The alpha function.',
|
|
533
|
+
params: [],
|
|
534
|
+
returns: [{type: 'alpha', description: 'The alpha.'}],
|
|
535
|
+
},
|
|
536
|
+
'clients/cli/commands/beta.doc.mjs': {
|
|
537
|
+
type: 'command',
|
|
538
|
+
name: 'beta',
|
|
539
|
+
displayName: 'astryx beta',
|
|
540
|
+
namespace: 'cli',
|
|
541
|
+
summary: 'Do beta',
|
|
542
|
+
},
|
|
543
|
+
});
|
|
544
|
+
expect(
|
|
545
|
+
await checkCliDocs(undefined, {root, authoringSources: []}),
|
|
546
|
+
).toEqual({
|
|
547
|
+
id: 'cli-docs',
|
|
548
|
+
label: 'CLI docs',
|
|
549
|
+
status: 'fail',
|
|
550
|
+
message:
|
|
551
|
+
'2 problems: api/alpha/alpha.doc.mjs has no namespace, so no `astryx docs` topic reads it; clients/cli/commands/beta.doc.mjs has namespace "cli", which no `astryx docs` topic reads',
|
|
552
|
+
fix: CLI_DOCS_FIX,
|
|
553
|
+
});
|
|
554
|
+
},
|
|
555
|
+
SLOW,
|
|
556
|
+
);
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
describe('checkDocsTree', () => {
|
|
560
|
+
it(
|
|
561
|
+
'passes on this repo: every CLI doc in a cli group has one route',
|
|
562
|
+
async () => {
|
|
563
|
+
const {loadDocsTree} = await import(
|
|
564
|
+
'../../foundation/doc-compiler/tree.mjs'
|
|
565
|
+
);
|
|
566
|
+
const tree = await loadDocsTree({fresh: true});
|
|
567
|
+
const nodes = [...tree.nodes.values()];
|
|
568
|
+
const namespaces = nodes.filter(node => node.kind === 'namespace').length;
|
|
569
|
+
expect(await checkDocsTree()).toEqual({
|
|
570
|
+
id: 'docs-tree',
|
|
571
|
+
label: 'Docs tree',
|
|
572
|
+
status: 'pass',
|
|
573
|
+
message: expect.stringMatching(
|
|
574
|
+
/^The docs tree has \d+ docs in \d+ sections \(\d+ at the top\), each at one route\.$/,
|
|
575
|
+
),
|
|
576
|
+
});
|
|
577
|
+
},
|
|
578
|
+
SLOW,
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
it('fails on a tree with a broken placement, and names the fix', async () => {
|
|
582
|
+
const {buildDocsTree} = await import(
|
|
583
|
+
'../../foundation/doc-compiler/tree.mjs'
|
|
584
|
+
);
|
|
585
|
+
const tree = buildDocsTree({
|
|
586
|
+
namespaces: [
|
|
587
|
+
{
|
|
588
|
+
provider: '@acme/kit',
|
|
589
|
+
providerId: '@acme/kit',
|
|
590
|
+
source: '@acme/kit/tree/guides.doc.mjs',
|
|
591
|
+
doc: {
|
|
592
|
+
type: 'namespace',
|
|
593
|
+
name: 'guides',
|
|
594
|
+
title: 'Guides',
|
|
595
|
+
summary: 'Every guide.',
|
|
596
|
+
slots: {all: {title: 'All', accepts: {kinds: ['generic']}}},
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
],
|
|
600
|
+
docs: [
|
|
601
|
+
{
|
|
602
|
+
provider: '@acme/kit',
|
|
603
|
+
providerId: '@acme/kit',
|
|
604
|
+
source: '@acme/kit/tree/setup.doc.mjs',
|
|
605
|
+
kind: 'generic',
|
|
606
|
+
name: 'setup',
|
|
607
|
+
title: 'Setup',
|
|
608
|
+
summary: 'Set it up.',
|
|
609
|
+
group: null,
|
|
610
|
+
placement: {parent: 'namespace:guidez'},
|
|
611
|
+
},
|
|
612
|
+
],
|
|
613
|
+
});
|
|
614
|
+
const c = await checkDocsTree(undefined, {tree});
|
|
615
|
+
// New findings warn (0.6 compatibility): a broken tree is named, not fatal.
|
|
616
|
+
expect(c).toMatchObject({id: 'docs-tree', status: 'warn'});
|
|
617
|
+
expect(c.message).toContain(
|
|
618
|
+
'@acme/kit/tree/setup.doc.mjs: placement.parent "namespace:guidez" names no namespace; @acme/kit declares "guides".',
|
|
619
|
+
);
|
|
620
|
+
expect(c.fix).toMatch(/a placement names a namespace of its own package/);
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
describe('checkAuthoringDocs against the public authoring surface', () => {
|
|
625
|
+
const NAMESPACE = 'doctypes/namespace/namespace.doc.mjs';
|
|
626
|
+
const NAMESPACE_TYPES =
|
|
627
|
+
'NamespaceDoc, NamespaceProviderScope, NamespaceSlotAcceptance, NamespaceSlot, NamespaceAdoptionSource, NamespaceAdoptionRule from doctypes/namespace/type.ts have no doc in `astryx docs authoring`';
|
|
628
|
+
const SURFACE_FIX =
|
|
629
|
+
'Put a self-doc beside each module whose types @astryxdesign/cli/authoring exports and list it in AUTHORING_SELF_DOCS; export what each listed self-doc documents, or remove that self-doc.';
|
|
630
|
+
|
|
631
|
+
/** A copy of this repo's authoring tree, to break one piece of at a time. */
|
|
632
|
+
function copyAuthoring() {
|
|
633
|
+
const root = fs.mkdtempSync(
|
|
634
|
+
path.join(process.cwd(), '.astryx-doctor-authoring-'),
|
|
635
|
+
);
|
|
636
|
+
tmpDirs.push(root);
|
|
637
|
+
fs.cpSync(AUTHORING_ROOT, root, {
|
|
638
|
+
recursive: true,
|
|
639
|
+
filter: src => !src.endsWith('.test.mjs'),
|
|
640
|
+
});
|
|
641
|
+
return root;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** @param {string} source */
|
|
645
|
+
const without = source => AUTHORING_SELF_DOCS.filter(s => s !== source);
|
|
646
|
+
|
|
647
|
+
/** @param {string} text */
|
|
648
|
+
const escape = text => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
649
|
+
|
|
650
|
+
it(
|
|
651
|
+
'passes on this repo and prints exactly what it printed before',
|
|
652
|
+
async () => {
|
|
653
|
+
expect(await checkAuthoringDocs()).toEqual({
|
|
654
|
+
id: 'authoring-docs',
|
|
655
|
+
label: 'Authoring docs',
|
|
656
|
+
status: 'pass',
|
|
657
|
+
message: `All ${AUTHORING_SELF_DOCS.length} authoring schemas are readable in \`astryx docs authoring\`.`,
|
|
658
|
+
});
|
|
659
|
+
},
|
|
660
|
+
SLOW,
|
|
661
|
+
);
|
|
662
|
+
|
|
663
|
+
it(
|
|
664
|
+
'passes on an unchanged copy of the tree, and writes nothing to it',
|
|
665
|
+
async () => {
|
|
666
|
+
const root = copyAuthoring();
|
|
667
|
+
const before = snapshot(root);
|
|
668
|
+
expect(await checkAuthoringDocs(undefined, {root})).toMatchObject({
|
|
669
|
+
status: 'pass',
|
|
670
|
+
});
|
|
671
|
+
expect(snapshot(root)).toEqual(before);
|
|
672
|
+
},
|
|
673
|
+
SLOW,
|
|
674
|
+
);
|
|
675
|
+
|
|
676
|
+
it(
|
|
677
|
+
'fails when the NamespaceDoc self-doc is left out of AUTHORING_SELF_DOCS',
|
|
678
|
+
async () => {
|
|
679
|
+
const root = copyAuthoring();
|
|
680
|
+
const c = await checkAuthoringDocs(undefined, {
|
|
681
|
+
root,
|
|
682
|
+
sources: without(NAMESPACE),
|
|
683
|
+
});
|
|
684
|
+
expect(c.status).toBe('fail');
|
|
685
|
+
expect(c.message).toBe(
|
|
686
|
+
`2 problems: ${NAMESPACE} is not in \`astryx docs authoring\`; ${NAMESPACE_TYPES}: ${NAMESPACE} is not listed in AUTHORING_SELF_DOCS`,
|
|
687
|
+
);
|
|
688
|
+
},
|
|
689
|
+
SLOW,
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
it(
|
|
693
|
+
"fails when the topic's index no longer exposes the NamespaceDoc section",
|
|
694
|
+
async () => {
|
|
695
|
+
const index = await docs('authoring', undefined, {index: true});
|
|
696
|
+
const topicKeys = new Set(
|
|
697
|
+
index.data.sections
|
|
698
|
+
.map((/** @type {any} */ s) => s.id)
|
|
699
|
+
.filter((/** @type {string} */ id) => id !== 'namespace-doc'),
|
|
700
|
+
);
|
|
701
|
+
const c = await checkAuthoringDocs(undefined, {topicKeys});
|
|
702
|
+
expect(c).toMatchObject({
|
|
703
|
+
status: 'fail',
|
|
704
|
+
message: `${NAMESPACE_TYPES}: ${NAMESPACE} renders section "namespace-doc", which the topic's index does not list`,
|
|
705
|
+
fix: SURFACE_FIX,
|
|
706
|
+
});
|
|
707
|
+
},
|
|
708
|
+
SLOW,
|
|
709
|
+
);
|
|
710
|
+
|
|
711
|
+
it(
|
|
712
|
+
'fails when @astryxdesign/cli/authoring stops exporting NamespaceDoc',
|
|
713
|
+
async () => {
|
|
714
|
+
const root = copyAuthoring();
|
|
715
|
+
const index = path.join(root, 'index.d.ts');
|
|
716
|
+
const before = fs.readFileSync(index, 'utf8');
|
|
717
|
+
const after = before.replace(
|
|
718
|
+
/^export type \{NamespaceDoc\} from .*\n/m,
|
|
719
|
+
'',
|
|
720
|
+
);
|
|
721
|
+
expect(after).not.toBe(before);
|
|
722
|
+
fs.writeFileSync(index, after);
|
|
723
|
+
expect(await checkAuthoringDocs(undefined, {root})).toMatchObject({
|
|
724
|
+
status: 'fail',
|
|
725
|
+
message: `${NAMESPACE} documents NamespaceDoc, which @astryxdesign/cli/authoring does not export`,
|
|
726
|
+
fix: SURFACE_FIX,
|
|
727
|
+
});
|
|
728
|
+
},
|
|
729
|
+
SLOW,
|
|
730
|
+
);
|
|
731
|
+
|
|
732
|
+
it.each([
|
|
733
|
+
[
|
|
734
|
+
'the graph-fields doc',
|
|
735
|
+
'doctypes/base/graph-fields.doc.mjs',
|
|
736
|
+
'doctypes/base/type.ts',
|
|
737
|
+
[
|
|
738
|
+
'AuthoredDocKind',
|
|
739
|
+
'DocAudience',
|
|
740
|
+
'DocPlacement',
|
|
741
|
+
'AuthoredDocGraphFields',
|
|
742
|
+
],
|
|
743
|
+
],
|
|
744
|
+
[
|
|
745
|
+
'the identity doc',
|
|
746
|
+
'identity/identity.doc.mjs',
|
|
747
|
+
'identity/type.ts',
|
|
748
|
+
[
|
|
749
|
+
'ProviderId',
|
|
750
|
+
'ArtifactId',
|
|
751
|
+
'DocId',
|
|
752
|
+
'ProviderInstance',
|
|
753
|
+
'AuthoredDocEntry',
|
|
754
|
+
],
|
|
755
|
+
],
|
|
756
|
+
[
|
|
757
|
+
'the semantic-block doc',
|
|
758
|
+
'doctypes/reference/reference.doc.mjs',
|
|
759
|
+
'doctypes/reference/type.ts',
|
|
760
|
+
[
|
|
761
|
+
'WorkflowStep',
|
|
762
|
+
'WorkflowDocBlock',
|
|
763
|
+
'CollectionDocBlock',
|
|
764
|
+
'ReferenceDocBlock',
|
|
765
|
+
],
|
|
766
|
+
],
|
|
767
|
+
])(
|
|
768
|
+
'fails when %s is removed, which the self-doc audit alone passes',
|
|
769
|
+
async (_what, source, module, names) => {
|
|
770
|
+
const root = copyAuthoring();
|
|
771
|
+
fs.rmSync(path.join(root, source));
|
|
772
|
+
const sources = without(source);
|
|
773
|
+
expect(await auditAuthoringSelfDocs({root, sources})).toEqual({
|
|
774
|
+
sections: sources.length,
|
|
775
|
+
unreachable: [],
|
|
776
|
+
failed: [],
|
|
777
|
+
oversized: [],
|
|
778
|
+
});
|
|
779
|
+
const c = await checkAuthoringDocs(undefined, {root, sources});
|
|
780
|
+
expect(c.status).toBe('fail');
|
|
781
|
+
expect(c.fix).toBe(SURFACE_FIX);
|
|
782
|
+
expect(c.message).toMatch(
|
|
783
|
+
new RegExp(
|
|
784
|
+
`^[A-Za-z, ]+ from ${escape(module)} have no doc in \`astryx docs authoring\`: no self-doc sits beside ${escape(module)}$`,
|
|
785
|
+
),
|
|
786
|
+
);
|
|
787
|
+
for (const name of names) {
|
|
788
|
+
expect(c.message).toMatch(new RegExp(`(^|, )${name}(,| from)`));
|
|
789
|
+
}
|
|
790
|
+
},
|
|
791
|
+
SLOW,
|
|
792
|
+
);
|
|
793
|
+
|
|
794
|
+
it(
|
|
795
|
+
'keeps the message and fix of a failure only the self-doc audit reports',
|
|
796
|
+
async () => {
|
|
797
|
+
const root = copyAuthoring();
|
|
798
|
+
fs.writeFileSync(
|
|
799
|
+
path.join(root, 'identity', 'broken.doc.mjs'),
|
|
800
|
+
'export const doc = {;\n',
|
|
801
|
+
);
|
|
802
|
+
const c = await checkAuthoringDocs(undefined, {
|
|
803
|
+
root,
|
|
804
|
+
sources: [...AUTHORING_SELF_DOCS, 'identity/broken.doc.mjs'],
|
|
805
|
+
});
|
|
806
|
+
expect(c.status).toBe('fail');
|
|
807
|
+
expect(c.message).toMatch(/^identity\/broken\.doc\.mjs failed to load: /);
|
|
808
|
+
expect(c.fix).toBe(
|
|
809
|
+
'List every authoring self-doc in AUTHORING_SELF_DOCS, fix the one that fails to load, and split a section that is too large.',
|
|
810
|
+
);
|
|
811
|
+
},
|
|
812
|
+
SLOW,
|
|
813
|
+
);
|
|
814
|
+
|
|
815
|
+
it(
|
|
816
|
+
'reports a topic it cannot read rather than skipping the comparison',
|
|
817
|
+
async () => {
|
|
818
|
+
const spy = vi
|
|
819
|
+
.spyOn(DocsCatalog, 'fromBuiltins')
|
|
820
|
+
.mockImplementationOnce(() => {
|
|
821
|
+
throw new Error('no built-in docs');
|
|
822
|
+
});
|
|
823
|
+
try {
|
|
824
|
+
expect(await checkAuthoringDocs()).toMatchObject({
|
|
825
|
+
status: 'fail',
|
|
826
|
+
message:
|
|
827
|
+
'`astryx docs authoring` could not be read: no built-in docs',
|
|
828
|
+
fix: SURFACE_FIX,
|
|
829
|
+
});
|
|
830
|
+
} finally {
|
|
831
|
+
spy.mockRestore();
|
|
832
|
+
}
|
|
833
|
+
},
|
|
834
|
+
SLOW,
|
|
835
|
+
);
|
|
836
|
+
|
|
837
|
+
it(
|
|
838
|
+
'fails rather than passes when the surface exports no types at all',
|
|
839
|
+
async () => {
|
|
840
|
+
const root = copyAuthoring();
|
|
841
|
+
fs.writeFileSync(
|
|
842
|
+
path.join(root, 'index.d.ts'),
|
|
843
|
+
"export {parseDoc} from './doctypes/parse.mjs';\n",
|
|
844
|
+
);
|
|
845
|
+
const c = await checkAuthoringDocs(undefined, {root});
|
|
846
|
+
expect(c.status).toBe('fail');
|
|
847
|
+
expect(c.message).toContain(
|
|
848
|
+
'@astryxdesign/cli/authoring exports no types, so nothing was compared with `astryx docs authoring`',
|
|
849
|
+
);
|
|
850
|
+
},
|
|
851
|
+
SLOW,
|
|
852
|
+
);
|
|
853
|
+
});
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* Every file under `root` with its contents.
|
|
857
|
+
* @param {string} root
|
|
858
|
+
* @returns {Record<string, string>}
|
|
859
|
+
*/
|
|
860
|
+
function snapshot(root) {
|
|
861
|
+
/** @type {Record<string, string>} */
|
|
862
|
+
const out = {};
|
|
863
|
+
/** @param {string} dir */
|
|
864
|
+
const walk = dir => {
|
|
865
|
+
for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
|
|
866
|
+
const full = path.join(dir, entry.name);
|
|
867
|
+
if (entry.isDirectory()) walk(full);
|
|
868
|
+
else out[path.relative(root, full)] = fs.readFileSync(full, 'utf8');
|
|
869
|
+
}
|
|
870
|
+
};
|
|
871
|
+
walk(root);
|
|
872
|
+
return out;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
describe('doctor docs checks', () => {
|
|
876
|
+
it('runs both docs checks and they pass on the repo', async () => {
|
|
877
|
+
const r = await doctor({cwd});
|
|
878
|
+
const byId = Object.fromEntries(r.data.checks.map(c => [c.id, c.status]));
|
|
879
|
+
expect(byId['authoring-docs']).toBe('pass');
|
|
880
|
+
expect(byId['docs-progressive-disclosure']).toBe('pass');
|
|
881
|
+
}, SLOW);
|
|
882
|
+
});
|
|
883
|
+
|
|
884
|
+
describe('checkDocsProgressiveDisclosure languages', () => {
|
|
885
|
+
it('checks every overlay a topic ships, not only English', async () => {
|
|
886
|
+
const dir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-doctor-lang-'));
|
|
887
|
+
tmpDirs.push(dir);
|
|
888
|
+
const deploying = {
|
|
889
|
+
name: 'deploying',
|
|
890
|
+
title: 'Deploying',
|
|
891
|
+
description: 'Ship it.',
|
|
892
|
+
sections: [{title: 'Overview', content: [{type: 'prose', text: 'Push the button.'}]}],
|
|
893
|
+
};
|
|
894
|
+
fs.writeFileSync(
|
|
895
|
+
path.join(dir, 'deploying.doc.mjs'),
|
|
896
|
+
`export const docs = ${JSON.stringify(deploying)};\n`,
|
|
897
|
+
);
|
|
898
|
+
fs.writeFileSync(
|
|
899
|
+
path.join(dir, 'deploying.doc.zh.mjs'),
|
|
900
|
+
"throw new Error('zh overlay broken');\n",
|
|
901
|
+
);
|
|
902
|
+
fs.writeFileSync(
|
|
903
|
+
path.join(dir, 'deploying.doc.dense.mjs'),
|
|
904
|
+
`export const docsDense = ${JSON.stringify({
|
|
905
|
+
sections: [
|
|
906
|
+
{
|
|
907
|
+
section: 'Overview',
|
|
908
|
+
title: 'Overview',
|
|
909
|
+
content: [{type: 'prose', text: 'x'.repeat(40 * 1024)}],
|
|
910
|
+
},
|
|
911
|
+
],
|
|
912
|
+
})};\n`,
|
|
913
|
+
);
|
|
914
|
+
const c = await checkDocsProgressiveDisclosure({
|
|
915
|
+
docsCatalog: DocsCatalog.fromBuiltins({deploying: path.join(dir, 'deploying.doc.mjs')}),
|
|
916
|
+
docsCatalogIssues: [],
|
|
917
|
+
});
|
|
918
|
+
expect(c.status).toBe('warn');
|
|
919
|
+
expect(c.message).toContain('deploying [zh]: zh overlay broken');
|
|
920
|
+
expect(c.message).toContain('deploying [dense] overview: 41 KB');
|
|
921
|
+
expect(c.message).not.toMatch(/deploying overview:/);
|
|
922
|
+
});
|
|
923
|
+
});
|
|
924
|
+
|
|
925
|
+
describe('doctor says what it could not check', () => {
|
|
926
|
+
const CORE = {
|
|
927
|
+
'node_modules/@astryxdesign/core/package.json': JSON.stringify({
|
|
928
|
+
name: '@astryxdesign/core',
|
|
929
|
+
version: '0.6.3',
|
|
930
|
+
}),
|
|
931
|
+
};
|
|
932
|
+
|
|
933
|
+
/** Installed dependency whose manifest declares roots that do not exist. */
|
|
934
|
+
const dangling = {
|
|
935
|
+
'node_modules/@acme/dangling/package.json': JSON.stringify({
|
|
936
|
+
name: '@acme/dangling',
|
|
937
|
+
version: '2.0.0',
|
|
938
|
+
}),
|
|
939
|
+
'node_modules/@acme/dangling/astryx.integration.mjs':
|
|
940
|
+
"export default {providerId: 'acme-dangling', components: './components', templates: './templates', docs: './docs'};\n",
|
|
941
|
+
};
|
|
942
|
+
|
|
943
|
+
/** Installed dependency whose manifest cannot be parsed at all. */
|
|
944
|
+
const broken = {
|
|
945
|
+
'node_modules/@acme/broken/package.json': JSON.stringify({
|
|
946
|
+
name: '@acme/broken',
|
|
947
|
+
version: '1.0.0',
|
|
948
|
+
}),
|
|
949
|
+
'node_modules/@acme/broken/astryx.integration.mjs':
|
|
950
|
+
'export default { this is not valid javascript ((\n',
|
|
951
|
+
};
|
|
952
|
+
|
|
953
|
+
/** @param {Record<string, string>} extra @param {string[]} deps */
|
|
954
|
+
const project = (extra, deps) =>
|
|
955
|
+
mkProject({
|
|
956
|
+
'package.json': JSON.stringify({
|
|
957
|
+
name: 'consumer',
|
|
958
|
+
version: '1.0.0',
|
|
959
|
+
dependencies: Object.fromEntries(
|
|
960
|
+
['@astryxdesign/core', ...deps].map(d => [d, '1.0.0']),
|
|
961
|
+
),
|
|
962
|
+
}),
|
|
963
|
+
...CORE,
|
|
964
|
+
...extra,
|
|
965
|
+
});
|
|
966
|
+
|
|
967
|
+
// An unparseable manifest is kept out of the loaded set on purpose, and
|
|
968
|
+
// doctor used to report that no installed dependency ships a manifest.
|
|
969
|
+
it('names an installed dependency whose manifest cannot be loaded', async () => {
|
|
970
|
+
const report = (await doctor({cwd: project(broken, ['@acme/broken'])})).data;
|
|
971
|
+
const check = report.checks.find(c => c.id === 'implicit-integrations');
|
|
972
|
+
|
|
973
|
+
expect(check.status).toBe('info');
|
|
974
|
+
expect(check.message).toContain('@acme/broken');
|
|
975
|
+
expect(check.message).toContain('could not be loaded');
|
|
976
|
+
expect(check.message).not.toContain('no installed dependency ships');
|
|
977
|
+
expect(report.summary.fail).toBe(0);
|
|
978
|
+
}, SLOW);
|
|
979
|
+
|
|
980
|
+
it('does not claim contributions from roots that are missing on disk', async () => {
|
|
981
|
+
const report = (await doctor({cwd: project(dangling, ['@acme/dangling'])}))
|
|
982
|
+
.data;
|
|
983
|
+
const implicit = report.checks.find(c => c.id === 'implicit-integrations');
|
|
984
|
+
const issues = report.checks.find(c => c.id === 'integration-issues');
|
|
985
|
+
|
|
986
|
+
expect(implicit.message).toContain('contributing nothing');
|
|
987
|
+
expect(implicit.message).toContain('missing on disk');
|
|
988
|
+
expect(implicit.message).not.toContain('contributing components');
|
|
989
|
+
expect(issues.status).toBe('warn');
|
|
990
|
+
expect(issues.message).toContain('@acme/dangling');
|
|
991
|
+
}, SLOW);
|
|
992
|
+
|
|
993
|
+
it('still says no dependency ships a manifest when none does', async () => {
|
|
994
|
+
const report = (await doctor({cwd: project({}, [])})).data;
|
|
995
|
+
const check = report.checks.find(c => c.id === 'implicit-integrations');
|
|
996
|
+
|
|
997
|
+
expect(check.message).toBe(
|
|
998
|
+
'None — no installed dependency ships an astryx.integration.* manifest.',
|
|
999
|
+
);
|
|
1000
|
+
}, SLOW);
|
|
1001
|
+
|
|
1002
|
+
it('says how many integrations could not be read, rather than counting silently', () => {
|
|
1003
|
+
/** @type {any} */
|
|
1004
|
+
const ctx = {
|
|
1005
|
+
cwd: '/x',
|
|
1006
|
+
nodeVersion: process.versions.node,
|
|
1007
|
+
coreDir: null,
|
|
1008
|
+
configPath: null,
|
|
1009
|
+
configTheme: null,
|
|
1010
|
+
integrations: [
|
|
1011
|
+
{name: '@acme/ok', __spec: '@acme/ok', providerId: 'ok'},
|
|
1012
|
+
{name: '@acme/bad', __spec: '@acme/bad', __loadError: 'boom'},
|
|
1013
|
+
],
|
|
1014
|
+
};
|
|
1015
|
+
const check = checkProviderIdentity(ctx);
|
|
1016
|
+
|
|
1017
|
+
expect(check.message).toContain('1 loaded integration has its own provider ID.');
|
|
1018
|
+
expect(check.message).toContain('could not be read');
|
|
1019
|
+
});
|
|
1020
|
+
});
|