@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.
Files changed (331) hide show
  1. package/README.md +96 -99
  2. package/api/build/build.doc.mjs +1 -6
  3. package/api/build/build.test.mjs +0 -22
  4. package/api/build/kit/kit.mjs +5 -44
  5. package/api/component/_adapter.d.mts +0 -25
  6. package/api/component/_adapter.mjs +5 -59
  7. package/api/component/component.d.mts +3 -6
  8. package/api/component/component.doc.mjs +17 -37
  9. package/api/component/component.mjs +9 -249
  10. package/api/component/component.type.d.mts +0 -25
  11. package/api/component/component.type.mjs +0 -44
  12. package/api/discover/_adapter.d.mts +6 -114
  13. package/api/discover/_adapter.mjs +17 -372
  14. package/api/discover/detail/detail.d.mts +6 -18
  15. package/api/discover/detail/detail.mjs +13 -67
  16. package/api/discover/detail/detail.test.mjs +0 -85
  17. package/api/discover/discover.d.mts +9 -3
  18. package/api/discover/discover.doc.mjs +18 -61
  19. package/api/discover/discover.mjs +36 -220
  20. package/api/discover/discover.test.mjs +2 -11
  21. package/api/discover/discover.type.d.mts +8 -147
  22. package/api/discover/discover.type.mjs +12 -102
  23. package/api/discover/list/list.d.mts +6 -20
  24. package/api/discover/list/list.mjs +12 -45
  25. package/api/discover/list/list.test.mjs +0 -46
  26. package/api/discover/search/search.d.mts +16 -18
  27. package/api/discover/search/search.mjs +56 -102
  28. package/api/discover/search/search.test.mjs +10 -144
  29. package/api/docs/_adapter.d.mts +3 -8
  30. package/api/docs/_adapter.mjs +6 -14
  31. package/api/docs/docOverlays.test.mjs +1 -27
  32. package/api/docs/docs.doc.mjs +2 -2
  33. package/api/docs/docs.test.mjs +243 -0
  34. package/api/docs/integration-tree.test.mjs +555 -0
  35. package/api/docs/integrationDocs.test.mjs +314 -0
  36. package/api/doctor/doctor.d.mts +3 -8
  37. package/api/doctor/doctor.doc.mjs +8 -17
  38. package/api/doctor/doctor.mjs +9 -90
  39. package/api/doctor/doctor.test.mjs +10 -122
  40. package/api/doctor/doctor.type.d.mts +1 -1
  41. package/api/doctor/doctor.type.mjs +1 -1
  42. package/api/gap-report/gap-report.doc.mjs +10 -19
  43. package/api/hook/hook.doc.mjs +3 -6
  44. package/api/index.d.mts +2 -1
  45. package/api/index.mjs +5 -5
  46. package/api/init/init.doc.mjs +12 -17
  47. package/api/integration/add-helpers.d.mts +2 -5
  48. package/api/integration/add-helpers.mjs +9 -36
  49. package/api/integration/add-theme.mjs +1 -22
  50. package/api/integration/add-theme.test.mjs +0 -34
  51. package/api/integration/authoring-checks.mjs +2 -2
  52. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  53. package/api/integration/pack-check.mjs +9 -82
  54. package/api/integration/pack-check.test.mjs +0 -90
  55. package/api/integration/pack-check.type.mjs +1 -1
  56. package/api/json/assertResponse.doc.mjs +1 -1
  57. package/api/json/index.ts +1 -0
  58. package/api/json/isError.doc.mjs +1 -1
  59. package/api/layout/_adapter.d.mts +34 -0
  60. package/api/layout/_adapter.mjs +148 -0
  61. package/api/layout/check/check.d.mts +16 -0
  62. package/api/layout/check/check.mjs +40 -0
  63. package/api/layout/expand/expand.d.mts +22 -0
  64. package/api/layout/expand/expand.mjs +155 -0
  65. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  66. package/api/layout/grammar/grammar.d.mts +13 -0
  67. package/api/layout/grammar/grammar.mjs +87 -0
  68. package/api/layout/layout.d.mts +6 -0
  69. package/api/layout/layout.mjs +17 -0
  70. package/api/layout/layout.test.mjs +297 -0
  71. package/api/layout/layout.type.d.mts +89 -0
  72. package/api/layout/layout.type.mjs +103 -0
  73. package/api/layout/layoutCheck.doc.d.mts +11 -0
  74. package/api/layout/layoutCheck.doc.mjs +85 -0
  75. package/api/layout/layoutExpand.doc.d.mts +11 -0
  76. package/api/layout/layoutExpand.doc.mjs +107 -0
  77. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  78. package/api/layout/layoutGrammar.doc.mjs +57 -0
  79. package/api/search/search.d.mts +1 -27
  80. package/api/search/search.doc.mjs +2 -2
  81. package/api/search/search.mjs +16 -228
  82. package/api/search/search.test.mjs +512 -0
  83. package/api/swizzle/swizzle.doc.mjs +5 -7
  84. package/api/template/copy/copy.mjs +1 -1
  85. package/api/template/copy/copy.test.mjs +0 -9
  86. package/api/template/template-integration.test.mjs +65 -1
  87. package/api/template/template.doc.mjs +1 -2
  88. package/api/template/template.mjs +1 -1
  89. package/api/theme/add/add.mjs +25 -17
  90. package/api/theme/add/add.staging.test.mjs +23 -40
  91. package/api/theme/build/build.family.test.mjs +12 -7
  92. package/api/theme/build/build.mjs +18 -8
  93. package/api/theme/generateTonalPalette.doc.mjs +2 -1
  94. package/api/theme/listThemes.doc.mjs +1 -1
  95. package/api/theme/themeAdd.doc.mjs +10 -9
  96. package/api/theme/themeBuild.doc.mjs +13 -13
  97. package/api/theme/themeList.doc.mjs +1 -1
  98. package/api/theme/themeListAvailable.doc.mjs +1 -2
  99. package/api/theme/themePaletteGenerate.doc.mjs +8 -15
  100. package/api/theme/themeTargets.doc.mjs +2 -3
  101. package/api/theme/themeTemplate.doc.mjs +1 -2
  102. package/api/upgrade/run/run.mjs +4 -6
  103. package/api/upgrade/upgrade.doc.mjs +22 -24
  104. package/api/upgrade/upgrade.type.mjs +2 -2
  105. package/assets/codemods/__tests__/runner.test.mjs +1 -3
  106. package/assets/codemods/integration-runner.mjs +3 -3
  107. package/assets/codemods/runner.mjs +4 -5
  108. package/assets/docs/README.md +2 -4
  109. package/assets/docs/browser-support.doc.mjs +11 -11
  110. package/assets/docs/color.doc.mjs +2 -8
  111. package/assets/docs/elevation.doc.mjs +4 -6
  112. package/assets/docs/getting-started.doc.mjs +16 -5
  113. package/assets/docs/icons.doc.mjs +21 -2
  114. package/assets/docs/illustrations.doc.mjs +15 -7
  115. package/assets/docs/internationalization.doc.mjs +5 -7
  116. package/assets/docs/layout.doc.dense.mjs +82 -130
  117. package/assets/docs/layout.doc.mjs +77 -133
  118. package/assets/docs/migration.doc.mjs +21 -19
  119. package/assets/docs/motion.doc.mjs +3 -16
  120. package/assets/docs/principles.doc.dense.mjs +5 -5
  121. package/assets/docs/principles.doc.mjs +0 -8
  122. package/assets/docs/principles.doc.zh.mjs +6 -6
  123. package/assets/docs/shape.doc.mjs +3 -8
  124. package/assets/docs/spacing.doc.mjs +2 -7
  125. package/assets/docs/styling-libraries.doc.mjs +2 -6
  126. package/assets/docs/styling.doc.mjs +23 -19
  127. package/assets/docs/theme.doc.dense.mjs +18 -58
  128. package/assets/docs/theme.doc.mjs +46 -56
  129. package/assets/docs/theme.doc.zh.mjs +8 -9
  130. package/assets/docs/tokens.doc.dense.mjs +2 -2
  131. package/assets/docs/tokens.doc.mjs +8 -389
  132. package/assets/docs/tokens.doc.zh.mjs +2 -2
  133. package/assets/docs/tree/integrations.doc.mjs +451 -25
  134. package/assets/docs/tree/integrations.test.mjs +62 -0
  135. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  136. package/assets/docs/typography.doc.mjs +4 -24
  137. package/assets/docs/working-with-ai.doc.mjs +22 -30
  138. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  139. package/authoring/config/config.doc.mjs +2 -10
  140. package/authoring/config/parse.d.mts +0 -2
  141. package/authoring/config/parse.mjs +0 -19
  142. package/authoring/config/parse.test.mjs +0 -8
  143. package/authoring/config/type.ts +2 -13
  144. package/authoring/doctypes/_schema.d.mts +2 -3
  145. package/authoring/doctypes/_schema.mjs +0 -6
  146. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  147. package/authoring/doctypes/base/type.ts +2 -4
  148. package/authoring/doctypes/command/command.doc.mjs +1 -1
  149. package/authoring/doctypes/command/type.ts +1 -1
  150. package/authoring/doctypes/component/component.doc.mjs +0 -6
  151. package/authoring/doctypes/component/type.ts +0 -8
  152. package/authoring/doctypes/reference/reference.doc.mjs +0 -7
  153. package/authoring/doctypes/reference/type.ts +0 -5
  154. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  155. package/authoring/doctypes/template/template.doc.mjs +1 -1
  156. package/authoring/doctypes/template/type.ts +2 -2
  157. package/authoring/index.d.mts +0 -1
  158. package/authoring/index.d.ts +0 -10
  159. package/authoring/index.mjs +0 -1
  160. package/authoring/integration/integration.doc.mjs +10 -12
  161. package/clients/cli/command-result-coverage.test.mjs +7 -7
  162. package/clients/cli/commands/component/index.mjs +55 -152
  163. package/clients/cli/commands/component-ownership.test.mjs +0 -89
  164. package/clients/cli/commands/component.doc.mjs +9 -27
  165. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  166. package/clients/cli/commands/discover.doc.mjs +9 -53
  167. package/clients/cli/commands/discover.mjs +118 -393
  168. package/clients/cli/commands/docs.doc.mjs +1 -1
  169. package/clients/cli/commands/docs.mjs +17 -60
  170. package/clients/cli/commands/docs.test.mjs +294 -0
  171. package/clients/cli/commands/doctor-integration-docs.doc.mjs +2 -3
  172. package/clients/cli/commands/doctor-integration.test.mjs +0 -53
  173. package/clients/cli/commands/doctor.doc.mjs +1 -3
  174. package/clients/cli/commands/doctor.mjs +5 -49
  175. package/clients/cli/commands/gap-report.doc.mjs +9 -10
  176. package/clients/cli/commands/init.doc.mjs +6 -9
  177. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  178. package/clients/cli/commands/integration-authoring.test.mjs +10 -61
  179. package/clients/cli/commands/integration-pack.doc.mjs +9 -5
  180. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  181. package/clients/cli/commands/integration.doc.mjs +4 -4
  182. package/clients/cli/commands/integration.mjs +43 -74
  183. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  184. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  185. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  186. package/clients/cli/commands/layout.doc.mjs +34 -0
  187. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  188. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  189. package/clients/cli/commands/layout.mjs +275 -0
  190. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  191. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  192. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  193. package/clients/cli/commands/manifest.doc.mjs +1 -1
  194. package/clients/cli/commands/search.doc.mjs +3 -10
  195. package/clients/cli/commands/search.mjs +2 -21
  196. package/clients/cli/commands/search.test.mjs +4 -21
  197. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  198. package/clients/cli/commands/template.doc.mjs +1 -1
  199. package/clients/cli/commands/text-json-parity.test.mjs +16 -5
  200. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  201. package/clients/cli/commands/theme-palette-generate.doc.mjs +2 -3
  202. package/clients/cli/commands/theme-palette.doc.mjs +2 -1
  203. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  204. package/clients/cli/commands/theme.doc.mjs +1 -2
  205. package/clients/cli/commands/upgrade.doc.mjs +3 -62
  206. package/clients/cli/index.mjs +10 -28
  207. package/clients/cli/lib/define-command.mjs +4 -28
  208. package/clients/cli/lib/define-command.test.mjs +0 -54
  209. package/clients/cli/lib/exit-codes.test.mjs +9 -18
  210. package/clients/cli/lib/json-shim.mjs +14 -24
  211. package/clients/cli/lib/json-shim.test.mjs +20 -6
  212. package/clients/cli/lib/manifest.mjs +13 -18
  213. package/clients/cli/lib/manifest.test.mjs +2 -5
  214. package/foundation/agent-docs/agent-docs.mjs +1 -1
  215. package/foundation/agent-docs/agent-docs.test.mjs +1159 -0
  216. package/foundation/discovery/authoring-self-docs.mjs +0 -1
  217. package/foundation/discovery/authoring-self-docs.test.mjs +2 -6
  218. package/foundation/discovery/cli-self-docs.mjs +2 -16
  219. package/foundation/discovery/cli-self-docs.test.mjs +0 -20
  220. package/foundation/discovery/docs-discovery.mjs +1 -5
  221. package/foundation/discovery/docs-discovery.test.mjs +0 -21
  222. package/foundation/discovery/docs-section-key.d.mts +1 -1
  223. package/foundation/discovery/docs-section-key.mjs +1 -1
  224. package/foundation/discovery/template-adapter.mjs +1 -1
  225. package/foundation/doc-compiler/doc-loads.test.mjs +14 -3
  226. package/foundation/doc-compiler/tree.d.mts +0 -4
  227. package/foundation/doc-compiler/tree.mjs +1 -6
  228. package/foundation/doc-compiler/tree.test.mjs +598 -0
  229. package/foundation/integrations/cli-requirement.d.mts +6 -26
  230. package/foundation/integrations/cli-requirement.mjs +11 -46
  231. package/foundation/integrations/cli-requirement.test.mjs +2 -7
  232. package/foundation/integrations/contribution-inventory.mjs +1 -1
  233. package/foundation/integrations/integrations.d.mts +1 -14
  234. package/foundation/integrations/integrations.mjs +1 -41
  235. package/foundation/integrations/integrations.test.mjs +0 -31
  236. package/foundation/response/error-codes.doc.mjs +8 -6
  237. package/foundation/response/error-codes.test.mjs +5 -30
  238. package/foundation/response/response-types.doc.d.mts +3 -4
  239. package/foundation/response/response-types.doc.mjs +27 -40
  240. package/foundation/response/response-types.doc.test.mjs +0 -23
  241. package/foundation/response/response.doc.mjs +10 -11
  242. package/foundation/xle/browser.d.mts +3 -3
  243. package/foundation/xle/browser.mjs +3 -3
  244. package/foundation/xle/expand.mjs +2 -2
  245. package/foundation/xle/parse.mjs +1 -1
  246. package/foundation/xle/print.mjs +2 -2
  247. package/foundation/xle/splice.mjs +1 -1
  248. package/package.json +9 -9
  249. package/api/discover/_adapter.test.mjs +0 -215
  250. package/api/discover/_catalog-view.d.mts +0 -115
  251. package/api/discover/_catalog-view.mjs +0 -203
  252. package/api/discover/_catalog-view.test.mjs +0 -128
  253. package/api/discover/detail/item/item.d.mts +0 -26
  254. package/api/discover/detail/item/item.mjs +0 -78
  255. package/api/discover/detail/item/item.test.mjs +0 -73
  256. package/api/integration/pack-check.lifecycle-output.test.mjs +0 -107
  257. package/api/theme/add/add.rollback.test.mjs +0 -158
  258. package/api/theme/build/build.rollback.test.mjs +0 -148
  259. package/api/upgrade/run/files-changed.test.mjs +0 -111
  260. package/assets/codemods/file-count.test.mjs +0 -163
  261. package/assets/docs/tree/add-a-component.doc.mjs +0 -75
  262. package/assets/docs/tree/add-a-theme.doc.mjs +0 -85
  263. package/assets/docs/tree/add-a-topic.doc.mjs +0 -144
  264. package/assets/docs/tree/agent-guidance.doc.mjs +0 -138
  265. package/assets/docs/tree/block-template.doc.mjs +0 -130
  266. package/assets/docs/tree/build-the-template.doc.mjs +0 -28
  267. package/assets/docs/tree/building-blocks.doc.mjs +0 -46
  268. package/assets/docs/tree/check-your-docs.doc.mjs +0 -137
  269. package/assets/docs/tree/checks.doc.mjs +0 -119
  270. package/assets/docs/tree/codemods.doc.mjs +0 -147
  271. package/assets/docs/tree/component-family.doc.mjs +0 -113
  272. package/assets/docs/tree/component-imports.doc.mjs +0 -69
  273. package/assets/docs/tree/component-lookups.doc.mjs +0 -149
  274. package/assets/docs/tree/components.doc.mjs +0 -23
  275. package/assets/docs/tree/configuration.doc.mjs +0 -23
  276. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +0 -182
  277. package/assets/docs/tree/define-the-theme.doc.mjs +0 -118
  278. package/assets/docs/tree/describe-the-component.doc.mjs +0 -57
  279. package/assets/docs/tree/docs.doc.mjs +0 -21
  280. package/assets/docs/tree/document-the-template.doc.mjs +0 -28
  281. package/assets/docs/tree/document-the-theme.doc.mjs +0 -68
  282. package/assets/docs/tree/export-template-assets.doc.mjs +0 -147
  283. package/assets/docs/tree/extend-or-replace.doc.mjs +0 -103
  284. package/assets/docs/tree/fonts-and-assets.doc.mjs +0 -106
  285. package/assets/docs/tree/generate-a-palette.doc.mjs +0 -66
  286. package/assets/docs/tree/grade-template-with-agent.doc.mjs +0 -105
  287. package/assets/docs/tree/help.doc.mjs +0 -16
  288. package/assets/docs/tree/links.doc.mjs +0 -98
  289. package/assets/docs/tree/package-and-test.doc.mjs +0 -32
  290. package/assets/docs/tree/page-template.doc.mjs +0 -71
  291. package/assets/docs/tree/publishing.doc.mjs +0 -111
  292. package/assets/docs/tree/quick-start.doc.mjs +0 -272
  293. package/assets/docs/tree/replace-a-core-component.doc.mjs +0 -104
  294. package/assets/docs/tree/replace-a-core-template.doc.mjs +0 -172
  295. package/assets/docs/tree/sections-and-placement.doc.mjs +0 -108
  296. package/assets/docs/tree/see-it-in-an-app.doc.mjs +0 -59
  297. package/assets/docs/tree/ship.doc.mjs +0 -16
  298. package/assets/docs/tree/short-and-findable.doc.mjs +0 -108
  299. package/assets/docs/tree/single-component.doc.mjs +0 -165
  300. package/assets/docs/tree/start-a-template.doc.mjs +0 -143
  301. package/assets/docs/tree/subcomponent.doc.mjs +0 -115
  302. package/assets/docs/tree/template-assets.doc.mjs +0 -64
  303. package/assets/docs/tree/template-doc-overview.doc.mjs +0 -109
  304. package/assets/docs/tree/template-fonts.doc.mjs +0 -102
  305. package/assets/docs/tree/template-grading-rubric.doc.mjs +0 -452
  306. package/assets/docs/tree/template-icons.doc.mjs +0 -97
  307. package/assets/docs/tree/template-images-media.doc.mjs +0 -127
  308. package/assets/docs/tree/template-styles.doc.mjs +0 -93
  309. package/assets/docs/tree/templates.doc.mjs +0 -34
  310. package/assets/docs/tree/test-in-an-app.doc.mjs +0 -115
  311. package/assets/docs/tree/test-template-in-app.doc.mjs +0 -128
  312. package/assets/docs/tree/themes.doc.mjs +0 -39
  313. package/assets/docs/tree/troubleshooting.doc.mjs +0 -149
  314. package/assets/docs/tree/upgrading.doc.mjs +0 -103
  315. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +0 -51
  316. package/assets/docs/tree/verify-packed-template.doc.mjs +0 -77
  317. package/assets/docs/tree/versioning.doc.mjs +0 -161
  318. package/assets/docs/tree/write-good-templates.doc.mjs +0 -64
  319. package/assets/docs/tree/write-the-template-file.doc.mjs +0 -154
  320. package/authoring/discover/discover.doc.d.mts +0 -13
  321. package/authoring/discover/discover.doc.mjs +0 -138
  322. package/authoring/discover/parse.d.mts +0 -24
  323. package/authoring/discover/parse.mjs +0 -128
  324. package/authoring/discover/parse.test.mjs +0 -124
  325. package/authoring/discover/type.ts +0 -87
  326. package/clients/cli/commands/component-batch.test.mjs +0 -341
  327. package/clients/cli/commands/discover.sources.test.mjs +0 -267
  328. package/clients/cli/commands/integration-verify.doc.mjs +0 -22
  329. package/clients/cli/lib/parse-error-format.test.mjs +0 -81
  330. package/foundation/response/batch.type.d.mts +0 -33
  331. 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
- });