@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  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 +16 -9
  7. package/api/build/build.test.mjs +197 -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 +165 -49
  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 +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -0,0 +1,525 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The public type surface of `@astryxdesign/cli/authoring`, and whether
5
+ * a reader of `astryx docs authoring` can reach the doc for each type in it.
6
+ *
7
+ * @input authoring/index.d.ts and the type modules it re-exports, parsed with
8
+ * jscodeshift and never imported or type-checked (consumer installs have no
9
+ * TypeScript); the self-docs on disk and in AUTHORING_SELF_DOCS; and the
10
+ * section keys `astryx docs authoring --index` lists.
11
+ * @output {@link tracePublicAuthoringTypes}: each exported type and the module
12
+ * that declares it. {@link auditAuthoringSurface}: each module whose exported
13
+ * types a reader cannot reach and why, each export that cannot be traced,
14
+ * and each registered self-doc that documents nothing the surface exports.
15
+ * @position Read by Doctor's authoring-docs check. A type's doc is the self-doc
16
+ * beside the module that declares it, so a new public type needs a
17
+ * `*.doc.mjs` in its folder, listed in AUTHORING_SELF_DOCS. The barrel's
18
+ * parsers read those types and are not a shape anyone writes, so they need
19
+ * no section of their own.
20
+ */
21
+
22
+ import * as fs from 'node:fs';
23
+ import * as path from 'node:path';
24
+ import jscodeshift from 'jscodeshift';
25
+ import {
26
+ AUTHORING_ROOT,
27
+ AUTHORING_SELF_DOCS,
28
+ buildAuthoringReferenceDoc,
29
+ discoverAuthoringSelfDocSources,
30
+ loadAuthoringSelfDocs,
31
+ } from './authoring-self-docs.mjs';
32
+ import {sectionKey} from './docs-section-key.mjs';
33
+
34
+ const j = jscodeshift.withParser('ts');
35
+
36
+ /** The barrel the `types` condition of `@astryxdesign/cli/authoring` names. */
37
+ export const AUTHORING_SURFACE = 'index.d.ts';
38
+
39
+ /** Modules read by parsing. Anything else is runtime JavaScript. */
40
+ const TYPE_MODULE_RE = /\.(?:ts|tsx|mts|cts)$/u;
41
+
42
+ /** A title only a declaration of that name can match. */
43
+ const IDENTIFIER_RE = /^[A-Za-z_$][\w$]*$/u;
44
+
45
+ /**
46
+ * @typedef {object} Tracer
47
+ * @property {string} root
48
+ * @property {Map<string, any[]>} parsed top-level statements by absolute path
49
+ */
50
+
51
+ /**
52
+ * @typedef {'no-self-doc' | 'unregistered' | 'failed' | 'missing-section'} UnreadableReason
53
+ */
54
+
55
+ /**
56
+ * @param {string} root
57
+ * @param {string} file
58
+ * @returns {string} `file` relative to `root`, with `/` separators
59
+ */
60
+ function relative(root, file) {
61
+ return path.relative(root, file).split(path.sep).join('/');
62
+ }
63
+
64
+ /**
65
+ * @param {string} source a `/`-separated path relative to the root
66
+ * @returns {string}
67
+ */
68
+ function folderOf(source) {
69
+ return path.posix.dirname(source);
70
+ }
71
+
72
+ /** @param {any} node @returns {string | undefined} */
73
+ function nameOf(node) {
74
+ return node?.name ?? node?.value;
75
+ }
76
+
77
+ /**
78
+ * Names a top-level statement declares, exported or not.
79
+ * @param {any} node
80
+ * @returns {string[]}
81
+ */
82
+ function declaredNames(node) {
83
+ if (node?.type === 'VariableDeclaration') {
84
+ return node.declarations.flatMap((/** @type {any} */ d) =>
85
+ d.id?.type === 'Identifier' ? [d.id.name] : [],
86
+ );
87
+ }
88
+ return node?.id?.type === 'Identifier' ? [node.id.name] : [];
89
+ }
90
+
91
+ /**
92
+ * @param {Tracer} t
93
+ * @param {string} file
94
+ * @returns {any[]}
95
+ */
96
+ function statementsOf(t, file) {
97
+ let body = t.parsed.get(file);
98
+ if (!body) {
99
+ try {
100
+ body = j(fs.readFileSync(file, 'utf8')).get().node.program.body;
101
+ } catch (error) {
102
+ throw new Error(
103
+ `${relative(t.root, file)} could not be parsed: ${error instanceof Error ? error.message : String(error)}`,
104
+ {cause: error},
105
+ );
106
+ }
107
+ t.parsed.set(/** @type {string} */ (file), /** @type {any[]} */ (body));
108
+ }
109
+ return /** @type {any[]} */ (body);
110
+ }
111
+
112
+ /**
113
+ * The file a relative specifier names, resolved as TypeScript resolves an ESM
114
+ * import in a type module: `./x.js` is `./x.ts` when that exists.
115
+ * @param {Tracer} t
116
+ * @param {string} from absolute path of the importing module
117
+ * @param {string} specifier
118
+ * @returns {string} absolute path
119
+ * @throws {Error} for a bare specifier, one that leaves the root, or one that
120
+ * names no file
121
+ */
122
+ function resolveModule(t, from, specifier) {
123
+ const base = path.resolve(path.dirname(from), specifier);
124
+ const inside = relative(t.root, base);
125
+ const candidates = !specifier.startsWith('.')
126
+ ? []
127
+ : inside === '..' || inside.startsWith('../') || path.isAbsolute(inside)
128
+ ? []
129
+ : /\.js$/u.test(base)
130
+ ? [base.replace(/\.js$/u, '.ts'), base.replace(/\.js$/u, '.d.ts'), base]
131
+ : /\.[cm]js$/u.test(base) || TYPE_MODULE_RE.test(base)
132
+ ? [base]
133
+ : [
134
+ `${base}.ts`,
135
+ `${base}.d.ts`,
136
+ path.join(base, 'index.ts'),
137
+ path.join(base, 'index.d.ts'),
138
+ ];
139
+ const found = candidates.find(file => {
140
+ try {
141
+ return fs.statSync(file).isFile();
142
+ } catch {
143
+ return false;
144
+ }
145
+ });
146
+ if (found == null) {
147
+ throw new Error(
148
+ `${relative(t.root, from)} names "${specifier}", which is not a file in ${path.basename(t.root)}/`,
149
+ );
150
+ }
151
+ return found;
152
+ }
153
+
154
+ /**
155
+ * The module that declares what `file` exports as `name`, following
156
+ * re-exports. A JavaScript module declares what it exports (its JSDoc
157
+ * typedefs included), so a trace stops there.
158
+ * @param {Tracer} t
159
+ * @param {string} file
160
+ * @param {string} name
161
+ * @param {Set<string>} [seen] `file\0name` pairs already on this trace
162
+ * @returns {string | null} absolute path, or null when `file` does not export
163
+ * `name`
164
+ */
165
+ function declaringModule(t, file, name, seen = new Set()) {
166
+ if (!TYPE_MODULE_RE.test(file)) return file;
167
+ const visit = `${file}\u0000${name}`;
168
+ if (seen.has(visit)) return null;
169
+ seen.add(visit);
170
+ const body = statementsOf(t, file);
171
+ for (const statement of body) {
172
+ if (
173
+ statement.type === 'ExportNamedDeclaration' &&
174
+ declaredNames(statement.declaration).includes(name)
175
+ ) {
176
+ return file;
177
+ }
178
+ }
179
+ for (const statement of body) {
180
+ if (statement.type !== 'ExportNamedDeclaration' || statement.declaration)
181
+ continue;
182
+ for (const specifier of statement.specifiers ?? []) {
183
+ if (nameOf(specifier.exported) !== name) continue;
184
+ const source = statement.source?.value;
185
+ if (specifier.type === 'ExportNamespaceSpecifier') {
186
+ return resolveModule(t, file, source);
187
+ }
188
+ const local = nameOf(specifier.local) ?? name;
189
+ const found =
190
+ source == null
191
+ ? localBinding(t, file, body, local, seen)
192
+ : declaringModule(t, resolveModule(t, file, source), local, seen);
193
+ if (found == null) {
194
+ throw new Error(
195
+ `${relative(t.root, file)} exports ${name}${source == null ? '' : ` from "${source}"`}, which does not declare it`,
196
+ );
197
+ }
198
+ return found;
199
+ }
200
+ }
201
+ for (const statement of body) {
202
+ if (statement.type !== 'ExportAllDeclaration') continue;
203
+ const from = resolveModule(t, file, statement.source.value);
204
+ if (statement.exported != null) {
205
+ if (nameOf(statement.exported) === name) return from;
206
+ continue;
207
+ }
208
+ // What a JavaScript module exports cannot be listed by parsing, so a star
209
+ // through one never answers for a type.
210
+ if (!TYPE_MODULE_RE.test(from)) continue;
211
+ const found = declaringModule(t, from, name, seen);
212
+ if (found != null) return found;
213
+ }
214
+ return null;
215
+ }
216
+
217
+ /**
218
+ * The module that declares a binding local to `file`: `file` itself, or the
219
+ * one its import of that name traces to.
220
+ * @param {Tracer} t
221
+ * @param {string} file
222
+ * @param {any[]} body
223
+ * @param {string} local
224
+ * @param {Set<string>} seen
225
+ * @returns {string | null}
226
+ */
227
+ function localBinding(t, file, body, local, seen) {
228
+ for (const statement of body) {
229
+ const declared =
230
+ statement.type === 'ExportNamedDeclaration'
231
+ ? statement.declaration
232
+ : statement;
233
+ if (declaredNames(declared).includes(local)) return file;
234
+ if (statement.type !== 'ImportDeclaration') continue;
235
+ for (const specifier of statement.specifiers ?? []) {
236
+ if (nameOf(specifier.local) !== local) continue;
237
+ const from = resolveModule(t, file, statement.source.value);
238
+ if (specifier.type === 'ImportNamespaceSpecifier') return from;
239
+ const imported =
240
+ specifier.type === 'ImportDefaultSpecifier'
241
+ ? 'default'
242
+ : (nameOf(specifier.imported) ?? local);
243
+ return declaringModule(t, from, imported, seen);
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+
249
+ /**
250
+ * Every name a type module exports, stars included.
251
+ * @param {Tracer} t
252
+ * @param {string} file
253
+ * @param {Set<string>} [seen]
254
+ * @returns {string[]}
255
+ * @throws {Error} when a star passes through a JavaScript module, whose types
256
+ * cannot be listed by parsing
257
+ */
258
+ function exportedNames(t, file, seen = new Set()) {
259
+ /** @type {Set<string>} */
260
+ const names = new Set();
261
+ if (seen.has(file)) return [];
262
+ seen.add(file);
263
+ for (const statement of statementsOf(t, file)) {
264
+ if (statement.type === 'ExportNamedDeclaration') {
265
+ for (const name of declaredNames(statement.declaration)) names.add(name);
266
+ for (const specifier of statement.specifiers ?? []) {
267
+ const name = nameOf(specifier.exported);
268
+ if (name != null) names.add(name);
269
+ }
270
+ } else if (statement.type === 'ExportAllDeclaration') {
271
+ const from = resolveModule(t, file, statement.source.value);
272
+ if (statement.exported != null) {
273
+ const name = nameOf(statement.exported);
274
+ if (name != null) names.add(name);
275
+ } else if (TYPE_MODULE_RE.test(from)) {
276
+ for (const name of exportedNames(t, from, seen)) {
277
+ if (name !== 'default') names.add(name);
278
+ }
279
+ } else {
280
+ throw new Error(
281
+ `${relative(t.root, file)} re-exports every type of "${statement.source.value}", a JavaScript module whose types cannot be listed`,
282
+ );
283
+ }
284
+ }
285
+ }
286
+ return [...names];
287
+ }
288
+
289
+ /**
290
+ * Every type `@astryxdesign/cli/authoring` exports, in the order index.d.ts
291
+ * lists them, each traced to the module that declares it. A value export that
292
+ * traces to a JavaScript module (a parser) is not a type and is left out;
293
+ * anything else that cannot be traced is reported, never dropped.
294
+ * @param {string} [root]
295
+ * @returns {{
296
+ * types: {name: string, module: string}[],
297
+ * untraced: {name: string, reason: string}[],
298
+ * }} `module` is relative to `root`
299
+ */
300
+ export function tracePublicAuthoringTypes(root = AUTHORING_ROOT) {
301
+ return traceSurface({root, parsed: new Map()});
302
+ }
303
+
304
+ /**
305
+ * @param {Tracer} t
306
+ * @returns {ReturnType<typeof tracePublicAuthoringTypes>}
307
+ */
308
+ function traceSurface(t) {
309
+ const surface = path.join(t.root, AUTHORING_SURFACE);
310
+ /** @type {{name: string, module: string}[]} */
311
+ const types = [];
312
+ /** @type {{name: string, reason: string}[]} */
313
+ const untraced = [];
314
+ /**
315
+ * @param {string} name
316
+ * @param {() => string | null} trace
317
+ * @param {boolean} typeOnly exported with `export type`
318
+ */
319
+ const add = (name, trace, typeOnly) => {
320
+ let module;
321
+ try {
322
+ module = trace();
323
+ } catch (error) {
324
+ untraced.push({
325
+ name,
326
+ reason: error instanceof Error ? error.message : String(error),
327
+ });
328
+ return;
329
+ }
330
+ if (module == null) {
331
+ untraced.push({
332
+ name,
333
+ reason: `${AUTHORING_SURFACE} exports it, but no module declares it`,
334
+ });
335
+ } else if (typeOnly || TYPE_MODULE_RE.test(module)) {
336
+ types.push({name, module: relative(t.root, module)});
337
+ }
338
+ };
339
+
340
+ for (const statement of statementsOf(t, surface)) {
341
+ const typeOnly = statement.exportKind === 'type';
342
+ if (statement.type === 'ExportNamedDeclaration') {
343
+ for (const name of declaredNames(statement.declaration)) {
344
+ add(name, () => surface, true);
345
+ }
346
+ for (const specifier of statement.specifiers ?? []) {
347
+ const name = nameOf(specifier.exported) ?? '(unnamed)';
348
+ add(
349
+ name,
350
+ () => declaringModule(t, surface, name),
351
+ typeOnly || specifier.exportKind === 'type',
352
+ );
353
+ }
354
+ } else if (statement.type === 'ExportAllDeclaration') {
355
+ const source = statement.source.value;
356
+ if (statement.exported != null) {
357
+ const name = nameOf(statement.exported) ?? '(unnamed)';
358
+ add(name, () => resolveModule(t, surface, source), typeOnly);
359
+ continue;
360
+ }
361
+ let names;
362
+ try {
363
+ const from = resolveModule(t, surface, source);
364
+ if (!TYPE_MODULE_RE.test(from)) {
365
+ throw new Error(
366
+ `${AUTHORING_SURFACE} re-exports everything "${source}" exports, and what a JavaScript module exports cannot be listed`,
367
+ );
368
+ }
369
+ names = exportedNames(t, from);
370
+ } catch (error) {
371
+ untraced.push({
372
+ name: `* from "${source}"`,
373
+ reason: error instanceof Error ? error.message : String(error),
374
+ });
375
+ continue;
376
+ }
377
+ for (const name of names) {
378
+ if (name === 'default') continue;
379
+ add(name, () => declaringModule(t, surface, name), typeOnly);
380
+ }
381
+ }
382
+ }
383
+ return {types, untraced};
384
+ }
385
+
386
+ /**
387
+ * Whether an authored type module in `folder` (relative to the root) declares
388
+ * `name`. Declaration files are skipped: beside a self-doc they are generated
389
+ * from the JavaScript next to them, declare no authored type, and use syntax
390
+ * the parser reads only in declaration mode.
391
+ * @param {Tracer} t
392
+ * @param {string} folder
393
+ * @param {string} name
394
+ * @returns {boolean}
395
+ */
396
+ function declaredIn(t, folder, name) {
397
+ const dir = path.join(t.root, folder);
398
+ let entries;
399
+ try {
400
+ entries = fs.readdirSync(dir, {withFileTypes: true});
401
+ } catch {
402
+ return false;
403
+ }
404
+ return entries.some(
405
+ entry =>
406
+ entry.isFile() &&
407
+ TYPE_MODULE_RE.test(entry.name) &&
408
+ !/\.d\.[cm]?ts$|\.test\.[cm]?tsx?$/u.test(entry.name) &&
409
+ statementsOf(t, path.join(dir, entry.name)).some(statement =>
410
+ declaredNames(
411
+ statement.type === 'ExportNamedDeclaration'
412
+ ? statement.declaration
413
+ : statement,
414
+ ).includes(name),
415
+ ),
416
+ );
417
+ }
418
+
419
+ /**
420
+ * What stands between each type `@astryxdesign/cli/authoring` exports and a
421
+ * reader of `astryx docs authoring`. A type is readable when a self-doc beside
422
+ * the module that declares it is listed in AUTHORING_SELF_DOCS, loads, and
423
+ * renders a section the topic's index lists. A registered self-doc must
424
+ * document something public: a public type declared beside it, and, when its
425
+ * title is the name of a type declared beside it, that type.
426
+ * @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
427
+ * `topicKeys` are the keys `astryx docs authoring --index` lists; null skips
428
+ * that comparison.
429
+ * @returns {Promise<{
430
+ * types: number,
431
+ * unreadable: {module: string, names: string[], reason: UnreadableReason, source?: string, key?: string}[],
432
+ * untraced: {name: string, reason: string}[],
433
+ * unmatched: {source: string, key?: string, subject?: string}[],
434
+ * }>}
435
+ */
436
+ export async function auditAuthoringSurface({
437
+ root = AUTHORING_ROOT,
438
+ sources = AUTHORING_SELF_DOCS,
439
+ topicKeys = null,
440
+ } = {}) {
441
+ /** @type {Tracer} */
442
+ const t = {root, parsed: new Map()};
443
+ const {types, untraced} = traceSurface(t);
444
+
445
+ /** @type {Map<string, string[]>} folder -> self-docs on disk in it */
446
+ const beside = new Map();
447
+ for (const source of discoverAuthoringSelfDocSources(root)) {
448
+ const folder = folderOf(source);
449
+ beside.set(folder, [...(beside.get(folder) ?? []), source]);
450
+ }
451
+ const registered = new Set(sources);
452
+ const {loaded, failed} = await loadAuthoringSelfDocs(sources, root);
453
+ const failedSources = new Set(failed.map(entry => entry.source));
454
+ const sections = buildAuthoringReferenceDoc(
455
+ loaded.map(entry => entry.doc),
456
+ ).sections;
457
+ /** @type {Map<string, string>} */
458
+ const keyOf = new Map(
459
+ loaded.map((entry, i) => [entry.source, sectionKey(sections[i])]),
460
+ );
461
+
462
+ /**
463
+ * @param {string} source
464
+ * @returns {UnreadableReason | null}
465
+ */
466
+ const blocked = source => {
467
+ if (!registered.has(source)) return 'unregistered';
468
+ if (failedSources.has(source) || !keyOf.has(source)) return 'failed';
469
+ const key = /** @type {string} */ (keyOf.get(source));
470
+ return topicKeys != null && !topicKeys.has(key) ? 'missing-section' : null;
471
+ };
472
+
473
+ /** @type {Map<string, string[]>} declaring module -> its public types */
474
+ const byModule = new Map();
475
+ for (const {name, module} of types) {
476
+ byModule.set(module, [...(byModule.get(module) ?? []), name]);
477
+ }
478
+ /** @type {{module: string, names: string[], reason: UnreadableReason, source?: string, key?: string}[]} */
479
+ const unreadable = [];
480
+ for (const [module, names] of byModule) {
481
+ const docs = beside.get(folderOf(module)) ?? [];
482
+ if (docs.length === 0) {
483
+ unreadable.push({module, names, reason: 'no-self-doc'});
484
+ continue;
485
+ }
486
+ const reasons = docs.map(blocked);
487
+ if (reasons.includes(null)) continue;
488
+ const source = docs[0];
489
+ const key = keyOf.get(source);
490
+ unreadable.push({
491
+ module,
492
+ names,
493
+ reason: /** @type {UnreadableReason} */ (reasons[0]),
494
+ source,
495
+ ...(key != null ? {key} : {}),
496
+ });
497
+ }
498
+
499
+ const publicFolders = new Set(types.map(({module}) => folderOf(module)));
500
+ const publicNames = new Set(types.map(({name}) => name));
501
+ /** @type {Map<string, any>} */
502
+ const docOf = new Map(loaded.map(entry => [entry.source, entry.doc]));
503
+ /** @type {{source: string, key?: string, subject?: string}[]} */
504
+ const unmatched = [];
505
+ for (const source of sources) {
506
+ const key = keyOf.get(source);
507
+ const keyed = key != null ? {key} : {};
508
+ const folder = folderOf(source);
509
+ if (!publicFolders.has(folder)) {
510
+ unmatched.push({source, ...keyed});
511
+ continue;
512
+ }
513
+ const subject = docOf.get(source)?.displayName;
514
+ if (
515
+ typeof subject === 'string' &&
516
+ IDENTIFIER_RE.test(subject) &&
517
+ !publicNames.has(subject) &&
518
+ declaredIn(t, folder, subject)
519
+ ) {
520
+ unmatched.push({source, ...keyed, subject});
521
+ }
522
+ }
523
+
524
+ return {types: types.length, unreadable, untraced, unmatched};
525
+ }