@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d
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/README.md +117 -79
- 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 +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -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 +268 -47
- package/api/docs/_adapter.mjs +970 -149
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.d.mts +0 -15
- package/api/docs/detail/detail.mjs +22 -78
- package/api/docs/detail/section/section.mjs +39 -24
- package/api/docs/detail/section/section.test.mjs +19 -9
- package/api/docs/docs.d.mts +5 -3
- package/api/docs/docs.doc.mjs +39 -17
- package/api/docs/docs.mjs +44 -8
- package/api/docs/docs.test.mjs +158 -4
- package/api/docs/docs.type.d.mts +185 -6
- package/api/docs/docs.type.mjs +127 -13
- package/api/docs/index/index.mjs +15 -6
- package/api/docs/index/index.test.mjs +1 -1
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +14 -14
- 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 +54 -4
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +332 -21
- package/api/doctor/doctor.test.mjs +420 -7
- 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 +1 -1
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- 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 +2 -0
- 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.mjs +83 -7
- 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 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +61 -10
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +14 -2
- 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 +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +11 -13
- 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 +124 -73
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +8 -2
- package/api/upgrade/upgrade.type.d.mts +42 -4
- package/api/upgrade/upgrade.type.mjs +26 -10
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- 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/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -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/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/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
- 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/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 +10 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +29 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +7 -7
- 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 +240 -128
- package/authoring/doctypes/_schema.mjs +198 -16
- package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
- package/authoring/doctypes/base/type.ts +9 -4
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +4 -4
- package/authoring/doctypes/component/component.doc.mjs +5 -2
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +3 -3
- 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 +2 -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 +4 -3
- 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 +3 -3
- package/authoring/doctypes/legacy.d.mts +6 -6
- package/authoring/doctypes/legacy.mjs +3 -3
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
- package/authoring/doctypes/namespace/parse.d.mts +2 -2
- package/authoring/doctypes/namespace/parse.mjs +1 -1
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +6 -3
- package/authoring/doctypes/parse.d.mts +22 -20
- package/authoring/doctypes/parse.mjs +19 -14
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +1 -1
- package/authoring/doctypes/reference/reference.doc.mjs +39 -6
- package/authoring/doctypes/reference/type.ts +31 -14
- 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 +3 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +37 -1
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +12 -1
- 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 -11
- 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 +9 -9
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.mjs +3 -2
- package/authoring/identity/type.ts +10 -10
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +32 -19
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/schema.d.mts +4 -4
- package/authoring/integration/schema.mjs +3 -3
- package/authoring/integration/type.ts +5 -11
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -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 +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +21 -9
- package/clients/cli/commands/docs.mjs +184 -70
- package/clients/cli/commands/docs.test.mjs +120 -16
- 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/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
- package/clients/cli/commands/manifest.doc.mjs +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 +719 -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 +3 -3
- 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 +20 -8
- 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 +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -0
- package/clients/cli/index.mjs +21 -30
- 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 +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +32 -2
- package/clients/cli/lib/manifest.test.mjs +17 -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 +246 -89
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +38 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
- 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 +38 -0
- package/foundation/discovery/component-discovery.mjs +48 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +114 -9
- package/foundation/discovery/docs-discovery.mjs +239 -30
- package/foundation/discovery/docs-discovery.test.mjs +150 -35
- package/foundation/discovery/docs-output-budget.d.mts +2 -2
- package/foundation/discovery/docs-output-budget.mjs +1 -1
- package/foundation/discovery/docs-section-key.d.mts +28 -10
- package/foundation/discovery/docs-section-key.mjs +134 -33
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- 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 +772 -82
- 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 +1642 -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 +598 -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/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -52
- 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 +51 -26
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +17 -1
- package/foundation/integrations/integrations.mjs +52 -98
- package/foundation/integrations/integrations.test.mjs +31 -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.mjs +121 -29
- package/foundation/response/base.d.ts +8 -4
- 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 +11 -0
- 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 +37 -22
- package/foundation/response/response-types.doc.test.mjs +158 -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/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- 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
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* @file build command — thin wrapper with a stable result summary.
|
|
5
5
|
*
|
|
6
6
|
* astryx build → the PLAYBOOK (how to build a page)
|
|
7
|
-
* astryx build "<what>" →
|
|
8
|
-
*
|
|
7
|
+
* astryx build "<what>" → the TEMPLATE to start from (always one: the
|
|
8
|
+
* closest page, or the app shell), other
|
|
9
|
+
* templates, then blocks and components.
|
|
9
10
|
*
|
|
10
11
|
* All grouping/scoring lives in api/build; this file only parses flags and
|
|
11
12
|
* renders. Command strings are prefixed for the caller's package manager here
|
|
@@ -22,57 +23,45 @@ import {
|
|
|
22
23
|
emit,
|
|
23
24
|
section,
|
|
24
25
|
text,
|
|
26
|
+
list,
|
|
25
27
|
record,
|
|
26
28
|
records,
|
|
27
|
-
ARROW,
|
|
28
29
|
} from '../formatters/index.mjs';
|
|
29
30
|
import {cliError} from '../lib/cli-error.mjs';
|
|
31
|
+
import {firstSentence} from '../../../foundation/text/string-utils.mjs';
|
|
30
32
|
import {defineCommand} from '../lib/define-command.mjs';
|
|
31
33
|
import {build as buildApi} from '../../../api/build/build.mjs';
|
|
32
34
|
import {doc as buildCommand} from './build.doc.mjs';
|
|
33
35
|
import {doc as buildFn} from '../../../api/build/build.doc.mjs';
|
|
34
36
|
|
|
35
37
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
+
* Playbook commands as records whose field names are the JSON keys, so a
|
|
39
|
+
* reader can grep `^command:`. The command is run with the caller's invocation.
|
|
40
|
+
* @type {import('../formatters/index.mjs').RecordOptions}
|
|
38
41
|
*/
|
|
39
|
-
|
|
42
|
+
const COMMAND_RECORDS = {
|
|
43
|
+
fields: ['command', 'purpose'],
|
|
44
|
+
format: {command: command => formatCliCommand(command)},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Emit the build playbook (shown when `build` is run with no query) — a
|
|
49
|
+
* projection of the `build.help` data, so text and JSON carry the same steps.
|
|
50
|
+
* @param {import('../../../api/build/build.type.mjs').BuildHelpResponse['data']} playbook
|
|
51
|
+
*/
|
|
52
|
+
function printPlaybook(playbook) {
|
|
40
53
|
emit(
|
|
41
|
-
section(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
[
|
|
52
|
-
`2. If a [page] template matches ${ARROW} scaffold it and adapt:`,
|
|
53
|
-
` ${run} template <name> [path]`,
|
|
54
|
-
].join('\n'),
|
|
55
|
-
),
|
|
56
|
-
text(
|
|
57
|
-
[
|
|
58
|
-
`3. If nothing matches exactly ${ARROW} compose:`,
|
|
59
|
-
` ${run} template <name> --skeleton # study a close page's layout`,
|
|
60
|
-
` ${run} template <BlockName> # drop in each block from the kit`,
|
|
61
|
-
` ${run} component <Name> # fill remaining gaps (read props)`,
|
|
62
|
-
].join('\n'),
|
|
63
|
-
),
|
|
64
|
-
text(
|
|
65
|
-
[
|
|
66
|
-
'4. Rules (keep it on-system):',
|
|
67
|
-
' - No <div>/raw HTML for layout — use VStack/HStack/Grid/Stack/Card etc.',
|
|
68
|
-
` - No style={{}} — use component props; design tokens via \`${run} docs tokens\`.`,
|
|
69
|
-
' - Wrap the app in <Theme theme={...}> and import core reset.css + astryx.css.',
|
|
70
|
-
].join('\n'),
|
|
71
|
-
),
|
|
72
|
-
text(
|
|
73
|
-
`Tip: \`${run} build "<idea>"\` is the fastest way in. For a neutral ` +
|
|
74
|
-
`lookup of any component/doc/template, use \`${run} search <query>\`.`,
|
|
75
|
-
),
|
|
54
|
+
section(playbook.title),
|
|
55
|
+
...playbook.steps.flatMap((step, i) => [
|
|
56
|
+
section(`${i + 1}. ${step.title}`),
|
|
57
|
+
records(step.commands, COMMAND_RECORDS),
|
|
58
|
+
step.returns ? record({returns: step.returns}) : null,
|
|
59
|
+
]),
|
|
60
|
+
section(`${playbook.steps.length + 1}. Rules (keep it on-system)`),
|
|
61
|
+
list(playbook.rules),
|
|
62
|
+
...(playbook.related.length > 0
|
|
63
|
+
? [section('Related'), records(playbook.related, COMMAND_RECORDS)]
|
|
64
|
+
: []),
|
|
76
65
|
);
|
|
77
66
|
}
|
|
78
67
|
|
|
@@ -91,7 +80,10 @@ export function registerBuild(program) {
|
|
|
91
80
|
|
|
92
81
|
// No query → the playbook. Still routed through the API for the envelope.
|
|
93
82
|
if (!query || !String(query).trim()) {
|
|
94
|
-
const result =
|
|
83
|
+
const result =
|
|
84
|
+
/** @type {import('../../../api/build/build.type.mjs').BuildHelpResponse} */ (
|
|
85
|
+
await buildApi(undefined, {cwd: process.cwd()})
|
|
86
|
+
);
|
|
95
87
|
// The playbook is a document, not a lookup: one doc, always the same
|
|
96
88
|
// one. Counting it as a result keeps "what did this run answer with"
|
|
97
89
|
// true for the no-argument form too.
|
|
@@ -100,7 +92,7 @@ export function registerBuild(program) {
|
|
|
100
92
|
jsonOut(result);
|
|
101
93
|
return playbook;
|
|
102
94
|
}
|
|
103
|
-
printPlaybook(
|
|
95
|
+
printPlaybook(result.data);
|
|
104
96
|
return playbook;
|
|
105
97
|
}
|
|
106
98
|
|
|
@@ -136,6 +128,7 @@ export function registerBuild(program) {
|
|
|
136
128
|
hasResults,
|
|
137
129
|
matchCount,
|
|
138
130
|
directMatch,
|
|
131
|
+
start,
|
|
139
132
|
pages,
|
|
140
133
|
blocks,
|
|
141
134
|
domain,
|
|
@@ -144,8 +137,8 @@ export function registerBuild(program) {
|
|
|
144
137
|
hint,
|
|
145
138
|
} = result.data;
|
|
146
139
|
// The kit spans domains, so its kind comes from the pieces themselves.
|
|
147
|
-
// `
|
|
148
|
-
// are not what the query matched.
|
|
140
|
+
// `start` (which may be the fallback shell), `frame` and `foundation`
|
|
141
|
+
// are deliberately excluded: they are not what the query matched.
|
|
149
142
|
const answered = resultSetOf([...pages, ...blocks, ...domain], {
|
|
150
143
|
count: matchCount,
|
|
151
144
|
empty: !hasResults,
|
|
@@ -158,7 +151,7 @@ export function registerBuild(program) {
|
|
|
158
151
|
return answered;
|
|
159
152
|
}
|
|
160
153
|
|
|
161
|
-
if (!hasResults) {
|
|
154
|
+
if (!hasResults && !start) {
|
|
162
155
|
emit(
|
|
163
156
|
text(`No matches for "${q}".`),
|
|
164
157
|
text(`Try a broader term, or browse: ${run} component --list`),
|
|
@@ -166,97 +159,127 @@ export function registerBuild(program) {
|
|
|
166
159
|
return answered;
|
|
167
160
|
}
|
|
168
161
|
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
'domain',
|
|
176
|
-
'displayName',
|
|
177
|
-
'score',
|
|
178
|
-
'reason',
|
|
179
|
-
'import',
|
|
180
|
-
'description',
|
|
181
|
-
'command',
|
|
182
|
-
]
|
|
183
|
-
: ['name', 'displayName', 'description', 'command'];
|
|
162
|
+
// Four sections, one job each: the TEMPLATE to scaffold, OTHER
|
|
163
|
+
// TEMPLATES if its layout is wrong, BLOCKS for parts it lacks, and
|
|
164
|
+
// COMPONENTS for the rest. Descriptions stop at their first sentence and
|
|
165
|
+
// blocks and components share one command line in their heading; the
|
|
166
|
+
// JSON and --verbose carry everything.
|
|
167
|
+
const verbose = Boolean(options.verbose);
|
|
184
168
|
/** @type {import('../formatters/index.mjs').RecordOptions} */
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
169
|
+
const full = {
|
|
170
|
+
fields: [
|
|
171
|
+
'name',
|
|
172
|
+
'domain',
|
|
173
|
+
'displayName',
|
|
174
|
+
'score',
|
|
175
|
+
'reason',
|
|
176
|
+
'import',
|
|
177
|
+
'description',
|
|
178
|
+
'command',
|
|
179
|
+
],
|
|
180
|
+
format: {command: formatCliCommand},
|
|
181
|
+
};
|
|
182
|
+
/** @param {string[]} fields */
|
|
183
|
+
const brief = fields => ({
|
|
184
|
+
fields,
|
|
185
|
+
format: {command: formatCliCommand, description: firstSentence},
|
|
186
|
+
});
|
|
187
|
+
// Blocks and components are extras: the text names the top few, and
|
|
188
|
+
// says how many more the JSON and --verbose carry.
|
|
189
|
+
const TOP = 3;
|
|
190
|
+
/** @param {unknown[]} items */
|
|
191
|
+
const shown = items => (verbose ? items : items.slice(0, TOP));
|
|
192
|
+
/** @param {unknown[]} items */
|
|
193
|
+
const more = items =>
|
|
194
|
+
!verbose && items.length > TOP
|
|
195
|
+
? ` (top ${TOP} of ${items.length}; --verbose for all)`
|
|
196
|
+
: '';
|
|
212
197
|
|
|
213
198
|
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
214
199
|
const out = [
|
|
215
200
|
section(`Build kit for "${q}"`),
|
|
216
201
|
text(
|
|
217
|
-
|
|
218
|
-
'
|
|
219
|
-
|
|
220
|
-
|
|
202
|
+
start
|
|
203
|
+
? 'Start from the TEMPLATE, fill it with BLOCKS, and use COMPONENTS only for what is left.\n' +
|
|
204
|
+
'Changing a page you already have? Keep it, and use only the blocks and components.'
|
|
205
|
+
: 'This kit is narrowed by --type, so it names no template.',
|
|
221
206
|
),
|
|
222
|
-
section('RECOMMENDED START', `${startNote}\n${startCmd}`),
|
|
223
207
|
];
|
|
224
208
|
|
|
225
|
-
if (
|
|
209
|
+
if (start) {
|
|
226
210
|
out.push(
|
|
227
211
|
section(
|
|
228
|
-
'
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
212
|
+
'TEMPLATE',
|
|
213
|
+
`${start.reason} ${
|
|
214
|
+
start.basis === 'fallback'
|
|
215
|
+
? 'Scaffold it, then put blocks inside it.'
|
|
216
|
+
: 'Scaffold it, then replace its content. Keep its layout and spacing.'
|
|
217
|
+
}`,
|
|
218
|
+
),
|
|
219
|
+
record(
|
|
220
|
+
start,
|
|
221
|
+
verbose
|
|
222
|
+
? {
|
|
223
|
+
fields: ['name', 'displayName', 'description', 'command'],
|
|
224
|
+
format: {command: formatCliCommand},
|
|
225
|
+
}
|
|
226
|
+
: brief(['name', 'description', 'command']),
|
|
232
227
|
),
|
|
233
|
-
records(pages, recordOpts),
|
|
234
228
|
);
|
|
229
|
+
if (start.alternatives.length) {
|
|
230
|
+
out.push(
|
|
231
|
+
section(
|
|
232
|
+
'OTHER TEMPLATES',
|
|
233
|
+
`If the layout is wrong, scaffold one of these instead. All page templates: ${formatCliCommand('template --list --type page')}`,
|
|
234
|
+
),
|
|
235
|
+
records(
|
|
236
|
+
start.alternatives,
|
|
237
|
+
verbose ? full : brief(['name', 'description', 'command']),
|
|
238
|
+
),
|
|
239
|
+
);
|
|
240
|
+
}
|
|
235
241
|
}
|
|
236
|
-
|
|
242
|
+
// Search's own page matches, so the text carries every field the JSON
|
|
243
|
+
// does: one line by default, the full entries under --verbose.
|
|
244
|
+
if (pages.length) {
|
|
237
245
|
out.push(
|
|
238
|
-
|
|
239
|
-
|
|
246
|
+
verbose
|
|
247
|
+
? section(
|
|
248
|
+
'SEARCH MATCHES',
|
|
249
|
+
'Page templates keyword search matched, best first.',
|
|
250
|
+
)
|
|
251
|
+
: text(
|
|
252
|
+
`Keyword search matched these page templates: ${pages.map(p => p.name).join(', ')}.`,
|
|
253
|
+
),
|
|
240
254
|
);
|
|
255
|
+
if (verbose) out.push(records(pages, full));
|
|
241
256
|
}
|
|
242
|
-
if (
|
|
257
|
+
if (blocks.length) {
|
|
243
258
|
out.push(
|
|
244
|
-
section(
|
|
245
|
-
|
|
259
|
+
section(
|
|
260
|
+
'BLOCKS',
|
|
261
|
+
`Ready-made sections for parts the template lacks${more(blocks)}. Print one: ${formatCliCommand('template <name>')}`,
|
|
262
|
+
),
|
|
263
|
+
records(
|
|
264
|
+
shown(blocks),
|
|
265
|
+
verbose ? full : brief(['name', 'description']),
|
|
266
|
+
),
|
|
246
267
|
);
|
|
247
268
|
}
|
|
248
|
-
|
|
249
269
|
out.push(
|
|
250
270
|
section(
|
|
251
|
-
'
|
|
252
|
-
|
|
271
|
+
'COMPONENTS',
|
|
272
|
+
`For what the template and blocks do not cover${more(domain)}. Read one: ${formatCliCommand('component <name>')}`,
|
|
253
273
|
),
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
274
|
+
...(domain.length
|
|
275
|
+
? [
|
|
276
|
+
records(
|
|
277
|
+
shown(domain),
|
|
278
|
+
verbose ? full : brief(['name', 'description']),
|
|
279
|
+
),
|
|
280
|
+
]
|
|
281
|
+
: []),
|
|
282
|
+
record({frame, foundation}),
|
|
260
283
|
);
|
|
261
284
|
|
|
262
285
|
// Last, so it is the line the reader leaves with — and only when the kit
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file The no-query `build` playbook is data. `--json` carries every step,
|
|
5
|
+
* rule and command; the text output is rendered from those values and shows
|
|
6
|
+
* nothing the envelope lacks.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {describe, it, expect} from 'vitest';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import {fileURLToPath} from 'node:url';
|
|
12
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
13
|
+
import {program} from '../index.mjs';
|
|
14
|
+
|
|
15
|
+
// Run against the monorepo root so @astryxdesign/core is discoverable.
|
|
16
|
+
const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
|
|
17
|
+
const SLOW = 30_000;
|
|
18
|
+
|
|
19
|
+
/** @param {string} s */
|
|
20
|
+
const ascii = s => s.replace(/[\u2014\u2013]/g, '-');
|
|
21
|
+
|
|
22
|
+
describe('build playbook: text is a projection of the JSON', () => {
|
|
23
|
+
it('prints exactly the commands, steps and rules the envelope carries', async () => {
|
|
24
|
+
const json = await runCli(['build', '--json'], REPO);
|
|
25
|
+
expect(json.status).toBe(0);
|
|
26
|
+
const {type, data} = JSON.parse(json.stdout);
|
|
27
|
+
expect(type).toBe('build.help');
|
|
28
|
+
expect(data.steps.length).toBeGreaterThan(0);
|
|
29
|
+
expect(data.rules.length).toBeGreaterThan(0);
|
|
30
|
+
|
|
31
|
+
const human = await runCli(['build'], REPO);
|
|
32
|
+
expect(human.status).toBe(0);
|
|
33
|
+
const out = human.stdout;
|
|
34
|
+
|
|
35
|
+
expect(out).toContain(ascii(data.title));
|
|
36
|
+
for (const step of data.steps) {
|
|
37
|
+
expect(out).toContain(ascii(step.title));
|
|
38
|
+
if (step.returns) expect(out).toContain(ascii(step.returns));
|
|
39
|
+
}
|
|
40
|
+
for (const rule of data.rules) expect(out).toContain(ascii(rule));
|
|
41
|
+
|
|
42
|
+
/** @type {Array<{command: string, purpose?: string}>} */
|
|
43
|
+
const commands = [
|
|
44
|
+
...data.steps.flatMap((/** @type {any} */ s) => s.commands),
|
|
45
|
+
...data.related,
|
|
46
|
+
];
|
|
47
|
+
// Each command is one record whose field names are the JSON keys:
|
|
48
|
+
// `command:` (run with the caller's invocation), then `purpose:`.
|
|
49
|
+
const printed = out
|
|
50
|
+
.split('\n')
|
|
51
|
+
.filter(line => line.startsWith('command: '))
|
|
52
|
+
.map(line => line.slice('command: '.length).trim());
|
|
53
|
+
expect(printed).toHaveLength(commands.length);
|
|
54
|
+
commands.forEach(({command, purpose}, i) => {
|
|
55
|
+
expect(printed[i].endsWith(` ${command}`)).toBe(true);
|
|
56
|
+
if (purpose) expect(out).toContain(`purpose: ${ascii(purpose)}`);
|
|
57
|
+
});
|
|
58
|
+
// No column the handler drew itself.
|
|
59
|
+
expect(out).not.toMatch(/ {2,}# /);
|
|
60
|
+
}, SLOW);
|
|
61
|
+
|
|
62
|
+
it('names only commands this CLI registers', async () => {
|
|
63
|
+
const {stdout} = await runCli(['build', '--json'], REPO);
|
|
64
|
+
const {data} = JSON.parse(stdout);
|
|
65
|
+
const registered = new Set(program.commands.map(c => c.name()));
|
|
66
|
+
const commands = [
|
|
67
|
+
...data.steps.flatMap((/** @type {any} */ s) => s.commands),
|
|
68
|
+
...data.related,
|
|
69
|
+
];
|
|
70
|
+
expect(commands.length).toBeGreaterThan(0);
|
|
71
|
+
for (const {command} of commands) {
|
|
72
|
+
expect(registered.has(command.split(' ')[0])).toBe(true);
|
|
73
|
+
}
|
|
74
|
+
}, SLOW);
|
|
75
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `build "<idea>"` text output names only fields the `build.kit`
|
|
5
|
+
* envelope carries — on the kit itself or on its entries.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {describe, it, expect} from 'vitest';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import {fileURLToPath} from 'node:url';
|
|
11
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
12
|
+
|
|
13
|
+
// Run against the monorepo root so @astryxdesign/core is discoverable.
|
|
14
|
+
const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
|
|
15
|
+
const SLOW = 60_000;
|
|
16
|
+
|
|
17
|
+
describe('build kit text fields mirror the JSON keys', () => {
|
|
18
|
+
it('prints no field the envelope lacks', async () => {
|
|
19
|
+
const json = await runCli(['build', 'analytics dashboard', '--json', '--verbose'], REPO);
|
|
20
|
+
expect(json.status).toBe(0);
|
|
21
|
+
const {data} = JSON.parse(json.stdout);
|
|
22
|
+
const keys = new Set([
|
|
23
|
+
...Object.keys(data),
|
|
24
|
+
...Object.keys(data.start ?? {}),
|
|
25
|
+
...(data.start?.alternatives ?? []).flatMap(a => Object.keys(a)),
|
|
26
|
+
...[...data.pages, ...data.blocks, ...data.domain].flatMap(e => Object.keys(e)),
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
const human = await runCli(['build', 'analytics dashboard', '--verbose'], REPO);
|
|
30
|
+
expect(human.status).toBe(0);
|
|
31
|
+
const fields = [
|
|
32
|
+
...new Set(
|
|
33
|
+
human.stdout
|
|
34
|
+
.split('\n')
|
|
35
|
+
.map(line => /^([A-Za-z]+):\s/.exec(line)?.[1])
|
|
36
|
+
.filter(Boolean),
|
|
37
|
+
),
|
|
38
|
+
];
|
|
39
|
+
expect(fields).toContain('frame');
|
|
40
|
+
// The start is printed as a record, so its fields are checked too.
|
|
41
|
+
expect(fields).toContain('command');
|
|
42
|
+
expect(fields).toContain('displayName');
|
|
43
|
+
for (const field of fields) expect(keys).toContain(field);
|
|
44
|
+
}, SLOW);
|
|
45
|
+
|
|
46
|
+
it('leads with the start, then the alternatives, blocks and components', async () => {
|
|
47
|
+
const human = await runCli(['build', 'analytics dashboard'], REPO);
|
|
48
|
+
expect(human.status).toBe(0);
|
|
49
|
+
const headings = human.stdout
|
|
50
|
+
.split('\n')
|
|
51
|
+
.filter(line => /^(TEMPLATE|OTHER TEMPLATES|BLOCKS|COMPONENTS)$/.test(line));
|
|
52
|
+
expect(headings).toEqual(['TEMPLATE', 'OTHER TEMPLATES', 'BLOCKS', 'COMPONENTS']);
|
|
53
|
+
// A builder changing a page they already have keeps it.
|
|
54
|
+
expect(human.stdout).toContain(
|
|
55
|
+
'Changing a page you already have? Keep it, and use only the blocks and components.',
|
|
56
|
+
);
|
|
57
|
+
}, SLOW);
|
|
58
|
+
|
|
59
|
+
it("shortens the start's description by default and prints it whole under --verbose", async () => {
|
|
60
|
+
const json = await runCli(['build', 'quarterly revenue dashboard', '--json'], REPO);
|
|
61
|
+
const {start} = JSON.parse(json.stdout).data;
|
|
62
|
+
const first = start.description.slice(0, start.description.indexOf('. ') + 1);
|
|
63
|
+
expect(first.length).toBeGreaterThan(0);
|
|
64
|
+
expect(first.length).toBeLessThan(start.description.length);
|
|
65
|
+
const line = out => out.split('\n').find(l => l.startsWith('description:'));
|
|
66
|
+
const brief = await runCli(['build', 'quarterly revenue dashboard'], REPO);
|
|
67
|
+
expect(line(brief.stdout)).toBe(`description: ${first}`);
|
|
68
|
+
const whole = await runCli(['build', 'quarterly revenue dashboard', '--verbose'], REPO);
|
|
69
|
+
expect(whole.stdout).toContain(start.description);
|
|
70
|
+
}, SLOW);
|
|
71
|
+
|
|
72
|
+
it("names search's page matches in the default text", async () => {
|
|
73
|
+
const json = await runCli(['build', 'contact form', '--json'], REPO);
|
|
74
|
+
const {data} = JSON.parse(json.stdout);
|
|
75
|
+
expect(data.pages.length).toBeGreaterThan(0);
|
|
76
|
+
const human = await runCli(['build', 'contact form'], REPO);
|
|
77
|
+
expect(human.stdout).toContain(
|
|
78
|
+
`Keyword search matched these page templates: ${data.pages.map(p => p.name).join(', ')}.`,
|
|
79
|
+
);
|
|
80
|
+
}, SLOW);
|
|
81
|
+
});
|
|
@@ -26,7 +26,6 @@ import {defineCommand} from '../../lib/define-command.mjs';
|
|
|
26
26
|
import {resultSet} from '../../../../foundation/debug/index.mjs';
|
|
27
27
|
import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
|
|
28
28
|
import {component as componentApi} from '../../../../api/component/component.mjs';
|
|
29
|
-
import {findRelatedBlocks} from '../../../../api/template/template.mjs';
|
|
30
29
|
import {Project} from '../../../../foundation/config/project.mjs';
|
|
31
30
|
import {warnOnIntegrationIssues} from '../../../../foundation/integrations/integration-warnings.mjs';
|
|
32
31
|
import {doc as componentCommand} from '../component.doc.mjs';
|
|
@@ -112,7 +111,7 @@ export function registerComponent(program) {
|
|
|
112
111
|
// doctor integration validate. Best-effort; suppressed in --json mode.
|
|
113
112
|
try {
|
|
114
113
|
const project = await Project.load(process.cwd());
|
|
115
|
-
await warnOnIntegrationIssues(project
|
|
114
|
+
await warnOnIntegrationIssues(project, {json});
|
|
116
115
|
} catch {
|
|
117
116
|
// Never let the nudge break the command.
|
|
118
117
|
}
|
|
@@ -235,18 +234,14 @@ export function registerComponent(program) {
|
|
|
235
234
|
case 'component.detail': {
|
|
236
235
|
const resolvedName = (name || '').replace(/^XDS/, '');
|
|
237
236
|
const importHint = result.data.import;
|
|
237
|
+
if (result.data.parentDoc) emit(record(result.data, {fields: ['parentDoc']}));
|
|
238
238
|
const doc =
|
|
239
239
|
detail === 'brief'
|
|
240
240
|
? code(formatBrief(result.data, resolvedName, importHint, {themeData}))
|
|
241
241
|
: detail === 'compact'
|
|
242
242
|
? code(formatCompact(result.data, resolvedName, importHint))
|
|
243
243
|
: code(formatFull(result.data, {themeData, importHint}));
|
|
244
|
-
|
|
245
|
-
emit(
|
|
246
|
-
doc,
|
|
247
|
-
related.length > 0 && section('Related block templates'),
|
|
248
|
-
related.length > 0 && records(related, {fields: ['dirName', 'description']}),
|
|
249
|
-
);
|
|
244
|
+
emit(doc);
|
|
250
245
|
break;
|
|
251
246
|
}
|
|
252
247
|
|
|
@@ -71,7 +71,7 @@ function createFixture({
|
|
|
71
71
|
);
|
|
72
72
|
fs.writeFileSync(
|
|
73
73
|
path.join(compDir, 'MetaAppShell.doc.mjs'),
|
|
74
|
-
`export
|
|
74
|
+
`export default {\n type: 'component',\n name: 'MetaAppShell',\n usage: { description: 'Meta-flavored app shell.' },\n props: [{ name: 'title', type: 'string', description: 'Header title' }],\n};\n`,
|
|
75
75
|
);
|
|
76
76
|
if (withSource) {
|
|
77
77
|
fs.writeFileSync(
|
|
@@ -82,7 +82,7 @@ function createFixture({
|
|
|
82
82
|
if (extraComponent) {
|
|
83
83
|
fs.writeFileSync(
|
|
84
84
|
path.join(compDir, `${extraComponent}.doc.mjs`),
|
|
85
|
-
`export
|
|
85
|
+
`export default {\n type: 'component',\n name: '${extraComponent}',\n usage: { description: '${extraComponent} from meta.' },\n props: [],\n};\n`,
|
|
86
86
|
);
|
|
87
87
|
fs.writeFileSync(
|
|
88
88
|
path.join(compDir, `${extraComponent}.tsx`),
|
|
@@ -100,7 +100,7 @@ function createFixture({
|
|
|
100
100
|
: '';
|
|
101
101
|
fs.writeFileSync(
|
|
102
102
|
path.join(entryDir, `${entryPoint.component}.doc.mjs`),
|
|
103
|
-
`export
|
|
103
|
+
`export default {\n type: 'component',\n name: '${entryPoint.component}',${ownSpecifier}\n usage: { description: '${entryPoint.component} from an entry point.' },\n props: [],\n};\n`,
|
|
104
104
|
);
|
|
105
105
|
}
|
|
106
106
|
|
|
@@ -5,6 +5,7 @@ import * as fs from 'node:fs';
|
|
|
5
5
|
import * as path from 'node:path';
|
|
6
6
|
import * as os from 'node:os';
|
|
7
7
|
import {component} from '../../../api/component/component.mjs';
|
|
8
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
8
9
|
|
|
9
10
|
// These tests create a minimal monorepo fixture with:
|
|
10
11
|
// - packages/core (symlinked to real @astryxdesign/core for loadDocs compatibility)
|
|
@@ -120,4 +121,49 @@ describe('component() with --package option', () => {
|
|
|
120
121
|
expect(result.data.source).toContain('ProfileCardShowcase');
|
|
121
122
|
expect(result.data.aspectRatio).toBeCloseTo(16 / 9);
|
|
122
123
|
});
|
|
124
|
+
|
|
125
|
+
// A legacy package ships docs only: --source and --blocks answer the same
|
|
126
|
+
// way scoped as unscoped, never falling back to the plain doc.
|
|
127
|
+
it('--package + --source reports the missing source, like the unscoped lookup', async () => {
|
|
128
|
+
await expect(
|
|
129
|
+
component('ProfileCard', {cwd: tmpDir, source: true}),
|
|
130
|
+
).rejects.toMatchObject({code: 'ERR_NO_SOURCE'});
|
|
131
|
+
await expect(
|
|
132
|
+
component('ProfileCard', {cwd: tmpDir, package: '@test/ext', source: true}),
|
|
133
|
+
).rejects.toMatchObject({code: 'ERR_NO_SOURCE'});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('--package + --blocks returns the blocks, like the unscoped lookup', async () => {
|
|
137
|
+
const unscoped = await component('ProfileCard', {cwd: tmpDir, blocks: true});
|
|
138
|
+
const scoped = await component('ProfileCard', {cwd: tmpDir, package: '@test/ext', blocks: true});
|
|
139
|
+
expect(scoped.type).toBe('component.detail.blocks');
|
|
140
|
+
expect(scoped.data).toEqual(unscoped.data);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// `cwd` is an explicit API input: --blocks must discover from it, as
|
|
144
|
+
// --showcase does, not from the process working directory.
|
|
145
|
+
it('--blocks discovers blocks from options.cwd, like --showcase', async () => {
|
|
146
|
+
const showcase = await component('ProfileCard', {cwd: tmpDir, showcase: true});
|
|
147
|
+
expect(showcase.data.source).toContain('ProfileCardShowcase');
|
|
148
|
+
|
|
149
|
+
const blocks = await component('ProfileCard', {cwd: tmpDir, blocks: true});
|
|
150
|
+
expect(blocks.type).toBe('component.detail.blocks');
|
|
151
|
+
expect(blocks.data.showcase?.name).toBe('ProfileCardShowcase');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// List and detail report one import for a legacy package component; the
|
|
155
|
+
// text list projects the JSON value instead of deriving a Core path.
|
|
156
|
+
it('the names list gives a legacy package component the import its detail reports', async () => {
|
|
157
|
+
const detail = await component('ProfileCard', {cwd: tmpDir});
|
|
158
|
+
const list = await component(undefined, {cwd: tmpDir, list: true});
|
|
159
|
+
const entry = Object.values(list.data.components)
|
|
160
|
+
.flat()
|
|
161
|
+
.find(e => e.name === 'ProfileCard' && e.package === '@test/ext');
|
|
162
|
+
expect(entry?.import).toBe(detail.data.import);
|
|
163
|
+
|
|
164
|
+
const text = await runCli(['component', '--list'], tmpDir);
|
|
165
|
+
expect(text.code).toBe(0);
|
|
166
|
+
expect(text.stdout).toContain(`name: ProfileCard\nimport: ${detail.data.import} [@test/ext]`);
|
|
167
|
+
expect(text.stdout).not.toMatch(/^import: +@astryxdesign\/core\S* +\[@test\/ext\]$/m);
|
|
168
|
+
});
|
|
123
169
|
});
|