@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25

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 (728) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +152 -107
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +22 -10
  7. package/api/build/build.test.mjs +219 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +208 -53
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +49 -19
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +277 -41
  54. package/api/docs/_adapter.mjs +993 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docOverlays.test.mjs +27 -1
  61. package/api/docs/docs.d.mts +10 -3
  62. package/api/docs/docs.doc.mjs +55 -16
  63. package/api/docs/docs.mjs +53 -10
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/list/list.mjs +28 -12
  70. package/api/docs/node/node.d.mts +43 -0
  71. package/api/docs/node/node.mjs +192 -0
  72. package/api/docs/reference-blocks.test.mjs +406 -0
  73. package/api/doctor/doctor.d.mts +104 -1
  74. package/api/doctor/doctor.doc.mjs +18 -8
  75. package/api/doctor/doctor.mjs +635 -7
  76. package/api/doctor/doctor.test.mjs +732 -11
  77. package/api/doctor/doctor.type.d.mts +1 -1
  78. package/api/doctor/doctor.type.mjs +1 -1
  79. package/api/gap-report/gap-report.doc.mjs +27 -14
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +7 -3
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -1
  87. package/api/index.mjs +6 -3
  88. package/api/init/init.doc.mjs +22 -12
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +56 -65
  99. package/api/integration/add-theme.test.mjs +139 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +5 -4
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  119. package/api/integration/pack-check.mjs +160 -11
  120. package/api/integration/pack-check.test.mjs +477 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +15 -2
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +2 -1
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -0
  133. package/api/json/isError.doc.mjs +2 -1
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/layout/_adapter.mjs +20 -5
  136. package/api/layout/expand/expand.mjs +7 -5
  137. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  138. package/api/layout/grammar/grammar.mjs +2 -1
  139. package/api/layout/layoutCheck.doc.mjs +1 -0
  140. package/api/layout/layoutExpand.doc.mjs +2 -1
  141. package/api/layout/layoutGrammar.doc.mjs +1 -0
  142. package/api/search/search-return-type.test.mjs +54 -0
  143. package/api/search/search.d.mts +89 -12
  144. package/api/search/search.doc.mjs +8 -2
  145. package/api/search/search.mjs +697 -97
  146. package/api/search/search.type.d.mts +15 -3
  147. package/api/search/search.type.mjs +5 -2
  148. package/api/swizzle/copy/copy.mjs +28 -11
  149. package/api/swizzle/swizzle.doc.mjs +8 -5
  150. package/api/swizzle/swizzle.type.d.mts +2 -2
  151. package/api/swizzle/swizzle.type.mjs +2 -2
  152. package/api/template/copy/copy.mjs +18 -24
  153. package/api/template/copy/copy.test.mjs +26 -0
  154. package/api/template/list/list.mjs +1 -0
  155. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  156. package/api/template/template-integration.test.mjs +1072 -3
  157. package/api/template/template-suffix.test.mjs +41 -21
  158. package/api/template/template.d.mts +1 -1
  159. package/api/template/template.doc.mjs +32 -9
  160. package/api/template/template.mjs +45 -8
  161. package/api/template/template.type.d.mts +12 -14
  162. package/api/template/template.type.mjs +15 -14
  163. package/api/theme/_adapter.d.mts +2 -3
  164. package/api/theme/_adapter.mjs +4 -5
  165. package/api/theme/add/add.binary.test.mjs +84 -0
  166. package/api/theme/add/add.mjs +31 -22
  167. package/api/theme/add/add.rollback.test.mjs +158 -0
  168. package/api/theme/add/add.staging.test.mjs +83 -0
  169. package/api/theme/add/add.test.mjs +14 -1
  170. package/api/theme/build/build.family.test.mjs +7 -12
  171. package/api/theme/build/build.mjs +140 -59
  172. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  173. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  174. package/api/theme/build/build.rollback.test.mjs +148 -0
  175. package/api/theme/build/build.test.mjs +127 -0
  176. package/api/theme/build/font-warning.mjs +3 -3
  177. package/api/theme/build/font-warning.test.mjs +5 -2
  178. package/api/theme/generateTonalPalette.doc.mjs +2 -2
  179. package/api/theme/integration-themes.test.mjs +39 -28
  180. package/api/theme/list/list.test.mjs +19 -20
  181. package/api/theme/listThemes.doc.mjs +6 -5
  182. package/api/theme/palette/generate/generate.mjs +8 -3
  183. package/api/theme/palette/generate/generate.test.mjs +96 -0
  184. package/api/theme/palette/generate/generator.d.mts +10 -13
  185. package/api/theme/palette/generate/generator.mjs +15 -4
  186. package/api/theme/palette/generate/generator.test.mjs +10 -0
  187. package/api/theme/template/template.mjs +11 -2
  188. package/api/theme/template/template.test.mjs +20 -0
  189. package/api/theme/theme.type.d.mts +170 -11
  190. package/api/theme/theme.type.mjs +94 -27
  191. package/api/theme/themeAdd.doc.mjs +12 -12
  192. package/api/theme/themeBuild.doc.mjs +21 -17
  193. package/api/theme/themeList.doc.mjs +6 -3
  194. package/api/theme/themeListAvailable.doc.mjs +6 -3
  195. package/api/theme/themePaletteGenerate.doc.mjs +16 -8
  196. package/api/theme/themeTargets.doc.mjs +4 -2
  197. package/api/theme/themeTemplate.doc.mjs +8 -3
  198. package/api/upgrade/_adapter.d.mts +32 -5
  199. package/api/upgrade/_adapter.mjs +139 -22
  200. package/api/upgrade/list/list.mjs +2 -1
  201. package/api/upgrade/list/list.test.mjs +73 -0
  202. package/api/upgrade/project-context.test.mjs +272 -0
  203. package/api/upgrade/provider-agreement.test.mjs +152 -0
  204. package/api/upgrade/run/files-changed.test.mjs +111 -0
  205. package/api/upgrade/run/run.mjs +358 -59
  206. package/api/upgrade/status/status.mjs +2 -2
  207. package/api/upgrade/upgrade.doc.mjs +32 -23
  208. package/api/upgrade/upgrade.type.d.mts +43 -5
  209. package/api/upgrade/upgrade.type.mjs +29 -13
  210. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  211. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  212. package/assets/codemods/file-count.test.mjs +163 -0
  213. package/assets/codemods/integration-discovery.mjs +48 -4
  214. package/assets/codemods/integration-discovery.test.mjs +73 -0
  215. package/assets/codemods/integration-runner.mjs +59 -7
  216. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  217. package/assets/codemods/registry.mjs +1 -0
  218. package/assets/codemods/run-codemod.mjs +177 -34
  219. package/assets/codemods/runner.mjs +353 -104
  220. package/assets/codemods/term-log.mjs +32 -8
  221. package/assets/codemods/term-log.test.mjs +19 -1
  222. package/assets/codemods/transform-prop.mjs +109 -0
  223. package/assets/codemods/transform-prop.test.mjs +95 -0
  224. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  225. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  226. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  227. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  228. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  229. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  230. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  231. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  232. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  233. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  234. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  235. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  236. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  237. package/assets/docs/README.md +12 -1
  238. package/assets/docs/authoring.doc.mjs +14 -0
  239. package/assets/docs/browser-support.doc.mjs +11 -11
  240. package/assets/docs/color.doc.mjs +8 -2
  241. package/assets/docs/elevation.doc.mjs +6 -4
  242. package/assets/docs/getting-started.doc.mjs +6 -17
  243. package/assets/docs/icons.doc.mjs +2 -21
  244. package/assets/docs/illustrations.doc.mjs +7 -15
  245. package/assets/docs/internationalization.doc.mjs +7 -5
  246. package/assets/docs/layout.doc.dense.mjs +132 -84
  247. package/assets/docs/layout.doc.mjs +134 -78
  248. package/assets/docs/migration.doc.mjs +19 -21
  249. package/assets/docs/motion.doc.mjs +16 -3
  250. package/assets/docs/principles.doc.dense.mjs +5 -5
  251. package/assets/docs/principles.doc.mjs +14 -6
  252. package/assets/docs/principles.doc.zh.mjs +6 -6
  253. package/assets/docs/shape.doc.mjs +8 -3
  254. package/assets/docs/spacing.doc.mjs +7 -2
  255. package/assets/docs/styling-libraries.doc.mjs +10 -6
  256. package/assets/docs/styling.doc.mjs +22 -26
  257. package/assets/docs/theme.doc.dense.mjs +58 -18
  258. package/assets/docs/theme.doc.mjs +60 -50
  259. package/assets/docs/theme.doc.zh.mjs +9 -8
  260. package/assets/docs/tokens.doc.dense.mjs +2 -2
  261. package/assets/docs/tokens.doc.mjs +390 -9
  262. package/assets/docs/tokens.doc.zh.mjs +2 -2
  263. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  264. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  265. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  266. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  267. package/assets/docs/tree/api.doc.mjs +30 -0
  268. package/assets/docs/tree/block-template.doc.mjs +130 -0
  269. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  270. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  271. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  272. package/assets/docs/tree/checks.doc.mjs +119 -0
  273. package/assets/docs/tree/cli.doc.mjs +23 -0
  274. package/assets/docs/tree/codemods.doc.mjs +147 -0
  275. package/assets/docs/tree/commands.doc.mjs +25 -0
  276. package/assets/docs/tree/component-family.doc.mjs +113 -0
  277. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  278. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  279. package/assets/docs/tree/components.doc.mjs +23 -0
  280. package/assets/docs/tree/configuration.doc.mjs +23 -0
  281. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  282. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  283. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  284. package/assets/docs/tree/docs.doc.mjs +21 -0
  285. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  286. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  287. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  288. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  291. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  292. package/assets/docs/tree/help.doc.mjs +16 -0
  293. package/assets/docs/tree/integrations.doc.mjs +40 -0
  294. package/assets/docs/tree/links.doc.mjs +98 -0
  295. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  296. package/assets/docs/tree/page-template.doc.mjs +71 -0
  297. package/assets/docs/tree/publishing.doc.mjs +111 -0
  298. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  299. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  300. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  301. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  302. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  303. package/assets/docs/tree/ship.doc.mjs +16 -0
  304. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  305. package/assets/docs/tree/single-component.doc.mjs +165 -0
  306. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  307. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  308. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  309. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  310. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  311. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  312. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  313. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  314. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  315. package/assets/docs/tree/templates.doc.mjs +34 -0
  316. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  317. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  318. package/assets/docs/tree/themes.doc.mjs +39 -0
  319. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  320. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  321. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  322. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  323. package/assets/docs/tree/versioning.doc.mjs +161 -0
  324. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  325. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  326. package/assets/docs/typography.doc.mjs +24 -4
  327. package/assets/docs/working-with-ai.doc.mjs +34 -26
  328. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  329. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  330. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  331. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  332. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  333. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  334. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  335. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  336. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  337. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  338. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  339. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  340. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  341. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  342. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  343. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  344. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  345. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  346. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  347. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  348. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  349. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  350. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  351. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  352. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  353. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  354. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  355. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  356. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  357. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  358. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  359. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  360. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  361. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  362. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  363. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  364. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  365. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  366. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  367. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  368. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  369. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  370. package/authoring/_shared/contract.ts +22 -0
  371. package/authoring/codemod/codemod.doc.mjs +7 -2
  372. package/authoring/codemod/parse.d.mts +8 -8
  373. package/authoring/codemod/parse.mjs +8 -6
  374. package/authoring/codemod/type.ts +12 -0
  375. package/authoring/config/config.doc.mjs +11 -3
  376. package/authoring/config/debug-composition.test.mjs +92 -0
  377. package/authoring/config/parse.d.mts +15 -13
  378. package/authoring/config/parse.mjs +27 -8
  379. package/authoring/config/parse.test.mjs +8 -0
  380. package/authoring/config/type.ts +29 -6
  381. package/authoring/debug/debug.doc.d.mts +11 -0
  382. package/authoring/debug/debug.doc.mjs +182 -0
  383. package/authoring/debug/parse.d.mts +8 -8
  384. package/authoring/debug/parse.mjs +3 -3
  385. package/authoring/discover/discover.doc.d.mts +13 -0
  386. package/authoring/discover/discover.doc.mjs +138 -0
  387. package/authoring/discover/parse.d.mts +24 -0
  388. package/authoring/discover/parse.mjs +128 -0
  389. package/authoring/discover/parse.test.mjs +124 -0
  390. package/authoring/discover/type.ts +87 -0
  391. package/authoring/doctypes/_schema.d.mts +792 -24
  392. package/authoring/doctypes/_schema.mjs +549 -39
  393. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  394. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  395. package/authoring/doctypes/base/type.ts +43 -0
  396. package/authoring/doctypes/command/command.doc.mjs +4 -3
  397. package/authoring/doctypes/command/parse.d.mts +2 -2
  398. package/authoring/doctypes/command/parse.mjs +1 -1
  399. package/authoring/doctypes/command/type.ts +5 -4
  400. package/authoring/doctypes/component/component.doc.mjs +12 -3
  401. package/authoring/doctypes/component/parse.d.mts +2 -2
  402. package/authoring/doctypes/component/parse.mjs +1 -1
  403. package/authoring/doctypes/component/type.ts +14 -5
  404. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  405. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  406. package/authoring/doctypes/enum/parse.d.mts +2 -2
  407. package/authoring/doctypes/enum/parse.mjs +1 -1
  408. package/authoring/doctypes/enum/type.ts +4 -2
  409. package/authoring/doctypes/function/function.doc.mjs +7 -2
  410. package/authoring/doctypes/function/parse.d.mts +2 -2
  411. package/authoring/doctypes/function/parse.mjs +1 -1
  412. package/authoring/doctypes/function/type.ts +9 -4
  413. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  414. package/authoring/doctypes/hook/parse.d.mts +2 -2
  415. package/authoring/doctypes/hook/parse.mjs +1 -1
  416. package/authoring/doctypes/hook/type.ts +5 -4
  417. package/authoring/doctypes/legacy.d.mts +8 -6
  418. package/authoring/doctypes/legacy.mjs +5 -4
  419. package/authoring/doctypes/load-contract.test.mjs +233 -0
  420. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  421. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  422. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  423. package/authoring/doctypes/namespace/parse.mjs +25 -0
  424. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  425. package/authoring/doctypes/namespace/type.ts +74 -0
  426. package/authoring/doctypes/parse.d.mts +22 -18
  427. package/authoring/doctypes/parse.mjs +22 -11
  428. package/authoring/doctypes/parse.test.mjs +77 -3
  429. package/authoring/doctypes/reference/parse.d.mts +2 -2
  430. package/authoring/doctypes/reference/parse.mjs +8 -5
  431. package/authoring/doctypes/reference/reference.doc.mjs +55 -6
  432. package/authoring/doctypes/reference/type.ts +75 -7
  433. package/authoring/doctypes/schema/parse.d.mts +2 -2
  434. package/authoring/doctypes/schema/parse.mjs +1 -1
  435. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  436. package/authoring/doctypes/schema/type.ts +4 -4
  437. package/authoring/doctypes/template/parse.d.mts +94 -1
  438. package/authoring/doctypes/template/parse.mjs +40 -2
  439. package/authoring/doctypes/template/parse.test.mjs +26 -2
  440. package/authoring/doctypes/template/template.doc.mjs +13 -3
  441. package/authoring/doctypes/template/type.ts +13 -2
  442. package/authoring/doctypes/theme/parse.d.mts +35 -0
  443. package/authoring/doctypes/theme/parse.mjs +76 -0
  444. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  445. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  446. package/authoring/doctypes/theme/type.ts +42 -0
  447. package/authoring/doctypes/types.ts +12 -10
  448. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  449. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  450. package/authoring/gap-report/parse.d.mts +10 -10
  451. package/authoring/gap-report/parse.mjs +6 -6
  452. package/authoring/gap-report/type.ts +1 -1
  453. package/authoring/identity/identity.doc.d.mts +9 -0
  454. package/authoring/identity/identity.doc.mjs +61 -0
  455. package/authoring/identity/type.ts +132 -0
  456. package/authoring/index.d.mts +3 -0
  457. package/authoring/index.d.ts +62 -17
  458. package/authoring/index.mjs +4 -1
  459. package/authoring/integration/integration.doc.mjs +22 -13
  460. package/authoring/integration/parse.d.mts +2 -2
  461. package/authoring/integration/parse.mjs +1 -1
  462. package/authoring/integration/parse.test.mjs +10 -1
  463. package/authoring/integration/schema.d.mts +6 -4
  464. package/authoring/integration/schema.mjs +9 -3
  465. package/authoring/integration/type.ts +19 -8
  466. package/authoring/shadcn/receipt.d.mts +6 -6
  467. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  468. package/clients/cli/command-load-failure.test.mjs +83 -0
  469. package/clients/cli/commands/blog.doc.mjs +1 -1
  470. package/clients/cli/commands/blog.mjs +23 -8
  471. package/clients/cli/commands/blog.test.mjs +42 -1
  472. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  473. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  474. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  475. package/clients/cli/commands/build-theme.mjs +16 -50
  476. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  477. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  478. package/clients/cli/commands/build.doc.mjs +16 -8
  479. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  480. package/clients/cli/commands/build.mjs +137 -114
  481. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  482. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  483. package/clients/cli/commands/component/index.mjs +153 -61
  484. package/clients/cli/commands/component-batch.test.mjs +341 -0
  485. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  486. package/clients/cli/commands/component-package.test.mjs +46 -0
  487. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  488. package/clients/cli/commands/component.doc.mjs +28 -10
  489. package/clients/cli/commands/component.test.mjs +19 -0
  490. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  491. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  492. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  493. package/clients/cli/commands/discover.doc.mjs +55 -9
  494. package/clients/cli/commands/discover.mjs +393 -118
  495. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  496. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  497. package/clients/cli/commands/docs.doc.mjs +28 -6
  498. package/clients/cli/commands/docs.mjs +295 -38
  499. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  500. package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
  501. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  502. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  503. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  504. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  505. package/clients/cli/commands/doctor-integration.test.mjs +143 -8
  506. package/clients/cli/commands/doctor.doc.mjs +4 -2
  507. package/clients/cli/commands/doctor.mjs +108 -37
  508. package/clients/cli/commands/doctor.test.mjs +42 -0
  509. package/clients/cli/commands/gap-report.doc.mjs +27 -15
  510. package/clients/cli/commands/gap-report.test.mjs +72 -0
  511. package/clients/cli/commands/hook/index.mjs +7 -17
  512. package/clients/cli/commands/hook.doc.mjs +1 -1
  513. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  514. package/clients/cli/commands/init.doc.mjs +24 -10
  515. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  516. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  517. package/clients/cli/commands/integration-add.doc.mjs +39 -13
  518. package/clients/cli/commands/integration-authoring.test.mjs +74 -19
  519. package/clients/cli/commands/integration-pack.doc.mjs +6 -10
  520. package/clients/cli/commands/integration-real-world.test.mjs +4 -10
  521. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  522. package/clients/cli/commands/integration.doc.mjs +5 -5
  523. package/clients/cli/commands/integration.mjs +75 -43
  524. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  525. package/clients/cli/commands/json-contract.test.mjs +33 -0
  526. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  527. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  528. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  529. package/clients/cli/commands/layout.doc.mjs +3 -3
  530. package/clients/cli/commands/layout.mjs +21 -9
  531. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  532. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  533. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  534. package/clients/cli/commands/manifest.doc.mjs +2 -2
  535. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  536. package/clients/cli/commands/search.doc.mjs +16 -6
  537. package/clients/cli/commands/search.mjs +49 -11
  538. package/clients/cli/commands/search.test.mjs +92 -0
  539. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  540. package/clients/cli/commands/swizzle.doc.mjs +4 -3
  541. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  542. package/clients/cli/commands/template.doc.mjs +53 -14
  543. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  544. package/clients/cli/commands/template.mjs +4 -91
  545. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  546. package/clients/cli/commands/text-json-parity.test.mjs +725 -0
  547. package/clients/cli/commands/theme-add.doc.mjs +5 -4
  548. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  549. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  550. package/clients/cli/commands/theme-palette-generate.doc.mjs +12 -7
  551. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  552. package/clients/cli/commands/theme-palette.doc.mjs +2 -3
  553. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  554. package/clients/cli/commands/theme-targets.doc.mjs +3 -3
  555. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  556. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  557. package/clients/cli/commands/theme.doc.mjs +3 -2
  558. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  559. package/clients/cli/commands/upgrade.doc.mjs +83 -12
  560. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  561. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  562. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  563. package/clients/cli/commands/upgrade.mjs +29 -7
  564. package/clients/cli/formatters/index.mjs +164 -1
  565. package/clients/cli/formatters/index.test.mjs +97 -0
  566. package/clients/cli/index.mjs +47 -34
  567. package/clients/cli/latest-version-env.test.mjs +50 -0
  568. package/clients/cli/lib/cli-error.test.mjs +7 -0
  569. package/clients/cli/lib/component-format.mjs +9 -9
  570. package/clients/cli/lib/component-format.test.mjs +1 -1
  571. package/clients/cli/lib/define-command.mjs +56 -6
  572. package/clients/cli/lib/define-command.test.mjs +54 -0
  573. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  574. package/clients/cli/lib/exit-codes.test.mjs +113 -0
  575. package/clients/cli/lib/hook-format.mjs +19 -10
  576. package/clients/cli/lib/json-shim.mjs +62 -16
  577. package/clients/cli/lib/json-shim.test.mjs +83 -0
  578. package/clients/cli/lib/manifest.d.ts +2 -0
  579. package/clients/cli/lib/manifest.mjs +53 -6
  580. package/clients/cli/lib/manifest.test.mjs +22 -2
  581. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  582. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  583. package/foundation/agent-docs/agent-docs.mjs +83 -13
  584. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  585. package/foundation/config/integration-debug.test.mjs +28 -3
  586. package/foundation/config/project-themes.test.mjs +11 -19
  587. package/foundation/config/project.d.mts +20 -11
  588. package/foundation/config/project.mjs +263 -91
  589. package/foundation/config/project.test.mjs +270 -21
  590. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  591. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  592. package/foundation/discovery/authoring-self-docs.test.mjs +174 -0
  593. package/foundation/discovery/authoring-surface.d.mts +74 -0
  594. package/foundation/discovery/authoring-surface.mjs +525 -0
  595. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  596. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  597. package/foundation/discovery/cli-self-docs.mjs +504 -0
  598. package/foundation/discovery/cli-self-docs.test.mjs +395 -0
  599. package/foundation/discovery/component-discovery.d.mts +39 -1
  600. package/foundation/discovery/component-discovery.mjs +50 -1
  601. package/foundation/discovery/component-loader.d.mts +35 -38
  602. package/foundation/discovery/component-loader.mjs +53 -222
  603. package/foundation/discovery/docs-discovery.d.mts +119 -11
  604. package/foundation/discovery/docs-discovery.mjs +427 -108
  605. package/foundation/discovery/docs-discovery.test.mjs +386 -20
  606. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  607. package/foundation/discovery/docs-output-budget.mjs +50 -0
  608. package/foundation/discovery/docs-section-key.d.mts +116 -0
  609. package/foundation/discovery/docs-section-key.mjs +322 -0
  610. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  611. package/foundation/discovery/template-adapter.d.mts +113 -11
  612. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  613. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  614. package/foundation/discovery/template-adapter.mjs +774 -83
  615. package/foundation/discovery/template-adapter.test.mjs +57 -0
  616. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  617. package/foundation/discovery/template-conflict-release.mjs +40 -0
  618. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  619. package/foundation/discovery/theme-discovery.d.mts +67 -7
  620. package/foundation/discovery/theme-discovery.mjs +916 -186
  621. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  622. package/foundation/discovery/theming-targets.test.mjs +4 -0
  623. package/foundation/doc-compiler/bundle.d.mts +47 -0
  624. package/foundation/doc-compiler/bundle.mjs +278 -0
  625. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  626. package/foundation/doc-compiler/compile.d.mts +343 -0
  627. package/foundation/doc-compiler/compile.mjs +558 -0
  628. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  629. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  630. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  631. package/foundation/doc-compiler/doc-loads.test.mjs +1643 -0
  632. package/foundation/doc-compiler/import.d.mts +24 -0
  633. package/foundation/doc-compiler/import.mjs +59 -0
  634. package/foundation/doc-compiler/inputs.d.mts +102 -0
  635. package/foundation/doc-compiler/inputs.mjs +291 -0
  636. package/foundation/doc-compiler/inputs.test.mjs +298 -0
  637. package/foundation/doc-compiler/ir.d.mts +22 -0
  638. package/foundation/doc-compiler/ir.mjs +471 -0
  639. package/foundation/doc-compiler/lenses.d.mts +36 -0
  640. package/foundation/doc-compiler/lenses.mjs +173 -0
  641. package/foundation/doc-compiler/links.d.mts +162 -0
  642. package/foundation/doc-compiler/links.mjs +294 -0
  643. package/foundation/doc-compiler/links.test.mjs +192 -0
  644. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  645. package/foundation/doc-compiler/overlays.d.mts +37 -0
  646. package/foundation/doc-compiler/overlays.mjs +206 -0
  647. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  648. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  649. package/foundation/doc-compiler/read.d.mts +127 -0
  650. package/foundation/doc-compiler/read.mjs +325 -0
  651. package/foundation/doc-compiler/read.test.mjs +313 -0
  652. package/foundation/doc-compiler/source.d.mts +33 -0
  653. package/foundation/doc-compiler/source.mjs +128 -0
  654. package/foundation/doc-compiler/tree.d.mts +292 -0
  655. package/foundation/doc-compiler/tree.mjs +881 -0
  656. package/foundation/fs/file-protection.d.mts +33 -0
  657. package/foundation/fs/file-protection.mjs +825 -0
  658. package/foundation/fs/file-protection.test.mjs +250 -0
  659. package/foundation/fs/module-loader.d.mts +1 -0
  660. package/foundation/fs/module-loader.mjs +50 -1
  661. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  662. package/foundation/fs/path-safety.d.mts +3 -2
  663. package/foundation/fs/path-safety.mjs +49 -19
  664. package/foundation/fs/path-safety.test.mjs +50 -0
  665. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  666. package/foundation/identity/provider-identity.d.mts +90 -0
  667. package/foundation/identity/provider-identity.mjs +320 -0
  668. package/foundation/identity/provider-identity.test.mjs +254 -0
  669. package/foundation/identity/providers.d.mts +7 -0
  670. package/foundation/identity/providers.mjs +16 -0
  671. package/foundation/integrations/autolink.d.mts +58 -1
  672. package/foundation/integrations/autolink.mjs +143 -45
  673. package/foundation/integrations/autolink.test.mjs +1 -1
  674. package/foundation/integrations/cli-requirement.d.mts +65 -0
  675. package/foundation/integrations/cli-requirement.mjs +189 -0
  676. package/foundation/integrations/cli-requirement.test.mjs +89 -0
  677. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  678. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  679. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  680. package/foundation/integrations/contribution-inventory.mjs +28 -25
  681. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  682. package/foundation/integrations/integration-warnings.d.mts +9 -2
  683. package/foundation/integrations/integration-warnings.mjs +52 -21
  684. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  685. package/foundation/integrations/integrations.d.mts +63 -3
  686. package/foundation/integrations/integrations.mjs +122 -9
  687. package/foundation/integrations/integrations.test.mjs +415 -1
  688. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  689. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  690. package/foundation/integrations/provider-resolution.d.mts +152 -0
  691. package/foundation/integrations/provider-resolution.mjs +576 -0
  692. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  693. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  694. package/foundation/integrations/theme-descriptor.mjs +44 -0
  695. package/foundation/integrations/validate-contributions.d.mts +2 -0
  696. package/foundation/integrations/validate-contributions.mjs +131 -29
  697. package/foundation/response/base.d.ts +8 -4
  698. package/foundation/response/batch.type.d.mts +33 -0
  699. package/foundation/response/batch.type.mjs +34 -0
  700. package/foundation/response/error-codes.d.mts +3 -1
  701. package/foundation/response/error-codes.d.ts +2 -0
  702. package/foundation/response/error-codes.doc.mjs +19 -12
  703. package/foundation/response/error-codes.mjs +8 -2
  704. package/foundation/response/error-codes.test.mjs +166 -14
  705. package/foundation/response/json-contract.test.mjs +57 -17
  706. package/foundation/response/json.d.mts +4 -2
  707. package/foundation/response/json.mjs +8 -10
  708. package/foundation/response/response-types.doc.d.mts +7 -2
  709. package/foundation/response/response-types.doc.mjs +69 -25
  710. package/foundation/response/response-types.doc.test.mjs +181 -0
  711. package/foundation/response/response.doc.mjs +12 -11
  712. package/foundation/text/string-utils.d.mts +8 -0
  713. package/foundation/text/string-utils.mjs +40 -10
  714. package/foundation/xle/expand.d.mts +2 -0
  715. package/foundation/xle/expand.mjs +4 -3
  716. package/foundation/xle/expand.test.mjs +54 -0
  717. package/foundation/xle/xle.test.mjs +13 -0
  718. package/package.json +10 -11
  719. package/api/docs/docs.test.mjs +0 -83
  720. package/api/docs/integrationDocs.test.mjs +0 -208
  721. package/api/search/search.test.mjs +0 -389
  722. package/assets/docs/cli-integrations.doc.mjs +0 -367
  723. package/assets/templates/themes/manifest.json +0 -95
  724. package/clients/cli/commands/docs.test.mjs +0 -102
  725. package/clients/cli/lib/update-check.mjs +0 -83
  726. package/clients/cli/lib/update-check.test.mjs +0 -137
  727. package/clients/cli/update-hint-commands.test.mjs +0 -54
  728. package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
@@ -0,0 +1,162 @@
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
+ * @property {true} [include] the problem is in a `reference` block, which
31
+ * includes content rather than linking to it: a reader loses that content,
32
+ * so the authoring check fails on it
33
+ */
34
+ /**
35
+ * What a `reference` block in a topic section includes of the doc it names:
36
+ * stable content blocks, with anything it could not include named in
37
+ * `problems`.
38
+ * @typedef {(block: any) => Promise<{content: any[], problems: string[]}>} DocIncluder
39
+ */
40
+ /**
41
+ * Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
42
+ * (`command:theme build`); no part holds a colon.
43
+ * @param {unknown} target
44
+ * @returns {LinkTarget | {error: string}}
45
+ */
46
+ export function parseLinkTarget(target: unknown): LinkTarget | {
47
+ error: string;
48
+ };
49
+ /**
50
+ * Text with each inline link replaced by its name, for indexes that must not
51
+ * read the link syntax as words.
52
+ * @param {string} text
53
+ * @returns {string}
54
+ */
55
+ export function unlinkText(text: string): string;
56
+ /**
57
+ * Resolve every link in a list of content blocks, in order.
58
+ * @param {any[]} blocks
59
+ * @param {LinkResolver} resolve
60
+ * @param {{section?: string}} [at]
61
+ * @param {DocIncluder} [include] how a `reference` block includes the doc it
62
+ * names; without it, the block only carries its `link`
63
+ * @returns {Promise<{content: any[], problems: LinkProblem[]}>}
64
+ */
65
+ export function linkBlocks(blocks: any[], resolve: LinkResolver, at?: {
66
+ section?: string;
67
+ }, include?: DocIncluder): Promise<{
68
+ content: any[];
69
+ problems: LinkProblem[];
70
+ }>;
71
+ /**
72
+ * Resolve every link in a topic's sections.
73
+ * @param {any[]} sections
74
+ * @param {LinkResolver} resolve
75
+ * @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
76
+ */
77
+ export function linkSections(sections: any[], resolve: LinkResolver): Promise<{
78
+ sections: any[];
79
+ problems: LinkProblem[];
80
+ }>;
81
+ /**
82
+ * @file Links between docs, named by doc identity (spec:AST-047 FR9).
83
+ *
84
+ * @input A link target, `[<provider>:]<kind>:<name>`, written as a `reference`
85
+ * block, in a `workflow` step's `references`, or inline in text as
86
+ * `{@link <target>}`; and a resolver that finds the doc a target names.
87
+ * @output The same content with every link resolved: an inline link becomes
88
+ * the `astryx docs` command that opens its doc, and a block carries a `link`
89
+ * with the doc's identity, route, title, summary, and command. A reference
90
+ * block in a topic section also carries the `content` it includes. A link
91
+ * that names no doc is a problem, never a guess.
92
+ * @position Pure. The docs adapter owns the resolver (the project's docs tree
93
+ * and topic catalog) and applies this to every read and every doctor check.
94
+ */
95
+ /** The kinds a link can name: every authored doc kind. */
96
+ export const LINK_KINDS: Set<string>;
97
+ /** An inline link in text: `{@link <target>}`. */
98
+ export const INLINE_LINK: RegExp;
99
+ export type LinkTarget = {
100
+ /**
101
+ * the provider id it names, or null for the
102
+ * linking doc's own provider
103
+ */
104
+ provider: string | null;
105
+ kind: string;
106
+ name: string;
107
+ };
108
+ /**
109
+ * The doc a link opens, as a docs read returns it.
110
+ */
111
+ export type DocLink = {
112
+ /**
113
+ * the target as written: `[<provider>:]<kind>:<name>`
114
+ */
115
+ target: string;
116
+ /**
117
+ * the doc's identity (a DocId)
118
+ */
119
+ id: string;
120
+ /**
121
+ * what `astryx docs <route>` opens
122
+ */
123
+ route: string;
124
+ title: string;
125
+ summary: string;
126
+ /**
127
+ * the command that opens it, `astryx docs <route>`
128
+ */
129
+ command: string;
130
+ };
131
+ /**
132
+ * Finds the doc a target names, or says why none matches.
133
+ */
134
+ export type LinkResolver = (target: string) => Promise<DocLink | {
135
+ problem: string;
136
+ }>;
137
+ export type LinkProblem = {
138
+ /**
139
+ * the target as written
140
+ */
141
+ target: string;
142
+ message: string;
143
+ /**
144
+ * the key of the section the link sits in
145
+ */
146
+ section?: string | undefined;
147
+ /**
148
+ * the problem is in a `reference` block, which
149
+ * includes content rather than linking to it: a reader loses that content,
150
+ * so the authoring check fails on it
151
+ */
152
+ include?: true | undefined;
153
+ };
154
+ /**
155
+ * What a `reference` block in a topic section includes of the doc it names:
156
+ * stable content blocks, with anything it could not include named in
157
+ * `problems`.
158
+ */
159
+ export type DocIncluder = (block: any) => Promise<{
160
+ content: any[];
161
+ problems: string[];
162
+ }>;
@@ -0,0 +1,294 @@
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 reference
12
+ * block in a topic section also carries the `content` it includes. A link
13
+ * that names no doc is a problem, never a guess.
14
+ * @position Pure. The docs adapter owns the resolver (the project's docs tree
15
+ * and topic catalog) and applies this to every read and every doctor check.
16
+ */
17
+
18
+ /** The kinds a link can name: every authored doc kind. */
19
+ export const LINK_KINDS = new Set([
20
+ 'generic',
21
+ 'command',
22
+ 'function',
23
+ 'schema',
24
+ 'enum',
25
+ 'namespace',
26
+ 'component',
27
+ 'page',
28
+ 'block',
29
+ ]);
30
+
31
+ /** An inline link in text: `{@link <target>}`. */
32
+ export const INLINE_LINK = /\{@link\s+([^{}]+?)\s*\}/g;
33
+
34
+ /** Code spans in text, which show link syntax as written. */
35
+ const CODE_SPAN = /(`[^`]*`)/;
36
+
37
+ /**
38
+ * @typedef {object} LinkTarget
39
+ * @property {string | null} provider the provider id it names, or null for the
40
+ * linking doc's own provider
41
+ * @property {string} kind
42
+ * @property {string} name
43
+ */
44
+
45
+ /**
46
+ * The doc a link opens, as a docs read returns it.
47
+ * @typedef {object} DocLink
48
+ * @property {string} target the target as written: `[<provider>:]<kind>:<name>`
49
+ * @property {string} id the doc's identity (a DocId)
50
+ * @property {string} route what `astryx docs <route>` opens
51
+ * @property {string} title
52
+ * @property {string} summary
53
+ * @property {string} command the command that opens it, `astryx docs <route>`
54
+ */
55
+
56
+ /**
57
+ * Finds the doc a target names, or says why none matches.
58
+ * @typedef {(target: string) => Promise<DocLink | {problem: string}>} LinkResolver
59
+ */
60
+
61
+ /**
62
+ * @typedef {object} LinkProblem
63
+ * @property {string} target the target as written
64
+ * @property {string} message
65
+ * @property {string} [section] the key of the section the link sits in
66
+ * @property {true} [include] the problem is in a `reference` block, which
67
+ * includes content rather than linking to it: a reader loses that content,
68
+ * so the authoring check fails on it
69
+ */
70
+
71
+ /**
72
+ * What a `reference` block in a topic section includes of the doc it names:
73
+ * stable content blocks, with anything it could not include named in
74
+ * `problems`.
75
+ * @typedef {(block: any) => Promise<{content: any[], problems: string[]}>} DocIncluder
76
+ */
77
+
78
+ /**
79
+ * Parse `[<provider>:]<kind>:<name>`. A name may hold spaces
80
+ * (`command:theme build`); no part holds a colon.
81
+ * @param {unknown} target
82
+ * @returns {LinkTarget | {error: string}}
83
+ */
84
+ export function parseLinkTarget(target) {
85
+ if (typeof target !== 'string' || target.trim() === '') {
86
+ return {
87
+ error:
88
+ 'a link target is a non-empty string: `[<provider>:]<kind>:<name>`',
89
+ };
90
+ }
91
+ const parts = target.trim().split(':');
92
+ if (parts.length < 2 || parts.length > 3 || parts.some(p => p.trim() === '')) {
93
+ return {error: `"${target}" is not \`[<provider>:]<kind>:<name>\``};
94
+ }
95
+ const provider = parts.length === 3 ? parts[0].trim() : null;
96
+ const kind = parts[parts.length - 2].trim();
97
+ const name = parts[parts.length - 1].trim();
98
+ if (!LINK_KINDS.has(kind)) {
99
+ return {
100
+ error: `"${target}" names the kind "${kind}"; a doc kind is one of ${[
101
+ ...LINK_KINDS,
102
+ ].join(', ')}`,
103
+ };
104
+ }
105
+ return {provider, kind, name};
106
+ }
107
+
108
+ /**
109
+ * Text with each inline link replaced by its name, for indexes that must not
110
+ * read the link syntax as words.
111
+ * @param {string} text
112
+ * @returns {string}
113
+ */
114
+ export function unlinkText(text) {
115
+ return text
116
+ .split(CODE_SPAN)
117
+ .map(part =>
118
+ part.startsWith('`')
119
+ ? part
120
+ : part.replace(INLINE_LINK, (_, target) => {
121
+ const parsed = parseLinkTarget(target);
122
+ return 'error' in parsed ? target : parsed.name;
123
+ }),
124
+ )
125
+ .join('');
126
+ }
127
+
128
+ /**
129
+ * Resolve every link in a list of content blocks, in order.
130
+ * @param {any[]} blocks
131
+ * @param {LinkResolver} resolve
132
+ * @param {{section?: string}} [at]
133
+ * @param {DocIncluder} [include] how a `reference` block includes the doc it
134
+ * names; without it, the block only carries its `link`
135
+ * @returns {Promise<{content: any[], problems: LinkProblem[]}>}
136
+ */
137
+ export async function linkBlocks(blocks, resolve, at = {}, include) {
138
+ /** @type {LinkProblem[]} */
139
+ const problems = [];
140
+ const where = at.section ? {section: at.section} : {};
141
+ /**
142
+ * @param {string} target
143
+ * @returns {Promise<DocLink | null>}
144
+ */
145
+ const find = async target => {
146
+ const found = await resolve(target);
147
+ if ('problem' in found) {
148
+ problems.push({target, message: found.problem, ...where});
149
+ return null;
150
+ }
151
+ return found;
152
+ };
153
+ /**
154
+ * @param {unknown} text
155
+ * @returns {Promise<any>}
156
+ */
157
+ const linkText = async text => {
158
+ if (typeof text !== 'string' || !text.includes('{@link')) return text;
159
+ let out = '';
160
+ // A link written inside code ticks is shown as written: it documents the
161
+ // syntax, it does not link.
162
+ for (const part of text.split(CODE_SPAN)) {
163
+ if (part.startsWith('`')) {
164
+ out += part;
165
+ continue;
166
+ }
167
+ let last = 0;
168
+ for (const match of part.matchAll(INLINE_LINK)) {
169
+ const link = await find(match[1]);
170
+ const at = /** @type {number} */ (match.index);
171
+ out += part.slice(last, at);
172
+ // A link that names no doc prints as written: text that was never
173
+ // meant as a link reads the way it did, and doctor names the problem.
174
+ out += link ? `\`${link.command}\`` : match[0];
175
+ last = at + match[0].length;
176
+ }
177
+ out += part.slice(last);
178
+ }
179
+ return out;
180
+ };
181
+ /**
182
+ * @param {unknown[]} values
183
+ * @returns {Promise<any[]>}
184
+ */
185
+ const linkAll = async values => {
186
+ const out = [];
187
+ for (const value of values) out.push(await linkText(value));
188
+ return out;
189
+ };
190
+
191
+ const content = [];
192
+ for (const block of blocks ?? []) {
193
+ switch (block?.type) {
194
+ case 'prose':
195
+ case 'heading':
196
+ content.push({...block, text: await linkText(block.text)});
197
+ break;
198
+ case 'list':
199
+ content.push({...block, items: await linkAll(block.items ?? [])});
200
+ break;
201
+ case 'table': {
202
+ const rows = [];
203
+ for (const row of block.rows ?? []) rows.push(await linkAll(row));
204
+ content.push({
205
+ ...block,
206
+ headers: await linkAll(block.headers ?? []),
207
+ rows,
208
+ });
209
+ break;
210
+ }
211
+ case 'reference': {
212
+ // A reference includes content, so what it cannot include is a
213
+ // problem the authoring check fails on, not one that prints as written.
214
+ const found = await resolve(block.target);
215
+ if ('problem' in found) {
216
+ problems.push({
217
+ target: block.target,
218
+ message: found.problem,
219
+ include: true,
220
+ ...where,
221
+ });
222
+ content.push({...block, link: null});
223
+ break;
224
+ }
225
+ /** @type {any} */
226
+ const linked = {...block, link: found};
227
+ if (include) {
228
+ const included = await include(block);
229
+ for (const message of included.problems) {
230
+ problems.push({
231
+ target: block.target,
232
+ message,
233
+ include: true,
234
+ ...where,
235
+ });
236
+ }
237
+ linked.content = included.content;
238
+ }
239
+ content.push(linked);
240
+ break;
241
+ }
242
+ case 'workflow': {
243
+ const steps = [];
244
+ for (const step of block.steps ?? []) {
245
+ /** @type {any} */
246
+ const linked = {...step};
247
+ if (step.description != null) {
248
+ linked.description = await linkText(step.description);
249
+ }
250
+ if (Array.isArray(step.references)) {
251
+ const links = [];
252
+ for (const target of step.references) links.push(await find(target));
253
+ linked.links = links;
254
+ }
255
+ steps.push(linked);
256
+ }
257
+ content.push({...block, steps});
258
+ break;
259
+ }
260
+ case 'collection':
261
+ problems.push({
262
+ target: `collection:${block.source?.slot ?? ''}`,
263
+ message:
264
+ 'a collection block is not rendered yet; link each doc with a reference block instead',
265
+ ...where,
266
+ });
267
+ content.push(block);
268
+ break;
269
+ default:
270
+ content.push(block);
271
+ }
272
+ }
273
+ return {content, problems};
274
+ }
275
+
276
+ /**
277
+ * Resolve every link in a topic's sections.
278
+ * @param {any[]} sections
279
+ * @param {LinkResolver} resolve
280
+ * @returns {Promise<{sections: any[], problems: LinkProblem[]}>}
281
+ */
282
+ export async function linkSections(sections, resolve) {
283
+ /** @type {LinkProblem[]} */
284
+ const problems = [];
285
+ const out = [];
286
+ for (const section of sections ?? []) {
287
+ const linked = await linkBlocks(section.content, resolve, {
288
+ section: section.id ?? section.title,
289
+ });
290
+ problems.push(...linked.problems);
291
+ out.push({...section, content: linked.content});
292
+ }
293
+ return {sections: out, problems};
294
+ }
@@ -0,0 +1,192 @@
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('includes what a reference block names, and marks what it cannot include', async () => {
109
+ /** @type {any[]} */
110
+ const asked = [];
111
+ const include = async (/** @type {any} */ block) => {
112
+ asked.push(block.target);
113
+ return {
114
+ content: [{type: 'prose', text: 'The doctor command.'}],
115
+ problems: block.projection ? ['projection.fields: no such field'] : [],
116
+ };
117
+ };
118
+ const {content, problems} = await linkBlocks(
119
+ [
120
+ {type: 'reference', target: 'command:doctor'},
121
+ {
122
+ type: 'reference',
123
+ target: 'command:doctor',
124
+ projection: {fields: ['--nope']},
125
+ },
126
+ {type: 'reference', target: 'command:gone'},
127
+ ],
128
+ resolve,
129
+ {section: 'check'},
130
+ include,
131
+ );
132
+ // A target that names no doc is never handed to the includer.
133
+ expect(asked).toEqual(['command:doctor', 'command:doctor']);
134
+ expect(content[0]).toMatchObject({
135
+ link: {command: 'astryx docs cli/commands/doctor'},
136
+ content: [{type: 'prose', text: 'The doctor command.'}],
137
+ });
138
+ expect(content[2]).toEqual({
139
+ type: 'reference',
140
+ target: 'command:gone',
141
+ link: null,
142
+ });
143
+ // Both are the authoring check's: the block includes content, where a
144
+ // link only points at it.
145
+ expect(problems).toEqual([
146
+ {
147
+ target: 'command:doctor',
148
+ message: 'projection.fields: no such field',
149
+ include: true,
150
+ section: 'check',
151
+ },
152
+ {
153
+ target: 'command:gone',
154
+ message: '"command:gone" names no doc',
155
+ include: true,
156
+ section: 'check',
157
+ },
158
+ ]);
159
+ });
160
+
161
+ it('names every link that finds no doc, and never guesses', async () => {
162
+ const {content, problems} = await linkSections(
163
+ [
164
+ {
165
+ id: 'one',
166
+ title: 'One',
167
+ content: [
168
+ {type: 'prose', text: 'See {@link command:nope}.'},
169
+ {type: 'reference', target: 'generic:gone'},
170
+ {type: 'collection', source: {slot: 'guides'}},
171
+ ],
172
+ },
173
+ ],
174
+ resolve,
175
+ ).then(({sections, problems}) => ({content: sections[0].content, problems}));
176
+ expect(content[0].text).toBe('See {@link command:nope}.');
177
+ expect(content[1].link).toBeNull();
178
+ expect(problems.map(p => [p.section, p.target])).toEqual([
179
+ ['one', 'command:nope'],
180
+ ['one', 'generic:gone'],
181
+ ['one', 'collection:guides'],
182
+ ]);
183
+ });
184
+ });
185
+
186
+ describe('unlinkText', () => {
187
+ it('keeps the name of each link, for an index', () => {
188
+ expect(unlinkText('Run {@link command:theme build} or {@link x}.')).toBe(
189
+ 'Run theme build or x.',
190
+ );
191
+ });
192
+ });