@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,116 @@
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
+ * Record the authored title of a section whose visible title a translation
6
+ * overlay replaces.
7
+ * @template {object} T
8
+ * @param {T} section
9
+ * @param {string} title
10
+ * @returns {T}
11
+ */
12
+ export function withSourceTitle<T extends object>(section: T, title: string): T;
13
+ /**
14
+ * @param {any} section
15
+ * @returns {string}
16
+ */
17
+ export function sourceTitle(section: any): string;
18
+ /**
19
+ * The key a title derives: accents folded, `&` spelled out, and every other
20
+ * run of non-alphanumerics collapsed to one hyphen. Empty when the title has
21
+ * no Latin letters or digits to derive from.
22
+ * @param {unknown} title
23
+ * @returns {string}
24
+ */
25
+ export function sectionTitleKey(title: unknown): string;
26
+ /**
27
+ * The key a section is addressed by: its authored `id`, else the key its
28
+ * authored title derives.
29
+ * @param {any} section
30
+ * @returns {string}
31
+ */
32
+ export function sectionKey(section: any): string;
33
+ /**
34
+ * A name as a docs-tree route segment: lowercase words joined by hyphens, so
35
+ * `integrationPackCheck` and `integration verify` both read naturally.
36
+ * @param {string} name
37
+ * @returns {string}
38
+ */
39
+ export function routeSegment(name: string): string;
40
+ /**
41
+ * Fatal key problems: only an explicitly authored `id` can make a previously
42
+ * readable topic invalid. Derived-key collisions and titles with no Latin
43
+ * letters or digits are handled by {@link withSectionKeys} for 0.6.x
44
+ * compatibility.
45
+ * @param {any[]} sections
46
+ * @returns {string[]}
47
+ */
48
+ export function sectionKeyErrors(sections: any[]): string[];
49
+ /**
50
+ * Compatibility notices for section keys. These inputs loaded in 0.6.x, so
51
+ * readers keep accepting them and assign deterministic fallback keys.
52
+ * @param {any[]} sections
53
+ * @returns {string[]}
54
+ */
55
+ export function sectionKeyProblems(sections: any[]): string[];
56
+ /**
57
+ * Stamp every section with the key it is addressed by. Runs only after
58
+ * extensions merge: a derived key must never take part in merge matching.
59
+ * @template {{sections: any[]}} T
60
+ * @param {T} doc
61
+ * @returns {T}
62
+ */
63
+ export function withSectionKeys<T extends {
64
+ sections: any[];
65
+ }>(doc: T): T;
66
+ /**
67
+ * Find the section a reader asked for. The 0.6.x first-match title-substring
68
+ * lookup remains first in the authored-title view. In a localized view, an
69
+ * exact stable key resolves before translated title substrings because those
70
+ * translations cannot participate in language-stable key allocation. Generated
71
+ * keys avoid authored-title conflicts, and authored IDs that would shadow an
72
+ * authored legacy query are rejected.
73
+ * @param {any[]} sections
74
+ * @param {string} query
75
+ * @returns {{section: any | null, candidates: any[]}} `candidates` lists every
76
+ * legacy title match when the query is ambiguous
77
+ */
78
+ export function findDocSection(sections: any[], query: string): {
79
+ section: any | null;
80
+ candidates: any[];
81
+ };
82
+ /**
83
+ * One line that says what a section holds: its first prose or list text,
84
+ * whitespace collapsed, cut at a word boundary.
85
+ * @param {any} section
86
+ * @param {number} [max]
87
+ * @returns {string}
88
+ */
89
+ export function sectionSummary(section: any, max?: number): string;
90
+ /**
91
+ * The index a topic-only read returns: what the topic is, and one entry per
92
+ * section with the key to read it by.
93
+ * @param {{name: string, title: string, description: string, sections: any[]}} doc
94
+ * @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
95
+ */
96
+ export function buildDocsIndexData(doc: {
97
+ name: string;
98
+ title: string;
99
+ description: string;
100
+ sections: any[];
101
+ }): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
102
+ /**
103
+ * @file Stable section keys, section lookup, and the topic index.
104
+ *
105
+ * @input Reference-doc sections, each with an optional authored `id`.
106
+ * @output The key a section is addressed by (its `id`, else a kebab-case key
107
+ * derived from its authored title), lookup by key or title, and the compact
108
+ * index a topic-only docs read returns.
109
+ * @position Shared by docs discovery (which rejects colliding keys before a
110
+ * reader sees them), the docs leaves (index, section, detail), and Doctor
111
+ * (output budgets). Imports nothing from discovery, so both can use it.
112
+ */
113
+ /** A stable key: lowercase letters and digits, joined by single hyphens. */
114
+ export const SECTION_KEY_RE: RegExp;
115
+ /** The longest summary an index entry carries, in characters. */
116
+ export const SECTION_SUMMARY_MAX: 240;
@@ -0,0 +1,322 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Stable section keys, section lookup, and the topic index.
5
+ *
6
+ * @input Reference-doc sections, each with an optional authored `id`.
7
+ * @output The key a section is addressed by (its `id`, else a kebab-case key
8
+ * derived from its authored title), lookup by key or title, and the compact
9
+ * index a topic-only docs read returns.
10
+ * @position Shared by docs discovery (which rejects colliding keys before a
11
+ * reader sees them), the docs leaves (index, section, detail), and Doctor
12
+ * (output budgets). Imports nothing from discovery, so both can use it.
13
+ */
14
+
15
+ /** A stable key: lowercase letters and digits, joined by single hyphens. */
16
+ export const SECTION_KEY_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
17
+
18
+ /** The longest summary an index entry carries, in characters. */
19
+ export const SECTION_SUMMARY_MAX = 240;
20
+
21
+ /**
22
+ * A section's authored title. A `--zh`/`--dense` overlay replaces the visible
23
+ * title, but extensions are written against the authored one and keys derive
24
+ * from it, so both stay the same in every language.
25
+ */
26
+ const SOURCE_TITLE = Symbol('astryx.docs.sourceTitle');
27
+
28
+ /**
29
+ * Record the authored title of a section whose visible title a translation
30
+ * overlay replaces.
31
+ * @template {object} T
32
+ * @param {T} section
33
+ * @param {string} title
34
+ * @returns {T}
35
+ */
36
+ export function withSourceTitle(section, title) {
37
+ Object.defineProperty(section, SOURCE_TITLE, {
38
+ value: title,
39
+ configurable: true,
40
+ });
41
+ return section;
42
+ }
43
+
44
+ /**
45
+ * @param {any} section
46
+ * @returns {string}
47
+ */
48
+ export function sourceTitle(section) {
49
+ return section?.[SOURCE_TITLE] ?? section?.title;
50
+ }
51
+
52
+ /**
53
+ * The key a title derives: accents folded, `&` spelled out, and every other
54
+ * run of non-alphanumerics collapsed to one hyphen. Empty when the title has
55
+ * no Latin letters or digits to derive from.
56
+ * @param {unknown} title
57
+ * @returns {string}
58
+ */
59
+ export function sectionTitleKey(title) {
60
+ if (typeof title !== 'string') return '';
61
+ return title
62
+ .normalize('NFKD')
63
+ .replace(/[\u0300-\u036f]/g, '')
64
+ .toLowerCase()
65
+ .replace(/&/g, ' and ')
66
+ .replace(/[^a-z0-9]+/g, '-')
67
+ .replace(/^-+|-+$/g, '');
68
+ }
69
+
70
+ /**
71
+ * The key a section is addressed by: its authored `id`, else the key its
72
+ * authored title derives.
73
+ * @param {any} section
74
+ * @returns {string}
75
+ */
76
+ export function sectionKey(section) {
77
+ return typeof section?.id === 'string'
78
+ ? section.id
79
+ : sectionTitleKey(sourceTitle(section));
80
+ }
81
+
82
+ /**
83
+ * The first section the 0.6.x title-substring lookup would return for a query.
84
+ * @param {any[]} sections
85
+ * @param {string} query
86
+ * @returns {number}
87
+ */
88
+ function legacyTitleMatchIndex(sections, query) {
89
+ const lower = query.toLowerCase();
90
+ return sections.findIndex(section => {
91
+ const title = sourceTitle(section);
92
+ return typeof title === 'string' && title.toLowerCase().includes(lower);
93
+ });
94
+ }
95
+
96
+ /**
97
+ * A name as a docs-tree route segment: lowercase words joined by hyphens, so
98
+ * `integrationPackCheck` and `integration verify` both read naturally.
99
+ * @param {string} name
100
+ * @returns {string}
101
+ */
102
+ export function routeSegment(name) {
103
+ return String(name)
104
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
105
+ .toLowerCase()
106
+ .replace(/[^a-z0-9]+/g, '-')
107
+ .replace(/^-+|-+$/g, '');
108
+ }
109
+
110
+ /**
111
+ * Fatal key problems: only an explicitly authored `id` can make a previously
112
+ * readable topic invalid. Derived-key collisions and titles with no Latin
113
+ * letters or digits are handled by {@link withSectionKeys} for 0.6.x
114
+ * compatibility.
115
+ * @param {any[]} sections
116
+ * @returns {string[]}
117
+ */
118
+ export function sectionKeyErrors(sections) {
119
+ /** @type {string[]} */
120
+ const problems = [];
121
+ /** @type {Map<string, number>} */
122
+ const seen = new Map();
123
+ sections.forEach((section, s) => {
124
+ if (section?.id == null) return;
125
+ const at = `sections[${s}]`;
126
+ if (typeof section.id !== 'string' || !SECTION_KEY_RE.test(section.id)) {
127
+ problems.push(
128
+ `${at}.id: ${JSON.stringify(section.id)} is not a stable key. Use lowercase letters and digits joined by single hyphens.`,
129
+ );
130
+ return;
131
+ }
132
+ const first = seen.get(section.id);
133
+ if (first != null) {
134
+ problems.push(
135
+ `${at}: the key "${section.id}" is already used by sections[${first}]. Give one of them a distinct id.`,
136
+ );
137
+ return;
138
+ }
139
+ const legacyOwner = legacyTitleMatchIndex(sections, section.id);
140
+ if (legacyOwner !== -1 && legacyOwner !== s) {
141
+ problems.push(
142
+ `${at}.id: the key "${section.id}" is already a legacy title query for sections[${legacyOwner}]. Choose an id that resolves to this section.`,
143
+ );
144
+ return;
145
+ }
146
+ seen.set(section.id, s);
147
+ });
148
+ return problems;
149
+ }
150
+
151
+ /**
152
+ * Compatibility notices for section keys. These inputs loaded in 0.6.x, so
153
+ * readers keep accepting them and assign deterministic fallback keys.
154
+ * @param {any[]} sections
155
+ * @returns {string[]}
156
+ */
157
+ export function sectionKeyProblems(sections) {
158
+ /** @type {string[]} */
159
+ const problems = [];
160
+ /** @type {Map<string, number>} */
161
+ const seen = new Map();
162
+ sections.forEach((section, s) => {
163
+ const at = `sections[${s}]`;
164
+ if (
165
+ section?.id == null &&
166
+ (typeof section?.title !== 'string' || section.title === '')
167
+ ) {
168
+ return;
169
+ }
170
+ if (
171
+ section?.id != null &&
172
+ (typeof section.id !== 'string' || !SECTION_KEY_RE.test(section.id))
173
+ ) {
174
+ problems.push(
175
+ `${at}.id: ${JSON.stringify(section.id)} is not a stable key. Use lowercase letters and digits joined by single hyphens.`,
176
+ );
177
+ return;
178
+ }
179
+ const key = sectionKey(section);
180
+ if (key === '') {
181
+ problems.push(
182
+ `${at}: no key derives from the title ${JSON.stringify(section?.title)}. A deterministic section-N compatibility key is used; add an explicit id.`,
183
+ );
184
+ return;
185
+ }
186
+ const first = seen.get(key);
187
+ if (first != null) {
188
+ problems.push(
189
+ `${at}: the key "${key}" is already used by sections[${first}]. A suffixed compatibility key is used for title-derived collisions; give one of them a distinct id or title.`,
190
+ );
191
+ return;
192
+ }
193
+ seen.set(key, s);
194
+ });
195
+ return problems;
196
+ }
197
+
198
+ /**
199
+ * Stamp every section with the key it is addressed by. Runs only after
200
+ * extensions merge: a derived key must never take part in merge matching.
201
+ * @template {{sections: any[]}} T
202
+ * @param {T} doc
203
+ * @returns {T}
204
+ */
205
+ export function withSectionKeys(doc) {
206
+ const reserved = new Set(
207
+ doc.sections
208
+ .map(section => section?.id)
209
+ .filter(id => typeof id === 'string' && SECTION_KEY_RE.test(id)),
210
+ );
211
+ const used = new Set();
212
+ return {
213
+ ...doc,
214
+ sections: doc.sections.map((section, index) => {
215
+ if (section.id != null) {
216
+ used.add(section.id);
217
+ return section;
218
+ }
219
+ const base =
220
+ sectionTitleKey(sourceTitle(section)) || `section-${index + 1}`;
221
+ let key = base;
222
+ let suffix = 2;
223
+ while (
224
+ reserved.has(key) ||
225
+ used.has(key) ||
226
+ (legacyTitleMatchIndex(doc.sections, key) !== -1 &&
227
+ legacyTitleMatchIndex(doc.sections, key) !== index)
228
+ ) {
229
+ key = `${base}-${suffix}`;
230
+ suffix += 1;
231
+ }
232
+ used.add(key);
233
+ return withSourceTitle({...section, id: key}, sourceTitle(section));
234
+ }),
235
+ };
236
+ }
237
+
238
+ /**
239
+ * Find the section a reader asked for. The 0.6.x first-match title-substring
240
+ * lookup remains first in the authored-title view. In a localized view, an
241
+ * exact stable key resolves before translated title substrings because those
242
+ * translations cannot participate in language-stable key allocation. Generated
243
+ * keys avoid authored-title conflicts, and authored IDs that would shadow an
244
+ * authored legacy query are rejected.
245
+ * @param {any[]} sections
246
+ * @param {string} query
247
+ * @returns {{section: any | null, candidates: any[]}} `candidates` lists every
248
+ * legacy title match when the query is ambiguous
249
+ */
250
+ export function findDocSection(sections, query) {
251
+ const wanted = query.trim();
252
+ const byKey = sections.find(section => sectionKey(section) === wanted);
253
+ const hasLocalizedTitles = sections.some(
254
+ section => sourceTitle(section) !== section.title,
255
+ );
256
+ if (byKey && hasLocalizedTitles) {
257
+ return {section: byKey, candidates: []};
258
+ }
259
+
260
+ const lower = wanted.toLowerCase();
261
+ const legacy = sections.filter(section =>
262
+ section.title.toLowerCase().includes(lower),
263
+ );
264
+ if (legacy.length > 0) {
265
+ return {section: legacy[0], candidates: legacy.length > 1 ? legacy : []};
266
+ }
267
+
268
+ const byFallbackKey = sections.find(
269
+ section => sectionKey(section) === wanted,
270
+ );
271
+ if (byFallbackKey) return {section: byFallbackKey, candidates: []};
272
+
273
+ const derived = sectionTitleKey(wanted);
274
+ const byDerivedKey = sections.find(
275
+ section =>
276
+ derived !== '' && sectionTitleKey(sourceTitle(section)) === derived,
277
+ );
278
+ return {section: byDerivedKey ?? null, candidates: []};
279
+ }
280
+
281
+ /**
282
+ * One line that says what a section holds: its first prose or list text,
283
+ * whitespace collapsed, cut at a word boundary.
284
+ * @param {any} section
285
+ * @param {number} [max]
286
+ * @returns {string}
287
+ */
288
+ export function sectionSummary(section, max = SECTION_SUMMARY_MAX) {
289
+ const first = (section?.content ?? []).find(
290
+ (/** @type {any} */ block) =>
291
+ (block?.type === 'prose' && typeof block.text === 'string') ||
292
+ (block?.type === 'list' && Array.isArray(block.items)),
293
+ );
294
+ const raw =
295
+ first == null ? '' : first.type === 'prose' ? first.text : first.items[0];
296
+ const text = String(raw ?? '')
297
+ .replace(/\s+/g, ' ')
298
+ .trim();
299
+ if (text.length <= max) return text;
300
+ const cut = text.slice(0, max - 1);
301
+ const space = cut.lastIndexOf(' ');
302
+ return `${(space > max / 2 ? cut.slice(0, space) : cut).trimEnd()}…`;
303
+ }
304
+
305
+ /**
306
+ * The index a topic-only read returns: what the topic is, and one entry per
307
+ * section with the key to read it by.
308
+ * @param {{name: string, title: string, description: string, sections: any[]}} doc
309
+ * @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
310
+ */
311
+ export function buildDocsIndexData(doc) {
312
+ return {
313
+ name: doc.name,
314
+ title: doc.title,
315
+ description: doc.description,
316
+ sections: doc.sections.map(section => ({
317
+ id: sectionKey(section),
318
+ title: section.title,
319
+ summary: sectionSummary(section),
320
+ })),
321
+ };
322
+ }
@@ -0,0 +1,246 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {
5
+ SECTION_KEY_RE,
6
+ SECTION_SUMMARY_MAX,
7
+ buildDocsIndexData,
8
+ findDocSection,
9
+ sectionKey,
10
+ sectionKeyErrors,
11
+ sectionKeyProblems,
12
+ sectionSummary,
13
+ sectionTitleKey,
14
+ sourceTitle,
15
+ withSectionKeys,
16
+ withSourceTitle,
17
+ } from './docs-section-key.mjs';
18
+
19
+ /** @param {string} title @param {object} [fields] */
20
+ const section = (title, fields = {}) => ({title, content: [], ...fields});
21
+
22
+ describe('sectionTitleKey', () => {
23
+ it.each([
24
+ ['Quick Start', 'quick-start'],
25
+ ['Light/Dark Mode', 'light-dark-mode'],
26
+ ["Do & Don't", 'do-and-don-t'],
27
+ [' Café Crème ', 'cafe-creme'],
28
+ ['useTheme()', 'usetheme'],
29
+ ['--- Tokens ---', 'tokens'],
30
+ ['亮/暗模式', ''],
31
+ ['', ''],
32
+ ])('%j derives %j', (title, key) => {
33
+ expect(sectionTitleKey(title)).toBe(key);
34
+ });
35
+
36
+ it('derives only stable keys', () => {
37
+ for (const title of ['A B', 'x__y', 'Élan 2.0', 'a-b-', '-a']) {
38
+ expect(sectionTitleKey(title)).toMatch(SECTION_KEY_RE);
39
+ }
40
+ });
41
+
42
+ it('derives nothing from a non-string', () => {
43
+ expect(sectionTitleKey(undefined)).toBe('');
44
+ expect(sectionTitleKey(42)).toBe('');
45
+ });
46
+ });
47
+
48
+ describe('sectionKey', () => {
49
+ it('prefers the authored id', () => {
50
+ expect(sectionKey(section('Quick Start', {id: 'start'}))).toBe('start');
51
+ });
52
+
53
+ it('derives from the authored title, not a translated one', () => {
54
+ const translated = withSourceTitle(section('快速开始'), 'Quick Start');
55
+ expect(sectionKey(translated)).toBe('quick-start');
56
+ });
57
+ });
58
+
59
+ describe('sectionKeyProblems', () => {
60
+ it('accepts distinct keys', () => {
61
+ expect(
62
+ sectionKeyProblems([section('Install'), section('Usage', {id: 'use'})]),
63
+ ).toEqual([]);
64
+ });
65
+
66
+ it('rejects two sections that share a key', () => {
67
+ const problems = sectionKeyProblems([
68
+ section('Quick Start'),
69
+ section('Quick-start'),
70
+ ]);
71
+ expect(problems).toHaveLength(1);
72
+ expect(problems[0]).toContain(
73
+ '"quick-start" is already used by sections[0]',
74
+ );
75
+ });
76
+
77
+ it('rejects an authored id that collides with a derived key', () => {
78
+ expect(
79
+ sectionKeyProblems([
80
+ section('Install'),
81
+ section('Setup', {id: 'install'}),
82
+ ]),
83
+ ).toHaveLength(1);
84
+ });
85
+
86
+ it('rejects an unsafe id and never suffixes one', () => {
87
+ for (const id of ['Quick Start', 'a_b', 'a--b', '-a', '', 7]) {
88
+ expect(sectionKeyProblems([section('Install', {id})])[0]).toContain(
89
+ 'is not a stable key',
90
+ );
91
+ }
92
+ });
93
+
94
+ it('reports a title no key derives from', () => {
95
+ expect(sectionKeyProblems([section('亮/暗模式')])[0]).toContain(
96
+ 'compatibility key is used',
97
+ );
98
+ expect(
99
+ sectionKeyProblems([section('亮/暗模式', {id: 'light-dark'})]),
100
+ ).toEqual([]);
101
+ });
102
+
103
+ it('leaves a missing title to the title check', () => {
104
+ expect(sectionKeyProblems([{content: []}, section('')])).toEqual([]);
105
+ });
106
+ });
107
+
108
+ describe('withSectionKeys', () => {
109
+ it('stamps derived keys and keeps authored ones', () => {
110
+ const doc = withSectionKeys({
111
+ sections: [section('Quick Start'), section('Usage', {id: 'use'})],
112
+ });
113
+ expect(doc.sections.map(s => s.id)).toEqual(['quick-start', 'use']);
114
+ });
115
+
116
+ it('keeps authored titles and keys stable for translated sections', () => {
117
+ const doc = withSectionKeys({
118
+ sections: [
119
+ withSourceTitle(section('高级安装'), 'Install advanced'),
120
+ withSourceTitle(section('安装'), 'Install'),
121
+ ],
122
+ });
123
+ expect(doc.sections.map(s => s.id)).toEqual([
124
+ 'install-advanced',
125
+ 'install-2',
126
+ ]);
127
+ for (const target of doc.sections) {
128
+ expect(findDocSection(doc.sections, target.id).section).toBe(target);
129
+ }
130
+ expect(sourceTitle(doc.sections[0])).toBe('Install advanced');
131
+ });
132
+ });
133
+
134
+ describe('findDocSection', () => {
135
+ const sections = withSectionKeys({
136
+ sections: [
137
+ section('Quick Start'),
138
+ section('Theme Props'),
139
+ section('Theme Tokens', {id: 'tokens'}),
140
+ section('Overview', {id: 'overview-a'}),
141
+ section('Overview', {id: 'overview-b'}),
142
+ ],
143
+ }).sections;
144
+
145
+ it('finds every emitted key without changing a legacy query', () => {
146
+ const colliding = withSectionKeys({
147
+ sections: [section('Install advanced'), section('Install')],
148
+ }).sections;
149
+ expect(findDocSection(colliding, 'install').section).toBe(colliding[0]);
150
+ for (const target of colliding) {
151
+ expect(findDocSection(colliding, target.id).section).toBe(target);
152
+ }
153
+ expect(findDocSection(sections, 'tokens').section.title).toBe(
154
+ 'Theme Tokens',
155
+ );
156
+ });
157
+
158
+ it('finds a section by exact title, case-insensitively', () => {
159
+ expect(findDocSection(sections, 'quick start').section.id).toBe(
160
+ 'quick-start',
161
+ );
162
+ });
163
+
164
+ it('finds a section by the key its query derives', () => {
165
+ expect(findDocSection(sections, 'Quick-Start!').section.id).toBe(
166
+ 'quick-start',
167
+ );
168
+ });
169
+
170
+ it('finds a section by a unique part of its title', () => {
171
+ expect(findDocSection(sections, 'props').section.id).toBe('theme-props');
172
+ });
173
+
174
+ it('keeps the first ambiguous exact-title match and lists the candidates', () => {
175
+ const {section: match, candidates} = findDocSection(sections, 'Overview');
176
+ expect(match?.id).toBe('overview-a');
177
+ expect(candidates.map(s => s.id)).toEqual(['overview-a', 'overview-b']);
178
+ });
179
+
180
+ it('keeps the first ambiguous partial-title match', () => {
181
+ const {section: match, candidates} = findDocSection(sections, 'theme');
182
+ expect(match?.id).toBe('theme-props');
183
+ expect(candidates.map(s => s.id)).toEqual(['theme-props', 'tokens']);
184
+ });
185
+
186
+ it('returns nothing for no match', () => {
187
+ expect(findDocSection(sections, 'zzz')).toEqual({
188
+ section: null,
189
+ candidates: [],
190
+ });
191
+ });
192
+ });
193
+
194
+ describe('sectionSummary', () => {
195
+ it('uses the first prose or list text, whitespace collapsed', () => {
196
+ expect(
197
+ sectionSummary({
198
+ content: [
199
+ {type: 'code', lang: 'ts', code: 'x'},
200
+ {type: 'prose', text: 'Line one.\n\n Line two.'},
201
+ ],
202
+ }),
203
+ ).toBe('Line one. Line two.');
204
+ expect(
205
+ sectionSummary({content: [{type: 'list', items: ['First', 'Second']}]}),
206
+ ).toBe('First');
207
+ });
208
+
209
+ it('is empty when the section has no text', () => {
210
+ expect(
211
+ sectionSummary({content: [{type: 'table', headers: [], rows: []}]}),
212
+ ).toBe('');
213
+ });
214
+
215
+ it('cuts a long summary at a word boundary', () => {
216
+ const summary = sectionSummary({
217
+ content: [{type: 'prose', text: 'word '.repeat(200)}],
218
+ });
219
+ expect(summary.length).toBeLessThanOrEqual(SECTION_SUMMARY_MAX);
220
+ expect(summary.endsWith('word…')).toBe(true);
221
+ });
222
+ });
223
+
224
+ describe('buildDocsIndexData', () => {
225
+ it('lists each section by key, title, and summary', () => {
226
+ expect(
227
+ buildDocsIndexData({
228
+ name: 'theme',
229
+ title: 'Theme',
230
+ description: 'Theming.',
231
+ sections: [
232
+ section('Quick Start', {content: [{type: 'prose', text: 'Start.'}]}),
233
+ section('Usage', {id: 'use'}),
234
+ ],
235
+ }),
236
+ ).toEqual({
237
+ name: 'theme',
238
+ title: 'Theme',
239
+ description: 'Theming.',
240
+ sections: [
241
+ {id: 'quick-start', title: 'Quick Start', summary: 'Start.'},
242
+ {id: 'use', title: 'Usage', summary: ''},
243
+ ],
244
+ });
245
+ });
246
+ });