@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
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file layout command — thin CLI wrapper around api/layout.mjs.
|
|
5
|
-
*
|
|
6
|
-
* Subcommands:
|
|
7
|
-
* astryx layout expand "<expr>" [path] compressed expression → validated TSX
|
|
8
|
-
* astryx layout check "<expr>" validate + echo both canonical surfaces
|
|
9
|
-
* astryx layout grammar agent cheatsheet (alias table is branch-generated)
|
|
10
|
-
*
|
|
11
|
-
* The expression argument may also come from --file or stdin (`-`),
|
|
12
|
-
* which is how multi-line outline (XLO) input usually arrives.
|
|
13
|
-
*
|
|
14
|
-
* The command surface (group + subcommand descriptions, args, flags) is sourced
|
|
15
|
-
* from the colocated CommandDocs via `defineCommand`; this file supplies only the
|
|
16
|
-
* actions.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import * as fs from 'node:fs';
|
|
20
|
-
import * as path from 'node:path';
|
|
21
|
-
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
22
|
-
import {emit, section, text, list, record, code, WARN} from '../formatters/index.mjs';
|
|
23
|
-
import {cliError} from '../lib/cli-error.mjs';
|
|
24
|
-
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
25
|
-
import {layoutExpand, layoutCheck, layoutGrammar} from '../../../api/layout/layout.mjs';
|
|
26
|
-
import {defineCommand} from '../lib/define-command.mjs';
|
|
27
|
-
import {doc as layoutGroup} from './layout.doc.mjs';
|
|
28
|
-
import {doc as layoutExpandCommand} from './layout-expand.doc.mjs';
|
|
29
|
-
import {doc as layoutCheckCommand} from './layout-check.doc.mjs';
|
|
30
|
-
import {doc as layoutGrammarCommand} from './layout-grammar.doc.mjs';
|
|
31
|
-
import {doc as layoutExpandFn} from '../../../api/layout/layoutExpand.doc.mjs';
|
|
32
|
-
import {doc as layoutCheckFn} from '../../../api/layout/layoutCheck.doc.mjs';
|
|
33
|
-
import {doc as layoutGrammarFn} from '../../../api/layout/layoutGrammar.doc.mjs';
|
|
34
|
-
import {NO_RESULT_SET, resultSet} from '../../../foundation/debug/index.mjs';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The api layer's @returns for these functions widen the `type` discriminator
|
|
38
|
-
* to `string`, so annotate the command-local result with the precise response
|
|
39
|
-
* shapes from the colocated api/layout/layout.type.mjs so narrowing + jsonOut
|
|
40
|
-
* typecheck.
|
|
41
|
-
*
|
|
42
|
-
* @typedef {import('../../../api/layout/layout.type.mjs').LayoutExpandResponse} LayoutExpandResponse
|
|
43
|
-
* @typedef {import('../../../api/layout/layout.type.mjs').LayoutCheckResponse} LayoutCheckResponse
|
|
44
|
-
* @typedef {import('../../../api/layout/layout.type.mjs').LayoutGrammarResponse} LayoutGrammarResponse
|
|
45
|
-
*/
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @typedef {object} LayoutExpandOptions
|
|
49
|
-
* @property {string} [file]
|
|
50
|
-
* @property {'compact'|'outline'|'auto'} [form]
|
|
51
|
-
* @property {string} [name]
|
|
52
|
-
* @property {boolean} [loose]
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @typedef {object} LayoutCheckOptions
|
|
57
|
-
* @property {string} [file]
|
|
58
|
-
* @property {'compact'|'outline'|'auto'} [form]
|
|
59
|
-
* @property {boolean} [loose]
|
|
60
|
-
*/
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Resolve the expression from arg, --file, or stdin ('-').
|
|
64
|
-
* @param {string} [expr]
|
|
65
|
-
* @param {{file?: string}} [options]
|
|
66
|
-
* @returns {Promise<string>}
|
|
67
|
-
*/
|
|
68
|
-
async function readExpression(expr, options = {}) {
|
|
69
|
-
if (options.file) {
|
|
70
|
-
// Validate the file exists + is a regular file + is reasonably sized.
|
|
71
|
-
// We intentionally do NOT confine the read path (the user running the CLI
|
|
72
|
-
// controls --file; this is a read, not a write). The size cap prevents OOM
|
|
73
|
-
// from infinite streams like /dev/zero.
|
|
74
|
-
const filePath = path.resolve(process.cwd(), options.file);
|
|
75
|
-
const stat = fs.statSync(filePath, {throwIfNoEntry: false});
|
|
76
|
-
if (!stat || !stat.isFile()) {
|
|
77
|
-
cliError(`File not found: ${options.file}`, {
|
|
78
|
-
code: ERROR_CODES.ERR_FILE_NOT_FOUND,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5 MB
|
|
82
|
-
if (stat.size > MAX_FILE_SIZE) {
|
|
83
|
-
cliError(
|
|
84
|
-
`File "${options.file}" is too large (${(stat.size / 1024 / 1024).toFixed(1)} MB, max 5 MB)`,
|
|
85
|
-
{code: ERROR_CODES.ERR_FILE_NOT_FOUND},
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
return fs.readFileSync(filePath, 'utf-8');
|
|
90
|
-
} catch (e) {
|
|
91
|
-
const errno = /** @type {NodeJS.ErrnoException} */ (e);
|
|
92
|
-
if (errno && errno.code === 'ENOENT') {
|
|
93
|
-
// A --file pointing at a missing file is foreseeable — surface a
|
|
94
|
-
// stable code, not the raw ENOENT errno (and no stack in human mode).
|
|
95
|
-
cliError(`File not found: ${options.file}`, {
|
|
96
|
-
code: ERROR_CODES.ERR_FILE_NOT_FOUND,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
throw e;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (expr === '-') {
|
|
103
|
-
/** @type {Buffer[]} */
|
|
104
|
-
const chunks = [];
|
|
105
|
-
for await (const chunk of process.stdin) chunks.push(/** @type {Buffer} */ (chunk));
|
|
106
|
-
return Buffer.concat(chunks).toString('utf-8');
|
|
107
|
-
}
|
|
108
|
-
return expr ?? '';
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* @param {import('commander').Command} program
|
|
113
|
-
*/
|
|
114
|
-
export function registerLayout(program) {
|
|
115
|
-
const layoutCmd = defineCommand(program, layoutGroup);
|
|
116
|
-
|
|
117
|
-
defineCommand(layoutCmd, layoutExpandCommand, {
|
|
118
|
-
fn: layoutExpandFn,
|
|
119
|
-
action: async (/** @type {string} */ expression, /** @type {string} */ targetPath, /** @type {LayoutExpandOptions} */ options) => {
|
|
120
|
-
const json = program.opts().json || false;
|
|
121
|
-
const source = await readExpression(expression, options);
|
|
122
|
-
if (!source || source.trim() === '') {
|
|
123
|
-
return cliError(
|
|
124
|
-
'No layout expression given — pass it as an argument, via --file, or on stdin',
|
|
125
|
-
{code: ERROR_CODES.ERR_MISSING_ARGUMENT},
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
/** @type {LayoutExpandResponse} */
|
|
129
|
-
let result;
|
|
130
|
-
try {
|
|
131
|
-
result = /** @type {LayoutExpandResponse} */ (await layoutExpand(source, {
|
|
132
|
-
targetPath,
|
|
133
|
-
form: options.form,
|
|
134
|
-
loose: options.loose || false,
|
|
135
|
-
name: options.name,
|
|
136
|
-
cwd: process.cwd(),
|
|
137
|
-
}));
|
|
138
|
-
} catch (e) {
|
|
139
|
-
const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
140
|
-
return cliError(err.message, {suggestions: err.suggestions || [], code: err.code});
|
|
141
|
-
}
|
|
142
|
-
// Expanding turns an expression into TSX — a transformation, not a
|
|
143
|
-
// lookup. What it produced is in the output; there is no set to count.
|
|
144
|
-
if (json) {
|
|
145
|
-
jsonOut(result);
|
|
146
|
-
return NO_RESULT_SET;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
150
|
-
const out = [];
|
|
151
|
-
if (result.data.warnings.length > 0) {
|
|
152
|
-
out.push(text(result.data.warnings.map(w => `${WARN} ${w}`).join('\n')));
|
|
153
|
-
}
|
|
154
|
-
if (result.data.written) {
|
|
155
|
-
out.push(
|
|
156
|
-
text(`[ok] Expanded to ${result.data.written}`),
|
|
157
|
-
record(
|
|
158
|
-
{
|
|
159
|
-
components: result.data.componentsUsed,
|
|
160
|
-
todos:
|
|
161
|
-
result.data.todos.length > 0
|
|
162
|
-
? `${result.data.todos.length} (search for "TODO(xle)")`
|
|
163
|
-
: '',
|
|
164
|
-
},
|
|
165
|
-
{labels: {components: 'Components', todos: 'TODOs'}},
|
|
166
|
-
),
|
|
167
|
-
);
|
|
168
|
-
} else {
|
|
169
|
-
// Raw expanded TSX (no target path) — preformatted, emitted verbatim.
|
|
170
|
-
out.push(code(result.data.code));
|
|
171
|
-
}
|
|
172
|
-
emit(...out);
|
|
173
|
-
return NO_RESULT_SET;
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
defineCommand(layoutCmd, layoutCheckCommand, {
|
|
178
|
-
fn: layoutCheckFn,
|
|
179
|
-
action: async (/** @type {string} */ expression, /** @type {LayoutCheckOptions} */ options) => {
|
|
180
|
-
const json = program.opts().json || false;
|
|
181
|
-
const source = await readExpression(expression, options);
|
|
182
|
-
if (!source || source.trim() === '') {
|
|
183
|
-
return cliError(
|
|
184
|
-
'No layout expression given — pass it as an argument, via --file, or on stdin',
|
|
185
|
-
{code: ERROR_CODES.ERR_MISSING_ARGUMENT},
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
/** @type {LayoutCheckResponse} */
|
|
189
|
-
let result;
|
|
190
|
-
try {
|
|
191
|
-
result = /** @type {LayoutCheckResponse} */ (await layoutCheck(source, {
|
|
192
|
-
form: options.form,
|
|
193
|
-
loose: options.loose || false,
|
|
194
|
-
cwd: process.cwd(),
|
|
195
|
-
}));
|
|
196
|
-
} catch (e) {
|
|
197
|
-
const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
198
|
-
return cliError(err.message, {suggestions: err.suggestions || [], code: err.code});
|
|
199
|
-
}
|
|
200
|
-
// Exit code is the contract and must NOT depend on --json vs human: an
|
|
201
|
-
// invalid (but parseable) layout exits 1 in BOTH modes so `layout check`
|
|
202
|
-
// works as a CI gate / agent check without parsing stdout. Decide it
|
|
203
|
-
// before the JSON return (parity with doctor integration validate).
|
|
204
|
-
if (!result.data.valid) process.exitCode = 1;
|
|
205
|
-
|
|
206
|
-
// A verdict on one expression: valid or not, with the errors that made
|
|
207
|
-
// it so. Nothing was looked up.
|
|
208
|
-
if (json) {
|
|
209
|
-
jsonOut(result);
|
|
210
|
-
return NO_RESULT_SET;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const {valid, form, errors, warnings, compact, outline} = result.data;
|
|
214
|
-
if (!valid) {
|
|
215
|
-
// Each error: the formatted issue, with a hanging "did you mean" line.
|
|
216
|
-
const items = errors.map(e =>
|
|
217
|
-
e.suggestions && e.suggestions.length > 0
|
|
218
|
-
? [e.formatted, `did you mean: ${e.suggestions.join(', ')}?`]
|
|
219
|
-
: [e.formatted],
|
|
220
|
-
);
|
|
221
|
-
emit(
|
|
222
|
-
text(`[fail] Invalid (${errors.length} error${errors.length === 1 ? '' : 's'}):`),
|
|
223
|
-
list(items),
|
|
224
|
-
);
|
|
225
|
-
return NO_RESULT_SET;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
229
|
-
const out = [text(`[ok] Valid (parsed as ${form})`)];
|
|
230
|
-
if (warnings.length > 0) {
|
|
231
|
-
out.push(text(warnings.map(w => `${WARN} ${w}`).join('\n')));
|
|
232
|
-
}
|
|
233
|
-
// The canonical compact/outline surfaces are preformatted — emit verbatim.
|
|
234
|
-
out.push(section('compact'), code(compact), section('outline'), code(outline));
|
|
235
|
-
emit(...out);
|
|
236
|
-
return NO_RESULT_SET;
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
defineCommand(layoutCmd, layoutGrammarCommand, {
|
|
241
|
-
fn: layoutGrammarFn,
|
|
242
|
-
action: async () => {
|
|
243
|
-
const json = program.opts().json || false;
|
|
244
|
-
/** @type {LayoutGrammarResponse} */
|
|
245
|
-
let result;
|
|
246
|
-
try {
|
|
247
|
-
result = /** @type {LayoutGrammarResponse} */ (await layoutGrammar({cwd: process.cwd()}));
|
|
248
|
-
} catch (e) {
|
|
249
|
-
const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
250
|
-
return cliError(err.message, {suggestions: err.suggestions || [], code: err.code});
|
|
251
|
-
}
|
|
252
|
-
// One document, the same one every time: the grammar cheatsheet.
|
|
253
|
-
const answered = resultSet({count: 1, resultKind: 'doc'});
|
|
254
|
-
if (json) {
|
|
255
|
-
jsonOut(result);
|
|
256
|
-
return answered;
|
|
257
|
-
}
|
|
258
|
-
// The cheatsheet is a preformatted document — emit verbatim.
|
|
259
|
-
emit(code(result.data.text));
|
|
260
|
-
return answered;
|
|
261
|
-
},
|
|
262
|
-
});
|
|
263
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file Check for newer @astryxdesign/core versions via local signals.
|
|
5
|
-
*
|
|
6
|
-
* Resolution order:
|
|
7
|
-
* 1. $ASTRYX_LATEST_VERSION env var
|
|
8
|
-
* 2. If unset: no hint (no network calls from this module)
|
|
9
|
-
*
|
|
10
|
-
* When a newer version is detected, returns a hint string for CLI output.
|
|
11
|
-
* Also sets $ASTRYX_LATEST_VERSION for subsequent commands in the same shell.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import * as fs from 'node:fs';
|
|
15
|
-
import * as path from 'node:path';
|
|
16
|
-
import {semverGt} from '../../../foundation/env/semver.mjs';
|
|
17
|
-
import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Read the latest available version from local signals.
|
|
21
|
-
* No network calls — purely an env-var check ($ASTRYX_LATEST_VERSION),
|
|
22
|
-
* so it takes no arguments.
|
|
23
|
-
*
|
|
24
|
-
* @returns {string|null} Latest version string, or null if unknown
|
|
25
|
-
*/
|
|
26
|
-
export function getLatestVersion() {
|
|
27
|
-
// 1. Check env var (fastest — set by previous CLI run)
|
|
28
|
-
const envVersion = process.env.ASTRYX_LATEST_VERSION;
|
|
29
|
-
if (envVersion && /^\d+\.\d+\.\d+/.test(envVersion)) {
|
|
30
|
-
return envVersion;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Get the currently installed @astryxdesign/core version from the consumer's package.json.
|
|
38
|
-
*
|
|
39
|
-
* @param {string} [cwd] - Project directory
|
|
40
|
-
* @returns {string|null} Installed version, or null
|
|
41
|
-
*/
|
|
42
|
-
export function getInstalledVersion(cwd = process.cwd()) {
|
|
43
|
-
try {
|
|
44
|
-
const pkgPath = path.resolve(cwd, 'package.json');
|
|
45
|
-
if (!fs.existsSync(pkgPath)) return null;
|
|
46
|
-
|
|
47
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
48
|
-
const deps = {...pkg.dependencies, ...pkg.devDependencies};
|
|
49
|
-
const version = deps['@astryxdesign/core'];
|
|
50
|
-
if (!version) return null;
|
|
51
|
-
|
|
52
|
-
// Strip semver range prefix
|
|
53
|
-
return version.replace(/^[^\d]*/, '');
|
|
54
|
-
} catch {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Check for available updates and return a hint string if one exists.
|
|
61
|
-
* Also sets $ASTRYX_LATEST_VERSION env var for subsequent commands.
|
|
62
|
-
*
|
|
63
|
-
* @param {string} [cwd] - Project directory
|
|
64
|
-
* @returns {string|null} FYI hint string, or null if up to date / unknown
|
|
65
|
-
*/
|
|
66
|
-
export function checkForUpdate(cwd = process.cwd()) {
|
|
67
|
-
const latest = getLatestVersion();
|
|
68
|
-
if (!latest) return null;
|
|
69
|
-
|
|
70
|
-
// Persist for subsequent commands in this shell session
|
|
71
|
-
process.env.ASTRYX_LATEST_VERSION = latest;
|
|
72
|
-
|
|
73
|
-
const installed = getInstalledVersion(cwd);
|
|
74
|
-
if (!installed) return null;
|
|
75
|
-
|
|
76
|
-
// Use semver-aware comparison so '0.0.20' is correctly treated as greater
|
|
77
|
-
// than '0.0.5' (lexicographic compare gets that backwards).
|
|
78
|
-
if (semverGt(latest, installed)) {
|
|
79
|
-
return `FYI: A newer version of @astryxdesign/core (${latest}) is available. Install the new package version, then run: ${getCliInvocation()} upgrade --from <old-version> --apply`;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
import {describe, it, expect, beforeEach, afterEach} from 'vitest';
|
|
4
|
-
import * as fs from 'node:fs';
|
|
5
|
-
import * as path from 'node:path';
|
|
6
|
-
import * as os from 'node:os';
|
|
7
|
-
import {
|
|
8
|
-
getLatestVersion,
|
|
9
|
-
getInstalledVersion,
|
|
10
|
-
checkForUpdate,
|
|
11
|
-
} from './update-check.mjs';
|
|
12
|
-
|
|
13
|
-
let tmpDir;
|
|
14
|
-
const originalEnv = {};
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-update-check-'));
|
|
18
|
-
// Save and clear env
|
|
19
|
-
originalEnv.ASTRYX_LATEST_VERSION = process.env.ASTRYX_LATEST_VERSION;
|
|
20
|
-
delete process.env.ASTRYX_LATEST_VERSION;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
25
|
-
// Restore env
|
|
26
|
-
if (originalEnv.ASTRYX_LATEST_VERSION !== undefined) {
|
|
27
|
-
process.env.ASTRYX_LATEST_VERSION = originalEnv.ASTRYX_LATEST_VERSION;
|
|
28
|
-
} else {
|
|
29
|
-
delete process.env.ASTRYX_LATEST_VERSION;
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe('getLatestVersion', () => {
|
|
34
|
-
it('reads from ASTRYX_LATEST_VERSION env var', () => {
|
|
35
|
-
process.env.ASTRYX_LATEST_VERSION = '0.0.8';
|
|
36
|
-
expect(getLatestVersion()).toBe('0.0.8');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('ignores invalid env var values', () => {
|
|
40
|
-
process.env.ASTRYX_LATEST_VERSION = 'not-a-version';
|
|
41
|
-
expect(getLatestVersion()).toBeNull();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('returns null when no signals exist', () => {
|
|
45
|
-
fs.writeFileSync(
|
|
46
|
-
path.join(tmpDir, 'package.json'),
|
|
47
|
-
JSON.stringify({name: 'test'}),
|
|
48
|
-
);
|
|
49
|
-
expect(getLatestVersion()).toBeNull();
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('getInstalledVersion', () => {
|
|
54
|
-
it('reads @astryxdesign/core version from dependencies', () => {
|
|
55
|
-
fs.writeFileSync(
|
|
56
|
-
path.join(tmpDir, 'package.json'),
|
|
57
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.7'}}),
|
|
58
|
-
);
|
|
59
|
-
expect(getInstalledVersion(tmpDir)).toBe('0.0.7');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('strips semver range prefix', () => {
|
|
63
|
-
fs.writeFileSync(
|
|
64
|
-
path.join(tmpDir, 'package.json'),
|
|
65
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '~0.0.5'}}),
|
|
66
|
-
);
|
|
67
|
-
expect(getInstalledVersion(tmpDir)).toBe('0.0.5');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('returns null when @astryxdesign/core is not a dependency', () => {
|
|
71
|
-
fs.writeFileSync(
|
|
72
|
-
path.join(tmpDir, 'package.json'),
|
|
73
|
-
JSON.stringify({dependencies: {react: '^19.0.0'}}),
|
|
74
|
-
);
|
|
75
|
-
expect(getInstalledVersion(tmpDir)).toBeNull();
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('checkForUpdate', () => {
|
|
80
|
-
it('returns hint when newer version is available', () => {
|
|
81
|
-
process.env.ASTRYX_LATEST_VERSION = '0.0.8';
|
|
82
|
-
fs.writeFileSync(
|
|
83
|
-
path.join(tmpDir, 'package.json'),
|
|
84
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.7'}}),
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
const hint = checkForUpdate(tmpDir);
|
|
88
|
-
expect(hint).toContain('0.0.8');
|
|
89
|
-
expect(hint).toContain('astryx upgrade --from <old-version> --apply');
|
|
90
|
-
expect(hint).toContain('FYI');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('returns null when up to date', () => {
|
|
94
|
-
process.env.ASTRYX_LATEST_VERSION = '0.0.7';
|
|
95
|
-
fs.writeFileSync(
|
|
96
|
-
path.join(tmpDir, 'package.json'),
|
|
97
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.7'}}),
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
expect(checkForUpdate(tmpDir)).toBeNull();
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('returns null when no latest version is known', () => {
|
|
104
|
-
fs.writeFileSync(
|
|
105
|
-
path.join(tmpDir, 'package.json'),
|
|
106
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.7'}}),
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
expect(checkForUpdate(tmpDir)).toBeNull();
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('uses semver (not lexicographic) comparison for double-digit patches', () => {
|
|
113
|
-
// Regression: with string compare, '0.0.20' > '0.0.5' is false because
|
|
114
|
-
// '2' < '5' lexicographically. Users on 0.0.5 would never be told that
|
|
115
|
-
// 0.0.20 is available.
|
|
116
|
-
process.env.ASTRYX_LATEST_VERSION = '0.0.20';
|
|
117
|
-
fs.writeFileSync(
|
|
118
|
-
path.join(tmpDir, 'package.json'),
|
|
119
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.5'}}),
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
const hint = checkForUpdate(tmpDir);
|
|
123
|
-
expect(hint).toContain('0.0.20');
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('does not suggest an upgrade when latest < installed (semver)', () => {
|
|
127
|
-
// The mirror-image bug: '0.0.9' > '0.0.10' is true under string compare,
|
|
128
|
-
// so a stale env hint of 0.0.9 would falsely claim it's "newer" than 0.0.10.
|
|
129
|
-
process.env.ASTRYX_LATEST_VERSION = '0.0.9';
|
|
130
|
-
fs.writeFileSync(
|
|
131
|
-
path.join(tmpDir, 'package.json'),
|
|
132
|
-
JSON.stringify({dependencies: {'@astryxdesign/core': '^0.0.10'}}),
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
expect(checkForUpdate(tmpDir)).toBeNull();
|
|
136
|
-
});
|
|
137
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file Guards the update-hint command allowlist.
|
|
5
|
-
*
|
|
6
|
-
* The post-action update hint only fires for a small set of commands
|
|
7
|
-
* (see UPDATE_HINT_COMMANDS in index.mjs). Every name in that set must
|
|
8
|
-
* map to a real, registered command — otherwise the entry is dead and
|
|
9
|
-
* the hint can never fire for it. This test imports the assembled
|
|
10
|
-
* program and verifies the invariant so a stale reference can't creep in.
|
|
11
|
-
*
|
|
12
|
-
* Historically there was a dead 'doctor' entry in UPDATE_HINT_COMMANDS that
|
|
13
|
-
* referenced a command that didn't exist. `doctor` is now a real command
|
|
14
|
-
* (the health check), but it is intentionally NOT in the update-hint set —
|
|
15
|
-
* the hint is for content commands (component/docs) that agents read, not
|
|
16
|
-
* for the diagnostic command. This test pins both invariants.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import {describe, it, expect} from 'vitest';
|
|
20
|
-
import {program} from './index.mjs';
|
|
21
|
-
|
|
22
|
-
/** Commands the update hint is expected to fire for. */
|
|
23
|
-
const HINTED_COMMANDS = ['component', 'docs'];
|
|
24
|
-
|
|
25
|
-
/** Real commands that must NOT trigger the update hint. */
|
|
26
|
-
const NON_HINTED_COMMANDS = ['doctor'];
|
|
27
|
-
|
|
28
|
-
function registeredCommandNames() {
|
|
29
|
-
return program.commands.map((c) => c.name());
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
describe('update hint commands', () => {
|
|
33
|
-
it('fires only for real, registered commands', () => {
|
|
34
|
-
const registered = new Set(registeredCommandNames());
|
|
35
|
-
for (const name of HINTED_COMMANDS) {
|
|
36
|
-
expect(registered.has(name)).toBe(true);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('registers the real "doctor" command', () => {
|
|
41
|
-
const registered = new Set(registeredCommandNames());
|
|
42
|
-
expect(registered.has('doctor')).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('does not fire the update hint for the doctor command', () => {
|
|
46
|
-
// UPDATE_HINT_COMMANDS is intentionally limited to content commands.
|
|
47
|
-
// Doctor is a diagnostic; its output should not carry an update hint.
|
|
48
|
-
expect(NON_HINTED_COMMANDS).not.toContain('component');
|
|
49
|
-
expect(NON_HINTED_COMMANDS).not.toContain('docs');
|
|
50
|
-
for (const name of NON_HINTED_COMMANDS) {
|
|
51
|
-
expect(HINTED_COMMANDS).not.toContain(name);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
});
|