@astryxdesign/cli 0.6.4-canary.f0355e3 → 0.6.4
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 +96 -99
- package/api/build/build.doc.mjs +1 -6
- package/api/build/build.test.mjs +0 -22
- package/api/build/kit/kit.mjs +5 -44
- package/api/component/_adapter.d.mts +0 -25
- package/api/component/_adapter.mjs +5 -59
- package/api/component/component.d.mts +3 -6
- package/api/component/component.doc.mjs +17 -37
- package/api/component/component.mjs +9 -249
- package/api/component/component.type.d.mts +0 -25
- package/api/component/component.type.mjs +0 -44
- package/api/discover/_adapter.d.mts +6 -114
- package/api/discover/_adapter.mjs +17 -372
- package/api/discover/detail/detail.d.mts +6 -18
- package/api/discover/detail/detail.mjs +13 -67
- package/api/discover/detail/detail.test.mjs +0 -85
- package/api/discover/discover.d.mts +9 -3
- package/api/discover/discover.doc.mjs +18 -61
- package/api/discover/discover.mjs +36 -220
- package/api/discover/discover.test.mjs +2 -11
- package/api/discover/discover.type.d.mts +8 -147
- package/api/discover/discover.type.mjs +12 -102
- package/api/discover/list/list.d.mts +6 -20
- package/api/discover/list/list.mjs +12 -45
- package/api/discover/list/list.test.mjs +0 -46
- package/api/discover/search/search.d.mts +16 -18
- package/api/discover/search/search.mjs +56 -102
- package/api/discover/search/search.test.mjs +10 -144
- package/api/docs/_adapter.d.mts +3 -8
- package/api/docs/_adapter.mjs +6 -14
- package/api/docs/docOverlays.test.mjs +1 -27
- package/api/docs/docs.doc.mjs +2 -2
- package/api/docs/docs.test.mjs +243 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +314 -0
- package/api/doctor/doctor.d.mts +3 -8
- package/api/doctor/doctor.doc.mjs +8 -17
- package/api/doctor/doctor.mjs +9 -90
- package/api/doctor/doctor.test.mjs +10 -122
- 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 +10 -19
- package/api/hook/hook.doc.mjs +3 -6
- package/api/index.d.mts +2 -1
- package/api/index.mjs +5 -5
- package/api/init/init.doc.mjs +12 -17
- package/api/integration/add-helpers.d.mts +2 -5
- package/api/integration/add-helpers.mjs +9 -36
- package/api/integration/add-theme.mjs +1 -22
- package/api/integration/add-theme.test.mjs +0 -34
- package/api/integration/authoring-checks.mjs +2 -2
- package/api/integration/integrationPackCheck.doc.mjs +3 -3
- package/api/integration/pack-check.mjs +9 -82
- package/api/integration/pack-check.test.mjs +0 -90
- package/api/integration/pack-check.type.mjs +1 -1
- package/api/json/assertResponse.doc.mjs +1 -1
- package/api/json/index.ts +1 -0
- package/api/json/isError.doc.mjs +1 -1
- package/api/layout/_adapter.d.mts +34 -0
- package/api/layout/_adapter.mjs +148 -0
- package/api/layout/check/check.d.mts +16 -0
- package/api/layout/check/check.mjs +40 -0
- package/api/layout/expand/expand.d.mts +22 -0
- package/api/layout/expand/expand.mjs +155 -0
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.d.mts +13 -0
- package/api/layout/grammar/grammar.mjs +87 -0
- package/api/layout/layout.d.mts +6 -0
- package/api/layout/layout.mjs +17 -0
- package/api/layout/layout.test.mjs +297 -0
- package/api/layout/layout.type.d.mts +89 -0
- package/api/layout/layout.type.mjs +103 -0
- package/api/layout/layoutCheck.doc.d.mts +11 -0
- package/api/layout/layoutCheck.doc.mjs +85 -0
- package/api/layout/layoutExpand.doc.d.mts +11 -0
- package/api/layout/layoutExpand.doc.mjs +107 -0
- package/api/layout/layoutGrammar.doc.d.mts +11 -0
- package/api/layout/layoutGrammar.doc.mjs +57 -0
- package/api/search/search.d.mts +1 -27
- package/api/search/search.doc.mjs +2 -2
- package/api/search/search.mjs +16 -228
- package/api/search/search.test.mjs +512 -0
- package/api/swizzle/swizzle.doc.mjs +5 -7
- package/api/template/copy/copy.mjs +1 -1
- package/api/template/copy/copy.test.mjs +0 -9
- package/api/template/template-integration.test.mjs +65 -1
- package/api/template/template.doc.mjs +1 -2
- package/api/template/template.mjs +1 -1
- package/api/theme/add/add.mjs +25 -17
- package/api/theme/add/add.staging.test.mjs +23 -40
- package/api/theme/build/build.family.test.mjs +12 -7
- package/api/theme/build/build.mjs +18 -8
- package/api/theme/generateTonalPalette.doc.mjs +2 -1
- package/api/theme/listThemes.doc.mjs +1 -1
- package/api/theme/themeAdd.doc.mjs +10 -9
- package/api/theme/themeBuild.doc.mjs +13 -13
- package/api/theme/themeList.doc.mjs +1 -1
- package/api/theme/themeListAvailable.doc.mjs +1 -2
- package/api/theme/themePaletteGenerate.doc.mjs +8 -15
- package/api/theme/themeTargets.doc.mjs +2 -3
- package/api/theme/themeTemplate.doc.mjs +1 -2
- package/api/upgrade/run/run.mjs +4 -6
- package/api/upgrade/upgrade.doc.mjs +22 -24
- package/api/upgrade/upgrade.type.mjs +2 -2
- package/assets/codemods/__tests__/runner.test.mjs +1 -3
- package/assets/codemods/integration-runner.mjs +3 -3
- package/assets/codemods/runner.mjs +4 -5
- package/assets/docs/README.md +2 -4
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +2 -8
- package/assets/docs/elevation.doc.mjs +4 -6
- package/assets/docs/getting-started.doc.mjs +16 -5
- package/assets/docs/icons.doc.mjs +21 -2
- package/assets/docs/illustrations.doc.mjs +15 -7
- package/assets/docs/internationalization.doc.mjs +5 -7
- package/assets/docs/layout.doc.dense.mjs +82 -130
- package/assets/docs/layout.doc.mjs +77 -133
- package/assets/docs/migration.doc.mjs +21 -19
- package/assets/docs/motion.doc.mjs +3 -16
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +0 -8
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +3 -8
- package/assets/docs/spacing.doc.mjs +2 -7
- package/assets/docs/styling-libraries.doc.mjs +2 -6
- package/assets/docs/styling.doc.mjs +23 -19
- package/assets/docs/theme.doc.dense.mjs +18 -58
- package/assets/docs/theme.doc.mjs +46 -56
- package/assets/docs/theme.doc.zh.mjs +8 -9
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +8 -389
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/integrations.doc.mjs +451 -25
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/typography.doc.mjs +4 -24
- package/assets/docs/working-with-ai.doc.mjs +22 -30
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/authoring/config/config.doc.mjs +2 -10
- package/authoring/config/parse.d.mts +0 -2
- package/authoring/config/parse.mjs +0 -19
- package/authoring/config/parse.test.mjs +0 -8
- package/authoring/config/type.ts +2 -13
- package/authoring/doctypes/_schema.d.mts +2 -3
- package/authoring/doctypes/_schema.mjs +0 -6
- package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
- package/authoring/doctypes/base/type.ts +2 -4
- package/authoring/doctypes/command/command.doc.mjs +1 -1
- package/authoring/doctypes/command/type.ts +1 -1
- package/authoring/doctypes/component/component.doc.mjs +0 -6
- package/authoring/doctypes/component/type.ts +0 -8
- package/authoring/doctypes/reference/reference.doc.mjs +0 -7
- package/authoring/doctypes/reference/type.ts +0 -5
- 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 +0 -1
- package/authoring/index.d.ts +0 -10
- package/authoring/index.mjs +0 -1
- package/authoring/integration/integration.doc.mjs +10 -12
- package/clients/cli/command-result-coverage.test.mjs +7 -7
- package/clients/cli/commands/component/index.mjs +55 -152
- package/clients/cli/commands/component-ownership.test.mjs +0 -89
- package/clients/cli/commands/component.doc.mjs +9 -27
- package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
- package/clients/cli/commands/discover.doc.mjs +9 -53
- package/clients/cli/commands/discover.mjs +118 -393
- package/clients/cli/commands/docs.doc.mjs +1 -1
- package/clients/cli/commands/docs.mjs +17 -60
- package/clients/cli/commands/docs.test.mjs +294 -0
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +2 -3
- package/clients/cli/commands/doctor-integration.test.mjs +0 -53
- package/clients/cli/commands/doctor.doc.mjs +1 -3
- package/clients/cli/commands/doctor.mjs +5 -49
- package/clients/cli/commands/gap-report.doc.mjs +9 -10
- package/clients/cli/commands/init.doc.mjs +6 -9
- package/clients/cli/commands/integration-add.doc.mjs +9 -9
- package/clients/cli/commands/integration-authoring.test.mjs +10 -61
- package/clients/cli/commands/integration-pack.doc.mjs +9 -5
- package/clients/cli/commands/integration-real-world.test.mjs +1 -1
- package/clients/cli/commands/integration.doc.mjs +4 -4
- package/clients/cli/commands/integration.mjs +43 -74
- package/clients/cli/commands/layout-check.doc.mjs +65 -0
- package/clients/cli/commands/layout-expand.doc.mjs +83 -0
- package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
- package/clients/cli/commands/layout.doc.mjs +34 -0
- package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
- package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
- package/clients/cli/commands/layout.mjs +275 -0
- 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/search.doc.mjs +3 -10
- package/clients/cli/commands/search.mjs +2 -21
- package/clients/cli/commands/search.test.mjs +4 -21
- 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 +16 -5
- package/clients/cli/commands/theme-add.doc.mjs +1 -1
- package/clients/cli/commands/theme-palette-generate.doc.mjs +2 -3
- package/clients/cli/commands/theme-palette.doc.mjs +2 -1
- package/clients/cli/commands/theme-targets.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -2
- package/clients/cli/commands/upgrade.doc.mjs +3 -62
- package/clients/cli/index.mjs +10 -28
- package/clients/cli/lib/define-command.mjs +4 -28
- package/clients/cli/lib/define-command.test.mjs +0 -54
- package/clients/cli/lib/exit-codes.test.mjs +9 -18
- package/clients/cli/lib/json-shim.mjs +14 -24
- package/clients/cli/lib/json-shim.test.mjs +20 -6
- package/clients/cli/lib/manifest.mjs +13 -18
- package/clients/cli/lib/manifest.test.mjs +2 -5
- package/foundation/agent-docs/agent-docs.mjs +1 -1
- package/foundation/agent-docs/agent-docs.test.mjs +1159 -0
- package/foundation/discovery/authoring-self-docs.mjs +0 -1
- package/foundation/discovery/authoring-self-docs.test.mjs +2 -6
- package/foundation/discovery/cli-self-docs.mjs +2 -16
- package/foundation/discovery/cli-self-docs.test.mjs +0 -20
- package/foundation/discovery/docs-discovery.mjs +1 -5
- package/foundation/discovery/docs-discovery.test.mjs +0 -21
- package/foundation/discovery/docs-section-key.d.mts +1 -1
- package/foundation/discovery/docs-section-key.mjs +1 -1
- package/foundation/discovery/template-adapter.mjs +1 -1
- package/foundation/doc-compiler/doc-loads.test.mjs +14 -3
- package/foundation/doc-compiler/tree.d.mts +0 -4
- package/foundation/doc-compiler/tree.mjs +1 -6
- package/foundation/doc-compiler/tree.test.mjs +598 -0
- package/foundation/integrations/cli-requirement.d.mts +6 -26
- package/foundation/integrations/cli-requirement.mjs +11 -46
- package/foundation/integrations/cli-requirement.test.mjs +2 -7
- package/foundation/integrations/contribution-inventory.mjs +1 -1
- package/foundation/integrations/integrations.d.mts +1 -14
- package/foundation/integrations/integrations.mjs +1 -41
- package/foundation/integrations/integrations.test.mjs +0 -31
- package/foundation/response/error-codes.doc.mjs +8 -6
- package/foundation/response/error-codes.test.mjs +5 -30
- package/foundation/response/response-types.doc.d.mts +3 -4
- package/foundation/response/response-types.doc.mjs +27 -40
- package/foundation/response/response-types.doc.test.mjs +0 -23
- package/foundation/response/response.doc.mjs +10 -11
- package/foundation/xle/browser.d.mts +3 -3
- package/foundation/xle/browser.mjs +3 -3
- package/foundation/xle/expand.mjs +2 -2
- package/foundation/xle/parse.mjs +1 -1
- package/foundation/xle/print.mjs +2 -2
- package/foundation/xle/splice.mjs +1 -1
- package/package.json +9 -9
- package/api/discover/_adapter.test.mjs +0 -215
- package/api/discover/_catalog-view.d.mts +0 -115
- package/api/discover/_catalog-view.mjs +0 -203
- package/api/discover/_catalog-view.test.mjs +0 -128
- package/api/discover/detail/item/item.d.mts +0 -26
- package/api/discover/detail/item/item.mjs +0 -78
- package/api/discover/detail/item/item.test.mjs +0 -73
- package/api/integration/pack-check.lifecycle-output.test.mjs +0 -107
- package/api/theme/add/add.rollback.test.mjs +0 -158
- package/api/theme/build/build.rollback.test.mjs +0 -148
- package/api/upgrade/run/files-changed.test.mjs +0 -111
- package/assets/codemods/file-count.test.mjs +0 -163
- package/assets/docs/tree/add-a-component.doc.mjs +0 -75
- package/assets/docs/tree/add-a-theme.doc.mjs +0 -85
- package/assets/docs/tree/add-a-topic.doc.mjs +0 -144
- package/assets/docs/tree/agent-guidance.doc.mjs +0 -138
- package/assets/docs/tree/block-template.doc.mjs +0 -130
- package/assets/docs/tree/build-the-template.doc.mjs +0 -28
- package/assets/docs/tree/building-blocks.doc.mjs +0 -46
- package/assets/docs/tree/check-your-docs.doc.mjs +0 -137
- package/assets/docs/tree/checks.doc.mjs +0 -119
- package/assets/docs/tree/codemods.doc.mjs +0 -147
- package/assets/docs/tree/component-family.doc.mjs +0 -113
- package/assets/docs/tree/component-imports.doc.mjs +0 -69
- package/assets/docs/tree/component-lookups.doc.mjs +0 -149
- package/assets/docs/tree/components.doc.mjs +0 -23
- package/assets/docs/tree/configuration.doc.mjs +0 -23
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +0 -182
- package/assets/docs/tree/define-the-theme.doc.mjs +0 -118
- package/assets/docs/tree/describe-the-component.doc.mjs +0 -57
- package/assets/docs/tree/docs.doc.mjs +0 -21
- package/assets/docs/tree/document-the-template.doc.mjs +0 -28
- package/assets/docs/tree/document-the-theme.doc.mjs +0 -68
- package/assets/docs/tree/export-template-assets.doc.mjs +0 -147
- package/assets/docs/tree/extend-or-replace.doc.mjs +0 -103
- package/assets/docs/tree/fonts-and-assets.doc.mjs +0 -106
- package/assets/docs/tree/generate-a-palette.doc.mjs +0 -66
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +0 -105
- package/assets/docs/tree/help.doc.mjs +0 -16
- package/assets/docs/tree/links.doc.mjs +0 -98
- package/assets/docs/tree/package-and-test.doc.mjs +0 -32
- package/assets/docs/tree/page-template.doc.mjs +0 -71
- package/assets/docs/tree/publishing.doc.mjs +0 -111
- package/assets/docs/tree/quick-start.doc.mjs +0 -272
- package/assets/docs/tree/replace-a-core-component.doc.mjs +0 -104
- package/assets/docs/tree/replace-a-core-template.doc.mjs +0 -172
- package/assets/docs/tree/sections-and-placement.doc.mjs +0 -108
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +0 -59
- package/assets/docs/tree/ship.doc.mjs +0 -16
- package/assets/docs/tree/short-and-findable.doc.mjs +0 -108
- package/assets/docs/tree/single-component.doc.mjs +0 -165
- package/assets/docs/tree/start-a-template.doc.mjs +0 -143
- package/assets/docs/tree/subcomponent.doc.mjs +0 -115
- package/assets/docs/tree/template-assets.doc.mjs +0 -64
- package/assets/docs/tree/template-doc-overview.doc.mjs +0 -109
- package/assets/docs/tree/template-fonts.doc.mjs +0 -102
- package/assets/docs/tree/template-grading-rubric.doc.mjs +0 -452
- package/assets/docs/tree/template-icons.doc.mjs +0 -97
- package/assets/docs/tree/template-images-media.doc.mjs +0 -127
- package/assets/docs/tree/template-styles.doc.mjs +0 -93
- package/assets/docs/tree/templates.doc.mjs +0 -34
- package/assets/docs/tree/test-in-an-app.doc.mjs +0 -115
- package/assets/docs/tree/test-template-in-app.doc.mjs +0 -128
- package/assets/docs/tree/themes.doc.mjs +0 -39
- package/assets/docs/tree/troubleshooting.doc.mjs +0 -149
- package/assets/docs/tree/upgrading.doc.mjs +0 -103
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +0 -51
- package/assets/docs/tree/verify-packed-template.doc.mjs +0 -77
- package/assets/docs/tree/versioning.doc.mjs +0 -161
- package/assets/docs/tree/write-good-templates.doc.mjs +0 -64
- package/assets/docs/tree/write-the-template-file.doc.mjs +0 -154
- package/authoring/discover/discover.doc.d.mts +0 -13
- package/authoring/discover/discover.doc.mjs +0 -138
- package/authoring/discover/parse.d.mts +0 -24
- package/authoring/discover/parse.mjs +0 -128
- package/authoring/discover/parse.test.mjs +0 -124
- package/authoring/discover/type.ts +0 -87
- package/clients/cli/commands/component-batch.test.mjs +0 -341
- package/clients/cli/commands/discover.sources.test.mjs +0 -267
- package/clients/cli/commands/integration-verify.doc.mjs +0 -22
- package/clients/cli/lib/parse-error-format.test.mjs +0 -81
- package/foundation/response/batch.type.d.mts +0 -33
- package/foundation/response/batch.type.mjs +0 -34
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file Pure views over discover sources' catalogs: which catalog packages the
|
|
5
|
-
* project already has, what it could add, and the items search looks through.
|
|
6
|
-
* No I/O; the adapter supplies every input.
|
|
7
|
-
*
|
|
8
|
-
* @position api/discover — shared by the list, detail, item, and search leaves.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import {KIND_FIELDS} from './_adapter.mjs';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @typedef {import('./_adapter.mjs').InstalledPackage} InstalledPackage
|
|
15
|
-
* @typedef {import('./_adapter.mjs').CatalogResult} CatalogResult
|
|
16
|
-
* @typedef {CatalogResult['packages'][number]} CatalogPackage
|
|
17
|
-
* @typedef {import('../../authoring/discover/type').DiscoverKind} DiscoverKind
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* An item search looks through. `kind: 'package'` is a package itself.
|
|
22
|
-
* @typedef {object} SearchItem
|
|
23
|
-
* @property {string} package
|
|
24
|
-
* @property {DiscoverKind | 'package'} kind
|
|
25
|
-
* @property {string} name
|
|
26
|
-
* @property {boolean} installed
|
|
27
|
-
* @property {string} [title]
|
|
28
|
-
* @property {string} [summary]
|
|
29
|
-
* @property {string[]} [keywords]
|
|
30
|
-
* @property {string} [description]
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Group a version's contributions into the entry fields, one list per kind.
|
|
35
|
-
* `components` is always present, like on an installed entry.
|
|
36
|
-
* @param {CatalogPackage['contributions']} contributions
|
|
37
|
-
* @returns {Record<string, string[]>}
|
|
38
|
-
*/
|
|
39
|
-
export function kindLists(contributions) {
|
|
40
|
-
/** @type {Record<string, string[]>} */
|
|
41
|
-
const lists = {components: []};
|
|
42
|
-
for (const [kind, field] of KIND_FIELDS) {
|
|
43
|
-
const names = contributions.filter(c => c.kind === kind).map(c => c.name);
|
|
44
|
-
if (names.length > 0 || field === 'components') lists[field] = names;
|
|
45
|
-
}
|
|
46
|
-
return lists;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Whether an entry adds at least one item of `kind`.
|
|
51
|
-
* @param {Record<string, unknown>} entry
|
|
52
|
-
* @param {DiscoverKind} kind
|
|
53
|
-
* @returns {boolean}
|
|
54
|
-
*/
|
|
55
|
-
export function hasKind(entry, kind) {
|
|
56
|
-
const field = KIND_FIELDS.find(([k]) => k === kind)?.[1];
|
|
57
|
-
const values = field == null ? undefined : entry[field];
|
|
58
|
-
return Array.isArray(values) && values.length > 0;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Where a catalog package stands against the project.
|
|
63
|
-
* @param {CatalogPackage} pkg
|
|
64
|
-
* @param {Set<string>} installedNames
|
|
65
|
-
* @param {Set<string>} declared
|
|
66
|
-
* @returns {{state: 'installed' | 'declared' | 'alias' | 'available', installedAs?: string}}
|
|
67
|
-
*/
|
|
68
|
-
export function catalogState(pkg, installedNames, declared) {
|
|
69
|
-
if (installedNames.has(pkg.package)) return {state: 'installed'};
|
|
70
|
-
if (declared.has(pkg.package)) return {state: 'declared'};
|
|
71
|
-
const installedAs = pkg.aliases.find(
|
|
72
|
-
name => installedNames.has(name) || declared.has(name),
|
|
73
|
-
);
|
|
74
|
-
if (installedAs != null) return {state: 'alias', installedAs};
|
|
75
|
-
return {state: 'available'};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* The version a catalog package shows by default.
|
|
80
|
-
* @param {CatalogPackage} pkg
|
|
81
|
-
* @returns {string | undefined}
|
|
82
|
-
*/
|
|
83
|
-
export function defaultVersion(pkg) {
|
|
84
|
-
return pkg.latest ?? pkg.versions[0]?.version;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Project a catalog package into the entry shape installed packages use.
|
|
89
|
-
* @param {CatalogPackage} pkg
|
|
90
|
-
* @param {string | undefined} version
|
|
91
|
-
*/
|
|
92
|
-
export function catalogEntry(pkg, version) {
|
|
93
|
-
const {components, ...others} = kindLists(pkg.contributions);
|
|
94
|
-
return {
|
|
95
|
-
name: pkg.package,
|
|
96
|
-
category: pkg.package,
|
|
97
|
-
components,
|
|
98
|
-
...(version ? {version} : {}),
|
|
99
|
-
...(pkg.description ? {description: pkg.description} : {}),
|
|
100
|
-
...others,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* What the project could add: every catalog package it does not have, once per
|
|
106
|
-
* integration (the first name a source lists), never an alias of one it has.
|
|
107
|
-
* @param {CatalogResult} catalog
|
|
108
|
-
* @param {InstalledPackage[]} installed
|
|
109
|
-
* @param {Set<string>} declared
|
|
110
|
-
*/
|
|
111
|
-
export function availableEntries(catalog, installed, declared) {
|
|
112
|
-
const installedNames = new Set(installed.map(p => p.name));
|
|
113
|
-
/** @type {Set<string>} */
|
|
114
|
-
const integrations = new Set();
|
|
115
|
-
const entries = [];
|
|
116
|
-
for (const pkg of catalog.packages) {
|
|
117
|
-
if (catalogState(pkg, installedNames, declared).state !== 'available')
|
|
118
|
-
continue;
|
|
119
|
-
if (integrations.has(pkg.integration)) continue;
|
|
120
|
-
integrations.add(pkg.integration);
|
|
121
|
-
const version = defaultVersion(pkg);
|
|
122
|
-
const {category: _category, ...entry} = catalogEntry(pkg, version);
|
|
123
|
-
entries.push({
|
|
124
|
-
...entry,
|
|
125
|
-
...(pkg.aliases.length > 0 ? {aliases: pkg.aliases} : {}),
|
|
126
|
-
source: pkg.source,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
return entries;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Installed packages with the latest release a source knows for each.
|
|
134
|
-
* @param {InstalledPackage[]} installed
|
|
135
|
-
* @param {CatalogResult} catalog
|
|
136
|
-
* @returns {Array<InstalledPackage & {latest?: string}>}
|
|
137
|
-
*/
|
|
138
|
-
export function withLatest(installed, catalog) {
|
|
139
|
-
const byName = new Map(catalog.packages.map(p => [p.package, p]));
|
|
140
|
-
return installed.map(pkg => {
|
|
141
|
-
const latest = byName.get(pkg.name)?.latest;
|
|
142
|
-
return latest ? {...pkg, latest} : pkg;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Everything search looks through besides installed components (which the
|
|
148
|
-
* search leaf keeps resolving the way it always has): installed packages and
|
|
149
|
-
* their other items, and every package the project could add with its items.
|
|
150
|
-
* @param {InstalledPackage[]} installed
|
|
151
|
-
* @param {CatalogResult} catalog
|
|
152
|
-
* @param {Set<string>} declared
|
|
153
|
-
* @returns {SearchItem[]}
|
|
154
|
-
*/
|
|
155
|
-
export function searchItems(installed, catalog, declared) {
|
|
156
|
-
/** @type {SearchItem[]} */
|
|
157
|
-
const items = [];
|
|
158
|
-
for (const pkg of installed) {
|
|
159
|
-
items.push({
|
|
160
|
-
package: pkg.name,
|
|
161
|
-
kind: 'package',
|
|
162
|
-
name: pkg.name,
|
|
163
|
-
installed: true,
|
|
164
|
-
...(pkg.description ? {description: pkg.description} : {}),
|
|
165
|
-
});
|
|
166
|
-
for (const [kind, field] of KIND_FIELDS) {
|
|
167
|
-
if (kind === 'component') continue;
|
|
168
|
-
const names = /** @type {Record<string, unknown>} */ (pkg)[field];
|
|
169
|
-
if (!Array.isArray(names)) continue;
|
|
170
|
-
for (const name of names) {
|
|
171
|
-
items.push({package: pkg.name, kind, name, installed: true});
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const installedNames = new Set(installed.map(p => p.name));
|
|
176
|
-
/** @type {Set<string>} */
|
|
177
|
-
const integrations = new Set();
|
|
178
|
-
for (const pkg of catalog.packages) {
|
|
179
|
-
if (catalogState(pkg, installedNames, declared).state !== 'available')
|
|
180
|
-
continue;
|
|
181
|
-
if (integrations.has(pkg.integration)) continue;
|
|
182
|
-
integrations.add(pkg.integration);
|
|
183
|
-
items.push({
|
|
184
|
-
package: pkg.package,
|
|
185
|
-
kind: 'package',
|
|
186
|
-
name: pkg.package,
|
|
187
|
-
installed: false,
|
|
188
|
-
...(pkg.description ? {description: pkg.description} : {}),
|
|
189
|
-
});
|
|
190
|
-
for (const c of pkg.contributions) {
|
|
191
|
-
items.push({
|
|
192
|
-
package: pkg.package,
|
|
193
|
-
kind: c.kind,
|
|
194
|
-
name: c.name,
|
|
195
|
-
installed: false,
|
|
196
|
-
...(c.title ? {title: c.title} : {}),
|
|
197
|
-
...(c.summary ? {summary: c.summary} : {}),
|
|
198
|
-
...(c.keywords ? {keywords: c.keywords} : {}),
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return items;
|
|
203
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file Tests for the pure views over discover sources' catalogs.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import {describe, expect, it} from 'vitest';
|
|
8
|
-
import {
|
|
9
|
-
availableEntries,
|
|
10
|
-
catalogState,
|
|
11
|
-
kindLists,
|
|
12
|
-
searchItems,
|
|
13
|
-
withLatest,
|
|
14
|
-
} from './_catalog-view.mjs';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @param {string} name
|
|
18
|
-
* @param {string} integration
|
|
19
|
-
* @param {object} [extra]
|
|
20
|
-
* @returns {any}
|
|
21
|
-
*/
|
|
22
|
-
function entry(name, integration, extra = {}) {
|
|
23
|
-
return {
|
|
24
|
-
package: name,
|
|
25
|
-
integration,
|
|
26
|
-
aliases: [],
|
|
27
|
-
latest: '1.0.0',
|
|
28
|
-
versions: [],
|
|
29
|
-
contributions: [{kind: 'component', name: 'A'}],
|
|
30
|
-
source: 'S',
|
|
31
|
-
...extra,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const CATALOG = {
|
|
36
|
-
sources: [],
|
|
37
|
-
packages: [
|
|
38
|
-
entry('@acme/ui', 'acme-ui', {aliases: ['@acme/ui-classic']}),
|
|
39
|
-
entry('@acme/ui-classic', 'acme-ui', {aliases: ['@acme/ui']}),
|
|
40
|
-
entry('@acme/charts', 'charts', {
|
|
41
|
-
latest: '2.0.0',
|
|
42
|
-
contributions: [{kind: 'theme', name: 'ocean'}],
|
|
43
|
-
}),
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/** @param {string} name @returns {any} */
|
|
48
|
-
const installed = name => ({name, category: name, components: []});
|
|
49
|
-
|
|
50
|
-
describe('availableEntries', () => {
|
|
51
|
-
it('offers each integration once, under the first name a source lists', () => {
|
|
52
|
-
expect(
|
|
53
|
-
availableEntries(CATALOG, [], new Set()).map(e => [e.name, e.aliases]),
|
|
54
|
-
).toEqual([
|
|
55
|
-
['@acme/ui', ['@acme/ui-classic']],
|
|
56
|
-
['@acme/charts', undefined],
|
|
57
|
-
]);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('never offers an integration the project has under another name', () => {
|
|
61
|
-
expect(
|
|
62
|
-
availableEntries(CATALOG, [installed('@acme/ui-classic')], new Set()).map(
|
|
63
|
-
e => e.name,
|
|
64
|
-
),
|
|
65
|
-
).toEqual(['@acme/charts']);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('does not offer a package the project declares, even when it did not load', () => {
|
|
69
|
-
expect(
|
|
70
|
-
availableEntries(CATALOG, [], new Set(['@acme/charts'])).map(e => e.name),
|
|
71
|
-
).toEqual(['@acme/ui']);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('describes an entry the way an installed one is described', () => {
|
|
75
|
-
expect(availableEntries(CATALOG, [], new Set())[1]).toEqual({
|
|
76
|
-
name: '@acme/charts',
|
|
77
|
-
components: [],
|
|
78
|
-
version: '2.0.0',
|
|
79
|
-
themes: ['ocean'],
|
|
80
|
-
source: 'S',
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('catalogState', () => {
|
|
86
|
-
it('names the package the project has instead', () => {
|
|
87
|
-
expect(
|
|
88
|
-
catalogState(CATALOG.packages[0], new Set(['@acme/ui-classic']), new Set()),
|
|
89
|
-
).toEqual({state: 'alias', installedAs: '@acme/ui-classic'});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
describe('withLatest', () => {
|
|
94
|
-
it('adds the latest release a source knows to an installed package', () => {
|
|
95
|
-
expect(withLatest([installed('@acme/charts')], CATALOG)[0]).toMatchObject({
|
|
96
|
-
latest: '2.0.0',
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
describe('kindLists', () => {
|
|
102
|
-
it('groups items by kind, always with components', () => {
|
|
103
|
-
expect(
|
|
104
|
-
kindLists([
|
|
105
|
-
{kind: 'theme', name: 'ocean'},
|
|
106
|
-
{kind: 'component', name: 'A'},
|
|
107
|
-
]),
|
|
108
|
-
).toEqual({components: ['A'], themes: ['ocean']});
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe('searchItems', () => {
|
|
113
|
-
it('covers installed packages and their other items, then what could be added', () => {
|
|
114
|
-
const items = searchItems(
|
|
115
|
-
[{...installed('@acme/widgets'), templates: ['pages/Home']}],
|
|
116
|
-
CATALOG,
|
|
117
|
-
new Set(),
|
|
118
|
-
);
|
|
119
|
-
expect(items.map(i => [i.package, i.kind, i.name, i.installed])).toEqual([
|
|
120
|
-
['@acme/widgets', 'package', '@acme/widgets', true],
|
|
121
|
-
['@acme/widgets', 'template', 'pages/Home', true],
|
|
122
|
-
['@acme/ui', 'package', '@acme/ui', false],
|
|
123
|
-
['@acme/ui', 'component', 'A', false],
|
|
124
|
-
['@acme/charts', 'package', '@acme/charts', false],
|
|
125
|
-
['@acme/charts', 'theme', 'ocean', false],
|
|
126
|
-
]);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
-
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Find one item of a package: an installed package's own templates, docs,
|
|
6
|
-
* themes, and codemods first, then what a discover source lists for the
|
|
7
|
-
* package. Returns null when neither has it, so the caller can report the
|
|
8
|
-
* component lookup's own error.
|
|
9
|
-
*
|
|
10
|
-
* @param {import('../../_adapter.mjs').InstalledPackage[]} packages
|
|
11
|
-
* @param {string} packageName
|
|
12
|
-
* @param {string} itemName
|
|
13
|
-
* @param {{
|
|
14
|
-
* catalog?: import('../../_catalog-view.mjs').CatalogPackage,
|
|
15
|
-
* version?: string,
|
|
16
|
-
* add?: (name: string, version?: string) => string,
|
|
17
|
-
* installedAs?: string,
|
|
18
|
-
* }} [options]
|
|
19
|
-
* @returns {import('../../discover.type.mjs').DiscoverItemResponse | null}
|
|
20
|
-
*/
|
|
21
|
-
export function item(packages: import("../../_adapter.mjs").InstalledPackage[], packageName: string, itemName: string, options?: {
|
|
22
|
-
catalog?: import("../../_catalog-view.mjs").CatalogPackage;
|
|
23
|
-
version?: string;
|
|
24
|
-
add?: (name: string, version?: string) => string;
|
|
25
|
-
installedAs?: string;
|
|
26
|
-
}): import("../../discover.type.mjs").DiscoverItemResponse | null;
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file discover.item leaf — one item a package adds, when it is not an
|
|
5
|
-
* installed component (those keep resolving to their full doc through
|
|
6
|
-
* ../doc).
|
|
7
|
-
*
|
|
8
|
-
* @position api/discover/detail/item — pure projection over the packages and
|
|
9
|
-
* catalog entry resolved by ../../_adapter.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {KIND_FIELDS} from '../../_adapter.mjs';
|
|
13
|
-
import {defaultVersion} from '../../_catalog-view.mjs';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Find one item of a package: an installed package's own templates, docs,
|
|
17
|
-
* themes, and codemods first, then what a discover source lists for the
|
|
18
|
-
* package. Returns null when neither has it, so the caller can report the
|
|
19
|
-
* component lookup's own error.
|
|
20
|
-
*
|
|
21
|
-
* @param {import('../../_adapter.mjs').InstalledPackage[]} packages
|
|
22
|
-
* @param {string} packageName
|
|
23
|
-
* @param {string} itemName
|
|
24
|
-
* @param {{
|
|
25
|
-
* catalog?: import('../../_catalog-view.mjs').CatalogPackage,
|
|
26
|
-
* version?: string,
|
|
27
|
-
* add?: (name: string, version?: string) => string,
|
|
28
|
-
* installedAs?: string,
|
|
29
|
-
* }} [options]
|
|
30
|
-
* @returns {import('../../discover.type.mjs').DiscoverItemResponse | null}
|
|
31
|
-
*/
|
|
32
|
-
export function item(packages, packageName, itemName, options = {}) {
|
|
33
|
-
const {catalog, version, add, installedAs} = options;
|
|
34
|
-
const pkg = packages.find(p => p.name === packageName);
|
|
35
|
-
if (pkg && (!version || version === pkg.version)) {
|
|
36
|
-
for (const [kind, field] of KIND_FIELDS) {
|
|
37
|
-
if (kind === 'component') continue;
|
|
38
|
-
const names = /** @type {Record<string, unknown>} */ (pkg)[field];
|
|
39
|
-
if (Array.isArray(names) && names.includes(itemName)) {
|
|
40
|
-
return {
|
|
41
|
-
type: 'discover.item',
|
|
42
|
-
data: {
|
|
43
|
-
package: packageName,
|
|
44
|
-
...(pkg.version ? {version: pkg.version} : {}),
|
|
45
|
-
kind,
|
|
46
|
-
name: itemName,
|
|
47
|
-
installed: true,
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const lower = itemName.toLowerCase();
|
|
55
|
-
const found =
|
|
56
|
-
catalog?.contributions.find(c => c.name === itemName) ??
|
|
57
|
-
catalog?.contributions.find(c => c.name.toLowerCase() === lower);
|
|
58
|
-
if (!catalog || !found) return null;
|
|
59
|
-
const shown = version ?? defaultVersion(catalog);
|
|
60
|
-
return {
|
|
61
|
-
type: 'discover.item',
|
|
62
|
-
data: {
|
|
63
|
-
package: packageName,
|
|
64
|
-
...(shown ? {version: shown} : {}),
|
|
65
|
-
kind: found.kind,
|
|
66
|
-
name: found.name,
|
|
67
|
-
...(found.title ? {title: found.title} : {}),
|
|
68
|
-
...(found.summary ? {summary: found.summary} : {}),
|
|
69
|
-
...(found.keywords ? {keywords: found.keywords} : {}),
|
|
70
|
-
installed: pkg != null,
|
|
71
|
-
...(pkg == null && installedAs ? {installedAs} : {}),
|
|
72
|
-
...(pkg == null && !installedAs && add
|
|
73
|
-
? {install: add(packageName, version)}
|
|
74
|
-
: {}),
|
|
75
|
-
source: catalog.source,
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file Tests for the discover.item leaf, a pure projection over installed
|
|
5
|
-
* packages and a source's catalog entry.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import {describe, expect, it} from 'vitest';
|
|
9
|
-
import {item} from './item.mjs';
|
|
10
|
-
|
|
11
|
-
/** @type {any[]} */
|
|
12
|
-
const PACKAGES = [
|
|
13
|
-
{
|
|
14
|
-
name: '@acme/widgets',
|
|
15
|
-
category: '@acme/widgets',
|
|
16
|
-
version: '1.2.3',
|
|
17
|
-
components: ['Alpha'],
|
|
18
|
-
templates: ['pages/Home'],
|
|
19
|
-
docs: ['guide'],
|
|
20
|
-
},
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
/** @type {any} */
|
|
24
|
-
const CATALOG = {
|
|
25
|
-
package: '@acme/charts',
|
|
26
|
-
integration: 'acme-charts',
|
|
27
|
-
aliases: [],
|
|
28
|
-
latest: '2.0.0',
|
|
29
|
-
source: 'Acme',
|
|
30
|
-
versions: [],
|
|
31
|
-
contributions: [{kind: 'template', name: 'pages/Report', title: 'Report page'}],
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/** @param {string} name @param {string} [version] */
|
|
35
|
-
const add = (name, version) => `pnpm add ${version ? `${name}@${version}` : name}`;
|
|
36
|
-
|
|
37
|
-
describe('discover.item leaf', () => {
|
|
38
|
-
it("finds an installed package's own template, doc, theme, or codemod", () => {
|
|
39
|
-
expect(item(PACKAGES, '@acme/widgets', 'pages/Home')).toEqual({
|
|
40
|
-
type: 'discover.item',
|
|
41
|
-
data: {
|
|
42
|
-
package: '@acme/widgets',
|
|
43
|
-
version: '1.2.3',
|
|
44
|
-
kind: 'template',
|
|
45
|
-
name: 'pages/Home',
|
|
46
|
-
installed: true,
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('finds an item a source lists, with the command that adds its package', () => {
|
|
52
|
-
expect(
|
|
53
|
-
item(PACKAGES, '@acme/charts', 'pages/report', {catalog: CATALOG, add}),
|
|
54
|
-
).toEqual({
|
|
55
|
-
type: 'discover.item',
|
|
56
|
-
data: {
|
|
57
|
-
package: '@acme/charts',
|
|
58
|
-
version: '2.0.0',
|
|
59
|
-
kind: 'template',
|
|
60
|
-
name: 'pages/Report',
|
|
61
|
-
title: 'Report page',
|
|
62
|
-
installed: false,
|
|
63
|
-
install: 'pnpm add @acme/charts',
|
|
64
|
-
source: 'Acme',
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('returns null when neither the project nor a source has it', () => {
|
|
70
|
-
expect(item(PACKAGES, '@acme/widgets', 'Nope')).toBeNull();
|
|
71
|
-
expect(item(PACKAGES, '@acme/charts', 'Nope', {catalog: CATALOG})).toBeNull();
|
|
72
|
-
});
|
|
73
|
-
});
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
4
|
-
import * as fs from 'node:fs';
|
|
5
|
-
import * as path from 'node:path';
|
|
6
|
-
import {integrationPackCheck} from './pack-check.mjs';
|
|
7
|
-
|
|
8
|
-
let tmpDir;
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-pack-check-'));
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
afterEach(() => {
|
|
15
|
-
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
/** @param {Record<string, string>} scripts */
|
|
19
|
-
function writeThemePackage(scripts) {
|
|
20
|
-
fs.writeFileSync(
|
|
21
|
-
path.join(tmpDir, 'package.json'),
|
|
22
|
-
`${JSON.stringify(
|
|
23
|
-
{
|
|
24
|
-
name: '@acme/widgets',
|
|
25
|
-
version: '1.0.0',
|
|
26
|
-
files: ['astryx.integration.mjs', 'themes'],
|
|
27
|
-
peerDependencies: {'@astryxdesign/cli': '>=0.7.0'},
|
|
28
|
-
peerDependenciesMeta: {'@astryxdesign/cli': {optional: true}},
|
|
29
|
-
scripts,
|
|
30
|
-
},
|
|
31
|
-
null,
|
|
32
|
-
2,
|
|
33
|
-
)}\n`,
|
|
34
|
-
);
|
|
35
|
-
fs.writeFileSync(
|
|
36
|
-
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
37
|
-
"export default {themes: './themes'};\n",
|
|
38
|
-
);
|
|
39
|
-
const root = path.join(tmpDir, 'themes');
|
|
40
|
-
fs.mkdirSync(path.join(root, 'ocean'), {recursive: true});
|
|
41
|
-
fs.writeFileSync(
|
|
42
|
-
path.join(root, 'ocean', 'oceanTheme.ts'),
|
|
43
|
-
"import {defineTheme} from '@astryxdesign/core/theme';\n\nexport const oceanTheme = defineTheme({name: 'ocean'});\n",
|
|
44
|
-
);
|
|
45
|
-
fs.writeFileSync(
|
|
46
|
-
path.join(root, 'ocean', 'oceanTheme.doc.mjs'),
|
|
47
|
-
`/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */
|
|
48
|
-
export default {type: 'theme', name: 'ocean', displayName: 'Ocean', description: 'Ocean theme.', maintained: true};
|
|
49
|
-
`,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
describe('integrationPackCheck with lifecycle script output', () => {
|
|
54
|
-
it('checks the tarball when lifecycle scripts print to stdout', async () => {
|
|
55
|
-
writeThemePackage({
|
|
56
|
-
prepack: 'node -e "console.log(\'building the package\')"',
|
|
57
|
-
prepare: 'node -e "console.log(\'preparing\')"',
|
|
58
|
-
postpack: 'node -e "console.log(\'packed\')"',
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
const result = await integrationPackCheck({cwd: tmpDir});
|
|
62
|
-
|
|
63
|
-
expect(result.data.issues).toEqual([]);
|
|
64
|
-
expect(result.data.packable).toBe(true);
|
|
65
|
-
expect(result.data.tarball?.filename).toBe('acme-widgets-1.0.0.tgz');
|
|
66
|
-
expect(result.data.contributions.packed).toEqual(
|
|
67
|
-
result.data.contributions.local,
|
|
68
|
-
);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('still runs a chatty lifecycle script and compares what it packed', async () => {
|
|
72
|
-
const renameTheme = [
|
|
73
|
-
"console.log('renaming ocean to storm')",
|
|
74
|
-
"const fs=require('fs')",
|
|
75
|
-
"fs.renameSync('themes/ocean','themes/storm')",
|
|
76
|
-
"const p='themes/storm/oceanTheme.doc.mjs'",
|
|
77
|
-
"let x=fs.readFileSync(p,'utf8')",
|
|
78
|
-
"x=x.replace(/name: 'ocean'/, 'name: '+String.fromCharCode(39)+'storm'+String.fromCharCode(39))",
|
|
79
|
-
'fs.writeFileSync(p,x)',
|
|
80
|
-
].join(';');
|
|
81
|
-
writeThemePackage({prepack: `node -e "${renameTheme}"`});
|
|
82
|
-
|
|
83
|
-
const result = await integrationPackCheck({cwd: tmpDir});
|
|
84
|
-
const codes = result.data.issues.map(issue => issue.code);
|
|
85
|
-
|
|
86
|
-
expect(codes).not.toContain('pack_failed');
|
|
87
|
-
expect(codes).toContain('identity_not_packed');
|
|
88
|
-
expect(codes).toContain('packed_identity_unexpected');
|
|
89
|
-
expect(result.data.packable).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('keeps a failing lifecycle script output in the pack_failed issue', async () => {
|
|
93
|
-
writeThemePackage({
|
|
94
|
-
prepack:
|
|
95
|
-
'node -e "console.error(\'prepack exploded\'); process.exit(3)"',
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
const result = await integrationPackCheck({cwd: tmpDir});
|
|
99
|
-
const failure = result.data.issues.find(
|
|
100
|
-
issue => issue.code === 'pack_failed',
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
expect(result.data.packable).toBe(false);
|
|
104
|
-
expect(failure?.message).toContain('npm pack failed (exit 3)');
|
|
105
|
-
expect(failure?.message).toContain('prepack exploded');
|
|
106
|
-
});
|
|
107
|
-
});
|