@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,471 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The compiled-doc contract and its sealed parsers.
5
+ *
6
+ * @input Any value that claims to be a compiled node or a compiled docs bundle
7
+ * — typically one read back from JSON.
8
+ * @output The same value once it validates; a thrown Error naming the problems
9
+ * otherwise, carrying a compiler diagnostic (`unsupported_schema` or
10
+ * `invalid_bundle`). An unsupported schema version fails with its own message
11
+ * before anything else is checked.
12
+ * @position The load boundary for compiled nodes that did not come straight
13
+ * from ./compile.mjs in this process. The value is returned as given, not
14
+ * rebuilt, so key order (which response JSON follows) survives. A node is
15
+ * plain JSON throughout, so nothing it holds can surprise a reader.
16
+ */
17
+
18
+ import {SECTION_KEY_RE} from '../discovery/docs-section-key.mjs';
19
+ import {COMPILED_DOC_KINDS, COMPILED_DOC_SCHEMA_VERSION} from './compile.mjs';
20
+ import {diagnostic, diagnosticProblem} from './diagnostics.mjs';
21
+
22
+ const NODE_FIELDS = new Set([
23
+ 'schemaVersion',
24
+ 'kind',
25
+ 'stage',
26
+ 'id',
27
+ 'lang',
28
+ 'provenance',
29
+ 'sourceTitles',
30
+ 'sectionProviders',
31
+ 'doc',
32
+ ]);
33
+ const RESOLVED_FIELDS = new Set([
34
+ 'status',
35
+ 'topic',
36
+ 'section',
37
+ 'previewType',
38
+ 'content',
39
+ ]);
40
+
41
+ /** How many problems one message lists before it stops. */
42
+ const MAX_PROBLEMS = 10;
43
+
44
+ /** @param {unknown} value @returns {value is Record<string, any>} */
45
+ const isRecord = value =>
46
+ value != null && typeof value === 'object' && !Array.isArray(value);
47
+
48
+ /** @param {unknown} value @returns {value is string} */
49
+ const isText = value => typeof value === 'string' && value !== '';
50
+
51
+ /**
52
+ * A package name, never a location: provenance must not leak a path.
53
+ * @param {unknown} value
54
+ * @returns {boolean}
55
+ */
56
+ const isPackageName = value =>
57
+ isText(value) &&
58
+ !value.startsWith('/') &&
59
+ !value.startsWith('.') &&
60
+ !value.startsWith('\\') &&
61
+ !value.startsWith('file:') &&
62
+ !/^[A-Za-z]:[\\/]/.test(value);
63
+
64
+ /**
65
+ * Validate a compiled reference node.
66
+ * @param {unknown} value
67
+ * @returns {import('./compile.mjs').CompiledReferenceNode}
68
+ */
69
+ export function parseCompiledReferenceNode(value) {
70
+ const node = /** @type {any} */ (value);
71
+ const skew = schemaVersionProblem(node);
72
+ if (skew) throw compiledDocError('unsupported_schema', skew);
73
+ const problems = jsonProblems(node, 'node');
74
+ if (problems.length === 0) problems.push(...structureProblems(node));
75
+ if (problems.length > 0) {
76
+ throw compiledDocError(
77
+ 'invalid_bundle',
78
+ `Invalid compiled doc node: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
79
+ );
80
+ }
81
+ return node;
82
+ }
83
+
84
+ /**
85
+ * Where a value stops being plain JSON: anything but null, booleans, finite
86
+ * numbers, strings, arrays and plain objects; a symbol key; or a cycle.
87
+ * @param {unknown} value
88
+ * @param {string} at
89
+ * @param {Set<object>} [ancestors]
90
+ * @param {string[]} [out]
91
+ * @returns {string[]}
92
+ */
93
+ function jsonProblems(value, at, ancestors = new Set(), out = []) {
94
+ if (out.length >= MAX_PROBLEMS) return out;
95
+ if (
96
+ value === null ||
97
+ typeof value === 'string' ||
98
+ typeof value === 'boolean'
99
+ ) {
100
+ return out;
101
+ }
102
+ if (typeof value === 'number') {
103
+ if (!Number.isFinite(value))
104
+ out.push(`${at}: ${value} is not a JSON number`);
105
+ return out;
106
+ }
107
+ if (value === undefined) {
108
+ out.push(`${at}: undefined is not JSON`);
109
+ return out;
110
+ }
111
+ if (typeof value !== 'object') {
112
+ out.push(`${at}: a ${typeof value} is not JSON`);
113
+ return out;
114
+ }
115
+ if (ancestors.has(value)) {
116
+ out.push(`${at}: refers back to itself`);
117
+ return out;
118
+ }
119
+ const proto = Object.getPrototypeOf(value);
120
+ if (!Array.isArray(value) && proto !== Object.prototype && proto !== null) {
121
+ out.push(
122
+ `${at}: a ${proto?.constructor?.name ?? 'non-plain object'} is not JSON`,
123
+ );
124
+ return out;
125
+ }
126
+ if (Object.getOwnPropertySymbols(value).length > 0) {
127
+ out.push(`${at}: has symbol keys`);
128
+ }
129
+ ancestors.add(value);
130
+ if (Array.isArray(value)) {
131
+ value.forEach((item, index) =>
132
+ jsonProblems(item, `${at}[${index}]`, ancestors, out),
133
+ );
134
+ } else {
135
+ for (const [key, item] of Object.entries(value)) {
136
+ jsonProblems(item, `${at}.${key}`, ancestors, out);
137
+ }
138
+ }
139
+ ancestors.delete(value);
140
+ return out;
141
+ }
142
+
143
+ /**
144
+ * The node's own shape, once it is known to be JSON.
145
+ * @param {Record<string, any>} node
146
+ * @returns {string[]}
147
+ */
148
+ function structureProblems(node) {
149
+ /** @type {string[]} */
150
+ const problems = [];
151
+ const unknown = Object.keys(node).filter(key => !NODE_FIELDS.has(key));
152
+ if (unknown.length > 0)
153
+ problems.push(`unknown fields: ${unknown.join(', ')}`);
154
+ if (node.kind !== 'reference') problems.push('kind: expected "reference"');
155
+ if (node.stage !== 'lowered' && node.stage !== 'linked') {
156
+ problems.push('stage: expected "lowered" or "linked"');
157
+ }
158
+ if (!isText(node.id)) problems.push('id: expected a topic name');
159
+ if (node.lang !== null && !isText(node.lang)) {
160
+ problems.push('lang: expected a language or null');
161
+ }
162
+ const provenance = node.provenance;
163
+ if (
164
+ !isRecord(provenance) ||
165
+ !isPackageName(provenance.provider) ||
166
+ (provenance.replaces !== null && !isText(provenance.replaces)) ||
167
+ !Array.isArray(provenance.extensions) ||
168
+ !provenance.extensions.every(isPackageName)
169
+ ) {
170
+ problems.push(
171
+ 'provenance: expected {provider, replaces, extensions} naming packages, not paths',
172
+ );
173
+ }
174
+ const providers = isRecord(node.sectionProviders)
175
+ ? node.sectionProviders
176
+ : null;
177
+ if (!providers || !Object.values(providers).every(isText)) {
178
+ problems.push('sectionProviders: expected section key -> provider id');
179
+ }
180
+ const titles = isRecord(node.sourceTitles) ? node.sourceTitles : null;
181
+ if (!titles || !Object.values(titles).every(isText)) {
182
+ problems.push('sourceTitles: expected section key -> authored title');
183
+ }
184
+ const doc = node.doc;
185
+ if (
186
+ !isRecord(doc) ||
187
+ !isText(doc.name) ||
188
+ !isText(doc.title) ||
189
+ typeof doc.description !== 'string' ||
190
+ !Array.isArray(doc.sections) ||
191
+ doc.sections.length === 0
192
+ ) {
193
+ problems.push('doc: expected {name, title, description, sections}');
194
+ } else {
195
+ problems.push(...sectionProblems(doc.sections, titles, node.stage));
196
+ }
197
+ return problems;
198
+ }
199
+
200
+ /**
201
+ * @param {any[]} sections
202
+ * @param {Record<string, any> | null} titles
203
+ * @param {unknown} stage
204
+ * @returns {string[]}
205
+ */
206
+ function sectionProblems(sections, titles, stage) {
207
+ /** @type {string[]} */
208
+ const problems = [];
209
+ const seen = new Set();
210
+ sections.forEach((section, index) => {
211
+ const at = `doc.sections[${index}]`;
212
+ if (
213
+ !isRecord(section) ||
214
+ typeof section.id !== 'string' ||
215
+ !SECTION_KEY_RE.test(section.id)
216
+ ) {
217
+ problems.push(`${at}.id: expected a section key`);
218
+ return;
219
+ }
220
+ if (seen.has(section.id)) {
221
+ problems.push(`${at}.id: two sections have the key "${section.id}"`);
222
+ }
223
+ seen.add(section.id);
224
+ if (!isText(section.title)) problems.push(`${at}.title: expected a title`);
225
+ if (titles && !Object.hasOwn(titles, section.id)) {
226
+ problems.push(
227
+ `sourceTitles: no authored title for section "${section.id}"`,
228
+ );
229
+ }
230
+ if (!Array.isArray(section.content)) {
231
+ problems.push(`${at}.content: expected an array of blocks`);
232
+ return;
233
+ }
234
+ section.content.forEach((/** @type {unknown} */ block, blockIndex) => {
235
+ const where = `${at}.content[${blockIndex}]`;
236
+ if (!isRecord(block) || !isText(block.type)) {
237
+ problems.push(`${where}: expected a block with a type`);
238
+ return;
239
+ }
240
+ if (block.type !== 'token-ref') return;
241
+ const ref = `${where}: token reference to "${block.topic}"`;
242
+ if (stage === 'lowered') {
243
+ if ('resolved' in block) {
244
+ problems.push(`${ref}: a lowered node carries no resolution`);
245
+ }
246
+ return;
247
+ }
248
+ if (!('resolved' in block)) {
249
+ problems.push(`${ref}: a linked node resolves every reference`);
250
+ return;
251
+ }
252
+ const problem = resolutionProblem(block.resolved);
253
+ if (problem) problems.push(`${ref}: ${problem}`);
254
+ });
255
+ });
256
+ return problems;
257
+ }
258
+
259
+ /**
260
+ * @param {unknown} resolved
261
+ * @returns {string | null}
262
+ */
263
+ function resolutionProblem(resolved) {
264
+ if (!isRecord(resolved)) return 'expected a resolution';
265
+ switch (resolved.status) {
266
+ case 'unknown-topic':
267
+ case 'unknown-section':
268
+ return Object.keys(resolved).length === 1 ? null : 'unexpected fields';
269
+ case 'resolved': {
270
+ if (!isText(resolved.topic)) return 'topic: expected a topic name';
271
+ if (
272
+ typeof resolved.section !== 'string' ||
273
+ !SECTION_KEY_RE.test(resolved.section)
274
+ ) {
275
+ return 'section: expected a section key';
276
+ }
277
+ if ('previewType' in resolved && !isText(resolved.previewType)) {
278
+ return 'previewType: expected a preview type';
279
+ }
280
+ if (
281
+ !Array.isArray(resolved.content) ||
282
+ !resolved.content.every(block => isRecord(block) && isText(block.type))
283
+ ) {
284
+ return 'content: expected blocks with a type';
285
+ }
286
+ const extra = Object.keys(resolved).filter(
287
+ key => !RESOLVED_FIELDS.has(key),
288
+ );
289
+ return extra.length > 0 ? `unexpected fields: ${extra.join(', ')}` : null;
290
+ }
291
+ default:
292
+ return `status: expected resolved, unknown-topic or unknown-section, got ${JSON.stringify(resolved.status)}`;
293
+ }
294
+ }
295
+
296
+ const DOC_NODE_FIELDS = new Set([
297
+ 'schemaVersion',
298
+ 'kind',
299
+ 'stage',
300
+ 'id',
301
+ 'lang',
302
+ 'provenance',
303
+ 'doc',
304
+ ]);
305
+ const BUNDLE_FIELDS = new Set([
306
+ 'schemaVersion',
307
+ 'lang',
308
+ 'nodes',
309
+ 'diagnostics',
310
+ ]);
311
+
312
+ /**
313
+ * A package-relative source, never a location on one machine.
314
+ * @param {unknown} value
315
+ * @returns {boolean}
316
+ */
317
+ const isPackageSource = value =>
318
+ isPackageName(value) &&
319
+ !/(^|\/)\.\.(\/|$)/.test(/** @type {string} */ (value));
320
+
321
+ /**
322
+ * An Error for a value that is not a compiled doc, carrying the diagnostic a
323
+ * reader reports.
324
+ * @param {'unsupported_schema' | 'invalid_bundle'} code
325
+ * @param {string} message
326
+ * @returns {Error & {diagnostic: import('./diagnostics.mjs').CompilerDiagnostic}}
327
+ */
328
+ function compiledDocError(code, message) {
329
+ const error = /** @type {Error & {diagnostic: any}} */ (new Error(message));
330
+ error.diagnostic = diagnostic(code, {message});
331
+ return error;
332
+ }
333
+
334
+ /**
335
+ * @param {unknown} value
336
+ */
337
+ function schemaVersionProblem(value) {
338
+ const version = /** @type {any} */ (value)?.schemaVersion;
339
+ return version === COMPILED_DOC_SCHEMA_VERSION
340
+ ? null
341
+ : `Compiled doc schema version ${JSON.stringify(version)} is not supported; this CLI reads version ${COMPILED_DOC_SCHEMA_VERSION}. Compile the docs again with this CLI.`;
342
+ }
343
+
344
+ /**
345
+ * Validate a compiled node of any kind.
346
+ * @param {unknown} value
347
+ * @returns {import('./compile.mjs').CompiledDocNode | import('./compile.mjs').CompiledReferenceNode}
348
+ */
349
+ export function parseCompiledDocNode(value) {
350
+ const skew = schemaVersionProblem(value);
351
+ if (skew) throw compiledDocError('unsupported_schema', skew);
352
+ const problems = nodeProblems(value, 'node');
353
+ if (problems.length > 0) {
354
+ throw compiledDocError(
355
+ 'invalid_bundle',
356
+ `Invalid compiled doc node: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
357
+ );
358
+ }
359
+ return /** @type {any} */ (value);
360
+ }
361
+
362
+ /**
363
+ * Validate a compiled docs bundle: every node, every diagnostic, and one node
364
+ * per id.
365
+ * @param {unknown} value
366
+ * @returns {import('./bundle.mjs').CompiledDocsBundle}
367
+ */
368
+ export function parseCompiledDocsBundle(value) {
369
+ const skew = schemaVersionProblem(value);
370
+ if (skew) throw compiledDocError('unsupported_schema', skew);
371
+ const bundle = /** @type {any} */ (value);
372
+ /** @type {string[]} */
373
+ const problems = jsonProblems(bundle, 'bundle');
374
+ if (problems.length === 0) {
375
+ const unknown = Object.keys(bundle).filter(key => !BUNDLE_FIELDS.has(key));
376
+ if (unknown.length > 0)
377
+ problems.push(`unknown fields: ${unknown.join(', ')}`);
378
+ if (bundle.lang !== null && !isText(bundle.lang)) {
379
+ problems.push('lang: expected a language or null');
380
+ }
381
+ if (!Array.isArray(bundle.nodes)) {
382
+ problems.push('nodes: expected an array');
383
+ } else {
384
+ const ids = new Set();
385
+ bundle.nodes.forEach(
386
+ (/** @type {unknown} */ node, /** @type {number} */ index) => {
387
+ for (const problem of nodeProblems(node, `nodes[${index}]`)) {
388
+ problems.push(problem);
389
+ }
390
+ const id = /** @type {any} */ (node)?.id;
391
+ if (ids.has(id))
392
+ problems.push(`nodes[${index}].id: "${id}" appears twice`);
393
+ ids.add(id);
394
+ },
395
+ );
396
+ }
397
+ if (!Array.isArray(bundle.diagnostics)) {
398
+ problems.push('diagnostics: expected an array');
399
+ } else {
400
+ bundle.diagnostics.forEach(
401
+ (/** @type {unknown} */ d, /** @type {number} */ index) => {
402
+ const problem = diagnosticProblem(d);
403
+ if (problem) problems.push(`diagnostics[${index}]: ${problem}`);
404
+ },
405
+ );
406
+ }
407
+ }
408
+ if (problems.length > 0) {
409
+ throw compiledDocError(
410
+ 'invalid_bundle',
411
+ `Invalid compiled docs bundle: ${problems.slice(0, MAX_PROBLEMS).join('; ')}`,
412
+ );
413
+ }
414
+ return bundle;
415
+ }
416
+
417
+ /**
418
+ * Problems with one node of any kind, each prefixed with where it is.
419
+ * @param {unknown} value
420
+ * @param {string} at
421
+ * @returns {string[]}
422
+ */
423
+ function nodeProblems(value, at) {
424
+ const node = /** @type {any} */ (value);
425
+ if (node?.schemaVersion !== COMPILED_DOC_SCHEMA_VERSION) {
426
+ return [`${at}.schemaVersion: expected ${COMPILED_DOC_SCHEMA_VERSION}`];
427
+ }
428
+ const json = jsonProblems(node, at);
429
+ if (json.length > 0) return json;
430
+ if (node.kind === 'reference') {
431
+ return structureProblems(node).map(problem => `${at}: ${problem}`);
432
+ }
433
+ /** @type {string[]} */
434
+ const problems = [];
435
+ const unknown = Object.keys(node).filter(key => !DOC_NODE_FIELDS.has(key));
436
+ if (unknown.length > 0)
437
+ problems.push(`${at}: unknown fields: ${unknown.join(', ')}`);
438
+ if (!COMPILED_DOC_KINDS.includes(node.kind)) {
439
+ problems.push(
440
+ `${at}.kind: ${JSON.stringify(node.kind)} is not a compiled doc kind`,
441
+ );
442
+ }
443
+ if (node.stage !== 'lowered')
444
+ problems.push(`${at}.stage: expected "lowered"`);
445
+ if (!isText(node.id)) problems.push(`${at}.id: expected an id`);
446
+ if (node.lang !== null && !isText(node.lang)) {
447
+ problems.push(`${at}.lang: expected a language or null`);
448
+ }
449
+ const provenance = node.provenance;
450
+ if (
451
+ !isRecord(provenance) ||
452
+ Object.keys(provenance).length !== 2 ||
453
+ !isPackageName(provenance.provider) ||
454
+ !isPackageSource(provenance.source)
455
+ ) {
456
+ problems.push(
457
+ `${at}.provenance: expected {provider, source} naming a package and a path inside it, not a machine path`,
458
+ );
459
+ }
460
+ if (!isRecord(node.doc) || !isText(node.doc.name)) {
461
+ problems.push(`${at}.doc: expected a doc with a name`);
462
+ } else if (
463
+ (node.kind === 'page' || node.kind === 'block' || node.kind === 'theme') &&
464
+ node.doc.type !== node.kind
465
+ ) {
466
+ problems.push(
467
+ `${at}.doc.type: a ${node.kind} node holds a ${node.kind} doc`,
468
+ );
469
+ }
470
+ return problems;
471
+ }
@@ -0,0 +1,36 @@
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
+ * The node's sections as readers look them up: each one knows its authored
6
+ * title, so a query in the authoring language finds a translated section.
7
+ * For lookup only; a section a reader gets back comes from
8
+ * {@link sectionView}.
9
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
10
+ * @returns {any[]}
11
+ */
12
+ export function readerSections(node: import("./compile.mjs").CompiledReferenceNode): any[];
13
+ /**
14
+ * `docs.detail`: the whole topic, with every token reference inlined.
15
+ * @param {import('./compile.mjs').CompiledReferenceNode} node a linked node
16
+ * @returns {any}
17
+ */
18
+ export function detailView(node: import("./compile.mjs").CompiledReferenceNode): any;
19
+ /**
20
+ * `docs.index`: what the topic is, and each section's key, title and summary.
21
+ * The index leaf adds the moves.
22
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
23
+ * @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
24
+ */
25
+ export function indexView(node: import("./compile.mjs").CompiledReferenceNode): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
26
+ /**
27
+ * `docs.detail.section`: one section with its token references and reference
28
+ * blocks inlined, so a read returns only the stable block kinds. A referenced
29
+ * section's content takes the token reference's place; the section takes the
30
+ * preview type of the last reference that has one, unless it has its own. A
31
+ * reference block becomes the content it includes (see referenceView).
32
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
33
+ * @param {any} section a linked section of `node`
34
+ * @returns {any}
35
+ */
36
+ export function sectionView(node: import("./compile.mjs").CompiledReferenceNode, section: any): any;
@@ -0,0 +1,173 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Lenses — the docs API's response shapes, read off compiled nodes.
5
+ *
6
+ * @input A compiled reference node from ./compile.mjs: lowered for the index
7
+ * and for section lookup, linked for anything that inlines token references.
8
+ * @output The `docs.detail` topic, the `docs.index` section index, one
9
+ * `docs.detail.section` section, and the sections as readers look them up.
10
+ * Every view is a fresh copy, so a reader may edit what it gets back without
11
+ * touching the node, which other reads of the same catalog share.
12
+ * @position Between the compiler and api/docs. A lens only projects: it never
13
+ * loads, merges, overlays, keys, or resolves a reference itself.
14
+ */
15
+
16
+ import {
17
+ buildDocsIndexData,
18
+ withSourceTitle,
19
+ } from '../discovery/docs-section-key.mjs';
20
+
21
+ /**
22
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
23
+ * @param {any} section
24
+ * @returns {string}
25
+ */
26
+ function authoredTitle(node, section) {
27
+ return node.sourceTitles[section.id] ?? section.title;
28
+ }
29
+
30
+ /**
31
+ * The node's sections as readers look them up: each one knows its authored
32
+ * title, so a query in the authoring language finds a translated section.
33
+ * For lookup only; a section a reader gets back comes from
34
+ * {@link sectionView}.
35
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
36
+ * @returns {any[]}
37
+ */
38
+ export function readerSections(node) {
39
+ return node.doc.sections.map((/** @type {any} */ section) =>
40
+ withSourceTitle({...section}, authoredTitle(node, section)),
41
+ );
42
+ }
43
+
44
+ /**
45
+ * `docs.detail`: the whole topic, with every token reference inlined.
46
+ * @param {import('./compile.mjs').CompiledReferenceNode} node a linked node
47
+ * @returns {any}
48
+ */
49
+ export function detailView(node) {
50
+ if (node.stage !== 'linked') {
51
+ throw new Error(
52
+ `"${node.id}" must be linked before its whole doc is read.`,
53
+ );
54
+ }
55
+ // Assigning `sections` keeps it where the authored doc put it.
56
+ const view = structuredClone({...node.doc, sections: []});
57
+ view.sections = node.doc.sections.map((/** @type {any} */ section) =>
58
+ sectionView(node, section),
59
+ );
60
+ return view;
61
+ }
62
+
63
+ /**
64
+ * `docs.index`: what the topic is, and each section's key, title and summary.
65
+ * The index leaf adds the moves.
66
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
67
+ * @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
68
+ */
69
+ export function indexView(node) {
70
+ return buildDocsIndexData(node.doc);
71
+ }
72
+
73
+ /**
74
+ * `docs.detail.section`: one section with its token references and reference
75
+ * blocks inlined, so a read returns only the stable block kinds. A referenced
76
+ * section's content takes the token reference's place; the section takes the
77
+ * preview type of the last reference that has one, unless it has its own. A
78
+ * reference block becomes the content it includes (see referenceView).
79
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
80
+ * @param {any} section a linked section of `node`
81
+ * @returns {any}
82
+ */
83
+ export function sectionView(node, section) {
84
+ /** @type {any[]} */
85
+ const content = [];
86
+ /** @type {string | null} */
87
+ let previewType = null;
88
+ for (const block of section.content) {
89
+ if (block?.type === 'reference') {
90
+ content.push(...referenceView(node, block));
91
+ continue;
92
+ }
93
+ if (block?.type !== 'token-ref') {
94
+ content.push(structuredClone(block));
95
+ continue;
96
+ }
97
+ const target = block.resolved;
98
+ if (target == null) {
99
+ throw new Error(
100
+ `The token reference to "${block.topic}" in "${node.id}" was read before it was linked.`,
101
+ );
102
+ }
103
+ if (target.status === 'unknown-topic') {
104
+ content.push({
105
+ type: 'prose',
106
+ text: `[token-ref: unknown topic "${block.topic}"]`,
107
+ });
108
+ continue;
109
+ }
110
+ if (target.status === 'unknown-section') {
111
+ content.push({
112
+ type: 'prose',
113
+ text: `[token-ref: section "${block.section}" not found in "${block.topic}"]`,
114
+ });
115
+ continue;
116
+ }
117
+ // A copy per reference: two references to one section share nothing.
118
+ for (const refBlock of target.content) {
119
+ content.push(structuredClone(refBlock));
120
+ }
121
+ if (target.previewType && !section.previewType) {
122
+ previewType = target.previewType;
123
+ }
124
+ }
125
+ // Assigning `content` keeps it where the section put it; a carried preview
126
+ // type lands after the section's own keys, as it always has.
127
+ const view = structuredClone(
128
+ previewType == null
129
+ ? {...section, content: []}
130
+ : {...section, previewType, content: []},
131
+ );
132
+ view.content = content;
133
+ return withSourceTitle(view, authoredTitle(node, section));
134
+ }
135
+
136
+ /**
137
+ * A reference block as a read shows it (spec:AST-047 FR9): the content it
138
+ * includes, then where that content comes from and the command that opens it.
139
+ * A reference that includes nothing (a summary, or a doc that is not included
140
+ * whole) shows the doc's title and summary; one whose doc is missing says so
141
+ * where its content would be, as a token reference does.
142
+ * @param {import('./compile.mjs').CompiledReferenceNode} node
143
+ * @param {any} block a linked reference block
144
+ * @returns {any[]}
145
+ */
146
+ function referenceView(node, block) {
147
+ if (!('link' in block)) {
148
+ throw new Error(
149
+ `The reference to "${block.target}" in "${node.id}" was read before it was linked.`,
150
+ );
151
+ }
152
+ const link = block.link;
153
+ if (link == null) {
154
+ return [
155
+ {type: 'prose', text: `[reference: "${block.target}" names no doc]`},
156
+ ];
157
+ }
158
+ const included = (block.content ?? []).map((/** @type {any} */ each) =>
159
+ structuredClone(each),
160
+ );
161
+ if (included.length === 0) {
162
+ const summary = String(link.summary ?? '').trim();
163
+ const lead =
164
+ summary === ''
165
+ ? link.title
166
+ : `${link.title}: ${summary}${/[.!?]$/.test(summary) ? '' : '.'}`;
167
+ return [{type: 'prose', text: `${lead} Read it with \`${link.command}\`.`}];
168
+ }
169
+ return [
170
+ ...included,
171
+ {type: 'prose', text: `From ${link.title}: \`${link.command}\``},
172
+ ];
173
+ }