@astryxdesign/cli 0.6.4 → 0.6.5-canary.031021b
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 +56 -0
- package/README.md +97 -90
- package/api/build/build.doc.mjs +6 -1
- package/api/build/build.test.mjs +22 -0
- package/api/build/kit/kit.mjs +44 -5
- package/api/component/_adapter.d.mts +25 -0
- package/api/component/_adapter.mjs +59 -5
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +37 -17
- package/api/component/component.mjs +249 -9
- package/api/component/component.type.d.mts +25 -0
- package/api/component/component.type.mjs +44 -0
- 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 +61 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +147 -8
- package/api/discover/discover.type.mjs +102 -12
- 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 +8 -3
- package/api/docs/_adapter.mjs +14 -6
- package/api/docs/docOverlays.test.mjs +27 -1
- package/api/docs/docs.doc.mjs +2 -2
- package/api/doctor/doctor.d.mts +8 -3
- package/api/doctor/doctor.doc.mjs +17 -8
- package/api/doctor/doctor.mjs +90 -9
- package/api/doctor/doctor.test.mjs +122 -10
- package/api/doctor/doctor.type.d.mts +1 -1
- package/api/doctor/doctor.type.mjs +1 -1
- package/api/gap-report/gap-report.doc.mjs +19 -10
- package/api/hook/hook.doc.mjs +6 -3
- package/api/index.d.mts +1 -0
- package/api/index.mjs +5 -3
- package/api/init/init.doc.mjs +17 -12
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +22 -1
- package/api/integration/add-theme.test.mjs +34 -0
- package/api/integration/authoring-checks.mjs +2 -2
- package/api/integration/integrationPackCheck.doc.mjs +3 -3
- package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
- package/api/integration/pack-check.mjs +82 -9
- package/api/integration/pack-check.test.mjs +90 -0
- package/api/integration/pack-check.type.mjs +1 -1
- package/api/json/assertResponse.doc.mjs +1 -1
- package/api/json/isError.doc.mjs +1 -1
- package/api/search/search.d.mts +27 -1
- package/api/search/search.doc.mjs +2 -2
- package/api/search/search.mjs +228 -16
- package/api/swizzle/swizzle.doc.mjs +7 -5
- package/api/template/copy/copy.mjs +1 -1
- package/api/template/copy/copy.test.mjs +9 -0
- package/api/template/template.doc.mjs +2 -1
- package/api/theme/add/add.mjs +17 -25
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +40 -23
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +8 -18
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/generateTonalPalette.doc.mjs +1 -2
- package/api/theme/listThemes.doc.mjs +1 -1
- package/api/theme/themeAdd.doc.mjs +9 -10
- package/api/theme/themeBuild.doc.mjs +13 -13
- package/api/theme/themeList.doc.mjs +1 -1
- package/api/theme/themeListAvailable.doc.mjs +2 -1
- package/api/theme/themePaletteGenerate.doc.mjs +15 -8
- package/api/theme/themeTargets.doc.mjs +3 -2
- package/api/theme/themeTemplate.doc.mjs +2 -1
- package/api/upgrade/run/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +5 -3
- package/api/upgrade/upgrade.doc.mjs +24 -22
- package/api/upgrade/upgrade.type.mjs +2 -2
- package/assets/codemods/__tests__/runner.test.mjs +3 -1
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-runner.mjs +3 -3
- package/assets/codemods/runner.mjs +5 -4
- package/assets/docs/README.md +4 -2
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +8 -2
- package/assets/docs/elevation.doc.mjs +6 -4
- package/assets/docs/getting-started.doc.mjs +5 -16
- package/assets/docs/icons.doc.mjs +2 -21
- package/assets/docs/illustrations.doc.mjs +7 -15
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +130 -82
- package/assets/docs/layout.doc.mjs +133 -77
- package/assets/docs/migration.doc.mjs +19 -21
- package/assets/docs/motion.doc.mjs +16 -3
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +8 -0
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +8 -3
- package/assets/docs/spacing.doc.mjs +7 -2
- package/assets/docs/styling-libraries.doc.mjs +6 -2
- package/assets/docs/styling.doc.mjs +19 -23
- package/assets/docs/theme.doc.dense.mjs +58 -18
- package/assets/docs/theme.doc.mjs +57 -47
- package/assets/docs/theme.doc.zh.mjs +9 -8
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +389 -8
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/add-a-component.doc.mjs +75 -0
- package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
- package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
- package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
- package/assets/docs/tree/block-template.doc.mjs +130 -0
- package/assets/docs/tree/build-the-template.doc.mjs +28 -0
- package/assets/docs/tree/building-blocks.doc.mjs +46 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
- package/assets/docs/tree/checks.doc.mjs +119 -0
- package/assets/docs/tree/codemods.doc.mjs +147 -0
- package/assets/docs/tree/component-family.doc.mjs +113 -0
- package/assets/docs/tree/component-imports.doc.mjs +69 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/tree/components.doc.mjs +23 -0
- package/assets/docs/tree/configuration.doc.mjs +23 -0
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
- package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
- package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
- package/assets/docs/tree/docs.doc.mjs +21 -0
- package/assets/docs/tree/document-the-template.doc.mjs +28 -0
- package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
- package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
- package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
- package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
- package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
- package/assets/docs/tree/help.doc.mjs +16 -0
- package/assets/docs/tree/integrations.doc.mjs +25 -451
- package/assets/docs/tree/links.doc.mjs +98 -0
- package/assets/docs/tree/package-and-test.doc.mjs +32 -0
- package/assets/docs/tree/page-template.doc.mjs +71 -0
- package/assets/docs/tree/publishing.doc.mjs +111 -0
- package/assets/docs/tree/quick-start.doc.mjs +272 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
- package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
- package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
- package/assets/docs/tree/ship.doc.mjs +16 -0
- package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
- package/assets/docs/tree/single-component.doc.mjs +165 -0
- package/assets/docs/tree/start-a-template.doc.mjs +143 -0
- package/assets/docs/tree/subcomponent.doc.mjs +115 -0
- package/assets/docs/tree/template-assets.doc.mjs +64 -0
- package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
- package/assets/docs/tree/template-fonts.doc.mjs +102 -0
- package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
- package/assets/docs/tree/template-icons.doc.mjs +97 -0
- package/assets/docs/tree/template-images-media.doc.mjs +127 -0
- package/assets/docs/tree/template-styles.doc.mjs +93 -0
- package/assets/docs/tree/templates.doc.mjs +34 -0
- package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
- package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
- package/assets/docs/tree/themes.doc.mjs +39 -0
- package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
- package/assets/docs/tree/upgrading.doc.mjs +103 -0
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
- package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
- package/assets/docs/tree/versioning.doc.mjs +161 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
- package/assets/docs/typography.doc.mjs +24 -4
- package/assets/docs/working-with-ai.doc.mjs +30 -22
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/authoring/config/config.doc.mjs +9 -1
- package/authoring/config/parse.d.mts +2 -0
- package/authoring/config/parse.mjs +19 -0
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +11 -0
- 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 +3 -2
- package/authoring/doctypes/_schema.mjs +6 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
- package/authoring/doctypes/base/type.ts +4 -2
- package/authoring/doctypes/component/component.doc.mjs +6 -0
- package/authoring/doctypes/component/type.ts +8 -0
- package/authoring/doctypes/reference/reference.doc.mjs +7 -0
- package/authoring/doctypes/reference/type.ts +5 -0
- package/authoring/doctypes/schema/schema.doc.mjs +2 -2
- package/authoring/doctypes/template/template.doc.mjs +1 -1
- package/authoring/doctypes/template/type.ts +2 -2
- package/authoring/index.d.mts +1 -0
- package/authoring/index.d.ts +10 -0
- package/authoring/index.mjs +1 -0
- package/authoring/integration/integration.doc.mjs +12 -10
- package/clients/cli/commands/component/index.mjs +152 -55
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +89 -0
- package/clients/cli/commands/component.doc.mjs +27 -9
- package/clients/cli/commands/discover.doc.mjs +53 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/docs.doc.mjs +1 -1
- package/clients/cli/commands/docs.mjs +60 -17
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -2
- package/clients/cli/commands/doctor-integration.test.mjs +53 -0
- package/clients/cli/commands/doctor.doc.mjs +3 -1
- package/clients/cli/commands/doctor.mjs +49 -5
- package/clients/cli/commands/gap-report.doc.mjs +10 -9
- package/clients/cli/commands/init.doc.mjs +9 -6
- package/clients/cli/commands/integration-add.doc.mjs +9 -9
- package/clients/cli/commands/integration-authoring.test.mjs +61 -10
- package/clients/cli/commands/integration-pack.doc.mjs +5 -9
- package/clients/cli/commands/integration-real-world.test.mjs +1 -1
- package/clients/cli/commands/integration-verify.doc.mjs +22 -0
- package/clients/cli/commands/integration.doc.mjs +4 -4
- package/clients/cli/commands/integration.mjs +74 -43
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/search.doc.mjs +10 -3
- package/clients/cli/commands/search.mjs +21 -2
- package/clients/cli/commands/search.test.mjs +21 -4
- package/clients/cli/commands/swizzle.doc.mjs +1 -1
- package/clients/cli/commands/template.doc.mjs +1 -1
- package/clients/cli/commands/text-json-parity.test.mjs +7 -1
- package/clients/cli/commands/theme-add.doc.mjs +1 -1
- package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -2
- package/clients/cli/commands/theme-palette.doc.mjs +1 -2
- package/clients/cli/commands/theme-targets.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +62 -3
- package/clients/cli/index.mjs +28 -6
- package/clients/cli/lib/define-command.mjs +28 -4
- package/clients/cli/lib/define-command.test.mjs +54 -0
- package/clients/cli/lib/exit-codes.test.mjs +17 -1
- package/clients/cli/lib/json-shim.mjs +24 -14
- package/clients/cli/lib/manifest.mjs +18 -5
- package/clients/cli/lib/manifest.test.mjs +5 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.mjs +1 -1
- package/foundation/discovery/authoring-self-docs.mjs +1 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +6 -2
- package/foundation/discovery/cli-self-docs.mjs +16 -2
- package/foundation/discovery/cli-self-docs.test.mjs +20 -0
- package/foundation/discovery/docs-discovery.mjs +5 -1
- package/foundation/discovery/docs-discovery.test.mjs +21 -0
- package/foundation/discovery/docs-section-key.d.mts +1 -1
- package/foundation/discovery/docs-section-key.mjs +1 -1
- package/foundation/doc-compiler/doc-loads.test.mjs +3 -2
- package/foundation/doc-compiler/inputs.test.mjs +0 -1
- package/foundation/doc-compiler/tree.d.mts +4 -0
- package/foundation/doc-compiler/tree.mjs +6 -1
- package/foundation/integrations/cli-requirement.d.mts +26 -6
- package/foundation/integrations/cli-requirement.mjs +46 -11
- package/foundation/integrations/cli-requirement.test.mjs +7 -2
- package/foundation/integrations/contribution-inventory.mjs +1 -1
- package/foundation/integrations/integrations.d.mts +14 -1
- package/foundation/integrations/integrations.mjs +41 -1
- package/foundation/integrations/integrations.test.mjs +31 -0
- package/foundation/response/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- package/foundation/response/error-codes.doc.mjs +6 -8
- package/foundation/response/error-codes.test.mjs +30 -5
- package/foundation/response/response-types.doc.d.mts +4 -3
- package/foundation/response/response-types.doc.mjs +40 -10
- package/foundation/response/response-types.doc.test.mjs +23 -0
- package/foundation/response/response.doc.mjs +11 -10
- package/package.json +9 -9
- package/api/docs/docs.test.mjs +0 -243
- package/api/docs/integration-tree.test.mjs +0 -555
- package/api/docs/integrationDocs.test.mjs +0 -314
- package/api/search/search.test.mjs +0 -512
- package/assets/docs/tree/integrations.test.mjs +0 -62
- package/assets/docs/tree/writing-docs.doc.mjs +0 -286
- package/clients/cli/commands/docs.test.mjs +0 -294
- package/foundation/agent-docs/agent-docs.test.mjs +0 -1159
- package/foundation/doc-compiler/tree.test.mjs +0 -598
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @file discover command —
|
|
4
|
+
* @file discover command — browse the integrations you have and could add
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
* astryx discover List
|
|
8
|
-
* astryx discover @scope/name
|
|
9
|
-
* astryx discover @scope/name/Component Show docs for
|
|
10
|
-
* astryx discover
|
|
7
|
+
* astryx discover List installed and available packages
|
|
8
|
+
* astryx discover @scope/name[@version] One package, with its versions
|
|
9
|
+
* astryx discover @scope/name/Component Show docs for an installed component
|
|
10
|
+
* astryx discover @scope/name/<item> One item a package adds
|
|
11
|
+
* astryx discover searchterm Search every item and package
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
formatFull,
|
|
16
|
+
formatBrief,
|
|
17
|
+
formatCompact,
|
|
18
|
+
} from '../lib/component-format.mjs';
|
|
14
19
|
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
15
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
emit,
|
|
22
|
+
section,
|
|
23
|
+
text,
|
|
24
|
+
record,
|
|
25
|
+
records,
|
|
26
|
+
list,
|
|
27
|
+
code,
|
|
28
|
+
} from '../formatters/index.mjs';
|
|
16
29
|
import {cliError} from '../lib/cli-error.mjs';
|
|
17
30
|
import {discover as discoverApi} from '../../../api/discover/discover.mjs';
|
|
18
31
|
import {Project} from '../../../foundation/config/project.mjs';
|
|
@@ -23,25 +36,70 @@ import {resultSet} from '../../../foundation/debug/index.mjs';
|
|
|
23
36
|
import {doc as discoverCommand} from './discover.doc.mjs';
|
|
24
37
|
import {doc as discoverFn} from '../../../api/discover/discover.doc.mjs';
|
|
25
38
|
|
|
26
|
-
// Max
|
|
27
|
-
const
|
|
39
|
+
// Max items to list inline per package before summarizing with "+N more".
|
|
40
|
+
const MAX_ITEMS_SHOWN = 10;
|
|
41
|
+
|
|
42
|
+
/** @type {Record<string, string>} */
|
|
43
|
+
const KIND_PLURALS = {
|
|
44
|
+
component: 'components',
|
|
45
|
+
template: 'templates',
|
|
46
|
+
doc: 'docs',
|
|
47
|
+
theme: 'themes',
|
|
48
|
+
codemod: 'codemods',
|
|
49
|
+
'agent-doc': 'agent docs',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// The list fields that hold item names, summarized in the package list.
|
|
53
|
+
const ITEM_FIELDS = [
|
|
54
|
+
'components',
|
|
55
|
+
'templates',
|
|
56
|
+
'docs',
|
|
57
|
+
'themes',
|
|
58
|
+
'codemods',
|
|
59
|
+
'agentDocs',
|
|
60
|
+
];
|
|
28
61
|
|
|
29
62
|
/**
|
|
30
|
-
*
|
|
31
|
-
* project has configured, so the top two views count PACKAGES; naming a
|
|
32
|
-
* component inside one answers with that component instead.
|
|
33
|
-
*
|
|
34
|
-
* @param {import('../../../api/discover/discover.type.mjs').DiscoverListResponse
|
|
63
|
+
* @typedef {import('../../../api/discover/discover.type.mjs').DiscoverListResponse
|
|
35
64
|
* | import('../../../api/discover/discover.type.mjs').DiscoverDetailResponse
|
|
36
65
|
* | import('../../../api/discover/discover.type.mjs').DiscoverDetailDocResponse
|
|
37
|
-
* | import('../../../api/discover/discover.type.mjs').
|
|
66
|
+
* | import('../../../api/discover/discover.type.mjs').DiscoverItemResponse
|
|
67
|
+
* | import('../../../api/discover/discover.type.mjs').DiscoverSearchResponse} DiscoverResult
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
/** @type {Record<string, import('../../../foundation/debug/command-result.mjs').ResultSetKind>} */
|
|
71
|
+
const RESULT_KINDS = {
|
|
72
|
+
package: 'integration',
|
|
73
|
+
component: 'component',
|
|
74
|
+
template: 'template',
|
|
75
|
+
doc: 'doc',
|
|
76
|
+
theme: 'theme',
|
|
77
|
+
codemod: 'migration',
|
|
78
|
+
'agent-doc': 'doc',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The run-log kind for a set of item kinds: the one kind, or `mixed`.
|
|
83
|
+
* @param {string[]} kinds
|
|
84
|
+
* @returns {import('../../../foundation/debug/command-result.mjs').ResultSetKind}
|
|
85
|
+
*/
|
|
86
|
+
function resultKindOf(kinds) {
|
|
87
|
+
const mapped = new Set(kinds.map(kind => RESULT_KINDS[kind] ?? 'mixed'));
|
|
88
|
+
return mapped.size === 1 ? [...mapped][0] : 'mixed';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* What the run answered with. The list and package views count PACKAGES;
|
|
93
|
+
* naming a component or item answers with that item instead.
|
|
94
|
+
*
|
|
95
|
+
* @param {DiscoverResult} result
|
|
38
96
|
* @returns {import('../../../foundation/debug/command-result.mjs').CommandResult}
|
|
39
97
|
*/
|
|
40
98
|
function summarize(result) {
|
|
41
99
|
switch (result.type) {
|
|
42
100
|
case 'discover.list':
|
|
43
101
|
return resultSet({
|
|
44
|
-
count: result.data.length,
|
|
102
|
+
count: result.data.length + (result.meta?.available?.length ?? 0),
|
|
45
103
|
resultKind: 'integration',
|
|
46
104
|
});
|
|
47
105
|
case 'discover.detail':
|
|
@@ -52,14 +110,96 @@ function summarize(result) {
|
|
|
52
110
|
});
|
|
53
111
|
case 'discover.detail.doc':
|
|
54
112
|
return resultSet({count: 1, resultKind: 'component', directMatch: true});
|
|
113
|
+
case 'discover.item':
|
|
114
|
+
return resultSet({
|
|
115
|
+
count: 1,
|
|
116
|
+
resultKind: resultKindOf([result.data.kind]),
|
|
117
|
+
directMatch: true,
|
|
118
|
+
});
|
|
55
119
|
case 'discover.search':
|
|
56
120
|
return resultSet({
|
|
57
|
-
count: result.data.matches.length,
|
|
58
|
-
resultKind:
|
|
121
|
+
count: result.data.total ?? result.data.matches.length,
|
|
122
|
+
resultKind: resultKindOf(result.data.matches.map(m => m.kind)),
|
|
59
123
|
});
|
|
60
124
|
}
|
|
61
125
|
}
|
|
62
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Record options that summarize each item list to its first names.
|
|
129
|
+
* @param {boolean} full print every name instead
|
|
130
|
+
* @returns {import('../formatters/index.mjs').RecordOptions}
|
|
131
|
+
*/
|
|
132
|
+
function itemListOptions(full) {
|
|
133
|
+
if (full) return {};
|
|
134
|
+
/** @param {string[]} names */
|
|
135
|
+
const summary = names => {
|
|
136
|
+
const shown = names.slice(0, MAX_ITEMS_SHOWN);
|
|
137
|
+
const remaining = names.length - MAX_ITEMS_SHOWN;
|
|
138
|
+
return remaining > 0
|
|
139
|
+
? `${shown.join(', ')}, +${remaining} more`
|
|
140
|
+
: shown.join(', ');
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
format: Object.fromEntries(ITEM_FIELDS.map(field => [field, summary])),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* One line per source that did not answer live.
|
|
149
|
+
* @param {import('../../../api/discover/discover.type.mjs').DiscoverSourceState[]} sources
|
|
150
|
+
*/
|
|
151
|
+
function sourceNotes(sources) {
|
|
152
|
+
return sources
|
|
153
|
+
.filter(s => s.status !== 'fresh')
|
|
154
|
+
.map(s =>
|
|
155
|
+
s.status === 'saved'
|
|
156
|
+
? text(
|
|
157
|
+
`The discover source from ${s.from} did not answer (${s.error}), so this uses the copy saved ${s.savedAt}.`,
|
|
158
|
+
)
|
|
159
|
+
: text(`The discover source from ${s.from} is unavailable: ${s.error}`),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @param {import('../../../api/discover/discover.type.mjs').DiscoverSourceState[]} sources
|
|
165
|
+
*/
|
|
166
|
+
function sourceSubtitle(sources) {
|
|
167
|
+
const answered = sources.filter(s => s.status !== 'failed');
|
|
168
|
+
if (answered.length === 0) return undefined;
|
|
169
|
+
return (
|
|
170
|
+
'from ' +
|
|
171
|
+
answered
|
|
172
|
+
.map(
|
|
173
|
+
s =>
|
|
174
|
+
`${s.name}${s.generatedAt ? ` (${s.generatedAt.slice(0, 10)})` : ''}`,
|
|
175
|
+
)
|
|
176
|
+
.join(', ')
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @param {import('../../../authoring/discover/type').DiscoverVersion[]} versions
|
|
182
|
+
* @param {{shown?: string, installed?: string, latest?: string}} marks
|
|
183
|
+
*/
|
|
184
|
+
function versionLines(versions, marks) {
|
|
185
|
+
return versions
|
|
186
|
+
.filter(v => !v.prerelease || v.version === marks.shown)
|
|
187
|
+
.map(v => {
|
|
188
|
+
const tags = [
|
|
189
|
+
v.version === marks.latest ? 'latest' : '',
|
|
190
|
+
v.version === marks.installed ? 'installed' : '',
|
|
191
|
+
v.version === marks.shown &&
|
|
192
|
+
v.version !== marks.installed &&
|
|
193
|
+
v.version !== marks.latest
|
|
194
|
+
? 'shown'
|
|
195
|
+
: '',
|
|
196
|
+
v.status !== 'ok' ? v.status : '',
|
|
197
|
+
].filter(Boolean);
|
|
198
|
+
const date = v.publishedAt ? v.publishedAt.slice(0, 10) : 'date unknown';
|
|
199
|
+
return `${v.version} ${date}${tags.length ? ` ${tags.join(', ')}` : ''}`;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
63
203
|
/**
|
|
64
204
|
* @param {import('commander').Command} program
|
|
65
205
|
*/
|
|
@@ -69,120 +209,255 @@ export function registerDiscover(program) {
|
|
|
69
209
|
action:
|
|
70
210
|
/**
|
|
71
211
|
* @param {string | undefined} query
|
|
72
|
-
* @param {{components?: boolean}} options
|
|
212
|
+
* @param {{components?: boolean, type?: string, installed?: boolean, available?: boolean, limit?: string}} options
|
|
73
213
|
*/
|
|
74
214
|
async (query, options) => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
215
|
+
const detail = program.opts().detail || 'full';
|
|
216
|
+
const json = program.opts().json || false;
|
|
217
|
+
const lang = program.opts().lang || null;
|
|
218
|
+
const zh = program.opts().zh || false;
|
|
219
|
+
const run = getCliInvocation();
|
|
220
|
+
|
|
221
|
+
// Non-blocking nudge: if any configured integration has validation
|
|
222
|
+
// issues, print one compact line to stderr pointing at
|
|
223
|
+
// doctor integration validate. Best-effort; suppressed in --json mode.
|
|
224
|
+
try {
|
|
225
|
+
const project = await Project.load(process.cwd());
|
|
226
|
+
await warnOnIntegrationIssues(project, {json});
|
|
227
|
+
} catch {
|
|
228
|
+
// Never let the nudge break the command.
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** @type {DiscoverResult} */
|
|
232
|
+
let result;
|
|
233
|
+
try {
|
|
234
|
+
result = await discoverApi(query, {
|
|
235
|
+
components: options.components,
|
|
236
|
+
lang,
|
|
237
|
+
zh,
|
|
238
|
+
type: /** @type {any} */ (options.type),
|
|
239
|
+
installed: options.installed,
|
|
240
|
+
available: options.available,
|
|
241
|
+
// Number(), not parseInt(): the API refuses `1.5` and `5abc` itself.
|
|
242
|
+
limit: options.limit != null ? Number(options.limit) : undefined,
|
|
243
|
+
});
|
|
244
|
+
} catch (e) {
|
|
245
|
+
const err =
|
|
246
|
+
/** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
247
|
+
return cliError(err.message, {
|
|
248
|
+
suggestions: err.suggestions,
|
|
249
|
+
code: err.code,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const answered = summarize(result);
|
|
254
|
+
if (json) {
|
|
255
|
+
// Forward optional meta (e.g. configured flag for discover.list) as a
|
|
256
|
+
// sibling of data via jsonOut, so the envelope still carries
|
|
257
|
+
// apiVersion and goes through the single sanctioned emit path.
|
|
258
|
+
jsonOut(result);
|
|
259
|
+
return answered;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
switch (result.type) {
|
|
263
|
+
case 'discover.list': {
|
|
264
|
+
const listOpts = itemListOptions(Boolean(options.components));
|
|
265
|
+
const available = result.meta?.available;
|
|
266
|
+
const sources = result.meta?.sources ?? [];
|
|
107
267
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
268
|
+
// No discover source: the list of what this project has, as always.
|
|
269
|
+
if (available === undefined) {
|
|
270
|
+
if (result.data.length === 0) {
|
|
271
|
+
if (result.meta && result.meta.configured === false) {
|
|
272
|
+
emit(
|
|
273
|
+
text('No integrations configured.'),
|
|
274
|
+
text('Add integration package names to astryx.config.mjs:'),
|
|
275
|
+
code(
|
|
276
|
+
"export default {\n integrations: ['@scope/your-integration'],\n};",
|
|
277
|
+
),
|
|
278
|
+
);
|
|
279
|
+
} else {
|
|
280
|
+
emit(
|
|
281
|
+
text(
|
|
282
|
+
'No external components found in configured integrations.',
|
|
283
|
+
),
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
112
288
|
emit(
|
|
113
|
-
|
|
114
|
-
text(
|
|
115
|
-
|
|
116
|
-
|
|
289
|
+
records(result.data, listOpts),
|
|
290
|
+
text(
|
|
291
|
+
[
|
|
292
|
+
'Usage:',
|
|
293
|
+
` ${run} discover <package> Browse a package`,
|
|
294
|
+
` ${run} discover <package>/Component View component docs`,
|
|
295
|
+
` ${run} discover <search> Search all packages`,
|
|
296
|
+
].join('\n'),
|
|
117
297
|
),
|
|
118
298
|
);
|
|
119
|
-
|
|
120
|
-
emit(text('No external components found in configured integrations.'));
|
|
299
|
+
break;
|
|
121
300
|
}
|
|
301
|
+
|
|
302
|
+
const kind = options.type
|
|
303
|
+
? (KIND_PLURALS[options.type] ?? options.type)
|
|
304
|
+
: null;
|
|
305
|
+
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
306
|
+
const blocks = [];
|
|
307
|
+
if (!options.available) {
|
|
308
|
+
blocks.push(section('Installed'));
|
|
309
|
+
blocks.push(
|
|
310
|
+
result.data.length > 0
|
|
311
|
+
? records(result.data, listOpts)
|
|
312
|
+
: text(
|
|
313
|
+
kind
|
|
314
|
+
? `None of this project's integrations add ${kind}.`
|
|
315
|
+
: 'None yet.',
|
|
316
|
+
),
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
if (!options.installed) {
|
|
320
|
+
blocks.push(section('Available', sourceSubtitle(sources)));
|
|
321
|
+
blocks.push(
|
|
322
|
+
available.length > 0
|
|
323
|
+
? records(available, listOpts)
|
|
324
|
+
: text(
|
|
325
|
+
!sources.some(s => s.status !== 'failed')
|
|
326
|
+
? 'No source answered, so there is nothing to list.'
|
|
327
|
+
: kind
|
|
328
|
+
? `No package you could add adds ${kind}.`
|
|
329
|
+
: 'Nothing new to add: this project has every integration its sources list.',
|
|
330
|
+
),
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
blocks.push(...sourceNotes(sources));
|
|
334
|
+
blocks.push(
|
|
335
|
+
text(
|
|
336
|
+
[
|
|
337
|
+
'Usage:',
|
|
338
|
+
` ${run} discover <package> Browse a package and its versions`,
|
|
339
|
+
` ${run} discover <package>/<item> View one item`,
|
|
340
|
+
` ${run} discover <search> Search every item and package`,
|
|
341
|
+
].join('\n'),
|
|
342
|
+
),
|
|
343
|
+
);
|
|
344
|
+
emit(...blocks);
|
|
122
345
|
break;
|
|
123
346
|
}
|
|
124
347
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
348
|
+
case 'discover.detail': {
|
|
349
|
+
const d = result.data;
|
|
350
|
+
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
351
|
+
const blocks = [record(d, {omit: ['versions', 'install']})];
|
|
352
|
+
if (d.versions) {
|
|
353
|
+
const shown = d.version;
|
|
354
|
+
const lines = versionLines(d.versions, {
|
|
355
|
+
shown,
|
|
356
|
+
installed: d.installed
|
|
357
|
+
? (d.installedVersion ?? d.version)
|
|
358
|
+
: undefined,
|
|
359
|
+
latest: d.latest,
|
|
360
|
+
});
|
|
361
|
+
const prereleases = d.versions.filter(v => v.prerelease).length;
|
|
362
|
+
blocks.push(
|
|
363
|
+
section(
|
|
364
|
+
'Versions',
|
|
365
|
+
`${d.versions.length} published, newest first`,
|
|
366
|
+
),
|
|
367
|
+
);
|
|
368
|
+
if (lines.length > 0) blocks.push(list(lines));
|
|
369
|
+
if (prereleases > 0) {
|
|
370
|
+
blocks.push(
|
|
371
|
+
text(
|
|
372
|
+
`${prereleases === 1 ? '1 prerelease is' : `${prereleases} prereleases are`} not listed. See any version: ${run} discover ${d.name}@<version>`,
|
|
373
|
+
),
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (d.install) {
|
|
378
|
+
blocks.push(
|
|
379
|
+
section('Add it'),
|
|
380
|
+
code(d.install),
|
|
381
|
+
text(
|
|
382
|
+
'Astryx loads an integration on the next command once it is a dependency.',
|
|
383
|
+
),
|
|
384
|
+
);
|
|
385
|
+
} else if (d.installedAs) {
|
|
386
|
+
blocks.push(
|
|
387
|
+
text(
|
|
388
|
+
`This project already has this integration as ${d.installedAs}.`,
|
|
389
|
+
),
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
blocks.push(
|
|
393
|
+
text(
|
|
394
|
+
d.installed
|
|
395
|
+
? `Usage: ${run} discover ${d.name}/<ComponentName>`
|
|
396
|
+
: `See one item: ${run} discover ${d.name}/<item>`,
|
|
397
|
+
),
|
|
398
|
+
);
|
|
399
|
+
emit(...blocks);
|
|
400
|
+
break;
|
|
140
401
|
}
|
|
141
|
-
emit(
|
|
142
|
-
records(result.data, listOpts),
|
|
143
|
-
text(
|
|
144
|
-
[
|
|
145
|
-
'Usage:',
|
|
146
|
-
` ${run} discover <package> Browse a package`,
|
|
147
|
-
` ${run} discover <package>/Component View component docs`,
|
|
148
|
-
` ${run} discover <search> Search all packages`,
|
|
149
|
-
].join('\n'),
|
|
150
|
-
),
|
|
151
|
-
);
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
402
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
403
|
+
case 'discover.detail.doc': {
|
|
404
|
+
const docs = result.data;
|
|
405
|
+
const md =
|
|
406
|
+
detail === 'brief'
|
|
407
|
+
? formatBrief(docs, docs.name, '')
|
|
408
|
+
: detail === 'compact'
|
|
409
|
+
? formatCompact(docs, docs.name, '')
|
|
410
|
+
: formatFull(docs);
|
|
411
|
+
emit(code(md));
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
163
414
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
415
|
+
case 'discover.item': {
|
|
416
|
+
const d = result.data;
|
|
417
|
+
emit(
|
|
418
|
+
record(d, {omit: ['install']}),
|
|
419
|
+
...(d.install
|
|
420
|
+
? [
|
|
421
|
+
section('Add it'),
|
|
422
|
+
code(d.install),
|
|
423
|
+
text(
|
|
424
|
+
'Astryx loads an integration on the next command once it is a dependency.',
|
|
425
|
+
),
|
|
426
|
+
]
|
|
427
|
+
: []),
|
|
428
|
+
text(`Its package: ${run} discover ${d.package}`),
|
|
429
|
+
);
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
175
432
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
433
|
+
case 'discover.search': {
|
|
434
|
+
const {query: q, matches, total} = result.data;
|
|
435
|
+
const count = total ?? matches.length;
|
|
436
|
+
emit(
|
|
437
|
+
section(
|
|
438
|
+
`Found ${count} ${count === 1 ? 'match' : 'matches'} for "${q}"`,
|
|
439
|
+
total != null
|
|
440
|
+
? `showing the first ${matches.length}`
|
|
441
|
+
: undefined,
|
|
442
|
+
),
|
|
443
|
+
list(
|
|
444
|
+
matches.map(m => {
|
|
445
|
+
const target =
|
|
446
|
+
m.kind === 'package'
|
|
447
|
+
? m.package
|
|
448
|
+
: `${m.package}/${m.component}`;
|
|
449
|
+
const tags = [
|
|
450
|
+
m.kind && m.kind !== 'component' ? m.kind : '',
|
|
451
|
+
m.installed === false ? 'not installed' : '',
|
|
452
|
+
].filter(Boolean);
|
|
453
|
+
return `${run} discover ${target}${tags.length ? ` (${tags.join(', ')})` : ''}`;
|
|
454
|
+
}),
|
|
455
|
+
),
|
|
456
|
+
);
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
183
459
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
},
|
|
460
|
+
return answered;
|
|
461
|
+
},
|
|
187
462
|
});
|
|
188
463
|
}
|