@astryxdesign/cli 0.6.3-canary.ebaebc4 → 0.6.3-canary.ee13359

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 (501) hide show
  1. package/README.md +114 -77
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/build.doc.mjs +4 -3
  4. package/api/build/build.test.mjs +14 -3
  5. package/api/build/build.type.d.mts +35 -1
  6. package/api/build/build.type.mjs +24 -3
  7. package/api/build/help/help.d.mts +8 -5
  8. package/api/build/help/help.mjs +56 -6
  9. package/api/component/_adapter.d.mts +6 -12
  10. package/api/component/_adapter.mjs +20 -10
  11. package/api/component/component.doc.mjs +13 -3
  12. package/api/component/component.mjs +91 -14
  13. package/api/component/component.test.mjs +38 -0
  14. package/api/component/component.type.d.mts +16 -5
  15. package/api/component/component.type.mjs +13 -5
  16. package/api/component/detail/blocks/blocks.d.mts +2 -1
  17. package/api/component/detail/blocks/blocks.mjs +4 -3
  18. package/api/component/list/list.d.mts +0 -5
  19. package/api/component/list/list.mjs +40 -11
  20. package/api/discover/discover.doc.mjs +2 -1
  21. package/api/docs/_adapter.d.mts +210 -34
  22. package/api/docs/_adapter.mjs +674 -134
  23. package/api/docs/detail/detail.mjs +11 -3
  24. package/api/docs/detail/section/section.mjs +24 -13
  25. package/api/docs/detail/section/section.test.mjs +15 -6
  26. package/api/docs/docs.d.mts +5 -3
  27. package/api/docs/docs.doc.mjs +36 -15
  28. package/api/docs/docs.mjs +44 -8
  29. package/api/docs/docs.test.mjs +158 -4
  30. package/api/docs/docs.type.d.mts +165 -2
  31. package/api/docs/docs.type.mjs +101 -3
  32. package/api/docs/index/index.mjs +11 -3
  33. package/api/docs/index/index.test.mjs +1 -1
  34. package/api/docs/integration-tree.test.mjs +547 -0
  35. package/api/docs/integrationDocs.test.mjs +14 -14
  36. package/api/docs/list/list.mjs +28 -12
  37. package/api/docs/node/node.d.mts +43 -0
  38. package/api/docs/node/node.mjs +192 -0
  39. package/api/doctor/doctor.d.mts +54 -4
  40. package/api/doctor/doctor.doc.mjs +1 -0
  41. package/api/doctor/doctor.mjs +327 -16
  42. package/api/doctor/doctor.test.mjs +420 -7
  43. package/api/gap-report/gap-report.doc.mjs +8 -4
  44. package/api/hook/_adapter.mjs +19 -5
  45. package/api/hook/hook.doc.mjs +1 -0
  46. package/api/hook/list/list.d.mts +1 -1
  47. package/api/hook/list/list.mjs +69 -17
  48. package/api/index.d.mts +1 -1
  49. package/api/index.mjs +1 -0
  50. package/api/init/init.doc.mjs +6 -1
  51. package/api/init/init.test.mjs +41 -1
  52. package/api/init/remove/remove.mjs +1 -1
  53. package/api/init/run/run.mjs +20 -10
  54. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  55. package/api/integration/add-contribution.d.mts +2 -1
  56. package/api/integration/add-contribution.mjs +125 -12
  57. package/api/integration/add-contribution.test.mjs +254 -3
  58. package/api/integration/add-theme.mjs +34 -64
  59. package/api/integration/add-theme.test.mjs +105 -21
  60. package/api/integration/authoring-checks.mjs +108 -31
  61. package/api/integration/authoring-checks.test.mjs +171 -6
  62. package/api/integration/authoring-checks.type.d.mts +3 -1
  63. package/api/integration/authoring-checks.type.mjs +3 -1
  64. package/api/integration/integration-authoring.type.d.mts +2 -0
  65. package/api/integration/integration-authoring.type.mjs +2 -0
  66. package/api/integration/integration-block-exports.test.mjs +10 -6
  67. package/api/integration/integrationAdd.doc.mjs +14 -4
  68. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  69. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  70. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  71. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  72. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  73. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  74. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  75. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  76. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  77. package/api/integration/integrationTemplateConflicts.doc.mjs +7 -5
  78. package/api/integration/pack-check.mjs +34 -0
  79. package/api/integration/pack-check.test.mjs +138 -47
  80. package/api/integration/pack-check.type.d.mts +26 -2
  81. package/api/integration/pack-check.type.mjs +14 -1
  82. package/api/integration/summarizeIssues.doc.mjs +1 -0
  83. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  84. package/api/integration/validate-integration.mjs +52 -102
  85. package/api/integration/validate-integration.test.mjs +179 -26
  86. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  87. package/api/integration/validateIntegration.doc.mjs +3 -2
  88. package/api/json/assertResponse.doc.mjs +1 -0
  89. package/api/json/envelope-types.test.mjs +76 -0
  90. package/api/json/index.ts +2 -0
  91. package/api/json/isError.doc.mjs +1 -0
  92. package/api/json/parseResponse.doc.mjs +3 -2
  93. package/api/layout/_adapter.mjs +20 -5
  94. package/api/layout/expand/expand.mjs +7 -5
  95. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  96. package/api/layout/grammar/grammar.mjs +2 -1
  97. package/api/layout/layoutCheck.doc.mjs +1 -0
  98. package/api/layout/layoutExpand.doc.mjs +2 -1
  99. package/api/layout/layoutGrammar.doc.mjs +1 -0
  100. package/api/search/search-return-type.test.mjs +54 -0
  101. package/api/search/search.d.mts +28 -10
  102. package/api/search/search.doc.mjs +8 -2
  103. package/api/search/search.mjs +334 -38
  104. package/api/search/search.test.mjs +124 -1
  105. package/api/search/search.type.d.mts +13 -1
  106. package/api/search/search.type.mjs +4 -1
  107. package/api/swizzle/copy/copy.mjs +28 -11
  108. package/api/swizzle/swizzle.doc.mjs +2 -1
  109. package/api/template/copy/copy.mjs +17 -23
  110. package/api/template/copy/copy.test.mjs +17 -0
  111. package/api/template/list/list.mjs +1 -0
  112. package/api/template/template-integration.test.mjs +1022 -3
  113. package/api/template/template-suffix.test.mjs +41 -21
  114. package/api/template/template.doc.mjs +30 -8
  115. package/api/template/template.mjs +45 -8
  116. package/api/template/template.type.d.mts +6 -8
  117. package/api/template/template.type.mjs +3 -2
  118. package/api/theme/_adapter.d.mts +2 -3
  119. package/api/theme/_adapter.mjs +4 -5
  120. package/api/theme/add/add.binary.test.mjs +84 -0
  121. package/api/theme/add/add.mjs +20 -3
  122. package/api/theme/add/add.staging.test.mjs +66 -0
  123. package/api/theme/add/add.test.mjs +14 -1
  124. package/api/theme/build/build.mjs +114 -37
  125. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  126. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  127. package/api/theme/build/font-warning.mjs +3 -3
  128. package/api/theme/build/font-warning.test.mjs +5 -2
  129. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  130. package/api/theme/integration-themes.test.mjs +39 -28
  131. package/api/theme/list/list.test.mjs +19 -20
  132. package/api/theme/listThemes.doc.mjs +6 -5
  133. package/api/theme/palette/generate/generate.mjs +7 -2
  134. package/api/theme/palette/generate/generate.test.mjs +96 -0
  135. package/api/theme/palette/generate/generator.mjs +8 -1
  136. package/api/theme/palette/generate/generator.test.mjs +10 -0
  137. package/api/theme/template/template.mjs +11 -2
  138. package/api/theme/template/template.test.mjs +20 -0
  139. package/api/theme/themeAdd.doc.mjs +4 -3
  140. package/api/theme/themeBuild.doc.mjs +8 -4
  141. package/api/theme/themeList.doc.mjs +6 -3
  142. package/api/theme/themeListAvailable.doc.mjs +5 -3
  143. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  144. package/api/theme/themeTargets.doc.mjs +1 -0
  145. package/api/theme/themeTemplate.doc.mjs +6 -2
  146. package/api/upgrade/_adapter.d.mts +32 -5
  147. package/api/upgrade/_adapter.mjs +124 -73
  148. package/api/upgrade/list/list.mjs +2 -1
  149. package/api/upgrade/list/list.test.mjs +73 -0
  150. package/api/upgrade/provider-agreement.test.mjs +152 -0
  151. package/api/upgrade/run/run.mjs +356 -59
  152. package/api/upgrade/status/status.mjs +2 -2
  153. package/api/upgrade/upgrade.doc.mjs +8 -2
  154. package/api/upgrade/upgrade.type.d.mts +38 -0
  155. package/api/upgrade/upgrade.type.mjs +16 -0
  156. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  157. package/assets/codemods/integration-discovery.mjs +8 -2
  158. package/assets/codemods/integration-discovery.test.mjs +15 -0
  159. package/assets/codemods/integration-runner.mjs +56 -4
  160. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  161. package/assets/codemods/run-codemod.mjs +177 -34
  162. package/assets/codemods/runner.mjs +350 -102
  163. package/assets/codemods/term-log.mjs +32 -8
  164. package/assets/codemods/term-log.test.mjs +19 -1
  165. package/assets/codemods/transform-prop.mjs +109 -0
  166. package/assets/codemods/transform-prop.test.mjs +95 -0
  167. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  168. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  169. package/assets/codemods/transforms/next/index.mjs +19 -1
  170. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  171. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  172. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  173. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  174. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  175. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  176. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  177. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  178. package/assets/docs/getting-started.doc.mjs +2 -2
  179. package/assets/docs/principles.doc.mjs +6 -6
  180. package/assets/docs/styling-libraries.doc.mjs +2 -2
  181. package/assets/docs/styling.doc.mjs +4 -4
  182. package/assets/docs/theme.doc.mjs +4 -4
  183. package/assets/docs/tokens.doc.mjs +1 -1
  184. package/assets/docs/tree/api.doc.mjs +30 -0
  185. package/assets/docs/tree/cli.doc.mjs +23 -0
  186. package/assets/docs/tree/commands.doc.mjs +25 -0
  187. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  188. package/assets/docs/tree/integrations.test.mjs +62 -0
  189. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  190. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  191. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  192. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  193. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  194. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  195. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  196. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  197. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  198. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  199. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  200. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  201. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  202. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  203. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  204. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  205. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  206. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  207. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  208. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  209. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  210. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  211. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  212. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  213. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  214. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  215. package/authoring/codemod/codemod.doc.mjs +1 -1
  216. package/authoring/codemod/type.ts +12 -0
  217. package/authoring/config/config.doc.mjs +2 -2
  218. package/authoring/config/debug-composition.test.mjs +92 -0
  219. package/authoring/config/type.ts +15 -3
  220. package/authoring/debug/debug.doc.d.mts +11 -0
  221. package/authoring/debug/debug.doc.mjs +182 -0
  222. package/authoring/debug/parse.d.mts +3 -3
  223. package/authoring/doctypes/_schema.d.mts +71 -141
  224. package/authoring/doctypes/_schema.mjs +29 -2
  225. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  226. package/authoring/doctypes/base/type.ts +6 -5
  227. package/authoring/doctypes/command/command.doc.mjs +1 -1
  228. package/authoring/doctypes/command/type.ts +2 -2
  229. package/authoring/doctypes/component/type.ts +2 -2
  230. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  231. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  232. package/authoring/doctypes/enum/type.ts +1 -1
  233. package/authoring/doctypes/function/function.doc.mjs +3 -2
  234. package/authoring/doctypes/function/type.ts +3 -2
  235. package/authoring/doctypes/hook/type.ts +2 -2
  236. package/authoring/doctypes/load-contract.test.mjs +3 -2
  237. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  238. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  239. package/authoring/doctypes/namespace/type.ts +5 -2
  240. package/authoring/doctypes/parse.d.mts +4 -2
  241. package/authoring/doctypes/parse.mjs +10 -5
  242. package/authoring/doctypes/reference/reference.doc.mjs +7 -5
  243. package/authoring/doctypes/reference/type.ts +12 -10
  244. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  245. package/authoring/doctypes/schema/type.ts +1 -2
  246. package/authoring/doctypes/template/parse.d.mts +2 -0
  247. package/authoring/doctypes/template/parse.mjs +4 -0
  248. package/authoring/doctypes/template/parse.test.mjs +18 -0
  249. package/authoring/doctypes/template/template.doc.mjs +9 -3
  250. package/authoring/doctypes/template/type.ts +8 -0
  251. package/authoring/doctypes/theme/parse.d.mts +35 -0
  252. package/authoring/doctypes/theme/parse.mjs +76 -0
  253. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  254. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  255. package/authoring/doctypes/theme/type.ts +42 -0
  256. package/authoring/doctypes/types.ts +2 -1
  257. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  258. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  259. package/authoring/identity/identity.doc.mjs +2 -2
  260. package/authoring/index.d.mts +1 -0
  261. package/authoring/index.d.ts +7 -4
  262. package/authoring/index.mjs +2 -1
  263. package/authoring/integration/integration.doc.mjs +2 -2
  264. package/authoring/integration/type.ts +4 -10
  265. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  266. package/clients/cli/command-load-failure.test.mjs +83 -0
  267. package/clients/cli/commands/blog.doc.mjs +1 -1
  268. package/clients/cli/commands/blog.mjs +23 -8
  269. package/clients/cli/commands/blog.test.mjs +42 -1
  270. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  271. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  272. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  273. package/clients/cli/commands/build-theme.mjs +16 -50
  274. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  275. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  276. package/clients/cli/commands/build.doc.mjs +5 -2
  277. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  278. package/clients/cli/commands/build.mjs +37 -49
  279. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  280. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  281. package/clients/cli/commands/component/index.mjs +3 -8
  282. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  283. package/clients/cli/commands/component-package.test.mjs +46 -0
  284. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  285. package/clients/cli/commands/component.doc.mjs +1 -1
  286. package/clients/cli/commands/component.test.mjs +19 -0
  287. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  288. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  289. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  290. package/clients/cli/commands/discover.doc.mjs +5 -3
  291. package/clients/cli/commands/discover.mjs +4 -4
  292. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  293. package/clients/cli/commands/docs.doc.mjs +21 -9
  294. package/clients/cli/commands/docs.mjs +182 -68
  295. package/clients/cli/commands/docs.test.mjs +120 -16
  296. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  297. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  298. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  299. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  300. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  301. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  302. package/clients/cli/commands/doctor-integration.test.mjs +83 -8
  303. package/clients/cli/commands/doctor.doc.mjs +1 -1
  304. package/clients/cli/commands/doctor.mjs +30 -25
  305. package/clients/cli/commands/doctor.test.mjs +42 -0
  306. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  307. package/clients/cli/commands/gap-report.test.mjs +72 -0
  308. package/clients/cli/commands/hook/index.mjs +7 -17
  309. package/clients/cli/commands/hook.doc.mjs +1 -1
  310. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  311. package/clients/cli/commands/init.doc.mjs +20 -9
  312. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  313. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  314. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  315. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  316. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  317. package/clients/cli/commands/integration.doc.mjs +1 -1
  318. package/clients/cli/commands/integration.mjs +1 -0
  319. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  320. package/clients/cli/commands/json-contract.test.mjs +33 -0
  321. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  322. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  323. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  324. package/clients/cli/commands/layout.doc.mjs +3 -3
  325. package/clients/cli/commands/layout.mjs +21 -9
  326. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  327. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  328. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  329. package/clients/cli/commands/manifest.doc.mjs +1 -1
  330. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  331. package/clients/cli/commands/search.doc.mjs +7 -4
  332. package/clients/cli/commands/search.mjs +28 -9
  333. package/clients/cli/commands/search.test.mjs +75 -0
  334. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  335. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  336. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  337. package/clients/cli/commands/template.doc.mjs +52 -13
  338. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  339. package/clients/cli/commands/template.mjs +4 -91
  340. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  341. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  342. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  343. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  344. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  345. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  346. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  347. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  348. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  349. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  350. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  351. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  352. package/clients/cli/commands/theme.doc.mjs +1 -1
  353. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  354. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  355. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  356. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  357. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  358. package/clients/cli/commands/upgrade.mjs +29 -7
  359. package/clients/cli/formatters/index.mjs +2 -0
  360. package/clients/cli/formatters/index.test.mjs +6 -0
  361. package/clients/cli/index.mjs +21 -30
  362. package/clients/cli/latest-version-env.test.mjs +50 -0
  363. package/clients/cli/lib/cli-error.test.mjs +7 -0
  364. package/clients/cli/lib/component-format.mjs +9 -9
  365. package/clients/cli/lib/component-format.test.mjs +1 -1
  366. package/clients/cli/lib/define-command.mjs +32 -6
  367. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  368. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  369. package/clients/cli/lib/hook-format.mjs +19 -10
  370. package/clients/cli/lib/json-shim.mjs +38 -2
  371. package/clients/cli/lib/json-shim.test.mjs +83 -0
  372. package/clients/cli/lib/manifest.d.ts +2 -0
  373. package/clients/cli/lib/manifest.mjs +31 -2
  374. package/clients/cli/lib/manifest.test.mjs +17 -0
  375. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  376. package/foundation/agent-docs/agent-docs.mjs +70 -3
  377. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  378. package/foundation/agent-docs/agent-docs.test.mjs +10 -1
  379. package/foundation/config/integration-debug.test.mjs +28 -3
  380. package/foundation/config/project-themes.test.mjs +11 -19
  381. package/foundation/config/project.d.mts +20 -11
  382. package/foundation/config/project.mjs +246 -89
  383. package/foundation/config/project.test.mjs +270 -21
  384. package/foundation/discovery/authoring-self-docs.d.mts +6 -0
  385. package/foundation/discovery/authoring-self-docs.mjs +17 -7
  386. package/foundation/discovery/authoring-self-docs.test.mjs +20 -9
  387. package/foundation/discovery/authoring-surface.d.mts +74 -0
  388. package/foundation/discovery/authoring-surface.mjs +525 -0
  389. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  390. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  391. package/foundation/discovery/cli-self-docs.mjs +490 -0
  392. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  393. package/foundation/discovery/component-discovery.d.mts +38 -0
  394. package/foundation/discovery/component-discovery.mjs +48 -0
  395. package/foundation/discovery/component-loader.d.mts +35 -38
  396. package/foundation/discovery/component-loader.mjs +53 -222
  397. package/foundation/discovery/docs-discovery.d.mts +108 -10
  398. package/foundation/discovery/docs-discovery.mjs +191 -30
  399. package/foundation/discovery/docs-discovery.test.mjs +71 -32
  400. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  401. package/foundation/discovery/docs-output-budget.mjs +1 -1
  402. package/foundation/discovery/docs-section-key.d.mts +28 -10
  403. package/foundation/discovery/docs-section-key.mjs +134 -33
  404. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  405. package/foundation/discovery/template-adapter.d.mts +113 -11
  406. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  407. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  408. package/foundation/discovery/template-adapter.mjs +772 -82
  409. package/foundation/discovery/template-adapter.test.mjs +57 -0
  410. package/foundation/discovery/theme-discovery.d.mts +67 -7
  411. package/foundation/discovery/theme-discovery.mjs +916 -186
  412. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  413. package/foundation/doc-compiler/bundle.d.mts +47 -0
  414. package/foundation/doc-compiler/bundle.mjs +278 -0
  415. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  416. package/foundation/doc-compiler/compile.d.mts +220 -39
  417. package/foundation/doc-compiler/compile.mjs +311 -15
  418. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  419. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  420. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  421. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  422. package/foundation/doc-compiler/import.d.mts +24 -0
  423. package/foundation/doc-compiler/import.mjs +59 -0
  424. package/foundation/doc-compiler/inputs.d.mts +102 -0
  425. package/foundation/doc-compiler/inputs.mjs +291 -0
  426. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  427. package/foundation/doc-compiler/ir.d.mts +13 -0
  428. package/foundation/doc-compiler/ir.mjs +196 -12
  429. package/foundation/doc-compiler/lenses.d.mts +3 -2
  430. package/foundation/doc-compiler/lenses.mjs +2 -1
  431. package/foundation/doc-compiler/links.d.mts +135 -0
  432. package/foundation/doc-compiler/links.mjs +253 -0
  433. package/foundation/doc-compiler/links.test.mjs +139 -0
  434. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  435. package/foundation/doc-compiler/overlays.d.mts +37 -0
  436. package/foundation/doc-compiler/overlays.mjs +206 -0
  437. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  438. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  439. package/foundation/doc-compiler/read.d.mts +127 -0
  440. package/foundation/doc-compiler/read.mjs +325 -0
  441. package/foundation/doc-compiler/read.test.mjs +313 -0
  442. package/foundation/doc-compiler/source.d.mts +33 -0
  443. package/foundation/doc-compiler/source.mjs +128 -0
  444. package/foundation/doc-compiler/tree.d.mts +288 -0
  445. package/foundation/doc-compiler/tree.mjs +876 -0
  446. package/foundation/doc-compiler/tree.test.mjs +598 -0
  447. package/foundation/fs/file-protection.d.mts +33 -0
  448. package/foundation/fs/file-protection.mjs +825 -0
  449. package/foundation/fs/file-protection.test.mjs +250 -0
  450. package/foundation/fs/module-loader.d.mts +1 -0
  451. package/foundation/fs/module-loader.mjs +50 -1
  452. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  453. package/foundation/fs/path-safety.d.mts +3 -2
  454. package/foundation/fs/path-safety.mjs +49 -19
  455. package/foundation/fs/path-safety.test.mjs +50 -0
  456. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  457. package/foundation/integrations/autolink.d.mts +58 -1
  458. package/foundation/integrations/autolink.mjs +143 -52
  459. package/foundation/integrations/autolink.test.mjs +1 -1
  460. package/foundation/integrations/cli-requirement.d.mts +45 -0
  461. package/foundation/integrations/cli-requirement.mjs +154 -0
  462. package/foundation/integrations/cli-requirement.test.mjs +109 -0
  463. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  464. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  465. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  466. package/foundation/integrations/contribution-inventory.mjs +27 -24
  467. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  468. package/foundation/integrations/integration-warnings.d.mts +9 -2
  469. package/foundation/integrations/integration-warnings.mjs +51 -26
  470. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  471. package/foundation/integrations/integrations.d.mts +3 -0
  472. package/foundation/integrations/integrations.mjs +11 -97
  473. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  474. package/foundation/integrations/provider-resolution.d.mts +152 -0
  475. package/foundation/integrations/provider-resolution.mjs +576 -0
  476. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  477. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  478. package/foundation/integrations/theme-descriptor.mjs +44 -0
  479. package/foundation/integrations/validate-contributions.mjs +121 -29
  480. package/foundation/response/base.d.ts +8 -4
  481. package/foundation/response/error-codes.d.mts +3 -1
  482. package/foundation/response/error-codes.d.ts +2 -0
  483. package/foundation/response/error-codes.doc.mjs +13 -4
  484. package/foundation/response/error-codes.mjs +8 -2
  485. package/foundation/response/error-codes.test.mjs +137 -10
  486. package/foundation/response/json-contract.test.mjs +11 -0
  487. package/foundation/response/json.d.mts +4 -2
  488. package/foundation/response/json.mjs +8 -10
  489. package/foundation/response/response-types.doc.mjs +22 -17
  490. package/foundation/response/response-types.doc.test.mjs +158 -0
  491. package/foundation/response/response.doc.mjs +1 -1
  492. package/foundation/text/string-utils.mjs +22 -10
  493. package/foundation/xle/expand.d.mts +2 -0
  494. package/foundation/xle/expand.mjs +4 -3
  495. package/foundation/xle/expand.test.mjs +54 -0
  496. package/foundation/xle/xle.test.mjs +13 -0
  497. package/package.json +10 -9
  498. package/assets/templates/themes/manifest.json +0 -95
  499. package/clients/cli/lib/update-check.mjs +0 -83
  500. package/clients/cli/lib/update-check.test.mjs +0 -137
  501. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -0,0 +1,135 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * @typedef {object} LinkTarget
6
+ * @property {string | null} provider the provider id it names, or null for the
7
+ * linking doc's own provider
8
+ * @property {string} kind
9
+ * @property {string} name
10
+ */
11
+ /**
12
+ * The doc a link opens, as a docs read returns it.
13
+ * @typedef {object} DocLink
14
+ * @property {string} target the target as written: `[<provider>:]<kind>:<name>`
15
+ * @property {string} id the doc's identity (a DocId)
16
+ * @property {string} route what `astryx docs <route>` opens
17
+ * @property {string} title
18
+ * @property {string} summary
19
+ * @property {string} command the command that opens it, `astryx docs <route>`
20
+ */
21
+ /**
22
+ * Finds the doc a target names, or says why none matches.
23
+ * @typedef {(target: string) => Promise<DocLink | {problem: string}>} LinkResolver
24
+ */
25
+ /**
26
+ * @typedef {object} LinkProblem
27
+ * @property {string} target the target as written
28
+ * @property {string} message
29
+ * @property {string} [section] the key of the section the link sits in
30
+ */
31
+ /**
32
+ * Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
33
+ * (`command:theme build`); no part holds a colon.
34
+ * @param {unknown} target
35
+ * @returns {LinkTarget | {error: string}}
36
+ */
37
+ export function parseLinkTarget(target: unknown): LinkTarget | {
38
+ error: string;
39
+ };
40
+ /**
41
+ * Text with each inline link replaced by its name, for indexes that must not
42
+ * read the link syntax as words.
43
+ * @param {string} text
44
+ * @returns {string}
45
+ */
46
+ export function unlinkText(text: string): string;
47
+ /**
48
+ * Resolve every link in a list of content blocks, in order.
49
+ * @param {any[]} blocks
50
+ * @param {LinkResolver} resolve
51
+ * @param {{section?: string}} [at]
52
+ * @returns {Promise<{content: any[], problems: LinkProblem[]}>}
53
+ */
54
+ export function linkBlocks(blocks: any[], resolve: LinkResolver, at?: {
55
+ section?: string;
56
+ }): Promise<{
57
+ content: any[];
58
+ problems: LinkProblem[];
59
+ }>;
60
+ /**
61
+ * Resolve every link in a topic's sections.
62
+ * @param {any[]} sections
63
+ * @param {LinkResolver} resolve
64
+ * @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
65
+ */
66
+ export function linkSections(sections: any[], resolve: LinkResolver): Promise<{
67
+ sections: any[];
68
+ problems: LinkProblem[];
69
+ }>;
70
+ /**
71
+ * @file Links between docs, named by doc identity (spec:AST-047 FR9).
72
+ *
73
+ * @input A link target, `[<provider>:]<kind>:<name>`, written as a `reference`
74
+ * block, in a `workflow` step's `references`, or inline in text as
75
+ * `{@link <target>}`; and a resolver that finds the doc a target names.
76
+ * @output The same content with every link resolved: an inline link becomes
77
+ * the `astryx docs` command that opens its doc, and a block carries a `link`
78
+ * with the doc's identity, route, title, summary, and command. A link that
79
+ * names no doc is a problem, never a guess.
80
+ * @position Pure. The docs adapter owns the resolver (the project's docs tree
81
+ * and topic catalog) and applies this to every read and every doctor check.
82
+ */
83
+ /** The kinds a link can name: every authored doc kind. */
84
+ export const LINK_KINDS: Set<string>;
85
+ /** An inline link in text: `{@link <target>}`. */
86
+ export const INLINE_LINK: RegExp;
87
+ export type LinkTarget = {
88
+ /**
89
+ * the provider id it names, or null for the
90
+ * linking doc's own provider
91
+ */
92
+ provider: string | null;
93
+ kind: string;
94
+ name: string;
95
+ };
96
+ /**
97
+ * The doc a link opens, as a docs read returns it.
98
+ */
99
+ export type DocLink = {
100
+ /**
101
+ * the target as written: `[<provider>:]<kind>:<name>`
102
+ */
103
+ target: string;
104
+ /**
105
+ * the doc's identity (a DocId)
106
+ */
107
+ id: string;
108
+ /**
109
+ * what `astryx docs <route>` opens
110
+ */
111
+ route: string;
112
+ title: string;
113
+ summary: string;
114
+ /**
115
+ * the command that opens it, `astryx docs <route>`
116
+ */
117
+ command: string;
118
+ };
119
+ /**
120
+ * Finds the doc a target names, or says why none matches.
121
+ */
122
+ export type LinkResolver = (target: string) => Promise<DocLink | {
123
+ problem: string;
124
+ }>;
125
+ export type LinkProblem = {
126
+ /**
127
+ * the target as written
128
+ */
129
+ target: string;
130
+ message: string;
131
+ /**
132
+ * the key of the section the link sits in
133
+ */
134
+ section?: string | undefined;
135
+ };
@@ -0,0 +1,253 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Links between docs, named by doc identity (spec:AST-047 FR9).
5
+ *
6
+ * @input A link target, `[<provider>:]<kind>:<name>`, written as a `reference`
7
+ * block, in a `workflow` step's `references`, or inline in text as
8
+ * `{@link <target>}`; and a resolver that finds the doc a target names.
9
+ * @output The same content with every link resolved: an inline link becomes
10
+ * the `astryx docs` command that opens its doc, and a block carries a `link`
11
+ * with the doc's identity, route, title, summary, and command. A link that
12
+ * names no doc is a problem, never a guess.
13
+ * @position Pure. The docs adapter owns the resolver (the project's docs tree
14
+ * and topic catalog) and applies this to every read and every doctor check.
15
+ */
16
+
17
+ /** The kinds a link can name: every authored doc kind. */
18
+ export const LINK_KINDS = new Set([
19
+ 'generic',
20
+ 'command',
21
+ 'function',
22
+ 'schema',
23
+ 'enum',
24
+ 'namespace',
25
+ 'component',
26
+ 'page',
27
+ 'block',
28
+ ]);
29
+
30
+ /** An inline link in text: `{@link <target>}`. */
31
+ export const INLINE_LINK = /\{@link\s+([^{}]+?)\s*\}/g;
32
+
33
+ /** Code spans in text, which show link syntax as written. */
34
+ const CODE_SPAN = /(`[^`]*`)/;
35
+
36
+ /**
37
+ * @typedef {object} LinkTarget
38
+ * @property {string | null} provider the provider id it names, or null for the
39
+ * linking doc's own provider
40
+ * @property {string} kind
41
+ * @property {string} name
42
+ */
43
+
44
+ /**
45
+ * The doc a link opens, as a docs read returns it.
46
+ * @typedef {object} DocLink
47
+ * @property {string} target the target as written: `[<provider>:]<kind>:<name>`
48
+ * @property {string} id the doc's identity (a DocId)
49
+ * @property {string} route what `astryx docs <route>` opens
50
+ * @property {string} title
51
+ * @property {string} summary
52
+ * @property {string} command the command that opens it, `astryx docs <route>`
53
+ */
54
+
55
+ /**
56
+ * Finds the doc a target names, or says why none matches.
57
+ * @typedef {(target: string) => Promise<DocLink | {problem: string}>} LinkResolver
58
+ */
59
+
60
+ /**
61
+ * @typedef {object} LinkProblem
62
+ * @property {string} target the target as written
63
+ * @property {string} message
64
+ * @property {string} [section] the key of the section the link sits in
65
+ */
66
+
67
+ /**
68
+ * Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
69
+ * (`command:theme build`); no part holds a colon.
70
+ * @param {unknown} target
71
+ * @returns {LinkTarget | {error: string}}
72
+ */
73
+ export function parseLinkTarget(target) {
74
+ if (typeof target !== 'string' || target.trim() === '') {
75
+ return {
76
+ error:
77
+ 'a link target is a non-empty string: `[<provider>:]<kind>:<name>`',
78
+ };
79
+ }
80
+ const parts = target.trim().split(':');
81
+ if (parts.length < 2 || parts.length > 3 || parts.some(p => p.trim() === '')) {
82
+ return {error: `"${target}" is not \`[<provider>:]<kind>:<name>\``};
83
+ }
84
+ const provider = parts.length === 3 ? parts[0].trim() : null;
85
+ const kind = parts[parts.length - 2].trim();
86
+ const name = parts[parts.length - 1].trim();
87
+ if (!LINK_KINDS.has(kind)) {
88
+ return {
89
+ error: `"${target}" names the kind "${kind}"; a doc kind is one of ${[
90
+ ...LINK_KINDS,
91
+ ].join(', ')}`,
92
+ };
93
+ }
94
+ return {provider, kind, name};
95
+ }
96
+
97
+ /**
98
+ * Text with each inline link replaced by its name, for indexes that must not
99
+ * read the link syntax as words.
100
+ * @param {string} text
101
+ * @returns {string}
102
+ */
103
+ export function unlinkText(text) {
104
+ return text
105
+ .split(CODE_SPAN)
106
+ .map(part =>
107
+ part.startsWith('`')
108
+ ? part
109
+ : part.replace(INLINE_LINK, (_, target) => {
110
+ const parsed = parseLinkTarget(target);
111
+ return 'error' in parsed ? target : parsed.name;
112
+ }),
113
+ )
114
+ .join('');
115
+ }
116
+
117
+ /**
118
+ * Resolve every link in a list of content blocks, in order.
119
+ * @param {any[]} blocks
120
+ * @param {LinkResolver} resolve
121
+ * @param {{section?: string}} [at]
122
+ * @returns {Promise<{content: any[], problems: LinkProblem[]}>}
123
+ */
124
+ export async function linkBlocks(blocks, resolve, at = {}) {
125
+ /** @type {LinkProblem[]} */
126
+ const problems = [];
127
+ const where = at.section ? {section: at.section} : {};
128
+ /**
129
+ * @param {string} target
130
+ * @returns {Promise<DocLink | null>}
131
+ */
132
+ const find = async target => {
133
+ const found = await resolve(target);
134
+ if ('problem' in found) {
135
+ problems.push({target, message: found.problem, ...where});
136
+ return null;
137
+ }
138
+ return found;
139
+ };
140
+ /**
141
+ * @param {unknown} text
142
+ * @returns {Promise<any>}
143
+ */
144
+ const linkText = async text => {
145
+ if (typeof text !== 'string' || !text.includes('{@link')) return text;
146
+ let out = '';
147
+ // A link written inside code ticks is shown as written: it documents the
148
+ // syntax, it does not link.
149
+ for (const part of text.split(CODE_SPAN)) {
150
+ if (part.startsWith('`')) {
151
+ out += part;
152
+ continue;
153
+ }
154
+ let last = 0;
155
+ for (const match of part.matchAll(INLINE_LINK)) {
156
+ const link = await find(match[1]);
157
+ const at = /** @type {number} */ (match.index);
158
+ out += part.slice(last, at);
159
+ // A link that names no doc prints as written: text that was never
160
+ // meant as a link reads the way it did, and doctor names the problem.
161
+ out += link ? `\`${link.command}\`` : match[0];
162
+ last = at + match[0].length;
163
+ }
164
+ out += part.slice(last);
165
+ }
166
+ return out;
167
+ };
168
+ /**
169
+ * @param {unknown[]} values
170
+ * @returns {Promise<any[]>}
171
+ */
172
+ const linkAll = async values => {
173
+ const out = [];
174
+ for (const value of values) out.push(await linkText(value));
175
+ return out;
176
+ };
177
+
178
+ const content = [];
179
+ for (const block of blocks ?? []) {
180
+ switch (block?.type) {
181
+ case 'prose':
182
+ case 'heading':
183
+ content.push({...block, text: await linkText(block.text)});
184
+ break;
185
+ case 'list':
186
+ content.push({...block, items: await linkAll(block.items ?? [])});
187
+ break;
188
+ case 'table': {
189
+ const rows = [];
190
+ for (const row of block.rows ?? []) rows.push(await linkAll(row));
191
+ content.push({
192
+ ...block,
193
+ headers: await linkAll(block.headers ?? []),
194
+ rows,
195
+ });
196
+ break;
197
+ }
198
+ case 'reference':
199
+ content.push({...block, link: await find(block.target)});
200
+ break;
201
+ case 'workflow': {
202
+ const steps = [];
203
+ for (const step of block.steps ?? []) {
204
+ /** @type {any} */
205
+ const linked = {...step};
206
+ if (step.description != null) {
207
+ linked.description = await linkText(step.description);
208
+ }
209
+ if (Array.isArray(step.references)) {
210
+ const links = [];
211
+ for (const target of step.references) links.push(await find(target));
212
+ linked.links = links;
213
+ }
214
+ steps.push(linked);
215
+ }
216
+ content.push({...block, steps});
217
+ break;
218
+ }
219
+ case 'collection':
220
+ problems.push({
221
+ target: `collection:${block.source?.slot ?? ''}`,
222
+ message:
223
+ 'a collection block is not rendered yet; link each doc with a reference block instead',
224
+ ...where,
225
+ });
226
+ content.push(block);
227
+ break;
228
+ default:
229
+ content.push(block);
230
+ }
231
+ }
232
+ return {content, problems};
233
+ }
234
+
235
+ /**
236
+ * Resolve every link in a topic's sections.
237
+ * @param {any[]} sections
238
+ * @param {LinkResolver} resolve
239
+ * @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
240
+ */
241
+ export async function linkSections(sections, resolve) {
242
+ /** @type {LinkProblem[]} */
243
+ const problems = [];
244
+ const out = [];
245
+ for (const section of sections ?? []) {
246
+ const linked = await linkBlocks(section.content, resolve, {
247
+ section: section.id ?? section.title,
248
+ });
249
+ problems.push(...linked.problems);
250
+ out.push({...section, content: linked.content});
251
+ }
252
+ return {sections: out, problems};
253
+ }
@@ -0,0 +1,139 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Links between docs (spec:AST-047 FR9): the target grammar, and how a
5
+ * list of blocks comes back with every link resolved or named as a problem.
6
+ */
7
+
8
+ import {describe, expect, it} from 'vitest';
9
+ import {
10
+ linkBlocks,
11
+ linkSections,
12
+ parseLinkTarget,
13
+ unlinkText,
14
+ } from './links.mjs';
15
+
16
+ /** A resolver over two docs, the second from another provider. */
17
+ const resolve = async (/** @type {string} */ target) => {
18
+ const docs = {
19
+ 'command:doctor': {route: 'cli/commands/doctor', title: 'astryx doctor'},
20
+ '@acme/kit:generic:setup': {route: 'acme/setup', title: 'Set up Acme'},
21
+ };
22
+ const doc = /** @type {any} */ (docs)[target];
23
+ return doc
24
+ ? {
25
+ target,
26
+ id: `id:${target}`,
27
+ route: doc.route,
28
+ title: doc.title,
29
+ summary: `About ${doc.title}.`,
30
+ command: `astryx docs ${doc.route}`,
31
+ }
32
+ : {problem: `"${target}" names no doc`};
33
+ };
34
+
35
+ describe('parseLinkTarget', () => {
36
+ it('reads a doc of the same provider, or of a named one', () => {
37
+ expect(parseLinkTarget('command:theme build')).toEqual({
38
+ provider: null,
39
+ kind: 'command',
40
+ name: 'theme build',
41
+ });
42
+ expect(parseLinkTarget('@astryxdesign/cli:function:search')).toEqual({
43
+ provider: '@astryxdesign/cli',
44
+ kind: 'function',
45
+ name: 'search',
46
+ });
47
+ });
48
+
49
+ it('refuses a target that is not `[<provider>:]<kind>:<name>`', () => {
50
+ for (const bad of ['', 'search', 'a:b:c:d', 'command:', 'widget:x']) {
51
+ expect(parseLinkTarget(bad)).toHaveProperty('error');
52
+ }
53
+ });
54
+ });
55
+
56
+ describe('linkBlocks', () => {
57
+ it('reads an inline link as the command that opens its doc', async () => {
58
+ const {content, problems} = await linkBlocks(
59
+ [
60
+ {type: 'prose', text: 'Check it with {@link command:doctor}.'},
61
+ {type: 'list', style: 'unordered', items: ['See {@link @acme/kit:generic:setup}']},
62
+ {type: 'table', headers: ['Doc'], rows: [['{@link command:doctor}']]},
63
+ {type: 'code', lang: 'js', code: '{@link command:doctor}'},
64
+ ],
65
+ resolve,
66
+ );
67
+ expect(problems).toEqual([]);
68
+ expect(content[0].text).toBe('Check it with `astryx docs cli/commands/doctor`.');
69
+ expect(content[1].items).toEqual(['See `astryx docs acme/setup`']);
70
+ expect(content[2].rows).toEqual([['`astryx docs cli/commands/doctor`']]);
71
+ // Code is an example: it is shown as written.
72
+ expect(content[3].code).toBe('{@link command:doctor}');
73
+ });
74
+
75
+ it('shows a link written in code ticks as written', async () => {
76
+ const {content, problems} = await linkBlocks(
77
+ [{type: 'prose', text: 'Write `{@link <target>}` to link; {@link command:doctor} checks it.'}],
78
+ resolve,
79
+ );
80
+ expect(problems).toEqual([]);
81
+ expect(content[0].text).toBe(
82
+ 'Write `{@link <target>}` to link; `astryx docs cli/commands/doctor` checks it.',
83
+ );
84
+ });
85
+
86
+ it('gives a reference block and each workflow step the doc they name', async () => {
87
+ const {content, problems} = await linkBlocks(
88
+ [
89
+ {type: 'reference', target: 'command:doctor'},
90
+ {
91
+ type: 'workflow',
92
+ steps: [{title: 'Check', references: ['command:doctor']}],
93
+ },
94
+ ],
95
+ resolve,
96
+ );
97
+ expect(problems).toEqual([]);
98
+ expect(content[0].link).toMatchObject({
99
+ route: 'cli/commands/doctor',
100
+ command: 'astryx docs cli/commands/doctor',
101
+ title: 'astryx doctor',
102
+ });
103
+ expect(content[1].steps[0].links[0].command).toBe(
104
+ 'astryx docs cli/commands/doctor',
105
+ );
106
+ });
107
+
108
+ it('names every link that finds no doc, and never guesses', async () => {
109
+ const {content, problems} = await linkSections(
110
+ [
111
+ {
112
+ id: 'one',
113
+ title: 'One',
114
+ content: [
115
+ {type: 'prose', text: 'See {@link command:nope}.'},
116
+ {type: 'reference', target: 'generic:gone'},
117
+ {type: 'collection', source: {slot: 'guides'}},
118
+ ],
119
+ },
120
+ ],
121
+ resolve,
122
+ ).then(({sections, problems}) => ({content: sections[0].content, problems}));
123
+ expect(content[0].text).toBe('See {@link command:nope}.');
124
+ expect(content[1].link).toBeNull();
125
+ expect(problems.map(p => [p.section, p.target])).toEqual([
126
+ ['one', 'command:nope'],
127
+ ['one', 'generic:gone'],
128
+ ['one', 'collection:guides'],
129
+ ]);
130
+ });
131
+ });
132
+
133
+ describe('unlinkText', () => {
134
+ it('keeps the name of each link, for an index', () => {
135
+ expect(unlinkText('Run {@link command:theme build} or {@link x}.')).toBe(
136
+ 'Run theme build or x.',
137
+ );
138
+ });
139
+ });