@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d

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 (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. 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'});
@@ -24,6 +24,24 @@ export function loadAuthoringSelfDocs(sources?: string[], root?: string): Promis
24
24
  error: string;
25
25
  }[];
26
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;
27
45
  /**
28
46
  * The `authoring` topic: one section per self-doc, in the order given.
29
47
  * @param {any[]} docs
@@ -17,8 +17,8 @@
17
17
 
18
18
  import * as fs from 'node:fs';
19
19
  import * as path from 'node:path';
20
- import {pathToFileURL} from 'node:url';
21
20
  import {CLI_ROOT} from '../fs/paths.mjs';
21
+ import {readDocView} from '../doc-compiler/read.mjs';
22
22
  import {
23
23
  DOC_OUTPUT_BUDGET_BYTES,
24
24
  oversizedDocSections,
@@ -31,6 +31,9 @@ export const AUTHORING_ROOT = path.join(CLI_ROOT, 'authoring');
31
31
  export const AUTHORING_SELF_DOCS = [
32
32
  'integration/integration.doc.mjs',
33
33
  'config/config.doc.mjs',
34
+ 'debug/debug.doc.mjs',
35
+ 'gap-report/gap-report.doc.mjs',
36
+ 'discover/discover.doc.mjs',
34
37
  'codemod/codemod.doc.mjs',
35
38
  'identity/identity.doc.mjs',
36
39
  'doctypes/base/graph-fields.doc.mjs',
@@ -43,6 +46,7 @@ export const AUTHORING_SELF_DOCS = [
43
46
  'doctypes/reference/reference.doc.mjs',
44
47
  'doctypes/schema/schema.doc.mjs',
45
48
  'doctypes/template/template.doc.mjs',
49
+ 'doctypes/theme/theme.doc.mjs',
46
50
  ];
47
51
 
48
52
  /** Blocks a self-doc note may carry that a topic section can render. */
@@ -59,7 +63,8 @@ export function discoverAuthoringSelfDocSources(root = AUTHORING_ROOT) {
59
63
  /** @param {string} dir */
60
64
  const walk = dir => {
61
65
  for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
62
- if (entry.name === 'node_modules' || entry.name.startsWith('__')) continue;
66
+ if (entry.name === 'node_modules' || entry.name.startsWith('__'))
67
+ continue;
63
68
  const full = path.join(dir, entry.name);
64
69
  if (entry.isDirectory()) walk(full);
65
70
  else if (entry.name.endsWith('.doc.mjs')) {
@@ -86,9 +91,14 @@ export async function loadAuthoringSelfDocs(
86
91
  const failed = [];
87
92
  for (const source of sources) {
88
93
  try {
89
- const mod = await import(pathToFileURL(path.join(root, source)).href);
90
- const doc = mod.doc ?? mod.docs ?? mod.default;
91
- if (typeof doc?.name !== 'string' || typeof doc?.description !== 'string') {
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
+ ) {
92
102
  throw new Error('exports no doc with a name and a description');
93
103
  }
94
104
  loaded.push({source, doc});
@@ -124,27 +134,40 @@ function fieldRows(fields) {
124
134
  ]);
125
135
  }
126
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
+
127
155
  /**
128
156
  * One self-doc as a topic section, keyed by the doc's own name.
129
157
  * @param {any} doc
130
158
  * @returns {import('../../authoring/doctypes/reference/type').ReferenceSection}
131
159
  */
132
- function selfDocSection(doc) {
160
+ export function selfDocSection(doc) {
133
161
  /** @type {any[]} */
134
162
  const content = [{type: 'prose', text: doc.description}];
135
163
  if (doc.appliesTo) {
136
164
  content.push({type: 'prose', text: `Applies to: ${doc.appliesTo}`});
137
165
  }
138
- const rows = fieldRows(doc.fields ?? []);
139
- if (rows.length > 0) {
140
- content.push({
141
- type: 'table',
142
- headers: ['Field', 'Type', 'Required', 'Description'],
143
- rows,
144
- });
145
- }
166
+ const table = schemaFieldTable(doc.fields ?? []);
167
+ if (table) content.push(table);
146
168
  for (const example of doc.examples ?? []) {
147
- if (typeof example?.code !== 'string' || example.code.trim() === '') continue;
169
+ if (typeof example?.code !== 'string' || example.code.trim() === '')
170
+ continue;
148
171
  content.push({
149
172
  type: 'code',
150
173
  lang: example.lang ?? 'js',
@@ -9,7 +9,14 @@ import {
9
9
  buildAuthoringTopic,
10
10
  discoverAuthoringSelfDocSources,
11
11
  } from './authoring-self-docs.mjs';
12
- import {problemsInTopic} from './docs-discovery.mjs';
12
+ import {
13
+ GRAPH_BLOCK_TYPES,
14
+ GRAPH_ONLY_FIELDS,
15
+ problemsInTopic,
16
+ } from './docs-discovery.mjs';
17
+ import {doc as graphFieldsDoc} from '../../authoring/doctypes/base/graph-fields.doc.mjs';
18
+ import {doc as namespaceDoc} from '../../authoring/doctypes/namespace/namespace.doc.mjs';
19
+ import {doc as referenceDoc} from '../../authoring/doctypes/reference/reference.doc.mjs';
13
20
  import {docs} from '../../api/docs/docs.mjs';
14
21
 
15
22
  const SLOW = 60_000;
@@ -37,14 +44,74 @@ describe('authoring self-docs', () => {
37
44
  expect(topic.sections).toHaveLength(AUTHORING_SELF_DOCS.length);
38
45
  });
39
46
 
40
- it('is readable progressively through the docs API', async () => {
41
- const index = await docs('authoring', undefined, {index: true});
42
- expect(index.type).toBe('docs.index');
43
- expect(index.data.sections.map(s => s.id)).toContain('integration');
44
- const section = await docs('authoring', 'integration');
45
- expect(section.data.title).toBe('Astryx Integration');
46
- expect(section.data.content.some(block => block.type === 'table')).toBe(true);
47
- }, SLOW);
47
+ it(
48
+ 'is readable progressively through the docs API',
49
+ async () => {
50
+ const index = await docs('authoring', undefined, {index: true});
51
+ expect(index.type).toBe('docs.index');
52
+ expect(index.data.sections.map(s => s.id)).toContain('integration');
53
+ const section = await docs('authoring', 'integration');
54
+ expect(section.data.title).toBe('Astryx Integration');
55
+ expect(section.data.content.some(block => block.type === 'table')).toBe(
56
+ true,
57
+ );
58
+ },
59
+ SLOW,
60
+ );
61
+ });
62
+
63
+ describe('what the authoring docs say about the docs tree', () => {
64
+ it('marks exactly the fields the docs tree does not read yet', () => {
65
+ const notReadYet = graphFieldsDoc.fields
66
+ .filter(field => /Not read yet/.test(field.description))
67
+ .map(field => field.name);
68
+ // The tree reads `placement` for every guide (spec:AST-046); the other
69
+ // graph fields are still refused by every topic reader.
70
+ expect(notReadYet.sort()).toEqual(
71
+ GRAPH_ONLY_FIELDS.filter(field => field !== 'placement').sort(),
72
+ );
73
+ for (const field of graphFieldsDoc.fields) {
74
+ if (GRAPH_ONLY_FIELDS.includes(field.name)) {
75
+ expect(field.description).toMatch(/fails to load/);
76
+ }
77
+ }
78
+ const placement = graphFieldsDoc.fields.find(f => f.name === 'placement');
79
+ expect(placement.description).toMatch(
80
+ /Read for every guide, the CLI's and each integration's/,
81
+ );
82
+ expect(graphFieldsDoc.description).toMatch(/not built yet/);
83
+ });
84
+
85
+ it('keeps graph blocks behind the separate GraphContentBlock type, and a section takes a reference block', () => {
86
+ const content = referenceDoc.fields
87
+ .flatMap(field => [field, ...(field.fields ?? [])])
88
+ .find(field => field.name === 'sections[].content');
89
+ expect(content.type).toBe('(ReferenceContentBlock | ReferenceDocBlock)[]');
90
+ expect(content.description).toContain('GraphContentBlock');
91
+ for (const type of GRAPH_BLOCK_TYPES) {
92
+ expect(content.description).toContain(type);
93
+ }
94
+ // A section's reference block reads as the doc it includes.
95
+ expect(GRAPH_BLOCK_TYPES.has('reference')).toBe(false);
96
+ expect(content.description).toMatch(
97
+ /A `reference` block .* includes another doc/,
98
+ );
99
+ });
100
+
101
+ it('says where namespace docs live: the CLI tree, and each integration', () => {
102
+ expect(namespaceDoc.description).toMatch(
103
+ /an integration ships its own in its docs directory/,
104
+ );
105
+ expect(
106
+ problemsInTopic({
107
+ ...namespaceDoc.examples?.[0],
108
+ type: 'namespace',
109
+ name: 'x',
110
+ }),
111
+ ).toEqual([
112
+ '"x" is a namespace doc, which the docs tree reads, not the topic list. The CLI keeps its own in assets/docs/tree; an integration ships its namespace docs in its docs directory.',
113
+ ]);
114
+ });
48
115
  });
49
116
 
50
117
  describe('auditAuthoringSelfDocs', () => {
@@ -68,17 +135,25 @@ describe('auditAuthoringSelfDocs', () => {
68
135
  path.join(root, 'kept', 'forgotten.doc.mjs'),
69
136
  "export const doc = {name: 'forgotten', description: 'Not listed.'};\n",
70
137
  );
71
- const audit = await auditAuthoringSelfDocs({root, sources: ['kept/kept.doc.mjs']});
138
+ const audit = await auditAuthoringSelfDocs({
139
+ root,
140
+ sources: ['kept/kept.doc.mjs'],
141
+ });
72
142
  expect(audit.unreachable).toEqual(['kept/forgotten.doc.mjs']);
73
143
  });
74
144
 
75
145
  it('reports a self-doc that fails to load instead of throwing', async () => {
76
- fs.writeFileSync(path.join(root, 'kept', 'broken.doc.mjs'), 'export const doc = {;\n');
146
+ fs.writeFileSync(
147
+ path.join(root, 'kept', 'broken.doc.mjs'),
148
+ 'export const doc = {;\n',
149
+ );
77
150
  const audit = await auditAuthoringSelfDocs({
78
151
  root,
79
152
  sources: ['kept/kept.doc.mjs', 'kept/broken.doc.mjs'],
80
153
  });
81
- expect(audit.failed.map(entry => entry.source)).toEqual(['kept/broken.doc.mjs']);
154
+ expect(audit.failed.map(entry => entry.source)).toEqual([
155
+ 'kept/broken.doc.mjs',
156
+ ]);
82
157
  expect(audit.sections).toBe(1);
83
158
  });
84
159
 
@@ -0,0 +1,74 @@
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 type `@astryxdesign/cli/authoring` exports, in the order index.d.ts
6
+ * lists them, each traced to the module that declares it. A value export that
7
+ * traces to a JavaScript module (a parser) is not a type and is left out;
8
+ * anything else that cannot be traced is reported, never dropped.
9
+ * @param {string} [root]
10
+ * @returns {{
11
+ * types: {name: string, module: string}[],
12
+ * untraced: {name: string, reason: string}[],
13
+ * }} `module` is relative to `root`
14
+ */
15
+ export function tracePublicAuthoringTypes(root?: string): {
16
+ types: {
17
+ name: string;
18
+ module: string;
19
+ }[];
20
+ untraced: {
21
+ name: string;
22
+ reason: string;
23
+ }[];
24
+ };
25
+ /**
26
+ * What stands between each type `@astryxdesign/cli/authoring` exports and a
27
+ * reader of `astryx docs authoring`. A type is readable when a self-doc beside
28
+ * the module that declares it is listed in AUTHORING_SELF_DOCS, loads, and
29
+ * renders a section the topic's index lists. A registered self-doc must
30
+ * document something public: a public type declared beside it, and, when its
31
+ * title is the name of a type declared beside it, that type.
32
+ * @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
33
+ * `topicKeys` are the keys `astryx docs authoring --index` lists; null skips
34
+ * that comparison.
35
+ * @returns {Promise<{
36
+ * types: number,
37
+ * unreadable: {module: string, names: string[], reason: UnreadableReason, source?: string, key?: string}[],
38
+ * untraced: {name: string, reason: string}[],
39
+ * unmatched: {source: string, key?: string, subject?: string}[],
40
+ * }>}
41
+ */
42
+ export function auditAuthoringSurface({ root, sources, topicKeys, }?: {
43
+ root?: string;
44
+ sources?: string[];
45
+ topicKeys?: Set<string> | null;
46
+ }): Promise<{
47
+ types: number;
48
+ unreadable: {
49
+ module: string;
50
+ names: string[];
51
+ reason: UnreadableReason;
52
+ source?: string;
53
+ key?: string;
54
+ }[];
55
+ untraced: {
56
+ name: string;
57
+ reason: string;
58
+ }[];
59
+ unmatched: {
60
+ source: string;
61
+ key?: string;
62
+ subject?: string;
63
+ }[];
64
+ }>;
65
+ /** The barrel the `types` condition of `@astryxdesign/cli/authoring` names. */
66
+ export const AUTHORING_SURFACE: "index.d.ts";
67
+ export type Tracer = {
68
+ root: string;
69
+ /**
70
+ * top-level statements by absolute path
71
+ */
72
+ parsed: Map<string, any[]>;
73
+ };
74
+ export type UnreadableReason = "no-self-doc" | "unregistered" | "failed" | "missing-section";