@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3

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 (670) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +121 -85
  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 +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 +36 -13
  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 +272 -41
  54. package/api/docs/_adapter.mjs +985 -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/docs.d.mts +10 -3
  61. package/api/docs/docs.doc.mjs +55 -16
  62. package/api/docs/docs.mjs +53 -10
  63. package/api/docs/docs.test.mjs +166 -4
  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/integration-tree.test.mjs +555 -0
  70. package/api/docs/integrationDocs.test.mjs +114 -8
  71. package/api/docs/list/list.mjs +28 -12
  72. package/api/docs/node/node.d.mts +43 -0
  73. package/api/docs/node/node.mjs +192 -0
  74. package/api/docs/reference-blocks.test.mjs +406 -0
  75. package/api/doctor/doctor.d.mts +104 -1
  76. package/api/doctor/doctor.doc.mjs +1 -0
  77. package/api/doctor/doctor.mjs +635 -7
  78. package/api/doctor/doctor.test.mjs +732 -11
  79. package/api/gap-report/gap-report.doc.mjs +8 -4
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +1 -0
  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 -3
  87. package/api/index.mjs +5 -4
  88. package/api/init/init.doc.mjs +6 -1
  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 +34 -64
  99. package/api/integration/add-theme.test.mjs +105 -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 +2 -1
  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 +105 -0
  119. package/api/integration/pack-check.mjs +111 -10
  120. package/api/integration/pack-check.test.mjs +387 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +14 -1
  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 +1 -0
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -1
  133. package/api/json/isError.doc.mjs +1 -0
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/search/search-return-type.test.mjs +54 -0
  136. package/api/search/search.d.mts +62 -11
  137. package/api/search/search.doc.mjs +8 -2
  138. package/api/search/search.mjs +471 -83
  139. package/api/search/search.test.mjs +142 -1
  140. package/api/search/search.type.d.mts +15 -3
  141. package/api/search/search.type.mjs +5 -2
  142. package/api/swizzle/copy/copy.mjs +28 -11
  143. package/api/swizzle/swizzle.doc.mjs +2 -1
  144. package/api/swizzle/swizzle.type.d.mts +2 -2
  145. package/api/swizzle/swizzle.type.mjs +2 -2
  146. package/api/template/copy/copy.mjs +17 -23
  147. package/api/template/copy/copy.test.mjs +17 -0
  148. package/api/template/list/list.mjs +1 -0
  149. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  150. package/api/template/template-integration.test.mjs +1008 -3
  151. package/api/template/template-suffix.test.mjs +41 -21
  152. package/api/template/template.d.mts +1 -1
  153. package/api/template/template.doc.mjs +30 -8
  154. package/api/template/template.mjs +46 -9
  155. package/api/template/template.type.d.mts +12 -14
  156. package/api/template/template.type.mjs +15 -14
  157. package/api/theme/_adapter.d.mts +2 -3
  158. package/api/theme/_adapter.mjs +4 -5
  159. package/api/theme/add/add.binary.test.mjs +84 -0
  160. package/api/theme/add/add.mjs +31 -22
  161. package/api/theme/add/add.rollback.test.mjs +158 -0
  162. package/api/theme/add/add.staging.test.mjs +83 -0
  163. package/api/theme/add/add.test.mjs +14 -1
  164. package/api/theme/build/build.family.test.mjs +7 -12
  165. package/api/theme/build/build.mjs +140 -59
  166. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  167. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  168. package/api/theme/build/build.rollback.test.mjs +148 -0
  169. package/api/theme/build/build.test.mjs +127 -0
  170. package/api/theme/build/font-warning.mjs +3 -3
  171. package/api/theme/build/font-warning.test.mjs +5 -2
  172. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  173. package/api/theme/integration-themes.test.mjs +39 -28
  174. package/api/theme/list/list.test.mjs +19 -20
  175. package/api/theme/listThemes.doc.mjs +6 -5
  176. package/api/theme/palette/generate/generate.mjs +8 -3
  177. package/api/theme/palette/generate/generate.test.mjs +96 -0
  178. package/api/theme/palette/generate/generator.d.mts +10 -13
  179. package/api/theme/palette/generate/generator.mjs +15 -4
  180. package/api/theme/palette/generate/generator.test.mjs +10 -0
  181. package/api/theme/template/template.mjs +11 -2
  182. package/api/theme/template/template.test.mjs +20 -0
  183. package/api/theme/theme.type.d.mts +170 -11
  184. package/api/theme/theme.type.mjs +94 -27
  185. package/api/theme/themeAdd.doc.mjs +4 -3
  186. package/api/theme/themeBuild.doc.mjs +8 -4
  187. package/api/theme/themeList.doc.mjs +6 -3
  188. package/api/theme/themeListAvailable.doc.mjs +5 -3
  189. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  190. package/api/theme/themeTargets.doc.mjs +1 -0
  191. package/api/theme/themeTemplate.doc.mjs +6 -2
  192. package/api/upgrade/_adapter.d.mts +32 -5
  193. package/api/upgrade/_adapter.mjs +139 -22
  194. package/api/upgrade/list/list.mjs +2 -1
  195. package/api/upgrade/list/list.test.mjs +73 -0
  196. package/api/upgrade/project-context.test.mjs +272 -0
  197. package/api/upgrade/provider-agreement.test.mjs +152 -0
  198. package/api/upgrade/run/files-changed.test.mjs +111 -0
  199. package/api/upgrade/run/run.mjs +359 -60
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +12 -5
  202. package/api/upgrade/upgrade.type.d.mts +43 -5
  203. package/api/upgrade/upgrade.type.mjs +29 -13
  204. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  205. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  206. package/assets/codemods/file-count.test.mjs +163 -0
  207. package/assets/codemods/integration-discovery.mjs +48 -4
  208. package/assets/codemods/integration-discovery.test.mjs +73 -0
  209. package/assets/codemods/integration-runner.mjs +59 -7
  210. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  211. package/assets/codemods/registry.mjs +1 -0
  212. package/assets/codemods/run-codemod.mjs +177 -34
  213. package/assets/codemods/runner.mjs +353 -104
  214. package/assets/codemods/term-log.mjs +32 -8
  215. package/assets/codemods/term-log.test.mjs +19 -1
  216. package/assets/codemods/transform-prop.mjs +109 -0
  217. package/assets/codemods/transform-prop.test.mjs +95 -0
  218. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  219. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  220. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  221. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  222. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  223. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  224. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  225. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  226. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  227. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  228. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  229. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  230. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  231. package/assets/docs/README.md +9 -0
  232. package/assets/docs/authoring.doc.mjs +14 -0
  233. package/assets/docs/getting-started.doc.mjs +2 -2
  234. package/assets/docs/internationalization.doc.mjs +7 -5
  235. package/assets/docs/layout.doc.dense.mjs +2 -2
  236. package/assets/docs/layout.doc.mjs +1 -1
  237. package/assets/docs/principles.doc.mjs +6 -6
  238. package/assets/docs/styling-libraries.doc.mjs +4 -4
  239. package/assets/docs/styling.doc.mjs +4 -4
  240. package/assets/docs/theme.doc.mjs +5 -5
  241. package/assets/docs/tokens.doc.mjs +1 -1
  242. package/assets/docs/tree/api.doc.mjs +30 -0
  243. package/assets/docs/tree/cli.doc.mjs +23 -0
  244. package/assets/docs/tree/commands.doc.mjs +25 -0
  245. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  246. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  247. package/assets/docs/tree/integrations.test.mjs +62 -0
  248. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  249. package/assets/docs/working-with-ai.doc.mjs +4 -4
  250. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  251. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  252. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  253. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  254. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  255. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  268. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  270. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  271. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  272. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  273. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  274. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  275. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  277. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  278. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  279. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  280. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  281. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  282. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  283. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  284. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  285. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  286. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  287. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  292. package/authoring/_shared/contract.ts +22 -0
  293. package/authoring/codemod/codemod.doc.mjs +7 -2
  294. package/authoring/codemod/parse.d.mts +8 -8
  295. package/authoring/codemod/parse.mjs +8 -6
  296. package/authoring/codemod/type.ts +12 -0
  297. package/authoring/config/config.doc.mjs +11 -3
  298. package/authoring/config/debug-composition.test.mjs +92 -0
  299. package/authoring/config/parse.d.mts +15 -13
  300. package/authoring/config/parse.mjs +27 -8
  301. package/authoring/config/parse.test.mjs +8 -0
  302. package/authoring/config/type.ts +31 -8
  303. package/authoring/debug/debug.doc.d.mts +11 -0
  304. package/authoring/debug/debug.doc.mjs +182 -0
  305. package/authoring/debug/parse.d.mts +8 -8
  306. package/authoring/debug/parse.mjs +3 -3
  307. package/authoring/discover/discover.doc.d.mts +13 -0
  308. package/authoring/discover/discover.doc.mjs +138 -0
  309. package/authoring/discover/parse.d.mts +24 -0
  310. package/authoring/discover/parse.mjs +128 -0
  311. package/authoring/discover/parse.test.mjs +124 -0
  312. package/authoring/discover/type.ts +87 -0
  313. package/authoring/doctypes/_schema.d.mts +790 -23
  314. package/authoring/doctypes/_schema.mjs +543 -39
  315. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  316. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  317. package/authoring/doctypes/base/type.ts +41 -0
  318. package/authoring/doctypes/command/command.doc.mjs +5 -4
  319. package/authoring/doctypes/command/parse.d.mts +2 -2
  320. package/authoring/doctypes/command/parse.mjs +1 -1
  321. package/authoring/doctypes/command/type.ts +6 -5
  322. package/authoring/doctypes/component/component.doc.mjs +6 -3
  323. package/authoring/doctypes/component/parse.d.mts +2 -2
  324. package/authoring/doctypes/component/parse.mjs +1 -1
  325. package/authoring/doctypes/component/type.ts +6 -5
  326. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  327. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  328. package/authoring/doctypes/enum/parse.d.mts +2 -2
  329. package/authoring/doctypes/enum/parse.mjs +1 -1
  330. package/authoring/doctypes/enum/type.ts +4 -2
  331. package/authoring/doctypes/function/function.doc.mjs +7 -2
  332. package/authoring/doctypes/function/parse.d.mts +2 -2
  333. package/authoring/doctypes/function/parse.mjs +1 -1
  334. package/authoring/doctypes/function/type.ts +9 -4
  335. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  336. package/authoring/doctypes/hook/parse.d.mts +2 -2
  337. package/authoring/doctypes/hook/parse.mjs +1 -1
  338. package/authoring/doctypes/hook/type.ts +5 -4
  339. package/authoring/doctypes/legacy.d.mts +8 -6
  340. package/authoring/doctypes/legacy.mjs +5 -4
  341. package/authoring/doctypes/load-contract.test.mjs +233 -0
  342. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  343. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  344. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  345. package/authoring/doctypes/namespace/parse.mjs +25 -0
  346. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  347. package/authoring/doctypes/namespace/type.ts +74 -0
  348. package/authoring/doctypes/parse.d.mts +22 -18
  349. package/authoring/doctypes/parse.mjs +22 -11
  350. package/authoring/doctypes/parse.test.mjs +77 -3
  351. package/authoring/doctypes/reference/parse.d.mts +2 -2
  352. package/authoring/doctypes/reference/parse.mjs +8 -5
  353. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  354. package/authoring/doctypes/reference/type.ts +70 -7
  355. package/authoring/doctypes/schema/parse.d.mts +2 -2
  356. package/authoring/doctypes/schema/parse.mjs +1 -1
  357. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  358. package/authoring/doctypes/schema/type.ts +4 -4
  359. package/authoring/doctypes/template/parse.d.mts +94 -1
  360. package/authoring/doctypes/template/parse.mjs +40 -2
  361. package/authoring/doctypes/template/parse.test.mjs +26 -2
  362. package/authoring/doctypes/template/template.doc.mjs +13 -3
  363. package/authoring/doctypes/template/type.ts +13 -2
  364. package/authoring/doctypes/theme/parse.d.mts +35 -0
  365. package/authoring/doctypes/theme/parse.mjs +76 -0
  366. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  367. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  368. package/authoring/doctypes/theme/type.ts +42 -0
  369. package/authoring/doctypes/types.ts +12 -10
  370. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  371. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  372. package/authoring/gap-report/parse.d.mts +10 -10
  373. package/authoring/gap-report/parse.mjs +6 -6
  374. package/authoring/gap-report/type.ts +1 -1
  375. package/authoring/identity/identity.doc.d.mts +9 -0
  376. package/authoring/identity/identity.doc.mjs +61 -0
  377. package/authoring/identity/type.ts +132 -0
  378. package/authoring/index.d.mts +3 -0
  379. package/authoring/index.d.ts +62 -17
  380. package/authoring/index.mjs +4 -1
  381. package/authoring/integration/integration.doc.mjs +15 -8
  382. package/authoring/integration/parse.d.mts +2 -2
  383. package/authoring/integration/parse.mjs +1 -1
  384. package/authoring/integration/parse.test.mjs +10 -1
  385. package/authoring/integration/schema.d.mts +6 -4
  386. package/authoring/integration/schema.mjs +9 -3
  387. package/authoring/integration/type.ts +19 -8
  388. package/authoring/shadcn/receipt.d.mts +6 -6
  389. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  390. package/clients/cli/command-load-failure.test.mjs +83 -0
  391. package/clients/cli/command-result-coverage.test.mjs +7 -7
  392. package/clients/cli/commands/blog.doc.mjs +1 -1
  393. package/clients/cli/commands/blog.mjs +23 -8
  394. package/clients/cli/commands/blog.test.mjs +42 -1
  395. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  396. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  397. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  398. package/clients/cli/commands/build-theme.mjs +16 -50
  399. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  400. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  401. package/clients/cli/commands/build.doc.mjs +16 -8
  402. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  403. package/clients/cli/commands/build.mjs +137 -114
  404. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  405. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  406. package/clients/cli/commands/component/index.mjs +153 -61
  407. package/clients/cli/commands/component-batch.test.mjs +341 -0
  408. package/clients/cli/commands/component-ownership.test.mjs +92 -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 +24 -7
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  414. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  415. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  416. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  417. package/clients/cli/commands/discover.doc.mjs +55 -9
  418. package/clients/cli/commands/discover.mjs +393 -118
  419. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  420. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  421. package/clients/cli/commands/docs.doc.mjs +28 -6
  422. package/clients/cli/commands/docs.mjs +240 -26
  423. package/clients/cli/commands/docs.test.mjs +222 -1
  424. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  425. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  426. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  427. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  429. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  430. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  431. package/clients/cli/commands/doctor.doc.mjs +1 -1
  432. package/clients/cli/commands/doctor.mjs +59 -32
  433. package/clients/cli/commands/doctor.test.mjs +42 -0
  434. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  435. package/clients/cli/commands/gap-report.test.mjs +72 -0
  436. package/clients/cli/commands/hook/index.mjs +7 -17
  437. package/clients/cli/commands/hook.doc.mjs +1 -1
  438. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  439. package/clients/cli/commands/init.doc.mjs +20 -9
  440. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  441. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  442. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  443. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  444. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  445. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  446. package/clients/cli/commands/integration.doc.mjs +1 -1
  447. package/clients/cli/commands/integration.mjs +1 -0
  448. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  449. package/clients/cli/commands/json-contract.test.mjs +33 -0
  450. package/clients/cli/commands/manifest.doc.mjs +1 -1
  451. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  452. package/clients/cli/commands/search.doc.mjs +7 -4
  453. package/clients/cli/commands/search.mjs +28 -9
  454. package/clients/cli/commands/search.test.mjs +75 -0
  455. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  456. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  457. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  458. package/clients/cli/commands/template.doc.mjs +52 -13
  459. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  460. package/clients/cli/commands/template.mjs +4 -91
  461. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  462. package/clients/cli/commands/text-json-parity.test.mjs +702 -0
  463. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  464. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  465. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  466. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  467. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  468. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  469. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  470. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  471. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  472. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  473. package/clients/cli/commands/theme.doc.mjs +1 -1
  474. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  475. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  476. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  477. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  478. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  479. package/clients/cli/commands/upgrade.mjs +29 -7
  480. package/clients/cli/formatters/index.mjs +164 -1
  481. package/clients/cli/formatters/index.test.mjs +97 -0
  482. package/clients/cli/index.mjs +21 -34
  483. package/clients/cli/latest-version-env.test.mjs +50 -0
  484. package/clients/cli/lib/cli-error.test.mjs +7 -0
  485. package/clients/cli/lib/component-format.mjs +9 -9
  486. package/clients/cli/lib/component-format.test.mjs +1 -1
  487. package/clients/cli/lib/define-command.mjs +32 -6
  488. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  489. package/clients/cli/lib/exit-codes.test.mjs +90 -0
  490. package/clients/cli/lib/hook-format.mjs +19 -10
  491. package/clients/cli/lib/json-shim.mjs +62 -16
  492. package/clients/cli/lib/json-shim.test.mjs +69 -0
  493. package/clients/cli/lib/manifest.d.ts +2 -0
  494. package/clients/cli/lib/manifest.mjs +39 -10
  495. package/clients/cli/lib/manifest.test.mjs +22 -2
  496. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  497. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  498. package/foundation/agent-docs/agent-docs.mjs +82 -12
  499. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  500. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  501. package/foundation/config/integration-debug.test.mjs +28 -3
  502. package/foundation/config/project-themes.test.mjs +11 -19
  503. package/foundation/config/project.d.mts +20 -11
  504. package/foundation/config/project.mjs +263 -91
  505. package/foundation/config/project.test.mjs +270 -21
  506. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  507. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  508. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  509. package/foundation/discovery/authoring-surface.d.mts +74 -0
  510. package/foundation/discovery/authoring-surface.mjs +525 -0
  511. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  512. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  513. package/foundation/discovery/cli-self-docs.mjs +490 -0
  514. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  515. package/foundation/discovery/component-discovery.d.mts +39 -1
  516. package/foundation/discovery/component-discovery.mjs +50 -1
  517. package/foundation/discovery/component-loader.d.mts +35 -38
  518. package/foundation/discovery/component-loader.mjs +53 -222
  519. package/foundation/discovery/docs-discovery.d.mts +119 -11
  520. package/foundation/discovery/docs-discovery.mjs +423 -108
  521. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  522. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  523. package/foundation/discovery/docs-output-budget.mjs +50 -0
  524. package/foundation/discovery/docs-section-key.d.mts +116 -0
  525. package/foundation/discovery/docs-section-key.mjs +322 -0
  526. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  527. package/foundation/discovery/template-adapter.d.mts +113 -11
  528. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  529. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  530. package/foundation/discovery/template-adapter.mjs +775 -84
  531. package/foundation/discovery/template-adapter.test.mjs +57 -0
  532. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  533. package/foundation/discovery/template-conflict-release.mjs +40 -0
  534. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  535. package/foundation/discovery/theme-discovery.d.mts +67 -7
  536. package/foundation/discovery/theme-discovery.mjs +916 -186
  537. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  538. package/foundation/discovery/theming-targets.test.mjs +4 -0
  539. package/foundation/doc-compiler/bundle.d.mts +47 -0
  540. package/foundation/doc-compiler/bundle.mjs +278 -0
  541. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  542. package/foundation/doc-compiler/compile.d.mts +343 -0
  543. package/foundation/doc-compiler/compile.mjs +558 -0
  544. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  545. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  546. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  547. package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
  548. package/foundation/doc-compiler/import.d.mts +24 -0
  549. package/foundation/doc-compiler/import.mjs +59 -0
  550. package/foundation/doc-compiler/inputs.d.mts +102 -0
  551. package/foundation/doc-compiler/inputs.mjs +291 -0
  552. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  553. package/foundation/doc-compiler/ir.d.mts +22 -0
  554. package/foundation/doc-compiler/ir.mjs +471 -0
  555. package/foundation/doc-compiler/lenses.d.mts +36 -0
  556. package/foundation/doc-compiler/lenses.mjs +173 -0
  557. package/foundation/doc-compiler/links.d.mts +162 -0
  558. package/foundation/doc-compiler/links.mjs +294 -0
  559. package/foundation/doc-compiler/links.test.mjs +192 -0
  560. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  561. package/foundation/doc-compiler/overlays.d.mts +37 -0
  562. package/foundation/doc-compiler/overlays.mjs +206 -0
  563. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  564. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  565. package/foundation/doc-compiler/read.d.mts +127 -0
  566. package/foundation/doc-compiler/read.mjs +325 -0
  567. package/foundation/doc-compiler/read.test.mjs +313 -0
  568. package/foundation/doc-compiler/source.d.mts +33 -0
  569. package/foundation/doc-compiler/source.mjs +128 -0
  570. package/foundation/doc-compiler/tree.d.mts +288 -0
  571. package/foundation/doc-compiler/tree.mjs +876 -0
  572. package/foundation/doc-compiler/tree.test.mjs +606 -0
  573. package/foundation/fs/file-protection.d.mts +33 -0
  574. package/foundation/fs/file-protection.mjs +825 -0
  575. package/foundation/fs/file-protection.test.mjs +250 -0
  576. package/foundation/fs/module-loader.d.mts +1 -0
  577. package/foundation/fs/module-loader.mjs +50 -1
  578. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  579. package/foundation/fs/path-safety.d.mts +3 -2
  580. package/foundation/fs/path-safety.mjs +49 -19
  581. package/foundation/fs/path-safety.test.mjs +50 -0
  582. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  583. package/foundation/identity/provider-identity.d.mts +90 -0
  584. package/foundation/identity/provider-identity.mjs +320 -0
  585. package/foundation/identity/provider-identity.test.mjs +254 -0
  586. package/foundation/identity/providers.d.mts +7 -0
  587. package/foundation/identity/providers.mjs +16 -0
  588. package/foundation/integrations/autolink.d.mts +58 -1
  589. package/foundation/integrations/autolink.mjs +143 -45
  590. package/foundation/integrations/autolink.test.mjs +1 -1
  591. package/foundation/integrations/cli-requirement.d.mts +45 -0
  592. package/foundation/integrations/cli-requirement.mjs +154 -0
  593. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  594. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  595. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  596. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  597. package/foundation/integrations/contribution-inventory.mjs +27 -24
  598. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  599. package/foundation/integrations/integration-warnings.d.mts +9 -2
  600. package/foundation/integrations/integration-warnings.mjs +52 -21
  601. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  602. package/foundation/integrations/integrations.d.mts +63 -3
  603. package/foundation/integrations/integrations.mjs +122 -9
  604. package/foundation/integrations/integrations.test.mjs +415 -1
  605. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  606. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  607. package/foundation/integrations/provider-resolution.d.mts +152 -0
  608. package/foundation/integrations/provider-resolution.mjs +576 -0
  609. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  610. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  611. package/foundation/integrations/theme-descriptor.mjs +44 -0
  612. package/foundation/integrations/validate-contributions.d.mts +2 -0
  613. package/foundation/integrations/validate-contributions.mjs +131 -29
  614. package/foundation/response/base.d.ts +8 -4
  615. package/foundation/response/batch.type.d.mts +33 -0
  616. package/foundation/response/batch.type.mjs +34 -0
  617. package/foundation/response/error-codes.d.mts +3 -1
  618. package/foundation/response/error-codes.d.ts +2 -0
  619. package/foundation/response/error-codes.doc.mjs +13 -4
  620. package/foundation/response/error-codes.mjs +8 -2
  621. package/foundation/response/error-codes.test.mjs +137 -10
  622. package/foundation/response/json-contract.test.mjs +57 -17
  623. package/foundation/response/json.d.mts +4 -2
  624. package/foundation/response/json.mjs +8 -10
  625. package/foundation/response/response-types.doc.d.mts +5 -1
  626. package/foundation/response/response-types.doc.mjs +46 -38
  627. package/foundation/response/response-types.doc.test.mjs +181 -0
  628. package/foundation/response/response.doc.mjs +1 -1
  629. package/foundation/text/string-utils.d.mts +8 -0
  630. package/foundation/text/string-utils.mjs +40 -10
  631. package/foundation/xle/browser.d.mts +3 -3
  632. package/foundation/xle/browser.mjs +3 -3
  633. package/foundation/xle/expand.d.mts +2 -0
  634. package/foundation/xle/expand.mjs +6 -5
  635. package/foundation/xle/expand.test.mjs +54 -0
  636. package/foundation/xle/parse.mjs +1 -1
  637. package/foundation/xle/print.mjs +2 -2
  638. package/foundation/xle/splice.mjs +1 -1
  639. package/foundation/xle/xle.test.mjs +13 -0
  640. package/package.json +10 -11
  641. package/api/layout/_adapter.d.mts +0 -34
  642. package/api/layout/_adapter.mjs +0 -133
  643. package/api/layout/check/check.d.mts +0 -16
  644. package/api/layout/check/check.mjs +0 -40
  645. package/api/layout/expand/expand.d.mts +0 -22
  646. package/api/layout/expand/expand.mjs +0 -153
  647. package/api/layout/grammar/grammar.d.mts +0 -13
  648. package/api/layout/grammar/grammar.mjs +0 -86
  649. package/api/layout/layout.d.mts +0 -6
  650. package/api/layout/layout.mjs +0 -17
  651. package/api/layout/layout.test.mjs +0 -297
  652. package/api/layout/layout.type.d.mts +0 -89
  653. package/api/layout/layout.type.mjs +0 -103
  654. package/api/layout/layoutCheck.doc.d.mts +0 -11
  655. package/api/layout/layoutCheck.doc.mjs +0 -84
  656. package/api/layout/layoutExpand.doc.d.mts +0 -11
  657. package/api/layout/layoutExpand.doc.mjs +0 -106
  658. package/api/layout/layoutGrammar.doc.d.mts +0 -11
  659. package/api/layout/layoutGrammar.doc.mjs +0 -56
  660. package/assets/templates/themes/manifest.json +0 -95
  661. package/clients/cli/commands/layout-check.doc.mjs +0 -54
  662. package/clients/cli/commands/layout-expand.doc.mjs +0 -66
  663. package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
  664. package/clients/cli/commands/layout.doc.mjs +0 -34
  665. package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
  666. package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
  667. package/clients/cli/commands/layout.mjs +0 -263
  668. package/clients/cli/lib/update-check.mjs +0 -83
  669. package/clients/cli/lib/update-check.test.mjs +0 -137
  670. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -6,6 +6,7 @@ import * as path from 'node:path';
6
6
  import {Project, DEFAULT_ISSUES_URL, findConfigPath} from './project.mjs';
7
7
  import {InMemoryConfigCache} from './config-cache.mjs';
8
8
  import * as componentDiscovery from '../discovery/component-discovery.mjs';
9
+ import {discoverCoreTemplates} from '../discovery/template-adapter.mjs';
9
10
 
10
11
  let tmpDir;
11
12
  let originalCwd;
@@ -21,6 +22,9 @@ function scaffold({
21
22
  issuesUrl,
22
23
  withComponents = true,
23
24
  withTemplates = true,
25
+ templateId = 'hero',
26
+ templateType = 'block',
27
+ templateReplaces = null,
24
28
  withCodemods = true,
25
29
  brokenComponent = false,
26
30
  brokenCodemod = false,
@@ -65,7 +69,7 @@ function scaffold({
65
69
  fs.mkdirSync(compDir, {recursive: true});
66
70
  fs.writeFileSync(
67
71
  path.join(compDir, 'Widget.doc.mjs'),
68
- `export const docs = { name: 'Widget', usage: {description: 'A widget'} };\n`,
72
+ `export const docs = { name: 'Widget', usage: {description: 'A widget'}, props: [] };\n`,
69
73
  );
70
74
  if (!brokenComponent) {
71
75
  fs.writeFileSync(
@@ -80,12 +84,12 @@ function scaffold({
80
84
  const tDir = path.join(pkgDir, 'templates');
81
85
  fs.mkdirSync(tDir, {recursive: true});
82
86
  fs.writeFileSync(
83
- path.join(tDir, 'hero.doc.mjs'),
84
- `export default { type: 'block', name: 'Hero', description: 'A hero' };\n`,
87
+ path.join(tDir, `${templateId}.doc.mjs`),
88
+ `export default { type: '${templateType}', name: 'Fixture template', description: 'A fixture template'${templateReplaces == null ? '' : `, replaces: ${JSON.stringify(templateReplaces)}`} };\n`,
85
89
  );
86
90
  fs.writeFileSync(
87
- path.join(tDir, 'hero.tsx'),
88
- `export default function Hero() { return null; }\n`,
91
+ path.join(tDir, `${templateId}.tsx`),
92
+ `export default function FixtureTemplate() { return null; }\n`,
89
93
  );
90
94
  }
91
95
 
@@ -163,7 +167,7 @@ function scaffoldLocalPackage({name = '@acme/local'} = {}) {
163
167
 
164
168
  fs.mkdirSync(path.join(tmpDir, 'templates'));
165
169
  fs.writeFileSync(
166
- path.join(tmpDir, 'templates', 'local-page.template.mjs'),
170
+ path.join(tmpDir, 'templates', 'local-page.doc.mjs'),
167
171
  `export default {type: 'page', name: 'Local page', description: 'Local page.'};\n`,
168
172
  );
169
173
  fs.writeFileSync(
@@ -181,21 +185,8 @@ function scaffoldLocalPackage({name = '@acme/local'} = {}) {
181
185
 
182
186
  fs.mkdirSync(path.join(tmpDir, 'themes', 'ocean'), {recursive: true});
183
187
  fs.writeFileSync(
184
- path.join(tmpDir, 'themes', 'manifest.json'),
185
- JSON.stringify({
186
- version: 1,
187
- themes: [
188
- {
189
- slug: 'ocean',
190
- displayName: 'Ocean',
191
- description: 'Ocean theme.',
192
- maintained: true,
193
- entry: 'oceanTheme.ts',
194
- exportName: 'oceanTheme',
195
- files: ['oceanTheme.ts'],
196
- },
197
- ],
198
- }),
188
+ path.join(tmpDir, 'themes', 'ocean', 'oceanTheme.doc.mjs'),
189
+ `/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */\nexport default {type: 'theme', name: 'ocean', displayName: 'Ocean', description: 'Ocean theme.', maintained: true};\n`,
199
190
  );
200
191
  fs.writeFileSync(
201
192
  path.join(tmpDir, 'themes', 'ocean', 'oceanTheme.ts'),
@@ -337,6 +328,91 @@ describe('Project discovery', () => {
337
328
  expect(hero.type).toBe('block');
338
329
  });
339
330
 
331
+ it('templates() projects a valid integration replacement instead of its Core target', async () => {
332
+ const corePage = (await discoverCoreTemplates()).find(
333
+ template => template.type === 'page',
334
+ );
335
+ expect(corePage).toBeDefined();
336
+ scaffold({
337
+ templateId: 'acme-app-shell',
338
+ templateType: 'page',
339
+ templateReplaces: corePage.dirName,
340
+ });
341
+ const project = await Project.load(tmpDir);
342
+
343
+ const templates = await project.templates();
344
+
345
+ expect(
346
+ templates.find(template => template.dirName === 'acme-app-shell'),
347
+ ).toMatchObject({
348
+ package: '@acme/widgets',
349
+ replaces: corePage.dirName,
350
+ });
351
+ expect(
352
+ templates.find(
353
+ template =>
354
+ template.dirName === corePage.dirName &&
355
+ template.package !== '@acme/widgets',
356
+ ),
357
+ ).toBeUndefined();
358
+ expect(await project.issues()).toEqual([]);
359
+ });
360
+
361
+ it('reports replacement issues regardless of discovery call order without hiding other contributions', async () => {
362
+ scaffold({
363
+ templateReplaces: 'missing-core-template',
364
+ });
365
+
366
+ const componentsFirst = await Project.load(tmpDir);
367
+ expect(
368
+ (await componentsFirst.components()).some(
369
+ component => component.package === '@acme/widgets',
370
+ ),
371
+ ).toBe(true);
372
+ expect(await componentsFirst.issues()).toEqual(
373
+ expect.arrayContaining([
374
+ expect.objectContaining({
375
+ code: 'missing_template_replacement_target',
376
+ package: '@acme/widgets',
377
+ }),
378
+ ]),
379
+ );
380
+
381
+ const issuesFirst = await Project.load(tmpDir, {fresh: true});
382
+ expect(await issuesFirst.issues()).toEqual(
383
+ expect.arrayContaining([
384
+ expect.objectContaining({
385
+ code: 'missing_template_replacement_target',
386
+ package: '@acme/widgets',
387
+ }),
388
+ ]),
389
+ );
390
+ expect(
391
+ (await issuesFirst.components()).some(
392
+ component => component.package === '@acme/widgets',
393
+ ),
394
+ ).toBe(true);
395
+ const ownTemplate = (await issuesFirst.templates()).find(
396
+ template =>
397
+ template.package === '@acme/widgets' && template.dirName === 'hero',
398
+ );
399
+ expect(ownTemplate).toBeDefined();
400
+ expect(ownTemplate).not.toHaveProperty('replaces');
401
+
402
+ const sharedCache = new InMemoryConfigCache();
403
+ const warm = await Project.load(tmpDir, {cache: sharedCache});
404
+ await warm.templates();
405
+ const cached = await Project.load(tmpDir, {cache: sharedCache});
406
+ expect(await cached.issues()).toEqual(
407
+ expect.arrayContaining([
408
+ expect.objectContaining({
409
+ code: 'missing_template_replacement_target',
410
+ package: '@acme/widgets',
411
+ }),
412
+ ]),
413
+ );
414
+ });
415
+
340
416
  it('codemods() returns core registry groups + integration groups', async () => {
341
417
  scaffold();
342
418
  const project = await Project.load(tmpDir);
@@ -481,6 +557,53 @@ describe('Project issues (skip + warn)', () => {
481
557
  expect(issues.some(i => i.package === '@acme/widgets')).toBe(true);
482
558
  });
483
559
 
560
+ it('keeps valid contribution kinds and siblings when others are broken', async () => {
561
+ const pkgDir = scaffold({brokenComponent: true});
562
+ fs.writeFileSync(
563
+ path.join(pkgDir, 'templates', 'broken.template.mjs'),
564
+ `export default {type: 'block', name: 'Broken', description: 'Missing source'};\n`,
565
+ );
566
+ fs.writeFileSync(
567
+ path.join(pkgDir, 'components', 'ValidWidget.doc.mjs'),
568
+ `export default {type: 'component', name: 'ValidWidget', props: []};\n`,
569
+ );
570
+ fs.writeFileSync(
571
+ path.join(pkgDir, 'components', 'ValidWidget.tsx'),
572
+ `export function ValidWidget() { return null; }\n`,
573
+ );
574
+ const project = await Project.load(tmpDir);
575
+
576
+ const templates = await project.templates();
577
+ const components = await project.components();
578
+ const issues = await project.issues();
579
+
580
+ expect(
581
+ templates.find(
582
+ template =>
583
+ template.dirName === 'hero' && template.package === '@acme/widgets',
584
+ ),
585
+ ).toBeDefined();
586
+ expect(
587
+ components.find(
588
+ component =>
589
+ component.name === 'ValidWidget' &&
590
+ component.package === '@acme/widgets',
591
+ ),
592
+ ).toBeDefined();
593
+ expect(
594
+ components.find(
595
+ component =>
596
+ component.name === 'Widget' && component.package === '@acme/widgets',
597
+ ),
598
+ ).toBeUndefined();
599
+ expect(issues).toEqual(
600
+ expect.arrayContaining([
601
+ expect.objectContaining({code: 'invalid_component'}),
602
+ expect.objectContaining({code: 'invalid_template'}),
603
+ ]),
604
+ );
605
+ });
606
+
484
607
  it('does not throw when an integration codemod is broken', async () => {
485
608
  scaffold({brokenCodemod: true});
486
609
  const project = await Project.load(tmpDir);
@@ -515,6 +638,132 @@ describe('Project issues (skip + warn)', () => {
515
638
  });
516
639
  });
517
640
 
641
+ describe('Project loads each integration in isolation', () => {
642
+ /**
643
+ * Install a package under node_modules with the given root files.
644
+ * @param {string} name
645
+ * @param {string[]} manifests manifest basenames to write
646
+ */
647
+ function installPackage(name, manifests) {
648
+ const dir = path.join(tmpDir, 'node_modules', ...name.split('/'));
649
+ fs.mkdirSync(dir, {recursive: true});
650
+ fs.writeFileSync(
651
+ path.join(dir, 'package.json'),
652
+ JSON.stringify({name, version: '1.0.0'}),
653
+ );
654
+ for (const file of manifests) {
655
+ fs.writeFileSync(path.join(dir, file), 'export default {};\n');
656
+ }
657
+ }
658
+
659
+ /** @param {string[]} integrations */
660
+ function writeConfig(integrations) {
661
+ fs.writeFileSync(
662
+ path.join(tmpDir, 'astryx.config.mjs'),
663
+ `export default ${JSON.stringify({integrations})};\n`,
664
+ );
665
+ }
666
+
667
+ /** @param {Project} project */
668
+ async function widgetComponents(project) {
669
+ return (await project.components())
670
+ .filter(component => component.package === '@acme/widgets')
671
+ .map(component => component.name);
672
+ }
673
+
674
+ it.each([
675
+ ['is not installed', '@acme/broken', () => {}, /Install it first/],
676
+ [
677
+ 'has no root manifest',
678
+ '@acme/broken',
679
+ () => installPackage('@acme/broken', []),
680
+ /no conventional root manifest/,
681
+ ],
682
+ [
683
+ 'has two root manifests',
684
+ '@acme/broken',
685
+ () =>
686
+ installPackage('@acme/broken', [
687
+ 'astryx.integration.mjs',
688
+ 'astryx.integration.js',
689
+ ]),
690
+ /multiple root manifests/,
691
+ ],
692
+ [
693
+ 'is not a bare package name',
694
+ '../escape',
695
+ () => {},
696
+ /Invalid integration package name/,
697
+ ],
698
+ ])(
699
+ 'keeps the others when a configured package %s',
700
+ async (_label, spec, install, message) => {
701
+ scaffold();
702
+ install();
703
+ writeConfig([spec, '@acme/widgets']);
704
+
705
+ const project = await Project.load(tmpDir);
706
+
707
+ expect(await widgetComponents(project)).toEqual(['Widget']);
708
+ expect(await project.issues()).toContainEqual(
709
+ expect.objectContaining({
710
+ package: spec,
711
+ code: 'integration_error',
712
+ message: expect.stringMatching(message),
713
+ }),
714
+ );
715
+ },
716
+ );
717
+
718
+ it('keeps configured integrations when the package being authored has two root manifests', async () => {
719
+ scaffold();
720
+ fs.writeFileSync(
721
+ path.join(tmpDir, 'package.json'),
722
+ JSON.stringify({name: '@acme/local', version: '1.0.0'}),
723
+ );
724
+ fs.writeFileSync(
725
+ path.join(tmpDir, 'astryx.integration.mjs'),
726
+ 'export default {};\n',
727
+ );
728
+ fs.writeFileSync(
729
+ path.join(tmpDir, 'astryx.integration.js'),
730
+ 'export default {};\n',
731
+ );
732
+
733
+ const project = await Project.load(tmpDir);
734
+
735
+ expect(await widgetComponents(project)).toEqual(['Widget']);
736
+ expect(await project.issues()).toContainEqual(
737
+ expect.objectContaining({
738
+ package: '@acme/local',
739
+ code: 'integration_error',
740
+ message: expect.stringMatching(/multiple root manifests/),
741
+ }),
742
+ );
743
+ });
744
+
745
+ it('puts the package being authored at its configured position when the config names it', async () => {
746
+ scaffold();
747
+ scaffoldLocalPackage({name: '@acme/local'});
748
+ writeConfig(['@acme/local', '@acme/widgets']);
749
+
750
+ const project = await Project.load(tmpDir);
751
+
752
+ expect(
753
+ project.loadedIntegrations.map(integration => [
754
+ integration.name,
755
+ Boolean(integration.__local),
756
+ ]),
757
+ ).toEqual([
758
+ ['@acme/local', true],
759
+ ['@acme/widgets', false],
760
+ ]);
761
+ expect(await project.issues()).not.toContainEqual(
762
+ expect.objectContaining({package: '@acme/local', code: 'integration_error'}),
763
+ );
764
+ });
765
+ });
766
+
518
767
  describe('Project.issuesUrl routing', () => {
519
768
  it('routes core to config.issuesUrl, falling back to the default', async () => {
520
769
  scaffold({issuesUrl: 'https://example.com/core'});
@@ -0,0 +1,87 @@
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
+ * Every `*.doc.mjs` under `root`, relative and sorted.
6
+ * @param {string} [root]
7
+ * @returns {string[]}
8
+ */
9
+ export function discoverAuthoringSelfDocSources(root?: string): string[];
10
+ /**
11
+ * Import each self-doc. One that fails is reported, never thrown, so one bad
12
+ * file cannot take the rest of the topic down with it.
13
+ * @param {string[]} [sources]
14
+ * @param {string} [root]
15
+ * @returns {Promise<{loaded: {source: string, doc: any}[], failed: {source: string, error: string}[]}>}
16
+ */
17
+ export function loadAuthoringSelfDocs(sources?: string[], root?: string): Promise<{
18
+ loaded: {
19
+ source: string;
20
+ doc: any;
21
+ }[];
22
+ failed: {
23
+ source: string;
24
+ error: string;
25
+ }[];
26
+ }>;
27
+ /**
28
+ * A schema's fields as the table its section prints, each nested field on the
29
+ * row after its parent; null when there are none. A reference block that
30
+ * names some of a schema's fields includes this table of just those.
31
+ * @param {any[]} fields
32
+ * @returns {{type: 'table', headers: string[], rows: string[][]} | null}
33
+ */
34
+ export function schemaFieldTable(fields: any[]): {
35
+ type: "table";
36
+ headers: string[];
37
+ rows: string[][];
38
+ } | null;
39
+ /**
40
+ * One self-doc as a topic section, keyed by the doc's own name.
41
+ * @param {any} doc
42
+ * @returns {import('../../authoring/doctypes/reference/type').ReferenceSection}
43
+ */
44
+ export function selfDocSection(doc: any): import("../../authoring/doctypes/reference/type").ReferenceSection;
45
+ /**
46
+ * The `authoring` topic: one section per self-doc, in the order given.
47
+ * @param {any[]} docs
48
+ * @returns {import('../../authoring/doctypes/reference/type').ReferenceDoc}
49
+ */
50
+ export function buildAuthoringReferenceDoc(docs: any[]): import("../../authoring/doctypes/reference/type").ReferenceDoc;
51
+ /**
52
+ * The `authoring` topic from every self-doc that loads. One that fails is left
53
+ * out here and reported by {@link auditAuthoringSelfDocs}.
54
+ * @returns {Promise<import('../../authoring/doctypes/reference/type').ReferenceDoc>}
55
+ */
56
+ export function buildAuthoringTopic(): Promise<import("../../authoring/doctypes/reference/type").ReferenceDoc>;
57
+ /**
58
+ * What stands between a self-doc and a reader of `astryx docs authoring`.
59
+ * @param {{root?: string, sources?: string[], budget?: number}} [options]
60
+ * @returns {Promise<{
61
+ * sections: number,
62
+ * unreachable: string[],
63
+ * failed: {source: string, error: string}[],
64
+ * oversized: {key: string, title: string, bytes: number}[],
65
+ * }>}
66
+ */
67
+ export function auditAuthoringSelfDocs({ root, sources, budget, }?: {
68
+ root?: string;
69
+ sources?: string[];
70
+ budget?: number;
71
+ }): Promise<{
72
+ sections: number;
73
+ unreachable: string[];
74
+ failed: {
75
+ source: string;
76
+ error: string;
77
+ }[];
78
+ oversized: {
79
+ key: string;
80
+ title: string;
81
+ bytes: number;
82
+ }[];
83
+ }>;
84
+ /** The directory the self-docs live under. */
85
+ export const AUTHORING_ROOT: string;
86
+ /** Every authoring self-doc, relative to {@link AUTHORING_ROOT}, in reading order. */
87
+ export const AUTHORING_SELF_DOCS: string[];
@@ -0,0 +1,237 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The authoring self-docs, and the `authoring` topic built from them.
5
+ *
6
+ * @input The SchemaDoc each authoring module colocates as `*.doc.mjs` under
7
+ * packages/cli/authoring.
8
+ * @output {@link AUTHORING_SELF_DOCS} (every self-doc, in reading order), the
9
+ * `authoring` reference topic with one section per self-doc, and an audit
10
+ * naming any self-doc the topic cannot reach, any that fails to load, and any
11
+ * section over the docs output budget.
12
+ * @position Read by assets/docs/authoring.doc.mjs (the topic) and by Doctor
13
+ * (the audit). Lives in foundation because authoring/ holds only contracts.
14
+ * A new `*.doc.mjs` under authoring/ must be added to the list, or Doctor and
15
+ * the self-doc tests fail.
16
+ */
17
+
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import {CLI_ROOT} from '../fs/paths.mjs';
21
+ import {readDocView} from '../doc-compiler/read.mjs';
22
+ import {
23
+ DOC_OUTPUT_BUDGET_BYTES,
24
+ oversizedDocSections,
25
+ } from './docs-output-budget.mjs';
26
+
27
+ /** The directory the self-docs live under. */
28
+ export const AUTHORING_ROOT = path.join(CLI_ROOT, 'authoring');
29
+
30
+ /** Every authoring self-doc, relative to {@link AUTHORING_ROOT}, in reading order. */
31
+ export const AUTHORING_SELF_DOCS = [
32
+ 'integration/integration.doc.mjs',
33
+ 'config/config.doc.mjs',
34
+ 'debug/debug.doc.mjs',
35
+ 'gap-report/gap-report.doc.mjs',
36
+ 'discover/discover.doc.mjs',
37
+ 'codemod/codemod.doc.mjs',
38
+ 'identity/identity.doc.mjs',
39
+ 'doctypes/base/graph-fields.doc.mjs',
40
+ 'doctypes/component/component.doc.mjs',
41
+ 'doctypes/hook/hook.doc.mjs',
42
+ 'doctypes/function/function.doc.mjs',
43
+ 'doctypes/command/command.doc.mjs',
44
+ 'doctypes/enum/enum.doc.mjs',
45
+ 'doctypes/namespace/namespace.doc.mjs',
46
+ 'doctypes/reference/reference.doc.mjs',
47
+ 'doctypes/schema/schema.doc.mjs',
48
+ 'doctypes/template/template.doc.mjs',
49
+ 'doctypes/theme/theme.doc.mjs',
50
+ ];
51
+
52
+ /** Blocks a self-doc note may carry that a topic section can render. */
53
+ const TOPIC_BLOCKS = new Set(['prose', 'list', 'code', 'heading', 'table']);
54
+
55
+ /**
56
+ * Every `*.doc.mjs` under `root`, relative and sorted.
57
+ * @param {string} [root]
58
+ * @returns {string[]}
59
+ */
60
+ export function discoverAuthoringSelfDocSources(root = AUTHORING_ROOT) {
61
+ /** @type {string[]} */
62
+ const found = [];
63
+ /** @param {string} dir */
64
+ const walk = dir => {
65
+ for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
66
+ if (entry.name === 'node_modules' || entry.name.startsWith('__'))
67
+ continue;
68
+ const full = path.join(dir, entry.name);
69
+ if (entry.isDirectory()) walk(full);
70
+ else if (entry.name.endsWith('.doc.mjs')) {
71
+ found.push(path.relative(root, full).split(path.sep).join('/'));
72
+ }
73
+ }
74
+ };
75
+ walk(root);
76
+ return found.sort();
77
+ }
78
+
79
+ /**
80
+ * Import each self-doc. One that fails is reported, never thrown, so one bad
81
+ * file cannot take the rest of the topic down with it.
82
+ * @param {string[]} [sources]
83
+ * @param {string} [root]
84
+ * @returns {Promise<{loaded: {source: string, doc: any}[], failed: {source: string, error: string}[]}>}
85
+ */
86
+ export async function loadAuthoringSelfDocs(
87
+ sources = AUTHORING_SELF_DOCS,
88
+ root = AUTHORING_ROOT,
89
+ ) {
90
+ const loaded = [];
91
+ const failed = [];
92
+ for (const source of sources) {
93
+ try {
94
+ const doc = await readDocView(path.join(root, source), {
95
+ root: 'self-docs',
96
+ loader: 'native',
97
+ });
98
+ if (
99
+ typeof doc?.name !== 'string' ||
100
+ typeof doc?.description !== 'string'
101
+ ) {
102
+ throw new Error('exports no doc with a name and a description');
103
+ }
104
+ loaded.push({source, doc});
105
+ } catch (error) {
106
+ failed.push({
107
+ source,
108
+ error: error instanceof Error ? error.message : String(error),
109
+ });
110
+ }
111
+ }
112
+ return {loaded, failed};
113
+ }
114
+
115
+ /**
116
+ * @param {any[]} fields
117
+ * @returns {string[][]}
118
+ */
119
+ function fieldRows(fields) {
120
+ return fields.flatMap(field => [
121
+ [
122
+ String(field.name),
123
+ String(field.type ?? ''),
124
+ field.required ? 'yes' : 'no',
125
+ [
126
+ field.description,
127
+ field.default != null ? `Default: ${field.default}.` : null,
128
+ field.example != null ? `Example: ${field.example}.` : null,
129
+ ]
130
+ .filter(Boolean)
131
+ .join(' '),
132
+ ],
133
+ ...fieldRows(field.fields ?? []),
134
+ ]);
135
+ }
136
+
137
+ /**
138
+ * A schema's fields as the table its section prints, each nested field on the
139
+ * row after its parent; null when there are none. A reference block that
140
+ * names some of a schema's fields includes this table of just those.
141
+ * @param {any[]} fields
142
+ * @returns {{type: 'table', headers: string[], rows: string[][]} | null}
143
+ */
144
+ export function schemaFieldTable(fields) {
145
+ const rows = fieldRows(fields);
146
+ return rows.length > 0
147
+ ? {
148
+ type: 'table',
149
+ headers: ['Field', 'Type', 'Required', 'Description'],
150
+ rows,
151
+ }
152
+ : null;
153
+ }
154
+
155
+ /**
156
+ * One self-doc as a topic section, keyed by the doc's own name.
157
+ * @param {any} doc
158
+ * @returns {import('../../authoring/doctypes/reference/type').ReferenceSection}
159
+ */
160
+ export function selfDocSection(doc) {
161
+ /** @type {any[]} */
162
+ const content = [{type: 'prose', text: doc.description}];
163
+ if (doc.appliesTo) {
164
+ content.push({type: 'prose', text: `Applies to: ${doc.appliesTo}`});
165
+ }
166
+ const table = schemaFieldTable(doc.fields ?? []);
167
+ if (table) content.push(table);
168
+ for (const example of doc.examples ?? []) {
169
+ if (typeof example?.code !== 'string' || example.code.trim() === '')
170
+ continue;
171
+ content.push({
172
+ type: 'code',
173
+ lang: example.lang ?? 'js',
174
+ ...(example.label ? {label: example.label} : {}),
175
+ code: example.code,
176
+ });
177
+ }
178
+ for (const note of doc.notes ?? []) {
179
+ if (TOPIC_BLOCKS.has(note?.type)) content.push(note);
180
+ }
181
+ return {id: doc.name, title: doc.displayName ?? doc.name, content};
182
+ }
183
+
184
+ /**
185
+ * The `authoring` topic: one section per self-doc, in the order given.
186
+ * @param {any[]} docs
187
+ * @returns {import('../../authoring/doctypes/reference/type').ReferenceDoc}
188
+ */
189
+ export function buildAuthoringReferenceDoc(docs) {
190
+ return /** @type {any} */ ({
191
+ name: 'authoring',
192
+ title: 'Authoring Reference',
193
+ category: 'guide',
194
+ description:
195
+ 'Every file an integration author writes, field by field: the integration manifest, astryx.config, codemods, identity, and each doc type.',
196
+ sections: docs.map(selfDocSection),
197
+ });
198
+ }
199
+
200
+ /**
201
+ * The `authoring` topic from every self-doc that loads. One that fails is left
202
+ * out here and reported by {@link auditAuthoringSelfDocs}.
203
+ * @returns {Promise<import('../../authoring/doctypes/reference/type').ReferenceDoc>}
204
+ */
205
+ export async function buildAuthoringTopic() {
206
+ const {loaded} = await loadAuthoringSelfDocs();
207
+ return buildAuthoringReferenceDoc(loaded.map(entry => entry.doc));
208
+ }
209
+
210
+ /**
211
+ * What stands between a self-doc and a reader of `astryx docs authoring`.
212
+ * @param {{root?: string, sources?: string[], budget?: number}} [options]
213
+ * @returns {Promise<{
214
+ * sections: number,
215
+ * unreachable: string[],
216
+ * failed: {source: string, error: string}[],
217
+ * oversized: {key: string, title: string, bytes: number}[],
218
+ * }>}
219
+ */
220
+ export async function auditAuthoringSelfDocs({
221
+ root = AUTHORING_ROOT,
222
+ sources = AUTHORING_SELF_DOCS,
223
+ budget = DOC_OUTPUT_BUDGET_BYTES,
224
+ } = {}) {
225
+ const listed = new Set(sources);
226
+ const unreachable = discoverAuthoringSelfDocSources(root).filter(
227
+ source => !listed.has(source),
228
+ );
229
+ const {loaded, failed} = await loadAuthoringSelfDocs(sources, root);
230
+ const topic = buildAuthoringReferenceDoc(loaded.map(entry => entry.doc));
231
+ return {
232
+ sections: topic.sections.length,
233
+ unreachable,
234
+ failed,
235
+ oversized: oversizedDocSections(topic.sections, budget),
236
+ };
237
+ }